@young1lin/dsh-ui-gitworkbench 0.1.6 → 0.1.8
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/CHANGELOG.md +23 -0
- package/CHANGELOG_EN.md +24 -0
- package/lib/client.js +836 -413
- package/lib/index.js +48 -28
- package/package.json +1 -1
- package/src/client/GitWorkbenchPanel.module.css +46 -9
- package/src/client/GitWorkbenchPanel.tsx +366 -98
- package/src/client/diff-nav.ts +28 -0
- package/src/client/highlight.ts +56 -0
- package/src/client/history-layout.ts +52 -0
- package/src/client/index.ts +10 -2
- package/src/client/locales.ts +8 -0
- package/src/client/row-window.ts +132 -0
- package/src/client/use-change-nav.ts +19 -9
- package/src/index.ts +46 -25
package/lib/client.js
CHANGED
|
@@ -811,6 +811,32 @@ window.__ModuleLoader__.load({
|
|
|
811
811
|
for (const id of ids) if (id > top) top = id;
|
|
812
812
|
return top + 1;
|
|
813
813
|
}
|
|
814
|
+
/**
|
|
815
|
+
* Where each change block sits, derived from the rows rather than measured.
|
|
816
|
+
*
|
|
817
|
+
* A windowed pane cannot measure: the block being walked to usually has no
|
|
818
|
+
* element, because the whole point is that it is not on screen. The rows are a
|
|
819
|
+
* fixed height there by construction, so the position is arithmetic.
|
|
820
|
+
*
|
|
821
|
+
* @param blocks - each row's block id, `-1` for a row that is not part of one.
|
|
822
|
+
* @param rowH - row height in px.
|
|
823
|
+
* @param offset - px above the first row, e.g. the grid's top padding.
|
|
824
|
+
* @returns the first row of each block, in the order the blocks appear.
|
|
825
|
+
*/
|
|
826
|
+
function blockTopsFromRows(blocks, rowH, offset = 0) {
|
|
827
|
+
const tops = [];
|
|
828
|
+
const seen = /* @__PURE__ */ new Set();
|
|
829
|
+
for (let i = 0; i < blocks.length; i += 1) {
|
|
830
|
+
const block = blocks[i];
|
|
831
|
+
if (!Number.isInteger(block) || block < 0 || seen.has(block)) continue;
|
|
832
|
+
seen.add(block);
|
|
833
|
+
tops.push({
|
|
834
|
+
block,
|
|
835
|
+
top: offset + i * rowH
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
return tops;
|
|
839
|
+
}
|
|
814
840
|
//#endregion
|
|
815
841
|
//#region src/client/pane-size.ts
|
|
816
842
|
/** Sub-pixel tolerance: two boxes a third of a pixel apart are touching. */
|
|
@@ -844,6 +870,92 @@ window.__ModuleLoader__.load({
|
|
|
844
870
|
const max = Math.max(min, drawer - other - minDiff);
|
|
845
871
|
return Math.min(Math.max(next, min), max);
|
|
846
872
|
}
|
|
873
|
+
/**
|
|
874
|
+
* A viewport height to assume before the scroller has been measured.
|
|
875
|
+
*
|
|
876
|
+
* The first paint happens before any layout effect runs. Rendering nothing
|
|
877
|
+
* until the height is known would flash an empty pane; a screenful is both
|
|
878
|
+
* safe and close.
|
|
879
|
+
*/
|
|
880
|
+
const ASSUMED_VIEWPORT_PX = 1200;
|
|
881
|
+
/**
|
|
882
|
+
* @param value - a number from the DOM, which can be NaN or negative.
|
|
883
|
+
* @param fallback - used when it is neither finite nor usable.
|
|
884
|
+
* @returns a finite, non-negative number.
|
|
885
|
+
*/
|
|
886
|
+
function sane(value, fallback) {
|
|
887
|
+
return Number.isFinite(value) && value > 0 ? value : fallback;
|
|
888
|
+
}
|
|
889
|
+
/**
|
|
890
|
+
* The window of rows to render for a given scroll position.
|
|
891
|
+
*
|
|
892
|
+
* @param scrollTop - the scroller's current offset in px.
|
|
893
|
+
* @param viewportH - the scroller's visible height in px; 0 before it is measured.
|
|
894
|
+
* @param rowCount - how many rows the file has.
|
|
895
|
+
* @param rowH - row height in px.
|
|
896
|
+
* @param overscan - rows to keep beyond each edge.
|
|
897
|
+
* @returns the rows to render and the spacer heights standing in for the rest.
|
|
898
|
+
*/
|
|
899
|
+
function rowWindow(scrollTop, viewportH, rowCount, rowH = 20, overscan = 40) {
|
|
900
|
+
const rows = Math.max(0, Math.trunc(rowCount));
|
|
901
|
+
const height = sane(rowH, 20);
|
|
902
|
+
if (rows <= 400) return {
|
|
903
|
+
start: 0,
|
|
904
|
+
end: rows,
|
|
905
|
+
padTop: 0,
|
|
906
|
+
padBottom: 0
|
|
907
|
+
};
|
|
908
|
+
const top = Number.isFinite(scrollTop) && scrollTop > 0 ? scrollTop : 0;
|
|
909
|
+
const view = sane(viewportH, ASSUMED_VIEWPORT_PX);
|
|
910
|
+
const pad = Math.max(0, Math.trunc(overscan));
|
|
911
|
+
const first = Math.max(0, Math.floor(top / height) - pad);
|
|
912
|
+
const last = Math.min(rows, Math.ceil((top + view) / height) + pad);
|
|
913
|
+
const start = Math.min(first, rows);
|
|
914
|
+
const end = Math.max(start, last);
|
|
915
|
+
return {
|
|
916
|
+
start,
|
|
917
|
+
end,
|
|
918
|
+
padTop: start * height,
|
|
919
|
+
padBottom: (rows - end) * height
|
|
920
|
+
};
|
|
921
|
+
}
|
|
922
|
+
//#endregion
|
|
923
|
+
//#region src/client/history-layout.ts
|
|
924
|
+
/** Every layout, in the order the switch offers them. */
|
|
925
|
+
const HISTORY_LAYOUTS = ["columns", "stacked"];
|
|
926
|
+
/** The arrangement the tab had first, and what a reader who never touches the
|
|
927
|
+
* switch gets. */
|
|
928
|
+
const DEFAULT_HISTORY_LAYOUT = "columns";
|
|
929
|
+
/**
|
|
930
|
+
* Narrow a stored value to a layout this build has.
|
|
931
|
+
*
|
|
932
|
+
* Storage is a durable boundary: the value on disk was written by whatever
|
|
933
|
+
* build the reader ran last, and a layout this one has since dropped must fall
|
|
934
|
+
* back rather than reach the stylesheet.
|
|
935
|
+
* @param value - value read back from storage.
|
|
936
|
+
* @returns whether it names a layout.
|
|
937
|
+
*/
|
|
938
|
+
function isHistoryLayout(value) {
|
|
939
|
+
return HISTORY_LAYOUTS.some((known) => known === value);
|
|
940
|
+
}
|
|
941
|
+
/**
|
|
942
|
+
* How tall one commit row is, per layout.
|
|
943
|
+
*
|
|
944
|
+
* The two differ because the row itself differs: a column has no width to
|
|
945
|
+
* spend, so the hash, the author and the date take a line of their own above
|
|
946
|
+
* the subject; spanning the drawer they all fit on one line and a 48px row
|
|
947
|
+
* would spend the stacked layout's scarcest axis on padding.
|
|
948
|
+
*
|
|
949
|
+
* This is the ONE home for the number. The panel publishes the active entry as
|
|
950
|
+
* `--gs-commit-row` and the stylesheet sizes the row from it, while the lane
|
|
951
|
+
* graph draws each row's segment exactly that tall — the lanes only meet across
|
|
952
|
+
* the seam between rows if both come from here. Guarded by
|
|
953
|
+
* `tests/commit-row-height.test.ts`.
|
|
954
|
+
*/
|
|
955
|
+
const COMMIT_ROW_H = {
|
|
956
|
+
columns: 48,
|
|
957
|
+
stacked: 28
|
|
958
|
+
};
|
|
847
959
|
//#endregion
|
|
848
960
|
//#region src/client/use-change-nav.ts
|
|
849
961
|
/**
|
|
@@ -866,20 +978,27 @@ window.__ModuleLoader__.load({
|
|
|
866
978
|
/**
|
|
867
979
|
* @param scrollRef - the element that scrolls, and the one whose subtree
|
|
868
980
|
* carries the `data-block` marks.
|
|
981
|
+
* @param tops - where the blocks are, when the caller can say. A WINDOWED pane
|
|
982
|
+
* must supply this: it renders only the rows near the viewport, so the block
|
|
983
|
+
* the reader is walking to usually has no DOM to measure. Omitted, the
|
|
984
|
+
* positions are measured off the `data-block` marks as before.
|
|
869
985
|
*/
|
|
870
|
-
function useChangeNav(scrollRef) {
|
|
986
|
+
function useChangeNav(scrollRef, tops) {
|
|
871
987
|
/** What the last press landed on. A ref, not state: it exists to make the
|
|
872
988
|
* NEXT press correct, and nothing on screen reads it. */
|
|
873
989
|
const navMemory = (0, react.useRef)(null);
|
|
874
990
|
/**
|
|
875
991
|
* Every change block's position inside the scrolled content.
|
|
876
992
|
*
|
|
877
|
-
*
|
|
878
|
-
* which rows changed, not how many
|
|
879
|
-
*
|
|
880
|
-
*
|
|
881
|
-
*
|
|
882
|
-
*
|
|
993
|
+
* The fallback, for a pane that renders all of its rows. Measuring is the
|
|
994
|
+
* more general answer — a model knows which rows changed, not how many
|
|
995
|
+
* pixels down the page they sit, and the rows are never the only thing in
|
|
996
|
+
* the scroller. One layout read per PRESS is cheap; nothing here runs on
|
|
997
|
+
* scroll.
|
|
998
|
+
*
|
|
999
|
+
* It stops being available the moment a pane renders only part of its rows,
|
|
1000
|
+
* which is why `tops` exists: what is not in the DOM cannot be measured, and
|
|
1001
|
+
* a walk that skips every change outside the viewport is worse than no walk.
|
|
883
1002
|
*
|
|
884
1003
|
* `offsetTop` is deliberately not used: it is relative to whichever ancestor
|
|
885
1004
|
* happens to be positioned, which no rule in the stylesheet guarantees.
|
|
@@ -905,8 +1024,8 @@ window.__ModuleLoader__.load({
|
|
|
905
1024
|
const goToChange = (direction) => {
|
|
906
1025
|
const scroller = scrollRef.current;
|
|
907
1026
|
if (scroller === null) return;
|
|
908
|
-
const
|
|
909
|
-
const target = stepToBlock(
|
|
1027
|
+
const measured = tops === void 0 ? blockTops() : tops();
|
|
1028
|
+
const target = stepToBlock(measured, anchorFrom(measured, scroller.scrollTop, navMemory.current), direction);
|
|
910
1029
|
if (target === null) return;
|
|
911
1030
|
scroller.scrollTop = scrollTopFor(target.top);
|
|
912
1031
|
navMemory.current = {
|
|
@@ -1102,7 +1221,7 @@ window.__ModuleLoader__.load({
|
|
|
1102
1221
|
}
|
|
1103
1222
|
//#endregion
|
|
1104
1223
|
//#region \0dsh-css:src/client/GitWorkbenchPanel.module.css.mjs
|
|
1105
|
-
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: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{flex:none;align-items:stretch;height:28px;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_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_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{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{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{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{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_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_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}";
|
|
1106
1225
|
const tagId = "@young1lin/dsh-ui-gitworkbench/GitWorkbenchPanel.module.css";
|
|
1107
1226
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
1108
1227
|
const tag = document.createElement("style");
|
|
@@ -1112,325 +1231,331 @@ window.__ModuleLoader__.load({
|
|
|
1112
1231
|
document.head.appendChild(tag);
|
|
1113
1232
|
}
|
|
1114
1233
|
var GitWorkbenchPanel_module_css_default = {
|
|
1115
|
-
"
|
|
1116
|
-
"
|
|
1234
|
+
"cardAdded": "SD8qLW_cardAdded",
|
|
1235
|
+
"header": "SD8qLW_header",
|
|
1236
|
+
"blockBtn": "SD8qLW_blockBtn",
|
|
1237
|
+
"sideNum": "SD8qLW_sideNum",
|
|
1238
|
+
"btnDanger": "SD8qLW_btnDanger",
|
|
1239
|
+
"cardFiles": "SD8qLW_cardFiles",
|
|
1240
|
+
"cardBranchName": "SD8qLW_cardBranchName",
|
|
1241
|
+
"drawer": "SD8qLW_drawer",
|
|
1242
|
+
"tab": "SD8qLW_tab",
|
|
1243
|
+
"confirmScrim": "SD8qLW_confirmScrim",
|
|
1117
1244
|
"swatch": "SD8qLW_swatch",
|
|
1118
|
-
"filterChip": "SD8qLW_filterChip",
|
|
1119
|
-
"stUntracked": "SD8qLW_stUntracked",
|
|
1120
|
-
"stDeleted": "SD8qLW_stDeleted",
|
|
1121
|
-
"lineContext": "SD8qLW_lineContext",
|
|
1122
|
-
"themeDirty": "SD8qLW_themeDirty",
|
|
1123
|
-
"overlayMax": "SD8qLW_overlayMax",
|
|
1124
|
-
"calTitle": "SD8qLW_calTitle",
|
|
1125
|
-
"headerLeft": "SD8qLW_headerLeft",
|
|
1126
|
-
"elideTail": "SD8qLW_elideTail",
|
|
1127
1245
|
"graphCell": "SD8qLW_graphCell",
|
|
1128
|
-
"
|
|
1129
|
-
"fbList": "SD8qLW_fbList",
|
|
1130
|
-
"refRowName": "SD8qLW_refRowName",
|
|
1131
|
-
"fileCountAdd": "SD8qLW_fileCountAdd",
|
|
1132
|
-
"refEmpty": "SD8qLW_refEmpty",
|
|
1133
|
-
"line": "SD8qLW_line",
|
|
1134
|
-
"sideCols": "SD8qLW_sideCols",
|
|
1135
|
-
"pullGroup": "SD8qLW_pullGroup",
|
|
1136
|
-
"commitLine": "SD8qLW_commitLine",
|
|
1137
|
-
"treeDirName": "SD8qLW_treeDirName",
|
|
1138
|
-
"sideNotice": "SD8qLW_sideNotice",
|
|
1139
|
-
"treeEmpty": "SD8qLW_treeEmpty",
|
|
1140
|
-
"headerViewRef": "SD8qLW_headerViewRef",
|
|
1141
|
-
"sideNumAdd": "SD8qLW_sideNumAdd",
|
|
1142
|
-
"cardGlyph": "SD8qLW_cardGlyph",
|
|
1143
|
-
"pathDirGlyph": "SD8qLW_pathDirGlyph",
|
|
1144
|
-
"commitMessage": "SD8qLW_commitMessage",
|
|
1145
|
-
"fbFileName": "SD8qLW_fbFileName",
|
|
1146
|
-
"commitPopSubject": "SD8qLW_commitPopSubject",
|
|
1147
|
-
"imgStage": "SD8qLW_imgStage",
|
|
1148
|
-
"paletteRowActive": "SD8qLW_paletteRowActive",
|
|
1149
|
-
"funnelBoundKey": "SD8qLW_funnelBoundKey",
|
|
1150
|
-
"commitPopBody": "SD8qLW_commitPopBody",
|
|
1151
|
-
"funnelCount": "SD8qLW_funnelCount",
|
|
1152
|
-
"cardBranchName": "SD8qLW_cardBranchName",
|
|
1153
|
-
"funnelRow": "SD8qLW_funnelRow",
|
|
1154
|
-
"sideBannerActs": "SD8qLW_sideBannerActs",
|
|
1155
|
-
"tabs": "SD8qLW_tabs",
|
|
1156
|
-
"syncBar": "SD8qLW_syncBar",
|
|
1157
|
-
"funnelBoundVal": "SD8qLW_funnelBoundVal",
|
|
1158
|
-
"cssArea": "SD8qLW_cssArea",
|
|
1159
|
-
"imgCaption": "SD8qLW_imgCaption",
|
|
1160
|
-
"funnelTabActive": "SD8qLW_funnelTabActive",
|
|
1161
|
-
"funnelList": "SD8qLW_funnelList",
|
|
1162
|
-
"headerTotalsDim": "SD8qLW_headerTotalsDim",
|
|
1163
|
-
"cardSep": "SD8qLW_cardSep",
|
|
1246
|
+
"btnAhead": "SD8qLW_btnAhead",
|
|
1164
1247
|
"themeGroup": "SD8qLW_themeGroup",
|
|
1165
|
-
"paneTitle": "SD8qLW_paneTitle",
|
|
1166
|
-
"sideCol": "SD8qLW_sideCol",
|
|
1167
|
-
"themeLabel": "SD8qLW_themeLabel",
|
|
1168
|
-
"cal": "SD8qLW_cal",
|
|
1169
|
-
"funnelCaption": "SD8qLW_funnelCaption",
|
|
1170
|
-
"themeRowSplit": "SD8qLW_themeRowSplit",
|
|
1171
1248
|
"scopeBtnActive": "SD8qLW_scopeBtnActive",
|
|
1172
|
-
"
|
|
1173
|
-
"
|
|
1174
|
-
"
|
|
1175
|
-
"
|
|
1176
|
-
"
|
|
1177
|
-
"
|
|
1178
|
-
"
|
|
1179
|
-
"
|
|
1180
|
-
"
|
|
1181
|
-
"
|
|
1182
|
-
"commitWhen": "SD8qLW_commitWhen",
|
|
1183
|
-
"diffPre": "SD8qLW_diffPre",
|
|
1184
|
-
"fileLi": "SD8qLW_fileLi",
|
|
1249
|
+
"theme": "SD8qLW_theme",
|
|
1250
|
+
"commitsFoot": "SD8qLW_commitsFoot",
|
|
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",
|
|
1185
1259
|
"lnNew": "SD8qLW_lnNew",
|
|
1186
|
-
"
|
|
1187
|
-
"
|
|
1188
|
-
"wordAdd": "SD8qLW_wordAdd",
|
|
1189
|
-
"treeIconDown": "SD8qLW_treeIconDown",
|
|
1190
|
-
"chipLight": "SD8qLW_chipLight",
|
|
1191
|
-
"commitRefMore": "SD8qLW_commitRefMore",
|
|
1192
|
-
"overlay": "SD8qLW_overlay",
|
|
1193
|
-
"treeTools": "SD8qLW_treeTools",
|
|
1194
|
-
"stAdded": "SD8qLW_stAdded",
|
|
1195
|
-
"chipSystem": "SD8qLW_chipSystem",
|
|
1196
|
-
"scopeRow": "SD8qLW_scopeRow",
|
|
1197
|
-
"commitActive": "SD8qLW_commitActive",
|
|
1198
|
-
"signAdd": "SD8qLW_signAdd",
|
|
1199
|
-
"btnBehind": "SD8qLW_btnBehind",
|
|
1200
|
-
"fbCommitLine": "SD8qLW_fbCommitLine",
|
|
1201
|
-
"settingsPop": "SD8qLW_settingsPop",
|
|
1202
|
-
"diffNav": "SD8qLW_diffNav",
|
|
1203
|
-
"fbRowActive": "SD8qLW_fbRowActive",
|
|
1204
|
-
"segment": "SD8qLW_segment",
|
|
1205
|
-
"wordDel": "SD8qLW_wordDel",
|
|
1206
|
-
"sideNav": "SD8qLW_sideNav",
|
|
1207
|
-
"empty": "SD8qLW_empty",
|
|
1208
|
-
"funnelButtonActive": "SD8qLW_funnelButtonActive",
|
|
1209
|
-
"refRow": "SD8qLW_refRow",
|
|
1210
|
-
"refPop": "SD8qLW_refPop",
|
|
1211
|
-
"sliderValue": "SD8qLW_sliderValue",
|
|
1212
|
-
"treeFilterInput": "SD8qLW_treeFilterInput",
|
|
1213
|
-
"funnelFootClear": "SD8qLW_funnelFootClear",
|
|
1214
|
-
"headerRight": "SD8qLW_headerRight",
|
|
1215
|
-
"treeLead": "SD8qLW_treeLead",
|
|
1260
|
+
"fbCommitWhat": "SD8qLW_fbCommitWhat",
|
|
1261
|
+
"lineHunk": "SD8qLW_lineHunk",
|
|
1216
1262
|
"treeRow": "SD8qLW_treeRow",
|
|
1217
|
-
"
|
|
1218
|
-
"btnAhead": "SD8qLW_btnAhead",
|
|
1219
|
-
"filterChips": "SD8qLW_filterChips",
|
|
1263
|
+
"commitPopTop": "SD8qLW_commitPopTop",
|
|
1220
1264
|
"fbDirName": "SD8qLW_fbDirName",
|
|
1221
|
-
"
|
|
1222
|
-
"
|
|
1223
|
-
"
|
|
1224
|
-
"
|
|
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",
|
|
1225
1277
|
"miniBtnPrimary": "SD8qLW_miniBtnPrimary",
|
|
1226
|
-
"
|
|
1227
|
-
"
|
|
1228
|
-
"
|
|
1229
|
-
"
|
|
1230
|
-
"
|
|
1231
|
-
"
|
|
1232
|
-
"
|
|
1233
|
-
"
|
|
1234
|
-
"
|
|
1278
|
+
"refRowActive": "SD8qLW_refRowActive",
|
|
1279
|
+
"commitBox": "SD8qLW_commitBox",
|
|
1280
|
+
"funnelTabs": "SD8qLW_funnelTabs",
|
|
1281
|
+
"imgCaption": "SD8qLW_imgCaption",
|
|
1282
|
+
"cardDeleted": "SD8qLW_cardDeleted",
|
|
1283
|
+
"funnelButton": "SD8qLW_funnelButton",
|
|
1284
|
+
"resizer": "SD8qLW_resizer",
|
|
1285
|
+
"treeFilterClear": "SD8qLW_treeFilterClear",
|
|
1286
|
+
"funnelFootCount": "SD8qLW_funnelFootCount",
|
|
1287
|
+
"calMark": "SD8qLW_calMark",
|
|
1288
|
+
"cardSep": "SD8qLW_cardSep",
|
|
1289
|
+
"fileCounts": "SD8qLW_fileCounts",
|
|
1290
|
+
"line": "SD8qLW_line",
|
|
1291
|
+
"sideBanner": "SD8qLW_sideBanner",
|
|
1292
|
+
"commitWhen": "SD8qLW_commitWhen",
|
|
1293
|
+
"commitFilter": "SD8qLW_commitFilter",
|
|
1235
1294
|
"sideSaveReady": "SD8qLW_sideSaveReady",
|
|
1236
|
-
"
|
|
1237
|
-
"
|
|
1238
|
-
"
|
|
1239
|
-
"refFoot": "SD8qLW_refFoot",
|
|
1240
|
-
"fbMain": "SD8qLW_fbMain",
|
|
1241
|
-
"fbCommitWhen": "SD8qLW_fbCommitWhen",
|
|
1242
|
-
"sideCodeSame": "SD8qLW_sideCodeSame",
|
|
1243
|
-
"treeDirLi": "SD8qLW_treeDirLi",
|
|
1244
|
-
"confirmActions": "SD8qLW_confirmActions",
|
|
1245
|
-
"btnDanger": "SD8qLW_btnDanger",
|
|
1295
|
+
"treeLead": "SD8qLW_treeLead",
|
|
1296
|
+
"chipDark": "SD8qLW_chipDark",
|
|
1297
|
+
"refRowSpacer": "SD8qLW_refRowSpacer",
|
|
1246
1298
|
"imgShot": "SD8qLW_imgShot",
|
|
1247
|
-
"
|
|
1248
|
-
"
|
|
1249
|
-
"
|
|
1250
|
-
"
|
|
1251
|
-
"
|
|
1252
|
-
"
|
|
1253
|
-
"filterChipRemove": "SD8qLW_filterChipRemove",
|
|
1254
|
-
"commit": "SD8qLW_commit",
|
|
1255
|
-
"sideTab": "SD8qLW_sideTab",
|
|
1256
|
-
"lineDel": "SD8qLW_lineDel",
|
|
1257
|
-
"treeSub": "SD8qLW_treeSub",
|
|
1299
|
+
"wordAdd": "SD8qLW_wordAdd",
|
|
1300
|
+
"sideCodeAdd": "SD8qLW_sideCodeAdd",
|
|
1301
|
+
"calHead": "SD8qLW_calHead",
|
|
1302
|
+
"funnelChevron": "SD8qLW_funnelChevron",
|
|
1303
|
+
"refRowName": "SD8qLW_refRowName",
|
|
1304
|
+
"fbBody": "SD8qLW_fbBody",
|
|
1258
1305
|
"segmentActive": "SD8qLW_segmentActive",
|
|
1259
|
-
"
|
|
1260
|
-
"
|
|
1261
|
-
"
|
|
1262
|
-
"
|
|
1306
|
+
"themeLabel": "SD8qLW_themeLabel",
|
|
1307
|
+
"opBanner": "SD8qLW_opBanner",
|
|
1308
|
+
"cardDetached": "SD8qLW_cardDetached",
|
|
1309
|
+
"renameLine": "SD8qLW_renameLine",
|
|
1310
|
+
"compareBar": "SD8qLW_compareBar",
|
|
1311
|
+
"diffPre": "SD8qLW_diffPre",
|
|
1312
|
+
"confirmActions": "SD8qLW_confirmActions",
|
|
1313
|
+
"paneDividerY": "SD8qLW_paneDividerY",
|
|
1314
|
+
"overlayMax": "SD8qLW_overlayMax",
|
|
1315
|
+
"headerTotalsDim": "SD8qLW_headerTotalsDim",
|
|
1316
|
+
"sideEditCell": "SD8qLW_sideEditCell",
|
|
1317
|
+
"commitAmend": "SD8qLW_commitAmend",
|
|
1318
|
+
"gsFade": "SD8qLW_gsFade",
|
|
1319
|
+
"fbMain": "SD8qLW_fbMain",
|
|
1320
|
+
"cardBranch": "SD8qLW_cardBranch",
|
|
1321
|
+
"funnelPreset": "SD8qLW_funnelPreset",
|
|
1263
1322
|
"tabActive": "SD8qLW_tabActive",
|
|
1264
|
-
"
|
|
1323
|
+
"funnelFoot": "SD8qLW_funnelFoot",
|
|
1324
|
+
"elideHead": "SD8qLW_elideHead",
|
|
1325
|
+
"menuPop": "SD8qLW_menuPop",
|
|
1326
|
+
"refRow": "SD8qLW_refRow",
|
|
1327
|
+
"treeLabel": "SD8qLW_treeLabel",
|
|
1328
|
+
"themeDirty": "SD8qLW_themeDirty",
|
|
1329
|
+
"funnelList": "SD8qLW_funnelList",
|
|
1330
|
+
"commitLine": "SD8qLW_commitLine",
|
|
1265
1331
|
"sideBlockHot": "SD8qLW_sideBlockHot",
|
|
1332
|
+
"sideNotice": "SD8qLW_sideNotice",
|
|
1333
|
+
"treeDirLi": "SD8qLW_treeDirLi",
|
|
1334
|
+
"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",
|
|
1266
1355
|
"confirmBox": "SD8qLW_confirmBox",
|
|
1356
|
+
"fbNote": "SD8qLW_fbNote",
|
|
1357
|
+
"chipLight": "SD8qLW_chipLight",
|
|
1267
1358
|
"syncSpacer": "SD8qLW_syncSpacer",
|
|
1359
|
+
"sliderValue": "SD8qLW_sliderValue",
|
|
1360
|
+
"refLabel": "SD8qLW_refLabel",
|
|
1268
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",
|
|
1269
1368
|
"sideNumDel": "SD8qLW_sideNumDel",
|
|
1270
|
-
"
|
|
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
|
+
"commit": "SD8qLW_commit",
|
|
1271
1377
|
"diffPane": "SD8qLW_diffPane",
|
|
1272
|
-
"
|
|
1273
|
-
"
|
|
1274
|
-
"
|
|
1275
|
-
"
|
|
1276
|
-
"
|
|
1277
|
-
"
|
|
1278
|
-
"
|
|
1279
|
-
"
|
|
1378
|
+
"sideCol": "SD8qLW_sideCol",
|
|
1379
|
+
"chipSystem": "SD8qLW_chipSystem",
|
|
1380
|
+
"sideBannerTitle": "SD8qLW_sideBannerTitle",
|
|
1381
|
+
"scopeBtn": "SD8qLW_scopeBtn",
|
|
1382
|
+
"syncUpstream": "SD8qLW_syncUpstream",
|
|
1383
|
+
"bodyRow": "SD8qLW_bodyRow",
|
|
1384
|
+
"syncLevel": "SD8qLW_syncLevel",
|
|
1385
|
+
"commitTop": "SD8qLW_commitTop",
|
|
1386
|
+
"paneHead": "SD8qLW_paneHead",
|
|
1387
|
+
"fbPath": "SD8qLW_fbPath",
|
|
1388
|
+
"headerTotalsAdd": "SD8qLW_headerTotalsAdd",
|
|
1389
|
+
"code": "SD8qLW_code",
|
|
1390
|
+
"layoutGlyph": "SD8qLW_layoutGlyph",
|
|
1391
|
+
"fbFileName": "SD8qLW_fbFileName",
|
|
1392
|
+
"refPop": "SD8qLW_refPop",
|
|
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",
|
|
1280
1405
|
"treeIcon": "SD8qLW_treeIcon",
|
|
1281
|
-
"
|
|
1282
|
-
"
|
|
1283
|
-
"fbHeader": "SD8qLW_fbHeader",
|
|
1284
|
-
"commitBtn": "SD8qLW_commitBtn",
|
|
1285
|
-
"fbMore": "SD8qLW_fbMore",
|
|
1286
|
-
"imgPane": "SD8qLW_imgPane",
|
|
1287
|
-
"cardDetached": "SD8qLW_cardDetached",
|
|
1288
|
-
"chevronOpen": "SD8qLW_chevronOpen",
|
|
1289
|
-
"paneDivider": "SD8qLW_paneDivider",
|
|
1290
|
-
"sideBanner": "SD8qLW_sideBanner",
|
|
1291
|
-
"refRowActive": "SD8qLW_refRowActive",
|
|
1406
|
+
"commitPopBody": "SD8qLW_commitPopBody",
|
|
1407
|
+
"headerTotals": "SD8qLW_headerTotals",
|
|
1292
1408
|
"filterChipLabel": "SD8qLW_filterChipLabel",
|
|
1293
|
-
"
|
|
1294
|
-
"
|
|
1295
|
-
"elide": "SD8qLW_elide",
|
|
1409
|
+
"filterChips": "SD8qLW_filterChips",
|
|
1410
|
+
"chevronOpen": "SD8qLW_chevronOpen",
|
|
1296
1411
|
"lnOld": "SD8qLW_lnOld",
|
|
1297
|
-
"
|
|
1298
|
-
"
|
|
1299
|
-
"
|
|
1300
|
-
"
|
|
1412
|
+
"commitActive": "SD8qLW_commitActive",
|
|
1413
|
+
"funnelBoundBtn": "SD8qLW_funnelBoundBtn",
|
|
1414
|
+
"commitsSentinel": "SD8qLW_commitsSentinel",
|
|
1415
|
+
"stUntracked": "SD8qLW_stUntracked",
|
|
1301
1416
|
"lineAdd": "SD8qLW_lineAdd",
|
|
1302
|
-
"
|
|
1303
|
-
"tab": "SD8qLW_tab",
|
|
1304
|
-
"syncUpstream": "SD8qLW_syncUpstream",
|
|
1305
|
-
"headerTotalsDel": "SD8qLW_headerTotalsDel",
|
|
1417
|
+
"sideScroll": "SD8qLW_sideScroll",
|
|
1306
1418
|
"fbCommitHint": "SD8qLW_fbCommitHint",
|
|
1307
|
-
"
|
|
1308
|
-
"headerBranch": "SD8qLW_headerBranch",
|
|
1309
|
-
"blockBar": "SD8qLW_blockBar",
|
|
1310
|
-
"calHead": "SD8qLW_calHead",
|
|
1311
|
-
"cardAdded": "SD8qLW_cardAdded",
|
|
1312
|
-
"paletteRow": "SD8qLW_paletteRow",
|
|
1313
|
-
"opBanner": "SD8qLW_opBanner",
|
|
1314
|
-
"blameCell": "SD8qLW_blameCell",
|
|
1315
|
-
"fbCommitWhat": "SD8qLW_fbCommitWhat",
|
|
1316
|
-
"fileCounts": "SD8qLW_fileCounts",
|
|
1419
|
+
"funnelBoundRows": "SD8qLW_funnelBoundRows",
|
|
1317
1420
|
"calIn": "SD8qLW_calIn",
|
|
1318
|
-
"
|
|
1319
|
-
"
|
|
1320
|
-
"
|
|
1321
|
-
"
|
|
1322
|
-
"funnelMore": "SD8qLW_funnelMore",
|
|
1323
|
-
"chipDark": "SD8qLW_chipDark",
|
|
1324
|
-
"refSearch": "SD8qLW_refSearch",
|
|
1325
|
-
"paneDividerY": "SD8qLW_paneDividerY",
|
|
1326
|
-
"commitHasBody": "SD8qLW_commitHasBody",
|
|
1327
|
-
"code": "SD8qLW_code",
|
|
1328
|
-
"compareBar": "SD8qLW_compareBar",
|
|
1329
|
-
"compareArrow": "SD8qLW_compareArrow",
|
|
1330
|
-
"cardBehind": "SD8qLW_cardBehind",
|
|
1331
|
-
"treeFilter": "SD8qLW_treeFilter",
|
|
1332
|
-
"funnelTabCount": "SD8qLW_funnelTabCount",
|
|
1333
|
-
"headerDetached": "SD8qLW_headerDetached",
|
|
1334
|
-
"funnelBoundBtnActive": "SD8qLW_funnelBoundBtnActive",
|
|
1335
|
-
"commitAmend": "SD8qLW_commitAmend",
|
|
1336
|
-
"funnelChevron": "SD8qLW_funnelChevron",
|
|
1337
|
-
"commitRef": "SD8qLW_commitRef",
|
|
1338
|
-
"chevron": "SD8qLW_chevron",
|
|
1339
|
-
"cmHost": "SD8qLW_cmHost",
|
|
1340
|
-
"btnCount": "SD8qLW_btnCount",
|
|
1421
|
+
"commitSubjectRow": "SD8qLW_commitSubjectRow",
|
|
1422
|
+
"stAdded": "SD8qLW_stAdded",
|
|
1423
|
+
"opBannerOk": "SD8qLW_opBannerOk",
|
|
1424
|
+
"checkMarkPartial": "SD8qLW_checkMarkPartial",
|
|
1341
1425
|
"treeDirCount": "SD8qLW_treeDirCount",
|
|
1342
|
-
"
|
|
1343
|
-
"
|
|
1344
|
-
"
|
|
1345
|
-
"
|
|
1346
|
-
"
|
|
1347
|
-
"
|
|
1426
|
+
"fbHeader": "SD8qLW_fbHeader",
|
|
1427
|
+
"fileDiscard": "SD8qLW_fileDiscard",
|
|
1428
|
+
"wtCurrent": "SD8qLW_wtCurrent",
|
|
1429
|
+
"wordDel": "SD8qLW_wordDel",
|
|
1430
|
+
"funnelCount": "SD8qLW_funnelCount",
|
|
1431
|
+
"refGroup": "SD8qLW_refGroup",
|
|
1348
1432
|
"refCaret": "SD8qLW_refCaret",
|
|
1349
|
-
"
|
|
1350
|
-
"
|
|
1351
|
-
"
|
|
1352
|
-
"
|
|
1353
|
-
"
|
|
1433
|
+
"layoutSwitch": "SD8qLW_layoutSwitch",
|
|
1434
|
+
"commitHash": "SD8qLW_commitHash",
|
|
1435
|
+
"pullGroup": "SD8qLW_pullGroup",
|
|
1436
|
+
"elideTail": "SD8qLW_elideTail",
|
|
1437
|
+
"confirmTitle": "SD8qLW_confirmTitle",
|
|
1438
|
+
"treeIconDown": "SD8qLW_treeIconDown",
|
|
1439
|
+
"themeRail": "SD8qLW_themeRail",
|
|
1440
|
+
"funnelBoundValSet": "SD8qLW_funnelBoundValSet",
|
|
1441
|
+
"paletteRowActive": "SD8qLW_paletteRowActive",
|
|
1354
1442
|
"treeCol": "SD8qLW_treeCol",
|
|
1355
|
-
"
|
|
1356
|
-
"
|
|
1357
|
-
"
|
|
1358
|
-
"
|
|
1359
|
-
"funnelButton": "SD8qLW_funnelButton",
|
|
1360
|
-
"treeIconGlyph": "SD8qLW_treeIconGlyph",
|
|
1361
|
-
"segmented": "SD8qLW_segmented",
|
|
1362
|
-
"filterClear": "SD8qLW_filterClear",
|
|
1363
|
-
"pathChildren": "SD8qLW_pathChildren",
|
|
1364
|
-
"cardWt": "SD8qLW_cardWt",
|
|
1365
|
-
"calGrid": "SD8qLW_calGrid",
|
|
1443
|
+
"empty": "SD8qLW_empty",
|
|
1444
|
+
"headerPicker": "SD8qLW_headerPicker",
|
|
1445
|
+
"paneDivider": "SD8qLW_paneDivider",
|
|
1446
|
+
"funnelBounds": "SD8qLW_funnelBounds",
|
|
1366
1447
|
"funnelPane": "SD8qLW_funnelPane",
|
|
1367
|
-
"
|
|
1368
|
-
"
|
|
1369
|
-
"
|
|
1370
|
-
"
|
|
1371
|
-
"
|
|
1372
|
-
"
|
|
1373
|
-
"
|
|
1374
|
-
"commitFilter": "SD8qLW_commitFilter",
|
|
1375
|
-
"funnelPresetActive": "SD8qLW_funnelPresetActive",
|
|
1376
|
-
"blockBtnDanger": "SD8qLW_blockBtnDanger",
|
|
1377
|
-
"refGroup": "SD8qLW_refGroup",
|
|
1378
|
-
"opBannerBad": "SD8qLW_opBannerBad",
|
|
1379
|
-
"fbCommit": "SD8qLW_fbCommit",
|
|
1380
|
-
"gsFade": "SD8qLW_gsFade",
|
|
1381
|
-
"diffScroll": "SD8qLW_diffScroll",
|
|
1382
|
-
"scopeBtn": "SD8qLW_scopeBtn",
|
|
1383
|
-
"treeFilterClear": "SD8qLW_treeFilterClear",
|
|
1384
|
-
"funnelBoundBtn": "SD8qLW_funnelBoundBtn",
|
|
1385
|
-
"commitLead": "SD8qLW_commitLead",
|
|
1386
|
-
"fileDiscard": "SD8qLW_fileDiscard",
|
|
1387
|
-
"body": "SD8qLW_body",
|
|
1448
|
+
"commitCopy": "SD8qLW_commitCopy",
|
|
1449
|
+
"commitRefMore": "SD8qLW_commitRefMore",
|
|
1450
|
+
"tabs": "SD8qLW_tabs",
|
|
1451
|
+
"calOut": "SD8qLW_calOut",
|
|
1452
|
+
"stModified": "SD8qLW_stModified",
|
|
1453
|
+
"refPicker": "SD8qLW_refPicker",
|
|
1454
|
+
"cmHost": "SD8qLW_cmHost",
|
|
1388
1455
|
"funnelPop": "SD8qLW_funnelPop",
|
|
1389
|
-
"
|
|
1390
|
-
"
|
|
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
|
+
"funnelSearch": "SD8qLW_funnelSearch",
|
|
1463
|
+
"opBannerBad": "SD8qLW_opBannerBad",
|
|
1464
|
+
"commitMessage": "SD8qLW_commitMessage",
|
|
1465
|
+
"commitPop": "SD8qLW_commitPop",
|
|
1466
|
+
"funnelName": "SD8qLW_funnelName",
|
|
1467
|
+
"scopeRow": "SD8qLW_scopeRow",
|
|
1468
|
+
"settingsPop": "SD8qLW_settingsPop",
|
|
1469
|
+
"sideTabs": "SD8qLW_sideTabs",
|
|
1470
|
+
"stDeleted": "SD8qLW_stDeleted",
|
|
1471
|
+
"fileLi": "SD8qLW_fileLi",
|
|
1472
|
+
"funnelRow": "SD8qLW_funnelRow",
|
|
1473
|
+
"sideCols": "SD8qLW_sideCols",
|
|
1474
|
+
"calNav": "SD8qLW_calNav",
|
|
1475
|
+
"refFoot": "SD8qLW_refFoot",
|
|
1476
|
+
"fbCommitWho": "SD8qLW_fbCommitWho",
|
|
1391
1477
|
"funnelTab": "SD8qLW_funnelTab",
|
|
1392
|
-
"
|
|
1393
|
-
"resizer": "SD8qLW_resizer",
|
|
1394
|
-
"treeWrap": "SD8qLW_treeWrap",
|
|
1395
|
-
"stRenamed": "SD8qLW_stRenamed",
|
|
1396
|
-
"fbBody": "SD8qLW_fbBody",
|
|
1397
|
-
"headerPicker": "SD8qLW_headerPicker",
|
|
1398
|
-
"commitPopTop": "SD8qLW_commitPopTop",
|
|
1399
|
-
"confirmBody": "SD8qLW_confirmBody",
|
|
1400
|
-
"funnelBoundRows": "SD8qLW_funnelBoundRows",
|
|
1401
|
-
"funnelFootCount": "SD8qLW_funnelFootCount",
|
|
1402
|
-
"confirmTitle": "SD8qLW_confirmTitle",
|
|
1403
|
-
"lineHunk": "SD8qLW_lineHunk",
|
|
1404
|
-
"funnelPresets": "SD8qLW_funnelPresets",
|
|
1405
|
-
"commitBox": "SD8qLW_commitBox",
|
|
1478
|
+
"treeDirName": "SD8qLW_treeDirName",
|
|
1406
1479
|
"segmentChip": "SD8qLW_segmentChip",
|
|
1407
|
-
"
|
|
1480
|
+
"refEmpty": "SD8qLW_refEmpty",
|
|
1408
1481
|
"sideColGridBlame": "SD8qLW_sideColGridBlame",
|
|
1409
|
-
"
|
|
1410
|
-
"
|
|
1411
|
-
"
|
|
1412
|
-
"
|
|
1413
|
-
"
|
|
1414
|
-
"
|
|
1415
|
-
"signDel": "SD8qLW_signDel",
|
|
1416
|
-
"paneHead": "SD8qLW_paneHead",
|
|
1417
|
-
"sideTabActive": "SD8qLW_sideTabActive",
|
|
1418
|
-
"fbSearch": "SD8qLW_fbSearch",
|
|
1419
|
-
"fbNote": "SD8qLW_fbNote",
|
|
1420
|
-
"stModified": "SD8qLW_stModified",
|
|
1421
|
-
"commitStaged": "SD8qLW_commitStaged",
|
|
1482
|
+
"refSearch": "SD8qLW_refSearch",
|
|
1483
|
+
"compareArrow": "SD8qLW_compareArrow",
|
|
1484
|
+
"treeWrap": "SD8qLW_treeWrap",
|
|
1485
|
+
"sideSpacer": "SD8qLW_sideSpacer",
|
|
1486
|
+
"filterChip": "SD8qLW_filterChip",
|
|
1487
|
+
"resizerActive": "SD8qLW_resizerActive",
|
|
1422
1488
|
"refList": "SD8qLW_refList",
|
|
1423
|
-
"
|
|
1424
|
-
"
|
|
1425
|
-
"
|
|
1426
|
-
"
|
|
1489
|
+
"calToday": "SD8qLW_calToday",
|
|
1490
|
+
"funnelBoundVal": "SD8qLW_funnelBoundVal",
|
|
1491
|
+
"diffScroll": "SD8qLW_diffScroll",
|
|
1492
|
+
"headerBranch": "SD8qLW_headerBranch",
|
|
1427
1493
|
"pathFileGlyph": "SD8qLW_pathFileGlyph",
|
|
1428
|
-
"
|
|
1429
|
-
"
|
|
1494
|
+
"pathChildren": "SD8qLW_pathChildren",
|
|
1495
|
+
"sideTab": "SD8qLW_sideTab",
|
|
1496
|
+
"sideActions": "SD8qLW_sideActions",
|
|
1497
|
+
"fbList": "SD8qLW_fbList",
|
|
1498
|
+
"headerTotalsDel": "SD8qLW_headerTotalsDel",
|
|
1499
|
+
"funnelTabActive": "SD8qLW_funnelTabActive",
|
|
1500
|
+
"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
|
+
"blockBar": "SD8qLW_blockBar",
|
|
1508
|
+
"refButton": "SD8qLW_refButton",
|
|
1509
|
+
"commitPopSubject": "SD8qLW_commitPopSubject",
|
|
1510
|
+
"sliderRow": "SD8qLW_sliderRow",
|
|
1511
|
+
"funnelTabCount": "SD8qLW_funnelTabCount",
|
|
1512
|
+
"sideNavCount": "SD8qLW_sideNavCount",
|
|
1513
|
+
"treeDirCounts": "SD8qLW_treeDirCounts",
|
|
1514
|
+
"blockBtnDanger": "SD8qLW_blockBtnDanger",
|
|
1515
|
+
"commitBtn": "SD8qLW_commitBtn",
|
|
1516
|
+
"paletteRow": "SD8qLW_paletteRow",
|
|
1517
|
+
"pathNode": "SD8qLW_pathNode",
|
|
1518
|
+
"fbCommitHash": "SD8qLW_fbCommitHash",
|
|
1519
|
+
"funnelButtonActive": "SD8qLW_funnelButtonActive",
|
|
1430
1520
|
"gutter": "SD8qLW_gutter",
|
|
1431
|
-
"
|
|
1432
|
-
"
|
|
1433
|
-
"
|
|
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"
|
|
1434
1559
|
};
|
|
1435
1560
|
//#endregion
|
|
1436
1561
|
//#region node_modules/.pnpm/@marijn+find-cluster-break@1.0.3/node_modules/@marijn/find-cluster-break/src/index.js
|
|
@@ -32600,6 +32725,50 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
32600
32725
|
function highlightWholeFile(lines, lang, theme = "github-dark-default") {
|
|
32601
32726
|
return tokenizeLines(lines, lang, theme);
|
|
32602
32727
|
}
|
|
32728
|
+
/**
|
|
32729
|
+
* Runs for the rows in a window, and nothing outside it.
|
|
32730
|
+
*
|
|
32731
|
+
* This is the pane's whole highlighting cost now, and it is proportional to the
|
|
32732
|
+
* viewport rather than to the file. Measured on a 4,000-line file with a
|
|
32733
|
+
* one-line change: whole-file passes plus per-line re-lexing froze the pane for
|
|
32734
|
+
* 1.4 seconds; the same file behind an extension no grammar claims cost 22ms of
|
|
32735
|
+
* script, which is what proved the entire remainder was Shiki.
|
|
32736
|
+
*
|
|
32737
|
+
* Both passes happen inside the window: the slice pass, which knows about
|
|
32738
|
+
* multi-line constructs within its reach, and the per-line re-lex that makes a
|
|
32739
|
+
* diff reconstruction colour as top-level code.
|
|
32740
|
+
*
|
|
32741
|
+
* @param lines - source lines, no leading +/-.
|
|
32742
|
+
* @param lang - from {@link shikiLangOf}.
|
|
32743
|
+
* @param theme - from {@link shikiThemeOf}.
|
|
32744
|
+
* @param from - first row in the window.
|
|
32745
|
+
* @param to - one past the last row in the window.
|
|
32746
|
+
* @returns an array indexed by ROW, filled only inside the window; undefined
|
|
32747
|
+
* when no grammar applies, which the caller already renders as plain text.
|
|
32748
|
+
*/
|
|
32749
|
+
function highlightWindow(lines, lang, theme, from, to) {
|
|
32750
|
+
const first = Math.max(0, Math.trunc(from));
|
|
32751
|
+
const last = Math.min(lines.length, Math.trunc(to));
|
|
32752
|
+
if (last <= first) return void 0;
|
|
32753
|
+
const lead = Math.max(0, first - 240);
|
|
32754
|
+
const sliceTok = tokenizeLines(lines.slice(lead, last), lang, theme);
|
|
32755
|
+
if (sliceTok === void 0) return void 0;
|
|
32756
|
+
const out = new Array(lines.length);
|
|
32757
|
+
for (let i = first; i < last; i += 1) {
|
|
32758
|
+
const line = lines[i];
|
|
32759
|
+
const together = sliceTok[i - lead] ?? [{
|
|
32760
|
+
text: line,
|
|
32761
|
+
color: void 0
|
|
32762
|
+
}];
|
|
32763
|
+
if (looksLikeCommentLine(line)) {
|
|
32764
|
+
out[i] = together;
|
|
32765
|
+
continue;
|
|
32766
|
+
}
|
|
32767
|
+
const solo = tokenizeLines([line], lang, theme)?.[0];
|
|
32768
|
+
out[i] = solo !== void 0 && solo.length > 0 ? solo : together;
|
|
32769
|
+
}
|
|
32770
|
+
return out;
|
|
32771
|
+
}
|
|
32603
32772
|
function looksLikeCommentLine(text) {
|
|
32604
32773
|
const t = text.trimStart();
|
|
32605
32774
|
return t.startsWith("//") || t.startsWith("/*") || t.startsWith("*") || t.startsWith("#");
|
|
@@ -34326,6 +34495,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
34326
34495
|
* belongs here beside the layout rather than in the host's per-project store:
|
|
34327
34496
|
* two people on one repository should not share each other's place. */
|
|
34328
34497
|
const STORE_FILES = "dsh-ui-gitworkbench:files";
|
|
34498
|
+
/** Which way the History tab arranges its panes. Its own key rather than a
|
|
34499
|
+
* field of the appearance object: that one is about colour, and this choice
|
|
34500
|
+
* has to survive a build that adds a palette. */
|
|
34501
|
+
const STORE_HISTORY_LAYOUT = "dsh-ui-gitworkbench:history-layout";
|
|
34329
34502
|
const DEFAULT_PANES = {
|
|
34330
34503
|
commits: null,
|
|
34331
34504
|
tree: null,
|
|
@@ -34578,6 +34751,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
34578
34751
|
const [family, setFamily] = (0, react.useState)(() => readStored(STORE_APPEARANCE, isAppearance, DEFAULT_APPEARANCE).family);
|
|
34579
34752
|
/** Dragged pane widths, persisted so a layout survives a reload. */
|
|
34580
34753
|
const [panes, setPanes] = (0, react.useState)(() => readStored(STORE_PANES, isPaneWidths, DEFAULT_PANES));
|
|
34754
|
+
/**
|
|
34755
|
+
* The History tab's arrangement.
|
|
34756
|
+
*
|
|
34757
|
+
* Panel-level, beside the palette rather than inside the tab: the choice has
|
|
34758
|
+
* to hold across tab switches and reopens, and the drawer's own card is where
|
|
34759
|
+
* the row height it implies is published from.
|
|
34760
|
+
*/
|
|
34761
|
+
const [historyLayout, setHistoryLayout] = (0, react.useState)(() => readStored(STORE_HISTORY_LAYOUT, isHistoryLayout, DEFAULT_HISTORY_LAYOUT));
|
|
34581
34762
|
/** Per-project and global styling; both scopes, unresolved. */
|
|
34582
34763
|
const [style, setStyle] = (0, react.useState)(EMPTY_SETTINGS);
|
|
34583
34764
|
/** Whether dsh's resolved palette is currently dark. */
|
|
@@ -34994,13 +35175,17 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
34994
35175
|
/** Per-file diff fetcher bound to the active view. Stable per view, so the
|
|
34995
35176
|
* drawer's on-demand effect stops re-running on every render. */
|
|
34996
35177
|
const fetchDiffForView = (0, react.useCallback)((path, signal) => {
|
|
34997
|
-
|
|
34998
|
-
|
|
35178
|
+
return fetchFileDiff(statsPath, path, tab === "history" ? commitHash ?? void 0 : void 0, tab === "compare" ? {
|
|
35179
|
+
base: baseRef,
|
|
35180
|
+
head: headRef
|
|
35181
|
+
} : void 0, signal);
|
|
34999
35182
|
}, [
|
|
35000
35183
|
fetchFileDiff,
|
|
35001
35184
|
statsPath,
|
|
35002
35185
|
tab,
|
|
35003
|
-
commitHash
|
|
35186
|
+
commitHash,
|
|
35187
|
+
baseRef,
|
|
35188
|
+
headRef
|
|
35004
35189
|
]);
|
|
35005
35190
|
if (stats === null) return null;
|
|
35006
35191
|
if (stats.error !== void 0 && !open) return null;
|
|
@@ -35233,6 +35418,17 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
35233
35418
|
setMaximized(false);
|
|
35234
35419
|
if (persist) writeStored(STORE_WIDTH, clamped);
|
|
35235
35420
|
};
|
|
35421
|
+
/**
|
|
35422
|
+
* Pick the History tab's arrangement.
|
|
35423
|
+
*
|
|
35424
|
+
* Written through immediately: unlike a drag this is one click, so there is
|
|
35425
|
+
* no intermediate frame to withhold a synchronous storage write for.
|
|
35426
|
+
* @param next - the arrangement to switch to.
|
|
35427
|
+
*/
|
|
35428
|
+
const applyHistoryLayout = (next) => {
|
|
35429
|
+
setHistoryLayout(next);
|
|
35430
|
+
writeStored(STORE_HISTORY_LAYOUT, next);
|
|
35431
|
+
};
|
|
35236
35432
|
/** Tab switch. No direction refetches the working tree: `viewKey` already
|
|
35237
35433
|
* separates the tabs' per-file diff caches, so bumping `gen` here only cost a
|
|
35238
35434
|
* redundant round trip. */
|
|
@@ -35328,6 +35524,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
35328
35524
|
panes,
|
|
35329
35525
|
onPane: applyPane,
|
|
35330
35526
|
onCommitsTall: applyCommitsTall,
|
|
35527
|
+
historyLayout,
|
|
35528
|
+
onHistoryLayout: applyHistoryLayout,
|
|
35331
35529
|
onClose: () => setOpen(false),
|
|
35332
35530
|
onRefresh: refresh,
|
|
35333
35531
|
commitDraft,
|
|
@@ -35491,7 +35689,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
35491
35689
|
]
|
|
35492
35690
|
});
|
|
35493
35691
|
}
|
|
35494
|
-
function Drawer({ stats, shown, tab, onSwitchTab, commits, commitHash, onSelectCommit, hasMoreCommits, loadingMore, onLoadMoreCommits, historyRef, onHistoryRef, historyQuery, onHistoryQuery, historyError, fetchAuthors, fetchRepoTree, branches, worktreeBranches, branchesTruncated, baseRef, headRef, onBaseRef, onHeadRef, comparable, t, binding, worktrees, sessionPath, statsPath, onSwitchSource, segments, selected, onSelect, maximized, onToggleMaximized, theme, mode, family, onMode, onFamily, style, background, onStyle, width, onWidth, panes, onPane, onCommitsTall, onClose, onRefresh, commitDraft, onCommitDraft, commitAmend, onCommitAmend, sync, treeLoading, historyLoading, busy, opResult, runOp, fetchDiscardPlan, onOpError, pendingTicks, onTick, fetchFileDiff, fetchFileSides, writeChecked, fetchBlame, fetchFileImage, viewKey, gen, collapsed, onCollapsedChange, filesPlaces, onFilesPlace, filesTrees, onFilesTree }) {
|
|
35692
|
+
function Drawer({ stats, shown, tab, onSwitchTab, commits, commitHash, onSelectCommit, hasMoreCommits, loadingMore, onLoadMoreCommits, historyRef, onHistoryRef, historyQuery, onHistoryQuery, historyError, fetchAuthors, fetchRepoTree, branches, worktreeBranches, branchesTruncated, baseRef, headRef, onBaseRef, onHeadRef, comparable, t, binding, worktrees, sessionPath, statsPath, onSwitchSource, segments, selected, onSelect, maximized, onToggleMaximized, theme, mode, family, onMode, onFamily, style, background, onStyle, width, onWidth, panes, onPane, onCommitsTall, historyLayout, onHistoryLayout, onClose, onRefresh, commitDraft, onCommitDraft, commitAmend, onCommitAmend, sync, treeLoading, historyLoading, busy, opResult, runOp, fetchDiscardPlan, onOpError, pendingTicks, onTick, fetchFileDiff, fetchFileSides, writeChecked, fetchBlame, fetchFileImage, viewKey, gen, collapsed, onCollapsedChange, filesPlaces, onFilesPlace, filesTrees, onFilesTree }) {
|
|
35495
35693
|
const body = shown ?? EMPTY_STATS;
|
|
35496
35694
|
/** The file list with ticks still awaiting git laid over them. The tree and
|
|
35497
35695
|
* the commit box read this, so a click moves its box and the "N ticked"
|
|
@@ -35745,12 +35943,21 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
35745
35943
|
if (box === void 0) return;
|
|
35746
35944
|
onCommitsTall(clientY - box.top, box.height, done);
|
|
35747
35945
|
};
|
|
35946
|
+
/**
|
|
35947
|
+
* Whether the History tab is showing its stacked arrangement.
|
|
35948
|
+
*
|
|
35949
|
+
* Three things follow from it and they must agree: the body's direction, how
|
|
35950
|
+
* the commit list is sized, and which way its divider slides. Read from one
|
|
35951
|
+
* name so a fourth reader cannot be added out of step.
|
|
35952
|
+
*/
|
|
35953
|
+
const stackedHistory = tab === "history" && historyLayout === "stacked";
|
|
35748
35954
|
const cardStyle = {
|
|
35749
35955
|
"--gs-min-commits": `${MIN_COMMITS_WIDTH}px`,
|
|
35750
35956
|
"--gs-min-tree": `${MIN_TREE_WIDTH}px`,
|
|
35751
35957
|
"--gs-min-diff": `${MIN_DIFF_WIDTH}px`,
|
|
35752
35958
|
"--gs-min-commits-tall": `${MIN_COMMITS_HEIGHT}px`,
|
|
35753
35959
|
"--gs-min-stacked-lower": `${MIN_STACKED_LOWER}px`,
|
|
35960
|
+
"--gs-commit-row": `${COMMIT_ROW_H[historyLayout]}px`,
|
|
35754
35961
|
...maximized || width === null ? {} : { width: `${width}px` },
|
|
35755
35962
|
...background === null ? {} : {
|
|
35756
35963
|
"--gs-bg-image": `url("${background.image}")`,
|
|
@@ -35944,9 +36151,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
35944
36151
|
onBaseRef,
|
|
35945
36152
|
onHeadRef
|
|
35946
36153
|
}) : null,
|
|
35947
|
-
tab === "history"
|
|
36154
|
+
tab === "history" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
35948
36155
|
className: GitWorkbenchPanel_module_css_default.compareBar,
|
|
35949
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RefPicker, {
|
|
36156
|
+
children: [branches.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RefPicker, {
|
|
35950
36157
|
t,
|
|
35951
36158
|
label: t("historyRefLabel"),
|
|
35952
36159
|
value: historyRef,
|
|
@@ -35955,7 +36162,22 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
35955
36162
|
truncated: branchesTruncated,
|
|
35956
36163
|
onPick: onHistoryRef,
|
|
35957
36164
|
allLabel: t("allBranches")
|
|
35958
|
-
})
|
|
36165
|
+
}) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
36166
|
+
className: GitWorkbenchPanel_module_css_default.layoutSwitch,
|
|
36167
|
+
role: "group",
|
|
36168
|
+
"aria-label": t("historyLayout"),
|
|
36169
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(LayoutButton, {
|
|
36170
|
+
glyph: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ColumnsGlyph, {}),
|
|
36171
|
+
label: t("layoutColumns"),
|
|
36172
|
+
on: historyLayout === "columns",
|
|
36173
|
+
onPick: () => onHistoryLayout("columns")
|
|
36174
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LayoutButton, {
|
|
36175
|
+
glyph: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StackedGlyph, {}),
|
|
36176
|
+
label: t("layoutStacked"),
|
|
36177
|
+
on: historyLayout === "stacked",
|
|
36178
|
+
onPick: () => onHistoryLayout("stacked")
|
|
36179
|
+
})]
|
|
36180
|
+
})]
|
|
35959
36181
|
}) : null,
|
|
35960
36182
|
tab === "changes" && sync !== null && sync.hasRemote ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SyncBar, {
|
|
35961
36183
|
t,
|
|
@@ -35973,10 +36195,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
35973
36195
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
35974
36196
|
ref: bodyRef,
|
|
35975
36197
|
className: GitWorkbenchPanel_module_css_default.body,
|
|
35976
|
-
"data-stacked":
|
|
36198
|
+
"data-stacked": stackedHistory ? "" : void 0,
|
|
35977
36199
|
children: [tab === "history" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CommitList, {
|
|
35978
36200
|
paneRef: commitsRef,
|
|
35979
|
-
style: paneTall(panes.commitsTall ?? null),
|
|
36201
|
+
style: stackedHistory ? paneTall(panes.commitsTall ?? null) : paneStyle(panes.commits),
|
|
36202
|
+
layout: historyLayout,
|
|
35980
36203
|
t,
|
|
35981
36204
|
loading: historyLoading,
|
|
35982
36205
|
commits,
|
|
@@ -35992,10 +36215,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
35992
36215
|
refName: historyRef,
|
|
35993
36216
|
fetchAuthors,
|
|
35994
36217
|
fetchRepoTree
|
|
35995
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PaneDivider, {
|
|
36218
|
+
}), stackedHistory ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PaneDivider, {
|
|
35996
36219
|
axis: "y",
|
|
35997
36220
|
label: t("resizeCommits"),
|
|
35998
36221
|
onDrag: commitsTallDrag
|
|
36222
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PaneDivider, {
|
|
36223
|
+
label: t("resizeCommits"),
|
|
36224
|
+
onDrag: paneDrag("commits", commitsRef)
|
|
35999
36225
|
})] }) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
36000
36226
|
className: GitWorkbenchPanel_module_css_default.bodyRow,
|
|
36001
36227
|
children: tab === "files" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FileBrowser, {
|
|
@@ -37298,17 +37524,6 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
37298
37524
|
* stays scannable; hovering opens a card with the full message, including a
|
|
37299
37525
|
* multi-line body, which can be copied without selecting the commit.
|
|
37300
37526
|
*/
|
|
37301
|
-
/**
|
|
37302
|
-
* Row height the graph and the list agree on. The lines only join up if every
|
|
37303
|
-
* row is exactly as tall as the segment drawn for it, so this number and
|
|
37304
|
-
* `.commitLine`'s `height` are one fact with two homes —
|
|
37305
|
-
* `tests/commit-row-height.test.ts` holds them together.
|
|
37306
|
-
*
|
|
37307
|
-
* 28 since the History tab stacked: the list spans the drawer's full width, a
|
|
37308
|
-
* commit fits on one line, and 48px of row would spend the vertical space the
|
|
37309
|
-
* stacked layout has least of on empty padding.
|
|
37310
|
-
*/
|
|
37311
|
-
const GRAPH_ROW_H = 28;
|
|
37312
37527
|
/** Horizontal distance between lanes. */
|
|
37313
37528
|
const GRAPH_LANE_W = 14;
|
|
37314
37529
|
/** Ref chips shown inline before the subject; the rest collapse into a "+N". */
|
|
@@ -37320,22 +37535,27 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
37320
37535
|
/**
|
|
37321
37536
|
* One row's slice of the commit graph.
|
|
37322
37537
|
*
|
|
37323
|
-
* Drawn as an SVG
|
|
37324
|
-
*
|
|
37325
|
-
*
|
|
37326
|
-
*
|
|
37327
|
-
*
|
|
37538
|
+
* Drawn as an SVG exactly as tall as the row, so consecutive rows butt together
|
|
37539
|
+
* and a lane reads as one unbroken line down the list. The dot sits at the
|
|
37540
|
+
* vertical centre; edges leave the top edge, the dot, or the bottom edge, and a
|
|
37541
|
+
* cubic with its control points at the quarter heights gives the S-curve every
|
|
37542
|
+
* git client draws for a branch or a merge.
|
|
37543
|
+
*
|
|
37544
|
+
* The height is passed in rather than read from a constant here: the two
|
|
37545
|
+
* History arrangements want differently shaped rows, and the segment and the
|
|
37546
|
+
* row it belongs to must come from the same entry of `COMMIT_ROW_H` or the
|
|
37547
|
+
* lanes stop meeting across the seam between rows.
|
|
37328
37548
|
*/
|
|
37329
|
-
function GraphCell({ row, width, active }) {
|
|
37549
|
+
function GraphCell({ row, width, active, rowH }) {
|
|
37330
37550
|
const w = Math.min(width, GRAPH_MAX_LANES) * GRAPH_LANE_W;
|
|
37331
|
-
const mid =
|
|
37551
|
+
const mid = rowH / 2;
|
|
37332
37552
|
const visible = (lane) => lane < GRAPH_MAX_LANES;
|
|
37333
37553
|
const stroke = (lane) => `var(--gs-graph-${lane % 6})`;
|
|
37334
37554
|
const paths = [];
|
|
37335
37555
|
for (const lane of row.through) {
|
|
37336
37556
|
if (!visible(lane)) continue;
|
|
37337
37557
|
paths.push(/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
|
|
37338
|
-
d: `M ${laneX(lane)} 0 V ${
|
|
37558
|
+
d: `M ${laneX(lane)} 0 V ${rowH}`,
|
|
37339
37559
|
stroke: stroke(lane)
|
|
37340
37560
|
}, `t${lane}`));
|
|
37341
37561
|
}
|
|
@@ -37352,18 +37572,18 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
37352
37572
|
for (const lane of row.outOf) {
|
|
37353
37573
|
if (!visible(lane) || !visible(row.lane)) continue;
|
|
37354
37574
|
paths.push(lane === row.lane ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
|
|
37355
|
-
d: `M ${laneX(lane)} ${mid} V ${
|
|
37575
|
+
d: `M ${laneX(lane)} ${mid} V ${rowH}`,
|
|
37356
37576
|
stroke: stroke(lane)
|
|
37357
37577
|
}, `o${lane}`) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
|
|
37358
|
-
d: `M ${laneX(row.lane)} ${mid} C ${laneX(row.lane)}
|
|
37578
|
+
d: `M ${laneX(row.lane)} ${mid} C ${laneX(row.lane)} ${mid + mid / 2}, ${laneX(lane)} ${mid + mid / 2}, ${laneX(lane)} ${rowH}`,
|
|
37359
37579
|
stroke: stroke(lane)
|
|
37360
37580
|
}, `o${lane}`));
|
|
37361
37581
|
}
|
|
37362
37582
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
|
|
37363
37583
|
className: GitWorkbenchPanel_module_css_default.graphCell,
|
|
37364
37584
|
width: w,
|
|
37365
|
-
height:
|
|
37366
|
-
viewBox: `0 0 ${w} ${
|
|
37585
|
+
height: rowH,
|
|
37586
|
+
viewBox: `0 0 ${w} ${rowH}`,
|
|
37367
37587
|
"aria-hidden": "true",
|
|
37368
37588
|
focusable: "false",
|
|
37369
37589
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("g", {
|
|
@@ -37381,7 +37601,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
37381
37601
|
}) : null]
|
|
37382
37602
|
});
|
|
37383
37603
|
}
|
|
37384
|
-
function CommitRow({ t, commit, active, onSelect, graphRow, graphWidth }) {
|
|
37604
|
+
function CommitRow({ t, commit, active, onSelect, graphRow, graphWidth, layout }) {
|
|
37385
37605
|
const rowRef = (0, react.useRef)(null);
|
|
37386
37606
|
const [open, setOpen] = (0, react.useState)(false);
|
|
37387
37607
|
const [box, setBox] = (0, react.useState)(null);
|
|
@@ -37424,13 +37644,38 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
37424
37644
|
}, [open]);
|
|
37425
37645
|
const host = rowRef.current?.closest("[data-gs-part=\"overlay\"]") ?? (typeof document === "undefined" ? null : document.body);
|
|
37426
37646
|
const refs = commit.refs ?? [];
|
|
37647
|
+
const subjectRow = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
37648
|
+
className: GitWorkbenchPanel_module_css_default.commitSubjectRow,
|
|
37649
|
+
children: [
|
|
37650
|
+
refs.slice(0, COMMIT_REF_CHIPS).map((ref) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
37651
|
+
className: GitWorkbenchPanel_module_css_default.commitRef,
|
|
37652
|
+
title: ref,
|
|
37653
|
+
children: ref
|
|
37654
|
+
}, ref)),
|
|
37655
|
+
refs.length > COMMIT_REF_CHIPS ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
37656
|
+
className: GitWorkbenchPanel_module_css_default.commitRefMore,
|
|
37657
|
+
title: refs.slice(COMMIT_REF_CHIPS).join("\n"),
|
|
37658
|
+
children: ["+", refs.length - COMMIT_REF_CHIPS]
|
|
37659
|
+
}) : null,
|
|
37660
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
37661
|
+
className: GitWorkbenchPanel_module_css_default.commitSubject,
|
|
37662
|
+
children: commit.subject
|
|
37663
|
+
}),
|
|
37664
|
+
body.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
37665
|
+
className: GitWorkbenchPanel_module_css_default.commitHasBody,
|
|
37666
|
+
"aria-hidden": "true",
|
|
37667
|
+
children: "···"
|
|
37668
|
+
}) : null
|
|
37669
|
+
]
|
|
37670
|
+
});
|
|
37427
37671
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
37428
37672
|
className: GitWorkbenchPanel_module_css_default.commitLine,
|
|
37429
37673
|
children: [graphRow !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(GraphCell, {
|
|
37430
37674
|
row: graphRow,
|
|
37431
37675
|
width: graphWidth,
|
|
37432
|
-
active
|
|
37433
|
-
|
|
37676
|
+
active,
|
|
37677
|
+
rowH: COMMIT_ROW_H[layout]
|
|
37678
|
+
}) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
37434
37679
|
ref: rowRef,
|
|
37435
37680
|
type: "button",
|
|
37436
37681
|
role: "option",
|
|
@@ -37439,35 +37684,12 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
37439
37684
|
onClick: () => onSelect(commit.hash),
|
|
37440
37685
|
onMouseEnter: show,
|
|
37441
37686
|
onMouseLeave: hide,
|
|
37442
|
-
children: [
|
|
37687
|
+
children: layout === "stacked" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
37443
37688
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", {
|
|
37444
37689
|
className: GitWorkbenchPanel_module_css_default.commitHash,
|
|
37445
37690
|
children: commit.hash
|
|
37446
37691
|
}),
|
|
37447
|
-
|
|
37448
|
-
className: GitWorkbenchPanel_module_css_default.commitSubjectRow,
|
|
37449
|
-
children: [
|
|
37450
|
-
refs.slice(0, COMMIT_REF_CHIPS).map((ref) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
37451
|
-
className: GitWorkbenchPanel_module_css_default.commitRef,
|
|
37452
|
-
title: ref,
|
|
37453
|
-
children: ref
|
|
37454
|
-
}, ref)),
|
|
37455
|
-
refs.length > COMMIT_REF_CHIPS ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
37456
|
-
className: GitWorkbenchPanel_module_css_default.commitRefMore,
|
|
37457
|
-
title: refs.slice(COMMIT_REF_CHIPS).join("\n"),
|
|
37458
|
-
children: ["+", refs.length - COMMIT_REF_CHIPS]
|
|
37459
|
-
}) : null,
|
|
37460
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
37461
|
-
className: GitWorkbenchPanel_module_css_default.commitSubject,
|
|
37462
|
-
children: commit.subject
|
|
37463
|
-
}),
|
|
37464
|
-
body.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
37465
|
-
className: GitWorkbenchPanel_module_css_default.commitHasBody,
|
|
37466
|
-
"aria-hidden": "true",
|
|
37467
|
-
children: "···"
|
|
37468
|
-
}) : null
|
|
37469
|
-
]
|
|
37470
|
-
}),
|
|
37692
|
+
subjectRow,
|
|
37471
37693
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
37472
37694
|
className: GitWorkbenchPanel_module_css_default.commitMeta,
|
|
37473
37695
|
children: [authorName.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
@@ -37478,7 +37700,23 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
37478
37700
|
children: commit.when
|
|
37479
37701
|
})]
|
|
37480
37702
|
})
|
|
37481
|
-
]
|
|
37703
|
+
] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
37704
|
+
className: GitWorkbenchPanel_module_css_default.commitTop,
|
|
37705
|
+
children: [
|
|
37706
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", {
|
|
37707
|
+
className: GitWorkbenchPanel_module_css_default.commitHash,
|
|
37708
|
+
children: commit.hash
|
|
37709
|
+
}),
|
|
37710
|
+
authorName.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
37711
|
+
className: GitWorkbenchPanel_module_css_default.commitAuthor,
|
|
37712
|
+
children: authorName
|
|
37713
|
+
}) : null,
|
|
37714
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
37715
|
+
className: GitWorkbenchPanel_module_css_default.commitWhen,
|
|
37716
|
+
children: commit.when
|
|
37717
|
+
})
|
|
37718
|
+
]
|
|
37719
|
+
}), subjectRow] })
|
|
37482
37720
|
})]
|
|
37483
37721
|
}), open && box !== null && host !== null ? (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
37484
37722
|
className: GitWorkbenchPanel_module_css_default.commitPop,
|
|
@@ -37705,15 +37943,110 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
37705
37943
|
}) });
|
|
37706
37944
|
}
|
|
37707
37945
|
/**
|
|
37708
|
-
* The
|
|
37946
|
+
* The two arrangements, drawn in the same 16px/1px idiom as the drawer's other
|
|
37947
|
+
* glyphs: a pane and its neighbour, either side by side or one over the other.
|
|
37948
|
+
* The filled half is the list, so the picture says which pane moves.
|
|
37949
|
+
*/
|
|
37950
|
+
function ColumnsGlyph() {
|
|
37951
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
|
|
37952
|
+
className: GitWorkbenchPanel_module_css_default.layoutGlyph,
|
|
37953
|
+
width: "16",
|
|
37954
|
+
height: "16",
|
|
37955
|
+
viewBox: "0 0 16 16",
|
|
37956
|
+
fill: "none",
|
|
37957
|
+
stroke: "currentColor",
|
|
37958
|
+
strokeWidth: "1",
|
|
37959
|
+
strokeLinejoin: "round",
|
|
37960
|
+
"aria-hidden": "true",
|
|
37961
|
+
children: [
|
|
37962
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
|
|
37963
|
+
x: "1.5",
|
|
37964
|
+
y: "2.5",
|
|
37965
|
+
width: "13",
|
|
37966
|
+
height: "11",
|
|
37967
|
+
rx: "1.5"
|
|
37968
|
+
}),
|
|
37969
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
|
|
37970
|
+
x: "1.5",
|
|
37971
|
+
y: "2.5",
|
|
37972
|
+
width: "5",
|
|
37973
|
+
height: "11",
|
|
37974
|
+
rx: "1.5",
|
|
37975
|
+
fill: "currentColor",
|
|
37976
|
+
stroke: "none",
|
|
37977
|
+
opacity: "0.55"
|
|
37978
|
+
}),
|
|
37979
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M6.5 2.5 V13.5" })
|
|
37980
|
+
]
|
|
37981
|
+
});
|
|
37982
|
+
}
|
|
37983
|
+
function StackedGlyph() {
|
|
37984
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
|
|
37985
|
+
className: GitWorkbenchPanel_module_css_default.layoutGlyph,
|
|
37986
|
+
width: "16",
|
|
37987
|
+
height: "16",
|
|
37988
|
+
viewBox: "0 0 16 16",
|
|
37989
|
+
fill: "none",
|
|
37990
|
+
stroke: "currentColor",
|
|
37991
|
+
strokeWidth: "1",
|
|
37992
|
+
strokeLinejoin: "round",
|
|
37993
|
+
"aria-hidden": "true",
|
|
37994
|
+
children: [
|
|
37995
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
|
|
37996
|
+
x: "1.5",
|
|
37997
|
+
y: "2.5",
|
|
37998
|
+
width: "13",
|
|
37999
|
+
height: "11",
|
|
38000
|
+
rx: "1.5"
|
|
38001
|
+
}),
|
|
38002
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
|
|
38003
|
+
x: "1.5",
|
|
38004
|
+
y: "2.5",
|
|
38005
|
+
width: "13",
|
|
38006
|
+
height: "4",
|
|
38007
|
+
rx: "1.5",
|
|
38008
|
+
fill: "currentColor",
|
|
38009
|
+
stroke: "none",
|
|
38010
|
+
opacity: "0.55"
|
|
38011
|
+
}),
|
|
38012
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M1.5 6.5 H14.5" })
|
|
38013
|
+
]
|
|
38014
|
+
});
|
|
38015
|
+
}
|
|
38016
|
+
/**
|
|
38017
|
+
* One end of the arrangement switch.
|
|
37709
38018
|
*
|
|
37710
|
-
*
|
|
37711
|
-
*
|
|
37712
|
-
*
|
|
37713
|
-
*
|
|
37714
|
-
*
|
|
37715
|
-
*
|
|
37716
|
-
*
|
|
38019
|
+
* `aria-pressed` rather than a radio group: these are two states of one view
|
|
38020
|
+
* control, not a value being submitted, and a screen reader then reads the
|
|
38021
|
+
* arrangement in force without the group needing a name per option.
|
|
38022
|
+
* @param glyph - the arrangement, drawn.
|
|
38023
|
+
* @param label - accessible name, also the tooltip.
|
|
38024
|
+
* @param on - whether this arrangement is the one in force.
|
|
38025
|
+
* @param onPick - switch to it.
|
|
38026
|
+
*/
|
|
38027
|
+
function LayoutButton({ glyph, label, on, onPick }) {
|
|
38028
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
38029
|
+
type: "button",
|
|
38030
|
+
className: on ? `${GitWorkbenchPanel_module_css_default.layoutButton} ${GitWorkbenchPanel_module_css_default.layoutButtonOn}` : GitWorkbenchPanel_module_css_default.layoutButton,
|
|
38031
|
+
"aria-pressed": on,
|
|
38032
|
+
"aria-label": label,
|
|
38033
|
+
title: label,
|
|
38034
|
+
onClick: onPick,
|
|
38035
|
+
children: glyph
|
|
38036
|
+
});
|
|
38037
|
+
}
|
|
38038
|
+
/**
|
|
38039
|
+
* The commit log as its own pane, in whichever arrangement the reader picked.
|
|
38040
|
+
*
|
|
38041
|
+
* Beside the file tree it is a peer pane the way GitHub Desktop, the JetBrains
|
|
38042
|
+
* git log and GitKraken all draw it — list and selected commit's files side by
|
|
38043
|
+
* side, each with its own scrollbar. Across the top it is IDEA's git log
|
|
38044
|
+
* instead, which is the arrangement that stops a long subject being cut; see
|
|
38045
|
+
* `history-layout.ts` for what each costs. The switch that picks between them
|
|
38046
|
+
* is in the toolbar row above, not in this pane's head — the head is the first
|
|
38047
|
+
* thing to run out of room when the pane is dragged narrow, which is exactly
|
|
38048
|
+
* when a reader reaches for the switch. Either way there is nothing to
|
|
38049
|
+
* collapse and nothing to discover.
|
|
37717
38050
|
*
|
|
37718
38051
|
* Pages load by scrolling. A button at the end of a growing list is the worst
|
|
37719
38052
|
* of both worlds — it retreats every time it is used, and it asks the reader to
|
|
@@ -37722,7 +38055,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
37722
38055
|
* what GitHub and GitLens do. The observer is rebuilt whenever the list grows,
|
|
37723
38056
|
* so a page too short to fill the pane immediately triggers the next one.
|
|
37724
38057
|
*/
|
|
37725
|
-
function CommitList({ paneRef, style, t, loading, commits, active, onSelect, hasMore, loadingMore, onLoadMore, query, onQueryChange, error, statsPath, refName, fetchAuthors, fetchRepoTree }) {
|
|
38058
|
+
function CommitList({ paneRef, style, layout, t, loading, commits, active, onSelect, hasMore, loadingMore, onLoadMore, query, onQueryChange, error, statsPath, refName, fetchAuthors, fetchRepoTree }) {
|
|
37726
38059
|
const scrollRef = (0, react.useRef)(null);
|
|
37727
38060
|
const sentinelRef = (0, react.useRef)(null);
|
|
37728
38061
|
const filterModel = (0, react.useMemo)(() => parseLogQuery(query), [query]);
|
|
@@ -37876,6 +38209,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
37876
38209
|
ref: paneRef,
|
|
37877
38210
|
className: GitWorkbenchPanel_module_css_default.commitsPane,
|
|
37878
38211
|
style,
|
|
38212
|
+
"data-layout": layout,
|
|
37879
38213
|
"data-gs-part": "commits",
|
|
37880
38214
|
children: [
|
|
37881
38215
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -38211,7 +38545,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
38211
38545
|
active: commit.hash === active,
|
|
38212
38546
|
onSelect,
|
|
38213
38547
|
graphRow: graph.rows[index],
|
|
38214
|
-
graphWidth: graph.width
|
|
38548
|
+
graphWidth: graph.width,
|
|
38549
|
+
layout
|
|
38215
38550
|
}, commit.hash)),
|
|
38216
38551
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
38217
38552
|
ref: sentinelRef,
|
|
@@ -38844,7 +39179,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
38844
39179
|
const colsRef = (0, react.useRef)(null);
|
|
38845
39180
|
/** The pane's one vertical scroller — what "next change" moves. */
|
|
38846
39181
|
const scrollRef = (0, react.useRef)(null);
|
|
38847
|
-
|
|
39182
|
+
/** Where the rows are, filled in below once they exist. A ref, because the
|
|
39183
|
+
* walk is set up here and the rows are decided further down; reading it
|
|
39184
|
+
* only when a key is pressed is what lets the two live apart. */
|
|
39185
|
+
const rowsForNav = (0, react.useRef)([]);
|
|
39186
|
+
const { goToChange } = useChangeNav(scrollRef, (0, react.useCallback)(() => blockTopsFromRows(rowsForNav.current, 20, 8), []));
|
|
38848
39187
|
const [sides, setSides] = (0, react.useState)(null);
|
|
38849
39188
|
const [failed, setFailed] = (0, react.useState)(false);
|
|
38850
39189
|
const [hotBlock, setHotBlock] = (0, react.useState)(null);
|
|
@@ -38905,16 +39244,23 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
38905
39244
|
const file = parsePatch(sides.diff);
|
|
38906
39245
|
return file === null ? [] : alignRows(file);
|
|
38907
39246
|
}, [sides]);
|
|
38908
|
-
const
|
|
38909
|
-
|
|
39247
|
+
const win = useRowWindow(scrollRef, rows.length);
|
|
39248
|
+
const leftLines = (0, react.useMemo)(() => rows.map((row) => row.left === null ? "" : row.left.text), [rows]);
|
|
39249
|
+
const rightLines = (0, react.useMemo)(() => rows.map((row) => row.right === null ? "" : row.right.text), [rows]);
|
|
39250
|
+
const leftSyntax = (0, react.useMemo)(() => highlightWindow(leftLines, lang, shikiTheme, win.start, win.end), [
|
|
39251
|
+
leftLines,
|
|
38910
39252
|
lang,
|
|
38911
39253
|
shikiTheme,
|
|
39254
|
+
win.start,
|
|
39255
|
+
win.end,
|
|
38912
39256
|
grammarGen
|
|
38913
39257
|
]);
|
|
38914
|
-
const rightSyntax = (0, react.useMemo)(() =>
|
|
38915
|
-
|
|
39258
|
+
const rightSyntax = (0, react.useMemo)(() => highlightWindow(rightLines, lang, shikiTheme, win.start, win.end), [
|
|
39259
|
+
rightLines,
|
|
38916
39260
|
lang,
|
|
38917
39261
|
shikiTheme,
|
|
39262
|
+
win.start,
|
|
39263
|
+
win.end,
|
|
38918
39264
|
grammarGen
|
|
38919
39265
|
]);
|
|
38920
39266
|
/** The editor half of the pane, present only on the unstaged layer. */
|
|
@@ -38946,6 +39292,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
38946
39292
|
row,
|
|
38947
39293
|
i
|
|
38948
39294
|
})).filter((entry) => entry.row.left !== null), [rows]);
|
|
39295
|
+
const leftWin = useRowWindow(scrollRef, leftRows.length);
|
|
39296
|
+
rowsForNav.current = (0, react.useMemo)(() => rows.map((row) => row.block), [rows]);
|
|
38949
39297
|
/** Arm the editor from the payload on screen; the unstaged tab, and only
|
|
38950
39298
|
* for a payload `editableSides` accepts — armEdit itself refuses the rest,
|
|
38951
39299
|
* so even a stray call cannot put CRLF text into the buffer. */
|
|
@@ -39331,31 +39679,41 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
39331
39679
|
style: { flexBasis: `${split * 100}%` },
|
|
39332
39680
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
39333
39681
|
className: GitWorkbenchPanel_module_css_default.sideColGrid,
|
|
39334
|
-
children: bodyState.kind === "editor" ?
|
|
39335
|
-
|
|
39336
|
-
|
|
39337
|
-
|
|
39338
|
-
|
|
39339
|
-
|
|
39340
|
-
|
|
39341
|
-
|
|
39342
|
-
|
|
39343
|
-
|
|
39344
|
-
|
|
39345
|
-
|
|
39346
|
-
|
|
39347
|
-
|
|
39348
|
-
|
|
39349
|
-
|
|
39350
|
-
|
|
39351
|
-
|
|
39352
|
-
|
|
39353
|
-
|
|
39354
|
-
|
|
39355
|
-
|
|
39356
|
-
|
|
39357
|
-
|
|
39358
|
-
|
|
39682
|
+
children: bodyState.kind === "editor" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
39683
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowSpacer, { height: leftWin.padTop }),
|
|
39684
|
+
leftRows.slice(leftWin.start, leftWin.end).map((entry, kk) => {
|
|
39685
|
+
const k = leftWin.start + kk;
|
|
39686
|
+
const { row, i } = entry;
|
|
39687
|
+
const hot = hotBlock !== null && row.block === hotBlock;
|
|
39688
|
+
const hotClass = hot ? ` ${GitWorkbenchPanel_module_css_default.sideBlockHot}` : "";
|
|
39689
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
39690
|
+
className: `${sideNumClass(row, "left")}${hotClass}`,
|
|
39691
|
+
children: row.left.line
|
|
39692
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
39693
|
+
className: `${GitWorkbenchPanel_module_css_default.sideCode} ${sideCodeClass(row, "left")}${hotClass}`,
|
|
39694
|
+
"data-block": row.block >= 0 ? row.block : void 0,
|
|
39695
|
+
children: [renderSideCode(row.left, leftSyntax?.[i]), hot && k === hotFirstLeft ? blockBar(row.block) : null]
|
|
39696
|
+
})] }, `l${i}`);
|
|
39697
|
+
}),
|
|
39698
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowSpacer, { height: leftWin.padBottom })
|
|
39699
|
+
] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
39700
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowSpacer, { height: win.padTop }),
|
|
39701
|
+
rows.slice(win.start, win.end).map((row, k) => {
|
|
39702
|
+
const i = win.start + k;
|
|
39703
|
+
const hot = hotBlock !== null && row.block === hotBlock;
|
|
39704
|
+
const hotClass = hot ? ` ${GitWorkbenchPanel_module_css_default.sideBlockHot}` : "";
|
|
39705
|
+
const bar = hot && i === hotFirst && row.right === null ? blockBar(row.block) : null;
|
|
39706
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
39707
|
+
className: `${sideNumClass(row, "left")}${hotClass}`,
|
|
39708
|
+
children: row.left === null ? "" : row.left.line
|
|
39709
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
39710
|
+
className: `${GitWorkbenchPanel_module_css_default.sideCode} ${sideCodeClass(row, "left")}${hotClass}`,
|
|
39711
|
+
"data-block": row.block >= 0 ? row.block : void 0,
|
|
39712
|
+
children: [renderSideCode(row.left, leftSyntax?.[i]), bar]
|
|
39713
|
+
})] }, i);
|
|
39714
|
+
}),
|
|
39715
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowSpacer, { height: win.padBottom })
|
|
39716
|
+
] })
|
|
39359
39717
|
})
|
|
39360
39718
|
}),
|
|
39361
39719
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PaneDivider, {
|
|
@@ -39379,22 +39737,27 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
39379
39737
|
onSave: () => {
|
|
39380
39738
|
if (dirty && !saving) runSave(edit.baseSha);
|
|
39381
39739
|
}
|
|
39382
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.
|
|
39740
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
39383
39741
|
className: GitWorkbenchPanel_module_css_default.sideColGrid,
|
|
39384
|
-
children:
|
|
39385
|
-
|
|
39386
|
-
|
|
39387
|
-
|
|
39388
|
-
|
|
39389
|
-
|
|
39390
|
-
|
|
39391
|
-
|
|
39392
|
-
|
|
39393
|
-
|
|
39394
|
-
|
|
39395
|
-
|
|
39396
|
-
|
|
39397
|
-
|
|
39742
|
+
children: [
|
|
39743
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowSpacer, { height: win.padTop }),
|
|
39744
|
+
rows.slice(win.start, win.end).map((row, k) => {
|
|
39745
|
+
const i = win.start + k;
|
|
39746
|
+
const hot = hotBlock !== null && row.block === hotBlock;
|
|
39747
|
+
const hotClass = hot ? ` ${GitWorkbenchPanel_module_css_default.sideBlockHot}` : "";
|
|
39748
|
+
const bar = hot && i === hotFirst && row.right !== null ? blockBar(row.block) : null;
|
|
39749
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
39750
|
+
className: `${sideNumClass(row, "right")}${hotClass}`,
|
|
39751
|
+
children: row.right === null ? "" : row.right.line
|
|
39752
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
39753
|
+
className: `${GitWorkbenchPanel_module_css_default.sideCode} ${sideCodeClass(row, "right")}${hotClass}${layer === "unstaged" && armable ? ` ${GitWorkbenchPanel_module_css_default.sideArmable}` : ""}`,
|
|
39754
|
+
"data-block": row.block >= 0 ? row.block : void 0,
|
|
39755
|
+
onClick: layer === "unstaged" && armable ? armFromCell : void 0,
|
|
39756
|
+
children: [renderSideCode(row.right, rightSyntax?.[i]), bar]
|
|
39757
|
+
})] }, i);
|
|
39758
|
+
}),
|
|
39759
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowSpacer, { height: win.padBottom })
|
|
39760
|
+
]
|
|
39398
39761
|
})
|
|
39399
39762
|
})
|
|
39400
39763
|
]
|
|
@@ -39497,6 +39860,56 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
39497
39860
|
children: tok.text
|
|
39498
39861
|
}, i));
|
|
39499
39862
|
}
|
|
39863
|
+
/**
|
|
39864
|
+
* The rows a diff actually has to put in the DOM, tracked against its scroller.
|
|
39865
|
+
*
|
|
39866
|
+
* Rendering a whole file cost the pane 3.9 seconds of main thread and a
|
|
39867
|
+
* 3.6-second frozen frame at 4,000 lines — for a one-line change, because the
|
|
39868
|
+
* side-by-side view draws every line of the file whether it changed or not.
|
|
39869
|
+
* This is the fix that removes the length from the cost rather than capping it.
|
|
39870
|
+
*
|
|
39871
|
+
* The window is held in state rather than the raw scroll offset so a scroll
|
|
39872
|
+
* that does not move it renders nothing: `start` only changes once a whole row
|
|
39873
|
+
* has passed under the viewport's edge.
|
|
39874
|
+
*
|
|
39875
|
+
* @param scrollRef - the element that scrolls the rows.
|
|
39876
|
+
* @param rowCount - how many rows the diff has.
|
|
39877
|
+
* @returns the rows to render and the spacer heights standing in for the rest.
|
|
39878
|
+
*/
|
|
39879
|
+
function useRowWindow(scrollRef, rowCount) {
|
|
39880
|
+
const [win, setWin] = (0, react.useState)(() => rowWindow(0, 0, rowCount));
|
|
39881
|
+
(0, react.useEffect)(() => {
|
|
39882
|
+
const el = scrollRef.current;
|
|
39883
|
+
if (el === null) return;
|
|
39884
|
+
const read = () => {
|
|
39885
|
+
const next = rowWindow(el.scrollTop, el.clientHeight, rowCount);
|
|
39886
|
+
setWin((prev) => prev.start === next.start && prev.end === next.end ? prev : next);
|
|
39887
|
+
};
|
|
39888
|
+
read();
|
|
39889
|
+
el.addEventListener("scroll", read, { passive: true });
|
|
39890
|
+
const observer = new ResizeObserver(read);
|
|
39891
|
+
observer.observe(el);
|
|
39892
|
+
return () => {
|
|
39893
|
+
el.removeEventListener("scroll", read);
|
|
39894
|
+
observer.disconnect();
|
|
39895
|
+
};
|
|
39896
|
+
}, [scrollRef, rowCount]);
|
|
39897
|
+
return win;
|
|
39898
|
+
}
|
|
39899
|
+
/**
|
|
39900
|
+
* The spacer standing in for the rows above or below the window.
|
|
39901
|
+
*
|
|
39902
|
+
* It spans every column of the grid, so a blame gutter does not change it.
|
|
39903
|
+
* @param height - px of rows it stands in for; nothing is rendered for 0.
|
|
39904
|
+
*/
|
|
39905
|
+
function RowSpacer({ height }) {
|
|
39906
|
+
if (height <= 0) return null;
|
|
39907
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
39908
|
+
className: GitWorkbenchPanel_module_css_default.sideSpacer,
|
|
39909
|
+
style: { height: `${height}px` },
|
|
39910
|
+
"aria-hidden": "true"
|
|
39911
|
+
});
|
|
39912
|
+
}
|
|
39500
39913
|
/** Split a combined `git diff` into path -> its segment text. */
|
|
39501
39914
|
function splitDiff(diff) {
|
|
39502
39915
|
const out = /* @__PURE__ */ new Map();
|
|
@@ -39623,6 +40036,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
39623
40036
|
styleFailed: "保存失败",
|
|
39624
40037
|
resizeLabel: "拖动调整抽屉宽度",
|
|
39625
40038
|
resizeCommits: "拖动调整提交列表宽度",
|
|
40039
|
+
historyLayout: "提交列表布局",
|
|
40040
|
+
layoutColumns: "并排:列表与差异分列",
|
|
40041
|
+
layoutStacked: "上下:列表横跨顶部",
|
|
39626
40042
|
resizeTree: "拖动调整文件树宽度",
|
|
39627
40043
|
resizeSides: "拖动调整左右两栏宽度",
|
|
39628
40044
|
sourceLabel: "统计来源切换",
|
|
@@ -39832,6 +40248,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
39832
40248
|
styleFailed: "Could not save",
|
|
39833
40249
|
resizeLabel: "Drag to resize the drawer",
|
|
39834
40250
|
resizeCommits: "Drag to resize the commit list",
|
|
40251
|
+
historyLayout: "Commit list layout",
|
|
40252
|
+
layoutColumns: "Side by side: list beside the diff",
|
|
40253
|
+
layoutStacked: "Stacked: list across the top",
|
|
39835
40254
|
resizeTree: "Drag to resize the file tree",
|
|
39836
40255
|
resizeSides: "Drag to resize the two columns",
|
|
39837
40256
|
sourceLabel: "Switch stats source",
|
|
@@ -39997,11 +40416,15 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
39997
40416
|
const result = await connection.rpc.call("/api", "gitWorkbench/stats", worktreePath === void 0 ? { args: {} } : { args: { worktreePath } }, signal);
|
|
39998
40417
|
return result.ok ? result.value : null;
|
|
39999
40418
|
},
|
|
40000
|
-
fetchFileDiff: async (worktreePath, path, commit, signal) => {
|
|
40419
|
+
fetchFileDiff: async (worktreePath, path, commit, range, signal) => {
|
|
40001
40420
|
const result = await connection.rpc.call("/api", "gitWorkbench/fileDiff", { args: {
|
|
40002
40421
|
worktreePath: worktreePath ?? "",
|
|
40003
40422
|
path,
|
|
40004
|
-
...commit === void 0 ? {} : { commit }
|
|
40423
|
+
...commit === void 0 ? {} : { commit },
|
|
40424
|
+
...range === void 0 ? {} : {
|
|
40425
|
+
base: range.base,
|
|
40426
|
+
head: range.head
|
|
40427
|
+
}
|
|
40005
40428
|
} }, signal);
|
|
40006
40429
|
return result.ok ? result.value.diff : "";
|
|
40007
40430
|
},
|