@young1lin/dsh-ui-gitworkbench 0.1.8 → 0.1.10
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/AGENTS.md +39 -0
- package/CHANGELOG.md +26 -0
- package/CHANGELOG_EN.md +26 -0
- package/lib/client.js +874 -533
- package/package.json +1 -1
- package/src/client/CodeEditor.tsx +174 -48
- package/src/client/FileBrowser.tsx +27 -25
- package/src/client/GitWorkbenchPanel.module.css +3 -0
- package/src/client/GitWorkbenchPanel.tsx +38 -20
- package/src/client/cm-diff.ts +24 -2
- package/src/client/cm-tokens.ts +34 -14
- package/src/client/highlight.ts +158 -61
- package/src/client/idle-value.ts +0 -21
- package/src/client/locales.ts +1 -3
- package/src/client/token-cache.ts +0 -0
package/lib/client.js
CHANGED
|
@@ -1221,7 +1221,7 @@ window.__ModuleLoader__.load({
|
|
|
1221
1221
|
}
|
|
1222
1222
|
//#endregion
|
|
1223
1223
|
//#region \0dsh-css:src/client/GitWorkbenchPanel.module.css.mjs
|
|
1224
|
-
const css = ".SD8qLW_card{border:1px solid var(--dsw-alias-border-l2);min-height:28px;color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;cursor:pointer;background:0 0;border-radius:8px;align-items:center;gap:7px;padding:3px 10px;font-size:12px;line-height:18px;transition:background .12s,border-color .12s;display:inline-flex}.SD8qLW_card:hover,.SD8qLW_card:focus-visible{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l3)}.SD8qLW_cardBranch{max-width:220px;color:var(--dsw-alias-label-primary);align-items:center;gap:4px;font-weight:550;display:inline-flex;overflow:hidden}.SD8qLW_cardBranchName{min-width:0;overflow:hidden}.SD8qLW_cardGlyph{opacity:.7;flex:none}.SD8qLW_cardDetached{background:var(--dsw-alias-state-warning-bg,#bb800926);color:var(--dsw-alias-state-warning-primary,#d29922);letter-spacing:.02em;border-radius:999px;padding:0 6px;font-size:10px;line-height:16px}.SD8qLW_cardWt{background:var(--dsw-alias-state-business-bg,#388bfd29);max-width:150px;color:var(--dsw-alias-state-business-primary,#58a6ff);letter-spacing:.02em;white-space:nowrap;text-overflow:ellipsis;border-radius:999px;align-items:center;gap:3px;padding:0 6px;font-size:10px;line-height:16px;display:inline-flex;overflow:hidden}.SD8qLW_cardAhead,.SD8qLW_cardBehind{color:var(--dsw-alias-label-tertiary);font-size:11px}.SD8qLW_cardAhead{color:var(--dsw-alias-state-success-primary)}.SD8qLW_cardBehind{color:var(--dsw-alias-state-attention-primary,#d29922)}.SD8qLW_cardSep{background:var(--dsw-alias-border-l2);width:1px;height:14px}.SD8qLW_cardAdded{color:var(--dsw-alias-state-success-primary)}.SD8qLW_cardDeleted{color:var(--dsw-alias-state-error-primary)}.SD8qLW_cardFiles{color:var(--dsw-alias-label-tertiary)}.SD8qLW_overlay[data-gs-theme=github-dark]{--gs-bg:#0d1117;--gs-panel:#161b22;--gs-raise:#21262d;--gs-border:#30363d;--gs-border-soft:#21262d;--gs-fg:#e6edf3;--gs-fg-muted:#c9d1d9;--gs-fg-dim:#8b949e;--gs-fg-faint:#6e7681;--gs-fg-fainter:#484f58;--gs-accent:#58a6ff;--gs-accent-bg:#388bfd24;--gs-accent-border:#388bfd8c;--gs-add:#3fb950;--gs-del:#f85149;--gs-warn:#d29922;--gs-info:#79c0ff;--gs-add-bg:#2ea04329;--gs-del-bg:#f8514929;--gs-warn-bg:#bb800929;--gs-info-bg:#388bfd29;--gs-add-line:#12261e;--gs-del-line:#25181c;--gs-add-word:#1a4a29;--gs-del-word:#6b2b2b;--gs-add-num:#1c4428;--gs-del-num:#542426;--gs-hunk:#111d2e;--gs-hunk-num:#0c2d6b;--gs-neutral-bg:#6e76812e;--gs-backdrop:#01040999;--gs-shadow:#0104098c}.SD8qLW_overlay[data-gs-theme=github-light]{--gs-bg:#fff;--gs-panel:#f6f8fa;--gs-raise:#eaeef2;--gs-border:#d0d7de;--gs-border-soft:#eaeef2;--gs-fg:#1f2328;--gs-fg-muted:#32383f;--gs-fg-dim:#656d76;--gs-fg-faint:#8c959f;--gs-fg-fainter:#afb8c1;--gs-accent:#0969da;--gs-accent-bg:#0969da1a;--gs-accent-border:#0969da73;--gs-add:#1a7f37;--gs-del:#cf222e;--gs-warn:#9a6700;--gs-info:#0550ae;--gs-add-bg:#1a7f371f;--gs-del-bg:#cf222e1f;--gs-warn-bg:#9a67001f;--gs-info-bg:#0969da1f;--gs-add-line:#dafbe1;--gs-del-line:#ffebe9;--gs-add-word:#aceebb;--gs-del-word:#ffcecb;--gs-add-num:#aceebb;--gs-del-num:#ffcecb;--gs-hunk:#ddf4ff;--gs-hunk-num:#b6e3ff;--gs-neutral-bg:#6e76811f;--gs-backdrop:#1f232847;--gs-shadow:#1f232838}.SD8qLW_overlay[data-gs-theme=idea-dark]{--gs-bg:#1e1f22;--gs-panel:#2b2d30;--gs-raise:#393b40;--gs-border:#393b40;--gs-border-soft:#2b2d30;--gs-fg:#dfe1e5;--gs-fg-muted:#ced0d6;--gs-fg-dim:#9da0a8;--gs-fg-faint:#6f737a;--gs-fg-fainter:#4e5157;--gs-accent:#548af7;--gs-accent-bg:#548af729;--gs-accent-border:#548af78c;--gs-add:#5fad65;--gs-del:#e26e6e;--gs-warn:#f0a732;--gs-info:#3592c4;--gs-add-bg:#5fad6529;--gs-del-bg:#e26e6e29;--gs-warn-bg:#f0a73229;--gs-info-bg:#3592c429;--gs-add-line:#293c2e;--gs-del-line:#3d2b2b;--gs-add-word:#3d6640;--gs-del-word:#6b3838;--gs-hunk:#548af71a;--gs-neutral-bg:#9da0a82e;--gs-backdrop:#10111399;--gs-shadow:#00000080}.SD8qLW_overlay[data-gs-theme=idea-light]{--gs-bg:#fff;--gs-panel:#f7f8fa;--gs-raise:#ebecf0;--gs-border:#d3d5db;--gs-border-soft:#ebecf0;--gs-fg:#1e1f22;--gs-fg-muted:#3c3f44;--gs-fg-dim:#6c707e;--gs-fg-faint:#818594;--gs-fg-fainter:#a8adbd;--gs-accent:#3574f0;--gs-accent-bg:#3574f01a;--gs-accent-border:#3574f073;--gs-add:#398a4a;--gs-del:#cc4a4a;--gs-warn:#a8760b;--gs-info:#2b7fb8;--gs-add-bg:#398a4a1f;--gs-del-bg:#cc4a4a1f;--gs-warn-bg:#a8760b1f;--gs-info-bg:#2b7fb81f;--gs-add-line:#e6f5e9;--gs-del-line:#fbe9ea;--gs-add-word:#c2e5c9;--gs-del-word:#f5c9cc;--gs-hunk:#3574f012;--gs-neutral-bg:#6c707e1f;--gs-backdrop:#1e1f2242;--gs-shadow:#1e1f222e}.SD8qLW_overlay[data-gs-theme=vscode-dark]{--gs-bg:#1e1e1e;--gs-panel:#252526;--gs-raise:#2d2d30;--gs-border:#3e3e42;--gs-border-soft:#2d2d30;--gs-fg:#d4d4d4;--gs-fg-muted:#ccc;--gs-fg-dim:#9d9d9d;--gs-fg-faint:gray;--gs-fg-fainter:#5a5a5a;--gs-accent:#0098ff;--gs-accent-bg:#007acc3d;--gs-accent-border:#0098ff99;--gs-add:#89d185;--gs-del:#f14c4c;--gs-warn:#cca700;--gs-info:#75beff;--gs-add-bg:#89d1852e;--gs-del-bg:#f14c4c2e;--gs-warn-bg:#cca7002e;--gs-info-bg:#75beff2e;--gs-add-line:#9bb9552e;--gs-del-line:#ff000029;--gs-add-word:#9bb95566;--gs-del-word:#ff00005c;--gs-hunk:#007acc24;--gs-neutral-bg:#bebebe24;--gs-backdrop:#0000008c;--gs-shadow:#0009}.SD8qLW_overlay[data-gs-theme=vscode-light]{--gs-bg:#fff;--gs-panel:#f3f3f3;--gs-raise:#e8e8e8;--gs-border:#cecece;--gs-border-soft:#e8e8e8;--gs-fg:#1e1e1e;--gs-fg-muted:#333;--gs-fg-dim:#616161;--gs-fg-faint:#767676;--gs-fg-fainter:#a0a0a0;--gs-accent:#005fb8;--gs-accent-bg:#005fb81a;--gs-accent-border:#005fb873;--gs-add:#10793f;--gs-del:#b5200d;--gs-warn:#855b00;--gs-info:#005fb8;--gs-add-bg:#10793f1f;--gs-del-bg:#b5200d1f;--gs-warn-bg:#855b001f;--gs-info-bg:#005fb81f;--gs-add-line:#9bb95538;--gs-del-line:#ff000021;--gs-add-word:#9bb95573;--gs-del-word:#ff00004d;--gs-hunk:#005fb812;--gs-neutral-bg:#6161611f;--gs-backdrop:#00000040;--gs-shadow:#0000002e}.SD8qLW_overlay[data-gs-theme=cyberpunk-dark]{--gs-bg:#0b0417;--gs-panel:#14082a;--gs-raise:#1f0d3d;--gs-border:#3a1f6b;--gs-border-soft:#26124a;--gs-fg:#f0e6ff;--gs-fg-muted:#d5c2f5;--gs-fg-dim:#a98fd6;--gs-fg-faint:#7d64a8;--gs-fg-fainter:#56427a;--gs-accent:#00f0ff;--gs-on-accent:#0b0417;--gs-accent-bg:#00f0ff24;--gs-accent-border:#00f0ff80;--gs-add:#39ff88;--gs-del:#ff2e88;--gs-warn:#fc0;--gs-info:#00f0ff;--gs-add-bg:#39ff8824;--gs-del-bg:#ff2e8824;--gs-warn-bg:#ffcc0024;--gs-info-bg:#00f0ff24;--gs-add-line:#39ff881f;--gs-del-line:#ff2e881f;--gs-add-word:#39ff8857;--gs-del-word:#ff2e8857;--gs-hunk:#00f0ff1a;--gs-neutral-bg:#a98fd629;--gs-backdrop:#06020ead;--gs-shadow:#00f0ff24}.SD8qLW_overlay[data-gs-theme=cyberpunk-light]{--gs-bg:#fdfbff;--gs-panel:#f4eeff;--gs-raise:#e9dfff;--gs-border:#c9b3f0;--gs-border-soft:#e0d2f7;--gs-fg:#1a0b2e;--gs-fg-muted:#33195c;--gs-fg-dim:#6b4ba0;--gs-fg-faint:#8f74bd;--gs-fg-fainter:#b9a5d6;--gs-accent:#00a6b8;--gs-accent-bg:#00a6b81f;--gs-accent-border:#00a6b880;--gs-add:#00875a;--gs-del:#d6006e;--gs-warn:#b37a00;--gs-info:#00a6b8;--gs-add-bg:#00875a1f;--gs-del-bg:#d6006e1f;--gs-warn-bg:#b37a001f;--gs-info-bg:#00a6b81f;--gs-add-line:#00c88224;--gs-del-line:#ff2e881f;--gs-add-word:#00c88257;--gs-del-word:#ff2e884d;--gs-hunk:#00a6b814;--gs-neutral-bg:#6b4ba01f;--gs-backdrop:#1a0b2e47;--gs-shadow:#1a0b2e29}.SD8qLW_overlay[data-gs-theme=one-dark]{--gs-bg:#282c34;--gs-panel:#21252b;--gs-raise:#2c313a;--gs-border:#3e4451;--gs-border-soft:#2c313a;--gs-fg:#abb2bf;--gs-fg-muted:#b6bdca;--gs-fg-dim:#7f848e;--gs-fg-faint:#636d83;--gs-fg-fainter:#4b5263;--gs-accent:#61afef;--gs-accent-bg:#61afef24;--gs-accent-border:#61afef8c;--gs-add:#98c379;--gs-del:#e06c75;--gs-warn:#e5c07b;--gs-info:#56b6c2;--gs-add-bg:#98c37929;--gs-del-bg:#e06c7529;--gs-warn-bg:#e5c07b29;--gs-info-bg:#56b6c229;--gs-add-line:#98c37924;--gs-del-line:#e06c7524;--gs-add-word:#98c37961;--gs-del-word:#e06c7561;--gs-hunk:#61afef1a;--gs-neutral-bg:#7f848e2e;--gs-backdrop:#171a2199;--gs-shadow:#0f11158c}.SD8qLW_overlay[data-gs-theme=one-light]{--gs-bg:#fafafa;--gs-panel:#f0f0f0;--gs-raise:#e5e5e6;--gs-border:#d4d4d4;--gs-border-soft:#e5e5e6;--gs-fg:#383a42;--gs-fg-muted:#4a4c53;--gs-fg-dim:#696c77;--gs-fg-faint:#909196;--gs-fg-fainter:#b8b9bd;--gs-accent:#4078f2;--gs-accent-bg:#4078f21a;--gs-accent-border:#4078f273;--gs-add:#50a14f;--gs-del:#e45649;--gs-warn:#c18401;--gs-info:#0184bc;--gs-add-bg:#50a14f1f;--gs-del-bg:#e456491f;--gs-warn-bg:#c184011f;--gs-info-bg:#0184bc1f;--gs-add-line:#50a14f24;--gs-del-line:#e4564921;--gs-add-word:#50a14f57;--gs-del-word:#e4564952;--gs-hunk:#4078f212;--gs-neutral-bg:#696c771f;--gs-backdrop:#383a4242;--gs-shadow:#383a422e}.SD8qLW_overlay[data-gs-theme=solarized-dark]{--gs-bg:#002b36;--gs-panel:#073642;--gs-raise:#0a4553;--gs-border:#0f5666;--gs-border-soft:#073642;--gs-fg:#93a1a1;--gs-fg-muted:#839496;--gs-fg-dim:#657b83;--gs-fg-faint:#586e75;--gs-fg-fainter:#45636b;--gs-accent:#268bd2;--gs-accent-bg:#268bd229;--gs-accent-border:#268bd28c;--gs-add:#859900;--gs-del:#dc322f;--gs-warn:#b58900;--gs-info:#2aa198;--gs-add-bg:#85990033;--gs-del-bg:#dc322f2e;--gs-warn-bg:#b589002e;--gs-info-bg:#2aa1982e;--gs-add-line:#85990029;--gs-del-line:#dc322f26;--gs-add-word:#85990066;--gs-del-word:#dc322f61;--gs-hunk:#268bd21f;--gs-neutral-bg:#657b8333;--gs-backdrop:#00141a9e;--gs-shadow:#00141a8c}.SD8qLW_overlay[data-gs-theme=solarized-light]{--gs-bg:#fdf6e3;--gs-panel:#eee8d5;--gs-raise:#e3ddca;--gs-border:#d5cfbb;--gs-border-soft:#eee8d5;--gs-fg:#586e75;--gs-fg-muted:#657b83;--gs-fg-dim:#839496;--gs-fg-faint:#93a1a1;--gs-fg-fainter:#b5b0a0;--gs-accent:#268bd2;--gs-accent-bg:#268bd21f;--gs-accent-border:#268bd273;--gs-add:#6c7c00;--gs-del:#cb2825;--gs-warn:#9a7400;--gs-info:#21867f;--gs-add-bg:#8599002e;--gs-del-bg:#dc322f24;--gs-warn-bg:#b5890029;--gs-info-bg:#2aa19824;--gs-add-line:#85990029;--gs-del-line:#dc322f1f;--gs-add-word:#85990061;--gs-del-word:#dc322f4d;--gs-hunk:#268bd214;--gs-neutral-bg:#586e7524;--gs-backdrop:#586e7542;--gs-shadow:#586e7533}.SD8qLW_overlay[data-gs-theme=nord-dark]{--gs-bg:#2e3440;--gs-panel:#3b4252;--gs-raise:#434c5e;--gs-border:#4c566a;--gs-border-soft:#3b4252;--gs-fg:#eceff4;--gs-fg-muted:#d8dee9;--gs-fg-dim:#9aa5b8;--gs-fg-faint:#7b88a1;--gs-fg-fainter:#5d6a82;--gs-accent:#88c0d0;--gs-on-accent:#2e3440;--gs-accent-bg:#88c0d024;--gs-accent-border:#88c0d08c;--gs-add:#a3be8c;--gs-del:#bf616a;--gs-warn:#ebcb8b;--gs-info:#81a1c1;--gs-add-bg:#a3be8c29;--gs-del-bg:#bf616a2e;--gs-warn-bg:#ebcb8b29;--gs-info-bg:#81a1c129;--gs-add-line:#a3be8c24;--gs-del-line:#bf616a26;--gs-add-word:#a3be8c61;--gs-del-word:#bf616a66;--gs-hunk:#88c0d01a;--gs-neutral-bg:#9aa5b829;--gs-backdrop:#1d232d9e;--gs-shadow:#1419218c}.SD8qLW_overlay[data-gs-theme=nord-light]{--gs-bg:#eceff4;--gs-panel:#e5e9f0;--gs-raise:#d8dee9;--gs-border:#c3cbd8;--gs-border-soft:#dfe4ec;--gs-fg:#2e3440;--gs-fg-muted:#3b4252;--gs-fg-dim:#4c566a;--gs-fg-faint:#6b7689;--gs-fg-fainter:#9aa4b5;--gs-accent:#5e81ac;--gs-accent-bg:#5e81ac1f;--gs-accent-border:#5e81ac80;--gs-add:#5e7d47;--gs-del:#a5424c;--gs-warn:#97701f;--gs-info:#4c7a8c;--gs-add-bg:#5e7d4724;--gs-del-bg:#a5424c21;--gs-warn-bg:#97701f24;--gs-info-bg:#4c7a8c21;--gs-add-line:#5e7d4724;--gs-del-line:#a5424c1f;--gs-add-word:#5e7d4757;--gs-del-word:#a5424c52;--gs-hunk:#5e81ac17;--gs-neutral-bg:#4c566a21;--gs-backdrop:#2e344042;--gs-shadow:#2e34402e}.SD8qLW_overlay{--gs-inset:14px;--gs-h-control:28px;--gs-h-compact:24px;--gs-pad-control:0 12px;--gs-pad-compact:0 10px;--gs-on-accent:#fff;--gs-graph-0:#58a6ff;--gs-graph-1:#3fb950;--gs-graph-2:#d29922;--gs-graph-3:#bc8cff;--gs-graph-4:#f778ba;--gs-graph-5:#39c5cf;--gs-r-pill:999px;--gs-r-control:8px;--gs-r-surface:12px;--gs-r-drawer:14px;--gs-t-meta:11px;--gs-t-dense:12px;--gs-t-ui:13px;--gs-gutter:16px;--gs-gutter-pane:12px;z-index:1000;padding:var(--gs-inset);box-sizing:border-box;background:var(--gs-backdrop);justify-content:flex-end;align-items:stretch;gap:12px;animation:.16s ease-out SD8qLW_gsFade;display:flex;position:fixed;inset:0}.SD8qLW_drawer{box-sizing:border-box;width:min(1600px,94vw);height:100%;color:var(--gs-fg);background:var(--gs-bg);border:1px solid var(--gs-border);border-radius:var(--gs-r-drawer);box-shadow:0 24px 64px var(--gs-shadow);font-family:var(--dsw-font-ui,-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif);--gs-surface:var(--gs-bg);--gs-surface-2:var(--gs-panel);flex-direction:column;animation:.18s cubic-bezier(.22,1,.36,1) SD8qLW_gsSlide;display:flex;position:relative;overflow:hidden}.SD8qLW_drawer[data-gs-bg]{--gs-surface:color-mix(in srgb, var(--gs-bg) var(--gs-veil), transparent);--gs-surface-2:color-mix(in srgb, var(--gs-panel) var(--gs-veil), transparent)}.SD8qLW_drawer[data-gs-bg]:before{content:\"\";z-index:0;background-image:var(--gs-bg-image);filter:blur(var(--gs-bg-blur));pointer-events:none;background-position:50%;background-size:cover;position:absolute;inset:0;transform:scale(1.12)}.SD8qLW_drawer>:not(.SD8qLW_resizer){z-index:1;position:relative}.SD8qLW_drawer>.SD8qLW_header{z-index:24}.SD8qLW_drawer>.SD8qLW_tabs{z-index:23}.SD8qLW_drawer>.SD8qLW_compareBar{z-index:22}.SD8qLW_drawer>.SD8qLW_syncBar{z-index:20}.SD8qLW_drawer>.SD8qLW_confirmScrim{z-index:40;position:absolute;inset:0}.SD8qLW_overlayMax{gap:0;padding:0}.SD8qLW_overlayMax .SD8qLW_drawer{border-width:0 0 0 1px;border-radius:0;flex:auto;width:auto;min-width:0}@keyframes SD8qLW_gsFade{0%{opacity:0}}@keyframes SD8qLW_gsSlide{0%{opacity:0;transform:translate(24px)}}.SD8qLW_resizer{z-index:30;cursor:col-resize;touch-action:none;justify-content:center;align-items:center;width:10px;display:flex;position:absolute;top:0;bottom:0;left:0}.SD8qLW_resizer:after{content:\"\";background:var(--gs-fg-fainter);opacity:0;border-radius:999px;width:3px;height:32px;transition:opacity .14s,height .14s}.SD8qLW_resizer:hover:after{opacity:.6}.SD8qLW_resizerActive:after{opacity:.9;height:56px}.SD8qLW_paneDivider{z-index:5;cursor:col-resize;touch-action:none;flex:none;justify-content:center;align-items:center;width:7px;display:flex;position:relative}.SD8qLW_paneDivider:before{content:\"\";background:var(--gs-border-soft);width:1px;position:absolute;top:0;bottom:0;left:3px}.SD8qLW_paneDivider:after{content:\"\";background:var(--gs-fg-fainter);opacity:0;border-radius:999px;width:3px;height:28px;transition:opacity .14s,height .14s;position:relative}.SD8qLW_paneDivider:hover:after{opacity:.6}.SD8qLW_paneDividerActive:after{opacity:.9;height:48px}.SD8qLW_paneDividerY{cursor:row-resize;width:auto;height:7px}.SD8qLW_paneDividerY:before{width:auto;height:1px;inset:3px 0 auto}.SD8qLW_paneDividerY:after{width:28px;height:3px;transition:opacity .14s,width .14s}.SD8qLW_paneDividerY.SD8qLW_paneDividerActive:after{width:48px;height:3px}.SD8qLW_header{padding:10px var(--gs-gutter);border-bottom:1px solid var(--gs-border);background:var(--gs-surface-2);font-family:var(--dsw-font-ui,system-ui, sans-serif);font-size:var(--gs-t-ui);flex:none;justify-content:space-between;align-items:center;gap:12px;display:flex}.SD8qLW_headerLeft{flex-wrap:wrap;align-items:center;gap:10px;min-width:0;display:flex}.SD8qLW_headerBranch{border:1px solid var(--gs-accent-border);background:var(--gs-accent-bg);color:var(--gs-accent);border-radius:999px;align-items:center;gap:6px;padding:2px 10px;font-weight:600;display:inline-flex}.SD8qLW_refButton.SD8qLW_headerPicker{border-color:var(--gs-accent-border);background:var(--gs-accent-bg);max-width:420px;color:var(--gs-accent);font-weight:600}.SD8qLW_refButton.SD8qLW_headerPicker:hover{background:var(--gs-accent-bg);color:var(--gs-accent);border-color:var(--gs-accent)}.SD8qLW_elide{flex:0 auto;align-items:baseline;min-width:0;display:inline-flex}.SD8qLW_elideHead{white-space:nowrap;text-overflow:ellipsis;flex:0 999 auto;min-width:0;overflow:hidden}.SD8qLW_elideTail{white-space:nowrap;text-overflow:ellipsis;flex:0 auto;min-width:0;overflow:hidden}.SD8qLW_headerPathMain{color:var(--gs-fg-faint);font-size:var(--gs-t-meta)}.SD8qLW_headerPathMain .SD8qLW_elideTail{color:var(--gs-fg-dim)}.SD8qLW_headerViewRef{max-width:160px}.SD8qLW_headerView{background:var(--gs-neutral-bg);color:var(--gs-fg-muted);font-size:var(--gs-t-meta);font-variant-numeric:tabular-nums;border-radius:999px;flex:none;padding:1px 8px}.SD8qLW_headerDetached{background:var(--gs-warn-bg);color:var(--gs-warn);font-size:var(--gs-t-meta);letter-spacing:.02em;border-radius:999px;padding:1px 8px}.SD8qLW_headerTotals{font-variant-numeric:tabular-nums}.SD8qLW_headerTotalsAdd{color:var(--gs-add);font-weight:600}.SD8qLW_headerTotalsDel{color:var(--gs-del);font-weight:600}.SD8qLW_headerTotalsDim{color:var(--gs-fg-dim);font-size:var(--gs-t-dense)}.SD8qLW_headerRight{flex:none;gap:8px;display:flex;position:relative}.SD8qLW_theme{display:inline-flex;position:relative}.SD8qLW_refPop.SD8qLW_settingsPop{width:320px;max-width:calc(100vw - 32px);max-height:min(560px,100vh - 120px);top:calc(100% + 6px);left:auto;right:0}.SD8qLW_themeRail{min-height:0;font-family:var(--dsw-font-ui,system-ui, sans-serif);flex-direction:column;flex:1;gap:14px;padding:12px 14px 16px;display:flex;overflow-y:auto}.SD8qLW_themeGroup{flex-direction:column;gap:6px;display:flex}.SD8qLW_themeLabel{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);letter-spacing:.04em;text-transform:uppercase;font-weight:600}.SD8qLW_themeRowSplit{justify-content:space-between;align-items:center;gap:8px;display:flex}.SD8qLW_segmented{gap:6px;display:flex}.SD8qLW_segment{box-sizing:border-box;border:1px solid var(--gs-border);border-radius:var(--gs-r-control);color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-meta);cursor:pointer;background:0 0;flex-direction:column;flex:1 1 0;align-items:stretch;gap:4px;padding:4px;transition:background .12s,color .12s,border-color .12s;display:flex}.SD8qLW_segment:hover{background:var(--gs-raise);border-color:var(--gs-fg-fainter);color:var(--gs-fg)}.SD8qLW_segment:focus-visible{outline:2px solid var(--gs-accent);outline-offset:1px}.SD8qLW_segmentChip{border-radius:calc(var(--gs-r-control) - 4px);border:1px solid #80808073;height:20px}.SD8qLW_chipLight{background:#fff}.SD8qLW_chipDark{background:#0b0b0d}.SD8qLW_chipSystem{background:linear-gradient(105deg,#fff 0 50%,#0b0b0d 50% 100%)}.SD8qLW_paletteRow{box-sizing:border-box;border-radius:var(--gs-r-control);width:100%;color:var(--gs-fg-muted);font-family:inherit;font-size:var(--gs-t-dense);text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;padding:5px 8px;display:flex}.SD8qLW_paletteRow:hover{background:var(--gs-raise);color:var(--gs-fg)}.SD8qLW_swatch{border:1px solid var(--gs-border);border-radius:3px;flex:none;width:26px;height:12px;display:inline-flex;overflow:hidden}.SD8qLW_swatch span{flex:1}.SD8qLW_scopeRow{gap:6px;display:flex}.SD8qLW_scopeHint{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);overflow-wrap:anywhere}.SD8qLW_bgPreview{border:1px solid var(--gs-border);border-radius:var(--gs-r-control);background-color:var(--gs-bg);background-position:50%;background-size:cover;height:64px}.SD8qLW_bgEmpty{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);justify-content:center;align-items:center;display:flex}.SD8qLW_sliderRow{font-size:var(--gs-t-meta);color:var(--gs-fg-dim);align-items:center;gap:8px;display:flex}.SD8qLW_sliderRow input{min-width:0;accent-color:var(--gs-accent);flex:1}.SD8qLW_sliderValue{text-align:right;font-variant-numeric:tabular-nums;flex:none;width:38px}.SD8qLW_cssArea{box-sizing:border-box;border:1px solid var(--gs-border);border-radius:var(--gs-r-control);background:var(--gs-bg);width:100%;min-height:96px;max-height:220px;color:var(--gs-fg);font-family:var(--dsw-font-mono,ui-monospace, Consolas, monospace);font-size:var(--gs-t-meta);resize:vertical;outline:none;padding:7px 8px}.SD8qLW_cssArea:focus{border-color:var(--gs-accent-border)}.SD8qLW_themeNote{color:var(--gs-warn);font-size:var(--gs-t-meta)}.SD8qLW_themeDirty{color:var(--gs-accent);font-size:var(--gs-t-meta)}.SD8qLW_wtCurrent{color:var(--gs-add);font-size:8px;line-height:1}.SD8qLW_commitCopy{margin-left:auto}.SD8qLW_commitPop{z-index:40;box-sizing:border-box;border:1px solid var(--gs-border);border-radius:var(--gs-r-surface);background:var(--gs-panel);width:min(380px,100vw - 24px);color:var(--gs-fg);box-shadow:0 16px 40px var(--gs-shadow);font-family:var(--dsw-font-ui,-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif);font-size:var(--gs-t-dense);flex-direction:column;gap:6px;padding:10px 12px 12px;display:flex;position:fixed;overflow:auto}.SD8qLW_commitPopTop{align-items:center;gap:8px;display:flex}.SD8qLW_commitPopTop .SD8qLW_commitWhen{margin-right:auto}.SD8qLW_commitPopMeta{color:var(--gs-fg-muted);font-size:var(--gs-t-dense);flex-direction:column;gap:2px;line-height:16px;display:flex}.SD8qLW_commitFilter{min-width:120px;height:var(--gs-h-control);box-sizing:border-box;border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-control);background:var(--gs-bg);color:var(--gs-fg);font-family:inherit;font-size:var(--gs-t-dense);outline:none;flex:auto;padding:0 10px}.SD8qLW_commitFilter:focus{border-color:var(--gs-accent)}.SD8qLW_commitFilter::placeholder{color:var(--gs-fg-faint)}.SD8qLW_filterChips{border-bottom:1px solid var(--gs-border-soft);flex-wrap:wrap;flex:none;align-items:center;gap:6px;padding:6px 10px;display:flex}.SD8qLW_filterChip{border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-control);background:var(--gs-surface-2);max-width:220px;font-size:var(--gs-t-dense);align-items:center;gap:2px;line-height:18px;display:inline-flex}.SD8qLW_filterChipLabel{text-overflow:ellipsis;white-space:nowrap;color:var(--gs-fg-muted);padding:2px 4px 2px 8px;overflow:hidden}.SD8qLW_filterChipRemove{border:none;border-left:1px solid var(--gs-border-soft);color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-dense);cursor:pointer;background:0 0;flex:none;padding:0 6px;line-height:20px}.SD8qLW_filterChipRemove:hover{color:var(--gs-danger,var(--gs-fg))}.SD8qLW_filterClear{color:var(--gs-fg-faint);font-family:inherit;font-size:var(--gs-t-dense);cursor:pointer;background:0 0;border:none;padding:2px 4px;line-height:18px}.SD8qLW_filterClear:hover{color:var(--gs-fg)}.SD8qLW_funnel{display:inline-flex;position:relative}.SD8qLW_funnelButton.SD8qLW_funnelButtonActive{color:var(--gs-accent);border-color:var(--gs-accent)}.SD8qLW_funnelPop{z-index:40;box-sizing:border-box;border:1px solid var(--gs-border);border-radius:var(--gs-r-surface);background:var(--gs-panel);width:320px;max-width:calc(100vw - 24px);box-shadow:0 16px 40px var(--gs-shadow);font-size:var(--gs-t-dense);flex-direction:column;display:flex;position:fixed;overflow:hidden}.SD8qLW_funnelTabs{border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-pill);background:var(--gs-bg);flex:none;gap:2px;margin:8px 8px 0;padding:2px;display:flex}.SD8qLW_funnelTab{border-radius:var(--gs-r-pill);min-width:0;height:22px;color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-dense);white-space:nowrap;cursor:pointer;background:0 0;border:none;flex:1;padding:0 8px;line-height:1;transition:background .12s,color .12s}.SD8qLW_funnelTab:hover{color:var(--gs-fg)}.SD8qLW_funnelTab.SD8qLW_funnelTabActive{color:var(--gs-fg);background:var(--gs-raise);box-shadow:inset 0 0 0 1px var(--gs-border)}.SD8qLW_funnelTab:focus-visible{outline:2px solid var(--gs-accent);outline-offset:1px}.SD8qLW_funnelTabCount{color:var(--gs-accent);font-variant-numeric:tabular-nums;margin-left:4px}.SD8qLW_funnelPane{flex-direction:column;flex:auto;gap:6px;min-height:0;padding:8px;display:flex}.SD8qLW_funnelCaption{color:var(--gs-fg-faint);letter-spacing:.04em;text-transform:uppercase;flex:none;font-size:11px;line-height:14px}.SD8qLW_funnelBounds{border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-control);background:var(--gs-bg);flex:none;gap:2px;padding:2px;display:flex}.SD8qLW_funnelBoundBtn{border-radius:calc(var(--gs-r-control) - 3px);min-width:0;height:20px;color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-dense);cursor:pointer;background:0 0;border:none;flex:1;padding:0 6px;line-height:1;transition:background .12s,color .12s}.SD8qLW_funnelBoundBtn:hover{color:var(--gs-fg)}.SD8qLW_funnelBoundBtn.SD8qLW_funnelBoundBtnActive{color:var(--gs-accent);background:var(--gs-accent-bg);box-shadow:inset 0 0 0 1px var(--gs-accent-border)}.SD8qLW_cal{flex-direction:column;flex:none;gap:4px;display:flex}.SD8qLW_calHead{align-items:center;gap:4px;display:flex}.SD8qLW_calTitle{text-align:center;color:var(--gs-fg);font-size:var(--gs-t-dense);flex:1;line-height:20px}.SD8qLW_calNav{border-radius:var(--gs-r-control);width:22px;height:20px;color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-ui);cursor:pointer;background:0 0;border:none;flex:none;padding:0}.SD8qLW_calNav:hover{color:var(--gs-fg);background:var(--gs-raise)}.SD8qLW_calWeek,.SD8qLW_calGrid{grid-template-columns:repeat(7,1fr);gap:2px;display:grid}.SD8qLW_calWeek span{text-align:center;color:var(--gs-fg-faint);font-size:11px;line-height:14px}.SD8qLW_calGrid button{border-radius:var(--gs-r-control);height:26px;color:var(--gs-fg-muted);font-family:inherit;font-size:var(--gs-t-dense);font-variant-numeric:tabular-nums;cursor:pointer;background:0 0;border:none}.SD8qLW_calGrid button:hover{background:var(--gs-raise);color:var(--gs-fg)}.SD8qLW_calGrid button.SD8qLW_calOut{color:var(--gs-fg-fainter)}.SD8qLW_calGrid button.SD8qLW_calToday{color:var(--gs-accent);font-weight:600}.SD8qLW_calGrid button.SD8qLW_calIn{background:var(--gs-accent-bg);color:var(--gs-fg)}.SD8qLW_calGrid button.SD8qLW_calMark{background:var(--gs-accent);color:var(--gs-on-accent);font-weight:600}.SD8qLW_funnelBoundRows{flex:none;grid-template-columns:1fr 1fr;gap:6px;display:grid}.SD8qLW_funnelBoundRow{box-sizing:border-box;border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-control);background:var(--gs-bg);align-items:center;gap:4px;min-width:0;padding:3px 6px;font-size:11px;line-height:16px;display:flex}.SD8qLW_funnelBoundKey{color:var(--gs-fg-faint);flex:none}.SD8qLW_funnelBoundVal{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--gs-fg-faint);font-variant-numeric:tabular-nums;flex:1;overflow:hidden}.SD8qLW_funnelBoundValSet{color:var(--gs-fg)}.SD8qLW_funnelBoundClear{color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-dense);cursor:pointer;background:0 0;border:none;flex:none;padding:0 2px;line-height:1}.SD8qLW_funnelBoundClear:hover{color:var(--gs-danger,var(--gs-fg))}.SD8qLW_funnelSearch{box-sizing:border-box;border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-control);background:var(--gs-bg);height:26px;color:var(--gs-fg);font-family:inherit;font-size:var(--gs-t-dense);outline:none;flex:none;padding:0 8px}.SD8qLW_funnelSearch::placeholder{color:var(--gs-fg-faint)}.SD8qLW_funnelSearch:focus{border-color:var(--gs-accent);box-shadow:0 0 0 2px var(--gs-accent-bg)}.SD8qLW_funnelList{overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:var(--gs-fg-fainter) transparent;flex-direction:column;flex:auto;gap:1px;min-height:0;margin:0 -4px;padding:0 4px;display:flex;overflow-y:auto}.SD8qLW_funnelList::-webkit-scrollbar{width:10px}.SD8qLW_funnelList::-webkit-scrollbar-track{background:0 0}.SD8qLW_funnelList::-webkit-scrollbar-thumb{background:var(--gs-fg-fainter);background-clip:content-box;border:3px solid #0000;border-radius:5px}.SD8qLW_funnelRow{box-sizing:border-box;border-radius:var(--gs-r-control);cursor:pointer;align-items:center;gap:6px;min-height:24px;padding:0 4px;display:flex}.SD8qLW_funnelRow:hover{background:var(--gs-raise)}.SD8qLW_funnelRow:has(input[type=checkbox]:checked) .SD8qLW_funnelName,.SD8qLW_funnelRow:has(input[type=checkbox]:indeterminate) .SD8qLW_funnelName{color:var(--gs-fg)}.SD8qLW_funnelRow input[type=checkbox]{-webkit-appearance:none;appearance:none;box-sizing:border-box;border:1px solid var(--gs-fg-fainter);cursor:pointer;background:0 0;border-radius:3px;flex:none;width:14px;height:14px;margin:0;transition:background .12s,border-color .12s;position:relative}.SD8qLW_funnelRow input[type=checkbox]:hover{border-color:var(--gs-fg-dim)}.SD8qLW_funnelRow input[type=checkbox]:checked,.SD8qLW_funnelRow input[type=checkbox]:indeterminate{background:var(--gs-accent);border-color:var(--gs-accent)}.SD8qLW_funnelRow input[type=checkbox]:focus-visible{outline:2px solid var(--gs-accent);outline-offset:1px}.SD8qLW_funnelRow input[type=checkbox]:checked:after{content:\"\";border:solid var(--gs-on-accent);border-width:0 1.5px 1.5px 0;width:3px;height:7px;position:absolute;top:1px;left:4px;transform:rotate(42deg)}.SD8qLW_funnelRow input[type=checkbox]:indeterminate:after{content:\"\";background:var(--gs-on-accent);border-radius:1px;width:8px;height:2px;position:absolute;top:5px;left:2px}.SD8qLW_pathNode,.SD8qLW_pathChildren{flex-direction:column;display:flex}.SD8qLW_pathFileGlyph,.SD8qLW_pathDirGlyph{width:16px;height:16px;color:var(--gs-fg-dim);flex:none}.SD8qLW_funnelRow:hover .SD8qLW_pathFileGlyph,.SD8qLW_funnelRow:hover .SD8qLW_pathDirGlyph{color:var(--gs-fg-muted)}.SD8qLW_funnelName{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--gs-fg-muted);flex:1;overflow:hidden}.SD8qLW_funnelCount{color:var(--gs-fg-faint);font-variant-numeric:tabular-nums;flex:none;font-size:11px}.SD8qLW_funnelMore{color:var(--gs-fg-faint);padding:4px 6px}.SD8qLW_funnelChevron{width:14px;color:var(--gs-fg-faint);cursor:pointer;background:0 0;border:none;flex:none;padding:0;font-family:inherit;font-size:9px;line-height:16px}.SD8qLW_funnelChevron:hover:not(:disabled){color:var(--gs-fg)}.SD8qLW_funnelChevron:disabled{cursor:default}.SD8qLW_funnelPresets{flex:none;gap:4px;display:flex}.SD8qLW_funnelPreset{flex:1 1 0;min-width:0;padding:0 6px}.SD8qLW_funnelPreset.SD8qLW_funnelPresetActive{color:var(--gs-accent);border-color:var(--gs-accent);background:var(--gs-accent-bg)}.SD8qLW_funnelFoot{border-top:1px solid var(--gs-border-soft);background:var(--gs-bg);flex:none;justify-content:space-between;align-items:center;gap:8px;padding:6px 10px;font-size:11px;line-height:16px;display:flex}.SD8qLW_funnelFootCount{color:var(--gs-fg-faint);font-variant-numeric:tabular-nums}.SD8qLW_funnelFootCountOn{color:var(--gs-fg-muted)}.SD8qLW_funnelFootClear{border-radius:var(--gs-r-control);color:var(--gs-fg-dim);cursor:pointer;background:0 0;border:none;flex:none;padding:2px 6px;font-family:inherit;font-size:11px;line-height:16px}.SD8qLW_funnelFootClear:hover:not(:disabled){color:var(--gs-fg);background:var(--gs-raise)}.SD8qLW_funnelFootClear:disabled{color:var(--gs-fg-fainter);cursor:default}.SD8qLW_commitPopSubject{color:var(--gs-fg);font-size:var(--gs-t-ui);white-space:pre-wrap;overflow-wrap:anywhere;user-select:text;font-weight:600;line-height:18px}.SD8qLW_commitPopBody{color:var(--gs-fg-muted);font-family:inherit;font-size:var(--gs-t-dense);white-space:pre-wrap;overflow-wrap:anywhere;user-select:text;margin:0;line-height:18px}.SD8qLW_tabs{padding:0 var(--gs-gutter);border-bottom:1px solid var(--gs-border-soft);background:var(--gs-surface-2);flex:none;gap:24px;font-family:inherit;display:flex}.SD8qLW_tab{font-family:inherit;font-size:var(--gs-t-ui);color:var(--gs-fg-dim);cursor:pointer;background:0 0;border:none;padding:8px 0 9px;font-weight:500;line-height:16px;position:relative}.SD8qLW_tab:after{content:\"\";background:0 0;border-radius:2px;height:2px;position:absolute;bottom:1px;left:0;right:0}.SD8qLW_tabActive{color:var(--gs-accent)}.SD8qLW_tabActive:after{background:var(--gs-accent)}.SD8qLW_compareBar{padding:8px var(--gs-gutter);border-bottom:1px solid var(--gs-border-soft);background:var(--gs-surface-2);color:var(--gs-fg-dim);font-family:var(--dsw-font-ui,system-ui, sans-serif);font-size:var(--gs-t-dense);flex-wrap:wrap;flex:none;align-items:center;gap:10px;display:flex}.SD8qLW_compareArrow{color:var(--gs-fg-faint)}.SD8qLW_refPicker{align-items:center;gap:6px;display:inline-flex;position:relative}.SD8qLW_refLabel{color:var(--gs-fg-faint);flex:none}.SD8qLW_refButton{justify-content:space-between;max-width:260px}.SD8qLW_refValue{min-width:0;overflow:hidden}.SD8qLW_refCaret{color:var(--gs-fg-faint);flex:none;font-size:9px}.SD8qLW_refPop{z-index:10;border:1px solid var(--gs-border);border-radius:var(--gs-r-control);background:var(--gs-panel);width:300px;max-width:80vw;box-shadow:0 12px 32px var(--gs-shadow);flex-direction:column;display:flex;position:absolute;top:calc(100% + 4px);left:0;overflow:hidden}.SD8qLW_menuPop{width:auto;min-width:100%;padding:4px;left:auto;right:0}.SD8qLW_refSearch{border:0;border-bottom:1px solid var(--gs-border-soft);background:var(--gs-bg);color:var(--gs-fg);font-family:inherit;font-size:var(--gs-t-dense);outline:none;flex:none;padding:7px 10px}.SD8qLW_refSearch::placeholder{color:var(--gs-fg-faint)}.SD8qLW_refList{flex:1;max-height:280px;padding:4px;overflow-y:auto}.SD8qLW_refGroup{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);letter-spacing:.04em;text-transform:uppercase;padding:6px 8px 3px;font-weight:600}.SD8qLW_refRow{box-sizing:border-box;border-radius:var(--gs-r-control);width:100%;color:var(--gs-fg-muted);font-family:inherit;font-size:var(--gs-t-dense);text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:5px 8px;display:flex}.SD8qLW_refRow:hover{background:var(--gs-raise);color:var(--gs-fg)}.SD8qLW_refRowSpacer{flex:none;width:12px}.SD8qLW_refRowName{flex:auto;min-width:0;overflow:hidden}.SD8qLW_refEmpty{color:var(--gs-fg-faint);font-size:var(--gs-t-dense);padding:14px 10px}.SD8qLW_refFoot{border-top:1px solid var(--gs-border-soft);color:var(--gs-fg-faint);font-size:var(--gs-t-meta);flex:none;padding:5px 10px}.SD8qLW_commitsPane{box-sizing:border-box;width:26%;min-height:0;min-width:var(--gs-min-commits);background:var(--gs-surface);flex-direction:column;flex:0 auto;max-width:340px;display:flex}.SD8qLW_paneHead{box-sizing:border-box;min-height:37px;padding:6px var(--gs-gutter-pane);border-bottom:1px solid var(--gs-border-soft);color:var(--gs-fg-dim);font-family:var(--dsw-font-ui,system-ui, sans-serif);font-size:var(--gs-t-dense);flex-wrap:wrap;flex:none;align-items:center;gap:8px;display:flex}.SD8qLW_paneTitle{font-weight:600}.SD8qLW_commitsSentinel{flex:none;height:1px}.SD8qLW_commitsFoot{color:var(--gs-fg-faint);font-family:var(--dsw-font-ui,system-ui, sans-serif);font-size:var(--gs-t-meta);text-align:center;flex:none;min-height:16px;padding:8px}.SD8qLW_commits{flex-direction:column;flex:1;min-height:0;padding:4px 6px 4px 0;display:flex;overflow-y:auto}.SD8qLW_commitLine{height:var(--gs-commit-row);flex:none;align-items:stretch;display:flex}.SD8qLW_graphCell{flex:none;display:block}.SD8qLW_commit{box-sizing:border-box;border-radius:var(--gs-r-surface);text-align:left;cursor:pointer;min-width:0;height:100%;font-family:inherit;font-size:var(--gs-t-dense);background:0 0;border:1px solid #0000;flex:auto;align-items:center;gap:10px;margin:1px 0;padding:4px 8px;transition:background .12s,border-color .12s;display:flex;overflow:hidden}.SD8qLW_commitsPane[data-layout=columns] .SD8qLW_commit{flex-direction:column;justify-content:center;align-items:stretch;gap:2px}.SD8qLW_commitsPane[data-layout=columns] .SD8qLW_commitSubjectRow{flex:none}.SD8qLW_commitTop{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.SD8qLW_commit:hover{background:var(--gs-raise)}.SD8qLW_commitActive{border-color:var(--gs-accent-border);background:var(--gs-accent-bg)}.SD8qLW_commitMeta{flex:none;align-items:baseline;gap:8px;display:flex}.SD8qLW_commitHash{color:var(--gs-info);flex:none}.SD8qLW_commitSubjectRow{flex:auto;align-items:baseline;gap:4px;min-width:0;display:flex}.SD8qLW_commitSubject{white-space:nowrap;text-overflow:ellipsis;min-width:0;color:var(--gs-fg-muted);flex:0 auto;overflow:hidden}.SD8qLW_commitHasBody{color:var(--gs-fg-faint);letter-spacing:.04em;flex:none}.SD8qLW_commitRef{white-space:nowrap;text-overflow:ellipsis;border:1px solid var(--gs-accent-border);border-radius:var(--gs-r-pill);background:var(--gs-accent-bg);max-width:96px;color:var(--gs-accent);font-size:var(--gs-t-meta);flex:none;padding:0 5px;line-height:15px;overflow:hidden}.SD8qLW_commitWhen{color:var(--gs-fg-faint);flex:none}.SD8qLW_commitAuthor{text-overflow:ellipsis;white-space:nowrap;max-width:120px;color:var(--gs-fg-dim);flex:none;overflow:hidden}.SD8qLW_body{z-index:1;flex:1;min-height:0;display:flex}.SD8qLW_body[data-stacked]{flex-direction:column}.SD8qLW_bodyRow{flex:1 1 0;min-width:0;min-height:0;display:flex}.SD8qLW_body[data-stacked] .SD8qLW_commitsPane{width:auto;min-width:0;max-width:none;height:34%;min-height:var(--gs-min-commits-tall);max-height:max(var(--gs-min-commits-tall), calc(100% - var(--gs-min-stacked-lower)));flex:none}.SD8qLW_treeCol{box-sizing:border-box;width:28%;min-height:0;min-width:var(--gs-min-tree);background:var(--gs-surface);flex-direction:column;flex:0 auto;max-width:400px;display:flex}.SD8qLW_treeWrap{box-sizing:border-box;flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.SD8qLW_treeTools{box-sizing:border-box;min-height:37px;padding:6px var(--gs-gutter-pane);border-bottom:1px solid var(--gs-border-soft);flex-wrap:wrap;flex:none;justify-content:space-between;align-items:center;gap:6px;display:flex}.SD8qLW_treeActions{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.SD8qLW_treeLead{align-items:center;gap:4px;min-width:0;display:flex}.SD8qLW_treeLabel{white-space:nowrap;color:var(--gs-fg-dim);font-size:var(--gs-t-dense);flex:none}.SD8qLW_treeFilter{padding:6px var(--gs-gutter-pane);border-bottom:1px solid var(--gs-border-soft);flex:none;align-items:center;display:flex;position:relative}.SD8qLW_treeFilterInput{min-width:0;height:var(--gs-h-compact);box-sizing:border-box;border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-control);background:var(--gs-bg);color:var(--gs-fg);font-family:inherit;font-size:var(--gs-t-dense);outline:none;flex:auto;padding:0 24px 0 8px}.SD8qLW_treeFilterInput:focus{border-color:var(--gs-accent)}.SD8qLW_treeFilterInput::placeholder{color:var(--gs-fg-faint)}.SD8qLW_treeFilterClear{right:calc(var(--gs-gutter-pane) + 6px);border-radius:var(--gs-r-pill);width:16px;height:16px;color:var(--gs-fg-faint);font-size:var(--gs-t-ui);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;line-height:1;display:flex;position:absolute}.SD8qLW_treeFilterClear:hover{color:var(--gs-fg)}.SD8qLW_tree{flex:1;min-height:0;margin:0;padding:6px 0 16px;list-style:none;overflow:auto}.SD8qLW_treeEmpty{min-height:0;color:var(--gs-fg-faint);font-size:var(--gs-t-ui);flex:1;justify-content:center;align-items:center;display:flex}.SD8qLW_treeSub{margin:0;padding:0;list-style:none;position:relative}.SD8qLW_treeSub:before{content:\"\";top:0;bottom:0;left:var(--gs-rail,0);background:var(--gs-border-soft);width:1px;position:absolute}.SD8qLW_treeDirLi{position:relative}.SD8qLW_treeDir{box-sizing:border-box;width:100%;color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-dense);text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:4px 12px 4px 8px;font-weight:600;display:flex}.SD8qLW_treeDir:hover{background:var(--gs-panel);color:var(--gs-fg-muted)}.SD8qLW_treeDirActive{color:var(--gs-fg-muted)}.SD8qLW_chevron{width:10px;color:var(--gs-fg-fainter);font-size:var(--gs-t-meta);flex:none;transition:transform .12s;display:inline-block}.SD8qLW_chevronOpen{transform:rotate(90deg)}.SD8qLW_treeDirName{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.SD8qLW_treeDirCount{background:var(--gs-neutral-bg);color:var(--gs-fg-dim);font-size:var(--gs-t-meta);border-radius:999px;flex:none;padding:0 6px;font-weight:600;line-height:16px}.SD8qLW_treeDirCounts{font-size:var(--gs-t-meta);font-variant-numeric:tabular-nums;flex:none}.SD8qLW_file{box-sizing:border-box;width:100%;color:var(--gs-fg-muted);font-family:inherit;font-size:var(--gs-t-dense);text-align:left;cursor:pointer;background:0 0;border:0;border-left:2px solid #0000;align-items:center;gap:8px;padding:5px 14px;display:flex}.SD8qLW_file:hover{background:var(--gs-panel)}.SD8qLW_fileActive{background:var(--gs-panel);border-left-color:var(--gs-accent);color:var(--gs-fg)}.SD8qLW_fileStatus{width:18px;height:18px;font-weight:700;font-size:var(--gs-t-meta);border-radius:5px;flex:none;justify-content:center;align-items:center;line-height:1;display:inline-flex}.SD8qLW_stAdded,.SD8qLW_stUntracked{color:var(--gs-add);background:var(--gs-add-bg)}.SD8qLW_stDeleted{color:var(--gs-del);background:var(--gs-del-bg)}.SD8qLW_stModified{color:var(--gs-warn);background:var(--gs-warn-bg)}.SD8qLW_stRenamed{color:var(--gs-info);background:var(--gs-info-bg)}.SD8qLW_filePath{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.SD8qLW_fileBinary{background:var(--gs-neutral-bg);color:var(--gs-fg-dim);letter-spacing:.06em;border-radius:4px;flex:none;padding:0 5px;font-size:9px;font-weight:700}.SD8qLW_fileCounts{font-size:var(--gs-t-meta);font-variant-numeric:tabular-nums;flex:none}.SD8qLW_fileCountAdd{color:var(--gs-add)}.SD8qLW_fileCountDel{color:var(--gs-del)}.SD8qLW_diffPane{min-width:var(--gs-min-diff);background:var(--gs-surface);flex-direction:column;flex:1 1 0;display:flex;overflow:auto}.SD8qLW_diffWrap{flex-direction:column;flex:auto;width:100%;min-height:0;display:flex}.SD8qLW_diffScroll{outline:none;flex:1 1 0;min-height:0;overflow:auto}.SD8qLW_diffNav{border-bottom:1px solid var(--gs-border-soft);flex:none;justify-content:flex-end;align-items:center;gap:4px;padding:3px 12px 3px 0;display:flex}.SD8qLW_diffNav .SD8qLW_blockBtn{padding-inline:6px;line-height:0}.SD8qLW_diffPre{width:max-content;min-width:100%;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:var(--gs-t-dense);font-variant-ligatures:none;font-feature-settings:\"liga\" 0, \"calt\" 0;tab-size:4;flex-direction:column;margin:0;padding:8px 0 16px;font-weight:400;line-height:20px;display:flex}.SD8qLW_renameLine{border-bottom:1px solid var(--gs-border-soft);color:var(--gs-info);font-size:var(--gs-t-dense);flex:none;padding:8px 16px}.SD8qLW_renameLine code{color:var(--gs-fg)}.SD8qLW_line{white-space:nowrap;align-items:stretch;width:max-content;min-width:100%;min-height:20px;line-height:20px;display:flex}.SD8qLW_lnOld,.SD8qLW_lnNew{box-sizing:border-box;text-align:right;width:3.2em;color:var(--gs-fg-fainter);user-select:none;font-variant-numeric:tabular-nums;flex:none;padding:0 8px}.SD8qLW_line:hover .SD8qLW_lnOld,.SD8qLW_line:hover .SD8qLW_lnNew{color:var(--gs-fg-dim)}.SD8qLW_gutter{text-align:center;user-select:none;flex:none;width:1.4em}.SD8qLW_code{white-space:pre;flex:1 0 auto;padding:0 16px 0 10px}.SD8qLW_lineAdd{background:var(--gs-add-line)}.SD8qLW_lineDel{background:var(--gs-del-line)}.SD8qLW_lineAdd .SD8qLW_lnOld,.SD8qLW_lineAdd .SD8qLW_lnNew,.SD8qLW_lineAdd .SD8qLW_gutter{background:var(--gs-add-num,var(--gs-add-line))}.SD8qLW_lineDel .SD8qLW_lnOld,.SD8qLW_lineDel .SD8qLW_lnNew,.SD8qLW_lineDel .SD8qLW_gutter{background:var(--gs-del-num,var(--gs-del-line))}.SD8qLW_lineContext{color:var(--gs-fg-muted)}.SD8qLW_lineHunk{background:var(--gs-hunk)}.SD8qLW_lineHunk .SD8qLW_code{color:var(--gs-fg-dim)}.SD8qLW_lineHunk .SD8qLW_lnOld,.SD8qLW_lineHunk .SD8qLW_lnNew,.SD8qLW_lineHunk .SD8qLW_gutter{background:var(--gs-hunk-num,var(--gs-hunk))}.SD8qLW_signAdd{color:var(--gs-add)}.SD8qLW_signDel{color:var(--gs-del)}.SD8qLW_wordAdd{background:var(--gs-add-word);border-radius:2px}.SD8qLW_wordDel{background:var(--gs-del-word);border-radius:2px}.SD8qLW_sidePane{flex-direction:column;width:100%;min-width:0;height:100%;display:flex}.SD8qLW_sideScroll{flex:1 1 0;min-height:0;overflow:hidden auto}.SD8qLW_sideCols{align-items:stretch;min-height:100%;display:flex}.SD8qLW_sideCol{flex:none;min-width:0;overflow-x:auto}.SD8qLW_sideColRight{flex:1 1 0}.SD8qLW_sideColGrid{width:max-content;min-width:100%;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:var(--gs-t-dense);font-variant-ligatures:none;font-feature-settings:\"liga\" 0, \"calt\" 0;tab-size:4;grid-template-columns:3.2em 1fr;align-content:start;padding:8px 0 16px;font-weight:400;line-height:20px;display:grid}.SD8qLW_sideColGridBlame{grid-template-columns:13em 3.2em 1fr}.SD8qLW_blameCell{box-sizing:border-box;border-right:1px solid var(--gs-border-soft);color:var(--gs-fg-faint);font-size:var(--gs-t-meta);white-space:pre;text-overflow:ellipsis;user-select:none;padding:0 8px 0 10px;overflow:hidden}.SD8qLW_sideTabs{z-index:5;border-bottom:1px solid var(--gs-border-soft);background:var(--gs-surface-2);flex:none;gap:16px;padding:6px 16px 0;display:flex}.SD8qLW_sideTab{font-family:inherit;font-size:var(--gs-t-meta);color:var(--gs-fg-dim);cursor:pointer;background:0 0;border:none;padding:2px 0 5px;font-weight:500;line-height:16px;position:relative}.SD8qLW_sideTab:after{content:\"\";background:0 0;border-radius:2px;height:2px;position:absolute;bottom:1px;left:0;right:0}.SD8qLW_sideTabActive{color:var(--gs-accent)}.SD8qLW_sideTabActive:after{background:var(--gs-accent)}.SD8qLW_sideNotice{border-bottom:1px solid var(--gs-border-soft);color:var(--gs-info);font-size:var(--gs-t-dense);flex:none;padding:8px 16px}.SD8qLW_sideNum{box-sizing:border-box;text-align:right;color:var(--gs-fg-fainter);user-select:none;font-variant-numeric:tabular-nums;padding:0 8px}.SD8qLW_sideNumAdd{background:var(--gs-add-num,var(--gs-add-line))}.SD8qLW_sideNumDel{background:var(--gs-del-num,var(--gs-del-line))}.SD8qLW_sideCode{white-space:pre;min-height:20px;padding:0 16px 0 10px}.SD8qLW_sideSpacer{grid-column:1/-1}.SD8qLW_sideCodeSame{color:var(--gs-fg-muted)}.SD8qLW_sideCodeAdd{background:var(--gs-add-line)}.SD8qLW_sideCodeDel{background:var(--gs-del-line)}.SD8qLW_sideCellBlock{position:relative}.SD8qLW_sideBlockHot{outline:1px solid var(--gs-accent);outline-offset:-1px}.SD8qLW_blockBar{z-index:4;border:1px solid var(--gs-border);border-radius:var(--gs-r-control);background:var(--gs-surface-2,var(--gs-bg));box-shadow:0 4px 14px var(--gs-shadow);white-space:nowrap;gap:4px;padding:2px;display:flex;position:absolute;top:-21px;left:0}.SD8qLW_blockBtn{border:1px solid var(--gs-border);border-radius:var(--gs-r-pill);background:var(--gs-bg);color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-meta);cursor:pointer;padding:0 8px;line-height:16px}.SD8qLW_blockBtn:hover:not(:disabled){color:var(--gs-fg);border-color:var(--gs-accent)}.SD8qLW_blockBtn:disabled{opacity:.45;cursor:default}.SD8qLW_blockBtnDanger{color:var(--gs-del);border-color:var(--gs-del-bg,var(--gs-border))}.SD8qLW_blockBtnDanger:hover:not(:disabled){color:var(--gs-del);border-color:var(--gs-del)}.SD8qLW_sideArmable{cursor:text}.SD8qLW_cmHost{position:relative}.SD8qLW_cmHost[data-editable]:before{content:\"\";background:var(--gs-accent);opacity:.32;pointer-events:none;border-radius:1px;width:2px;transition:opacity .14s;position:absolute;top:0;bottom:0;left:0}.SD8qLW_cmHost[data-editable]:focus-within:before{opacity:1}.SD8qLW_sideNav{align-items:center;gap:4px;margin-left:auto;padding:2px 0 5px;display:flex}.SD8qLW_sideNav .SD8qLW_blockBtn{padding-inline:6px;line-height:0}.SD8qLW_sideNavCount{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);white-space:nowrap}.SD8qLW_sideActions{align-items:flex-start;gap:4px;margin-left:auto;padding:2px 0 5px;display:flex}.SD8qLW_sideSaveReady{color:var(--gs-accent);border-color:var(--gs-accent)}.SD8qLW_sideBanner{border-bottom:1px solid var(--gs-border-soft);background:var(--gs-del-bg,transparent);color:var(--gs-del);font-size:var(--gs-t-dense);flex-direction:column;flex:none;gap:6px;padding:8px 16px;display:flex}.SD8qLW_sideBannerTitle{font-weight:600}.SD8qLW_sideBannerActs{gap:4px;display:flex}.SD8qLW_sideEditCell{position:relative}.SD8qLW_empty{color:var(--gs-fg-faint);font-size:var(--gs-t-ui);padding:32px 24px}.SD8qLW_syncBar{padding:8px var(--gs-gutter);border-bottom:1px solid var(--gs-border-soft);background:var(--gs-surface-2);font-size:var(--gs-t-dense);color:var(--gs-fg-dim);flex-wrap:wrap;flex:none;align-items:center;gap:8px;display:flex}.SD8qLW_syncUpstream{white-space:nowrap;text-overflow:ellipsis;max-width:260px;color:var(--gs-fg-muted);font-variant-numeric:tabular-nums;overflow:hidden}.SD8qLW_syncLevel{color:var(--gs-fg-faint)}.SD8qLW_syncSpacer{flex:auto}.SD8qLW_btn:disabled,.SD8qLW_treeIcon:disabled,.SD8qLW_miniBtn:disabled,.SD8qLW_refButton:disabled,.SD8qLW_funnelButton:disabled{opacity:.45;cursor:default}.SD8qLW_btn[data-quiet]:disabled,.SD8qLW_refButton[data-quiet]:disabled{opacity:1}.SD8qLW_opBanner{padding:8px var(--gs-gutter);border-bottom:1px solid var(--gs-border-soft);font-size:var(--gs-t-dense);white-space:pre-wrap;overflow-wrap:anywhere;user-select:text;flex:none;line-height:18px}.SD8qLW_opBannerOk{background:var(--gs-add-bg);color:var(--gs-add)}.SD8qLW_opBannerBad{background:var(--gs-del-bg);color:var(--gs-del)}.SD8qLW_fileLi{align-items:stretch;display:flex}.SD8qLW_fileLi .SD8qLW_file{flex:auto;min-width:0}.SD8qLW_fileDiscard{width:22px;color:var(--gs-fg-faint);opacity:0;cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;padding:0;transition:opacity .12s,color .12s;display:flex}.SD8qLW_fileLi:hover .SD8qLW_fileDiscard,.SD8qLW_fileDiscard:focus-visible{opacity:1}.SD8qLW_fileDiscard:hover{color:var(--gs-del)}.SD8qLW_fileDiscard:focus-visible{outline:2px solid var(--gs-accent);outline-offset:-2px;border-radius:var(--gs-r-control)}.SD8qLW_treeRow{align-items:stretch;display:flex}.SD8qLW_treeRow .SD8qLW_treeDir{flex:auto;min-width:0}.SD8qLW_checkBox{cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;width:22px;padding:0;display:flex}.SD8qLW_checkMark{box-sizing:border-box;border:1px solid var(--gs-fg-faint);background:var(--gs-bg);color:#0000;border-radius:3px;justify-content:center;align-items:center;width:14px;height:14px;font-size:10px;font-weight:700;line-height:1;transition:background .12s,border-color .12s;display:flex}.SD8qLW_checkBox:hover .SD8qLW_checkMark{border-color:var(--gs-accent)}.SD8qLW_checkBox:focus-visible{outline:none}.SD8qLW_checkBox:focus-visible .SD8qLW_checkMark{outline:2px solid var(--gs-accent);outline-offset:1px}.SD8qLW_checkMarkOn,.SD8qLW_checkMarkPartial{border-color:var(--gs-accent);background:var(--gs-accent);color:var(--gs-on-accent)}.SD8qLW_commitBox{padding:8px var(--gs-gutter-pane) 10px;border-top:1px solid var(--gs-border);background:var(--gs-surface-2);flex-direction:column;flex:none;gap:6px;display:flex}.SD8qLW_commitMessage{box-sizing:border-box;border:1px solid var(--gs-border);border-radius:var(--gs-r-control);background:var(--gs-bg);width:100%;min-height:46px;max-height:160px;color:var(--gs-fg);font-family:inherit;font-size:var(--gs-t-dense);resize:vertical;outline:none;padding:6px 8px;line-height:18px}.SD8qLW_commitMessage:focus{border-color:var(--gs-accent-border)}.SD8qLW_commitMessage::placeholder{color:var(--gs-fg-faint)}.SD8qLW_commitRow{align-items:center;gap:8px;display:flex}.SD8qLW_commitAmend{color:var(--gs-fg-dim);font-size:var(--gs-t-meta);cursor:pointer;align-items:center;gap:4px;display:inline-flex}.SD8qLW_commitAmend input{accent-color:var(--gs-accent);cursor:pointer}.SD8qLW_commitStaged{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);margin-left:auto}.SD8qLW_commitLead{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);margin:0;line-height:15px}.SD8qLW_commitBtn{box-sizing:border-box;min-width:92px;height:var(--gs-h-control);border-radius:var(--gs-r-control);background:var(--gs-accent);color:var(--gs-on-accent);font-family:inherit;font-size:var(--gs-t-ui);white-space:nowrap;cursor:pointer;border:1px solid #0000;flex:none;justify-content:center;align-items:center;padding:0 16px;font-weight:600;line-height:1;transition:filter .12s,opacity .12s;display:inline-flex}.SD8qLW_commitBtn:hover:not(:disabled){filter:brightness(1.1)}.SD8qLW_commitBtn:focus-visible{outline:2px solid var(--gs-accent);outline-offset:2px}.SD8qLW_commitBtn:disabled{background:var(--gs-raise);color:var(--gs-fg-faint);border-color:var(--gs-border);cursor:default}.SD8qLW_btn,.SD8qLW_miniBtn,.SD8qLW_treeIcon,.SD8qLW_commitCopy,.SD8qLW_scopeBtn,.SD8qLW_refButton,.SD8qLW_funnelButton,.SD8qLW_funnelPreset,.SD8qLW_layoutButton{box-sizing:border-box;height:var(--gs-h-control);padding:var(--gs-pad-control);border:1px solid var(--gs-border);border-radius:var(--gs-r-control);color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-ui);white-space:nowrap;cursor:pointer;background:0 0;flex:none;justify-content:center;align-items:center;gap:6px;line-height:1;transition:background .12s,color .12s,border-color .12s;display:inline-flex}.SD8qLW_btn:hover,.SD8qLW_miniBtn:hover,.SD8qLW_treeIcon:hover,.SD8qLW_commitCopy:hover,.SD8qLW_scopeBtn:hover,.SD8qLW_refButton:hover,.SD8qLW_funnelButton:hover,.SD8qLW_funnelPreset:hover,.SD8qLW_layoutButton:hover{background:var(--gs-raise);color:var(--gs-fg);border-color:var(--gs-fg-fainter)}.SD8qLW_btn:focus-visible,.SD8qLW_miniBtn:focus-visible,.SD8qLW_treeIcon:focus-visible,.SD8qLW_commitCopy:focus-visible,.SD8qLW_scopeBtn:focus-visible,.SD8qLW_refButton:focus-visible,.SD8qLW_funnelPreset:focus-visible,.SD8qLW_layoutButton:focus-visible{outline:2px solid var(--gs-accent);outline-offset:1px}.SD8qLW_btn,.SD8qLW_refButton{border-radius:var(--gs-r-pill)}.SD8qLW_treeIcon,.SD8qLW_commitCopy,.SD8qLW_funnelPreset,.SD8qLW_layoutButton{height:var(--gs-h-compact);padding:var(--gs-pad-compact);font-size:var(--gs-t-dense)}.SD8qLW_treeIcon{width:var(--gs-h-compact);padding:0}.SD8qLW_layoutSwitch{flex:none;gap:2px;margin-left:auto;display:inline-flex}.SD8qLW_layoutButton{width:var(--gs-h-compact);padding:0}.SD8qLW_layoutButton.SD8qLW_layoutButtonOn{color:var(--gs-accent);border-color:var(--gs-accent)}.SD8qLW_layoutGlyph{display:block}.SD8qLW_treeIcon.SD8qLW_treeIconOn{color:var(--gs-accent);border-color:var(--gs-accent)}.SD8qLW_treeIconGlyph{font-size:var(--gs-t-meta);line-height:1;display:block}.SD8qLW_treeIconDown{transform:rotate(90deg)}.SD8qLW_scopeBtn{flex:1 1 0}.SD8qLW_scopeBtnActive,.SD8qLW_miniBtnPrimary,.SD8qLW_segmentActive,.SD8qLW_refRowActive,.SD8qLW_paletteRowActive{border-color:var(--gs-accent-border);background:var(--gs-accent-bg);color:var(--gs-accent);font-weight:600}.SD8qLW_btnIcon{width:var(--gs-h-control);padding:0}.SD8qLW_btnIcon svg{display:block}.SD8qLW_btnClose:hover:not(:disabled){border-color:var(--gs-del);background:var(--gs-del-bg);color:var(--gs-del)}.SD8qLW_btnBehind{border-color:var(--gs-warn);background:var(--gs-warn-bg);color:var(--gs-warn);font-weight:600}.SD8qLW_btnBehind:hover:not(:disabled){background:var(--gs-warn-bg);color:var(--gs-warn);border-color:var(--gs-warn)}.SD8qLW_btnAhead{border-color:var(--gs-add);background:var(--gs-add-bg);color:var(--gs-add);font-weight:600}.SD8qLW_btnAhead:hover:not(:disabled){background:var(--gs-add-bg);color:var(--gs-add);border-color:var(--gs-add)}.SD8qLW_btnPrimary{border-color:var(--gs-accent);background:var(--gs-accent);color:var(--gs-on-accent,#fff);font-weight:600}.SD8qLW_btnPrimary:hover:not(:disabled){background:var(--gs-accent);color:var(--gs-on-accent,#fff);border-color:var(--gs-accent)}.SD8qLW_btnCount{font-variant-numeric:tabular-nums;opacity:.85;border-left:1px solid;margin-left:1px;padding-left:6px}.SD8qLW_pullGroup{flex:none;align-items:center;display:inline-flex}.SD8qLW_pullGroup>.SD8qLW_refPicker>.SD8qLW_refButton{border-right-color:#0000;border-top-right-radius:0;border-bottom-right-radius:0}.SD8qLW_pullGroup>.SD8qLW_btn{border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.SD8qLW_drawer{scrollbar-width:thin;scrollbar-color:var(--gs-border) transparent}.SD8qLW_drawer ::-webkit-scrollbar{width:10px;height:10px}.SD8qLW_drawer ::-webkit-scrollbar-track,.SD8qLW_drawer ::-webkit-scrollbar-corner{background:0 0}.SD8qLW_drawer ::-webkit-scrollbar-thumb{background:var(--gs-border);background-clip:padding-box;border:3px solid #0000;border-radius:999px}.SD8qLW_drawer ::-webkit-scrollbar-thumb:hover{background:var(--gs-fg-faint);background-clip:padding-box}.SD8qLW_commitRefMore{border-radius:var(--gs-r-pill);background:var(--gs-neutral-bg);color:var(--gs-fg-dim);font-size:var(--gs-t-meta);cursor:default;flex:none;padding:0 5px;line-height:15px}.SD8qLW_confirmScrim{background:var(--gs-backdrop);justify-content:center;align-items:center;padding:24px;animation:.12s ease-out SD8qLW_gsFade;display:flex}.SD8qLW_confirmBox{box-sizing:border-box;border:1px solid var(--gs-border);border-radius:var(--gs-r-drawer);background:var(--gs-bg);width:min(440px,100%);box-shadow:0 18px 48px var(--gs-shadow);flex-direction:column;gap:10px;padding:18px;display:flex}.SD8qLW_confirmTitle{color:var(--gs-fg);font-size:var(--gs-t-ui);font-weight:600}.SD8qLW_confirmBody{color:var(--gs-fg-dim);font-size:var(--gs-t-dense);overflow-wrap:anywhere;line-height:1.55}.SD8qLW_confirmActions{flex-direction:row-reverse;gap:8px;margin-top:2px;display:flex}.SD8qLW_btn.SD8qLW_btnDanger{border-color:var(--gs-del);background:var(--gs-del);color:var(--gs-on-accent,#fff);font-weight:600}.SD8qLW_btn.SD8qLW_btnDanger:hover:not(:disabled){border-color:var(--gs-del);background:var(--gs-del);color:var(--gs-on-accent,#fff)}.SD8qLW_fbTree{min-width:var(--gs-min-tree);background:var(--gs-surface-2);flex-direction:column;flex:none;gap:4px;padding:6px;display:flex;overflow:auto}.SD8qLW_fbSearch{box-sizing:border-box;width:100%;font:inherit;font-size:var(--gs-t-meta);color:var(--gs-fg);background:var(--gs-surface);border:1px solid var(--gs-border);border-radius:4px;flex:none;padding:4px 6px}.SD8qLW_fbSearch:focus{border-color:var(--gs-accent);outline:none}.SD8qLW_fbNote{font-size:var(--gs-t-meta);color:var(--gs-fg-dim);flex:none;padding:2px 4px}.SD8qLW_fbList{margin:0;padding:0;list-style:none}.SD8qLW_fbRow{width:100%;font:inherit;font-size:var(--gs-t-dense);color:var(--gs-fg-dim);text-align:left;cursor:pointer;white-space:nowrap;text-overflow:ellipsis;background:0 0;border:0;border-radius:3px;align-items:center;gap:4px;padding:2px 6px 2px 4px;display:flex;overflow:hidden}.SD8qLW_fbRow:hover{background:var(--gs-hover)}.SD8qLW_fbRowActive{background:var(--gs-selected);color:var(--gs-fg)}.SD8qLW_fbDirName,.SD8qLW_fbFileName{text-overflow:ellipsis;overflow:hidden}.SD8qLW_fbMain{min-width:var(--gs-min-diff);background:var(--gs-surface);flex-direction:column;flex:1 1 0;min-height:0;display:flex}.SD8qLW_fbHeader{border-bottom:1px solid var(--gs-border);flex:none;align-items:flex-start;gap:8px;padding:4px 8px 0;display:flex}.SD8qLW_fbPath{font-size:var(--gs-t-meta);color:var(--gs-fg-dim);text-overflow:ellipsis;white-space:nowrap;padding:4px 0;overflow:hidden}.SD8qLW_fbBody{flex:1 1 0;min-height:0;padding:4px 8px;overflow:auto}.SD8qLW_fbCommit{font-size:var(--gs-t-meta);color:var(--gs-fg-dim);background:var(--gs-surface-2);border-bottom:1px solid var(--gs-border);flex:none;align-items:baseline;gap:8px;padding:4px 8px;display:flex}.SD8qLW_fbCommitLine{color:var(--gs-fg-faint);font-variant-numeric:tabular-nums;flex:none}.SD8qLW_fbCommitWho{color:var(--gs-fg);flex:none;font-weight:600}.SD8qLW_fbCommitWhen{font-variant-numeric:tabular-nums;flex:none}.SD8qLW_fbCommitHash{color:var(--gs-fg-faint);flex:none;font-family:inherit}.SD8qLW_fbCommitWhat{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--gs-fg);flex:auto;overflow:hidden}.SD8qLW_fbCommitHint{color:var(--gs-fg-faint)}.SD8qLW_fbMore{font-size:var(--gs-t-meta);color:var(--gs-fg-faint);padding:2px 6px 4px 4px;font-style:italic;display:block}.SD8qLW_imgPane{flex-direction:column;gap:8px;height:100%;min-height:0;display:flex}.SD8qLW_imgStage{border-radius:var(--gs-r-control);background-color:var(--gs-surface-2);background-image:linear-gradient(45deg, var(--gs-border-soft) 25%, transparent 25%, transparent 75%, var(--gs-border-soft) 75%), linear-gradient(45deg, var(--gs-border-soft) 25%, transparent 25%, transparent 75%, var(--gs-border-soft) 75%);background-position:0 0,8px 8px;background-size:16px 16px;flex:auto;justify-content:center;align-items:center;min-height:0;padding:12px;display:flex;overflow:auto}.SD8qLW_imgShot{object-fit:contain;image-rendering:auto;max-width:100%;max-height:100%}.SD8qLW_imgStage[data-actual]{justify-content:flex-start;align-items:flex-start}.SD8qLW_imgStage[data-actual] .SD8qLW_imgShot{object-fit:none;max-width:none;max-height:none}.SD8qLW_imgCaption{font-size:var(--gs-t-meta);color:var(--gs-fg-dim);font-variant-numeric:tabular-nums;flex:none;align-items:center;gap:8px;display:flex}";
|
|
1224
|
+
const css = ".SD8qLW_card{border:1px solid var(--dsw-alias-border-l2);min-height:28px;color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;cursor:pointer;background:0 0;border-radius:8px;align-items:center;gap:7px;padding:3px 10px;font-size:12px;line-height:18px;transition:background .12s,border-color .12s;display:inline-flex}.SD8qLW_card:hover,.SD8qLW_card:focus-visible{background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l3)}.SD8qLW_cardBranch{max-width:220px;color:var(--dsw-alias-label-primary);align-items:center;gap:4px;font-weight:550;display:inline-flex;overflow:hidden}.SD8qLW_cardBranchName{min-width:0;overflow:hidden}.SD8qLW_cardGlyph{opacity:.7;flex:none}.SD8qLW_cardDetached{background:var(--dsw-alias-state-warning-bg,#bb800926);color:var(--dsw-alias-state-warning-primary,#d29922);letter-spacing:.02em;border-radius:999px;padding:0 6px;font-size:10px;line-height:16px}.SD8qLW_cardWt{background:var(--dsw-alias-state-business-bg,#388bfd29);max-width:150px;color:var(--dsw-alias-state-business-primary,#58a6ff);letter-spacing:.02em;white-space:nowrap;text-overflow:ellipsis;border-radius:999px;align-items:center;gap:3px;padding:0 6px;font-size:10px;line-height:16px;display:inline-flex;overflow:hidden}.SD8qLW_cardAhead,.SD8qLW_cardBehind{color:var(--dsw-alias-label-tertiary);font-size:11px}.SD8qLW_cardAhead{color:var(--dsw-alias-state-success-primary)}.SD8qLW_cardBehind{color:var(--dsw-alias-state-attention-primary,#d29922)}.SD8qLW_cardSep{background:var(--dsw-alias-border-l2);width:1px;height:14px}.SD8qLW_cardAdded{color:var(--dsw-alias-state-success-primary)}.SD8qLW_cardDeleted{color:var(--dsw-alias-state-error-primary)}.SD8qLW_cardFiles{color:var(--dsw-alias-label-tertiary)}.SD8qLW_overlay[data-gs-theme=github-dark]{--gs-bg:#0d1117;--gs-panel:#161b22;--gs-raise:#21262d;--gs-border:#30363d;--gs-border-soft:#21262d;--gs-fg:#e6edf3;--gs-fg-muted:#c9d1d9;--gs-fg-dim:#8b949e;--gs-fg-faint:#6e7681;--gs-fg-fainter:#484f58;--gs-accent:#58a6ff;--gs-accent-bg:#388bfd24;--gs-accent-border:#388bfd8c;--gs-add:#3fb950;--gs-del:#f85149;--gs-warn:#d29922;--gs-info:#79c0ff;--gs-add-bg:#2ea04329;--gs-del-bg:#f8514929;--gs-warn-bg:#bb800929;--gs-info-bg:#388bfd29;--gs-add-line:#12261e;--gs-del-line:#25181c;--gs-add-word:#1a4a29;--gs-del-word:#6b2b2b;--gs-add-num:#1c4428;--gs-del-num:#542426;--gs-hunk:#111d2e;--gs-hunk-num:#0c2d6b;--gs-neutral-bg:#6e76812e;--gs-backdrop:#01040999;--gs-shadow:#0104098c}.SD8qLW_overlay[data-gs-theme=github-light]{--gs-bg:#fff;--gs-panel:#f6f8fa;--gs-raise:#eaeef2;--gs-border:#d0d7de;--gs-border-soft:#eaeef2;--gs-fg:#1f2328;--gs-fg-muted:#32383f;--gs-fg-dim:#656d76;--gs-fg-faint:#8c959f;--gs-fg-fainter:#afb8c1;--gs-accent:#0969da;--gs-accent-bg:#0969da1a;--gs-accent-border:#0969da73;--gs-add:#1a7f37;--gs-del:#cf222e;--gs-warn:#9a6700;--gs-info:#0550ae;--gs-add-bg:#1a7f371f;--gs-del-bg:#cf222e1f;--gs-warn-bg:#9a67001f;--gs-info-bg:#0969da1f;--gs-add-line:#dafbe1;--gs-del-line:#ffebe9;--gs-add-word:#aceebb;--gs-del-word:#ffcecb;--gs-add-num:#aceebb;--gs-del-num:#ffcecb;--gs-hunk:#ddf4ff;--gs-hunk-num:#b6e3ff;--gs-neutral-bg:#6e76811f;--gs-backdrop:#1f232847;--gs-shadow:#1f232838}.SD8qLW_overlay[data-gs-theme=idea-dark]{--gs-bg:#1e1f22;--gs-panel:#2b2d30;--gs-raise:#393b40;--gs-border:#393b40;--gs-border-soft:#2b2d30;--gs-fg:#dfe1e5;--gs-fg-muted:#ced0d6;--gs-fg-dim:#9da0a8;--gs-fg-faint:#6f737a;--gs-fg-fainter:#4e5157;--gs-accent:#548af7;--gs-accent-bg:#548af729;--gs-accent-border:#548af78c;--gs-add:#5fad65;--gs-del:#e26e6e;--gs-warn:#f0a732;--gs-info:#3592c4;--gs-add-bg:#5fad6529;--gs-del-bg:#e26e6e29;--gs-warn-bg:#f0a73229;--gs-info-bg:#3592c429;--gs-add-line:#293c2e;--gs-del-line:#3d2b2b;--gs-add-word:#3d6640;--gs-del-word:#6b3838;--gs-hunk:#548af71a;--gs-neutral-bg:#9da0a82e;--gs-backdrop:#10111399;--gs-shadow:#00000080}.SD8qLW_overlay[data-gs-theme=idea-light]{--gs-bg:#fff;--gs-panel:#f7f8fa;--gs-raise:#ebecf0;--gs-border:#d3d5db;--gs-border-soft:#ebecf0;--gs-fg:#1e1f22;--gs-fg-muted:#3c3f44;--gs-fg-dim:#6c707e;--gs-fg-faint:#818594;--gs-fg-fainter:#a8adbd;--gs-accent:#3574f0;--gs-accent-bg:#3574f01a;--gs-accent-border:#3574f073;--gs-add:#398a4a;--gs-del:#cc4a4a;--gs-warn:#a8760b;--gs-info:#2b7fb8;--gs-add-bg:#398a4a1f;--gs-del-bg:#cc4a4a1f;--gs-warn-bg:#a8760b1f;--gs-info-bg:#2b7fb81f;--gs-add-line:#e6f5e9;--gs-del-line:#fbe9ea;--gs-add-word:#c2e5c9;--gs-del-word:#f5c9cc;--gs-hunk:#3574f012;--gs-neutral-bg:#6c707e1f;--gs-backdrop:#1e1f2242;--gs-shadow:#1e1f222e}.SD8qLW_overlay[data-gs-theme=vscode-dark]{--gs-bg:#1e1e1e;--gs-panel:#252526;--gs-raise:#2d2d30;--gs-border:#3e3e42;--gs-border-soft:#2d2d30;--gs-fg:#d4d4d4;--gs-fg-muted:#ccc;--gs-fg-dim:#9d9d9d;--gs-fg-faint:gray;--gs-fg-fainter:#5a5a5a;--gs-accent:#0098ff;--gs-accent-bg:#007acc3d;--gs-accent-border:#0098ff99;--gs-add:#89d185;--gs-del:#f14c4c;--gs-warn:#cca700;--gs-info:#75beff;--gs-add-bg:#89d1852e;--gs-del-bg:#f14c4c2e;--gs-warn-bg:#cca7002e;--gs-info-bg:#75beff2e;--gs-add-line:#9bb9552e;--gs-del-line:#ff000029;--gs-add-word:#9bb95566;--gs-del-word:#ff00005c;--gs-hunk:#007acc24;--gs-neutral-bg:#bebebe24;--gs-backdrop:#0000008c;--gs-shadow:#0009}.SD8qLW_overlay[data-gs-theme=vscode-light]{--gs-bg:#fff;--gs-panel:#f3f3f3;--gs-raise:#e8e8e8;--gs-border:#cecece;--gs-border-soft:#e8e8e8;--gs-fg:#1e1e1e;--gs-fg-muted:#333;--gs-fg-dim:#616161;--gs-fg-faint:#767676;--gs-fg-fainter:#a0a0a0;--gs-accent:#005fb8;--gs-accent-bg:#005fb81a;--gs-accent-border:#005fb873;--gs-add:#10793f;--gs-del:#b5200d;--gs-warn:#855b00;--gs-info:#005fb8;--gs-add-bg:#10793f1f;--gs-del-bg:#b5200d1f;--gs-warn-bg:#855b001f;--gs-info-bg:#005fb81f;--gs-add-line:#9bb95538;--gs-del-line:#ff000021;--gs-add-word:#9bb95573;--gs-del-word:#ff00004d;--gs-hunk:#005fb812;--gs-neutral-bg:#6161611f;--gs-backdrop:#00000040;--gs-shadow:#0000002e}.SD8qLW_overlay[data-gs-theme=cyberpunk-dark]{--gs-bg:#0b0417;--gs-panel:#14082a;--gs-raise:#1f0d3d;--gs-border:#3a1f6b;--gs-border-soft:#26124a;--gs-fg:#f0e6ff;--gs-fg-muted:#d5c2f5;--gs-fg-dim:#a98fd6;--gs-fg-faint:#7d64a8;--gs-fg-fainter:#56427a;--gs-accent:#00f0ff;--gs-on-accent:#0b0417;--gs-accent-bg:#00f0ff24;--gs-accent-border:#00f0ff80;--gs-add:#39ff88;--gs-del:#ff2e88;--gs-warn:#fc0;--gs-info:#00f0ff;--gs-add-bg:#39ff8824;--gs-del-bg:#ff2e8824;--gs-warn-bg:#ffcc0024;--gs-info-bg:#00f0ff24;--gs-add-line:#39ff881f;--gs-del-line:#ff2e881f;--gs-add-word:#39ff8857;--gs-del-word:#ff2e8857;--gs-hunk:#00f0ff1a;--gs-neutral-bg:#a98fd629;--gs-backdrop:#06020ead;--gs-shadow:#00f0ff24}.SD8qLW_overlay[data-gs-theme=cyberpunk-light]{--gs-bg:#fdfbff;--gs-panel:#f4eeff;--gs-raise:#e9dfff;--gs-border:#c9b3f0;--gs-border-soft:#e0d2f7;--gs-fg:#1a0b2e;--gs-fg-muted:#33195c;--gs-fg-dim:#6b4ba0;--gs-fg-faint:#8f74bd;--gs-fg-fainter:#b9a5d6;--gs-accent:#00a6b8;--gs-accent-bg:#00a6b81f;--gs-accent-border:#00a6b880;--gs-add:#00875a;--gs-del:#d6006e;--gs-warn:#b37a00;--gs-info:#00a6b8;--gs-add-bg:#00875a1f;--gs-del-bg:#d6006e1f;--gs-warn-bg:#b37a001f;--gs-info-bg:#00a6b81f;--gs-add-line:#00c88224;--gs-del-line:#ff2e881f;--gs-add-word:#00c88257;--gs-del-word:#ff2e884d;--gs-hunk:#00a6b814;--gs-neutral-bg:#6b4ba01f;--gs-backdrop:#1a0b2e47;--gs-shadow:#1a0b2e29}.SD8qLW_overlay[data-gs-theme=one-dark]{--gs-bg:#282c34;--gs-panel:#21252b;--gs-raise:#2c313a;--gs-border:#3e4451;--gs-border-soft:#2c313a;--gs-fg:#abb2bf;--gs-fg-muted:#b6bdca;--gs-fg-dim:#7f848e;--gs-fg-faint:#636d83;--gs-fg-fainter:#4b5263;--gs-accent:#61afef;--gs-accent-bg:#61afef24;--gs-accent-border:#61afef8c;--gs-add:#98c379;--gs-del:#e06c75;--gs-warn:#e5c07b;--gs-info:#56b6c2;--gs-add-bg:#98c37929;--gs-del-bg:#e06c7529;--gs-warn-bg:#e5c07b29;--gs-info-bg:#56b6c229;--gs-add-line:#98c37924;--gs-del-line:#e06c7524;--gs-add-word:#98c37961;--gs-del-word:#e06c7561;--gs-hunk:#61afef1a;--gs-neutral-bg:#7f848e2e;--gs-backdrop:#171a2199;--gs-shadow:#0f11158c}.SD8qLW_overlay[data-gs-theme=one-light]{--gs-bg:#fafafa;--gs-panel:#f0f0f0;--gs-raise:#e5e5e6;--gs-border:#d4d4d4;--gs-border-soft:#e5e5e6;--gs-fg:#383a42;--gs-fg-muted:#4a4c53;--gs-fg-dim:#696c77;--gs-fg-faint:#909196;--gs-fg-fainter:#b8b9bd;--gs-accent:#4078f2;--gs-accent-bg:#4078f21a;--gs-accent-border:#4078f273;--gs-add:#50a14f;--gs-del:#e45649;--gs-warn:#c18401;--gs-info:#0184bc;--gs-add-bg:#50a14f1f;--gs-del-bg:#e456491f;--gs-warn-bg:#c184011f;--gs-info-bg:#0184bc1f;--gs-add-line:#50a14f24;--gs-del-line:#e4564921;--gs-add-word:#50a14f57;--gs-del-word:#e4564952;--gs-hunk:#4078f212;--gs-neutral-bg:#696c771f;--gs-backdrop:#383a4242;--gs-shadow:#383a422e}.SD8qLW_overlay[data-gs-theme=solarized-dark]{--gs-bg:#002b36;--gs-panel:#073642;--gs-raise:#0a4553;--gs-border:#0f5666;--gs-border-soft:#073642;--gs-fg:#93a1a1;--gs-fg-muted:#839496;--gs-fg-dim:#657b83;--gs-fg-faint:#586e75;--gs-fg-fainter:#45636b;--gs-accent:#268bd2;--gs-accent-bg:#268bd229;--gs-accent-border:#268bd28c;--gs-add:#859900;--gs-del:#dc322f;--gs-warn:#b58900;--gs-info:#2aa198;--gs-add-bg:#85990033;--gs-del-bg:#dc322f2e;--gs-warn-bg:#b589002e;--gs-info-bg:#2aa1982e;--gs-add-line:#85990029;--gs-del-line:#dc322f26;--gs-add-word:#85990066;--gs-del-word:#dc322f61;--gs-hunk:#268bd21f;--gs-neutral-bg:#657b8333;--gs-backdrop:#00141a9e;--gs-shadow:#00141a8c}.SD8qLW_overlay[data-gs-theme=solarized-light]{--gs-bg:#fdf6e3;--gs-panel:#eee8d5;--gs-raise:#e3ddca;--gs-border:#d5cfbb;--gs-border-soft:#eee8d5;--gs-fg:#586e75;--gs-fg-muted:#657b83;--gs-fg-dim:#839496;--gs-fg-faint:#93a1a1;--gs-fg-fainter:#b5b0a0;--gs-accent:#268bd2;--gs-accent-bg:#268bd21f;--gs-accent-border:#268bd273;--gs-add:#6c7c00;--gs-del:#cb2825;--gs-warn:#9a7400;--gs-info:#21867f;--gs-add-bg:#8599002e;--gs-del-bg:#dc322f24;--gs-warn-bg:#b5890029;--gs-info-bg:#2aa19824;--gs-add-line:#85990029;--gs-del-line:#dc322f1f;--gs-add-word:#85990061;--gs-del-word:#dc322f4d;--gs-hunk:#268bd214;--gs-neutral-bg:#586e7524;--gs-backdrop:#586e7542;--gs-shadow:#586e7533}.SD8qLW_overlay[data-gs-theme=nord-dark]{--gs-bg:#2e3440;--gs-panel:#3b4252;--gs-raise:#434c5e;--gs-border:#4c566a;--gs-border-soft:#3b4252;--gs-fg:#eceff4;--gs-fg-muted:#d8dee9;--gs-fg-dim:#9aa5b8;--gs-fg-faint:#7b88a1;--gs-fg-fainter:#5d6a82;--gs-accent:#88c0d0;--gs-on-accent:#2e3440;--gs-accent-bg:#88c0d024;--gs-accent-border:#88c0d08c;--gs-add:#a3be8c;--gs-del:#bf616a;--gs-warn:#ebcb8b;--gs-info:#81a1c1;--gs-add-bg:#a3be8c29;--gs-del-bg:#bf616a2e;--gs-warn-bg:#ebcb8b29;--gs-info-bg:#81a1c129;--gs-add-line:#a3be8c24;--gs-del-line:#bf616a26;--gs-add-word:#a3be8c61;--gs-del-word:#bf616a66;--gs-hunk:#88c0d01a;--gs-neutral-bg:#9aa5b829;--gs-backdrop:#1d232d9e;--gs-shadow:#1419218c}.SD8qLW_overlay[data-gs-theme=nord-light]{--gs-bg:#eceff4;--gs-panel:#e5e9f0;--gs-raise:#d8dee9;--gs-border:#c3cbd8;--gs-border-soft:#dfe4ec;--gs-fg:#2e3440;--gs-fg-muted:#3b4252;--gs-fg-dim:#4c566a;--gs-fg-faint:#6b7689;--gs-fg-fainter:#9aa4b5;--gs-accent:#5e81ac;--gs-accent-bg:#5e81ac1f;--gs-accent-border:#5e81ac80;--gs-add:#5e7d47;--gs-del:#a5424c;--gs-warn:#97701f;--gs-info:#4c7a8c;--gs-add-bg:#5e7d4724;--gs-del-bg:#a5424c21;--gs-warn-bg:#97701f24;--gs-info-bg:#4c7a8c21;--gs-add-line:#5e7d4724;--gs-del-line:#a5424c1f;--gs-add-word:#5e7d4757;--gs-del-word:#a5424c52;--gs-hunk:#5e81ac17;--gs-neutral-bg:#4c566a21;--gs-backdrop:#2e344042;--gs-shadow:#2e34402e}.SD8qLW_overlay{--gs-inset:14px;--gs-h-control:28px;--gs-h-compact:24px;--gs-pad-control:0 12px;--gs-pad-compact:0 10px;--gs-on-accent:#fff;--gs-graph-0:#58a6ff;--gs-graph-1:#3fb950;--gs-graph-2:#d29922;--gs-graph-3:#bc8cff;--gs-graph-4:#f778ba;--gs-graph-5:#39c5cf;--gs-r-pill:999px;--gs-r-control:8px;--gs-r-surface:12px;--gs-r-drawer:14px;--gs-t-meta:11px;--gs-t-dense:12px;--gs-t-ui:13px;--gs-gutter:16px;--gs-gutter-pane:12px;z-index:1000;padding:var(--gs-inset);box-sizing:border-box;background:var(--gs-backdrop);justify-content:flex-end;align-items:stretch;gap:12px;animation:.16s ease-out SD8qLW_gsFade;display:flex;position:fixed;inset:0}.SD8qLW_drawer{box-sizing:border-box;width:min(1600px,94vw);height:100%;color:var(--gs-fg);background:var(--gs-bg);border:1px solid var(--gs-border);border-radius:var(--gs-r-drawer);box-shadow:0 24px 64px var(--gs-shadow);font-family:var(--dsw-font-ui,-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif);--gs-surface:var(--gs-bg);--gs-surface-2:var(--gs-panel);flex-direction:column;animation:.18s cubic-bezier(.22,1,.36,1) SD8qLW_gsSlide;display:flex;position:relative;overflow:hidden}.SD8qLW_drawer[data-gs-bg]{--gs-surface:color-mix(in srgb, var(--gs-bg) var(--gs-veil), transparent);--gs-surface-2:color-mix(in srgb, var(--gs-panel) var(--gs-veil), transparent)}.SD8qLW_drawer[data-gs-bg]:before{content:\"\";z-index:0;background-image:var(--gs-bg-image);filter:blur(var(--gs-bg-blur));pointer-events:none;background-position:50%;background-size:cover;position:absolute;inset:0;transform:scale(1.12)}.SD8qLW_drawer>:not(.SD8qLW_resizer){z-index:1;position:relative}.SD8qLW_drawer>.SD8qLW_header{z-index:24}.SD8qLW_drawer>.SD8qLW_tabs{z-index:23}.SD8qLW_drawer>.SD8qLW_compareBar{z-index:22}.SD8qLW_drawer>.SD8qLW_syncBar{z-index:20}.SD8qLW_drawer>.SD8qLW_confirmScrim{z-index:40;position:absolute;inset:0}.SD8qLW_overlayMax{gap:0;padding:0}.SD8qLW_overlayMax .SD8qLW_drawer{border-width:0 0 0 1px;border-radius:0;flex:auto;width:auto;min-width:0}@keyframes SD8qLW_gsFade{0%{opacity:0}}@keyframes SD8qLW_gsSlide{0%{opacity:0;transform:translate(24px)}}.SD8qLW_resizer{z-index:30;cursor:col-resize;touch-action:none;justify-content:center;align-items:center;width:10px;display:flex;position:absolute;top:0;bottom:0;left:0}.SD8qLW_resizer:after{content:\"\";background:var(--gs-fg-fainter);opacity:0;border-radius:999px;width:3px;height:32px;transition:opacity .14s,height .14s}.SD8qLW_resizer:hover:after{opacity:.6}.SD8qLW_resizerActive:after{opacity:.9;height:56px}.SD8qLW_paneDivider{z-index:5;cursor:col-resize;touch-action:none;flex:none;justify-content:center;align-items:center;width:7px;display:flex;position:relative}.SD8qLW_paneDivider:before{content:\"\";background:var(--gs-border-soft);width:1px;position:absolute;top:0;bottom:0;left:3px}.SD8qLW_paneDivider:after{content:\"\";background:var(--gs-fg-fainter);opacity:0;border-radius:999px;width:3px;height:28px;transition:opacity .14s,height .14s;position:relative}.SD8qLW_paneDivider:hover:after{opacity:.6}.SD8qLW_paneDividerActive:after{opacity:.9;height:48px}.SD8qLW_paneDividerY{cursor:row-resize;width:auto;height:7px}.SD8qLW_paneDividerY:before{width:auto;height:1px;inset:3px 0 auto}.SD8qLW_paneDividerY:after{width:28px;height:3px;transition:opacity .14s,width .14s}.SD8qLW_paneDividerY.SD8qLW_paneDividerActive:after{width:48px;height:3px}.SD8qLW_header{padding:10px var(--gs-gutter);border-bottom:1px solid var(--gs-border);background:var(--gs-surface-2);font-family:var(--dsw-font-ui,system-ui, sans-serif);font-size:var(--gs-t-ui);flex:none;justify-content:space-between;align-items:center;gap:12px;display:flex}.SD8qLW_headerLeft{flex-wrap:wrap;align-items:center;gap:10px;min-width:0;display:flex}.SD8qLW_headerBranch{border:1px solid var(--gs-accent-border);background:var(--gs-accent-bg);color:var(--gs-accent);border-radius:999px;align-items:center;gap:6px;padding:2px 10px;font-weight:600;display:inline-flex}.SD8qLW_refButton.SD8qLW_headerPicker{border-color:var(--gs-accent-border);background:var(--gs-accent-bg);max-width:420px;color:var(--gs-accent);font-weight:600}.SD8qLW_refButton.SD8qLW_headerPicker:hover{background:var(--gs-accent-bg);color:var(--gs-accent);border-color:var(--gs-accent)}.SD8qLW_elide{flex:0 auto;align-items:baseline;min-width:0;display:inline-flex}.SD8qLW_elideHead{white-space:nowrap;text-overflow:ellipsis;flex:0 999 auto;min-width:0;overflow:hidden}.SD8qLW_elideTail{white-space:nowrap;text-overflow:ellipsis;flex:0 auto;min-width:0;overflow:hidden}.SD8qLW_headerPathMain{color:var(--gs-fg-faint);font-size:var(--gs-t-meta)}.SD8qLW_headerPathMain .SD8qLW_elideTail{color:var(--gs-fg-dim)}.SD8qLW_headerViewRef{max-width:160px}.SD8qLW_headerView{background:var(--gs-neutral-bg);color:var(--gs-fg-muted);font-size:var(--gs-t-meta);font-variant-numeric:tabular-nums;border-radius:999px;flex:none;padding:1px 8px}.SD8qLW_headerDetached{background:var(--gs-warn-bg);color:var(--gs-warn);font-size:var(--gs-t-meta);letter-spacing:.02em;border-radius:999px;padding:1px 8px}.SD8qLW_headerTotals{font-variant-numeric:tabular-nums}.SD8qLW_headerTotalsAdd{color:var(--gs-add);font-weight:600}.SD8qLW_headerTotalsDel{color:var(--gs-del);font-weight:600}.SD8qLW_headerTotalsDim{color:var(--gs-fg-dim);font-size:var(--gs-t-dense)}.SD8qLW_headerRight{flex:none;gap:8px;display:flex;position:relative}.SD8qLW_theme{display:inline-flex;position:relative}.SD8qLW_refPop.SD8qLW_settingsPop{width:320px;max-width:calc(100vw - 32px);max-height:min(560px,100vh - 120px);top:calc(100% + 6px);left:auto;right:0}.SD8qLW_themeRail{min-height:0;font-family:var(--dsw-font-ui,system-ui, sans-serif);flex-direction:column;flex:1;gap:14px;padding:12px 14px 16px;display:flex;overflow-y:auto}.SD8qLW_themeGroup{flex-direction:column;gap:6px;display:flex}.SD8qLW_themeLabel{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);letter-spacing:.04em;text-transform:uppercase;font-weight:600}.SD8qLW_themeRowSplit{justify-content:space-between;align-items:center;gap:8px;display:flex}.SD8qLW_segmented{gap:6px;display:flex}.SD8qLW_segment{box-sizing:border-box;border:1px solid var(--gs-border);border-radius:var(--gs-r-control);color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-meta);cursor:pointer;background:0 0;flex-direction:column;flex:1 1 0;align-items:stretch;gap:4px;padding:4px;transition:background .12s,color .12s,border-color .12s;display:flex}.SD8qLW_segment:hover{background:var(--gs-raise);border-color:var(--gs-fg-fainter);color:var(--gs-fg)}.SD8qLW_segment:focus-visible{outline:2px solid var(--gs-accent);outline-offset:1px}.SD8qLW_segmentChip{border-radius:calc(var(--gs-r-control) - 4px);border:1px solid #80808073;height:20px}.SD8qLW_chipLight{background:#fff}.SD8qLW_chipDark{background:#0b0b0d}.SD8qLW_chipSystem{background:linear-gradient(105deg,#fff 0 50%,#0b0b0d 50% 100%)}.SD8qLW_paletteRow{box-sizing:border-box;border-radius:var(--gs-r-control);width:100%;color:var(--gs-fg-muted);font-family:inherit;font-size:var(--gs-t-dense);text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;padding:5px 8px;display:flex}.SD8qLW_paletteRow:hover{background:var(--gs-raise);color:var(--gs-fg)}.SD8qLW_swatch{border:1px solid var(--gs-border);border-radius:3px;flex:none;width:26px;height:12px;display:inline-flex;overflow:hidden}.SD8qLW_swatch span{flex:1}.SD8qLW_scopeRow{gap:6px;display:flex}.SD8qLW_scopeHint{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);overflow-wrap:anywhere}.SD8qLW_bgPreview{border:1px solid var(--gs-border);border-radius:var(--gs-r-control);background-color:var(--gs-bg);background-position:50%;background-size:cover;height:64px}.SD8qLW_bgEmpty{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);justify-content:center;align-items:center;display:flex}.SD8qLW_sliderRow{font-size:var(--gs-t-meta);color:var(--gs-fg-dim);align-items:center;gap:8px;display:flex}.SD8qLW_sliderRow input{min-width:0;accent-color:var(--gs-accent);flex:1}.SD8qLW_sliderValue{text-align:right;font-variant-numeric:tabular-nums;flex:none;width:38px}.SD8qLW_cssArea{box-sizing:border-box;border:1px solid var(--gs-border);border-radius:var(--gs-r-control);background:var(--gs-bg);width:100%;min-height:96px;max-height:220px;color:var(--gs-fg);font-family:var(--dsw-font-mono,ui-monospace, Consolas, monospace);font-size:var(--gs-t-meta);resize:vertical;outline:none;padding:7px 8px}.SD8qLW_cssArea:focus{border-color:var(--gs-accent-border)}.SD8qLW_themeNote{color:var(--gs-warn);font-size:var(--gs-t-meta)}.SD8qLW_themeDirty{color:var(--gs-accent);font-size:var(--gs-t-meta)}.SD8qLW_wtCurrent{color:var(--gs-add);font-size:8px;line-height:1}.SD8qLW_commitCopy{margin-left:auto}.SD8qLW_commitPop{z-index:40;box-sizing:border-box;border:1px solid var(--gs-border);border-radius:var(--gs-r-surface);background:var(--gs-panel);width:min(380px,100vw - 24px);color:var(--gs-fg);box-shadow:0 16px 40px var(--gs-shadow);font-family:var(--dsw-font-ui,-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif);font-size:var(--gs-t-dense);flex-direction:column;gap:6px;padding:10px 12px 12px;display:flex;position:fixed;overflow:auto}.SD8qLW_commitPopTop{align-items:center;gap:8px;display:flex}.SD8qLW_commitPopTop .SD8qLW_commitWhen{margin-right:auto}.SD8qLW_commitPopMeta{color:var(--gs-fg-muted);font-size:var(--gs-t-dense);flex-direction:column;gap:2px;line-height:16px;display:flex}.SD8qLW_commitFilter{min-width:120px;height:var(--gs-h-control);box-sizing:border-box;border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-control);background:var(--gs-bg);color:var(--gs-fg);font-family:inherit;font-size:var(--gs-t-dense);outline:none;flex:auto;padding:0 10px}.SD8qLW_commitFilter:focus{border-color:var(--gs-accent)}.SD8qLW_commitFilter::placeholder{color:var(--gs-fg-faint)}.SD8qLW_filterChips{border-bottom:1px solid var(--gs-border-soft);flex-wrap:wrap;flex:none;align-items:center;gap:6px;padding:6px 10px;display:flex}.SD8qLW_filterChip{border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-control);background:var(--gs-surface-2);max-width:220px;font-size:var(--gs-t-dense);align-items:center;gap:2px;line-height:18px;display:inline-flex}.SD8qLW_filterChipLabel{text-overflow:ellipsis;white-space:nowrap;color:var(--gs-fg-muted);padding:2px 4px 2px 8px;overflow:hidden}.SD8qLW_filterChipRemove{border:none;border-left:1px solid var(--gs-border-soft);color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-dense);cursor:pointer;background:0 0;flex:none;padding:0 6px;line-height:20px}.SD8qLW_filterChipRemove:hover{color:var(--gs-danger,var(--gs-fg))}.SD8qLW_filterClear{color:var(--gs-fg-faint);font-family:inherit;font-size:var(--gs-t-dense);cursor:pointer;background:0 0;border:none;padding:2px 4px;line-height:18px}.SD8qLW_filterClear:hover{color:var(--gs-fg)}.SD8qLW_funnel{display:inline-flex;position:relative}.SD8qLW_funnelButton.SD8qLW_funnelButtonActive{color:var(--gs-accent);border-color:var(--gs-accent)}.SD8qLW_funnelPop{z-index:40;box-sizing:border-box;border:1px solid var(--gs-border);border-radius:var(--gs-r-surface);background:var(--gs-panel);width:320px;max-width:calc(100vw - 24px);box-shadow:0 16px 40px var(--gs-shadow);font-size:var(--gs-t-dense);flex-direction:column;display:flex;position:fixed;overflow:hidden}.SD8qLW_funnelTabs{border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-pill);background:var(--gs-bg);flex:none;gap:2px;margin:8px 8px 0;padding:2px;display:flex}.SD8qLW_funnelTab{border-radius:var(--gs-r-pill);min-width:0;height:22px;color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-dense);white-space:nowrap;cursor:pointer;background:0 0;border:none;flex:1;padding:0 8px;line-height:1;transition:background .12s,color .12s}.SD8qLW_funnelTab:hover{color:var(--gs-fg)}.SD8qLW_funnelTab.SD8qLW_funnelTabActive{color:var(--gs-fg);background:var(--gs-raise);box-shadow:inset 0 0 0 1px var(--gs-border)}.SD8qLW_funnelTab:focus-visible{outline:2px solid var(--gs-accent);outline-offset:1px}.SD8qLW_funnelTabCount{color:var(--gs-accent);font-variant-numeric:tabular-nums;margin-left:4px}.SD8qLW_funnelPane{flex-direction:column;flex:auto;gap:6px;min-height:0;padding:8px;display:flex}.SD8qLW_funnelCaption{color:var(--gs-fg-faint);letter-spacing:.04em;text-transform:uppercase;flex:none;font-size:11px;line-height:14px}.SD8qLW_funnelBounds{border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-control);background:var(--gs-bg);flex:none;gap:2px;padding:2px;display:flex}.SD8qLW_funnelBoundBtn{border-radius:calc(var(--gs-r-control) - 3px);min-width:0;height:20px;color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-dense);cursor:pointer;background:0 0;border:none;flex:1;padding:0 6px;line-height:1;transition:background .12s,color .12s}.SD8qLW_funnelBoundBtn:hover{color:var(--gs-fg)}.SD8qLW_funnelBoundBtn.SD8qLW_funnelBoundBtnActive{color:var(--gs-accent);background:var(--gs-accent-bg);box-shadow:inset 0 0 0 1px var(--gs-accent-border)}.SD8qLW_cal{flex-direction:column;flex:none;gap:4px;display:flex}.SD8qLW_calHead{align-items:center;gap:4px;display:flex}.SD8qLW_calTitle{text-align:center;color:var(--gs-fg);font-size:var(--gs-t-dense);flex:1;line-height:20px}.SD8qLW_calNav{border-radius:var(--gs-r-control);width:22px;height:20px;color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-ui);cursor:pointer;background:0 0;border:none;flex:none;padding:0}.SD8qLW_calNav:hover{color:var(--gs-fg);background:var(--gs-raise)}.SD8qLW_calWeek,.SD8qLW_calGrid{grid-template-columns:repeat(7,1fr);gap:2px;display:grid}.SD8qLW_calWeek span{text-align:center;color:var(--gs-fg-faint);font-size:11px;line-height:14px}.SD8qLW_calGrid button{border-radius:var(--gs-r-control);height:26px;color:var(--gs-fg-muted);font-family:inherit;font-size:var(--gs-t-dense);font-variant-numeric:tabular-nums;cursor:pointer;background:0 0;border:none}.SD8qLW_calGrid button:hover{background:var(--gs-raise);color:var(--gs-fg)}.SD8qLW_calGrid button.SD8qLW_calOut{color:var(--gs-fg-fainter)}.SD8qLW_calGrid button.SD8qLW_calToday{color:var(--gs-accent);font-weight:600}.SD8qLW_calGrid button.SD8qLW_calIn{background:var(--gs-accent-bg);color:var(--gs-fg)}.SD8qLW_calGrid button.SD8qLW_calMark{background:var(--gs-accent);color:var(--gs-on-accent);font-weight:600}.SD8qLW_funnelBoundRows{flex:none;grid-template-columns:1fr 1fr;gap:6px;display:grid}.SD8qLW_funnelBoundRow{box-sizing:border-box;border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-control);background:var(--gs-bg);align-items:center;gap:4px;min-width:0;padding:3px 6px;font-size:11px;line-height:16px;display:flex}.SD8qLW_funnelBoundKey{color:var(--gs-fg-faint);flex:none}.SD8qLW_funnelBoundVal{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--gs-fg-faint);font-variant-numeric:tabular-nums;flex:1;overflow:hidden}.SD8qLW_funnelBoundValSet{color:var(--gs-fg)}.SD8qLW_funnelBoundClear{color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-dense);cursor:pointer;background:0 0;border:none;flex:none;padding:0 2px;line-height:1}.SD8qLW_funnelBoundClear:hover{color:var(--gs-danger,var(--gs-fg))}.SD8qLW_funnelSearch{box-sizing:border-box;border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-control);background:var(--gs-bg);height:26px;color:var(--gs-fg);font-family:inherit;font-size:var(--gs-t-dense);outline:none;flex:none;padding:0 8px}.SD8qLW_funnelSearch::placeholder{color:var(--gs-fg-faint)}.SD8qLW_funnelSearch:focus{border-color:var(--gs-accent);box-shadow:0 0 0 2px var(--gs-accent-bg)}.SD8qLW_funnelList{overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:var(--gs-fg-fainter) transparent;flex-direction:column;flex:auto;gap:1px;min-height:0;margin:0 -4px;padding:0 4px;display:flex;overflow-y:auto}.SD8qLW_funnelList::-webkit-scrollbar{width:10px}.SD8qLW_funnelList::-webkit-scrollbar-track{background:0 0}.SD8qLW_funnelList::-webkit-scrollbar-thumb{background:var(--gs-fg-fainter);background-clip:content-box;border:3px solid #0000;border-radius:5px}.SD8qLW_funnelRow{box-sizing:border-box;border-radius:var(--gs-r-control);cursor:pointer;align-items:center;gap:6px;min-height:24px;padding:0 4px;display:flex}.SD8qLW_funnelRow:hover{background:var(--gs-raise)}.SD8qLW_funnelRow:has(input[type=checkbox]:checked) .SD8qLW_funnelName,.SD8qLW_funnelRow:has(input[type=checkbox]:indeterminate) .SD8qLW_funnelName{color:var(--gs-fg)}.SD8qLW_funnelRow input[type=checkbox]{-webkit-appearance:none;appearance:none;box-sizing:border-box;border:1px solid var(--gs-fg-fainter);cursor:pointer;background:0 0;border-radius:3px;flex:none;width:14px;height:14px;margin:0;transition:background .12s,border-color .12s;position:relative}.SD8qLW_funnelRow input[type=checkbox]:hover{border-color:var(--gs-fg-dim)}.SD8qLW_funnelRow input[type=checkbox]:checked,.SD8qLW_funnelRow input[type=checkbox]:indeterminate{background:var(--gs-accent);border-color:var(--gs-accent)}.SD8qLW_funnelRow input[type=checkbox]:focus-visible{outline:2px solid var(--gs-accent);outline-offset:1px}.SD8qLW_funnelRow input[type=checkbox]:checked:after{content:\"\";border:solid var(--gs-on-accent);border-width:0 1.5px 1.5px 0;width:3px;height:7px;position:absolute;top:1px;left:4px;transform:rotate(42deg)}.SD8qLW_funnelRow input[type=checkbox]:indeterminate:after{content:\"\";background:var(--gs-on-accent);border-radius:1px;width:8px;height:2px;position:absolute;top:5px;left:2px}.SD8qLW_pathNode,.SD8qLW_pathChildren{flex-direction:column;display:flex}.SD8qLW_pathFileGlyph,.SD8qLW_pathDirGlyph{width:16px;height:16px;color:var(--gs-fg-dim);flex:none}.SD8qLW_funnelRow:hover .SD8qLW_pathFileGlyph,.SD8qLW_funnelRow:hover .SD8qLW_pathDirGlyph{color:var(--gs-fg-muted)}.SD8qLW_funnelName{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--gs-fg-muted);flex:1;overflow:hidden}.SD8qLW_funnelCount{color:var(--gs-fg-faint);font-variant-numeric:tabular-nums;flex:none;font-size:11px}.SD8qLW_funnelMore{color:var(--gs-fg-faint);padding:4px 6px}.SD8qLW_funnelChevron{width:14px;color:var(--gs-fg-faint);cursor:pointer;background:0 0;border:none;flex:none;padding:0;font-family:inherit;font-size:9px;line-height:16px}.SD8qLW_funnelChevron:hover:not(:disabled){color:var(--gs-fg)}.SD8qLW_funnelChevron:disabled{cursor:default}.SD8qLW_funnelPresets{flex:none;gap:4px;display:flex}.SD8qLW_funnelPreset{flex:1 1 0;min-width:0;padding:0 6px}.SD8qLW_funnelPreset.SD8qLW_funnelPresetActive{color:var(--gs-accent);border-color:var(--gs-accent);background:var(--gs-accent-bg)}.SD8qLW_funnelFoot{border-top:1px solid var(--gs-border-soft);background:var(--gs-bg);flex:none;justify-content:space-between;align-items:center;gap:8px;padding:6px 10px;font-size:11px;line-height:16px;display:flex}.SD8qLW_funnelFootCount{color:var(--gs-fg-faint);font-variant-numeric:tabular-nums}.SD8qLW_funnelFootCountOn{color:var(--gs-fg-muted)}.SD8qLW_funnelFootClear{border-radius:var(--gs-r-control);color:var(--gs-fg-dim);cursor:pointer;background:0 0;border:none;flex:none;padding:2px 6px;font-family:inherit;font-size:11px;line-height:16px}.SD8qLW_funnelFootClear:hover:not(:disabled){color:var(--gs-fg);background:var(--gs-raise)}.SD8qLW_funnelFootClear:disabled{color:var(--gs-fg-fainter);cursor:default}.SD8qLW_commitPopSubject{color:var(--gs-fg);font-size:var(--gs-t-ui);white-space:pre-wrap;overflow-wrap:anywhere;user-select:text;font-weight:600;line-height:18px}.SD8qLW_commitPopBody{color:var(--gs-fg-muted);font-family:inherit;font-size:var(--gs-t-dense);white-space:pre-wrap;overflow-wrap:anywhere;user-select:text;margin:0;line-height:18px}.SD8qLW_tabs{padding:0 var(--gs-gutter);border-bottom:1px solid var(--gs-border-soft);background:var(--gs-surface-2);flex:none;gap:24px;font-family:inherit;display:flex}.SD8qLW_tab{font-family:inherit;font-size:var(--gs-t-ui);color:var(--gs-fg-dim);cursor:pointer;background:0 0;border:none;padding:8px 0 9px;font-weight:500;line-height:16px;position:relative}.SD8qLW_tab:after{content:\"\";background:0 0;border-radius:2px;height:2px;position:absolute;bottom:1px;left:0;right:0}.SD8qLW_tabActive{color:var(--gs-accent)}.SD8qLW_tabActive:after{background:var(--gs-accent)}.SD8qLW_compareBar{padding:8px var(--gs-gutter);border-bottom:1px solid var(--gs-border-soft);background:var(--gs-surface-2);color:var(--gs-fg-dim);font-family:var(--dsw-font-ui,system-ui, sans-serif);font-size:var(--gs-t-dense);flex-wrap:wrap;flex:none;align-items:center;gap:10px;display:flex}.SD8qLW_compareArrow{color:var(--gs-fg-faint)}.SD8qLW_refPicker{align-items:center;gap:6px;display:inline-flex;position:relative}.SD8qLW_refLabel{color:var(--gs-fg-faint);flex:none}.SD8qLW_refButton{justify-content:space-between;max-width:260px}.SD8qLW_refValue{min-width:0;overflow:hidden}.SD8qLW_refCaret{color:var(--gs-fg-faint);flex:none;font-size:9px}.SD8qLW_refPop{z-index:10;border:1px solid var(--gs-border);border-radius:var(--gs-r-control);background:var(--gs-panel);width:300px;max-width:80vw;box-shadow:0 12px 32px var(--gs-shadow);flex-direction:column;display:flex;position:absolute;top:calc(100% + 4px);left:0;overflow:hidden}.SD8qLW_menuPop{width:auto;min-width:100%;padding:4px;left:auto;right:0}.SD8qLW_refSearch{border:0;border-bottom:1px solid var(--gs-border-soft);background:var(--gs-bg);color:var(--gs-fg);font-family:inherit;font-size:var(--gs-t-dense);outline:none;flex:none;padding:7px 10px}.SD8qLW_refSearch::placeholder{color:var(--gs-fg-faint)}.SD8qLW_refList{flex:1;max-height:280px;padding:4px;overflow-y:auto}.SD8qLW_refGroup{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);letter-spacing:.04em;text-transform:uppercase;padding:6px 8px 3px;font-weight:600}.SD8qLW_refRow{box-sizing:border-box;border-radius:var(--gs-r-control);width:100%;color:var(--gs-fg-muted);font-family:inherit;font-size:var(--gs-t-dense);text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:5px 8px;display:flex}.SD8qLW_refRow:hover{background:var(--gs-raise);color:var(--gs-fg)}.SD8qLW_refRowSpacer{flex:none;width:12px}.SD8qLW_refRowName{flex:auto;min-width:0;overflow:hidden}.SD8qLW_refEmpty{color:var(--gs-fg-faint);font-size:var(--gs-t-dense);padding:14px 10px}.SD8qLW_refFoot{border-top:1px solid var(--gs-border-soft);color:var(--gs-fg-faint);font-size:var(--gs-t-meta);flex:none;padding:5px 10px}.SD8qLW_commitsPane{box-sizing:border-box;width:26%;min-height:0;min-width:var(--gs-min-commits);background:var(--gs-surface);flex-direction:column;flex:0 auto;max-width:340px;display:flex}.SD8qLW_paneHead{box-sizing:border-box;min-height:37px;padding:6px var(--gs-gutter-pane);border-bottom:1px solid var(--gs-border-soft);color:var(--gs-fg-dim);font-family:var(--dsw-font-ui,system-ui, sans-serif);font-size:var(--gs-t-dense);flex-wrap:wrap;flex:none;align-items:center;gap:8px;display:flex}.SD8qLW_paneTitle{font-weight:600}.SD8qLW_commitsSentinel{flex:none;height:1px}.SD8qLW_commitsFoot{color:var(--gs-fg-faint);font-family:var(--dsw-font-ui,system-ui, sans-serif);font-size:var(--gs-t-meta);text-align:center;flex:none;min-height:16px;padding:8px}.SD8qLW_commits{flex-direction:column;flex:1;min-height:0;padding:4px 6px 4px 0;display:flex;overflow-y:auto}.SD8qLW_commitLine{height:var(--gs-commit-row);flex:none;align-items:stretch;display:flex}.SD8qLW_graphCell{flex:none;display:block}.SD8qLW_commit{box-sizing:border-box;border-radius:var(--gs-r-surface);text-align:left;cursor:pointer;min-width:0;height:100%;font-family:inherit;font-size:var(--gs-t-dense);background:0 0;border:1px solid #0000;flex:auto;align-items:center;gap:10px;margin:1px 0;padding:4px 8px;transition:background .12s,border-color .12s;display:flex;overflow:hidden}.SD8qLW_commitsPane[data-layout=columns] .SD8qLW_commit{flex-direction:column;justify-content:center;align-items:stretch;gap:2px}.SD8qLW_commitsPane[data-layout=columns] .SD8qLW_commitSubjectRow{flex:none}.SD8qLW_commitTop{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.SD8qLW_commit:hover{background:var(--gs-raise)}.SD8qLW_commitActive{border-color:var(--gs-accent-border);background:var(--gs-accent-bg)}.SD8qLW_commitMeta{flex:none;align-items:baseline;gap:8px;display:flex}.SD8qLW_commitHash{color:var(--gs-info);flex:none}.SD8qLW_commitSubjectRow{flex:auto;align-items:baseline;gap:4px;min-width:0;display:flex}.SD8qLW_commitSubject{white-space:nowrap;text-overflow:ellipsis;min-width:0;color:var(--gs-fg-muted);flex:0 auto;overflow:hidden}.SD8qLW_commitHasBody{color:var(--gs-fg-faint);letter-spacing:.04em;flex:none}.SD8qLW_commitRef{white-space:nowrap;text-overflow:ellipsis;border:1px solid var(--gs-accent-border);border-radius:var(--gs-r-pill);background:var(--gs-accent-bg);max-width:96px;color:var(--gs-accent);font-size:var(--gs-t-meta);flex:none;padding:0 5px;line-height:15px;overflow:hidden}.SD8qLW_commitWhen{color:var(--gs-fg-faint);flex:none}.SD8qLW_commitAuthor{text-overflow:ellipsis;white-space:nowrap;max-width:120px;color:var(--gs-fg-dim);flex:none;overflow:hidden}.SD8qLW_body{z-index:1;flex:1;min-height:0;display:flex}.SD8qLW_body[data-stacked]{flex-direction:column}.SD8qLW_bodyRow{flex:1 1 0;min-width:0;min-height:0;display:flex}.SD8qLW_body[data-stacked] .SD8qLW_commitsPane{width:auto;min-width:0;max-width:none;height:34%;min-height:var(--gs-min-commits-tall);max-height:max(var(--gs-min-commits-tall), calc(100% - var(--gs-min-stacked-lower)));flex:none}.SD8qLW_treeCol{box-sizing:border-box;width:28%;min-height:0;min-width:var(--gs-min-tree);background:var(--gs-surface);flex-direction:column;flex:0 auto;max-width:400px;display:flex}.SD8qLW_treeWrap{box-sizing:border-box;flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.SD8qLW_treeTools{box-sizing:border-box;min-height:37px;padding:6px var(--gs-gutter-pane);border-bottom:1px solid var(--gs-border-soft);flex-wrap:wrap;flex:none;justify-content:space-between;align-items:center;gap:6px;display:flex}.SD8qLW_treeActions{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.SD8qLW_treeLead{align-items:center;gap:4px;min-width:0;display:flex}.SD8qLW_treeLabel{white-space:nowrap;color:var(--gs-fg-dim);font-size:var(--gs-t-dense);flex:none}.SD8qLW_treeFilter{padding:6px var(--gs-gutter-pane);border-bottom:1px solid var(--gs-border-soft);flex:none;align-items:center;display:flex;position:relative}.SD8qLW_treeFilterInput{min-width:0;height:var(--gs-h-compact);box-sizing:border-box;border:1px solid var(--gs-border-soft);border-radius:var(--gs-r-control);background:var(--gs-bg);color:var(--gs-fg);font-family:inherit;font-size:var(--gs-t-dense);outline:none;flex:auto;padding:0 24px 0 8px}.SD8qLW_treeFilterInput:focus{border-color:var(--gs-accent)}.SD8qLW_treeFilterInput::placeholder{color:var(--gs-fg-faint)}.SD8qLW_treeFilterClear{right:calc(var(--gs-gutter-pane) + 6px);border-radius:var(--gs-r-pill);width:16px;height:16px;color:var(--gs-fg-faint);font-size:var(--gs-t-ui);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;line-height:1;display:flex;position:absolute}.SD8qLW_treeFilterClear:hover{color:var(--gs-fg)}.SD8qLW_tree{flex:1;min-height:0;margin:0;padding:6px 0 16px;list-style:none;overflow:auto}.SD8qLW_treeEmpty{min-height:0;color:var(--gs-fg-faint);font-size:var(--gs-t-ui);flex:1;justify-content:center;align-items:center;display:flex}.SD8qLW_treeSub{margin:0;padding:0;list-style:none;position:relative}.SD8qLW_treeSub:before{content:\"\";top:0;bottom:0;left:var(--gs-rail,0);background:var(--gs-border-soft);width:1px;position:absolute}.SD8qLW_treeDirLi{position:relative}.SD8qLW_treeDir{box-sizing:border-box;width:100%;color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-dense);text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:4px 12px 4px 8px;font-weight:600;display:flex}.SD8qLW_treeDir:hover{background:var(--gs-panel);color:var(--gs-fg-muted)}.SD8qLW_treeDirActive{color:var(--gs-fg-muted)}.SD8qLW_chevron{width:10px;color:var(--gs-fg-fainter);font-size:var(--gs-t-meta);flex:none;transition:transform .12s;display:inline-block}.SD8qLW_chevronOpen{transform:rotate(90deg)}.SD8qLW_treeDirName{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.SD8qLW_treeDirCount{background:var(--gs-neutral-bg);color:var(--gs-fg-dim);font-size:var(--gs-t-meta);border-radius:999px;flex:none;padding:0 6px;font-weight:600;line-height:16px}.SD8qLW_treeDirCounts{font-size:var(--gs-t-meta);font-variant-numeric:tabular-nums;flex:none}.SD8qLW_file{box-sizing:border-box;width:100%;color:var(--gs-fg-muted);font-family:inherit;font-size:var(--gs-t-dense);text-align:left;cursor:pointer;background:0 0;border:0;border-left:2px solid #0000;align-items:center;gap:8px;padding:5px 14px;display:flex}.SD8qLW_file:hover{background:var(--gs-panel)}.SD8qLW_fileActive{background:var(--gs-panel);border-left-color:var(--gs-accent);color:var(--gs-fg)}.SD8qLW_fileStatus{width:18px;height:18px;font-weight:700;font-size:var(--gs-t-meta);border-radius:5px;flex:none;justify-content:center;align-items:center;line-height:1;display:inline-flex}.SD8qLW_stAdded,.SD8qLW_stUntracked{color:var(--gs-add);background:var(--gs-add-bg)}.SD8qLW_stDeleted{color:var(--gs-del);background:var(--gs-del-bg)}.SD8qLW_stModified{color:var(--gs-warn);background:var(--gs-warn-bg)}.SD8qLW_stRenamed{color:var(--gs-info);background:var(--gs-info-bg)}.SD8qLW_filePath{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.SD8qLW_fileBinary{background:var(--gs-neutral-bg);color:var(--gs-fg-dim);letter-spacing:.06em;border-radius:4px;flex:none;padding:0 5px;font-size:9px;font-weight:700}.SD8qLW_fileCounts{font-size:var(--gs-t-meta);font-variant-numeric:tabular-nums;flex:none}.SD8qLW_fileCountAdd{color:var(--gs-add)}.SD8qLW_fileCountDel{color:var(--gs-del)}.SD8qLW_diffPane{min-width:var(--gs-min-diff);background:var(--gs-surface);flex-direction:column;flex:1 1 0;display:flex;overflow:auto}.SD8qLW_diffWrap{flex-direction:column;flex:auto;width:100%;min-height:0;display:flex}.SD8qLW_diffScroll{outline:none;flex:1 1 0;min-height:0;overflow:auto}.SD8qLW_diffNav{border-bottom:1px solid var(--gs-border-soft);flex:none;justify-content:flex-end;align-items:center;gap:4px;padding:3px 12px 3px 0;display:flex}.SD8qLW_diffNav .SD8qLW_blockBtn{padding-inline:6px;line-height:0}.SD8qLW_diffPre{width:max-content;min-width:100%;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:var(--gs-t-dense);font-variant-ligatures:none;font-feature-settings:\"liga\" 0, \"calt\" 0;tab-size:4;flex-direction:column;margin:0;padding:8px 0 16px;font-weight:400;line-height:20px;display:flex}.SD8qLW_renameLine{border-bottom:1px solid var(--gs-border-soft);color:var(--gs-info);font-size:var(--gs-t-dense);flex:none;padding:8px 16px}.SD8qLW_renameLine code{color:var(--gs-fg)}.SD8qLW_line{white-space:nowrap;align-items:stretch;width:max-content;min-width:100%;min-height:20px;line-height:20px;display:flex}.SD8qLW_lnOld,.SD8qLW_lnNew{box-sizing:border-box;text-align:right;width:3.2em;color:var(--gs-fg-fainter);user-select:none;font-variant-numeric:tabular-nums;flex:none;padding:0 8px}.SD8qLW_line:hover .SD8qLW_lnOld,.SD8qLW_line:hover .SD8qLW_lnNew{color:var(--gs-fg-dim)}.SD8qLW_gutter{text-align:center;user-select:none;flex:none;width:1.4em}.SD8qLW_code{white-space:pre;flex:1 0 auto;padding:0 16px 0 10px}.SD8qLW_lineAdd{background:var(--gs-add-line)}.SD8qLW_lineDel{background:var(--gs-del-line)}.SD8qLW_lineAdd .SD8qLW_lnOld,.SD8qLW_lineAdd .SD8qLW_lnNew,.SD8qLW_lineAdd .SD8qLW_gutter{background:var(--gs-add-num,var(--gs-add-line))}.SD8qLW_lineDel .SD8qLW_lnOld,.SD8qLW_lineDel .SD8qLW_lnNew,.SD8qLW_lineDel .SD8qLW_gutter{background:var(--gs-del-num,var(--gs-del-line))}.SD8qLW_lineContext{color:var(--gs-fg-muted)}.SD8qLW_lineHunk{background:var(--gs-hunk)}.SD8qLW_lineHunk .SD8qLW_code{color:var(--gs-fg-dim)}.SD8qLW_lineHunk .SD8qLW_lnOld,.SD8qLW_lineHunk .SD8qLW_lnNew,.SD8qLW_lineHunk .SD8qLW_gutter{background:var(--gs-hunk-num,var(--gs-hunk))}.SD8qLW_signAdd{color:var(--gs-add)}.SD8qLW_signDel{color:var(--gs-del)}.SD8qLW_wordAdd{background:var(--gs-add-word);border-radius:2px}.SD8qLW_wordDel{background:var(--gs-del-word);border-radius:2px}.SD8qLW_sidePane{flex-direction:column;width:100%;min-width:0;height:100%;display:flex}.SD8qLW_sideScroll{flex:1 1 0;min-height:0;overflow:hidden auto}.SD8qLW_sideCols{align-items:stretch;min-height:100%;display:flex}.SD8qLW_sideCol{flex:none;min-width:0;overflow-x:auto}.SD8qLW_sideColRight{flex:1 1 0}.SD8qLW_sideColGrid{width:max-content;min-width:100%;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:var(--gs-t-dense);font-variant-ligatures:none;font-feature-settings:\"liga\" 0, \"calt\" 0;tab-size:4;grid-template-columns:3.2em 1fr;align-content:start;padding:8px 0 16px;font-weight:400;line-height:20px;display:grid}.SD8qLW_sideColGridBlame{grid-template-columns:13em 3.2em 1fr}.SD8qLW_blameCell{box-sizing:border-box;border-right:1px solid var(--gs-border-soft);color:var(--gs-fg-faint);font-size:var(--gs-t-meta);white-space:pre;text-overflow:ellipsis;user-select:none;padding:0 8px 0 10px;overflow:hidden}.SD8qLW_sideTabs{z-index:5;border-bottom:1px solid var(--gs-border-soft);background:var(--gs-surface-2);flex:none;gap:16px;padding:6px 16px 0;display:flex}.SD8qLW_sideTab{font-family:inherit;font-size:var(--gs-t-meta);color:var(--gs-fg-dim);cursor:pointer;background:0 0;border:none;padding:2px 0 5px;font-weight:500;line-height:16px;position:relative}.SD8qLW_sideTab:after{content:\"\";background:0 0;border-radius:2px;height:2px;position:absolute;bottom:1px;left:0;right:0}.SD8qLW_sideTabActive{color:var(--gs-accent)}.SD8qLW_sideTabActive:after{background:var(--gs-accent)}.SD8qLW_sideNotice{border-bottom:1px solid var(--gs-border-soft);color:var(--gs-info);font-size:var(--gs-t-dense);flex:none;padding:8px 16px}.SD8qLW_sideNum{box-sizing:border-box;text-align:right;color:var(--gs-fg-fainter);user-select:none;font-variant-numeric:tabular-nums;padding:0 8px}.SD8qLW_sideNumAdd{background:var(--gs-add-num,var(--gs-add-line))}.SD8qLW_sideNumDel{background:var(--gs-del-num,var(--gs-del-line))}.SD8qLW_sideCode{white-space:pre;min-height:20px;padding:0 16px 0 10px}.SD8qLW_sideSpacer{grid-column:1/-1}.SD8qLW_diffSpacer{flex:none}.SD8qLW_sideCodeSame{color:var(--gs-fg-muted)}.SD8qLW_sideCodeAdd{background:var(--gs-add-line)}.SD8qLW_sideCodeDel{background:var(--gs-del-line)}.SD8qLW_sideCellBlock{position:relative}.SD8qLW_sideBlockHot{outline:1px solid var(--gs-accent);outline-offset:-1px}.SD8qLW_blockBar{z-index:4;border:1px solid var(--gs-border);border-radius:var(--gs-r-control);background:var(--gs-surface-2,var(--gs-bg));box-shadow:0 4px 14px var(--gs-shadow);white-space:nowrap;gap:4px;padding:2px;display:flex;position:absolute;top:-21px;left:0}.SD8qLW_blockBtn{border:1px solid var(--gs-border);border-radius:var(--gs-r-pill);background:var(--gs-bg);color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-meta);cursor:pointer;padding:0 8px;line-height:16px}.SD8qLW_blockBtn:hover:not(:disabled){color:var(--gs-fg);border-color:var(--gs-accent)}.SD8qLW_blockBtn:disabled{opacity:.45;cursor:default}.SD8qLW_blockBtnDanger{color:var(--gs-del);border-color:var(--gs-del-bg,var(--gs-border))}.SD8qLW_blockBtnDanger:hover:not(:disabled){color:var(--gs-del);border-color:var(--gs-del)}.SD8qLW_sideArmable{cursor:text}.SD8qLW_cmHost{position:relative}.SD8qLW_cmHost[data-editable]:before{content:\"\";background:var(--gs-accent);opacity:.32;pointer-events:none;border-radius:1px;width:2px;transition:opacity .14s;position:absolute;top:0;bottom:0;left:0}.SD8qLW_cmHost[data-editable]:focus-within:before{opacity:1}.SD8qLW_sideNav{align-items:center;gap:4px;margin-left:auto;padding:2px 0 5px;display:flex}.SD8qLW_sideNav .SD8qLW_blockBtn{padding-inline:6px;line-height:0}.SD8qLW_sideNavCount{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);white-space:nowrap}.SD8qLW_sideActions{align-items:flex-start;gap:4px;margin-left:auto;padding:2px 0 5px;display:flex}.SD8qLW_sideSaveReady{color:var(--gs-accent);border-color:var(--gs-accent)}.SD8qLW_sideBanner{border-bottom:1px solid var(--gs-border-soft);background:var(--gs-del-bg,transparent);color:var(--gs-del);font-size:var(--gs-t-dense);flex-direction:column;flex:none;gap:6px;padding:8px 16px;display:flex}.SD8qLW_sideBannerTitle{font-weight:600}.SD8qLW_sideBannerActs{gap:4px;display:flex}.SD8qLW_sideEditCell{position:relative}.SD8qLW_empty{color:var(--gs-fg-faint);font-size:var(--gs-t-ui);padding:32px 24px}.SD8qLW_syncBar{padding:8px var(--gs-gutter);border-bottom:1px solid var(--gs-border-soft);background:var(--gs-surface-2);font-size:var(--gs-t-dense);color:var(--gs-fg-dim);flex-wrap:wrap;flex:none;align-items:center;gap:8px;display:flex}.SD8qLW_syncUpstream{white-space:nowrap;text-overflow:ellipsis;max-width:260px;color:var(--gs-fg-muted);font-variant-numeric:tabular-nums;overflow:hidden}.SD8qLW_syncLevel{color:var(--gs-fg-faint)}.SD8qLW_syncSpacer{flex:auto}.SD8qLW_btn:disabled,.SD8qLW_treeIcon:disabled,.SD8qLW_miniBtn:disabled,.SD8qLW_refButton:disabled,.SD8qLW_funnelButton:disabled{opacity:.45;cursor:default}.SD8qLW_btn[data-quiet]:disabled,.SD8qLW_refButton[data-quiet]:disabled{opacity:1}.SD8qLW_opBanner{padding:8px var(--gs-gutter);border-bottom:1px solid var(--gs-border-soft);font-size:var(--gs-t-dense);white-space:pre-wrap;overflow-wrap:anywhere;user-select:text;flex:none;line-height:18px}.SD8qLW_opBannerOk{background:var(--gs-add-bg);color:var(--gs-add)}.SD8qLW_opBannerBad{background:var(--gs-del-bg);color:var(--gs-del)}.SD8qLW_fileLi{align-items:stretch;display:flex}.SD8qLW_fileLi .SD8qLW_file{flex:auto;min-width:0}.SD8qLW_fileDiscard{width:22px;color:var(--gs-fg-faint);opacity:0;cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;padding:0;transition:opacity .12s,color .12s;display:flex}.SD8qLW_fileLi:hover .SD8qLW_fileDiscard,.SD8qLW_fileDiscard:focus-visible{opacity:1}.SD8qLW_fileDiscard:hover{color:var(--gs-del)}.SD8qLW_fileDiscard:focus-visible{outline:2px solid var(--gs-accent);outline-offset:-2px;border-radius:var(--gs-r-control)}.SD8qLW_treeRow{align-items:stretch;display:flex}.SD8qLW_treeRow .SD8qLW_treeDir{flex:auto;min-width:0}.SD8qLW_checkBox{cursor:pointer;background:0 0;border:0;flex:none;justify-content:center;align-items:center;width:22px;padding:0;display:flex}.SD8qLW_checkMark{box-sizing:border-box;border:1px solid var(--gs-fg-faint);background:var(--gs-bg);color:#0000;border-radius:3px;justify-content:center;align-items:center;width:14px;height:14px;font-size:10px;font-weight:700;line-height:1;transition:background .12s,border-color .12s;display:flex}.SD8qLW_checkBox:hover .SD8qLW_checkMark{border-color:var(--gs-accent)}.SD8qLW_checkBox:focus-visible{outline:none}.SD8qLW_checkBox:focus-visible .SD8qLW_checkMark{outline:2px solid var(--gs-accent);outline-offset:1px}.SD8qLW_checkMarkOn,.SD8qLW_checkMarkPartial{border-color:var(--gs-accent);background:var(--gs-accent);color:var(--gs-on-accent)}.SD8qLW_commitBox{padding:8px var(--gs-gutter-pane) 10px;border-top:1px solid var(--gs-border);background:var(--gs-surface-2);flex-direction:column;flex:none;gap:6px;display:flex}.SD8qLW_commitMessage{box-sizing:border-box;border:1px solid var(--gs-border);border-radius:var(--gs-r-control);background:var(--gs-bg);width:100%;min-height:46px;max-height:160px;color:var(--gs-fg);font-family:inherit;font-size:var(--gs-t-dense);resize:vertical;outline:none;padding:6px 8px;line-height:18px}.SD8qLW_commitMessage:focus{border-color:var(--gs-accent-border)}.SD8qLW_commitMessage::placeholder{color:var(--gs-fg-faint)}.SD8qLW_commitRow{align-items:center;gap:8px;display:flex}.SD8qLW_commitAmend{color:var(--gs-fg-dim);font-size:var(--gs-t-meta);cursor:pointer;align-items:center;gap:4px;display:inline-flex}.SD8qLW_commitAmend input{accent-color:var(--gs-accent);cursor:pointer}.SD8qLW_commitStaged{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);margin-left:auto}.SD8qLW_commitLead{color:var(--gs-fg-faint);font-size:var(--gs-t-meta);margin:0;line-height:15px}.SD8qLW_commitBtn{box-sizing:border-box;min-width:92px;height:var(--gs-h-control);border-radius:var(--gs-r-control);background:var(--gs-accent);color:var(--gs-on-accent);font-family:inherit;font-size:var(--gs-t-ui);white-space:nowrap;cursor:pointer;border:1px solid #0000;flex:none;justify-content:center;align-items:center;padding:0 16px;font-weight:600;line-height:1;transition:filter .12s,opacity .12s;display:inline-flex}.SD8qLW_commitBtn:hover:not(:disabled){filter:brightness(1.1)}.SD8qLW_commitBtn:focus-visible{outline:2px solid var(--gs-accent);outline-offset:2px}.SD8qLW_commitBtn:disabled{background:var(--gs-raise);color:var(--gs-fg-faint);border-color:var(--gs-border);cursor:default}.SD8qLW_btn,.SD8qLW_miniBtn,.SD8qLW_treeIcon,.SD8qLW_commitCopy,.SD8qLW_scopeBtn,.SD8qLW_refButton,.SD8qLW_funnelButton,.SD8qLW_funnelPreset,.SD8qLW_layoutButton{box-sizing:border-box;height:var(--gs-h-control);padding:var(--gs-pad-control);border:1px solid var(--gs-border);border-radius:var(--gs-r-control);color:var(--gs-fg-dim);font-family:inherit;font-size:var(--gs-t-ui);white-space:nowrap;cursor:pointer;background:0 0;flex:none;justify-content:center;align-items:center;gap:6px;line-height:1;transition:background .12s,color .12s,border-color .12s;display:inline-flex}.SD8qLW_btn:hover,.SD8qLW_miniBtn:hover,.SD8qLW_treeIcon:hover,.SD8qLW_commitCopy:hover,.SD8qLW_scopeBtn:hover,.SD8qLW_refButton:hover,.SD8qLW_funnelButton:hover,.SD8qLW_funnelPreset:hover,.SD8qLW_layoutButton:hover{background:var(--gs-raise);color:var(--gs-fg);border-color:var(--gs-fg-fainter)}.SD8qLW_btn:focus-visible,.SD8qLW_miniBtn:focus-visible,.SD8qLW_treeIcon:focus-visible,.SD8qLW_commitCopy:focus-visible,.SD8qLW_scopeBtn:focus-visible,.SD8qLW_refButton:focus-visible,.SD8qLW_funnelPreset:focus-visible,.SD8qLW_layoutButton:focus-visible{outline:2px solid var(--gs-accent);outline-offset:1px}.SD8qLW_btn,.SD8qLW_refButton{border-radius:var(--gs-r-pill)}.SD8qLW_treeIcon,.SD8qLW_commitCopy,.SD8qLW_funnelPreset,.SD8qLW_layoutButton{height:var(--gs-h-compact);padding:var(--gs-pad-compact);font-size:var(--gs-t-dense)}.SD8qLW_treeIcon{width:var(--gs-h-compact);padding:0}.SD8qLW_layoutSwitch{flex:none;gap:2px;margin-left:auto;display:inline-flex}.SD8qLW_layoutButton{width:var(--gs-h-compact);padding:0}.SD8qLW_layoutButton.SD8qLW_layoutButtonOn{color:var(--gs-accent);border-color:var(--gs-accent)}.SD8qLW_layoutGlyph{display:block}.SD8qLW_treeIcon.SD8qLW_treeIconOn{color:var(--gs-accent);border-color:var(--gs-accent)}.SD8qLW_treeIconGlyph{font-size:var(--gs-t-meta);line-height:1;display:block}.SD8qLW_treeIconDown{transform:rotate(90deg)}.SD8qLW_scopeBtn{flex:1 1 0}.SD8qLW_scopeBtnActive,.SD8qLW_miniBtnPrimary,.SD8qLW_segmentActive,.SD8qLW_refRowActive,.SD8qLW_paletteRowActive{border-color:var(--gs-accent-border);background:var(--gs-accent-bg);color:var(--gs-accent);font-weight:600}.SD8qLW_btnIcon{width:var(--gs-h-control);padding:0}.SD8qLW_btnIcon svg{display:block}.SD8qLW_btnClose:hover:not(:disabled){border-color:var(--gs-del);background:var(--gs-del-bg);color:var(--gs-del)}.SD8qLW_btnBehind{border-color:var(--gs-warn);background:var(--gs-warn-bg);color:var(--gs-warn);font-weight:600}.SD8qLW_btnBehind:hover:not(:disabled){background:var(--gs-warn-bg);color:var(--gs-warn);border-color:var(--gs-warn)}.SD8qLW_btnAhead{border-color:var(--gs-add);background:var(--gs-add-bg);color:var(--gs-add);font-weight:600}.SD8qLW_btnAhead:hover:not(:disabled){background:var(--gs-add-bg);color:var(--gs-add);border-color:var(--gs-add)}.SD8qLW_btnPrimary{border-color:var(--gs-accent);background:var(--gs-accent);color:var(--gs-on-accent,#fff);font-weight:600}.SD8qLW_btnPrimary:hover:not(:disabled){background:var(--gs-accent);color:var(--gs-on-accent,#fff);border-color:var(--gs-accent)}.SD8qLW_btnCount{font-variant-numeric:tabular-nums;opacity:.85;border-left:1px solid;margin-left:1px;padding-left:6px}.SD8qLW_pullGroup{flex:none;align-items:center;display:inline-flex}.SD8qLW_pullGroup>.SD8qLW_refPicker>.SD8qLW_refButton{border-right-color:#0000;border-top-right-radius:0;border-bottom-right-radius:0}.SD8qLW_pullGroup>.SD8qLW_btn{border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.SD8qLW_drawer{scrollbar-width:thin;scrollbar-color:var(--gs-border) transparent}.SD8qLW_drawer ::-webkit-scrollbar{width:10px;height:10px}.SD8qLW_drawer ::-webkit-scrollbar-track,.SD8qLW_drawer ::-webkit-scrollbar-corner{background:0 0}.SD8qLW_drawer ::-webkit-scrollbar-thumb{background:var(--gs-border);background-clip:padding-box;border:3px solid #0000;border-radius:999px}.SD8qLW_drawer ::-webkit-scrollbar-thumb:hover{background:var(--gs-fg-faint);background-clip:padding-box}.SD8qLW_commitRefMore{border-radius:var(--gs-r-pill);background:var(--gs-neutral-bg);color:var(--gs-fg-dim);font-size:var(--gs-t-meta);cursor:default;flex:none;padding:0 5px;line-height:15px}.SD8qLW_confirmScrim{background:var(--gs-backdrop);justify-content:center;align-items:center;padding:24px;animation:.12s ease-out SD8qLW_gsFade;display:flex}.SD8qLW_confirmBox{box-sizing:border-box;border:1px solid var(--gs-border);border-radius:var(--gs-r-drawer);background:var(--gs-bg);width:min(440px,100%);box-shadow:0 18px 48px var(--gs-shadow);flex-direction:column;gap:10px;padding:18px;display:flex}.SD8qLW_confirmTitle{color:var(--gs-fg);font-size:var(--gs-t-ui);font-weight:600}.SD8qLW_confirmBody{color:var(--gs-fg-dim);font-size:var(--gs-t-dense);overflow-wrap:anywhere;line-height:1.55}.SD8qLW_confirmActions{flex-direction:row-reverse;gap:8px;margin-top:2px;display:flex}.SD8qLW_btn.SD8qLW_btnDanger{border-color:var(--gs-del);background:var(--gs-del);color:var(--gs-on-accent,#fff);font-weight:600}.SD8qLW_btn.SD8qLW_btnDanger:hover:not(:disabled){border-color:var(--gs-del);background:var(--gs-del);color:var(--gs-on-accent,#fff)}.SD8qLW_fbTree{min-width:var(--gs-min-tree);background:var(--gs-surface-2);flex-direction:column;flex:none;gap:4px;padding:6px;display:flex;overflow:auto}.SD8qLW_fbSearch{box-sizing:border-box;width:100%;font:inherit;font-size:var(--gs-t-meta);color:var(--gs-fg);background:var(--gs-surface);border:1px solid var(--gs-border);border-radius:4px;flex:none;padding:4px 6px}.SD8qLW_fbSearch:focus{border-color:var(--gs-accent);outline:none}.SD8qLW_fbNote{font-size:var(--gs-t-meta);color:var(--gs-fg-dim);flex:none;padding:2px 4px}.SD8qLW_fbList{margin:0;padding:0;list-style:none}.SD8qLW_fbRow{width:100%;font:inherit;font-size:var(--gs-t-dense);color:var(--gs-fg-dim);text-align:left;cursor:pointer;white-space:nowrap;text-overflow:ellipsis;background:0 0;border:0;border-radius:3px;align-items:center;gap:4px;padding:2px 6px 2px 4px;display:flex;overflow:hidden}.SD8qLW_fbRow:hover{background:var(--gs-hover)}.SD8qLW_fbRowActive{background:var(--gs-selected);color:var(--gs-fg)}.SD8qLW_fbDirName,.SD8qLW_fbFileName{text-overflow:ellipsis;overflow:hidden}.SD8qLW_fbMain{min-width:var(--gs-min-diff);background:var(--gs-surface);flex-direction:column;flex:1 1 0;min-height:0;display:flex}.SD8qLW_fbHeader{border-bottom:1px solid var(--gs-border);flex:none;align-items:flex-start;gap:8px;padding:4px 8px 0;display:flex}.SD8qLW_fbPath{font-size:var(--gs-t-meta);color:var(--gs-fg-dim);text-overflow:ellipsis;white-space:nowrap;padding:4px 0;overflow:hidden}.SD8qLW_fbBody{flex:1 1 0;min-height:0;padding:4px 8px;overflow:auto}.SD8qLW_fbCommit{font-size:var(--gs-t-meta);color:var(--gs-fg-dim);background:var(--gs-surface-2);border-bottom:1px solid var(--gs-border);flex:none;align-items:baseline;gap:8px;padding:4px 8px;display:flex}.SD8qLW_fbCommitLine{color:var(--gs-fg-faint);font-variant-numeric:tabular-nums;flex:none}.SD8qLW_fbCommitWho{color:var(--gs-fg);flex:none;font-weight:600}.SD8qLW_fbCommitWhen{font-variant-numeric:tabular-nums;flex:none}.SD8qLW_fbCommitHash{color:var(--gs-fg-faint);flex:none;font-family:inherit}.SD8qLW_fbCommitWhat{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--gs-fg);flex:auto;overflow:hidden}.SD8qLW_fbCommitHint{color:var(--gs-fg-faint)}.SD8qLW_fbMore{font-size:var(--gs-t-meta);color:var(--gs-fg-faint);padding:2px 6px 4px 4px;font-style:italic;display:block}.SD8qLW_imgPane{flex-direction:column;gap:8px;height:100%;min-height:0;display:flex}.SD8qLW_imgStage{border-radius:var(--gs-r-control);background-color:var(--gs-surface-2);background-image:linear-gradient(45deg, var(--gs-border-soft) 25%, transparent 25%, transparent 75%, var(--gs-border-soft) 75%), linear-gradient(45deg, var(--gs-border-soft) 25%, transparent 25%, transparent 75%, var(--gs-border-soft) 75%);background-position:0 0,8px 8px;background-size:16px 16px;flex:auto;justify-content:center;align-items:center;min-height:0;padding:12px;display:flex;overflow:auto}.SD8qLW_imgShot{object-fit:contain;image-rendering:auto;max-width:100%;max-height:100%}.SD8qLW_imgStage[data-actual]{justify-content:flex-start;align-items:flex-start}.SD8qLW_imgStage[data-actual] .SD8qLW_imgShot{object-fit:none;max-width:none;max-height:none}.SD8qLW_imgCaption{font-size:var(--gs-t-meta);color:var(--gs-fg-dim);font-variant-numeric:tabular-nums;flex:none;align-items:center;gap:8px;display:flex}";
|
|
1225
1225
|
const tagId = "@young1lin/dsh-ui-gitworkbench/GitWorkbenchPanel.module.css";
|
|
1226
1226
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
1227
1227
|
const tag = document.createElement("style");
|
|
@@ -1231,331 +1231,332 @@ window.__ModuleLoader__.load({
|
|
|
1231
1231
|
document.head.appendChild(tag);
|
|
1232
1232
|
}
|
|
1233
1233
|
var GitWorkbenchPanel_module_css_default = {
|
|
1234
|
-
"
|
|
1235
|
-
"
|
|
1236
|
-
"
|
|
1237
|
-
"
|
|
1238
|
-
"
|
|
1239
|
-
"cardFiles": "SD8qLW_cardFiles",
|
|
1240
|
-
"cardBranchName": "SD8qLW_cardBranchName",
|
|
1234
|
+
"blameCell": "SD8qLW_blameCell",
|
|
1235
|
+
"commitPopSubject": "SD8qLW_commitPopSubject",
|
|
1236
|
+
"funnelChevron": "SD8qLW_funnelChevron",
|
|
1237
|
+
"diffSpacer": "SD8qLW_diffSpacer",
|
|
1238
|
+
"overlay": "SD8qLW_overlay",
|
|
1241
1239
|
"drawer": "SD8qLW_drawer",
|
|
1242
|
-
"
|
|
1240
|
+
"blockBtnDanger": "SD8qLW_blockBtnDanger",
|
|
1241
|
+
"settingsPop": "SD8qLW_settingsPop",
|
|
1242
|
+
"btnCount": "SD8qLW_btnCount",
|
|
1243
|
+
"fbSearch": "SD8qLW_fbSearch",
|
|
1244
|
+
"commitActive": "SD8qLW_commitActive",
|
|
1245
|
+
"treeDirCounts": "SD8qLW_treeDirCounts",
|
|
1246
|
+
"syncBar": "SD8qLW_syncBar",
|
|
1247
|
+
"cardBehind": "SD8qLW_cardBehind",
|
|
1248
|
+
"themeDirty": "SD8qLW_themeDirty",
|
|
1249
|
+
"imgShot": "SD8qLW_imgShot",
|
|
1250
|
+
"funnelPop": "SD8qLW_funnelPop",
|
|
1251
|
+
"fbCommitWho": "SD8qLW_fbCommitWho",
|
|
1252
|
+
"opBannerOk": "SD8qLW_opBannerOk",
|
|
1253
|
+
"fileStatus": "SD8qLW_fileStatus",
|
|
1254
|
+
"commitBtn": "SD8qLW_commitBtn",
|
|
1255
|
+
"refFoot": "SD8qLW_refFoot",
|
|
1256
|
+
"commitLine": "SD8qLW_commitLine",
|
|
1257
|
+
"headerBranch": "SD8qLW_headerBranch",
|
|
1258
|
+
"sideNav": "SD8qLW_sideNav",
|
|
1243
1259
|
"confirmScrim": "SD8qLW_confirmScrim",
|
|
1244
1260
|
"swatch": "SD8qLW_swatch",
|
|
1261
|
+
"fileCountAdd": "SD8qLW_fileCountAdd",
|
|
1262
|
+
"refLabel": "SD8qLW_refLabel",
|
|
1245
1263
|
"graphCell": "SD8qLW_graphCell",
|
|
1264
|
+
"signAdd": "SD8qLW_signAdd",
|
|
1246
1265
|
"btnAhead": "SD8qLW_btnAhead",
|
|
1266
|
+
"calHead": "SD8qLW_calHead",
|
|
1267
|
+
"sideColGridBlame": "SD8qLW_sideColGridBlame",
|
|
1247
1268
|
"themeGroup": "SD8qLW_themeGroup",
|
|
1248
|
-
"
|
|
1269
|
+
"funnel": "SD8qLW_funnel",
|
|
1270
|
+
"elide": "SD8qLW_elide",
|
|
1271
|
+
"cmHost": "SD8qLW_cmHost",
|
|
1272
|
+
"filterClear": "SD8qLW_filterClear",
|
|
1249
1273
|
"theme": "SD8qLW_theme",
|
|
1250
|
-
"
|
|
1251
|
-
"btn": "SD8qLW_btn",
|
|
1252
|
-
"body": "SD8qLW_body",
|
|
1253
|
-
"commits": "SD8qLW_commits",
|
|
1254
|
-
"treeActions": "SD8qLW_treeActions",
|
|
1255
|
-
"treeDirActive": "SD8qLW_treeDirActive",
|
|
1256
|
-
"commitRow": "SD8qLW_commitRow",
|
|
1257
|
-
"commitPopMeta": "SD8qLW_commitPopMeta",
|
|
1258
|
-
"filePath": "SD8qLW_filePath",
|
|
1259
|
-
"lnNew": "SD8qLW_lnNew",
|
|
1260
|
-
"fbCommitWhat": "SD8qLW_fbCommitWhat",
|
|
1261
|
-
"lineHunk": "SD8qLW_lineHunk",
|
|
1262
|
-
"treeRow": "SD8qLW_treeRow",
|
|
1263
|
-
"commitPopTop": "SD8qLW_commitPopTop",
|
|
1264
|
-
"fbDirName": "SD8qLW_fbDirName",
|
|
1265
|
-
"layoutButton": "SD8qLW_layoutButton",
|
|
1266
|
-
"cardGlyph": "SD8qLW_cardGlyph",
|
|
1267
|
-
"btnIcon": "SD8qLW_btnIcon",
|
|
1268
|
-
"diffWrap": "SD8qLW_diffWrap",
|
|
1269
|
-
"funnelBoundRow": "SD8qLW_funnelBoundRow",
|
|
1270
|
-
"segmented": "SD8qLW_segmented",
|
|
1271
|
-
"sideArmable": "SD8qLW_sideArmable",
|
|
1272
|
-
"treeIconGlyph": "SD8qLW_treeIconGlyph",
|
|
1273
|
-
"fileCountDel": "SD8qLW_fileCountDel",
|
|
1274
|
-
"tree": "SD8qLW_tree",
|
|
1275
|
-
"cssArea": "SD8qLW_cssArea",
|
|
1276
|
-
"bgEmpty": "SD8qLW_bgEmpty",
|
|
1274
|
+
"cardSep": "SD8qLW_cardSep",
|
|
1277
1275
|
"miniBtnPrimary": "SD8qLW_miniBtnPrimary",
|
|
1276
|
+
"btnClose": "SD8qLW_btnClose",
|
|
1277
|
+
"imgCaption": "SD8qLW_imgCaption",
|
|
1278
|
+
"commitCopy": "SD8qLW_commitCopy",
|
|
1279
|
+
"commitPopBody": "SD8qLW_commitPopBody",
|
|
1278
1280
|
"refRowActive": "SD8qLW_refRowActive",
|
|
1281
|
+
"commitFilter": "SD8qLW_commitFilter",
|
|
1282
|
+
"treeFilter": "SD8qLW_treeFilter",
|
|
1283
|
+
"sideColGrid": "SD8qLW_sideColGrid",
|
|
1284
|
+
"fbList": "SD8qLW_fbList",
|
|
1285
|
+
"chipSystem": "SD8qLW_chipSystem",
|
|
1286
|
+
"treeActions": "SD8qLW_treeActions",
|
|
1287
|
+
"menuPop": "SD8qLW_menuPop",
|
|
1288
|
+
"confirmTitle": "SD8qLW_confirmTitle",
|
|
1289
|
+
"elideHead": "SD8qLW_elideHead",
|
|
1279
1290
|
"commitBox": "SD8qLW_commitBox",
|
|
1280
|
-
"
|
|
1281
|
-
"
|
|
1282
|
-
"
|
|
1283
|
-
"funnelButton": "SD8qLW_funnelButton",
|
|
1284
|
-
"resizer": "SD8qLW_resizer",
|
|
1285
|
-
"treeFilterClear": "SD8qLW_treeFilterClear",
|
|
1291
|
+
"treeSub": "SD8qLW_treeSub",
|
|
1292
|
+
"fbCommitHash": "SD8qLW_fbCommitHash",
|
|
1293
|
+
"calToday": "SD8qLW_calToday",
|
|
1286
1294
|
"funnelFootCount": "SD8qLW_funnelFootCount",
|
|
1287
|
-
"
|
|
1288
|
-
"
|
|
1289
|
-
"
|
|
1290
|
-
"
|
|
1291
|
-
"
|
|
1292
|
-
"
|
|
1293
|
-
"
|
|
1294
|
-
"
|
|
1295
|
-
"
|
|
1296
|
-
"
|
|
1297
|
-
"
|
|
1298
|
-
"
|
|
1299
|
-
"
|
|
1295
|
+
"commits": "SD8qLW_commits",
|
|
1296
|
+
"opBannerBad": "SD8qLW_opBannerBad",
|
|
1297
|
+
"fileCountDel": "SD8qLW_fileCountDel",
|
|
1298
|
+
"confirmActions": "SD8qLW_confirmActions",
|
|
1299
|
+
"lineDel": "SD8qLW_lineDel",
|
|
1300
|
+
"funnelBoundValSet": "SD8qLW_funnelBoundValSet",
|
|
1301
|
+
"headerTotals": "SD8qLW_headerTotals",
|
|
1302
|
+
"calNav": "SD8qLW_calNav",
|
|
1303
|
+
"funnelTabs": "SD8qLW_funnelTabs",
|
|
1304
|
+
"sideCellBlock": "SD8qLW_sideCellBlock",
|
|
1305
|
+
"fbCommitWhen": "SD8qLW_fbCommitWhen",
|
|
1306
|
+
"commitRef": "SD8qLW_commitRef",
|
|
1307
|
+
"sideScroll": "SD8qLW_sideScroll",
|
|
1308
|
+
"refList": "SD8qLW_refList",
|
|
1309
|
+
"commitsSentinel": "SD8qLW_commitsSentinel",
|
|
1310
|
+
"funnelTab": "SD8qLW_funnelTab",
|
|
1311
|
+
"funnelTabCount": "SD8qLW_funnelTabCount",
|
|
1312
|
+
"btnBehind": "SD8qLW_btnBehind",
|
|
1313
|
+
"empty": "SD8qLW_empty",
|
|
1314
|
+
"commitsPane": "SD8qLW_commitsPane",
|
|
1315
|
+
"treeDir": "SD8qLW_treeDir",
|
|
1316
|
+
"cardGlyph": "SD8qLW_cardGlyph",
|
|
1317
|
+
"refGroup": "SD8qLW_refGroup",
|
|
1318
|
+
"funnelBoundVal": "SD8qLW_funnelBoundVal",
|
|
1300
1319
|
"sideCodeAdd": "SD8qLW_sideCodeAdd",
|
|
1301
|
-
"
|
|
1302
|
-
"funnelChevron": "SD8qLW_funnelChevron",
|
|
1303
|
-
"refRowName": "SD8qLW_refRowName",
|
|
1304
|
-
"fbBody": "SD8qLW_fbBody",
|
|
1305
|
-
"segmentActive": "SD8qLW_segmentActive",
|
|
1306
|
-
"themeLabel": "SD8qLW_themeLabel",
|
|
1307
|
-
"opBanner": "SD8qLW_opBanner",
|
|
1308
|
-
"cardDetached": "SD8qLW_cardDetached",
|
|
1309
|
-
"renameLine": "SD8qLW_renameLine",
|
|
1310
|
-
"compareBar": "SD8qLW_compareBar",
|
|
1320
|
+
"sideCode": "SD8qLW_sideCode",
|
|
1311
1321
|
"diffPre": "SD8qLW_diffPre",
|
|
1312
|
-
"
|
|
1313
|
-
"
|
|
1314
|
-
"
|
|
1315
|
-
"
|
|
1316
|
-
"
|
|
1317
|
-
"
|
|
1318
|
-
"
|
|
1319
|
-
"
|
|
1320
|
-
"
|
|
1321
|
-
"
|
|
1322
|
-
"
|
|
1322
|
+
"paletteRowActive": "SD8qLW_paletteRowActive",
|
|
1323
|
+
"checkMarkOn": "SD8qLW_checkMarkOn",
|
|
1324
|
+
"stAdded": "SD8qLW_stAdded",
|
|
1325
|
+
"commitSubjectRow": "SD8qLW_commitSubjectRow",
|
|
1326
|
+
"diffNav": "SD8qLW_diffNav",
|
|
1327
|
+
"funnelBoundClear": "SD8qLW_funnelBoundClear",
|
|
1328
|
+
"sideNumAdd": "SD8qLW_sideNumAdd",
|
|
1329
|
+
"commitHasBody": "SD8qLW_commitHasBody",
|
|
1330
|
+
"syncLevel": "SD8qLW_syncLevel",
|
|
1331
|
+
"imgStage": "SD8qLW_imgStage",
|
|
1332
|
+
"sideArmable": "SD8qLW_sideArmable",
|
|
1333
|
+
"bgEmpty": "SD8qLW_bgEmpty",
|
|
1334
|
+
"paletteRow": "SD8qLW_paletteRow",
|
|
1335
|
+
"paneTitle": "SD8qLW_paneTitle",
|
|
1336
|
+
"blockBtn": "SD8qLW_blockBtn",
|
|
1337
|
+
"resizer": "SD8qLW_resizer",
|
|
1338
|
+
"stRenamed": "SD8qLW_stRenamed",
|
|
1339
|
+
"funnelButtonActive": "SD8qLW_funnelButtonActive",
|
|
1340
|
+
"cardAdded": "SD8qLW_cardAdded",
|
|
1341
|
+
"fbRowActive": "SD8qLW_fbRowActive",
|
|
1323
1342
|
"funnelFoot": "SD8qLW_funnelFoot",
|
|
1324
|
-
"elideHead": "SD8qLW_elideHead",
|
|
1325
|
-
"menuPop": "SD8qLW_menuPop",
|
|
1326
1343
|
"refRow": "SD8qLW_refRow",
|
|
1327
|
-
"treeLabel": "SD8qLW_treeLabel",
|
|
1328
|
-
"themeDirty": "SD8qLW_themeDirty",
|
|
1329
|
-
"funnelList": "SD8qLW_funnelList",
|
|
1330
|
-
"commitLine": "SD8qLW_commitLine",
|
|
1331
|
-
"sideBlockHot": "SD8qLW_sideBlockHot",
|
|
1332
|
-
"sideNotice": "SD8qLW_sideNotice",
|
|
1333
|
-
"treeDirLi": "SD8qLW_treeDirLi",
|
|
1334
1344
|
"sideBannerActs": "SD8qLW_sideBannerActs",
|
|
1335
|
-
"blameCell": "SD8qLW_blameCell",
|
|
1336
|
-
"fbRowActive": "SD8qLW_fbRowActive",
|
|
1337
|
-
"fbCommit": "SD8qLW_fbCommit",
|
|
1338
|
-
"sideColRight": "SD8qLW_sideColRight",
|
|
1339
|
-
"funnelPresetActive": "SD8qLW_funnelPresetActive",
|
|
1340
|
-
"fbMore": "SD8qLW_fbMore",
|
|
1341
|
-
"imgPane": "SD8qLW_imgPane",
|
|
1342
|
-
"fileActive": "SD8qLW_fileActive",
|
|
1343
|
-
"signDel": "SD8qLW_signDel",
|
|
1344
|
-
"chevron": "SD8qLW_chevron",
|
|
1345
|
-
"checkMark": "SD8qLW_checkMark",
|
|
1346
|
-
"btnCount": "SD8qLW_btnCount",
|
|
1347
|
-
"cardAhead": "SD8qLW_cardAhead",
|
|
1348
|
-
"commitHasBody": "SD8qLW_commitHasBody",
|
|
1349
|
-
"treeSub": "SD8qLW_treeSub",
|
|
1350
|
-
"diffNav": "SD8qLW_diffNav",
|
|
1351
|
-
"checkMarkOn": "SD8qLW_checkMarkOn",
|
|
1352
|
-
"sideCode": "SD8qLW_sideCode",
|
|
1353
|
-
"checkBox": "SD8qLW_checkBox",
|
|
1354
|
-
"treeEmpty": "SD8qLW_treeEmpty",
|
|
1355
|
-
"confirmBox": "SD8qLW_confirmBox",
|
|
1356
|
-
"fbNote": "SD8qLW_fbNote",
|
|
1357
|
-
"chipLight": "SD8qLW_chipLight",
|
|
1358
|
-
"syncSpacer": "SD8qLW_syncSpacer",
|
|
1359
|
-
"sliderValue": "SD8qLW_sliderValue",
|
|
1360
|
-
"refLabel": "SD8qLW_refLabel",
|
|
1361
|
-
"sideCellBlock": "SD8qLW_sideCellBlock",
|
|
1362
|
-
"lineDel": "SD8qLW_lineDel",
|
|
1363
|
-
"funnelBoundBtnActive": "SD8qLW_funnelBoundBtnActive",
|
|
1364
|
-
"cardBehind": "SD8qLW_cardBehind",
|
|
1365
|
-
"commitSubject": "SD8qLW_commitSubject",
|
|
1366
|
-
"treeIconOn": "SD8qLW_treeIconOn",
|
|
1367
|
-
"syncBar": "SD8qLW_syncBar",
|
|
1368
|
-
"sideNumDel": "SD8qLW_sideNumDel",
|
|
1369
|
-
"fbCommitLine": "SD8qLW_fbCommitLine",
|
|
1370
|
-
"headerPathMain": "SD8qLW_headerPathMain",
|
|
1371
|
-
"paneDividerActive": "SD8qLW_paneDividerActive",
|
|
1372
|
-
"file": "SD8qLW_file",
|
|
1373
|
-
"commitAuthor": "SD8qLW_commitAuthor",
|
|
1374
|
-
"bgPreview": "SD8qLW_bgPreview",
|
|
1375
|
-
"refValue": "SD8qLW_refValue",
|
|
1376
1345
|
"commit": "SD8qLW_commit",
|
|
1346
|
+
"refButton": "SD8qLW_refButton",
|
|
1347
|
+
"sideSpacer": "SD8qLW_sideSpacer",
|
|
1348
|
+
"sideSaveReady": "SD8qLW_sideSaveReady",
|
|
1349
|
+
"chipDark": "SD8qLW_chipDark",
|
|
1350
|
+
"cssArea": "SD8qLW_cssArea",
|
|
1351
|
+
"themeRail": "SD8qLW_themeRail",
|
|
1352
|
+
"headerLeft": "SD8qLW_headerLeft",
|
|
1353
|
+
"chevronOpen": "SD8qLW_chevronOpen",
|
|
1354
|
+
"fileActive": "SD8qLW_fileActive",
|
|
1355
|
+
"lnOld": "SD8qLW_lnOld",
|
|
1356
|
+
"compareBar": "SD8qLW_compareBar",
|
|
1357
|
+
"treeDirActive": "SD8qLW_treeDirActive",
|
|
1358
|
+
"fileBinary": "SD8qLW_fileBinary",
|
|
1359
|
+
"cal": "SD8qLW_cal",
|
|
1360
|
+
"pathChildren": "SD8qLW_pathChildren",
|
|
1361
|
+
"layoutButton": "SD8qLW_layoutButton",
|
|
1377
1362
|
"diffPane": "SD8qLW_diffPane",
|
|
1378
|
-
"
|
|
1379
|
-
"
|
|
1363
|
+
"commitRow": "SD8qLW_commitRow",
|
|
1364
|
+
"compareArrow": "SD8qLW_compareArrow",
|
|
1365
|
+
"headerTotalsAdd": "SD8qLW_headerTotalsAdd",
|
|
1366
|
+
"commitWhen": "SD8qLW_commitWhen",
|
|
1367
|
+
"sideTabActive": "SD8qLW_sideTabActive",
|
|
1368
|
+
"renameLine": "SD8qLW_renameLine",
|
|
1369
|
+
"fileCounts": "SD8qLW_fileCounts",
|
|
1370
|
+
"treeWrap": "SD8qLW_treeWrap",
|
|
1371
|
+
"commitRefMore": "SD8qLW_commitRefMore",
|
|
1372
|
+
"headerDetached": "SD8qLW_headerDetached",
|
|
1373
|
+
"calIn": "SD8qLW_calIn",
|
|
1374
|
+
"filterChipRemove": "SD8qLW_filterChipRemove",
|
|
1375
|
+
"treeTools": "SD8qLW_treeTools",
|
|
1376
|
+
"lineAdd": "SD8qLW_lineAdd",
|
|
1377
|
+
"wordDel": "SD8qLW_wordDel",
|
|
1380
1378
|
"sideBannerTitle": "SD8qLW_sideBannerTitle",
|
|
1381
|
-
"
|
|
1382
|
-
"
|
|
1383
|
-
"
|
|
1384
|
-
"
|
|
1385
|
-
"
|
|
1379
|
+
"sideEditCell": "SD8qLW_sideEditCell",
|
|
1380
|
+
"sideBanner": "SD8qLW_sideBanner",
|
|
1381
|
+
"confirmBox": "SD8qLW_confirmBox",
|
|
1382
|
+
"resizerActive": "SD8qLW_resizerActive",
|
|
1383
|
+
"treeIconGlyph": "SD8qLW_treeIconGlyph",
|
|
1384
|
+
"funnelBoundKey": "SD8qLW_funnelBoundKey",
|
|
1385
|
+
"lineContext": "SD8qLW_lineContext",
|
|
1386
|
+
"themeNote": "SD8qLW_themeNote",
|
|
1387
|
+
"cardDeleted": "SD8qLW_cardDeleted",
|
|
1388
|
+
"sideCodeSame": "SD8qLW_sideCodeSame",
|
|
1389
|
+
"treeLabel": "SD8qLW_treeLabel",
|
|
1390
|
+
"fbMore": "SD8qLW_fbMore",
|
|
1391
|
+
"refEmpty": "SD8qLW_refEmpty",
|
|
1392
|
+
"cardFiles": "SD8qLW_cardFiles",
|
|
1386
1393
|
"paneHead": "SD8qLW_paneHead",
|
|
1387
|
-
"
|
|
1388
|
-
"
|
|
1389
|
-
"
|
|
1390
|
-
"
|
|
1394
|
+
"funnelBounds": "SD8qLW_funnelBounds",
|
|
1395
|
+
"filterChip": "SD8qLW_filterChip",
|
|
1396
|
+
"gsSlide": "SD8qLW_gsSlide",
|
|
1397
|
+
"paneDividerActive": "SD8qLW_paneDividerActive",
|
|
1398
|
+
"fbCommitWhat": "SD8qLW_fbCommitWhat",
|
|
1399
|
+
"fbTree": "SD8qLW_fbTree",
|
|
1400
|
+
"pathNode": "SD8qLW_pathNode",
|
|
1401
|
+
"lineHunk": "SD8qLW_lineHunk",
|
|
1391
1402
|
"fbFileName": "SD8qLW_fbFileName",
|
|
1392
|
-
"
|
|
1393
|
-
"treeFilterInput": "SD8qLW_treeFilterInput",
|
|
1394
|
-
"miniBtn": "SD8qLW_miniBtn",
|
|
1395
|
-
"btnBehind": "SD8qLW_btnBehind",
|
|
1396
|
-
"themeRowSplit": "SD8qLW_themeRowSplit",
|
|
1397
|
-
"sideCodeSame": "SD8qLW_sideCodeSame",
|
|
1398
|
-
"segment": "SD8qLW_segment",
|
|
1399
|
-
"sideNav": "SD8qLW_sideNav",
|
|
1400
|
-
"fbRow": "SD8qLW_fbRow",
|
|
1401
|
-
"funnelCaption": "SD8qLW_funnelCaption",
|
|
1402
|
-
"sideCodeDel": "SD8qLW_sideCodeDel",
|
|
1403
|
-
"headerView": "SD8qLW_headerView",
|
|
1404
|
-
"elide": "SD8qLW_elide",
|
|
1405
|
-
"treeIcon": "SD8qLW_treeIcon",
|
|
1406
|
-
"commitPopBody": "SD8qLW_commitPopBody",
|
|
1407
|
-
"headerTotals": "SD8qLW_headerTotals",
|
|
1408
|
-
"filterChipLabel": "SD8qLW_filterChipLabel",
|
|
1409
|
-
"filterChips": "SD8qLW_filterChips",
|
|
1410
|
-
"chevronOpen": "SD8qLW_chevronOpen",
|
|
1411
|
-
"lnOld": "SD8qLW_lnOld",
|
|
1412
|
-
"commitActive": "SD8qLW_commitActive",
|
|
1413
|
-
"funnelBoundBtn": "SD8qLW_funnelBoundBtn",
|
|
1414
|
-
"commitsSentinel": "SD8qLW_commitsSentinel",
|
|
1415
|
-
"stUntracked": "SD8qLW_stUntracked",
|
|
1416
|
-
"lineAdd": "SD8qLW_lineAdd",
|
|
1417
|
-
"sideScroll": "SD8qLW_sideScroll",
|
|
1418
|
-
"fbCommitHint": "SD8qLW_fbCommitHint",
|
|
1419
|
-
"funnelBoundRows": "SD8qLW_funnelBoundRows",
|
|
1420
|
-
"calIn": "SD8qLW_calIn",
|
|
1421
|
-
"commitSubjectRow": "SD8qLW_commitSubjectRow",
|
|
1422
|
-
"stAdded": "SD8qLW_stAdded",
|
|
1423
|
-
"opBannerOk": "SD8qLW_opBannerOk",
|
|
1403
|
+
"scopeBtnActive": "SD8qLW_scopeBtnActive",
|
|
1424
1404
|
"checkMarkPartial": "SD8qLW_checkMarkPartial",
|
|
1425
|
-
"
|
|
1426
|
-
"
|
|
1405
|
+
"btnPrimary": "SD8qLW_btnPrimary",
|
|
1406
|
+
"segmentChip": "SD8qLW_segmentChip",
|
|
1407
|
+
"refSearch": "SD8qLW_refSearch",
|
|
1408
|
+
"scopeHint": "SD8qLW_scopeHint",
|
|
1409
|
+
"bodyRow": "SD8qLW_bodyRow",
|
|
1410
|
+
"wordAdd": "SD8qLW_wordAdd",
|
|
1411
|
+
"commitMeta": "SD8qLW_commitMeta",
|
|
1427
1412
|
"fileDiscard": "SD8qLW_fileDiscard",
|
|
1428
|
-
"
|
|
1429
|
-
"
|
|
1413
|
+
"funnelPresets": "SD8qLW_funnelPresets",
|
|
1414
|
+
"cardDetached": "SD8qLW_cardDetached",
|
|
1415
|
+
"funnelBoundBtnActive": "SD8qLW_funnelBoundBtnActive",
|
|
1416
|
+
"commitHash": "SD8qLW_commitHash",
|
|
1417
|
+
"refValue": "SD8qLW_refValue",
|
|
1418
|
+
"funnelTabActive": "SD8qLW_funnelTabActive",
|
|
1419
|
+
"checkBox": "SD8qLW_checkBox",
|
|
1420
|
+
"fbDirName": "SD8qLW_fbDirName",
|
|
1421
|
+
"scopeBtn": "SD8qLW_scopeBtn",
|
|
1422
|
+
"fbCommit": "SD8qLW_fbCommit",
|
|
1423
|
+
"sliderValue": "SD8qLW_sliderValue",
|
|
1424
|
+
"tab": "SD8qLW_tab",
|
|
1425
|
+
"commitLead": "SD8qLW_commitLead",
|
|
1426
|
+
"btnDanger": "SD8qLW_btnDanger",
|
|
1427
|
+
"treeLead": "SD8qLW_treeLead",
|
|
1428
|
+
"headerTotalsDel": "SD8qLW_headerTotalsDel",
|
|
1429
|
+
"funnelName": "SD8qLW_funnelName",
|
|
1430
|
+
"commitPopMeta": "SD8qLW_commitPopMeta",
|
|
1431
|
+
"funnelPresetActive": "SD8qLW_funnelPresetActive",
|
|
1432
|
+
"fbMain": "SD8qLW_fbMain",
|
|
1433
|
+
"treeEmpty": "SD8qLW_treeEmpty",
|
|
1434
|
+
"confirmBody": "SD8qLW_confirmBody",
|
|
1435
|
+
"cardBranchName": "SD8qLW_cardBranchName",
|
|
1436
|
+
"themeRowSplit": "SD8qLW_themeRowSplit",
|
|
1437
|
+
"fbCommitHint": "SD8qLW_fbCommitHint",
|
|
1438
|
+
"sideNum": "SD8qLW_sideNum",
|
|
1430
1439
|
"funnelCount": "SD8qLW_funnelCount",
|
|
1431
|
-
"
|
|
1440
|
+
"themeLabel": "SD8qLW_themeLabel",
|
|
1441
|
+
"funnelBoundRow": "SD8qLW_funnelBoundRow",
|
|
1442
|
+
"headerViewRef": "SD8qLW_headerViewRef",
|
|
1443
|
+
"btnIcon": "SD8qLW_btnIcon",
|
|
1444
|
+
"imgPane": "SD8qLW_imgPane",
|
|
1445
|
+
"commitStaged": "SD8qLW_commitStaged",
|
|
1446
|
+
"filePath": "SD8qLW_filePath",
|
|
1447
|
+
"commitAmend": "SD8qLW_commitAmend",
|
|
1448
|
+
"filterChipLabel": "SD8qLW_filterChipLabel",
|
|
1449
|
+
"commitPop": "SD8qLW_commitPop",
|
|
1450
|
+
"fbPath": "SD8qLW_fbPath",
|
|
1451
|
+
"funnelRow": "SD8qLW_funnelRow",
|
|
1452
|
+
"lnNew": "SD8qLW_lnNew",
|
|
1453
|
+
"funnelList": "SD8qLW_funnelList",
|
|
1454
|
+
"pathDirGlyph": "SD8qLW_pathDirGlyph",
|
|
1455
|
+
"sideCols": "SD8qLW_sideCols",
|
|
1456
|
+
"paneDividerY": "SD8qLW_paneDividerY",
|
|
1457
|
+
"segment": "SD8qLW_segment",
|
|
1458
|
+
"treeFilterClear": "SD8qLW_treeFilterClear",
|
|
1459
|
+
"commitAuthor": "SD8qLW_commitAuthor",
|
|
1460
|
+
"gsFade": "SD8qLW_gsFade",
|
|
1461
|
+
"calTitle": "SD8qLW_calTitle",
|
|
1432
1462
|
"refCaret": "SD8qLW_refCaret",
|
|
1433
|
-
"
|
|
1434
|
-
"
|
|
1435
|
-
"
|
|
1463
|
+
"file": "SD8qLW_file",
|
|
1464
|
+
"miniBtn": "SD8qLW_miniBtn",
|
|
1465
|
+
"body": "SD8qLW_body",
|
|
1466
|
+
"treeFilterInput": "SD8qLW_treeFilterInput",
|
|
1467
|
+
"opBanner": "SD8qLW_opBanner",
|
|
1468
|
+
"commitsFoot": "SD8qLW_commitsFoot",
|
|
1469
|
+
"card": "SD8qLW_card",
|
|
1470
|
+
"fbRow": "SD8qLW_fbRow",
|
|
1471
|
+
"pathFileGlyph": "SD8qLW_pathFileGlyph",
|
|
1472
|
+
"syncUpstream": "SD8qLW_syncUpstream",
|
|
1436
1473
|
"elideTail": "SD8qLW_elideTail",
|
|
1437
|
-
"
|
|
1438
|
-
"
|
|
1439
|
-
"
|
|
1440
|
-
"
|
|
1441
|
-
"paletteRowActive": "SD8qLW_paletteRowActive",
|
|
1442
|
-
"treeCol": "SD8qLW_treeCol",
|
|
1443
|
-
"empty": "SD8qLW_empty",
|
|
1444
|
-
"headerPicker": "SD8qLW_headerPicker",
|
|
1474
|
+
"commitPopTop": "SD8qLW_commitPopTop",
|
|
1475
|
+
"sidePane": "SD8qLW_sidePane",
|
|
1476
|
+
"sideCol": "SD8qLW_sideCol",
|
|
1477
|
+
"header": "SD8qLW_header",
|
|
1445
1478
|
"paneDivider": "SD8qLW_paneDivider",
|
|
1446
|
-
"
|
|
1447
|
-
"
|
|
1448
|
-
"
|
|
1449
|
-
"
|
|
1450
|
-
"
|
|
1451
|
-
"calOut": "SD8qLW_calOut",
|
|
1479
|
+
"headerPicker": "SD8qLW_headerPicker",
|
|
1480
|
+
"fbNote": "SD8qLW_fbNote",
|
|
1481
|
+
"syncSpacer": "SD8qLW_syncSpacer",
|
|
1482
|
+
"sliderRow": "SD8qLW_sliderRow",
|
|
1483
|
+
"diffWrap": "SD8qLW_diffWrap",
|
|
1452
1484
|
"stModified": "SD8qLW_stModified",
|
|
1453
|
-
"refPicker": "SD8qLW_refPicker",
|
|
1454
|
-
"cmHost": "SD8qLW_cmHost",
|
|
1455
|
-
"funnelPop": "SD8qLW_funnelPop",
|
|
1456
|
-
"card": "SD8qLW_card",
|
|
1457
|
-
"commitsPane": "SD8qLW_commitsPane",
|
|
1458
|
-
"funnelMore": "SD8qLW_funnelMore",
|
|
1459
|
-
"scopeHint": "SD8qLW_scopeHint",
|
|
1460
|
-
"cal": "SD8qLW_cal",
|
|
1461
|
-
"sideTabActive": "SD8qLW_sideTabActive",
|
|
1462
1485
|
"funnelSearch": "SD8qLW_funnelSearch",
|
|
1463
|
-
"
|
|
1464
|
-
"
|
|
1465
|
-
"
|
|
1466
|
-
"
|
|
1467
|
-
"
|
|
1468
|
-
"settingsPop": "SD8qLW_settingsPop",
|
|
1486
|
+
"calWeek": "SD8qLW_calWeek",
|
|
1487
|
+
"line": "SD8qLW_line",
|
|
1488
|
+
"funnelFootCountOn": "SD8qLW_funnelFootCountOn",
|
|
1489
|
+
"calGrid": "SD8qLW_calGrid",
|
|
1490
|
+
"funnelCaption": "SD8qLW_funnelCaption",
|
|
1469
1491
|
"sideTabs": "SD8qLW_sideTabs",
|
|
1492
|
+
"bgPreview": "SD8qLW_bgPreview",
|
|
1493
|
+
"sideCodeDel": "SD8qLW_sideCodeDel",
|
|
1494
|
+
"segmentActive": "SD8qLW_segmentActive",
|
|
1495
|
+
"funnelButton": "SD8qLW_funnelButton",
|
|
1496
|
+
"treeCol": "SD8qLW_treeCol",
|
|
1497
|
+
"stUntracked": "SD8qLW_stUntracked",
|
|
1498
|
+
"treeIcon": "SD8qLW_treeIcon",
|
|
1470
1499
|
"stDeleted": "SD8qLW_stDeleted",
|
|
1471
|
-
"
|
|
1472
|
-
"
|
|
1473
|
-
"
|
|
1474
|
-
"
|
|
1475
|
-
"
|
|
1476
|
-
"
|
|
1477
|
-
"
|
|
1500
|
+
"pullGroup": "SD8qLW_pullGroup",
|
|
1501
|
+
"sideActions": "SD8qLW_sideActions",
|
|
1502
|
+
"scopeRow": "SD8qLW_scopeRow",
|
|
1503
|
+
"filterChips": "SD8qLW_filterChips",
|
|
1504
|
+
"funnelMore": "SD8qLW_funnelMore",
|
|
1505
|
+
"treeDirLi": "SD8qLW_treeDirLi",
|
|
1506
|
+
"commitTop": "SD8qLW_commitTop",
|
|
1507
|
+
"sideNumDel": "SD8qLW_sideNumDel",
|
|
1508
|
+
"fbHeader": "SD8qLW_fbHeader",
|
|
1509
|
+
"commitSubject": "SD8qLW_commitSubject",
|
|
1510
|
+
"layoutGlyph": "SD8qLW_layoutGlyph",
|
|
1511
|
+
"checkMark": "SD8qLW_checkMark",
|
|
1512
|
+
"cardWt": "SD8qLW_cardWt",
|
|
1513
|
+
"funnelPane": "SD8qLW_funnelPane",
|
|
1514
|
+
"refPicker": "SD8qLW_refPicker",
|
|
1515
|
+
"sideNavCount": "SD8qLW_sideNavCount",
|
|
1516
|
+
"cardAhead": "SD8qLW_cardAhead",
|
|
1517
|
+
"refPop": "SD8qLW_refPop",
|
|
1518
|
+
"treeDirCount": "SD8qLW_treeDirCount",
|
|
1519
|
+
"segmented": "SD8qLW_segmented",
|
|
1520
|
+
"headerRight": "SD8qLW_headerRight",
|
|
1521
|
+
"treeRow": "SD8qLW_treeRow",
|
|
1522
|
+
"refRowSpacer": "SD8qLW_refRowSpacer",
|
|
1523
|
+
"btn": "SD8qLW_btn",
|
|
1524
|
+
"tabs": "SD8qLW_tabs",
|
|
1525
|
+
"sideBlockHot": "SD8qLW_sideBlockHot",
|
|
1526
|
+
"treeIconDown": "SD8qLW_treeIconDown",
|
|
1478
1527
|
"treeDirName": "SD8qLW_treeDirName",
|
|
1479
|
-
"
|
|
1480
|
-
"
|
|
1481
|
-
"
|
|
1482
|
-
"
|
|
1483
|
-
"
|
|
1484
|
-
"
|
|
1485
|
-
"
|
|
1486
|
-
"
|
|
1487
|
-
"
|
|
1488
|
-
"refList": "SD8qLW_refList",
|
|
1489
|
-
"calToday": "SD8qLW_calToday",
|
|
1490
|
-
"funnelBoundVal": "SD8qLW_funnelBoundVal",
|
|
1528
|
+
"overlayMax": "SD8qLW_overlayMax",
|
|
1529
|
+
"fbBody": "SD8qLW_fbBody",
|
|
1530
|
+
"tree": "SD8qLW_tree",
|
|
1531
|
+
"sideColRight": "SD8qLW_sideColRight",
|
|
1532
|
+
"calOut": "SD8qLW_calOut",
|
|
1533
|
+
"headerPathMain": "SD8qLW_headerPathMain",
|
|
1534
|
+
"chipLight": "SD8qLW_chipLight",
|
|
1535
|
+
"funnelBoundBtn": "SD8qLW_funnelBoundBtn",
|
|
1536
|
+
"headerView": "SD8qLW_headerView",
|
|
1491
1537
|
"diffScroll": "SD8qLW_diffScroll",
|
|
1492
|
-
"
|
|
1493
|
-
"
|
|
1494
|
-
"
|
|
1538
|
+
"gutter": "SD8qLW_gutter",
|
|
1539
|
+
"signDel": "SD8qLW_signDel",
|
|
1540
|
+
"chevron": "SD8qLW_chevron",
|
|
1541
|
+
"fileLi": "SD8qLW_fileLi",
|
|
1542
|
+
"funnelPreset": "SD8qLW_funnelPreset",
|
|
1543
|
+
"sideNotice": "SD8qLW_sideNotice",
|
|
1495
1544
|
"sideTab": "SD8qLW_sideTab",
|
|
1496
|
-
"
|
|
1497
|
-
"
|
|
1498
|
-
"
|
|
1499
|
-
"
|
|
1545
|
+
"calMark": "SD8qLW_calMark",
|
|
1546
|
+
"treeIconOn": "SD8qLW_treeIconOn",
|
|
1547
|
+
"funnelBoundRows": "SD8qLW_funnelBoundRows",
|
|
1548
|
+
"layoutButtonOn": "SD8qLW_layoutButtonOn",
|
|
1500
1549
|
"funnelFootClear": "SD8qLW_funnelFootClear",
|
|
1501
|
-
"calWeek": "SD8qLW_calWeek",
|
|
1502
|
-
"paneTitle": "SD8qLW_paneTitle",
|
|
1503
|
-
"commitRef": "SD8qLW_commitRef",
|
|
1504
|
-
"fileStatus": "SD8qLW_fileStatus",
|
|
1505
|
-
"calTitle": "SD8qLW_calTitle",
|
|
1506
|
-
"filterClear": "SD8qLW_filterClear",
|
|
1507
1550
|
"blockBar": "SD8qLW_blockBar",
|
|
1508
|
-
"
|
|
1509
|
-
"
|
|
1510
|
-
"
|
|
1511
|
-
"
|
|
1512
|
-
"
|
|
1513
|
-
"
|
|
1514
|
-
"
|
|
1515
|
-
"
|
|
1516
|
-
"
|
|
1517
|
-
"pathNode": "SD8qLW_pathNode",
|
|
1518
|
-
"fbCommitHash": "SD8qLW_fbCommitHash",
|
|
1519
|
-
"funnelButtonActive": "SD8qLW_funnelButtonActive",
|
|
1520
|
-
"gutter": "SD8qLW_gutter",
|
|
1521
|
-
"fbTree": "SD8qLW_fbTree",
|
|
1522
|
-
"signAdd": "SD8qLW_signAdd",
|
|
1523
|
-
"calGrid": "SD8qLW_calGrid",
|
|
1524
|
-
"fileBinary": "SD8qLW_fileBinary",
|
|
1525
|
-
"treeTools": "SD8qLW_treeTools",
|
|
1526
|
-
"sidePane": "SD8qLW_sidePane",
|
|
1527
|
-
"sideColGrid": "SD8qLW_sideColGrid",
|
|
1528
|
-
"fbSearch": "SD8qLW_fbSearch",
|
|
1529
|
-
"fbCommitWhen": "SD8qLW_fbCommitWhen",
|
|
1530
|
-
"overlay": "SD8qLW_overlay",
|
|
1531
|
-
"fileCountAdd": "SD8qLW_fileCountAdd",
|
|
1532
|
-
"commitStaged": "SD8qLW_commitStaged",
|
|
1533
|
-
"cardWt": "SD8qLW_cardWt",
|
|
1534
|
-
"treeFilter": "SD8qLW_treeFilter",
|
|
1535
|
-
"funnel": "SD8qLW_funnel",
|
|
1536
|
-
"sideNumAdd": "SD8qLW_sideNumAdd",
|
|
1537
|
-
"btnClose": "SD8qLW_btnClose",
|
|
1538
|
-
"confirmBody": "SD8qLW_confirmBody",
|
|
1539
|
-
"headerDetached": "SD8qLW_headerDetached",
|
|
1540
|
-
"funnelFootCountOn": "SD8qLW_funnelFootCountOn",
|
|
1541
|
-
"funnelBoundKey": "SD8qLW_funnelBoundKey",
|
|
1542
|
-
"headerLeft": "SD8qLW_headerLeft",
|
|
1543
|
-
"stRenamed": "SD8qLW_stRenamed",
|
|
1544
|
-
"treeDir": "SD8qLW_treeDir",
|
|
1545
|
-
"lineContext": "SD8qLW_lineContext",
|
|
1546
|
-
"commitLead": "SD8qLW_commitLead",
|
|
1547
|
-
"pathDirGlyph": "SD8qLW_pathDirGlyph",
|
|
1548
|
-
"funnelPresets": "SD8qLW_funnelPresets",
|
|
1549
|
-
"btnPrimary": "SD8qLW_btnPrimary",
|
|
1550
|
-
"headerRight": "SD8qLW_headerRight",
|
|
1551
|
-
"gsSlide": "SD8qLW_gsSlide",
|
|
1552
|
-
"filterChipRemove": "SD8qLW_filterChipRemove",
|
|
1553
|
-
"imgStage": "SD8qLW_imgStage",
|
|
1554
|
-
"headerViewRef": "SD8qLW_headerViewRef",
|
|
1555
|
-
"layoutButtonOn": "SD8qLW_layoutButtonOn",
|
|
1556
|
-
"themeNote": "SD8qLW_themeNote",
|
|
1557
|
-
"commitMeta": "SD8qLW_commitMeta",
|
|
1558
|
-
"funnelBoundClear": "SD8qLW_funnelBoundClear"
|
|
1551
|
+
"wtCurrent": "SD8qLW_wtCurrent",
|
|
1552
|
+
"tabActive": "SD8qLW_tabActive",
|
|
1553
|
+
"commitMessage": "SD8qLW_commitMessage",
|
|
1554
|
+
"layoutSwitch": "SD8qLW_layoutSwitch",
|
|
1555
|
+
"fbCommitLine": "SD8qLW_fbCommitLine",
|
|
1556
|
+
"cardBranch": "SD8qLW_cardBranch",
|
|
1557
|
+
"headerTotalsDim": "SD8qLW_headerTotalsDim",
|
|
1558
|
+
"code": "SD8qLW_code",
|
|
1559
|
+
"refRowName": "SD8qLW_refRowName"
|
|
1559
1560
|
};
|
|
1560
1561
|
//#endregion
|
|
1561
1562
|
//#region node_modules/.pnpm/@marijn+find-cluster-break@1.0.3/node_modules/@marijn/find-cluster-break/src/index.js
|
|
@@ -20116,12 +20117,36 @@ window.__ModuleLoader__.load({
|
|
|
20116
20117
|
*
|
|
20117
20118
|
* The diff itself is CodeMirror's (`presentableDiff`, already aligned to line
|
|
20118
20119
|
* boundaries); this module is the arithmetic from its character offsets to
|
|
20119
|
-
* line numbers.
|
|
20120
|
+
* line numbers - and the BOUND on it.
|
|
20121
|
+
*
|
|
20122
|
+
* Unbounded, that diff is quadratic on inputs that are not versions of each
|
|
20123
|
+
* other, and the editor can be handed such a pair for one render: opening
|
|
20124
|
+
* another file replaces the buffer and the side it is compared against in two
|
|
20125
|
+
* separate transactions, so for an instant the new file's text sits opposite
|
|
20126
|
+
* the old file's. Profiled on a real switch between two source files, that one
|
|
20127
|
+
* instant cost NINE SECONDS inside `findDiff`, and it is the whole of the
|
|
20128
|
+
* reported "clicking a big file after a small one nearly freezes". The editor
|
|
20129
|
+
* no longer diffs an inconsistent pair (see `CodeEditor.tsx`), and this is the
|
|
20130
|
+
* second half of the answer: no input, consistent or not, may cost more than a
|
|
20131
|
+
* moment.
|
|
20120
20132
|
*
|
|
20121
20133
|
* Pure: no React, no DOM, no git. `tests/cm-diff.test.ts` loads it directly.
|
|
20122
20134
|
*
|
|
20123
20135
|
* @module @young1lin/dsh-ui-gitworkbench/client/cm-diff
|
|
20124
20136
|
*/
|
|
20137
|
+
/**
|
|
20138
|
+
* What the tint is allowed to spend.
|
|
20139
|
+
*
|
|
20140
|
+
* `scanLimit` is CodeMirror's own guard against quadratic behaviour - its merge
|
|
20141
|
+
* view sets 500 - and the timeout is the ceiling in wall time. Past either, the
|
|
20142
|
+
* algorithm falls back to a coarser answer, which is the right trade for a
|
|
20143
|
+
* reading aid: an approximate tint that appears is worth more than an exact one
|
|
20144
|
+
* that arrives after the reader has given up. No git operation reads this.
|
|
20145
|
+
*/
|
|
20146
|
+
const DIFF_BOUND = {
|
|
20147
|
+
scanLimit: 500,
|
|
20148
|
+
timeout: 100
|
|
20149
|
+
};
|
|
20125
20150
|
/** Offsets at which each line of `text` starts. */
|
|
20126
20151
|
function lineStarts(text) {
|
|
20127
20152
|
const starts = [0];
|
|
@@ -20158,7 +20183,7 @@ window.__ModuleLoader__.load({
|
|
|
20158
20183
|
const starts = lineStarts(doc);
|
|
20159
20184
|
const changed = /* @__PURE__ */ new Set();
|
|
20160
20185
|
const deletedBefore = /* @__PURE__ */ new Set();
|
|
20161
|
-
for (const change of presentableDiff(original, doc)) {
|
|
20186
|
+
for (const change of presentableDiff(original, doc, DIFF_BOUND)) {
|
|
20162
20187
|
if (change.fromB === change.toB) {
|
|
20163
20188
|
const line = lineAt(starts, change.fromB);
|
|
20164
20189
|
if (original.slice(change.fromA, change.toA).endsWith("\n") && (change.fromA === 0 || original[change.fromA - 1] === "\n") || (lines[line - 1] ?? "").length === 0) deletedBefore.add(line);
|
|
@@ -20181,44 +20206,33 @@ window.__ModuleLoader__.load({
|
|
|
20181
20206
|
return run.color !== void 0 || run.italic === true;
|
|
20182
20207
|
}
|
|
20183
20208
|
/**
|
|
20184
|
-
*
|
|
20209
|
+
* One line's painted ranges, in absolute offsets.
|
|
20210
|
+
*
|
|
20211
|
+
* The unit the viewport painter works in: it knows each visible line's own
|
|
20212
|
+
* offset from CodeMirror and never wants the arithmetic for the lines above it.
|
|
20213
|
+
* {@link tokenRanges} is this function walked down a whole document.
|
|
20185
20214
|
*
|
|
20186
|
-
* @param
|
|
20187
|
-
*
|
|
20188
|
-
*
|
|
20189
|
-
*
|
|
20190
|
-
* @param runs - `highlightFile`'s answer, or undefined while a grammar is
|
|
20191
|
-
* still loading — which yields no ranges rather than throwing,
|
|
20192
|
-
* the same contract the diff columns read it under.
|
|
20193
|
-
* @returns painted ranges in document order, ready to sort into a range set.
|
|
20194
|
-
* A run whose text runs past the end of its line is clipped there: a
|
|
20195
|
-
* decoration crossing a line boundary is an error CodeMirror throws
|
|
20196
|
-
* on, and the honest answer to disagreeing inputs is less paint, not
|
|
20197
|
-
* a crash in the editor.
|
|
20215
|
+
* @param text - the line, as the document holds it.
|
|
20216
|
+
* @param start - the line's absolute offset in the document.
|
|
20217
|
+
* @param runs - that line's highlight runs, or undefined for "not painted",
|
|
20218
|
+
* which yields no ranges rather than throwing.
|
|
20198
20219
|
*/
|
|
20199
|
-
function
|
|
20220
|
+
function lineTokenRanges(text, start, runs) {
|
|
20200
20221
|
if (runs === void 0) return [];
|
|
20201
20222
|
const out = [];
|
|
20202
|
-
let
|
|
20203
|
-
|
|
20204
|
-
const
|
|
20205
|
-
|
|
20206
|
-
|
|
20207
|
-
|
|
20208
|
-
|
|
20209
|
-
|
|
20210
|
-
|
|
20211
|
-
|
|
20212
|
-
|
|
20213
|
-
|
|
20214
|
-
|
|
20215
|
-
italic: run.italic
|
|
20216
|
-
});
|
|
20217
|
-
if (at >= line.length) break;
|
|
20218
|
-
}
|
|
20219
|
-
}
|
|
20220
|
-
lineStart += line.length + 1;
|
|
20221
|
-
});
|
|
20223
|
+
let at = 0;
|
|
20224
|
+
for (const run of runs) {
|
|
20225
|
+
const from = start + at;
|
|
20226
|
+
at += run.text.length;
|
|
20227
|
+
const to = Math.min(start + at, start + text.length);
|
|
20228
|
+
if (to > from && paints(run)) out.push({
|
|
20229
|
+
from,
|
|
20230
|
+
to,
|
|
20231
|
+
color: run.color,
|
|
20232
|
+
italic: run.italic
|
|
20233
|
+
});
|
|
20234
|
+
if (at >= text.length) break;
|
|
20235
|
+
}
|
|
20222
20236
|
return out;
|
|
20223
20237
|
}
|
|
20224
20238
|
//#endregion
|
|
@@ -20234,10 +20248,11 @@ window.__ModuleLoader__.load({
|
|
|
20234
20248
|
* anyone who has used an editor, and the pane was asking people to edit.
|
|
20235
20249
|
*
|
|
20236
20250
|
* CodeMirror is here for the EDITING only. Highlighting still comes from
|
|
20237
|
-
* shiki, through {@link
|
|
20251
|
+
* shiki, through {@link PaintFn}: the diff columns beside this editor are
|
|
20238
20252
|
* painted by shiki, and a second grammar engine would cost another megabyte of
|
|
20239
|
-
* bundle to render the same file in slightly different colours.
|
|
20240
|
-
*
|
|
20253
|
+
* bundle to render the same file in slightly different colours. The pane hands
|
|
20254
|
+
* over a function rather than a file of tokens, and this view calls it for the
|
|
20255
|
+
* lines it is about to show - see {@link PaintLayer}.
|
|
20241
20256
|
*
|
|
20242
20257
|
* The document is CONTROLLED by the pane, not owned here: `value` is the
|
|
20243
20258
|
* pane's buffer, and every change is reported back through `onChange`. The
|
|
@@ -20247,31 +20262,98 @@ window.__ModuleLoader__.load({
|
|
|
20247
20262
|
*
|
|
20248
20263
|
* @module @young1lin/dsh-ui-gitworkbench/client/CodeEditor
|
|
20249
20264
|
*/
|
|
20250
|
-
/**
|
|
20251
|
-
|
|
20265
|
+
/** Where the view reads its painter from. Reconfigured — through
|
|
20266
|
+
* {@link paintCompartment} — when the file, the language or the theme moves. */
|
|
20267
|
+
const paintFacet = Facet.define({ combine: (values) => values.length > 0 ? values[0] : null });
|
|
20268
|
+
const paintCompartment = new Compartment();
|
|
20252
20269
|
/**
|
|
20253
|
-
*
|
|
20254
|
-
*
|
|
20255
|
-
*
|
|
20270
|
+
* How long after the last keystroke the editor recomputes what it paints.
|
|
20271
|
+
*
|
|
20272
|
+
* Both layers below are proportional to what they are asked for, and typing
|
|
20273
|
+
* asks again on every character. The decorations map through the change in the
|
|
20274
|
+
* meantime, so the colours and the tint ride along with the text and only the
|
|
20275
|
+
* recomputation waits.
|
|
20256
20276
|
*/
|
|
20257
|
-
const
|
|
20258
|
-
create: () => Decoration.none,
|
|
20259
|
-
update(paint, tr) {
|
|
20260
|
-
for (const effect of tr.effects) if (effect.is(setPaint)) return effect.value;
|
|
20261
|
-
return tr.docChanged ? paint.map(tr.changes) : paint;
|
|
20262
|
-
},
|
|
20263
|
-
provide: (field) => EditorView.decorations.from(field)
|
|
20264
|
-
});
|
|
20277
|
+
const REPAINT_IDLE_MS = 180;
|
|
20265
20278
|
/** One span's inline style, from the shiki run that produced it. */
|
|
20266
20279
|
function styleFor(color, italic) {
|
|
20267
20280
|
const paint = color === void 0 ? "" : "color:" + color + ";";
|
|
20268
20281
|
return italic === true ? paint + "font-style:italic;" : paint;
|
|
20269
20282
|
}
|
|
20270
|
-
/**
|
|
20271
|
-
|
|
20272
|
-
|
|
20273
|
-
|
|
20274
|
-
|
|
20283
|
+
/**
|
|
20284
|
+
* A decoration layer that is recomputed when the view moves and DEFERRED when
|
|
20285
|
+
* the reader types.
|
|
20286
|
+
*
|
|
20287
|
+
* The two layers below — syntax colour and the live diff tint — differ only in
|
|
20288
|
+
* what they build. Both must be bounded by the viewport, both must survive a
|
|
20289
|
+
* keystroke without being rebuilt, and both must not leave a timer behind when
|
|
20290
|
+
* the view goes away.
|
|
20291
|
+
*/
|
|
20292
|
+
var IdleLayer = class {
|
|
20293
|
+
view;
|
|
20294
|
+
decorations = Decoration.none;
|
|
20295
|
+
timer;
|
|
20296
|
+
constructor(view) {
|
|
20297
|
+
this.view = view;
|
|
20298
|
+
this.decorations = this.build(view);
|
|
20299
|
+
}
|
|
20300
|
+
update(update) {
|
|
20301
|
+
if (update.docChanged) this.decorations = this.decorations.map(update.changes);
|
|
20302
|
+
const why = this.reason(update);
|
|
20303
|
+
if (why === "now") this.decorations = this.build(update.view);
|
|
20304
|
+
else if (why === "later") this.defer();
|
|
20305
|
+
}
|
|
20306
|
+
/** Clears the pending rebuild. A view is destroyed on every file switch, and
|
|
20307
|
+
* a timer that outlives its view is a leak that also paints a dead editor. */
|
|
20308
|
+
destroy() {
|
|
20309
|
+
if (this.timer !== void 0) clearTimeout(this.timer);
|
|
20310
|
+
this.timer = void 0;
|
|
20311
|
+
}
|
|
20312
|
+
defer() {
|
|
20313
|
+
if (this.timer !== void 0) clearTimeout(this.timer);
|
|
20314
|
+
this.timer = setTimeout(() => {
|
|
20315
|
+
this.timer = void 0;
|
|
20316
|
+
this.decorations = this.build(this.view);
|
|
20317
|
+
this.view.dispatch({});
|
|
20318
|
+
}, REPAINT_IDLE_MS);
|
|
20319
|
+
}
|
|
20320
|
+
};
|
|
20321
|
+
/** The lines the view is about to show, 0-based and half-open. */
|
|
20322
|
+
function viewportLines(view) {
|
|
20323
|
+
const doc = view.state.doc;
|
|
20324
|
+
return {
|
|
20325
|
+
from: doc.lineAt(view.viewport.from).number - 1,
|
|
20326
|
+
to: doc.lineAt(view.viewport.to).number
|
|
20327
|
+
};
|
|
20328
|
+
}
|
|
20329
|
+
/** Syntax colour for the viewport, from whatever painter the pane configured. */
|
|
20330
|
+
var PaintLayer = class extends IdleLayer {
|
|
20331
|
+
build(view) {
|
|
20332
|
+
const paint = view.state.facet(paintFacet);
|
|
20333
|
+
if (paint === null) return Decoration.none;
|
|
20334
|
+
const doc = view.state.doc;
|
|
20335
|
+
const lines = doc.toString().split("\n");
|
|
20336
|
+
const { from, to } = viewportLines(view);
|
|
20337
|
+
const runs = paint(lines, from, to);
|
|
20338
|
+
if (runs === void 0) return Decoration.none;
|
|
20339
|
+
const marks = [];
|
|
20340
|
+
const at = [];
|
|
20341
|
+
for (let line = from; line < to && line < lines.length; line += 1) {
|
|
20342
|
+
const start = doc.line(line + 1).from;
|
|
20343
|
+
for (const range of lineTokenRanges(lines[line] ?? "", start, runs[line])) {
|
|
20344
|
+
marks.push(Decoration.mark({ attributes: { style: styleFor(range.color, range.italic) } }));
|
|
20345
|
+
at.push(range.from, range.to);
|
|
20346
|
+
}
|
|
20347
|
+
}
|
|
20348
|
+
return Decoration.set(marks.map((mark, i) => mark.range(at[i * 2], at[i * 2 + 1])), true);
|
|
20349
|
+
}
|
|
20350
|
+
reason(update) {
|
|
20351
|
+
if (update.viewportChanged) return "now";
|
|
20352
|
+
if (update.state.facet(paintFacet) !== update.startState.facet(paintFacet)) return "later";
|
|
20353
|
+
return update.docChanged ? "later" : "no";
|
|
20354
|
+
}
|
|
20355
|
+
};
|
|
20356
|
+
const painter = ViewPlugin.fromClass(PaintLayer, { decorations: (layer) => layer.decorations });
|
|
20275
20357
|
/** The other side's text, kept in state so the diff layer can recompute from
|
|
20276
20358
|
* a transaction alone rather than from a closure over some past render. */
|
|
20277
20359
|
const setOriginal = StateEffect.define();
|
|
@@ -20283,24 +20365,30 @@ window.__ModuleLoader__.load({
|
|
|
20283
20365
|
}
|
|
20284
20366
|
});
|
|
20285
20367
|
/**
|
|
20286
|
-
* The add/delete tint, recomputed
|
|
20368
|
+
* The add/delete tint, recomputed once the typing stops.
|
|
20287
20369
|
*
|
|
20288
20370
|
* Arming the editor used to take the diff colours away, because the pane's
|
|
20289
20371
|
* tints come from git's diff and git has not seen a keystroke. Watching the
|
|
20290
20372
|
* change take shape is the reason to edit inside a diff view at all, so the
|
|
20291
20373
|
* tint is recomputed here from the text on both sides instead.
|
|
20292
20374
|
*
|
|
20375
|
+
* It is a whole-document diff, and it used to run on every transaction: 55ms
|
|
20376
|
+
* per keystroke at 800 lines, 709ms at 4,000. So it inherits {@link IdleLayer}
|
|
20377
|
+
* — the tint maps through the edit and catches up when the reader pauses.
|
|
20378
|
+
*
|
|
20293
20379
|
* This diff is a READING AID. No git operation uses it: the block actions
|
|
20294
20380
|
* still send line indices against the host's own `diffSha`-stamped patch.
|
|
20295
20381
|
*/
|
|
20296
|
-
|
|
20297
|
-
|
|
20298
|
-
|
|
20299
|
-
|
|
20300
|
-
|
|
20301
|
-
|
|
20302
|
-
|
|
20303
|
-
|
|
20382
|
+
var TintLayer = class extends IdleLayer {
|
|
20383
|
+
build(view) {
|
|
20384
|
+
return diffDecorations(view.state);
|
|
20385
|
+
}
|
|
20386
|
+
reason(update) {
|
|
20387
|
+
const sideMoved = update.transactions.some((tr) => tr.effects.some((effect) => effect.is(setOriginal)));
|
|
20388
|
+
return update.docChanged || sideMoved ? "later" : "no";
|
|
20389
|
+
}
|
|
20390
|
+
};
|
|
20391
|
+
const tinter = ViewPlugin.fromClass(TintLayer, { decorations: (layer) => layer.decorations });
|
|
20304
20392
|
function diffDecorations(state) {
|
|
20305
20393
|
const { changed, deletedBefore } = bufferDiff(state.field(originalText, false) ?? "", state.doc.toString());
|
|
20306
20394
|
const marks = [];
|
|
@@ -20372,7 +20460,7 @@ window.__ModuleLoader__.load({
|
|
|
20372
20460
|
cursor: "pointer"
|
|
20373
20461
|
}
|
|
20374
20462
|
});
|
|
20375
|
-
function CodeEditor({ value, original, onChange,
|
|
20463
|
+
function CodeEditor({ value, original, onChange, paint, indent, ariaLabel, onSave, blame, notCommitted, readOnly, onBlameClick }) {
|
|
20376
20464
|
/**
|
|
20377
20465
|
* Editable, and SAID to be editable, from one boolean.
|
|
20378
20466
|
*
|
|
@@ -20411,12 +20499,13 @@ window.__ModuleLoader__.load({
|
|
|
20411
20499
|
history(),
|
|
20412
20500
|
search({ top: true }),
|
|
20413
20501
|
highlightActiveLine(),
|
|
20414
|
-
|
|
20502
|
+
paintCompartment.of(paintFacet.of(paint)),
|
|
20503
|
+
painter,
|
|
20415
20504
|
blameField,
|
|
20416
20505
|
blameCompartment.of([]),
|
|
20417
20506
|
EditorState.readOnly.of(!editable),
|
|
20418
20507
|
originalText.init(() => original),
|
|
20419
|
-
|
|
20508
|
+
tinter,
|
|
20420
20509
|
paneTheme,
|
|
20421
20510
|
keymap.of([
|
|
20422
20511
|
{
|
|
@@ -20483,8 +20572,8 @@ window.__ModuleLoader__.load({
|
|
|
20483
20572
|
(0, react.useEffect)(() => {
|
|
20484
20573
|
const current = view.current;
|
|
20485
20574
|
if (current === null) return;
|
|
20486
|
-
current.dispatch({ effects:
|
|
20487
|
-
}, [
|
|
20575
|
+
current.dispatch({ effects: paintCompartment.reconfigure(paintFacet.of(paint)) });
|
|
20576
|
+
}, [paint]);
|
|
20488
20577
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
20489
20578
|
ref: host,
|
|
20490
20579
|
className: GitWorkbenchPanel_module_css_default.cmHost,
|
|
@@ -23852,7 +23941,7 @@ window.__ModuleLoader__.load({
|
|
|
23852
23941
|
lineText = lineText + "\n";
|
|
23853
23942
|
const onigLineText = this.createOnigString(lineText);
|
|
23854
23943
|
const lineLength = onigLineText.content.length;
|
|
23855
|
-
const lineTokens = new LineTokens(emitBinaryTokens, lineText, this._tokenTypeMatchers, this.balancedBracketSelectors);
|
|
23944
|
+
const lineTokens = new LineTokens$1(emitBinaryTokens, lineText, this._tokenTypeMatchers, this.balancedBracketSelectors);
|
|
23856
23945
|
const r = _tokenizeString(this, onigLineText, isFirstLine, 0, prevState, lineTokens, true, timeLimit);
|
|
23857
23946
|
disposeOnigString(onigLineText);
|
|
23858
23947
|
return {
|
|
@@ -24129,7 +24218,7 @@ window.__ModuleLoader__.load({
|
|
|
24129
24218
|
return this.allowAny;
|
|
24130
24219
|
}
|
|
24131
24220
|
};
|
|
24132
|
-
var LineTokens = class {
|
|
24221
|
+
var LineTokens$1 = class {
|
|
24133
24222
|
constructor(emitBinaryTokens, lineText, tokenTypeOverrides, balancedBracketSelectors) {
|
|
24134
24223
|
this.balancedBracketSelectors = balancedBracketSelectors;
|
|
24135
24224
|
this._emitBinaryTokens = emitBinaryTokens;
|
|
@@ -32338,6 +32427,191 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
32338
32427
|
//#endregion
|
|
32339
32428
|
//#region node_modules/.pnpm/@shikijs+themes@4.3.1/node_modules/@shikijs/themes/dist/synthwave-84.mjs
|
|
32340
32429
|
var synthwave_84_default = Object.freeze(JSON.parse("{\"colors\":{\"activityBar.background\":\"#171520\",\"activityBar.dropBackground\":\"#34294f66\",\"activityBar.foreground\":\"#ffffffCC\",\"activityBarBadge.background\":\"#f97e72\",\"activityBarBadge.foreground\":\"#2a2139\",\"badge.background\":\"#2a2139\",\"badge.foreground\":\"#ffffff\",\"breadcrumbPicker.background\":\"#232530\",\"button.background\":\"#614D85\",\"debugToolBar.background\":\"#463465\",\"diffEditor.insertedTextBackground\":\"#0beb9935\",\"diffEditor.removedTextBackground\":\"#fe445035\",\"dropdown.background\":\"#232530\",\"dropdown.listBackground\":\"#2a2139\",\"editor.background\":\"#262335\",\"editor.findMatchBackground\":\"#D18616bb\",\"editor.findMatchHighlightBackground\":\"#D1861655\",\"editor.findRangeHighlightBackground\":\"#34294f1a\",\"editor.hoverHighlightBackground\":\"#463564\",\"editor.lineHighlightBorder\":\"#7059AB66\",\"editor.rangeHighlightBackground\":\"#49549539\",\"editor.selectionBackground\":\"#ffffff20\",\"editor.selectionHighlightBackground\":\"#ffffff20\",\"editor.wordHighlightBackground\":\"#34294f88\",\"editor.wordHighlightStrongBackground\":\"#34294f88\",\"editorBracketMatch.background\":\"#34294f66\",\"editorBracketMatch.border\":\"#495495\",\"editorCodeLens.foreground\":\"#ffffff7c\",\"editorCursor.background\":\"#241b2f\",\"editorCursor.foreground\":\"#f97e72\",\"editorError.foreground\":\"#fe4450\",\"editorGroup.border\":\"#495495\",\"editorGroup.dropBackground\":\"#4954954a\",\"editorGroupHeader.tabsBackground\":\"#241b2f\",\"editorGutter.addedBackground\":\"#206d4bd6\",\"editorGutter.deletedBackground\":\"#fa2e46a4\",\"editorGutter.modifiedBackground\":\"#b893ce8f\",\"editorIndentGuide.activeBackground\":\"#A148AB80\",\"editorIndentGuide.background\":\"#444251\",\"editorLineNumber.activeForeground\":\"#ffffffcc\",\"editorLineNumber.foreground\":\"#ffffff73\",\"editorOverviewRuler.addedForeground\":\"#09f7a099\",\"editorOverviewRuler.border\":\"#34294fb3\",\"editorOverviewRuler.deletedForeground\":\"#fe445099\",\"editorOverviewRuler.errorForeground\":\"#fe4450dd\",\"editorOverviewRuler.findMatchForeground\":\"#D1861699\",\"editorOverviewRuler.modifiedForeground\":\"#b893ce99\",\"editorOverviewRuler.warningForeground\":\"#72f1b8cc\",\"editorRuler.foreground\":\"#A148AB80\",\"editorSuggestWidget.highlightForeground\":\"#f97e72\",\"editorSuggestWidget.selectedBackground\":\"#ffffff36\",\"editorWarning.foreground\":\"#72f1b8cc\",\"editorWidget.background\":\"#171520DC\",\"editorWidget.border\":\"#ffffff22\",\"editorWidget.resizeBorder\":\"#ffffff44\",\"errorForeground\":\"#fe4450\",\"extensionButton.prominentBackground\":\"#f97e72\",\"extensionButton.prominentHoverBackground\":\"#ff7edb\",\"focusBorder\":\"#1f212b\",\"foreground\":\"#ffffff\",\"gitDecoration.addedResourceForeground\":\"#72f1b8cc\",\"gitDecoration.deletedResourceForeground\":\"#fe4450\",\"gitDecoration.ignoredResourceForeground\":\"#ffffff59\",\"gitDecoration.modifiedResourceForeground\":\"#b893ceee\",\"gitDecoration.untrackedResourceForeground\":\"#72f1b8\",\"input.background\":\"#2a2139\",\"inputOption.activeBorder\":\"#ff7edb99\",\"inputValidation.errorBackground\":\"#fe445080\",\"inputValidation.errorBorder\":\"#fe445000\",\"list.activeSelectionBackground\":\"#ffffff20\",\"list.activeSelectionForeground\":\"#ffffff\",\"list.dropBackground\":\"#34294f66\",\"list.errorForeground\":\"#fe4450E6\",\"list.focusBackground\":\"#ffffff20\",\"list.focusForeground\":\"#ffffff\",\"list.highlightForeground\":\"#f97e72\",\"list.hoverBackground\":\"#37294d99\",\"list.hoverForeground\":\"#ffffff\",\"list.inactiveFocusBackground\":\"#2a213999\",\"list.inactiveSelectionBackground\":\"#ffffff20\",\"list.inactiveSelectionForeground\":\"#ffffff\",\"list.warningForeground\":\"#72f1b8bb\",\"menu.background\":\"#463465\",\"minimapGutter.addedBackground\":\"#09f7a099\",\"minimapGutter.deletedBackground\":\"#fe4450\",\"minimapGutter.modifiedBackground\":\"#b893ce\",\"panelTitle.activeBorder\":\"#f97e72\",\"peekView.border\":\"#495495\",\"peekViewEditor.background\":\"#232530\",\"peekViewEditor.matchHighlightBackground\":\"#D18616bb\",\"peekViewResult.background\":\"#232530\",\"peekViewResult.matchHighlightBackground\":\"#D1861655\",\"peekViewResult.selectionBackground\":\"#2a213980\",\"peekViewTitle.background\":\"#232530\",\"pickerGroup.foreground\":\"#f97e72ea\",\"progressBar.background\":\"#f97e72\",\"scrollbar.shadow\":\"#2a2139\",\"scrollbarSlider.activeBackground\":\"#9d8bca20\",\"scrollbarSlider.background\":\"#9d8bca30\",\"scrollbarSlider.hoverBackground\":\"#9d8bca50\",\"selection.background\":\"#ffffff20\",\"sideBar.background\":\"#241b2f\",\"sideBar.dropBackground\":\"#34294f4c\",\"sideBar.foreground\":\"#ffffff99\",\"sideBarSectionHeader.background\":\"#241b2f\",\"sideBarSectionHeader.foreground\":\"#ffffffca\",\"statusBar.background\":\"#241b2f\",\"statusBar.debuggingBackground\":\"#f97e72\",\"statusBar.debuggingForeground\":\"#08080f\",\"statusBar.foreground\":\"#ffffff80\",\"statusBar.noFolderBackground\":\"#241b2f\",\"statusBarItem.prominentBackground\":\"#2a2139\",\"statusBarItem.prominentHoverBackground\":\"#34294f\",\"tab.activeBorder\":\"#880088\",\"tab.border\":\"#241b2f00\",\"tab.inactiveBackground\":\"#262335\",\"terminal.ansiBlue\":\"#03edf9\",\"terminal.ansiBrightBlue\":\"#03edf9\",\"terminal.ansiBrightCyan\":\"#03edf9\",\"terminal.ansiBrightGreen\":\"#72f1b8\",\"terminal.ansiBrightMagenta\":\"#ff7edb\",\"terminal.ansiBrightRed\":\"#fe4450\",\"terminal.ansiBrightYellow\":\"#fede5d\",\"terminal.ansiCyan\":\"#03edf9\",\"terminal.ansiGreen\":\"#72f1b8\",\"terminal.ansiMagenta\":\"#ff7edb\",\"terminal.ansiRed\":\"#fe4450\",\"terminal.ansiYellow\":\"#f3e70f\",\"terminal.foreground\":\"#ffffff\",\"terminal.selectionBackground\":\"#ffffff20\",\"terminalCursor.background\":\"#ffffff\",\"terminalCursor.foreground\":\"#03edf9\",\"textLink.activeForeground\":\"#ff7edb\",\"textLink.foreground\":\"#f97e72\",\"titleBar.activeBackground\":\"#241b2f\",\"titleBar.inactiveBackground\":\"#241b2f\",\"walkThrough.embeddedEditorBackground\":\"#232530\",\"widget.shadow\":\"#2a2139\"},\"displayName\":\"Synthwave '84\",\"name\":\"synthwave-84\",\"semanticHighlighting\":true,\"tokenColors\":[{\"scope\":[\"comment\",\"string.quoted.docstring.multi.python\",\"string.quoted.docstring.multi.python punctuation.definition.string.begin.python\",\"string.quoted.docstring.multi.python punctuation.definition.string.end.python\"],\"settings\":{\"fontStyle\":\"italic\",\"foreground\":\"#848bbd\"}},{\"scope\":[\"string.quoted\",\"string.template\",\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#ff8b39\"}},{\"scope\":\"string.template meta.embedded.line\",\"settings\":{\"foreground\":\"#b6b1b1\"}},{\"scope\":[\"variable\",\"entity.name.variable\"],\"settings\":{\"foreground\":\"#ff7edb\"}},{\"scope\":\"variable.language\",\"settings\":{\"fontStyle\":\"bold\",\"foreground\":\"#fe4450\"}},{\"scope\":\"variable.parameter\",\"settings\":{\"fontStyle\":\"italic\"}},{\"scope\":[\"storage.type\",\"storage.modifier\"],\"settings\":{\"foreground\":\"#fede5d\"}},{\"scope\":\"constant\",\"settings\":{\"foreground\":\"#f97e72\"}},{\"scope\":\"string.regexp\",\"settings\":{\"foreground\":\"#f97e72\"}},{\"scope\":\"constant.numeric\",\"settings\":{\"foreground\":\"#f97e72\"}},{\"scope\":\"constant.language\",\"settings\":{\"foreground\":\"#f97e72\"}},{\"scope\":\"constant.character.escape\",\"settings\":{\"foreground\":\"#36f9f6\"}},{\"scope\":\"entity.name\",\"settings\":{\"foreground\":\"#fe4450\"}},{\"scope\":\"entity.name.tag\",\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":[\"punctuation.definition.tag\"],\"settings\":{\"foreground\":\"#36f9f6\"}},{\"scope\":\"entity.other.attribute-name\",\"settings\":{\"foreground\":\"#fede5d\"}},{\"scope\":\"entity.other.attribute-name.html\",\"settings\":{\"fontStyle\":\"italic\",\"foreground\":\"#fede5d\"}},{\"scope\":[\"entity.name.type\",\"meta.attribute.class.html\"],\"settings\":{\"foreground\":\"#fe4450\"}},{\"scope\":\"entity.other.inherited-class\",\"settings\":{\"foreground\":\"#D50\"}},{\"scope\":[\"entity.name.function\",\"variable.function\"],\"settings\":{\"foreground\":\"#36f9f6\"}},{\"scope\":[\"keyword.control.export.js\",\"keyword.control.import.js\"],\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":[\"constant.numeric.decimal.js\"],\"settings\":{\"foreground\":\"#2EE2FA\"}},{\"scope\":\"keyword\",\"settings\":{\"foreground\":\"#fede5d\"}},{\"scope\":\"keyword.control\",\"settings\":{\"foreground\":\"#fede5d\"}},{\"scope\":\"keyword.operator\",\"settings\":{\"foreground\":\"#fede5d\"}},{\"scope\":[\"keyword.operator.new\",\"keyword.operator.expression\",\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#fede5d\"}},{\"scope\":\"keyword.other.unit\",\"settings\":{\"foreground\":\"#f97e72\"}},{\"scope\":\"support\",\"settings\":{\"foreground\":\"#fe4450\"}},{\"scope\":\"support.function\",\"settings\":{\"foreground\":\"#36f9f6\"}},{\"scope\":\"support.variable\",\"settings\":{\"foreground\":\"#ff7edb\"}},{\"scope\":[\"meta.object-literal.key\",\"support.type.property-name\"],\"settings\":{\"foreground\":\"#ff7edb\"}},{\"scope\":\"punctuation.separator.key-value\",\"settings\":{\"foreground\":\"#b6b1b1\"}},{\"scope\":\"punctuation.section.embedded\",\"settings\":{\"foreground\":\"#fede5d\"}},{\"scope\":[\"punctuation.definition.template-expression.begin\",\"punctuation.definition.template-expression.end\"],\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":[\"support.type.property-name.css\",\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":\"switch-block.expr.js\",\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":\"variable.other.constant.property.js, variable.other.property.js\",\"settings\":{\"foreground\":\"#2ee2fa\"}},{\"scope\":\"constant.other.color\",\"settings\":{\"foreground\":\"#f97e72\"}},{\"scope\":\"support.constant.font-name\",\"settings\":{\"foreground\":\"#f97e72\"}},{\"scope\":\"entity.other.attribute-name.id\",\"settings\":{\"foreground\":\"#36f9f6\"}},{\"scope\":[\"entity.other.attribute-name.pseudo-element\",\"entity.other.attribute-name.pseudo-class\"],\"settings\":{\"foreground\":\"#D50\"}},{\"scope\":\"support.function.misc.css\",\"settings\":{\"foreground\":\"#fe4450\"}},{\"scope\":[\"markup.heading\",\"entity.name.section\"],\"settings\":{\"foreground\":\"#ff7edb\"}},{\"scope\":[\"text.html\",\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#ffffffee\"}},{\"scope\":\"markup.quote\",\"settings\":{\"fontStyle\":\"italic\",\"foreground\":\"#b6b1b1cc\"}},{\"scope\":\"beginning.punctuation.definition.list\",\"settings\":{\"foreground\":\"#ff7edb\"}},{\"scope\":\"markup.underline.link\",\"settings\":{\"foreground\":\"#D50\"}},{\"scope\":\"string.other.link.description\",\"settings\":{\"foreground\":\"#f97e72\"}},{\"scope\":\"meta.function-call.generic.python\",\"settings\":{\"foreground\":\"#36f9f6\"}},{\"scope\":\"variable.parameter.function-call.python\",\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":\"storage.type.cs\",\"settings\":{\"foreground\":\"#fe4450\"}},{\"scope\":\"entity.name.variable.local.cs\",\"settings\":{\"foreground\":\"#ff7edb\"}},{\"scope\":[\"entity.name.variable.field.cs\",\"entity.name.variable.property.cs\"],\"settings\":{\"foreground\":\"#ff7edb\"}},{\"scope\":\"constant.other.placeholder.c\",\"settings\":{\"fontStyle\":\"italic\",\"foreground\":\"#72f1b8\"}},{\"scope\":[\"keyword.control.directive.include.c\",\"keyword.control.directive.define.c\"],\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":\"storage.modifier.c\",\"settings\":{\"foreground\":\"#fe4450\"}},{\"scope\":\"source.cpp keyword.operator\",\"settings\":{\"foreground\":\"#fede5d\"}},{\"scope\":\"constant.other.placeholder.cpp\",\"settings\":{\"fontStyle\":\"italic\",\"foreground\":\"#72f1b8\"}},{\"scope\":[\"keyword.control.directive.include.cpp\",\"keyword.control.directive.define.cpp\"],\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":\"storage.modifier.specifier.const.cpp\",\"settings\":{\"foreground\":\"#fe4450\"}},{\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#36f9f6\"}},{\"scope\":\"source.elixir entity.name.function\",\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#36f9f6\"}},{\"scope\":\"source.elixir punctuation.definition.string\",\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":\"source.elixir .punctuation.binary.elixir\",\"settings\":{\"fontStyle\":\"italic\",\"foreground\":\"#ff7edb\"}},{\"scope\":[\"entity.global.clojure\"],\"settings\":{\"fontStyle\":\"bold\",\"foreground\":\"#36f9f6\"}},{\"scope\":[\"storage.control.clojure\"],\"settings\":{\"fontStyle\":\"italic\",\"foreground\":\"#36f9f6\"}},{\"scope\":[\"meta.metadata.simple.clojure\",\"meta.metadata.map.clojure\"],\"settings\":{\"fontStyle\":\"italic\",\"foreground\":\"#fe4450\"}},{\"scope\":[\"meta.quoted-expression.clojure\"],\"settings\":{\"fontStyle\":\"italic\"}},{\"scope\":[\"meta.symbol.clojure\"],\"settings\":{\"foreground\":\"#ff7edbff\"}},{\"scope\":\"source.go\",\"settings\":{\"foreground\":\"#ff7edbff\"}},{\"scope\":\"source.go meta.function-call.go\",\"settings\":{\"foreground\":\"#36f9f6\"}},{\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#fede5d\"}},{\"scope\":[\"source.go storage.type\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\"],\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\",\"source.go variable\"],\"settings\":{\"foreground\":\"#2EE2FA\"}},{\"scope\":[\"markup.underline.link.markdown\",\"markup.inline.raw.string.markdown\"],\"settings\":{\"fontStyle\":\"italic\",\"foreground\":\"#72f1b8\"}},{\"scope\":[\"string.other.link.title.markdown\"],\"settings\":{\"foreground\":\"#fede5d\"}},{\"scope\":[\"markup.heading.markdown\",\"entity.name.section.markdown\"],\"settings\":{\"fontStyle\":\"bold\",\"foreground\":\"#ff7edb\"}},{\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"fontStyle\":\"italic\",\"foreground\":\"#2EE2FA\"}},{\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"fontStyle\":\"bold\",\"foreground\":\"#2EE2FA\"}},{\"scope\":[\"punctuation.definition.quote.begin.markdown\",\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":[\"source.dart\",\"source.python\",\"source.scala\"],\"settings\":{\"foreground\":\"#ff7edbff\"}},{\"scope\":[\"string.interpolated.single.dart\"],\"settings\":{\"foreground\":\"#f97e72\"}},{\"scope\":[\"variable.parameter.dart\"],\"settings\":{\"foreground\":\"#72f1b8\"}},{\"scope\":[\"constant.numeric.dart\"],\"settings\":{\"foreground\":\"#2EE2FA\"}},{\"scope\":[\"variable.parameter.scala\"],\"settings\":{\"foreground\":\"#2EE2FA\"}},{\"scope\":[\"meta.template.expression.scala\"],\"settings\":{\"foreground\":\"#72f1b8\"}}],\"type\":\"dark\"}"));
|
|
32430
|
+
/** Chunk lines held across all documents before the oldest is dropped. */
|
|
32431
|
+
const CHUNK_LINE_BUDGET = 12e3;
|
|
32432
|
+
/** Lines held by the solo-lex cache before the oldest is dropped. */
|
|
32433
|
+
const SOLO_LINE_BUDGET = 4e3;
|
|
32434
|
+
function stampOf(lines, from, to) {
|
|
32435
|
+
return `${to - from}${lines[from] ?? ""}${lines[to - 1] ?? ""}`;
|
|
32436
|
+
}
|
|
32437
|
+
/**
|
|
32438
|
+
* A stable cache key for an array the caller already memoises.
|
|
32439
|
+
*
|
|
32440
|
+
* The panes hold their line arrays across renders — `leftLines`, `rightLines`,
|
|
32441
|
+
* the parsed rows — so their identity IS the document's identity, and asking
|
|
32442
|
+
* every call site to invent a key would be one more thing to get wrong. Held in
|
|
32443
|
+
* a WeakMap: an array nobody references any more takes its key with it.
|
|
32444
|
+
*
|
|
32445
|
+
* A caller that rebuilds an equal array on every render gets a fresh key each
|
|
32446
|
+
* time and therefore no caching — correct, but pointless. Memoise, or pass an
|
|
32447
|
+
* explicit key to the function that takes one.
|
|
32448
|
+
*/
|
|
32449
|
+
const minted = /* @__PURE__ */ new WeakMap();
|
|
32450
|
+
let counter = 0;
|
|
32451
|
+
function docKey(anchor) {
|
|
32452
|
+
const known = minted.get(anchor);
|
|
32453
|
+
if (known !== void 0) return known;
|
|
32454
|
+
counter += 1;
|
|
32455
|
+
const fresh = `d${counter}`;
|
|
32456
|
+
minted.set(anchor, fresh);
|
|
32457
|
+
return fresh;
|
|
32458
|
+
}
|
|
32459
|
+
/**
|
|
32460
|
+
* File-quality runs for a range of a document, one chunk at a time.
|
|
32461
|
+
*
|
|
32462
|
+
* Not a singleton: the drawer holds one per (language, theme) pair, so a theme
|
|
32463
|
+
* change drops that palette's tokens instead of serving colours from the old
|
|
32464
|
+
* one.
|
|
32465
|
+
*/
|
|
32466
|
+
var ChunkedTokens = class {
|
|
32467
|
+
budget;
|
|
32468
|
+
/** `${key}${chunkIndex}` → chunk. Insertion order IS the LRU order:
|
|
32469
|
+
* a hit re-inserts, and eviction takes from the front. */
|
|
32470
|
+
held = /* @__PURE__ */ new Map();
|
|
32471
|
+
lines = 0;
|
|
32472
|
+
constructor(budget = CHUNK_LINE_BUDGET) {
|
|
32473
|
+
this.budget = budget;
|
|
32474
|
+
}
|
|
32475
|
+
/** Cached lines, for the test that proves the budget is really enforced. */
|
|
32476
|
+
size() {
|
|
32477
|
+
return this.lines;
|
|
32478
|
+
}
|
|
32479
|
+
/** Drop everything — a theme change, or a caller that knows better. */
|
|
32480
|
+
clear() {
|
|
32481
|
+
this.held.clear();
|
|
32482
|
+
this.lines = 0;
|
|
32483
|
+
}
|
|
32484
|
+
/** Drop one document's chunks, without touching the others. */
|
|
32485
|
+
forget(key) {
|
|
32486
|
+
const prefix = `${key}`;
|
|
32487
|
+
for (const [id, chunk] of [...this.held]) if (id.startsWith(prefix)) {
|
|
32488
|
+
this.held.delete(id);
|
|
32489
|
+
this.lines -= chunk.runs.length;
|
|
32490
|
+
}
|
|
32491
|
+
}
|
|
32492
|
+
/**
|
|
32493
|
+
* Runs for `lines[from, to)`, tokenizing only what is not already held.
|
|
32494
|
+
*
|
|
32495
|
+
* @param key - identity of the document these lines are. Must change when
|
|
32496
|
+
* the text does: two different files under one key would share
|
|
32497
|
+
* each other's colours. The chunk stamp catches the common case,
|
|
32498
|
+
* not every case.
|
|
32499
|
+
* @param lines - the WHOLE document's lines. Only the requested range is
|
|
32500
|
+
* tokenized; the rest is read for stamps and lead-in.
|
|
32501
|
+
* @param from - first line wanted.
|
|
32502
|
+
* @param to - one past the last line wanted.
|
|
32503
|
+
* @param tokenize - the engine binding; see {@link ChunkTokenizer}.
|
|
32504
|
+
* @returns an array indexed by line over the whole document, filled only
|
|
32505
|
+
* inside the requested range, or undefined when the tokenizer
|
|
32506
|
+
* declines (no grammar loaded yet).
|
|
32507
|
+
*/
|
|
32508
|
+
runs(key, lines, from, to, tokenize) {
|
|
32509
|
+
const first = Math.max(0, Math.trunc(from));
|
|
32510
|
+
const last = Math.min(lines.length, Math.trunc(to));
|
|
32511
|
+
if (last <= first) return void 0;
|
|
32512
|
+
const firstChunk = Math.floor(first / 128);
|
|
32513
|
+
const lastChunk = Math.floor((last - 1) / 128);
|
|
32514
|
+
const out = new Array(lines.length);
|
|
32515
|
+
for (let index = firstChunk; index <= lastChunk; index += 1) {
|
|
32516
|
+
const chunk = this.chunk(key, lines, index, tokenize);
|
|
32517
|
+
if (chunk === void 0) return void 0;
|
|
32518
|
+
const start = index * 128;
|
|
32519
|
+
const stop = Math.min(start + 128, lines.length);
|
|
32520
|
+
for (let line = Math.max(start, first); line < Math.min(stop, last); line += 1) out[line] = chunk.runs[line - start];
|
|
32521
|
+
}
|
|
32522
|
+
return out;
|
|
32523
|
+
}
|
|
32524
|
+
/** One chunk, from the cache or freshly tokenized. */
|
|
32525
|
+
chunk(key, lines, index, tokenize) {
|
|
32526
|
+
const start = index * 128;
|
|
32527
|
+
const stop = Math.min(start + 128, lines.length);
|
|
32528
|
+
const id = `${key}${index}`;
|
|
32529
|
+
const stamp = stampOf(lines, start, stop);
|
|
32530
|
+
const known = this.held.get(id);
|
|
32531
|
+
if (known !== void 0) {
|
|
32532
|
+
if (known.stamp === stamp) {
|
|
32533
|
+
this.held.delete(id);
|
|
32534
|
+
this.held.set(id, known);
|
|
32535
|
+
return known;
|
|
32536
|
+
}
|
|
32537
|
+
this.held.delete(id);
|
|
32538
|
+
this.lines -= known.runs.length;
|
|
32539
|
+
}
|
|
32540
|
+
const before = this.held.get(`${key}${index - 1}`);
|
|
32541
|
+
const lead = before !== void 0 ? start : Math.max(0, start - 240);
|
|
32542
|
+
const got = tokenize(lines.slice(lead, stop).join("\n"), before?.state);
|
|
32543
|
+
if (got === void 0) return void 0;
|
|
32544
|
+
const runs = got.runs.slice(start - lead, stop - lead);
|
|
32545
|
+
while (runs.length < stop - start) runs.push([{
|
|
32546
|
+
text: lines[start + runs.length] ?? "",
|
|
32547
|
+
color: void 0
|
|
32548
|
+
}]);
|
|
32549
|
+
const fresh = {
|
|
32550
|
+
runs,
|
|
32551
|
+
state: got.state,
|
|
32552
|
+
stamp
|
|
32553
|
+
};
|
|
32554
|
+
this.held.set(id, fresh);
|
|
32555
|
+
this.lines += runs.length;
|
|
32556
|
+
this.evict();
|
|
32557
|
+
return fresh;
|
|
32558
|
+
}
|
|
32559
|
+
/** Drop least-recently-used chunks until inside the budget. */
|
|
32560
|
+
evict() {
|
|
32561
|
+
while (this.lines > this.budget) {
|
|
32562
|
+
const oldest = this.held.keys().next();
|
|
32563
|
+
if (oldest.done === true) return;
|
|
32564
|
+
const chunk = this.held.get(oldest.value);
|
|
32565
|
+
this.held.delete(oldest.value);
|
|
32566
|
+
this.lines -= chunk === void 0 ? 0 : chunk.runs.length;
|
|
32567
|
+
}
|
|
32568
|
+
}
|
|
32569
|
+
};
|
|
32570
|
+
/**
|
|
32571
|
+
* Runs for single lines lexed on their own, cached by the text itself.
|
|
32572
|
+
*
|
|
32573
|
+
* The diff panes re-lex every visible line alone, because a diff hunk is not a
|
|
32574
|
+
* real file and a slice of one paints as whatever it happens to start inside.
|
|
32575
|
+
* That answer depends on nothing but the text, so the same line — read again
|
|
32576
|
+
* after a scroll, seen again in another file, repeated within one — is free.
|
|
32577
|
+
*/
|
|
32578
|
+
var LineTokens = class {
|
|
32579
|
+
budget;
|
|
32580
|
+
held = /* @__PURE__ */ new Map();
|
|
32581
|
+
constructor(budget = SOLO_LINE_BUDGET) {
|
|
32582
|
+
this.budget = budget;
|
|
32583
|
+
}
|
|
32584
|
+
/** Cached lines, for the test that proves the budget is really enforced. */
|
|
32585
|
+
size() {
|
|
32586
|
+
return this.held.size;
|
|
32587
|
+
}
|
|
32588
|
+
clear() {
|
|
32589
|
+
this.held.clear();
|
|
32590
|
+
}
|
|
32591
|
+
/**
|
|
32592
|
+
* @param key - the line's text, plus whatever else decides its colours —
|
|
32593
|
+
* language and theme. Two palettes must not share an answer.
|
|
32594
|
+
* @param lex - tokenizes the line; undefined means no grammar, and is NOT
|
|
32595
|
+
* cached — the grammar may finish loading a moment later.
|
|
32596
|
+
*/
|
|
32597
|
+
get(key, lex) {
|
|
32598
|
+
const known = this.held.get(key);
|
|
32599
|
+
if (known !== void 0) {
|
|
32600
|
+
this.held.delete(key);
|
|
32601
|
+
this.held.set(key, known);
|
|
32602
|
+
return known;
|
|
32603
|
+
}
|
|
32604
|
+
const fresh = lex();
|
|
32605
|
+
if (fresh === void 0) return void 0;
|
|
32606
|
+
this.held.set(key, fresh);
|
|
32607
|
+
while (this.held.size > this.budget) {
|
|
32608
|
+
const oldest = this.held.keys().next();
|
|
32609
|
+
if (oldest.done === true) break;
|
|
32610
|
+
this.held.delete(oldest.value);
|
|
32611
|
+
}
|
|
32612
|
+
return fresh;
|
|
32613
|
+
}
|
|
32614
|
+
};
|
|
32341
32615
|
//#endregion
|
|
32342
32616
|
//#region node_modules/.pnpm/@shikijs+langs@4.3.1/node_modules/@shikijs/langs/dist/python.mjs
|
|
32343
32617
|
var python_exports = /* @__PURE__ */ __exportAll({ default: () => python_default });
|
|
@@ -32635,6 +32909,16 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
32635
32909
|
});
|
|
32636
32910
|
return singleton;
|
|
32637
32911
|
}
|
|
32912
|
+
/**
|
|
32913
|
+
* Everything this module has already tokenized.
|
|
32914
|
+
*
|
|
32915
|
+
* Both are bounded (see `token-cache.ts`): the drawer can be left open on a
|
|
32916
|
+
* repository all day, and what these hold is capped in lines, not in files
|
|
32917
|
+
* visited. Keys carry the language and the theme, so a palette change does not
|
|
32918
|
+
* serve the last theme's colours - it just misses.
|
|
32919
|
+
*/
|
|
32920
|
+
const chunks = new ChunkedTokens();
|
|
32921
|
+
const solo = new LineTokens();
|
|
32638
32922
|
const requested = /* @__PURE__ */ new Set();
|
|
32639
32923
|
const listeners = /* @__PURE__ */ new Set();
|
|
32640
32924
|
let loadCount = 0;
|
|
@@ -32679,64 +32963,46 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
32679
32963
|
return PALETTE_THEMES[palette] ?? (palette.endsWith("light") ? "github-light-default" : "github-dark-default");
|
|
32680
32964
|
}
|
|
32681
32965
|
/**
|
|
32682
|
-
*
|
|
32683
|
-
* finishes loading (caller re-renders via {@link subscribeGrammarLoaded}).
|
|
32966
|
+
* File-quality runs for a range of a file that really IS one.
|
|
32684
32967
|
*
|
|
32685
|
-
*
|
|
32686
|
-
*
|
|
32687
|
-
*
|
|
32688
|
-
*
|
|
32689
|
-
* on its own so `async` / `function` / `const` colour as they would at the
|
|
32690
|
-
* top level.
|
|
32691
|
-
* @param lines - source lines, no leading +/-.
|
|
32692
|
-
* @param lang - from {@link shikiLangOf}.
|
|
32693
|
-
* @param theme - from {@link shikiThemeOf}.
|
|
32694
|
-
*/
|
|
32695
|
-
function highlightFile(lines, lang, theme = "github-dark-default") {
|
|
32696
|
-
const fileTok = tokenizeLines(lines, lang, theme);
|
|
32697
|
-
if (fileTok === void 0) return void 0;
|
|
32698
|
-
return lines.map((line, i) => {
|
|
32699
|
-
const together = fileTok[i] ?? [{
|
|
32700
|
-
text: line,
|
|
32701
|
-
color: void 0
|
|
32702
|
-
}];
|
|
32703
|
-
if (looksLikeCommentLine(line)) return together;
|
|
32704
|
-
const solo = tokenizeLines([line], lang, theme)?.[0];
|
|
32705
|
-
return solo !== void 0 && solo.length > 0 ? solo : together;
|
|
32706
|
-
});
|
|
32707
|
-
}
|
|
32708
|
-
/**
|
|
32709
|
-
* Tokenize a file that really is one — the whole of it, in one pass.
|
|
32710
|
-
*
|
|
32711
|
-
* {@link highlightFile} re-lexes every non-comment line ON ITS OWN because a
|
|
32712
|
-
* diff reconstruction is not a real file. That costs one Shiki call per line:
|
|
32713
|
-
* measured on 1000 lines, the whole-file pass is 42ms and the thousand solo
|
|
32714
|
-
* passes on top of it are another 644ms. It also throws away the only pass
|
|
32715
|
-
* that knows about multi-line strings, block comments and template literals.
|
|
32968
|
+
* The editor's buffer and the file browser's text are whole files, so the
|
|
32969
|
+
* per-line re-lex {@link highlightFile} performs is both wrong for them and
|
|
32970
|
+
* expensive; the file pass is the whole answer, and it is the only pass that
|
|
32971
|
+
* knows about multi-line strings, block comments and template literals.
|
|
32716
32972
|
*
|
|
32717
|
-
*
|
|
32718
|
-
*
|
|
32719
|
-
*
|
|
32973
|
+
* Only the range is tokenized, and only once: this is what a viewport asks for
|
|
32974
|
+
* as the reader scrolls. Measured on 1,837 lines of real TypeScript, the whole
|
|
32975
|
+
* file in one pass cost 1,637ms - the freeze the Files tab took on every click,
|
|
32976
|
+
* and the reason files past 2,000 lines were left uncoloured altogether rather
|
|
32977
|
+
* than made to wait for it.
|
|
32720
32978
|
*
|
|
32979
|
+
* @param key - identity of the document. Must change when the text does; a
|
|
32980
|
+
* path is usually right, because the chunk stamps catch edits within it.
|
|
32721
32981
|
* @param lines - the file's lines, complete and in order.
|
|
32722
32982
|
* @param lang - from {@link shikiLangOf}.
|
|
32723
32983
|
* @param theme - from {@link shikiThemeOf}.
|
|
32984
|
+
* @param from - first line wanted.
|
|
32985
|
+
* @param to - one past the last line wanted.
|
|
32986
|
+
* @returns an array indexed by line, filled only inside the range, or
|
|
32987
|
+
* undefined when no grammar applies.
|
|
32724
32988
|
*/
|
|
32725
|
-
function
|
|
32726
|
-
return
|
|
32989
|
+
function highlightRange(key, lines, lang, theme, from, to) {
|
|
32990
|
+
return chunks.runs(key + "|" + (lang ?? "") + "|" + theme, lines, from, to, chunkTokenizer(lang, theme));
|
|
32727
32991
|
}
|
|
32728
32992
|
/**
|
|
32729
32993
|
* Runs for the rows in a window, and nothing outside it.
|
|
32730
32994
|
*
|
|
32731
|
-
* This is the pane's whole highlighting cost
|
|
32732
|
-
* viewport rather than to the file
|
|
32733
|
-
*
|
|
32734
|
-
*
|
|
32735
|
-
*
|
|
32995
|
+
* This is the pane's whole highlighting cost, and it is proportional to the
|
|
32996
|
+
* viewport rather than to the file - and then only the FIRST time those lines
|
|
32997
|
+
* are read. Both passes go through `token-cache.ts`: the file pass by chunk,
|
|
32998
|
+
* continuing from the grammar state of the chunk before it, and the per-line
|
|
32999
|
+
* re-lex by the line's own text. Scrolling back over a file costs nothing;
|
|
33000
|
+
* measured cold, ten screenfuls of real TypeScript cost 3,021ms before this and
|
|
33001
|
+
* are one tokenizing pass per new line after it.
|
|
32736
33002
|
*
|
|
32737
|
-
* Both passes
|
|
32738
|
-
* multi-line constructs
|
|
32739
|
-
*
|
|
33003
|
+
* Both passes are still here, because a diff reconstruction needs both: the
|
|
33004
|
+
* file pass, which knows about multi-line constructs, and the per-line re-lex
|
|
33005
|
+
* that makes a hunk colour as top-level code.
|
|
32740
33006
|
*
|
|
32741
33007
|
* @param lines - source lines, no leading +/-.
|
|
32742
33008
|
* @param lang - from {@link shikiLangOf}.
|
|
@@ -32750,13 +33016,12 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
32750
33016
|
const first = Math.max(0, Math.trunc(from));
|
|
32751
33017
|
const last = Math.min(lines.length, Math.trunc(to));
|
|
32752
33018
|
if (last <= first) return void 0;
|
|
32753
|
-
const
|
|
32754
|
-
|
|
32755
|
-
if (sliceTok === void 0) return void 0;
|
|
33019
|
+
const fileTok = highlightRange(docKey(lines), lines, lang, theme, first, last);
|
|
33020
|
+
if (fileTok === void 0) return void 0;
|
|
32756
33021
|
const out = new Array(lines.length);
|
|
32757
33022
|
for (let i = first; i < last; i += 1) {
|
|
32758
33023
|
const line = lines[i];
|
|
32759
|
-
const together =
|
|
33024
|
+
const together = fileTok[i] ?? [{
|
|
32760
33025
|
text: line,
|
|
32761
33026
|
color: void 0
|
|
32762
33027
|
}];
|
|
@@ -32764,11 +33029,35 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
32764
33029
|
out[i] = together;
|
|
32765
33030
|
continue;
|
|
32766
33031
|
}
|
|
32767
|
-
const
|
|
32768
|
-
out[i] =
|
|
33032
|
+
const alone = soloRuns(line, lang, theme);
|
|
33033
|
+
out[i] = alone !== void 0 && alone.length > 0 ? alone : together;
|
|
32769
33034
|
}
|
|
32770
33035
|
return out;
|
|
32771
33036
|
}
|
|
33037
|
+
/** One line lexed on its own, from the cache when it has been seen before -
|
|
33038
|
+
* which, scrolling back over a file, it usually has. */
|
|
33039
|
+
function soloRuns(line, lang, theme) {
|
|
33040
|
+
if (lang === void 0) return void 0;
|
|
33041
|
+
return solo.get(lang + "|" + theme + "|" + line, () => tokenizeLines([line], lang, theme)?.[0]);
|
|
33042
|
+
}
|
|
33043
|
+
/** Bind the engine for {@link ChunkedTokens}: tokenize a chunk continuing from
|
|
33044
|
+
* the grammar state the chunk before it ended in, which Shiki hands back with
|
|
33045
|
+
* the tokens and which makes the continuation exact rather than guessed. */
|
|
33046
|
+
function chunkTokenizer(lang, theme) {
|
|
33047
|
+
return (text, state) => {
|
|
33048
|
+
if (lang === void 0) return void 0;
|
|
33049
|
+
if (!ensureGrammar(lang)) return void 0;
|
|
33050
|
+
const got = highlighter().codeToTokens(text, {
|
|
33051
|
+
lang,
|
|
33052
|
+
theme,
|
|
33053
|
+
grammarState: state
|
|
33054
|
+
});
|
|
33055
|
+
return {
|
|
33056
|
+
runs: runsOf(got.tokens, text.split("\n")),
|
|
33057
|
+
state: got.grammarState
|
|
33058
|
+
};
|
|
33059
|
+
};
|
|
33060
|
+
}
|
|
32772
33061
|
function looksLikeCommentLine(text) {
|
|
32773
33062
|
const t = text.trimStart();
|
|
32774
33063
|
return t.startsWith("//") || t.startsWith("/*") || t.startsWith("*") || t.startsWith("#");
|
|
@@ -32780,6 +33069,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
32780
33069
|
lang,
|
|
32781
33070
|
theme
|
|
32782
33071
|
});
|
|
33072
|
+
return runsOf(tokens, lines);
|
|
33073
|
+
}
|
|
33074
|
+
/** Shiki's tokens as runs, one entry per line of the text that produced them. */
|
|
33075
|
+
function runsOf(tokens, lines) {
|
|
32783
33076
|
const last = tokens[tokens.length - 1];
|
|
32784
33077
|
const out = (tokens.length > 1 && last !== void 0 && last.length === 0 ? tokens.slice(0, -1) : tokens).map((line) => line.map((token) => ({
|
|
32785
33078
|
text: token.content,
|
|
@@ -32793,13 +33086,26 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
32793
33086
|
return out.slice(0, lines.length);
|
|
32794
33087
|
}
|
|
32795
33088
|
/**
|
|
32796
|
-
*
|
|
32797
|
-
*
|
|
33089
|
+
* {@link highlightForRows} for the rows in a window, and nothing outside it.
|
|
33090
|
+
*
|
|
33091
|
+
* Same reason as {@link highlightWindow}, in the view History and Compare use:
|
|
33092
|
+
* a unified diff of a long file re-lexed every one of its rows, so opening one
|
|
33093
|
+
* froze the pane exactly as the side-by-side view did.
|
|
33094
|
+
*
|
|
33095
|
+
* The mapping from rows to the two sides' line arrays is built over ALL rows —
|
|
33096
|
+
* it is array bookkeeping with no Shiki in it, and a row's position on its side
|
|
33097
|
+
* depends on every row before it. Only the tokenizing is windowed, and because
|
|
33098
|
+
* a window of rows is contiguous, so is the span of lines it needs from each
|
|
33099
|
+
* side.
|
|
33100
|
+
*
|
|
32798
33101
|
* @param rows - parsed unified-diff rows.
|
|
32799
33102
|
* @param lang - from {@link shikiLangOf}.
|
|
32800
33103
|
* @param theme - from {@link shikiThemeOf}.
|
|
33104
|
+
* @param from - first row in the window.
|
|
33105
|
+
* @param to - one past the last row in the window.
|
|
33106
|
+
* @returns an array indexed by ROW, filled only inside the window.
|
|
32801
33107
|
*/
|
|
32802
|
-
function
|
|
33108
|
+
function highlightForRowsWindow(rows, lang, theme, from, to) {
|
|
32803
33109
|
const oldLines = [];
|
|
32804
33110
|
const newLines = [];
|
|
32805
33111
|
const oldAt = [];
|
|
@@ -32821,78 +33127,48 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
32821
33127
|
oldAt.push(-1);
|
|
32822
33128
|
newAt.push(-1);
|
|
32823
33129
|
}
|
|
32824
|
-
const
|
|
32825
|
-
const
|
|
32826
|
-
|
|
32827
|
-
|
|
33130
|
+
const first = Math.max(0, Math.trunc(from));
|
|
33131
|
+
const last = Math.min(rows.length, Math.trunc(to));
|
|
33132
|
+
const span = (at) => {
|
|
33133
|
+
let lo = -1;
|
|
33134
|
+
let hi = -1;
|
|
33135
|
+
for (let i = first; i < last; i += 1) {
|
|
33136
|
+
const j = at[i];
|
|
33137
|
+
if (j < 0) continue;
|
|
33138
|
+
if (lo < 0) lo = j;
|
|
33139
|
+
hi = j;
|
|
33140
|
+
}
|
|
33141
|
+
return lo < 0 ? {
|
|
33142
|
+
from: 0,
|
|
33143
|
+
to: 0
|
|
33144
|
+
} : {
|
|
33145
|
+
from: lo,
|
|
33146
|
+
to: hi + 1
|
|
33147
|
+
};
|
|
33148
|
+
};
|
|
33149
|
+
const oldSpan = span(oldAt);
|
|
33150
|
+
const newSpan = span(newAt);
|
|
33151
|
+
const oldTok = highlightWindow(oldLines, lang, theme, oldSpan.from, oldSpan.to);
|
|
33152
|
+
const newTok = highlightWindow(newLines, lang, theme, newSpan.from, newSpan.to);
|
|
33153
|
+
const out = new Array(rows.length);
|
|
33154
|
+
for (let i = first; i < last; i += 1) {
|
|
33155
|
+
const row = rows[i];
|
|
33156
|
+
if (row.kind === "del") out[i] = oldTok?.[oldAt[i]] ?? [{
|
|
32828
33157
|
text: row.text,
|
|
32829
33158
|
color: void 0
|
|
32830
33159
|
}];
|
|
32831
|
-
if (row.kind === "add" || row.kind === "context")
|
|
33160
|
+
else if (row.kind === "add" || row.kind === "context") out[i] = newTok?.[newAt[i]] ?? [{
|
|
32832
33161
|
text: row.text,
|
|
32833
33162
|
color: void 0
|
|
32834
33163
|
}];
|
|
32835
|
-
|
|
33164
|
+
else out[i] = [{
|
|
32836
33165
|
text: row.text,
|
|
32837
33166
|
color: void 0
|
|
32838
33167
|
}];
|
|
32839
|
-
}
|
|
32840
|
-
|
|
32841
|
-
//#endregion
|
|
32842
|
-
//#region src/client/idle-value.ts
|
|
32843
|
-
/**
|
|
32844
|
-
* A value that lags its source until the source stops changing.
|
|
32845
|
-
*
|
|
32846
|
-
* Syntax highlighting is the reason this exists. Recomputing it per keystroke
|
|
32847
|
-
* costs 42ms on a thousand-line file and scales linearly, so a fast typist
|
|
32848
|
-
* spends the whole session behind the main thread. CodeMirror maps its
|
|
32849
|
-
* existing decorations through document changes, so the colours already ride
|
|
32850
|
-
* along with the text while this waits — the repaint only has to be prompt
|
|
32851
|
-
* enough that the reader never notices the last few characters were plain.
|
|
32852
|
-
*
|
|
32853
|
-
* Not a pure function, so no unit test: it is six lines of standard React and
|
|
32854
|
-
* its behaviour is a timer. The rules it implements are stated above.
|
|
32855
|
-
*
|
|
32856
|
-
* @module @young1lin/dsh-ui-gitworkbench/client/idle-value
|
|
32857
|
-
*/
|
|
32858
|
-
/**
|
|
32859
|
-
* @param value - the live value.
|
|
32860
|
-
* @param ms - how long the value must hold still before it is adopted.
|
|
32861
|
-
* @returns the last value that stayed put for `ms`.
|
|
32862
|
-
*/
|
|
32863
|
-
function useIdleValue(value, ms) {
|
|
32864
|
-
const [held, setHeld] = (0, react.useState)(value);
|
|
32865
|
-
(0, react.useEffect)(() => {
|
|
32866
|
-
if (Object.is(held, value)) return;
|
|
32867
|
-
const timer = setTimeout(() => {
|
|
32868
|
-
setHeld(value);
|
|
32869
|
-
}, ms);
|
|
32870
|
-
return () => {
|
|
32871
|
-
clearTimeout(timer);
|
|
32872
|
-
};
|
|
32873
|
-
}, [
|
|
32874
|
-
value,
|
|
32875
|
-
ms,
|
|
32876
|
-
held
|
|
32877
|
-
]);
|
|
32878
|
-
return held;
|
|
33168
|
+
}
|
|
33169
|
+
return out;
|
|
32879
33170
|
}
|
|
32880
33171
|
/**
|
|
32881
|
-
* Lines past which a file is shown uncoloured.
|
|
32882
|
-
*
|
|
32883
|
-
* Shiki costs about 0.3ms a line, and that is the whole-file pass alone — the
|
|
32884
|
-
* floor, not an implementation detail we can tune away. Measured: 155ms at 500
|
|
32885
|
-
* lines, 620ms at 2000, 1537ms at 5000. Debouncing keeps a burst of typing to
|
|
32886
|
-
* one repaint, but it cannot make one repaint cheap, and a 1.5-second freeze
|
|
32887
|
-
* every time the reader pauses is worse than plain text.
|
|
32888
|
-
*
|
|
32889
|
-
* So above this the file renders without colour and says so. The honest fix is
|
|
32890
|
-
* to highlight only the viewport, which needs the tokens to be computed where
|
|
32891
|
-
* the scroll position is known rather than in the pane; this cap is what holds
|
|
32892
|
-
* until then.
|
|
32893
|
-
*/
|
|
32894
|
-
const HIGHLIGHT_LINE_CAP = 2e3;
|
|
32895
|
-
/**
|
|
32896
33172
|
* The file's own indentation unit, learned from its lines.
|
|
32897
33173
|
*
|
|
32898
33174
|
* Tabs win on count, because a single tab-indented line is unambiguous while
|
|
@@ -32959,13 +33235,6 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
32959
33235
|
*
|
|
32960
33236
|
* @module @young1lin/dsh-ui-gitworkbench/client/FileBrowser
|
|
32961
33237
|
*/
|
|
32962
|
-
/** Count lines without allocating the split — the buffer can be megabytes and
|
|
32963
|
-
* this runs on a timer while somebody is typing. */
|
|
32964
|
-
function countLines(text) {
|
|
32965
|
-
let n = 1;
|
|
32966
|
-
for (let i = text.indexOf(String.fromCharCode(10)); i !== -1; i = text.indexOf(String.fromCharCode(10), i + 1)) n += 1;
|
|
32967
|
-
return n;
|
|
32968
|
-
}
|
|
32969
33238
|
/** Most search hits rendered at once — a one-letter query must not paint a
|
|
32970
33239
|
* whole repository into the DOM. */
|
|
32971
33240
|
const SEARCH_CAP = 300;
|
|
@@ -33019,7 +33288,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
33019
33288
|
* successfully shown is dropped in silence instead.
|
|
33020
33289
|
*/
|
|
33021
33290
|
const shownRef = (0, react.useRef)(/* @__PURE__ */ new Set());
|
|
33022
|
-
const [, setGrammarTick] = (0, react.useState)(0);
|
|
33291
|
+
const [grammarTick, setGrammarTick] = (0, react.useState)(0);
|
|
33023
33292
|
const dirty = isDirty(edit);
|
|
33024
33293
|
(0, react.useEffect)(() => subscribeGrammarLoaded(() => {
|
|
33025
33294
|
setGrammarTick((n) => n + 1);
|
|
@@ -33240,14 +33509,30 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
33240
33509
|
} : null, [shot]) ?? (asSource ? null : svg);
|
|
33241
33510
|
const showingImage = picture !== null;
|
|
33242
33511
|
const showBlame = blameOn && !dirty && !showingImage;
|
|
33243
|
-
|
|
33244
|
-
|
|
33245
|
-
|
|
33246
|
-
|
|
33247
|
-
|
|
33248
|
-
|
|
33512
|
+
edit.buffer;
|
|
33513
|
+
/**
|
|
33514
|
+
* What the editor paints, asked for a range at a time.
|
|
33515
|
+
*
|
|
33516
|
+
* It used to be a Shiki pass over the WHOLE buffer, debounced so the reader
|
|
33517
|
+
* only felt it when they paused — 1,637ms on 1,837 lines of real TypeScript,
|
|
33518
|
+
* and files past 2,000 lines were given no colour at all rather than made to
|
|
33519
|
+
* wait for it. The editor now asks for the lines it is about to show, and
|
|
33520
|
+
* `token-cache.ts` remembers them, so length stopped being the question and
|
|
33521
|
+
* the cap could go.
|
|
33522
|
+
*
|
|
33523
|
+
* Keyed on the path: an edit inside the file invalidates the chunks it
|
|
33524
|
+
* actually moved, which is what the chunk stamps are for.
|
|
33525
|
+
*/
|
|
33526
|
+
const paint = (0, react.useMemo)(() => {
|
|
33527
|
+
const lang = shikiLangOf(open ?? "");
|
|
33528
|
+
if (lang === void 0) return null;
|
|
33529
|
+
const theme = shikiThemeOf(palette);
|
|
33530
|
+
const key = "files:" + (open ?? "");
|
|
33531
|
+
return (lines, from, to) => highlightRange(key, lines, lang, theme, from, to);
|
|
33532
|
+
}, [
|
|
33249
33533
|
open,
|
|
33250
|
-
palette
|
|
33534
|
+
palette,
|
|
33535
|
+
grammarTick
|
|
33251
33536
|
]);
|
|
33252
33537
|
const indent = (0, react.useMemo)(() => detectIndent(edit.baseText), [edit.baseText]);
|
|
33253
33538
|
/** Open a file, revealing it in the tree — and asking first if the buffer
|
|
@@ -33482,10 +33767,6 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
33482
33767
|
className: GitWorkbenchPanel_module_css_default.sideNotice,
|
|
33483
33768
|
children: saveFailed
|
|
33484
33769
|
}) : null,
|
|
33485
|
-
tooBigToPaint ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
33486
|
-
className: GitWorkbenchPanel_module_css_default.sideNotice,
|
|
33487
|
-
children: t("paintTooLarge")
|
|
33488
|
-
}) : null,
|
|
33489
33770
|
blameOn && dirty ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
33490
33771
|
className: GitWorkbenchPanel_module_css_default.sideNotice,
|
|
33491
33772
|
children: t("blameWhileEditing")
|
|
@@ -33588,7 +33869,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
33588
33869
|
buffer: next
|
|
33589
33870
|
}));
|
|
33590
33871
|
},
|
|
33591
|
-
|
|
33872
|
+
paint,
|
|
33592
33873
|
indent,
|
|
33593
33874
|
ariaLabel: open,
|
|
33594
33875
|
onSave: () => {
|
|
@@ -33607,6 +33888,45 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
33607
33888
|
] });
|
|
33608
33889
|
}
|
|
33609
33890
|
//#endregion
|
|
33891
|
+
//#region src/client/idle-value.ts
|
|
33892
|
+
/**
|
|
33893
|
+
* A value that lags its source until the source stops changing.
|
|
33894
|
+
*
|
|
33895
|
+
* Syntax highlighting is the reason this exists. Recomputing it per keystroke
|
|
33896
|
+
* costs 42ms on a thousand-line file and scales linearly, so a fast typist
|
|
33897
|
+
* spends the whole session behind the main thread. CodeMirror maps its
|
|
33898
|
+
* existing decorations through document changes, so the colours already ride
|
|
33899
|
+
* along with the text while this waits — the repaint only has to be prompt
|
|
33900
|
+
* enough that the reader never notices the last few characters were plain.
|
|
33901
|
+
*
|
|
33902
|
+
* Not a pure function, so no unit test: it is six lines of standard React and
|
|
33903
|
+
* its behaviour is a timer. The rules it implements are stated above.
|
|
33904
|
+
*
|
|
33905
|
+
* @module @young1lin/dsh-ui-gitworkbench/client/idle-value
|
|
33906
|
+
*/
|
|
33907
|
+
/**
|
|
33908
|
+
* @param value - the live value.
|
|
33909
|
+
* @param ms - how long the value must hold still before it is adopted.
|
|
33910
|
+
* @returns the last value that stayed put for `ms`.
|
|
33911
|
+
*/
|
|
33912
|
+
function useIdleValue(value, ms) {
|
|
33913
|
+
const [held, setHeld] = (0, react.useState)(value);
|
|
33914
|
+
(0, react.useEffect)(() => {
|
|
33915
|
+
if (Object.is(held, value)) return;
|
|
33916
|
+
const timer = setTimeout(() => {
|
|
33917
|
+
setHeld(value);
|
|
33918
|
+
}, ms);
|
|
33919
|
+
return () => {
|
|
33920
|
+
clearTimeout(timer);
|
|
33921
|
+
};
|
|
33922
|
+
}, [
|
|
33923
|
+
value,
|
|
33924
|
+
ms,
|
|
33925
|
+
held
|
|
33926
|
+
]);
|
|
33927
|
+
return held;
|
|
33928
|
+
}
|
|
33929
|
+
//#endregion
|
|
33610
33930
|
//#region src/client/commit-graph.ts
|
|
33611
33931
|
/**
|
|
33612
33932
|
* Assign lanes to a page of commits.
|
|
@@ -39037,16 +39357,21 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
39037
39357
|
const grammarGen = (0, react.useSyncExternalStore)(subscribeGrammarLoaded, grammarLoadCount);
|
|
39038
39358
|
const rowsWithWords = (0, react.useMemo)(() => attachWordRanges(parseRows(segment)), [segment]);
|
|
39039
39359
|
const sides = (0, react.useMemo)(() => gutterSides(rowsWithWords), [rowsWithWords]);
|
|
39040
|
-
const
|
|
39360
|
+
const scrollRef = (0, react.useRef)(null);
|
|
39361
|
+
const win = useRowWindow(scrollRef, rowsWithWords.length);
|
|
39362
|
+
const syntax = (0, react.useMemo)(() => highlightForRowsWindow(rowsWithWords, lang, shikiTheme, win.start, win.end), [
|
|
39041
39363
|
rowsWithWords,
|
|
39042
39364
|
lang,
|
|
39043
39365
|
shikiTheme,
|
|
39366
|
+
win.start,
|
|
39367
|
+
win.end,
|
|
39044
39368
|
grammarGen
|
|
39045
39369
|
]);
|
|
39046
39370
|
const blocks = (0, react.useMemo)(() => unifiedBlocks(rowsWithWords.map((row) => row.kind)), [rowsWithWords]);
|
|
39047
39371
|
const changes = (0, react.useMemo)(() => countBlocks(blocks), [blocks]);
|
|
39048
|
-
const
|
|
39049
|
-
|
|
39372
|
+
const blocksForNav = (0, react.useRef)(blocks);
|
|
39373
|
+
blocksForNav.current = blocks;
|
|
39374
|
+
const { goToChange } = useChangeNav(scrollRef, (0, react.useCallback)(() => blockTopsFromRows(blocksForNav.current, 20, 8), []));
|
|
39050
39375
|
const walk = (0, react.useRef)(goToChange);
|
|
39051
39376
|
walk.current = goToChange;
|
|
39052
39377
|
(0, react.useEffect)(() => {
|
|
@@ -39096,30 +39421,45 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
39096
39421
|
ref: scrollRef,
|
|
39097
39422
|
className: GitWorkbenchPanel_module_css_default.diffScroll,
|
|
39098
39423
|
tabIndex: -1,
|
|
39099
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.
|
|
39424
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("pre", {
|
|
39100
39425
|
className: GitWorkbenchPanel_module_css_default.diffPre,
|
|
39101
|
-
children:
|
|
39102
|
-
|
|
39103
|
-
|
|
39104
|
-
|
|
39105
|
-
|
|
39106
|
-
|
|
39107
|
-
|
|
39108
|
-
|
|
39109
|
-
|
|
39110
|
-
className: GitWorkbenchPanel_module_css_default.
|
|
39111
|
-
|
|
39112
|
-
|
|
39113
|
-
|
|
39114
|
-
|
|
39115
|
-
|
|
39116
|
-
|
|
39117
|
-
|
|
39118
|
-
|
|
39119
|
-
|
|
39120
|
-
|
|
39121
|
-
|
|
39122
|
-
|
|
39426
|
+
children: [
|
|
39427
|
+
win.padTop > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
39428
|
+
className: GitWorkbenchPanel_module_css_default.diffSpacer,
|
|
39429
|
+
style: { height: `${win.padTop}px` },
|
|
39430
|
+
"aria-hidden": "true"
|
|
39431
|
+
}) : null,
|
|
39432
|
+
rowsWithWords.slice(win.start, win.end).map((row, k) => {
|
|
39433
|
+
const i = win.start + k;
|
|
39434
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
39435
|
+
className: `${GitWorkbenchPanel_module_css_default.line} ${rowClass(row.kind)}`,
|
|
39436
|
+
"data-block": blocks[i] >= 0 ? blocks[i] : void 0,
|
|
39437
|
+
children: [
|
|
39438
|
+
sides.old ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
39439
|
+
className: GitWorkbenchPanel_module_css_default.lnOld,
|
|
39440
|
+
children: row.kind === "add" || row.kind === "hunk" ? "" : row.oldL
|
|
39441
|
+
}) : null,
|
|
39442
|
+
sides.new ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
39443
|
+
className: GitWorkbenchPanel_module_css_default.lnNew,
|
|
39444
|
+
children: row.kind === "del" || row.kind === "hunk" ? "" : row.newL
|
|
39445
|
+
}) : null,
|
|
39446
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
39447
|
+
className: `${GitWorkbenchPanel_module_css_default.gutter} ${row.kind === "add" ? GitWorkbenchPanel_module_css_default.signAdd : row.kind === "del" ? GitWorkbenchPanel_module_css_default.signDel : ""}`,
|
|
39448
|
+
children: row.kind === "add" ? "+" : row.kind === "del" ? "−" : ""
|
|
39449
|
+
}),
|
|
39450
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
39451
|
+
className: GitWorkbenchPanel_module_css_default.code,
|
|
39452
|
+
children: renderCode(row, syntax[i] ?? [])
|
|
39453
|
+
})
|
|
39454
|
+
]
|
|
39455
|
+
}, i);
|
|
39456
|
+
}),
|
|
39457
|
+
win.padBottom > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
39458
|
+
className: GitWorkbenchPanel_module_css_default.diffSpacer,
|
|
39459
|
+
style: { height: `${win.padBottom}px` },
|
|
39460
|
+
"aria-hidden": "true"
|
|
39461
|
+
}) : null
|
|
39462
|
+
]
|
|
39123
39463
|
})
|
|
39124
39464
|
})]
|
|
39125
39465
|
});
|
|
@@ -39274,18 +39614,21 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
39274
39614
|
onDirtyChange(false);
|
|
39275
39615
|
};
|
|
39276
39616
|
}, [dirty, onDirtyChange]);
|
|
39277
|
-
|
|
39617
|
+
(0, react.useMemo)(() => edit.buffer.split("\n"), [edit.buffer]);
|
|
39278
39618
|
const indentOfBuffer = (0, react.useMemo)(() => detectIndent(edit.baseText), [edit.baseText]);
|
|
39279
39619
|
const indexText = (0, react.useMemo)(() => {
|
|
39280
39620
|
const left = rows.filter((row) => row.left !== null).map((row) => row.left.text);
|
|
39281
39621
|
return left.length === 0 ? "" : left.join("\n") + "\n";
|
|
39282
39622
|
}, [rows]);
|
|
39283
|
-
const
|
|
39284
|
-
|
|
39285
|
-
|
|
39286
|
-
|
|
39623
|
+
const editPaint = (0, react.useMemo)(() => {
|
|
39624
|
+
if (lang === void 0) return null;
|
|
39625
|
+
const key = "buffer:" + statsPath + ":" + path;
|
|
39626
|
+
return (lines, from, to) => highlightRange(key, lines, lang, shikiTheme, from, to);
|
|
39627
|
+
}, [
|
|
39287
39628
|
lang,
|
|
39288
39629
|
shikiTheme,
|
|
39630
|
+
statsPath,
|
|
39631
|
+
path,
|
|
39289
39632
|
grammarGen
|
|
39290
39633
|
]);
|
|
39291
39634
|
const leftRows = (0, react.useMemo)(() => rows.map((row, i) => ({
|
|
@@ -39731,7 +40074,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
39731
40074
|
buffer: next
|
|
39732
40075
|
}));
|
|
39733
40076
|
},
|
|
39734
|
-
|
|
40077
|
+
paint: editPaint,
|
|
39735
40078
|
indent: indentOfBuffer,
|
|
39736
40079
|
ariaLabel: path,
|
|
39737
40080
|
onSave: () => {
|
|
@@ -39987,7 +40330,6 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
39987
40330
|
fileReadOnlyCrlf: "这个文件的行尾是 CRLF,只能查看不能编辑(编辑器会把行尾统一成 LF,保存时整份文件都会被改写)。",
|
|
39988
40331
|
fileReadOnlyEncoding: "这个文件不是 UTF-8 编码,只能查看不能编辑:页面上的文字是一次有损解码,保存回去会改写每一个非 ASCII 字节。",
|
|
39989
40332
|
blameLine: "第 {line} 行",
|
|
39990
|
-
paintTooLarge: "文件较长,已关闭语法上色(整文件上色每次要一秒以上,每次停手都卡一下比纯文本更难用)。编辑、保存、追溯不受影响。",
|
|
39991
40333
|
blameInHistory: "他在本文件的提交",
|
|
39992
40334
|
blamePick: "点左边的名字,看那一行是哪个提交改的",
|
|
39993
40335
|
blameWhileEditing: "正在编辑,追溯已暂时收起:改过的行号已经对不上它背后的提交。保存或放弃后会重新出现。",
|
|
@@ -40199,7 +40541,6 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
40199
40541
|
fileReadOnlyCrlf: "This file uses CRLF line endings, so it opens read-only (the editor normalises them to LF, and a save would rewrite every line).",
|
|
40200
40542
|
fileReadOnlyEncoding: "This file is not UTF-8, so it opens read-only: the text shown is a lossy decode, and saving it back would rewrite every non-ASCII byte.",
|
|
40201
40543
|
blameLine: "Line {line}",
|
|
40202
|
-
paintTooLarge: "This file is long, so syntax colouring is off (a full repaint costs over a second, and a freeze on every pause is worse than plain text). Editing, saving and blame are unaffected.",
|
|
40203
40544
|
blameInHistory: "Their commits on this file",
|
|
40204
40545
|
blamePick: "Click a name to see which commit changed that line",
|
|
40205
40546
|
blameWhileEditing: "Blame is hidden while you type: edited line numbers no longer match the commits behind them. It returns once you save or revert.",
|