@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/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
- * Measured off the DOM rather than derived from a row model: a model knows
878
- * which rows changed, not how many pixels down the page they sit, and the
879
- * rows are never the only thing in the scroller padding, a sticky bar and,
880
- * in the armed side-by-side pane, a CodeMirror view of a different height
881
- * all move the answer. One layout read per PRESS is cheap; nothing here runs
882
- * on scroll.
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 tops = blockTops();
909
- const target = stepToBlock(tops, anchorFrom(tops, scroller.scrollTop, navMemory.current), direction);
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
- "headerTotals": "SD8qLW_headerTotals",
1116
- "refButton": "SD8qLW_refButton",
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
- "checkBox": "SD8qLW_checkBox",
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
- "bgEmpty": "SD8qLW_bgEmpty",
1173
- "commitPop": "SD8qLW_commitPop",
1174
- "treeDirCounts": "SD8qLW_treeDirCounts",
1175
- "tree": "SD8qLW_tree",
1176
- "commitHash": "SD8qLW_commitHash",
1177
- "fileCountDel": "SD8qLW_fileCountDel",
1178
- "checkMarkPartial": "SD8qLW_checkMarkPartial",
1179
- "file": "SD8qLW_file",
1180
- "btnIcon": "SD8qLW_btnIcon",
1181
- "headerPathMain": "SD8qLW_headerPathMain",
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
- "calOut": "SD8qLW_calOut",
1187
- "fileStatus": "SD8qLW_fileStatus",
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
- "treeIconOn": "SD8qLW_treeIconOn",
1218
- "btnAhead": "SD8qLW_btnAhead",
1219
- "filterChips": "SD8qLW_filterChips",
1263
+ "commitPopTop": "SD8qLW_commitPopTop",
1220
1264
  "fbDirName": "SD8qLW_fbDirName",
1221
- "sideColGrid": "SD8qLW_sideColGrid",
1222
- "treeActions": "SD8qLW_treeActions",
1223
- "sideActions": "SD8qLW_sideActions",
1224
- "sideNum": "SD8qLW_sideNum",
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
- "headerTotalsAdd": "SD8qLW_headerTotalsAdd",
1227
- "fbCommitHash": "SD8qLW_fbCommitHash",
1228
- "syncLevel": "SD8qLW_syncLevel",
1229
- "blockBtn": "SD8qLW_blockBtn",
1230
- "calNav": "SD8qLW_calNav",
1231
- "bgPreview": "SD8qLW_bgPreview",
1232
- "funnelPreset": "SD8qLW_funnelPreset",
1233
- "commitSubjectRow": "SD8qLW_commitSubjectRow",
1234
- "cardBranch": "SD8qLW_cardBranch",
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
- "confirmScrim": "SD8qLW_confirmScrim",
1237
- "refValue": "SD8qLW_refValue",
1238
- "refPicker": "SD8qLW_refPicker",
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
- "funnelFootCountOn": "SD8qLW_funnelFootCountOn",
1248
- "diffWrap": "SD8qLW_diffWrap",
1249
- "funnelTabs": "SD8qLW_funnelTabs",
1250
- "sidePane": "SD8qLW_sidePane",
1251
- "sideCode": "SD8qLW_sideCode",
1252
- "calToday": "SD8qLW_calToday",
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
- "pathNode": "SD8qLW_pathNode",
1260
- "commitsFoot": "SD8qLW_commitsFoot",
1261
- "cardAhead": "SD8qLW_cardAhead",
1262
- "commitAuthor": "SD8qLW_commitAuthor",
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
- "opBannerOk": "SD8qLW_opBannerOk",
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
- "sideBannerTitle": "SD8qLW_sideBannerTitle",
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
- "cardFiles": "SD8qLW_cardFiles",
1273
- "renameLine": "SD8qLW_renameLine",
1274
- "btn": "SD8qLW_btn",
1275
- "treeDir": "SD8qLW_treeDir",
1276
- "funnelBoundValSet": "SD8qLW_funnelBoundValSet",
1277
- "resizerActive": "SD8qLW_resizerActive",
1278
- "themeNote": "SD8qLW_themeNote",
1279
- "funnelSearch": "SD8qLW_funnelSearch",
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
- "fileActive": "SD8qLW_fileActive",
1282
- "sideNavCount": "SD8qLW_sideNavCount",
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
- "fbTree": "SD8qLW_fbTree",
1294
- "commitPopMeta": "SD8qLW_commitPopMeta",
1295
- "elide": "SD8qLW_elide",
1409
+ "filterChips": "SD8qLW_filterChips",
1410
+ "chevronOpen": "SD8qLW_chevronOpen",
1296
1411
  "lnOld": "SD8qLW_lnOld",
1297
- "commitCopy": "SD8qLW_commitCopy",
1298
- "card": "SD8qLW_card",
1299
- "commits": "SD8qLW_commits",
1300
- "funnelBounds": "SD8qLW_funnelBounds",
1412
+ "commitActive": "SD8qLW_commitActive",
1413
+ "funnelBoundBtn": "SD8qLW_funnelBoundBtn",
1414
+ "commitsSentinel": "SD8qLW_commitsSentinel",
1415
+ "stUntracked": "SD8qLW_stUntracked",
1301
1416
  "lineAdd": "SD8qLW_lineAdd",
1302
- "sideEditCell": "SD8qLW_sideEditCell",
1303
- "tab": "SD8qLW_tab",
1304
- "syncUpstream": "SD8qLW_syncUpstream",
1305
- "headerTotalsDel": "SD8qLW_headerTotalsDel",
1417
+ "sideScroll": "SD8qLW_sideScroll",
1306
1418
  "fbCommitHint": "SD8qLW_fbCommitHint",
1307
- "funnelFoot": "SD8qLW_funnelFoot",
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
- "calWeek": "SD8qLW_calWeek",
1319
- "fbRow": "SD8qLW_fbRow",
1320
- "fbPath": "SD8qLW_fbPath",
1321
- "fbCommitWho": "SD8qLW_fbCommitWho",
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
- "commitsPane": "SD8qLW_commitsPane",
1343
- "commitMeta": "SD8qLW_commitMeta",
1344
- "btnPrimary": "SD8qLW_btnPrimary",
1345
- "treeDirActive": "SD8qLW_treeDirActive",
1346
- "sideCodeAdd": "SD8qLW_sideCodeAdd",
1347
- "commitsSentinel": "SD8qLW_commitsSentinel",
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
- "header": "SD8qLW_header",
1350
- "filePath": "SD8qLW_filePath",
1351
- "treeLabel": "SD8qLW_treeLabel",
1352
- "sideArmable": "SD8qLW_sideArmable",
1353
- "cardDeleted": "SD8qLW_cardDeleted",
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
- "checkMarkOn": "SD8qLW_checkMarkOn",
1356
- "funnel": "SD8qLW_funnel",
1357
- "theme": "SD8qLW_theme",
1358
- "calMark": "SD8qLW_calMark",
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
- "checkMark": "SD8qLW_checkMark",
1368
- "headerView": "SD8qLW_headerView",
1369
- "refLabel": "SD8qLW_refLabel",
1370
- "sideCodeDel": "SD8qLW_sideCodeDel",
1371
- "btnClose": "SD8qLW_btnClose",
1372
- "fileBinary": "SD8qLW_fileBinary",
1373
- "funnelBoundClear": "SD8qLW_funnelBoundClear",
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
- "elideHead": "SD8qLW_elideHead",
1390
- "menuPop": "SD8qLW_menuPop",
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
- "bodyRow": "SD8qLW_bodyRow",
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
- "drawer": "SD8qLW_drawer",
1480
+ "refEmpty": "SD8qLW_refEmpty",
1408
1481
  "sideColGridBlame": "SD8qLW_sideColGridBlame",
1409
- "themeRail": "SD8qLW_themeRail",
1410
- "sideScroll": "SD8qLW_sideScroll",
1411
- "miniBtn": "SD8qLW_miniBtn",
1412
- "scopeHint": "SD8qLW_scopeHint",
1413
- "funnelName": "SD8qLW_funnelName",
1414
- "gsSlide": "SD8qLW_gsSlide",
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
- "paneDividerActive": "SD8qLW_paneDividerActive",
1424
- "sliderRow": "SD8qLW_sliderRow",
1425
- "wtCurrent": "SD8qLW_wtCurrent",
1426
- "funnelBoundRow": "SD8qLW_funnelBoundRow",
1489
+ "calToday": "SD8qLW_calToday",
1490
+ "funnelBoundVal": "SD8qLW_funnelBoundVal",
1491
+ "diffScroll": "SD8qLW_diffScroll",
1492
+ "headerBranch": "SD8qLW_headerBranch",
1427
1493
  "pathFileGlyph": "SD8qLW_pathFileGlyph",
1428
- "commitSubject": "SD8qLW_commitSubject",
1429
- "sideColRight": "SD8qLW_sideColRight",
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
- "sideTabs": "SD8qLW_sideTabs",
1432
- "commitRow": "SD8qLW_commitRow",
1433
- "refRowSpacer": "SD8qLW_refRowSpacer"
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
- if (tab === "compare") return Promise.resolve("");
34998
- return fetchFileDiff(statsPath, path, tab === "history" ? commitHash ?? void 0 : void 0, signal);
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" && branches.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
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": tab === "history" ? "" : void 0,
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 of exactly {@link GRAPH_ROW_H} pixels, so consecutive rows
37324
- * butt together and a lane reads as one unbroken line down the list. The dot
37325
- * sits at the vertical centre; edges leave the top edge, the dot, or the bottom
37326
- * edge, and a cubic with its control points at the quarter heights gives the
37327
- * S-curve every git client draws for a branch or a merge.
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 = GRAPH_ROW_H / 2;
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 ${GRAPH_ROW_H}`,
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 ${GRAPH_ROW_H}`,
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)} 21, ${laneX(lane)} 21, ${laneX(lane)} ${GRAPH_ROW_H}`,
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: GRAPH_ROW_H,
37366
- viewBox: `0 0 ${w} ${GRAPH_ROW_H}`,
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
- }) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
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
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
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 commit log as its own full-height pane.
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
- * It sits BESIDE the file tree rather than stacked above it, which is what
37711
- * GitHub Desktop, the JetBrains git log and GitKraken all do: a commit list and
37712
- * the selected commit's files are peer panes, each with its own scrollbar. The
37713
- * earlier stacked layout had to be collapsible because two scrolling lists were
37714
- * sharing one narrow column a control that hid the thing you were reading and
37715
- * that nobody could be expected to discover. Side by side, there is nothing to
37716
- * collapse and nothing to explain.
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
- const { goToChange } = useChangeNav(scrollRef);
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 leftSyntax = (0, react.useMemo)(() => highlightFile(rows.map((row) => row.left === null ? "" : row.left.text), lang, shikiTheme), [
38909
- rows,
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)(() => highlightFile(rows.map((row) => row.right === null ? "" : row.right.text), lang, shikiTheme), [
38915
- rows,
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" ? leftRows.map((entry, k) => {
39335
- const { row, i } = entry;
39336
- const hot = hotBlock !== null && row.block === hotBlock;
39337
- const hotClass = hot ? ` ${GitWorkbenchPanel_module_css_default.sideBlockHot}` : "";
39338
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39339
- className: `${sideNumClass(row, "left")}${hotClass}`,
39340
- children: row.left.line
39341
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
39342
- className: `${GitWorkbenchPanel_module_css_default.sideCode} ${sideCodeClass(row, "left")}${hotClass}`,
39343
- "data-block": row.block >= 0 ? row.block : void 0,
39344
- children: [renderSideCode(row.left, leftSyntax?.[i]), hot && k === hotFirstLeft ? blockBar(row.block) : null]
39345
- })] }, `l${i}`);
39346
- }) : rows.map((row, i) => {
39347
- const hot = hotBlock !== null && row.block === hotBlock;
39348
- const hotClass = hot ? ` ${GitWorkbenchPanel_module_css_default.sideBlockHot}` : "";
39349
- const bar = hot && i === hotFirst && row.right === null ? blockBar(row.block) : null;
39350
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39351
- className: `${sideNumClass(row, "left")}${hotClass}`,
39352
- children: row.left === null ? "" : row.left.line
39353
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
39354
- className: `${GitWorkbenchPanel_module_css_default.sideCode} ${sideCodeClass(row, "left")}${hotClass}`,
39355
- "data-block": row.block >= 0 ? row.block : void 0,
39356
- children: [renderSideCode(row.left, leftSyntax?.[i]), bar]
39357
- })] }, i);
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.jsx)("div", {
39740
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
39383
39741
  className: GitWorkbenchPanel_module_css_default.sideColGrid,
39384
- children: rows.map((row, i) => {
39385
- const hot = hotBlock !== null && row.block === hotBlock;
39386
- const hotClass = hot ? ` ${GitWorkbenchPanel_module_css_default.sideBlockHot}` : "";
39387
- const bar = hot && i === hotFirst && row.right !== null ? blockBar(row.block) : null;
39388
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
39389
- className: `${sideNumClass(row, "right")}${hotClass}`,
39390
- children: row.right === null ? "" : row.right.line
39391
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
39392
- className: `${GitWorkbenchPanel_module_css_default.sideCode} ${sideCodeClass(row, "right")}${hotClass}${layer === "unstaged" && armable ? ` ${GitWorkbenchPanel_module_css_default.sideArmable}` : ""}`,
39393
- "data-block": row.block >= 0 ? row.block : void 0,
39394
- onClick: layer === "unstaged" && armable ? armFromCell : void 0,
39395
- children: [renderSideCode(row.right, rightSyntax?.[i]), bar]
39396
- })] }, i);
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
  },