gitxelectron 1.3.9 → 1.4.2

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.
@@ -12750,37 +12750,6 @@ function RepositoryWizard({ repoPath, onClose, onSuccess }) {
12750
12750
  const [localProgress, setLocalProgress] = reactExports.useState(
12751
12751
  null
12752
12752
  );
12753
- reactExports.useEffect(() => {
12754
- checkAuth();
12755
- if (window.api.onMassivePushProgress) {
12756
- window.api.onMassivePushProgress((data) => {
12757
- setMassivePushData(data);
12758
- });
12759
- }
12760
- }, []);
12761
- const checkAuth = async () => {
12762
- const status = await window.api.getAuthStatus();
12763
- if (status.status !== "Verified") {
12764
- startAuth();
12765
- } else {
12766
- setStep(2);
12767
- fetchUserRepos();
12768
- }
12769
- };
12770
- const startAuth = async () => {
12771
- try {
12772
- const data = await window.api.startDeviceFlow();
12773
- setDeviceFlowData(data);
12774
- await window.api.pollDeviceFlow(data.device_code, data.interval * 1e3);
12775
- const newStatus = await window.api.getAuthStatus();
12776
- if (newStatus.status === "Verified") {
12777
- setStep(2);
12778
- fetchUserRepos();
12779
- }
12780
- } catch (e) {
12781
- setError(e.message);
12782
- }
12783
- };
12784
12753
  const fetchUserRepos = async () => {
12785
12754
  try {
12786
12755
  const repos = await window.api.getUserRepositories();
@@ -12792,6 +12761,41 @@ function RepositoryWizard({ repoPath, onClose, onSuccess }) {
12792
12761
  console.error(e);
12793
12762
  }
12794
12763
  };
12764
+ reactExports.useEffect(() => {
12765
+ let isMounted = true;
12766
+ const verifyAndLoad = async () => {
12767
+ try {
12768
+ const status = await window.api.getAuthStatus();
12769
+ if (!isMounted) return;
12770
+ if (status.status !== "Verified") {
12771
+ const data = await window.api.startDeviceFlow();
12772
+ if (!isMounted) return;
12773
+ setDeviceFlowData(data);
12774
+ await window.api.pollDeviceFlow(data.device_code, data.interval * 1e3);
12775
+ const newStatus = await window.api.getAuthStatus();
12776
+ if (!isMounted) return;
12777
+ if (newStatus.status === "Verified") {
12778
+ setStep(2);
12779
+ fetchUserRepos();
12780
+ }
12781
+ } else {
12782
+ setStep(2);
12783
+ fetchUserRepos();
12784
+ }
12785
+ } catch (e) {
12786
+ if (isMounted) setError(e.message);
12787
+ }
12788
+ };
12789
+ verifyAndLoad();
12790
+ if (window.api.onMassivePushProgress) {
12791
+ window.api.onMassivePushProgress((data) => {
12792
+ setMassivePushData(data);
12793
+ });
12794
+ }
12795
+ return () => {
12796
+ isMounted = false;
12797
+ };
12798
+ }, []);
12795
12799
  const handleProceed = async () => {
12796
12800
  setIsLoading(true);
12797
12801
  setError("");
@@ -12799,6 +12803,7 @@ function RepositoryWizard({ repoPath, onClose, onSuccess }) {
12799
12803
  localStorage.setItem("gitquickpush-last-repo", repoPath);
12800
12804
  setLocalProgress({ percentage: 5, eta: "Initializing Git locally..." });
12801
12805
  await window.api.initRepo(repoPath);
12806
+ await window.api.setRepoPath(repoPath);
12802
12807
  if (action === "new") {
12803
12808
  setLocalProgress({ percentage: 15, eta: "Creating GitHub Repository..." });
12804
12809
  const autoInit = addReadme || !!gitignoreTemplate || !!licenseTemplate;
@@ -12812,9 +12817,10 @@ function RepositoryWizard({ repoPath, onClose, onSuccess }) {
12812
12817
  );
12813
12818
  setLocalProgress({ percentage: 35, eta: "Linking Remote..." });
12814
12819
  await window.api.addRemote("origin", newRepo.clone_url);
12820
+ const defaultBranch = newRepo.default_branch || "main";
12815
12821
  if (autoInit) {
12816
12822
  setLocalProgress({ percentage: 45, eta: "Syncing with Remote..." });
12817
- await window.api.resetToRemote("origin", "main");
12823
+ await window.api.resetToRemote("origin", defaultBranch);
12818
12824
  }
12819
12825
  setLocalProgress({ percentage: 55, eta: "Scanning files..." });
12820
12826
  const status = await window.api.getStatus();
@@ -12832,7 +12838,7 @@ function RepositoryWizard({ repoPath, onClose, onSuccess }) {
12832
12838
  }
12833
12839
  setLocalProgress({ percentage: 95, eta: "Pushing to GitHub..." });
12834
12840
  const branches = await window.api.getBranches();
12835
- const currentBranch = branches.current || "main";
12841
+ const currentBranch = branches.current || defaultBranch;
12836
12842
  await window.api.pushToRemote("origin", currentBranch);
12837
12843
  setLocalProgress({ percentage: 100, eta: "Complete!" });
12838
12844
  } else if (action === "existing") {
@@ -12842,8 +12848,10 @@ function RepositoryWizard({ repoPath, onClose, onSuccess }) {
12842
12848
  setLocalProgress({ percentage: 80, eta: "Fetching remote data..." });
12843
12849
  await window.api.fetchRemote();
12844
12850
  }
12851
+ await window.api.setRepoPath(repoPath);
12845
12852
  setLocalProgress({ percentage: 100, eta: "Complete!" });
12846
12853
  } else if (action === "local") {
12854
+ await window.api.setRepoPath(repoPath);
12847
12855
  localStorage.setItem(`gitquickpush-wizard-dismissed-${repoPath}`, "true");
12848
12856
  }
12849
12857
  onSuccess();
@@ -13819,8 +13827,16 @@ const LiveGitHubSpace = React.memo(() => {
13819
13827
  pollEvents();
13820
13828
  const intervalId = setInterval(pollEvents, 6e4);
13821
13829
  let lastSpawnTime = 0;
13830
+ let lastDrawTime = 0;
13831
+ const FPS = 30;
13832
+ const frameInterval = 1e3 / FPS;
13822
13833
  const update = (time2) => {
13823
13834
  if (!isRunning) return;
13835
+ if (time2 - lastDrawTime < frameInterval) {
13836
+ animationFrameId = requestAnimationFrame(update);
13837
+ return;
13838
+ }
13839
+ lastDrawTime = time2;
13824
13840
  if (time2 - lastSpawnTime > 800 && (eventQueue.length > 0 || fallbackQueue.length > 0)) {
13825
13841
  let ev;
13826
13842
  if (eventQueue.length > 0) {
@@ -13846,8 +13862,7 @@ const LiveGitHubSpace = React.memo(() => {
13846
13862
  });
13847
13863
  lastSpawnTime = time2;
13848
13864
  }
13849
- ctx.fillStyle = "#0d1117";
13850
- ctx.fillRect(0, 0, canvas.width, canvas.height);
13865
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
13851
13866
  ctx.fillStyle = "white";
13852
13867
  stars.forEach((s) => {
13853
13868
  s.x -= s.speed;
@@ -14254,7 +14269,7 @@ const DiceGame = () => {
14254
14269
  ) })
14255
14270
  ] }) });
14256
14271
  };
14257
- const SpaceScene = ({ fullScreen, onGameActiveChange }) => {
14272
+ const SpaceScene = ({ fullScreen, liteMode, onGameActiveChange }) => {
14258
14273
  const [isOnline, setIsOnline] = reactExports.useState(navigator.onLine);
14259
14274
  const [activeMode, setActiveMode] = reactExports.useState("none");
14260
14275
  reactExports.useEffect(() => {
@@ -14290,10 +14305,12 @@ const SpaceScene = ({ fullScreen, onGameActiveChange }) => {
14290
14305
  {
14291
14306
  className: `${fullScreen ? "absolute inset-0 z-0" : "relative w-full h-48 rounded-xl mb-6 border border-border mt-2 shadow-inner"} bg-[#0d1117] overflow-hidden group`,
14292
14307
  children: [
14293
- currentMode === "retro" && /* @__PURE__ */ jsxRuntimeExports.jsx(RetroSpaceGame, {}),
14294
- currentMode === "2048" && /* @__PURE__ */ jsxRuntimeExports.jsx(LogicGame2048, {}),
14295
- currentMode === "dice" && /* @__PURE__ */ jsxRuntimeExports.jsx(DiceGame, {}),
14296
- currentMode === "none" && /* @__PURE__ */ jsxRuntimeExports.jsx(LiveGitHubSpace, {}),
14308
+ liteMode ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-[radial-gradient(ellipse_at_center,_var(--tw-gradient-stops))] from-slate-900 via-[#0d1117] to-[#0d1117]", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute bottom-4 right-4 flex items-center justify-center text-white/15 pointer-events-none", title: "Lite Mode Active", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M13 10V3L4 14h7v7l9-11h-7z" }) }) }) }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
14309
+ currentMode === "retro" && /* @__PURE__ */ jsxRuntimeExports.jsx(RetroSpaceGame, {}),
14310
+ currentMode === "2048" && /* @__PURE__ */ jsxRuntimeExports.jsx(LogicGame2048, {}),
14311
+ currentMode === "dice" && /* @__PURE__ */ jsxRuntimeExports.jsx(DiceGame, {}),
14312
+ currentMode === "none" && /* @__PURE__ */ jsxRuntimeExports.jsx(LiveGitHubSpace, {})
14313
+ ] }),
14297
14314
  /* @__PURE__ */ jsxRuntimeExports.jsx(
14298
14315
  "button",
14299
14316
  {
@@ -23143,7 +23160,7 @@ function UniversalPushWizard({ isOpen, onClose, onAutoHealTrigger }) {
23143
23160
  reset();
23144
23161
  }
23145
23162
  }, [isOpen]);
23146
- const reset = () => {
23163
+ function reset() {
23147
23164
  setStep("START");
23148
23165
  setFiles([]);
23149
23166
  setAccounts([]);
@@ -23163,7 +23180,7 @@ function UniversalPushWizard({ isOpen, onClose, onAutoHealTrigger }) {
23163
23180
  setShowDiff(false);
23164
23181
  setCommitMessage("");
23165
23182
  setErrorMsg("");
23166
- };
23183
+ }
23167
23184
  const handleClose = async () => {
23168
23185
  if (workspacePath) {
23169
23186
  await window.api.cleanupUniversalWorkspace(workspacePath);
@@ -23898,22 +23915,27 @@ function UniversalPushWizard({ isOpen, onClose, onAutoHealTrigger }) {
23898
23915
  function WelcomeWizard({ onComplete }) {
23899
23916
  const [step, setStep] = reactExports.useState(1);
23900
23917
  const [deviceFlowData, setDeviceFlowData] = reactExports.useState(null);
23901
- const [authStatus, setAuthStatus] = reactExports.useState("pending");
23918
+ const [authStatus, setAuthStatus] = reactExports.useState(
23919
+ "pending"
23920
+ );
23902
23921
  const [pinInput, setPinInput] = reactExports.useState("");
23903
23922
  const [isFinishing, setIsFinishing] = reactExports.useState(false);
23904
23923
  const [authError, setAuthError] = reactExports.useState("");
23905
23924
  const [isCopied, setIsCopied] = reactExports.useState(false);
23906
- const copyCodeToClipboard = reactExports.useCallback(async (codeToCopy) => {
23907
- const code = codeToCopy || deviceFlowData?.user_code;
23908
- if (!code) return;
23909
- try {
23910
- await navigator.clipboard.writeText(code);
23911
- setIsCopied(true);
23912
- setTimeout(() => setIsCopied(false), 2500);
23913
- } catch (err) {
23914
- console.warn("Failed to copy to clipboard", err);
23915
- }
23916
- }, [deviceFlowData]);
23925
+ const copyCodeToClipboard = reactExports.useCallback(
23926
+ async (codeToCopy) => {
23927
+ const code = codeToCopy || deviceFlowData?.user_code;
23928
+ if (!code) return;
23929
+ try {
23930
+ await navigator.clipboard.writeText(code);
23931
+ setIsCopied(true);
23932
+ setTimeout(() => setIsCopied(false), 2500);
23933
+ } catch (err) {
23934
+ console.warn("Failed to copy to clipboard", err);
23935
+ }
23936
+ },
23937
+ [deviceFlowData]
23938
+ );
23917
23939
  const startAuth = async () => {
23918
23940
  try {
23919
23941
  setAuthStatus("waiting");
@@ -24812,7 +24834,7 @@ const CollaborationRepoView = ({
24812
24834
  collaboratedRepos.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-secondary flex-wrap px-1", children: [
24813
24835
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] font-medium text-secondary/80", children: "Filter summary:" }),
24814
24836
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1 bg-surface border border-border px-2.5 py-1 rounded-lg font-mono text-[11px] text-primary", children: [
24815
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 rounded-full bg-white" }),
24837
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 rounded-full bg-emerald-400" }),
24816
24838
  connectedCount,
24817
24839
  " Connected"
24818
24840
  ] }),
@@ -24909,7 +24931,7 @@ const CollaborationRepoView = ({
24909
24931
  children: repo.name
24910
24932
  }
24911
24933
  ),
24912
- repo.private ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] bg-amber-500/10 text-amber-400 border border-amber-500/25 px-2 py-0.2 rounded-full font-medium flex-shrink-0", children: "Private" }) : /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] bg-emerald-500/10 text-white border border-emerald-500/25 px-2 py-0.2 rounded-full font-medium flex-shrink-0", children: "Public" }),
24934
+ repo.private ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] bg-amber-500/10 text-amber-400 border border-amber-500/25 px-2 py-0.2 rounded-full font-medium flex-shrink-0", children: "Private" }) : /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] bg-emerald-500/10 text-emerald-400 border border-emerald-500/25 px-2 py-0.2 rounded-full font-medium flex-shrink-0", children: "Public" }),
24913
24935
  isCurrentActive && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[9px] bg-brand text-white px-2 py-0.5 rounded-full font-bold uppercase tracking-wider flex-shrink-0 shadow-xs", children: "Active" })
24914
24936
  ] }),
24915
24937
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mt-1 text-xs text-secondary min-w-0 flex-wrap", children: [
@@ -24953,7 +24975,7 @@ const CollaborationRepoView = ({
24953
24975
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 flex-1", children: savedPath ? isMissing ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
24954
24976
  "div",
24955
24977
  {
24956
- className: "inline-flex items-center gap-1.5 text-xs text-danger font-mono bg-danger text-white border border-border px-2.5 py-1 rounded-lg min-w-0 max-w-full truncate",
24978
+ className: "inline-flex items-center gap-1.5 text-xs text-danger font-mono bg-danger/10 border border-danger/30 px-2.5 py-1 rounded-lg min-w-0 max-w-full truncate",
24957
24979
  title: `Folder was deleted or moved: ${savedPath}`,
24958
24980
  children: [
24959
24981
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-danger animate-pulse flex-shrink-0" }),
@@ -24963,10 +24985,10 @@ const CollaborationRepoView = ({
24963
24985
  ) : /* @__PURE__ */ jsxRuntimeExports.jsxs(
24964
24986
  "div",
24965
24987
  {
24966
- className: "inline-flex items-center gap-1.5 text-xs text-white font-mono bg-success text-white border border-border px-2.5 py-1 rounded-lg min-w-0 max-w-full truncate",
24988
+ className: "inline-flex items-center gap-1.5 text-xs text-emerald-400 font-mono bg-emerald-500/10 border border-emerald-500/25 px-2.5 py-1 rounded-lg min-w-0 max-w-full truncate",
24967
24989
  title: savedPath,
24968
24990
  children: [
24969
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-white flex-shrink-0" }),
24991
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-emerald-400 flex-shrink-0" }),
24970
24992
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: savedPath.split("\\").pop() || savedPath })
24971
24993
  ]
24972
24994
  }
@@ -25045,7 +25067,7 @@ const CollaborationRepoView = ({
25045
25067
  e.stopPropagation();
25046
25068
  onRepoCardClick(repo);
25047
25069
  },
25048
- className: `px-3.5 py-1.5 text-xs font-semibold rounded-xl transition-all shadow-xs flex items-center gap-1.5 ${savedPath ? isMissing ? "bg-danger hover:bg-danger text-white text-danger border border-danger/40" : "bg-brand hover:bg-brand-hover text-white shadow-brand/20" : "bg-brand hover:bg-brand-hover text-white shadow-brand/20"}`,
25070
+ className: `px-3.5 py-1.5 text-xs font-semibold rounded-xl transition-all shadow-xs flex items-center gap-1.5 ${savedPath ? isMissing ? "bg-danger hover:bg-danger/80 text-white border border-danger/40" : "bg-brand hover:bg-brand-hover text-white shadow-brand/20" : "bg-brand hover:bg-brand-hover text-white shadow-brand/20"}`,
25049
25071
  children: [
25050
25072
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: savedPath ? isMissing ? "Re-Clone" : "Open Repo" : "Clone" }),
25051
25073
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: isMissing ? "☁️" : savedPath ? "→" : "☁️" })
@@ -25083,7 +25105,7 @@ const CommitReceiptPrinter = ({
25083
25105
  commit,
25084
25106
  onClose
25085
25107
  }) => {
25086
- const [isPrinted, setIsPrinted] = reactExports.useState(true);
25108
+ const [isPrinted, setIsPrinted] = reactExports.useState(false);
25087
25109
  const [searchQuery, setSearchQuery] = reactExports.useState("");
25088
25110
  const [scrollTop, setScrollTop] = reactExports.useState(0);
25089
25111
  const scrollRef = reactExports.useRef(null);
@@ -25118,13 +25140,13 @@ const CommitReceiptPrinter = ({
25118
25140
  onClose && /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "printer-close-btn", onClick: onClose, title: "Close Printer", children: "✕" }),
25119
25141
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "printer-machine-head", children: [
25120
25142
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "printer" }),
25121
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "printer-display", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "printer-message", children: searchQuery ? `${filteredFiles.length} found` : `${allFiles.length} files` }) }),
25143
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "printer-display", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "printer-message", children: isPrinted ? searchQuery ? `${filteredFiles.length} found` : `${allFiles.length} files` : "Click 🖨 to print" }) }),
25122
25144
  /* @__PURE__ */ jsxRuntimeExports.jsx(
25123
25145
  "button",
25124
25146
  {
25125
25147
  className: "print-button",
25126
25148
  onClick: () => setIsPrinted(!isPrinted),
25127
- title: isPrinted ? "Toggle Receipt" : "Print Receipt",
25149
+ title: isPrinted ? "Roll Up Receipt" : "Print Receipt",
25128
25150
  children: "🖨"
25129
25151
  }
25130
25152
  )
@@ -25149,6 +25171,16 @@ const CommitReceiptPrinter = ({
25149
25171
  ] }),
25150
25172
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: new Date(commit.date).toLocaleString() })
25151
25173
  ] }),
25174
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "receipt-subheader text-[11px] text-gray-500 opacity-90 border-b border-dashed border-gray-300 pb-1 mb-2", children: [
25175
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
25176
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-semibold", children: "Security:" }),
25177
+ " Verified Commit ✓"
25178
+ ] }),
25179
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
25180
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-semibold", children: "Protocol:" }),
25181
+ " HTTPS (GitHub Models AI)"
25182
+ ] })
25183
+ ] }),
25152
25184
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "receipt-search-bar", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
25153
25185
  "input",
25154
25186
  {
@@ -25171,7 +25203,7 @@ const CommitReceiptPrinter = ({
25171
25203
  className: "receipt-table-scroll custom-scrollbar",
25172
25204
  onScroll: handleScroll,
25173
25205
  style: { height: `${CONTAINER_HEIGHT}px` },
25174
- children: filteredFiles.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "receipt-empty-state", children: "No matching files found." }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
25206
+ children: filteredFiles.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "receipt-empty-state", children: allFiles.length === 0 ? "No file modifications recorded in this commit." : "No matching files found." }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
25175
25207
  "div",
25176
25208
  {
25177
25209
  style: { height: `${totalVirtualHeight}px`, position: "relative", width: "100%" },
@@ -25849,6 +25881,20 @@ function App() {
25849
25881
  const [isResizing, setIsResizing] = reactExports.useState(false);
25850
25882
  const { t, lang, setLang } = useTranslation();
25851
25883
  const [appVersion, setAppVersion] = reactExports.useState("");
25884
+ const [liteMode, setLiteMode] = reactExports.useState(() => {
25885
+ const cores = navigator.hardwareConcurrency || 4;
25886
+ const memory = navigator.deviceMemory || 4;
25887
+ return cores < 6 || memory < 8;
25888
+ });
25889
+ reactExports.useEffect(() => {
25890
+ const handleKeyDown = (e) => {
25891
+ if ((e.ctrlKey || e.metaKey) && (e.key === "Delete" || e.key === "Backspace")) {
25892
+ setLiteMode((prev) => !prev);
25893
+ }
25894
+ };
25895
+ window.addEventListener("keydown", handleKeyDown);
25896
+ return () => window.removeEventListener("keydown", handleKeyDown);
25897
+ }, []);
25852
25898
  reactExports.useEffect(() => {
25853
25899
  const initVersion = async () => {
25854
25900
  try {
@@ -25961,6 +26007,11 @@ function App() {
25961
26007
  const [pushFailureData, setPushFailureData] = reactExports.useState(null);
25962
26008
  const [gitErrorData, setGitErrorData] = reactExports.useState(null);
25963
26009
  const [showSettings, setShowSettings] = reactExports.useState(false);
26010
+ const [showPrivacyModal, setShowPrivacyModal] = reactExports.useState(false);
26011
+ const [showForcePushModal, setShowForcePushModal] = reactExports.useState(false);
26012
+ const [isExecutingForcePush, setIsExecutingForcePush] = reactExports.useState(false);
26013
+ const [isClearingCache, setIsClearingCache] = reactExports.useState(false);
26014
+ const [settingsTab, setSettingsTab] = reactExports.useState("appearance");
25964
26015
  const [draftTheme, setDraftTheme] = reactExports.useState("github-dark");
25965
26016
  const [draftLang, setDraftLang] = reactExports.useState("en");
25966
26017
  const [draftDailyAuth, setDraftDailyAuth] = reactExports.useState(true);
@@ -26011,6 +26062,11 @@ function App() {
26011
26062
  const refreshLockRef = reactExports.useRef(false);
26012
26063
  reactExports.useEffect(() => {
26013
26064
  }, [gitProgress]);
26065
+ reactExports.useEffect(() => {
26066
+ const activeTheme = showSettings ? draftTheme : theme;
26067
+ document.documentElement.setAttribute("data-theme", activeTheme);
26068
+ document.body.setAttribute("data-theme", activeTheme);
26069
+ }, [theme, draftTheme, showSettings]);
26014
26070
  const [showWelcomeWizard, setShowWelcomeWizard] = reactExports.useState(false);
26015
26071
  const [newPin, setNewPin] = reactExports.useState("");
26016
26072
  const [pinChangeSuccess, setPinChangeSuccess] = reactExports.useState(false);
@@ -26134,8 +26190,10 @@ function App() {
26134
26190
  });
26135
26191
  }, 3e4);
26136
26192
  } else {
26137
- setCollaboratedRepos([]);
26138
- setInvitations([]);
26193
+ Promise.resolve().then(() => {
26194
+ setCollaboratedRepos([]);
26195
+ setInvitations([]);
26196
+ });
26139
26197
  }
26140
26198
  return () => {
26141
26199
  if (invInterval) clearInterval(invInterval);
@@ -26161,6 +26219,11 @@ function App() {
26161
26219
  window.api.getCliRepo().then((cliRepoPath) => {
26162
26220
  if (cliRepoPath) {
26163
26221
  loadRepo(cliRepoPath);
26222
+ } else {
26223
+ const last = localStorage.getItem("gitelectron-last-repo");
26224
+ if (last) {
26225
+ loadRepo(last);
26226
+ }
26164
26227
  }
26165
26228
  });
26166
26229
  }, []);
@@ -26199,7 +26262,9 @@ function App() {
26199
26262
  };
26200
26263
  window.addEventListener("online", handleOnline);
26201
26264
  if (navigator.onLine) {
26202
- processOfflineQueue();
26265
+ Promise.resolve().then(() => {
26266
+ processOfflineQueue();
26267
+ });
26203
26268
  }
26204
26269
  return () => window.removeEventListener("online", handleOnline);
26205
26270
  }, [repoPath]);
@@ -26257,7 +26322,9 @@ function App() {
26257
26322
  };
26258
26323
  const handleThemeChange = (newTheme) => {
26259
26324
  setTheme(newTheme);
26325
+ setDraftTheme(newTheme);
26260
26326
  document.documentElement.setAttribute("data-theme", newTheme);
26327
+ document.body.setAttribute("data-theme", newTheme);
26261
26328
  localStorage.setItem("gitelectron-theme", newTheme);
26262
26329
  };
26263
26330
  const handleAiApprove = async () => {
@@ -26297,10 +26364,13 @@ function App() {
26297
26364
  localStorage.setItem("gitelectron-last-repo", targetPath);
26298
26365
  setRepoPath(targetPath);
26299
26366
  const result = await window.api.setRepoPath(targetPath);
26367
+ const finalPath = result?.path || targetPath;
26300
26368
  const isValidRepo = result ? result.isRepo : false;
26369
+ setRepoPath(finalPath);
26301
26370
  setIsRepo(isValidRepo);
26302
26371
  if (isValidRepo) {
26303
- window.api.toggleAutoSync(targetPath, true);
26372
+ localStorage.setItem("gitelectron-last-repo", finalPath);
26373
+ window.api.toggleAutoSync(finalPath, true);
26304
26374
  await refreshRepoState();
26305
26375
  }
26306
26376
  setChangesTab("changes");
@@ -26486,7 +26556,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26486
26556
  }
26487
26557
  }
26488
26558
  };
26489
- const refreshRepoState = async () => {
26559
+ async function refreshRepoState() {
26490
26560
  if (refreshLockRef.current) return;
26491
26561
  refreshLockRef.current = true;
26492
26562
  setIsRefreshing(true);
@@ -26500,7 +26570,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26500
26570
  try {
26501
26571
  const dh = await window.api.getDeletedHistory();
26502
26572
  setDeletedHistory(dh);
26503
- } catch (err) {
26573
+ } catch {
26504
26574
  }
26505
26575
  const auth = await window.api.getAuthStatus();
26506
26576
  setAuthStatus(auth);
@@ -26524,7 +26594,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26524
26594
  urlObj.password = "";
26525
26595
  fetchUrl = urlObj.toString();
26526
26596
  }
26527
- } catch (e) {
26597
+ } catch {
26528
26598
  }
26529
26599
  if (fetchUrl.endsWith(".git")) {
26530
26600
  fetchUrl = fetchUrl.replace(/\.git$/, "");
@@ -26556,7 +26626,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26556
26626
  }
26557
26627
  }
26558
26628
  }
26559
- } catch (e) {
26629
+ } catch {
26560
26630
  setBranches({ current: "No commits yet", all: [] });
26561
26631
  }
26562
26632
  })();
@@ -26604,14 +26674,14 @@ Are you SURE you want to link "${repoName}" to this folder?`
26604
26674
  if (!exists) {
26605
26675
  console.warn("Repository path does not exist on disk:", repoPath);
26606
26676
  }
26607
- } catch (err) {
26677
+ } catch {
26608
26678
  }
26609
26679
  }
26610
26680
  } finally {
26611
26681
  setIsRefreshing(false);
26612
26682
  refreshLockRef.current = false;
26613
26683
  }
26614
- };
26684
+ }
26615
26685
  const handleCreateBranchSubmit = async (name, base) => {
26616
26686
  try {
26617
26687
  await window.api.createBranch(name, base);
@@ -26641,7 +26711,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26641
26711
  setShowAuthModal(true);
26642
26712
  try {
26643
26713
  await navigator.clipboard.writeText(data.user_code);
26644
- } catch (err) {
26714
+ } catch {
26645
26715
  }
26646
26716
  await window.api.pollDeviceFlow(data.device_code, data.interval * 1e3);
26647
26717
  setShowAuthModal(false);
@@ -26725,7 +26795,11 @@ Are you SURE you want to link "${repoName}" to this folder?`
26725
26795
  showToast("Resolving conflicts: accepting remote changes...", "info");
26726
26796
  await window.api.executeRawGit(["checkout", "--theirs", "."]);
26727
26797
  await window.api.executeRawGit(["add", "."]);
26728
- await window.api.executeRawGit(["commit", "-m", "Resolved conflicts (accepted remote changes)"]);
26798
+ await window.api.executeRawGit([
26799
+ "commit",
26800
+ "-m",
26801
+ "Resolved conflicts (accepted remote changes)"
26802
+ ]);
26729
26803
  setPushFailureData(null);
26730
26804
  await refreshRepoState();
26731
26805
  showToast("✅ Conflicts resolved (accepted remote changes)", "success");
@@ -26819,11 +26893,17 @@ Are you SURE you want to link "${repoName}" to this folder?`
26819
26893
  }
26820
26894
  const isConflictErr = currentError.includes("unmerged files") || currentError.includes("unresolved conflict") || currentError.includes("automatic merge failed") || currentError.includes("you have unmerged paths");
26821
26895
  if (isConflictErr) {
26822
- setHealerMessage("Unmerged conflict detected. Automatically resolving conflicted files...");
26896
+ setHealerMessage(
26897
+ "Unmerged conflict detected. Automatically resolving conflicted files..."
26898
+ );
26823
26899
  try {
26824
26900
  await window.api.executeRawGit(["checkout", "--ours", "."]);
26825
26901
  await window.api.executeRawGit(["add", "."]);
26826
- await window.api.executeRawGit(["commit", "-m", "Auto-resolved conflicts: kept local changes"]);
26902
+ await window.api.executeRawGit([
26903
+ "commit",
26904
+ "-m",
26905
+ "Auto-resolved conflicts: kept local changes"
26906
+ ]);
26827
26907
  } catch {
26828
26908
  try {
26829
26909
  await window.api.executeRawGit(["merge", "--abort"]);
@@ -26939,7 +27019,12 @@ Are you SURE you want to link "${repoName}" to this folder?`
26939
27019
  repository: repoPath?.split("\\").pop() || "",
26940
27020
  branch: branches.current,
26941
27021
  files: status.staged.length,
26942
- commitMessage
27022
+ commitMessage,
27023
+ timestamp: (/* @__PURE__ */ new Date()).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }),
27024
+ author: authStatus.username ? `@${authStatus.username}` : "Git Author",
27025
+ authMethod: authStatus.authMethod || "GitHub OAuth",
27026
+ aiProvider: authStatus.aiProvider || "GitHub Models",
27027
+ securityStatus: authStatus.securityStatus || "End-to-End Encrypted"
26943
27028
  });
26944
27029
  setCommitMessage("");
26945
27030
  setShowConfirmPush(false);
@@ -26972,7 +27057,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26972
27057
  setShowAuthModal(true);
26973
27058
  try {
26974
27059
  await navigator.clipboard.writeText(data.user_code);
26975
- } catch (err) {
27060
+ } catch {
26976
27061
  }
26977
27062
  await window.api.pollDeviceFlow(data.device_code, data.interval * 1e3);
26978
27063
  setShowAuthModal(false);
@@ -26995,7 +27080,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26995
27080
  try {
26996
27081
  name = await window.api.getGitConfig("user.name");
26997
27082
  email = await window.api.getGitConfig("user.email");
26998
- } catch (e) {
27083
+ } catch {
26999
27084
  }
27000
27085
  if ((!name || !email) && accounts.length > 0) {
27001
27086
  const activeAcc = accounts.find((a) => a.id === activeAccountId) || accounts[0];
@@ -27020,16 +27105,39 @@ Are you SURE you want to link "${repoName}" to this folder?`
27020
27105
  showToast("Settings saved successfully", "success");
27021
27106
  };
27022
27107
  const cancelSettings = () => {
27108
+ setDraftTheme(theme);
27023
27109
  document.documentElement.setAttribute("data-theme", theme);
27110
+ document.body.setAttribute("data-theme", theme);
27024
27111
  setShowSettings(false);
27025
27112
  };
27113
+ const handleExecuteForcePush = async () => {
27114
+ setIsExecutingForcePush(true);
27115
+ try {
27116
+ const remotes = await window.api.getRemotes();
27117
+ if (!remotes || remotes.length === 0) {
27118
+ showToast("No remote configured to push to.", "error");
27119
+ return;
27120
+ }
27121
+ const remoteName = remotes[0].name;
27122
+ const branchName = status?.current || "main";
27123
+ showToast(`Executing Master Force Push to ${remoteName}/${branchName}...`, "info");
27124
+ await window.api.masterPush(remoteName, branchName);
27125
+ showToast("Master Force Push successful!", "success");
27126
+ await refreshRepoState();
27127
+ setShowForcePushModal(false);
27128
+ } catch (err) {
27129
+ showToast("Force Push failed: " + (err.message || "Unknown error"), "error");
27130
+ } finally {
27131
+ setIsExecutingForcePush(false);
27132
+ }
27133
+ };
27026
27134
  const viewDiff = async (file, staged) => {
27027
27135
  setDiffFile(file);
27028
27136
  try {
27029
27137
  const diffStr = await window.api.getFileDiff(file, staged);
27030
27138
  setDiffContent(diffStr || "No changes to display.");
27031
27139
  setShowDiff(true);
27032
- } catch (e) {
27140
+ } catch {
27033
27141
  showToast("Failed to get diff", "error");
27034
27142
  }
27035
27143
  };
@@ -27137,8 +27245,9 @@ Are you SURE you want to link "${repoName}" to this folder?`
27137
27245
  onDragLeave: handleDragLeave,
27138
27246
  onDrop: handleDrop,
27139
27247
  children: [
27140
- (showSettings ? draftTheme : theme) === "among-us-live" && /* @__PURE__ */ jsxRuntimeExports.jsx(AmongUsBackground, {}),
27141
- (showSettings ? draftTheme : theme) === "space-explorer-3d" && /* @__PURE__ */ jsxRuntimeExports.jsx(SpaceExplorerBackground, {}),
27248
+ liteMode && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute top-4 left-1/2 -translate-x-1/2 z-[200] bg-warning/20 border border-warning/50 text-warning px-4 py-1.5 rounded-full text-xs font-bold animate-pulse pointer-events-none tracking-widest shadow-lg shadow-warning/10", children: "⚡ LITE MODE ACTIVE" }),
27249
+ !liteMode && (showSettings ? draftTheme : theme) === "among-us-live" && /* @__PURE__ */ jsxRuntimeExports.jsx(AmongUsBackground, {}),
27250
+ !liteMode && (showSettings ? draftTheme : theme) === "space-explorer-3d" && /* @__PURE__ */ jsxRuntimeExports.jsx(SpaceExplorerBackground, {}),
27142
27251
  showWelcomeWizard && /* @__PURE__ */ jsxRuntimeExports.jsx(WelcomeWizard, { onComplete: () => setShowWelcomeWizard(false) }),
27143
27252
  gitErrorData && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/70 backdrop-blur-md flex items-center justify-center z-[150] p-6 animate-fade-in", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/95 border border-danger/50 rounded-2xl shadow-2xl w-full max-w-lg overflow-hidden flex flex-col p-6", children: [
27144
27253
  /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold text-danger mb-4", children: "Git Error" }),
@@ -27167,7 +27276,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
27167
27276
  ] }),
27168
27277
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27169
27278
  /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-medium text-primary mb-1", children: "AI Proposed Fix" }),
27170
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-brand text-white border border-brand/20 p-3 rounded text-sm text-brand", children: autoSyncErrorPayload.proposedFix })
27279
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-brand/10 border border-brand/20 p-3 rounded text-sm text-brand", children: autoSyncErrorPayload.proposedFix })
27171
27280
  ] }),
27172
27281
  autoSyncErrorPayload.files && autoSyncErrorPayload.files.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27173
27282
  /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-medium text-primary mb-1", children: "Affected Files" }),
@@ -27201,7 +27310,14 @@ Are you SURE you want to link "${repoName}" to this folder?`
27201
27310
  ] })
27202
27311
  ] }) }),
27203
27312
  isLocked && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "absolute inset-0 z-[100] bg-canvas/95 backdrop-blur-2xl flex flex-col items-center justify-center transition-opacity duration-500 overflow-hidden", children: [
27204
- enableLockscreenSpace && /* @__PURE__ */ jsxRuntimeExports.jsx(SpaceScene, { fullScreen: true, onGameActiveChange: setIsGameActive }),
27313
+ !liteMode && enableLockscreenSpace && /* @__PURE__ */ jsxRuntimeExports.jsx(
27314
+ SpaceScene,
27315
+ {
27316
+ fullScreen: true,
27317
+ liteMode,
27318
+ onGameActiveChange: setIsGameActive
27319
+ }
27320
+ ),
27205
27321
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
27206
27322
  "div",
27207
27323
  {
@@ -27283,214 +27399,412 @@ Are you SURE you want to link "${repoName}" to this folder?`
27283
27399
  ] }),
27284
27400
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute top-[-30%] left-[-20%] w-[60%] h-[60%] bg-accent/5 blur-[150px] rounded-full pointer-events-none transition-colors duration-300" }),
27285
27401
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute bottom-[-30%] right-[-20%] w-[60%] h-[60%] bg-brand/5 blur-[150px] rounded-full pointer-events-none transition-colors duration-300" }),
27286
- showSettings && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-50 transition-opacity p-4 md:p-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/95 backdrop-blur-xl rounded-2xl shadow-2xl border border-border w-full max-w-[900px] animate-float max-h-[95vh] flex flex-col overflow-hidden", children: [
27402
+ showSettings && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/80 backdrop-blur-md flex items-center justify-center z-50 transition-opacity p-4 md:p-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/98 backdrop-blur-2xl rounded-2xl shadow-2xl border border-border w-full max-w-5xl h-[720px] max-h-[92vh] flex flex-col overflow-hidden animate-float", children: [
27287
27403
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
27288
27404
  "div",
27289
27405
  {
27290
- className: "px-8 py-6 border-b border-border shrink-0 flex items-center gap-3",
27406
+ className: "px-8 py-5 border-b border-border shrink-0 flex items-center justify-between",
27291
27407
  style: { backgroundColor: "var(--color-surface)" },
27292
27408
  children: [
27409
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3.5", children: [
27410
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-10 h-10 rounded-xl bg-brand/10 border border-brand/20 flex items-center justify-center text-brand", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: [
27411
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27412
+ "path",
27413
+ {
27414
+ strokeLinecap: "round",
27415
+ strokeLinejoin: "round",
27416
+ strokeWidth: 2,
27417
+ d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"
27418
+ }
27419
+ ),
27420
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27421
+ "path",
27422
+ {
27423
+ strokeLinecap: "round",
27424
+ strokeLinejoin: "round",
27425
+ strokeWidth: 2,
27426
+ d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z"
27427
+ }
27428
+ )
27429
+ ] }) }),
27430
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27431
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-bold text-primary leading-tight", children: "Preferences & Settings" }),
27432
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Configure client environment, authentication tokens, and disk storage" })
27433
+ ] })
27434
+ ] }),
27435
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27436
+ "button",
27437
+ {
27438
+ type: "button",
27439
+ onClick: () => cancelSettings(),
27440
+ className: "w-8 h-8 rounded-lg text-secondary hover:text-primary hover:bg-surface-hover flex items-center justify-center transition-colors border border-transparent hover:border-border",
27441
+ title: "Close Preferences",
27442
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27443
+ "path",
27444
+ {
27445
+ strokeLinecap: "round",
27446
+ strokeLinejoin: "round",
27447
+ strokeWidth: 2,
27448
+ d: "M6 18L18 6M6 6l12 12"
27449
+ }
27450
+ ) })
27451
+ }
27452
+ )
27453
+ ]
27454
+ }
27455
+ ),
27456
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-1 min-h-0 overflow-hidden", children: [
27457
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-64 border-r border-border shrink-0 bg-canvas/20 p-4 flex flex-col justify-between", children: [
27458
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("nav", { className: "space-y-2", children: [
27293
27459
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
27294
- "svg",
27460
+ "button",
27295
27461
  {
27296
- className: "w-6 h-6 text-brand",
27297
- fill: "none",
27298
- stroke: "currentColor",
27299
- viewBox: "0 0 24 24",
27462
+ type: "button",
27463
+ onClick: () => setSettingsTab("appearance"),
27464
+ className: `w-full flex items-center gap-3.5 px-4 py-3 rounded-xl text-xs font-semibold transition-all ${settingsTab === "appearance" ? "bg-brand text-white shadow-md shadow-brand/20" : "text-secondary hover:text-primary hover:bg-surface-hover"}`,
27300
27465
  children: [
27301
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27302
- "path",
27466
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27467
+ "svg",
27303
27468
  {
27304
- strokeLinecap: "round",
27305
- strokeLinejoin: "round",
27306
- strokeWidth: 2,
27307
- d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"
27469
+ className: "w-4 h-4 shrink-0",
27470
+ fill: "none",
27471
+ stroke: "currentColor",
27472
+ viewBox: "0 0 24 24",
27473
+ children: [
27474
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27475
+ "path",
27476
+ {
27477
+ strokeLinecap: "round",
27478
+ strokeLinejoin: "round",
27479
+ strokeWidth: 2,
27480
+ d: "M7 21a4 4 0 01-4-4 5 5 0 015-5c1.1 0 2.1.4 2.8 1.1L12 14l1.2-1.1c.7-.7 1.7-1.1 2.8-1.1a5 5 0 015 5 4 4 0 01-4 4H7z"
27481
+ }
27482
+ ),
27483
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27484
+ "path",
27485
+ {
27486
+ strokeLinecap: "round",
27487
+ strokeLinejoin: "round",
27488
+ strokeWidth: 2,
27489
+ d: "M12 3v11"
27490
+ }
27491
+ )
27492
+ ]
27308
27493
  }
27309
27494
  ),
27310
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27311
- "path",
27312
- {
27313
- strokeLinecap: "round",
27314
- strokeLinejoin: "round",
27315
- strokeWidth: 2,
27316
- d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z"
27317
- }
27318
- )
27495
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-left", children: [
27496
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-bold", children: "Appearance" }),
27497
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27498
+ "div",
27499
+ {
27500
+ className: `text-[10px] font-normal ${settingsTab === "appearance" ? "text-white/80" : "text-secondary/70"}`,
27501
+ children: "Theme, UI, Language"
27502
+ }
27503
+ )
27504
+ ] })
27319
27505
  ]
27320
27506
  }
27321
27507
  ),
27322
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-black text-primary m-0", children: t("settings") })
27323
- ]
27324
- }
27325
- ),
27326
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 md:p-8 bg-black/10", children: [
27327
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6 mb-4", children: [
27328
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [
27329
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-canvas/40 p-5 rounded-xl border border-border/50", children: [
27330
- /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-sm font-bold text-primary mb-4 flex items-center gap-2 uppercase tracking-wider", children: [
27331
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "🎨" }),
27332
- " Preferences"
27333
- ] }),
27334
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
27335
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27336
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-secondary mb-1.5 text-xs font-semibold uppercase", children: t("language") }),
27337
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27338
- CustomDropdown,
27339
- {
27340
- options: LANGUAGES.map((l) => ({ value: l.id, label: l.name })),
27341
- value: draftLang,
27342
- onChange: (val) => setDraftLang(val),
27343
- buttonClassName: "w-full bg-surface border border-border rounded-lg p-2.5 text-primary focus:outline-none focus:border-accent transition-all cursor-pointer font-medium text-sm"
27344
- }
27345
- )
27346
- ] }),
27347
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27348
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-secondary mb-1.5 text-xs font-semibold uppercase", children: t("theme") }),
27349
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27350
- CustomDropdown,
27351
- {
27352
- options: THEMES.map((t2) => ({ value: t2.id, label: t2.name })),
27353
- value: draftTheme,
27354
- onChange: (val) => {
27355
- setDraftTheme(val);
27356
- document.documentElement.setAttribute("data-theme", val);
27357
- },
27358
- buttonClassName: "w-full bg-surface border border-border rounded-lg p-2.5 text-primary focus:outline-none focus:border-accent transition-all cursor-pointer font-medium text-sm"
27359
- }
27360
- )
27361
- ] })
27362
- ] })
27363
- ] }),
27364
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-canvas/40 p-5 rounded-xl border border-border/50", children: [
27365
- /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-sm font-bold text-primary mb-4 flex items-center gap-2 uppercase tracking-wider", children: [
27366
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "👤" }),
27367
- " Git Profile"
27368
- ] }),
27369
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
27370
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27371
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-secondary mb-1.5 text-xs font-semibold uppercase", children: t("gitUsername") }),
27372
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27373
- "input",
27374
- {
27375
- type: "text",
27376
- value: gitConfig.name,
27377
- readOnly: true,
27378
- className: "w-full bg-surface border border-border rounded-lg p-2.5 text-secondary cursor-not-allowed focus:outline-none font-medium text-sm"
27379
- }
27380
- )
27381
- ] }),
27382
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27383
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-secondary mb-1.5 text-xs font-semibold uppercase", children: t("gitEmail") }),
27508
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27509
+ "button",
27510
+ {
27511
+ type: "button",
27512
+ onClick: () => setSettingsTab("accounts"),
27513
+ className: `w-full flex items-center gap-3.5 px-4 py-3 rounded-xl text-xs font-semibold transition-all ${settingsTab === "accounts" ? "bg-brand text-white shadow-md shadow-brand/20" : "text-secondary hover:text-primary hover:bg-surface-hover"}`,
27514
+ children: [
27384
27515
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27385
- "input",
27516
+ "svg",
27386
27517
  {
27387
- type: "email",
27388
- value: gitConfig.email,
27389
- readOnly: true,
27390
- className: "w-full bg-surface border border-border rounded-lg p-2.5 text-secondary cursor-not-allowed focus:outline-none font-medium text-sm"
27518
+ className: "w-4 h-4 shrink-0",
27519
+ fill: "none",
27520
+ stroke: "currentColor",
27521
+ viewBox: "0 0 24 24",
27522
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27523
+ "path",
27524
+ {
27525
+ strokeLinecap: "round",
27526
+ strokeLinejoin: "round",
27527
+ strokeWidth: 2,
27528
+ d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"
27529
+ }
27530
+ )
27391
27531
  }
27392
27532
  ),
27393
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[10px] text-brand mt-1.5 font-medium", children: t("syncedFromGithub") })
27394
- ] })
27395
- ] })
27396
- ] })
27397
- ] }),
27398
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [
27399
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-canvas/40 p-5 rounded-xl border border-border/50", children: [
27400
- /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-sm font-bold text-primary mb-4 flex items-center gap-2 uppercase tracking-wider", children: [
27401
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "🛡️" }),
27402
- " Security & Features"
27403
- ] }),
27404
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-5", children: [
27405
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
27406
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "pr-4", children: [
27407
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("dailyMobileVerification") }),
27408
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1", children: t("dailyMobileDesc") })
27409
- ] }),
27410
- /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "switch shrink-0", children: [
27411
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27412
- "input",
27413
- {
27414
- className: "toggle",
27415
- type: "checkbox",
27416
- checked: draftDailyAuth,
27417
- onChange: (e) => {
27418
- const next = e.target.checked;
27419
- setDraftDailyAuth(next);
27420
- }
27421
- }
27422
- ),
27423
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "slider" }),
27424
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "card-side" })
27425
- ] })
27426
- ] }),
27427
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t border-border/50 pt-5 flex items-center justify-between", children: [
27428
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "pr-4", children: [
27429
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("enableSpaceScene") }),
27430
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1", children: t("spaceSceneDesc") })
27431
- ] }),
27432
- /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "switch shrink-0", children: [
27533
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-left", children: [
27534
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-bold", children: "Accounts & Git" }),
27433
27535
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27434
- "input",
27536
+ "div",
27435
27537
  {
27436
- className: "toggle",
27437
- type: "checkbox",
27438
- checked: draftLockscreenSpace,
27439
- onChange: (e) => {
27440
- const next = e.target.checked;
27441
- setDraftLockscreenSpace(next);
27442
- }
27538
+ className: `text-[10px] font-normal ${settingsTab === "accounts" ? "text-white/80" : "text-secondary/70"}`,
27539
+ children: "GitHub profile & author"
27443
27540
  }
27444
- ),
27445
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "slider" }),
27446
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "card-side" })
27541
+ )
27447
27542
  ] })
27448
- ] }),
27449
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border/50 pt-5", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3", children: [
27450
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27451
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("changeLockscreenPin") }),
27452
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1", children: t("changePinDesc") })
27453
- ] }),
27454
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [
27543
+ ]
27544
+ }
27545
+ ),
27546
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27547
+ "button",
27548
+ {
27549
+ type: "button",
27550
+ onClick: () => setSettingsTab("security"),
27551
+ className: `w-full flex items-center gap-3.5 px-4 py-3 rounded-xl text-xs font-semibold transition-all ${settingsTab === "security" ? "bg-brand text-white shadow-md shadow-brand/20" : "text-secondary hover:text-primary hover:bg-surface-hover"}`,
27552
+ children: [
27553
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27554
+ "svg",
27555
+ {
27556
+ className: "w-4 h-4 shrink-0",
27557
+ fill: "none",
27558
+ stroke: "currentColor",
27559
+ viewBox: "0 0 24 24",
27560
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27561
+ "path",
27562
+ {
27563
+ strokeLinecap: "round",
27564
+ strokeLinejoin: "round",
27565
+ strokeWidth: 2,
27566
+ d: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"
27567
+ }
27568
+ )
27569
+ }
27570
+ ),
27571
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-left", children: [
27572
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-bold", children: "Security & Privacy" }),
27455
27573
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27456
- "input",
27574
+ "div",
27457
27575
  {
27458
- type: "password",
27459
- maxLength: 3,
27460
- value: newPin,
27461
- onChange: (e) => setNewPin(e.target.value),
27462
- placeholder: "***",
27463
- className: "bg-surface border border-border rounded-lg px-3 py-2 text-sm text-primary w-24 outline-none focus:border-accent text-center tracking-widest font-black"
27576
+ className: `text-[10px] font-normal ${settingsTab === "security" ? "text-white/80" : "text-secondary/70"}`,
27577
+ children: "PIN, 2FA, zero telemetry"
27464
27578
  }
27465
- ),
27579
+ )
27580
+ ] })
27581
+ ]
27582
+ }
27583
+ ),
27584
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27585
+ "button",
27586
+ {
27587
+ type: "button",
27588
+ onClick: () => setSettingsTab("maintenance"),
27589
+ className: `w-full flex items-center gap-3.5 px-4 py-3 rounded-xl text-xs font-semibold transition-all ${settingsTab === "maintenance" ? "bg-brand text-white shadow-md shadow-brand/20" : "text-secondary hover:text-primary hover:bg-surface-hover"}`,
27590
+ children: [
27591
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27592
+ "svg",
27593
+ {
27594
+ className: "w-4 h-4 shrink-0",
27595
+ fill: "none",
27596
+ stroke: "currentColor",
27597
+ viewBox: "0 0 24 24",
27598
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27599
+ "path",
27600
+ {
27601
+ strokeLinecap: "round",
27602
+ strokeLinejoin: "round",
27603
+ strokeWidth: 2,
27604
+ d: "M4 7v10c0 2 1.5 3 3.5 3h9c2 0 3.5-1 3.5-3V7M4 7c0-2 1.5-3 3.5-3h9c2 0 3.5 1 3.5 3M4 7h16m-5 4h.01M9 11h.01M12 15h.01"
27605
+ }
27606
+ )
27607
+ }
27608
+ ),
27609
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-left", children: [
27610
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-bold", children: "Maintenance" }),
27466
27611
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27467
- "button",
27612
+ "div",
27468
27613
  {
27469
- type: "button",
27470
- onClick: () => {
27471
- if (newPin.length === 3) {
27472
- localStorage.setItem("gitelectron-pin", newPin);
27473
- setStoredPin(newPin);
27474
- setPinChangeSuccess(true);
27475
- setTimeout(() => setPinChangeSuccess(false), 2e3);
27476
- setNewPin("");
27477
- }
27478
- },
27479
- disabled: newPin.length !== 3,
27480
- className: "px-4 py-2 bg-accent text-canvas text-xs font-black rounded-lg hover:bg-accent/90 transition-colors disabled:opacity-50 uppercase",
27481
- children: pinChangeSuccess ? t("saved") : t("savePin")
27614
+ className: `text-[10px] font-normal ${settingsTab === "maintenance" ? "text-white/80" : "text-secondary/70"}`,
27615
+ children: "Disk cache & Git locks"
27482
27616
  }
27483
27617
  )
27484
27618
  ] })
27485
- ] }) })
27619
+ ]
27620
+ }
27621
+ ),
27622
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27623
+ "button",
27624
+ {
27625
+ type: "button",
27626
+ onClick: () => setSettingsTab("developer"),
27627
+ className: `w-full flex items-center gap-3.5 px-4 py-3 rounded-xl text-xs font-semibold transition-all ${settingsTab === "developer" ? "bg-brand text-white shadow-md shadow-brand/20" : "text-secondary hover:text-primary hover:bg-surface-hover"}`,
27628
+ children: [
27629
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27630
+ "svg",
27631
+ {
27632
+ className: "w-4 h-4 shrink-0",
27633
+ fill: "none",
27634
+ stroke: "currentColor",
27635
+ viewBox: "0 0 24 24",
27636
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27637
+ "path",
27638
+ {
27639
+ strokeLinecap: "round",
27640
+ strokeLinejoin: "round",
27641
+ strokeWidth: 2,
27642
+ d: "M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"
27643
+ }
27644
+ )
27645
+ }
27646
+ ),
27647
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-left", children: [
27648
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-bold", children: "Tools & Advanced" }),
27649
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27650
+ "div",
27651
+ {
27652
+ className: `text-[10px] font-normal ${settingsTab === "developer" ? "text-white/80" : "text-secondary/70"}`,
27653
+ children: "Overrides & Maintenance"
27654
+ }
27655
+ )
27656
+ ] })
27657
+ ]
27658
+ }
27659
+ )
27660
+ ] }),
27661
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-3.5 bg-surface/60 border border-border/80 rounded-xl", children: [
27662
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-1", children: [
27663
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 rounded-full bg-success animate-pulse" }),
27664
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] font-bold text-primary", children: "GitQuickPush Client" })
27665
+ ] }),
27666
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[10px] text-secondary", children: "Local-First Engine • Production" })
27667
+ ] })
27668
+ ] }),
27669
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 p-8 md:p-10 overflow-y-auto custom-scrollbar bg-surface/30", children: [
27670
+ settingsTab === "appearance" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-7", children: [
27671
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27672
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-bold text-primary", children: "Appearance & Environment" }),
27673
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: "Personalize your workspace palette, typography localization, and GPU rendering features." })
27674
+ ] }),
27675
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm space-y-4", children: [
27676
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
27677
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27678
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-xs font-bold uppercase tracking-wider text-secondary", children: t("theme") }),
27679
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Select your primary color scheme and interface styling" })
27680
+ ] }),
27681
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-mono text-primary/80 bg-canvas px-3 py-1 rounded-md border border-border/60", children: draftTheme })
27682
+ ] }),
27683
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27684
+ CustomDropdown,
27685
+ {
27686
+ options: THEMES.map((themeItem) => ({
27687
+ value: themeItem.id,
27688
+ label: themeItem.name
27689
+ })),
27690
+ value: draftTheme,
27691
+ onChange: (val) => {
27692
+ setDraftTheme(val);
27693
+ document.documentElement.setAttribute("data-theme", val);
27694
+ },
27695
+ buttonClassName: "w-full bg-canvas/70 border border-border rounded-xl p-3 text-primary focus:outline-none focus:border-brand transition-all cursor-pointer font-medium text-sm"
27696
+ }
27697
+ )
27698
+ ] }),
27699
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm space-y-4", children: [
27700
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
27701
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27702
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-xs font-bold uppercase tracking-wider text-secondary", children: t("language") }),
27703
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Interface language and localized notification text" })
27704
+ ] }),
27705
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-mono text-primary/80 bg-canvas px-3 py-1 rounded-md border border-border/60", children: draftLang.toUpperCase() })
27706
+ ] }),
27707
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27708
+ CustomDropdown,
27709
+ {
27710
+ options: LANGUAGES.map((langItem) => ({
27711
+ value: langItem.id,
27712
+ label: langItem.name
27713
+ })),
27714
+ value: draftLang,
27715
+ onChange: (val) => setDraftLang(val),
27716
+ buttonClassName: "w-full bg-canvas/70 border border-border rounded-xl p-3 text-primary focus:outline-none focus:border-brand transition-all cursor-pointer font-medium text-sm"
27717
+ }
27718
+ )
27719
+ ] }),
27720
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm space-y-6", children: [
27721
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between gap-6", children: [
27722
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27723
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: "Lite Performance Mode" }),
27724
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed max-w-xl", children: "Disables background physics, heavy blur filters, and particle shaders to optimize battery life on low-power devices." })
27725
+ ] }),
27726
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27727
+ "button",
27728
+ {
27729
+ type: "button",
27730
+ onClick: () => setLiteMode(!liteMode),
27731
+ className: `relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors ${liteMode ? "bg-brand" : "bg-canvas border border-border"}`,
27732
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27733
+ "span",
27734
+ {
27735
+ className: `inline-block h-4 w-4 transform rounded-full transition-transform ${liteMode ? "translate-x-6 bg-white" : "translate-x-1 bg-secondary"}`
27736
+ }
27737
+ )
27738
+ }
27739
+ )
27740
+ ] }),
27741
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border/50" }),
27742
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between gap-6", children: [
27743
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27744
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("enableSpaceScene") }),
27745
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed max-w-xl", children: t("spaceSceneDesc") })
27746
+ ] }),
27747
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "switch shrink-0", children: [
27748
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27749
+ "input",
27750
+ {
27751
+ className: "toggle",
27752
+ type: "checkbox",
27753
+ checked: draftLockscreenSpace,
27754
+ onChange: (e) => setDraftLockscreenSpace(e.target.checked)
27755
+ }
27756
+ ),
27757
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "slider" }),
27758
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "card-side" })
27759
+ ] })
27486
27760
  ] })
27761
+ ] })
27762
+ ] }),
27763
+ settingsTab === "accounts" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-7", children: [
27764
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27765
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-bold text-primary", children: "Accounts & Git Identity" }),
27766
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: "Configure your authenticated GitHub sessions and local author signatures attached to git commits." })
27487
27767
  ] }),
27488
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-canvas/40 p-5 rounded-xl border border-border/50", children: [
27489
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between mb-4", children: [
27490
- /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-sm font-bold text-primary flex items-center gap-2 uppercase tracking-wider", children: [
27491
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "👥" }),
27492
- " ",
27493
- t("githubAccounts")
27768
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm space-y-5", children: [
27769
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
27770
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27771
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-bold uppercase tracking-wider text-secondary", children: "Git Author Signature (Local Config)" }),
27772
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Embedded into every commit header on your local workstation" })
27773
+ ] }),
27774
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] text-brand bg-brand/10 border border-brand/20 px-2.5 py-1 rounded-md font-medium", children: t("syncedFromGithub") })
27775
+ ] }),
27776
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-5", children: [
27777
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27778
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-secondary mb-1.5 text-xs font-semibold", children: t("gitUsername") }),
27779
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27780
+ "input",
27781
+ {
27782
+ type: "text",
27783
+ value: gitConfig.name,
27784
+ readOnly: true,
27785
+ className: "w-full bg-canvas/70 border border-border rounded-xl p-3 text-secondary cursor-not-allowed focus:outline-none font-medium text-sm"
27786
+ }
27787
+ )
27788
+ ] }),
27789
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27790
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-secondary mb-1.5 text-xs font-semibold", children: t("gitEmail") }),
27791
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27792
+ "input",
27793
+ {
27794
+ type: "email",
27795
+ value: gitConfig.email,
27796
+ readOnly: true,
27797
+ className: "w-full bg-canvas/70 border border-border rounded-xl p-3 text-secondary cursor-not-allowed focus:outline-none font-medium text-sm"
27798
+ }
27799
+ )
27800
+ ] })
27801
+ ] })
27802
+ ] }),
27803
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm space-y-5", children: [
27804
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
27805
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27806
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-bold uppercase tracking-wider text-secondary", children: t("githubAccounts") }),
27807
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Linked profiles authorized for repository pushing and collaboration" })
27494
27808
  ] }),
27495
27809
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
27496
27810
  "button",
@@ -27500,41 +27814,64 @@ Are you SURE you want to link "${repoName}" to this folder?`
27500
27814
  cancelSettings();
27501
27815
  handleStartAuth();
27502
27816
  },
27503
- className: "px-3 py-1.5 bg-brand text-white hover:bg-brand text-white text-brand text-xs font-bold rounded-lg border border-brand/20 transition-colors",
27817
+ className: "px-4 py-2 bg-brand hover:bg-brand-hover text-white text-xs font-bold rounded-xl transition-colors flex items-center gap-2 shadow-sm",
27504
27818
  children: [
27505
- "+ ",
27819
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27820
+ "svg",
27821
+ {
27822
+ className: "w-3.5 h-3.5",
27823
+ fill: "none",
27824
+ stroke: "currentColor",
27825
+ viewBox: "0 0 24 24",
27826
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27827
+ "path",
27828
+ {
27829
+ strokeLinecap: "round",
27830
+ strokeLinejoin: "round",
27831
+ strokeWidth: 2,
27832
+ d: "M12 4v16m8-8H4"
27833
+ }
27834
+ )
27835
+ }
27836
+ ),
27506
27837
  t("addAccount")
27507
27838
  ]
27508
27839
  }
27509
27840
  )
27510
27841
  ] }),
27511
- accounts.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-center p-6 border border-dashed border-border/50 rounded-xl bg-surface/30", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-medium text-secondary", children: t("noAccountsLinked") }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-2 max-h-40 overflow-y-auto pr-1 custom-scrollbar mb-4", children: accounts.map((acc) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
27842
+ accounts.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center p-10 border border-dashed border-border rounded-2xl bg-canvas/30 space-y-2", children: [
27843
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("noAccountsLinked") }),
27844
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary max-w-sm mx-auto", children: "Link your GitHub account via OAuth to enable one-click pushes and pull requests." })
27845
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-3", children: accounts.map((acc) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
27512
27846
  "div",
27513
27847
  {
27514
- className: "flex items-center justify-between p-3 border border-border/80 rounded-xl bg-surface hover:border-brand/50 transition-colors",
27848
+ className: "flex items-center justify-between p-4 border border-border rounded-xl bg-canvas/40 hover:border-brand/40 transition-colors",
27515
27849
  children: [
27516
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
27850
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3.5", children: [
27517
27851
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27518
27852
  "img",
27519
27853
  {
27520
27854
  src: acc.avatar_url || `https://github.com/${acc.username}.png`,
27521
27855
  alt: acc.username,
27522
- className: "w-8 h-8 rounded-full object-cover border-2 border-border"
27856
+ className: "w-10 h-10 rounded-full object-cover border border-border"
27523
27857
  }
27524
27858
  ),
27525
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-sm font-bold text-primary", children: [
27526
- "@",
27527
- acc.username
27859
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27860
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-sm font-bold text-primary block", children: [
27861
+ "@",
27862
+ acc.username
27863
+ ] }),
27864
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary", children: "GitHub Enterprise / Cloud" })
27528
27865
  ] })
27529
27866
  ] }),
27530
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
27531
- activeAccountId === acc.id && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] uppercase font-black text-success bg-success/10 px-2 py-1 rounded-md border border-success/20", children: "Active" }),
27867
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2.5", children: [
27868
+ activeAccountId === acc.id && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] uppercase font-bold text-success bg-success/10 px-2.5 py-1 rounded-md border border-success/20", children: "Active Session" }),
27532
27869
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27533
27870
  "button",
27534
27871
  {
27535
27872
  type: "button",
27536
27873
  onClick: () => window.api.openExternal(`https://github.com/${acc.username}`),
27537
- className: "px-2.5 py-1 border border-border hover:border-brand hover:text-brand text-secondary text-[10px] uppercase font-bold rounded-md transition-all",
27874
+ className: "px-3 py-1.5 border border-border hover:border-brand hover:text-brand text-secondary text-xs font-semibold rounded-lg transition-all",
27538
27875
  children: "Profile"
27539
27876
  }
27540
27877
  )
@@ -27543,7 +27880,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
27543
27880
  },
27544
27881
  acc.id
27545
27882
  )) }),
27546
- authStatus.status === "Verified" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border/50 pt-4 mt-2", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
27883
+ authStatus.status === "Verified" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border/50 pt-5 mt-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
27547
27884
  "button",
27548
27885
  {
27549
27886
  type: "button",
@@ -27561,7 +27898,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
27561
27898
  showToast("Logout failed", "error");
27562
27899
  }
27563
27900
  },
27564
- className: "w-full py-2.5 bg-danger/10 hover:bg-danger/20 text-danger text-sm font-bold rounded-lg border border-danger/30 hover:border-danger/50 transition-all flex items-center justify-center gap-2",
27901
+ className: "w-full py-3 bg-danger/10 hover:bg-danger/20 text-danger text-xs font-bold rounded-xl border border-danger/30 hover:border-danger/50 transition-all flex items-center justify-center gap-2",
27565
27902
  children: [
27566
27903
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27567
27904
  "svg",
@@ -27586,74 +27923,324 @@ Are you SURE you want to link "${repoName}" to this folder?`
27586
27923
  }
27587
27924
  ) })
27588
27925
  ] })
27589
- ] })
27590
- ] }),
27591
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-danger/10 p-5 rounded-xl border border-danger/30 mb-8 mt-2", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between gap-4", children: [
27592
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27593
- /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-sm font-black text-danger flex items-center gap-2 uppercase tracking-wider mb-1", children: [
27594
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "⚠️" }),
27595
- " Emergency Override (Master Push)"
27596
- ] }),
27597
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-medium text-danger/80 leading-relaxed max-w-2xl", children: "Bypass all protections, ignore unpushed changes or missing files, and FORCE push all current files. Warning: This completely overwrites remote history." })
27598
27926
  ] }),
27599
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
27600
- "button",
27601
- {
27602
- type: "button",
27603
- onClick: async () => {
27604
- const confirmAction = window.confirm(
27605
- "Are you sure? This will force push all current files, overriding remote history and bypassing all safety checks."
27606
- );
27607
- if (!confirmAction) return;
27608
- try {
27609
- const remotes = await window.api.getRemotes();
27610
- if (!remotes || remotes.length === 0) {
27611
- showToast("No remote configured to push to.", "error");
27612
- return;
27927
+ settingsTab === "security" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-7", children: [
27928
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27929
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-bold text-primary", children: "Security & Access Controls" }),
27930
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: "Configure local cryptographic vaults, client PIN protection, and review institutional trust policies." })
27931
+ ] }),
27932
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm flex items-center justify-between gap-6", children: [
27933
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-xl", children: [
27934
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("dailyMobileVerification") }),
27935
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: t("dailyMobileDesc") })
27936
+ ] }),
27937
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "switch shrink-0", children: [
27938
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27939
+ "input",
27940
+ {
27941
+ className: "toggle",
27942
+ type: "checkbox",
27943
+ checked: draftDailyAuth,
27944
+ onChange: (e) => setDraftDailyAuth(e.target.checked)
27613
27945
  }
27614
- showToast("Executing Master Push override...", "info");
27615
- await window.api.masterPush(remotes[0].name, status?.current || "main");
27616
- showToast("Master Push successful!", "success");
27617
- refreshRepoState();
27618
- cancelSettings();
27619
- } catch (err) {
27620
- showToast(
27621
- "Master Push failed: " + (err.message || "Unknown error"),
27622
- "error"
27623
- );
27946
+ ),
27947
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "slider" }),
27948
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "card-side" })
27949
+ ] })
27950
+ ] }),
27951
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm flex flex-col sm:flex-row sm:items-center justify-between gap-6", children: [
27952
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27953
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("changeLockscreenPin") }),
27954
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: t("changePinDesc") })
27955
+ ] }),
27956
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 shrink-0", children: [
27957
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27958
+ "input",
27959
+ {
27960
+ type: "password",
27961
+ maxLength: 3,
27962
+ value: newPin,
27963
+ onChange: (e) => setNewPin(e.target.value),
27964
+ placeholder: "***",
27965
+ className: "bg-canvas/70 border border-border rounded-xl px-3.5 py-2.5 text-sm text-primary w-24 outline-none focus:border-brand text-center tracking-widest font-mono font-bold"
27966
+ }
27967
+ ),
27968
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27969
+ "button",
27970
+ {
27971
+ type: "button",
27972
+ onClick: () => {
27973
+ if (newPin.length === 3) {
27974
+ localStorage.setItem("gitelectron-pin", newPin);
27975
+ setStoredPin(newPin);
27976
+ setPinChangeSuccess(true);
27977
+ setTimeout(() => setPinChangeSuccess(false), 2e3);
27978
+ setNewPin("");
27979
+ }
27980
+ },
27981
+ disabled: newPin.length !== 3,
27982
+ className: "px-5 py-2.5 bg-brand hover:bg-brand-hover text-white text-xs font-bold rounded-xl transition-colors disabled:opacity-40 uppercase",
27983
+ children: pinChangeSuccess ? t("saved") : t("savePin")
27984
+ }
27985
+ )
27986
+ ] })
27987
+ ] }),
27988
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm flex flex-col sm:flex-row sm:items-center justify-between gap-6", children: [
27989
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-xl", children: [
27990
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-1.5", children: [
27991
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27992
+ "svg",
27993
+ {
27994
+ className: "w-4 h-4 text-emerald-400",
27995
+ fill: "none",
27996
+ stroke: "currentColor",
27997
+ viewBox: "0 0 24 24",
27998
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27999
+ "path",
28000
+ {
28001
+ strokeLinecap: "round",
28002
+ strokeLinejoin: "round",
28003
+ strokeWidth: 2,
28004
+ d: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"
28005
+ }
28006
+ )
28007
+ }
28008
+ ),
28009
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-bold uppercase tracking-wider text-primary", children: "Enterprise Privacy & Local Security Protocol" })
28010
+ ] }),
28011
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Strict local-first architecture: zero telemetry tracking, no external code logging, and hardware-sealed credentials via native OS keystores (Windows DPAPI / macOS Keychain)." })
28012
+ ] }),
28013
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
28014
+ "button",
28015
+ {
28016
+ type: "button",
28017
+ onClick: () => setShowPrivacyModal(true),
28018
+ className: "shrink-0 px-5 py-2.5 bg-canvas hover:bg-surface-hover border border-border text-primary text-xs font-bold rounded-xl transition-all flex items-center gap-2",
28019
+ children: [
28020
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28021
+ "svg",
28022
+ {
28023
+ className: "w-4 h-4 text-brand",
28024
+ fill: "none",
28025
+ stroke: "currentColor",
28026
+ viewBox: "0 0 24 24",
28027
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28028
+ "path",
28029
+ {
28030
+ strokeLinecap: "round",
28031
+ strokeLinejoin: "round",
28032
+ strokeWidth: 2,
28033
+ d: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"
28034
+ }
28035
+ )
28036
+ }
28037
+ ),
28038
+ "View Trust Policy"
28039
+ ]
27624
28040
  }
27625
- },
27626
- className: "shrink-0 px-6 py-3 bg-danger text-white text-xs font-black uppercase tracking-wider rounded-xl hover:bg-danger/80 border-b-4 border-black/30 active:border-b-0 active:translate-y-1 transition-all flex items-center justify-center gap-2",
27627
- children: [
27628
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "🚀" }),
27629
- " FORCE PUSH"
27630
- ]
27631
- }
27632
- )
27633
- ] }) })
28041
+ )
28042
+ ] })
28043
+ ] }),
28044
+ settingsTab === "maintenance" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-7", children: [
28045
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
28046
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-bold text-primary", children: "Storage & Maintenance" }),
28047
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: "Purge application disk caches, remove stale Git lock files, and repair workspace states." })
28048
+ ] }),
28049
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm flex flex-col sm:flex-row sm:items-center justify-between gap-6", children: [
28050
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-xl", children: [
28051
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-bold text-primary mb-1", children: "Application Cache & Storage" }),
28052
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Purges web cache buffers, network images, and offline queue snapshots. Authenticated sessions and repository settings remain completely intact." })
28053
+ ] }),
28054
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
28055
+ "button",
28056
+ {
28057
+ type: "button",
28058
+ disabled: isClearingCache,
28059
+ onClick: async () => {
28060
+ setIsClearingCache(true);
28061
+ try {
28062
+ const res = await window.api.clearAppCache();
28063
+ if (res.success) {
28064
+ localStorage.removeItem("gitquickpush-offline-queue");
28065
+ showToast("Application cache cleared successfully!", "success");
28066
+ } else {
28067
+ showToast("Cache clear failed: " + res.error, "error");
28068
+ }
28069
+ } catch (err) {
28070
+ showToast("Cache clear failed: " + err.message, "error");
28071
+ } finally {
28072
+ setIsClearingCache(false);
28073
+ }
28074
+ },
28075
+ className: "shrink-0 px-5 py-2.5 bg-canvas hover:bg-surface-hover border border-border text-primary text-xs font-bold rounded-xl transition-all flex items-center gap-2.5 disabled:opacity-50",
28076
+ children: [
28077
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28078
+ "svg",
28079
+ {
28080
+ className: `w-4 h-4 ${isClearingCache ? "animate-spin text-brand" : "text-secondary"}`,
28081
+ fill: "none",
28082
+ stroke: "currentColor",
28083
+ viewBox: "0 0 24 24",
28084
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28085
+ "path",
28086
+ {
28087
+ strokeLinecap: "round",
28088
+ strokeLinejoin: "round",
28089
+ strokeWidth: 2,
28090
+ d: "M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"
28091
+ }
28092
+ )
28093
+ }
28094
+ ),
28095
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: isClearingCache ? "Purging Cache..." : "Clear Cache" })
28096
+ ]
28097
+ }
28098
+ )
28099
+ ] }),
28100
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm flex flex-col sm:flex-row sm:items-center justify-between gap-6", children: [
28101
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-xl", children: [
28102
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-bold text-primary mb-1", children: "Stale Git Index Lock Release" }),
28103
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-secondary leading-relaxed", children: [
28104
+ "If an interrupted commit or system reboot leaves behind a stuck",
28105
+ " ",
28106
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "text-xs font-mono bg-canvas px-1.5 py-0.5 rounded text-primary", children: ".git/index.lock" }),
28107
+ ", clicking this safely clears it to restore repository access."
28108
+ ] })
28109
+ ] }),
28110
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
28111
+ "button",
28112
+ {
28113
+ type: "button",
28114
+ onClick: async () => {
28115
+ try {
28116
+ const success = await window.api.removeGitLock();
28117
+ if (success) {
28118
+ showToast("Git lock released successfully", "success");
28119
+ } else {
28120
+ showToast("No active lock file found", "info");
28121
+ }
28122
+ } catch (err) {
28123
+ showToast("Failed to release lock: " + err.message, "error");
28124
+ }
28125
+ },
28126
+ className: "shrink-0 px-5 py-2.5 bg-canvas hover:bg-surface-hover border border-border text-primary text-xs font-bold rounded-xl transition-all flex items-center gap-2.5",
28127
+ children: [
28128
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28129
+ "svg",
28130
+ {
28131
+ className: "w-4 h-4 text-warning",
28132
+ fill: "none",
28133
+ stroke: "currentColor",
28134
+ viewBox: "0 0 24 24",
28135
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28136
+ "path",
28137
+ {
28138
+ strokeLinecap: "round",
28139
+ strokeLinejoin: "round",
28140
+ strokeWidth: 2,
28141
+ d: "M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"
28142
+ }
28143
+ )
28144
+ }
28145
+ ),
28146
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Release Git Lock" })
28147
+ ]
28148
+ }
28149
+ )
28150
+ ] })
28151
+ ] }),
28152
+ settingsTab === "developer" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-7", children: [
28153
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
28154
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-bold text-primary", children: "Tools & Advanced Overrides" }),
28155
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: "Developer utilities, diagnostics, and emergency push overrides." })
28156
+ ] }),
28157
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-danger/5 border border-danger/30 rounded-2xl p-6 shadow-sm flex flex-col sm:flex-row sm:items-center justify-between gap-6", children: [
28158
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-xl", children: [
28159
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-1.5", children: [
28160
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28161
+ "svg",
28162
+ {
28163
+ className: "w-4 h-4 text-danger",
28164
+ fill: "none",
28165
+ stroke: "currentColor",
28166
+ viewBox: "0 0 24 24",
28167
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28168
+ "path",
28169
+ {
28170
+ strokeLinecap: "round",
28171
+ strokeLinejoin: "round",
28172
+ strokeWidth: 2,
28173
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
28174
+ }
28175
+ )
28176
+ }
28177
+ ),
28178
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-bold uppercase tracking-wider text-danger", children: "Emergency Master Push Override" })
28179
+ ] }),
28180
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Bypasses remote divergence safety checks and forces the remote branch to match your current local tree. Overwrites remote history. Use only when resolving critical sync lockups." })
28181
+ ] }),
28182
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28183
+ "button",
28184
+ {
28185
+ type: "button",
28186
+ onClick: async () => {
28187
+ const confirmAction = window.confirm(
28188
+ "Are you sure? This will force push all current files, overriding remote history and bypassing all safety checks."
28189
+ );
28190
+ if (!confirmAction) return;
28191
+ try {
28192
+ const remotes = await window.api.getRemotes();
28193
+ if (!remotes || remotes.length === 0) {
28194
+ showToast("No remote configured to push to.", "error");
28195
+ return;
28196
+ }
28197
+ showToast("Executing Master Push override...", "info");
28198
+ await window.api.masterPush(remotes[0].name, status?.current || "main");
28199
+ showToast("Master Push successful!", "success");
28200
+ refreshRepoState();
28201
+ cancelSettings();
28202
+ } catch (err) {
28203
+ showToast(
28204
+ "Master Push failed: " + (err.message || "Unknown error"),
28205
+ "error"
28206
+ );
28207
+ }
28208
+ },
28209
+ className: "shrink-0 px-5 py-2.5 bg-danger hover:bg-danger/80 text-white text-xs font-bold rounded-xl transition-all shadow-sm",
28210
+ children: "Execute Force Push"
28211
+ }
28212
+ )
28213
+ ] })
28214
+ ] })
28215
+ ] })
27634
28216
  ] }),
27635
28217
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
27636
28218
  "div",
27637
28219
  {
27638
- className: "px-8 py-5 border-t border-border shrink-0 flex justify-end gap-3",
28220
+ className: "px-8 py-4.5 border-t border-border shrink-0 flex items-center justify-between",
27639
28221
  style: { backgroundColor: "var(--color-surface)" },
27640
28222
  children: [
27641
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27642
- "button",
27643
- {
27644
- onClick: () => cancelSettings(),
27645
- className: "px-6 py-2.5 bg-surface border-2 border-border hover:bg-surface-hover rounded-xl transition-all font-bold text-sm",
27646
- children: t("cancel")
27647
- }
27648
- ),
27649
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27650
- "button",
27651
- {
27652
- onClick: saveSettings,
27653
- className: "px-8 py-2.5 bg-brand hover:bg-brand-hover text-white rounded-xl transition-all font-black text-sm shadow-lg shadow-brand/20 border-b-4 border-black/20 active:border-b-0 active:translate-y-1",
27654
- children: t("save")
27655
- }
27656
- )
28223
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-secondary hidden sm:block", children: "Preferences are saved locally in your secure client profile." }),
28224
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 ml-auto", children: [
28225
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28226
+ "button",
28227
+ {
28228
+ type: "button",
28229
+ onClick: () => cancelSettings(),
28230
+ className: "px-5 py-2.5 bg-canvas border border-border hover:bg-surface-hover text-secondary hover:text-primary rounded-xl transition-all font-semibold text-xs",
28231
+ children: t("cancel")
28232
+ }
28233
+ ),
28234
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28235
+ "button",
28236
+ {
28237
+ type: "button",
28238
+ onClick: saveSettings,
28239
+ className: "px-7 py-2.5 bg-brand hover:bg-brand-hover text-white rounded-xl transition-all font-bold text-xs shadow-md shadow-brand/20 active:translate-y-0.5",
28240
+ children: t("save")
28241
+ }
28242
+ )
28243
+ ] })
27657
28244
  ]
27658
28245
  }
27659
28246
  )
@@ -27804,21 +28391,21 @@ Are you SURE you want to link "${repoName}" to this folder?`
27804
28391
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "mx-2", children: "•" }),
27805
28392
  new Date(commit.date).toLocaleString()
27806
28393
  ] }),
27807
- commit.diff && commit.diff.files && commit.diff.files.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
28394
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27808
28395
  "button",
27809
28396
  {
27810
28397
  onClick: () => toggleCommit(commit.hash),
27811
- className: "text-[10px] font-medium text-accent hover:text-primary transition-colors flex items-center gap-1.5 bg-accent/5 hover:bg-accent/10 px-2 py-1 rounded-md border border-accent/20",
28398
+ className: "text-[10px] font-medium text-accent hover:text-primary transition-colors flex items-center gap-1.5 bg-accent/5 hover:bg-accent/10 px-2 py-1 rounded-md border border-accent/20 cursor-pointer select-none active:scale-95",
28399
+ title: expandedCommits[commit.hash] ? "Hide commit details" : "View commit details",
27812
28400
  children: [
27813
28401
  expandedCommits[commit.hash] ? "Hide" : "View",
27814
28402
  " ",
27815
- commit.diff.changed,
27816
- " files",
27817
- commit.diff.insertions > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-success", children: [
28403
+ commit.diff?.files && commit.diff.files.length > 0 ? `${commit.diff.changed || commit.diff.files.length} ${(commit.diff.changed || commit.diff.files.length) === 1 ? "file" : "files"}` : "details",
28404
+ commit.diff?.insertions > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-success", children: [
27818
28405
  commit.diff.insertions,
27819
28406
  " ++"
27820
28407
  ] }),
27821
- commit.diff.deletions > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-danger", children: [
28408
+ commit.diff?.deletions > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-danger", children: [
27822
28409
  commit.diff.deletions,
27823
28410
  " --"
27824
28411
  ] })
@@ -27826,7 +28413,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
27826
28413
  }
27827
28414
  )
27828
28415
  ] }),
27829
- expandedCommits[commit.hash] && commit.diff && commit.diff.files && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-4 flex justify-center pb-8 border-t border-border/40 pt-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28416
+ expandedCommits[commit.hash] && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-4 flex justify-center pb-8 border-t border-border/40 pt-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27830
28417
  CommitReceiptPrinter,
27831
28418
  {
27832
28419
  commit,
@@ -27839,7 +28426,14 @@ Are you SURE you want to link "${repoName}" to this folder?`
27839
28426
  )) })
27840
28427
  ] }) }),
27841
28428
  showAuthModal && deviceFlowData && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-[60] p-6 transition-opacity", children: [
27842
- enableLockscreenSpace && /* @__PURE__ */ jsxRuntimeExports.jsx(SpaceScene, { fullScreen: true, onGameActiveChange: setIsGameActive }),
28429
+ !liteMode && enableLockscreenSpace && /* @__PURE__ */ jsxRuntimeExports.jsx(
28430
+ SpaceScene,
28431
+ {
28432
+ fullScreen: true,
28433
+ liteMode,
28434
+ onGameActiveChange: setIsGameActive
28435
+ }
28436
+ ),
27843
28437
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
27844
28438
  "div",
27845
28439
  {
@@ -27989,7 +28583,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
27989
28583
  }
27990
28584
  ),
27991
28585
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 pr-8 min-w-0", children: [
27992
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-10 h-10 rounded-xl bg-brand text-white border border-brand/20 flex items-center justify-center text-brand flex-shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28586
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-10 h-10 rounded-xl bg-brand/10 border border-brand/20 flex items-center justify-center text-brand flex-shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27993
28587
  "path",
27994
28588
  {
27995
28589
  strokeLinecap: "round",
@@ -28185,6 +28779,26 @@ Are you SURE you want to link "${repoName}" to this folder?`
28185
28779
  '"'
28186
28780
  ] })
28187
28781
  ] }),
28782
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-3.5 bg-surface/80 rounded-lg border border-border/80 text-xs space-y-2 mt-2", children: [
28783
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between text-secondary", children: [
28784
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-semibold text-primary flex items-center gap-1.5", children: [
28785
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "🛡️" }),
28786
+ " Security & Verification"
28787
+ ] }),
28788
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-accent bg-accent/10 px-2 py-0.5 rounded text-[11px] font-semibold", children: authStatus.username ? `@${authStatus.username}` : "Local Author" })
28789
+ ] }),
28790
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-3 text-secondary text-[11px] gap-1 pt-0.5", children: [
28791
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Authentication:" }),
28792
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "col-span-2 font-mono text-primary truncate", children: authStatus.authMethod || "GitHub OAuth (Verified)" }),
28793
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "AI Assistance:" }),
28794
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "col-span-2 text-primary font-medium flex items-center gap-1.5", children: [
28795
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse" }),
28796
+ authStatus.aiProvider || "GitHub Models (gpt-4o-mini)"
28797
+ ] }),
28798
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Session Privacy:" }),
28799
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "col-span-2 text-secondary opacity-90", children: authStatus.securityStatus || "End-to-End Encrypted Session" })
28800
+ ] })
28801
+ ] }),
28188
28802
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 flex items-center gap-2", children: [
28189
28803
  /* @__PURE__ */ jsxRuntimeExports.jsx(
28190
28804
  "input",
@@ -28220,7 +28834,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
28220
28834
  )
28221
28835
  ] })
28222
28836
  ] }) }),
28223
- pushSuccessData && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-50", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/95 backdrop-blur-xl p-8 rounded-xl shadow-2xl border border-border w-full max-w-[450px] mx-4 animate-float text-center", children: [
28837
+ pushSuccessData && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-50", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/95 backdrop-blur-xl p-8 rounded-xl shadow-2xl border border-border w-full max-w-[480px] mx-4 animate-float text-center", children: [
28224
28838
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto w-12 h-12 bg-success/20 rounded-full flex items-center justify-center text-success mb-4 border border-success/30", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-6 h-6", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28225
28839
  "path",
28226
28840
  {
@@ -28230,8 +28844,8 @@ Are you SURE you want to link "${repoName}" to this folder?`
28230
28844
  d: "M5 13l4 4L19 7"
28231
28845
  }
28232
28846
  ) }) }),
28233
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold mb-4 text-primary", children: "Push Successful" }),
28234
- /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-secondary mb-6 text-sm leading-relaxed", children: [
28847
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold mb-3 text-primary", children: "Push Successful" }),
28848
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-secondary mb-4 text-sm leading-relaxed", children: [
28235
28849
  "Successfully pushed",
28236
28850
  " ",
28237
28851
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-primary font-medium", children: pushSuccessData.files }),
@@ -28243,207 +28857,267 @@ Are you SURE you want to link "${repoName}" to this folder?`
28243
28857
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-primary", children: pushSuccessData.repository }),
28244
28858
  "."
28245
28859
  ] }),
28860
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-canvas/90 p-4 rounded-xl border border-border text-xs text-left mb-6 space-y-2", children: [
28861
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center text-secondary border-b border-border/60 pb-1.5", children: [
28862
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] font-medium", children: "Timestamp:" }),
28863
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-primary font-bold text-[11px]", children: pushSuccessData.timestamp || (/* @__PURE__ */ new Date()).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }) })
28864
+ ] }),
28865
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center text-secondary", children: [
28866
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px]", children: "Pushed By:" }),
28867
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-accent font-semibold text-[11px]", children: pushSuccessData.author || (authStatus.username ? `@${authStatus.username}` : "Git Author") })
28868
+ ] }),
28869
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center text-secondary", children: [
28870
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px]", children: "Verification:" }),
28871
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-emerald-400 font-semibold text-[11px]", children: pushSuccessData.authMethod || "GitHub OAuth (Verified ✓)" })
28872
+ ] }),
28873
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center text-secondary", children: [
28874
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px]", children: "AI Engine:" }),
28875
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-primary font-medium text-[11px] flex items-center gap-1.5", children: [
28876
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-emerald-400" }),
28877
+ pushSuccessData.aiProvider || "GitHub Models"
28878
+ ] })
28879
+ ] }),
28880
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center text-secondary border-t border-border/60 pt-1.5", children: [
28881
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px]", children: "Status:" }),
28882
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-emerald-400 font-bold text-[11px]", children: "Remote Up to Date" })
28883
+ ] })
28884
+ ] }),
28246
28885
  /* @__PURE__ */ jsxRuntimeExports.jsx(
28247
28886
  "button",
28248
28887
  {
28249
28888
  onClick: () => setPushSuccessData(null),
28250
- className: "w-full py-2 bg-surface-hover border border-border text-primary rounded-md font-semibold transition-colors text-sm",
28889
+ className: "w-full py-2.5 bg-brand hover:bg-brand-hover text-white rounded-md font-semibold transition-colors text-sm shadow-md",
28251
28890
  children: "Done"
28252
28891
  }
28253
- )
28254
- ] }) }),
28255
- pushFailureData && (() => {
28256
- const isConflict = Boolean(
28257
- pushFailureData.reason && (pushFailureData.reason.includes("unmerged files") || pushFailureData.reason.includes("unresolved conflict") || pushFailureData.reason.includes("merge conflict") || pushFailureData.reason.includes("Automatic merge failed") || pushFailureData.reason.includes("you have unmerged paths") || pushFailureData.reason.includes("CONFLICT ("))
28258
- );
28259
- const isPull = pushFailureData.operation === "pull" || pushFailureData.reason?.includes("pull-from-remote");
28260
- const cleanedReason = formatErrorMessage(pushFailureData.reason);
28261
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-50 p-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: `bg-surface/95 backdrop-blur-xl p-6 sm:p-8 rounded-xl shadow-2xl border ${isConflict ? "border-amber-500/50" : "border-danger/50"} w-full max-w-[520px] animate-float`, children: [
28262
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: `flex items-center gap-3 mb-4 ${isConflict ? "text-amber-500" : "text-danger"}`, children: [
28263
- isConflict ? /* @__PURE__ */ jsxRuntimeExports.jsxs("svg", { className: "w-6 h-6 flex-shrink-0", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
28264
- /* @__PURE__ */ jsxRuntimeExports.jsx("circle", { cx: "18", cy: "18", r: "3" }),
28265
- /* @__PURE__ */ jsxRuntimeExports.jsx("circle", { cx: "6", cy: "6", r: "3" }),
28266
- /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M6 9v12" }),
28267
- /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M18 9a9 9 0 0 0-9 9" })
28268
- ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-6 h-6 flex-shrink-0", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28269
- "path",
28270
- {
28271
- strokeLinecap: "round",
28272
- strokeLinejoin: "round",
28273
- strokeWidth: 2,
28274
- d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
28275
- }
28276
- ) }),
28277
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
28278
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold tracking-tight", children: isConflict ? "Merge Conflict Detected" : isPull ? "Pull Failed" : "Push Rejected" }),
28279
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: isConflict ? "Unmerged files prevent Git from syncing automatically." : isPull ? "Unable to pull incoming commits from the remote repository." : "Remote repository rejected your push request." })
28280
- ] })
28281
- ] }),
28282
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-4 bg-canvas/80 border border-border p-3.5 rounded-lg max-h-36 overflow-y-auto custom-scrollbar", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-primary font-mono text-xs leading-relaxed whitespace-pre-wrap select-text", children: cleanedReason }) }),
28283
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-secondary mb-5 text-sm leading-relaxed", children: isConflict ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
28284
- "Choose a resolution below: let ",
28285
- /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { className: "text-primary font-semibold", children: "AI Auto-Healer" }),
28286
- " intelligently reconcile conflicts, keep your local changes, accept remote incoming changes, or abort the merge to revert to the previous state."
28287
- ] }) : isPull ? /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "Failed to pull latest changes from the remote repository. Check your connection or use the AI Auto-Healer to analyze and fix the issue." }) : /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "Recommendation: You can pull the latest changes from the remote to reconcile your local branch, or you can use the AI Auto-Healer to analyze and fix the issue automatically." }) }),
28288
- isConflict ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2.5", children: [
28289
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28290
- "button",
28291
- {
28292
- onClick: () => {
28293
- const data = pushFailureData;
28294
- setPushFailureData(null);
28295
- autonomousHealAndPush(
28296
- data.reason,
28297
- data.operation || "pull",
28298
- data.overrideRepoPath,
28299
- data.overrideBranch
28300
- );
28301
- },
28302
- className: "w-full py-2.5 bg-brand hover:bg-brand-hover border border-white/10 text-white rounded-md font-semibold transition-all text-sm flex items-center justify-center gap-2 shadow-lg shadow-brand/20 active:scale-[0.99]",
28303
- children: "✨ Auto-Resolve with AI"
28304
- }
28305
- ),
28306
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-3 gap-2", children: [
28307
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28308
- "button",
28309
- {
28310
- onClick: handleResolveConflictOurs,
28311
- className: "py-2 px-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-all text-xs text-center hover:border-brand/40",
28312
- title: "Keep local changes and discard remote changes",
28313
- children: "Keep Local (Ours)"
28314
- }
28315
- ),
28316
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28317
- "button",
28318
- {
28319
- onClick: handleResolveConflictTheirs,
28320
- className: "py-2 px-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-all text-xs text-center hover:border-brand/40",
28321
- title: "Accept remote incoming changes and discard local changes",
28322
- children: "Accept Remote (Theirs)"
28323
- }
28324
- ),
28325
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28326
- "button",
28327
- {
28328
- onClick: handleAbortMerge,
28329
- className: "py-2 px-2 bg-danger/10 hover:bg-danger/20 border border-danger/30 text-danger rounded-md font-semibold transition-all text-xs text-center",
28330
- title: "Abort the merge and revert repository to previous state",
28331
- children: "Abort Merge"
28332
- }
28333
- )
28334
- ] }),
28335
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28336
- "button",
28337
- {
28338
- onClick: () => {
28339
- setPushFailureData(null);
28340
- setChangesTab("changes");
28341
- },
28342
- className: "w-full py-2 bg-surface hover:bg-surface-hover border border-border text-secondary hover:text-primary rounded-md font-medium transition-colors text-xs text-center",
28343
- children: "Review Conflicted Files Manually in Changes Tab"
28344
- }
28345
- ),
28346
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28347
- "button",
28348
- {
28349
- onClick: async () => {
28350
- const data = pushFailureData;
28351
- setPushFailureData(null);
28352
- try {
28353
- const remotes = await window.api.getRemotes();
28354
- const targetRemote = data?.overrideRepoPath || remotes[0]?.name || "origin";
28355
- const targetBranch = data?.overrideBranch || "main";
28356
- await window.api.masterPush(targetRemote, targetBranch);
28357
- setPushSuccessData({
28358
- files: "All",
28359
- branch: targetBranch,
28360
- repository: targetRemote
28361
- });
28362
- } catch (err) {
28363
- setPushFailureData({
28364
- reason: err.message || "Master Force Push Failed",
28365
- operation: "push",
28366
- overrideRepoPath: data?.overrideRepoPath,
28367
- overrideBranch: data?.overrideBranch
28368
- });
28369
- }
28370
- },
28371
- className: "w-full mt-2 py-2.5 bg-danger/20 hover:bg-danger/30 border border-danger/50 text-danger rounded-md font-bold transition-all text-sm flex items-center justify-center gap-2 shadow-lg shadow-danger/10 active:scale-[0.99]",
28372
- title: "Force push everything (including ignored files) bypassing all rules",
28373
- children: "⚡ Master Force Push (Override All)"
28374
- }
28375
- )
28376
- ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3", children: [
28377
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-3", children: [
28378
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28379
- "button",
28380
- {
28381
- onClick: () => {
28382
- const data = pushFailureData;
28383
- setPushFailureData(null);
28384
- autonomousHealAndPush(
28385
- data.reason,
28386
- data.operation || (isPull ? "pull" : "push"),
28387
- data.overrideRepoPath,
28388
- data.overrideBranch
28389
- );
28390
- },
28391
- className: "flex-1 py-2 bg-brand hover:bg-brand-hover border border-white/10 text-white rounded-md font-semibold transition-all text-sm flex items-center justify-center gap-2 active:scale-[0.99]",
28392
- children: "✨ Fix with AI"
28393
- }
28394
- ),
28395
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28396
- "button",
28892
+ )
28893
+ ] }) }),
28894
+ pushFailureData && (() => {
28895
+ const isConflict = Boolean(
28896
+ pushFailureData.reason && (pushFailureData.reason.includes("unmerged files") || pushFailureData.reason.includes("unresolved conflict") || pushFailureData.reason.includes("merge conflict") || pushFailureData.reason.includes("Automatic merge failed") || pushFailureData.reason.includes("you have unmerged paths") || pushFailureData.reason.includes("CONFLICT ("))
28897
+ );
28898
+ const isPull = pushFailureData.operation === "pull" || pushFailureData.reason?.includes("pull-from-remote");
28899
+ const cleanedReason = formatErrorMessage(pushFailureData.reason);
28900
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-50 p-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
28901
+ "div",
28902
+ {
28903
+ className: `bg-surface/95 backdrop-blur-xl p-6 sm:p-8 rounded-xl shadow-2xl border ${isConflict ? "border-amber-500/50" : "border-danger/50"} w-full max-w-[520px] animate-float`,
28904
+ children: [
28905
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
28906
+ "div",
28397
28907
  {
28398
- onClick: () => {
28399
- setPushFailureData(null);
28400
- handlePull();
28401
- },
28402
- className: "flex-1 py-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-all text-sm active:scale-[0.99]",
28403
- children: isPull ? "Retry Pull" : "Pull Changes"
28908
+ className: `flex items-center gap-3 mb-4 ${isConflict ? "text-amber-500" : "text-danger"}`,
28909
+ children: [
28910
+ isConflict ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
28911
+ "svg",
28912
+ {
28913
+ className: "w-6 h-6 flex-shrink-0",
28914
+ viewBox: "0 0 24 24",
28915
+ fill: "none",
28916
+ stroke: "currentColor",
28917
+ strokeWidth: "2",
28918
+ strokeLinecap: "round",
28919
+ strokeLinejoin: "round",
28920
+ children: [
28921
+ /* @__PURE__ */ jsxRuntimeExports.jsx("circle", { cx: "18", cy: "18", r: "3" }),
28922
+ /* @__PURE__ */ jsxRuntimeExports.jsx("circle", { cx: "6", cy: "6", r: "3" }),
28923
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M6 9v12" }),
28924
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M18 9a9 9 0 0 0-9 9" })
28925
+ ]
28926
+ }
28927
+ ) : /* @__PURE__ */ jsxRuntimeExports.jsx(
28928
+ "svg",
28929
+ {
28930
+ className: "w-6 h-6 flex-shrink-0",
28931
+ fill: "none",
28932
+ stroke: "currentColor",
28933
+ viewBox: "0 0 24 24",
28934
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28935
+ "path",
28936
+ {
28937
+ strokeLinecap: "round",
28938
+ strokeLinejoin: "round",
28939
+ strokeWidth: 2,
28940
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
28941
+ }
28942
+ )
28943
+ }
28944
+ ),
28945
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
28946
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold tracking-tight", children: isConflict ? "Merge Conflict Detected" : isPull ? "Pull Failed" : "Push Rejected" }),
28947
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: isConflict ? "Unmerged files prevent Git from syncing automatically." : isPull ? "Unable to pull incoming commits from the remote repository." : "Remote repository rejected your push request." })
28948
+ ] })
28949
+ ]
28404
28950
  }
28405
28951
  ),
28406
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28407
- "button",
28408
- {
28409
- onClick: () => setPushFailureData(null),
28410
- className: "flex-1 py-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-colors text-sm active:scale-[0.99]",
28411
- children: "Cancel"
28412
- }
28413
- )
28414
- ] }),
28415
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28416
- "button",
28417
- {
28418
- onClick: async () => {
28419
- const data = pushFailureData;
28420
- setPushFailureData(null);
28421
- try {
28422
- const remotes = await window.api.getRemotes();
28423
- const targetRemote = data?.overrideRepoPath || remotes[0]?.name || "origin";
28424
- const targetBranch = data?.overrideBranch || "main";
28425
- await window.api.masterPush(targetRemote, targetBranch);
28426
- setPushSuccessData({
28427
- files: "All",
28428
- branch: targetBranch,
28429
- repository: targetRemote
28430
- });
28431
- } catch (err) {
28432
- setPushFailureData({
28433
- reason: err.message || "Master Force Push Failed",
28434
- operation: "push",
28435
- overrideRepoPath: data?.overrideRepoPath,
28436
- overrideBranch: data?.overrideBranch
28437
- });
28952
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-4 bg-canvas/80 border border-border p-3.5 rounded-lg max-h-36 overflow-y-auto custom-scrollbar", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-primary font-mono text-xs leading-relaxed whitespace-pre-wrap select-text", children: cleanedReason }) }),
28953
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-secondary mb-5 text-sm leading-relaxed", children: isConflict ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
28954
+ "Choose a resolution below: let",
28955
+ " ",
28956
+ /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { className: "text-primary font-semibold", children: "AI Auto-Healer" }),
28957
+ " ",
28958
+ "intelligently reconcile conflicts, keep your local changes, accept remote incoming changes, or abort the merge to revert to the previous state."
28959
+ ] }) : isPull ? /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "Failed to pull latest changes from the remote repository. Check your connection or use the AI Auto-Healer to analyze and fix the issue." }) : /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "Recommendation: You can pull the latest changes from the remote to reconcile your local branch, or you can use the AI Auto-Healer to analyze and fix the issue automatically." }) }),
28960
+ isConflict ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2.5", children: [
28961
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28962
+ "button",
28963
+ {
28964
+ onClick: () => {
28965
+ const data = pushFailureData;
28966
+ setPushFailureData(null);
28967
+ autonomousHealAndPush(
28968
+ data.reason,
28969
+ data.operation || "pull",
28970
+ data.overrideRepoPath,
28971
+ data.overrideBranch
28972
+ );
28973
+ },
28974
+ className: "w-full py-2.5 bg-brand hover:bg-brand-hover border border-white/10 text-white rounded-md font-semibold transition-all text-sm flex items-center justify-center gap-2 shadow-lg shadow-brand/20 active:scale-[0.99]",
28975
+ children: "✨ Auto-Resolve with AI"
28438
28976
  }
28439
- },
28440
- className: "w-full py-2 bg-danger/20 hover:bg-danger/30 border border-danger/50 text-danger rounded-md font-bold transition-all text-sm flex items-center justify-center gap-2 active:scale-[0.99]",
28441
- title: "Force push everything (including ignored files) bypassing all rules",
28442
- children: "⚡ Master Force Push (Override All)"
28443
- }
28444
- )
28445
- ] })
28446
- ] }) });
28977
+ ),
28978
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-3 gap-2", children: [
28979
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28980
+ "button",
28981
+ {
28982
+ onClick: handleResolveConflictOurs,
28983
+ className: "py-2 px-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-all text-xs text-center hover:border-brand/40",
28984
+ title: "Keep local changes and discard remote changes",
28985
+ children: "Keep Local (Ours)"
28986
+ }
28987
+ ),
28988
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28989
+ "button",
28990
+ {
28991
+ onClick: handleResolveConflictTheirs,
28992
+ className: "py-2 px-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-all text-xs text-center hover:border-brand/40",
28993
+ title: "Accept remote incoming changes and discard local changes",
28994
+ children: "Accept Remote (Theirs)"
28995
+ }
28996
+ ),
28997
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28998
+ "button",
28999
+ {
29000
+ onClick: handleAbortMerge,
29001
+ className: "py-2 px-2 bg-danger/10 hover:bg-danger/20 border border-danger/30 text-danger rounded-md font-semibold transition-all text-xs text-center",
29002
+ title: "Abort the merge and revert repository to previous state",
29003
+ children: "Abort Merge"
29004
+ }
29005
+ )
29006
+ ] }),
29007
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
29008
+ "button",
29009
+ {
29010
+ onClick: () => {
29011
+ setPushFailureData(null);
29012
+ setChangesTab("changes");
29013
+ },
29014
+ className: "w-full py-2 bg-surface hover:bg-surface-hover border border-border text-secondary hover:text-primary rounded-md font-medium transition-colors text-xs text-center",
29015
+ children: "Review Conflicted Files Manually in Changes Tab"
29016
+ }
29017
+ ),
29018
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
29019
+ "button",
29020
+ {
29021
+ onClick: async () => {
29022
+ const data = pushFailureData;
29023
+ setPushFailureData(null);
29024
+ try {
29025
+ const remotes = await window.api.getRemotes();
29026
+ const targetRemote = data?.overrideRepoPath || remotes[0]?.name || "origin";
29027
+ const targetBranch = data?.overrideBranch || "main";
29028
+ await window.api.masterPush(targetRemote, targetBranch);
29029
+ setPushSuccessData({
29030
+ files: "All",
29031
+ branch: targetBranch,
29032
+ repository: targetRemote
29033
+ });
29034
+ } catch (err) {
29035
+ setPushFailureData({
29036
+ reason: err.message || "Master Force Push Failed",
29037
+ operation: "push",
29038
+ overrideRepoPath: data?.overrideRepoPath,
29039
+ overrideBranch: data?.overrideBranch
29040
+ });
29041
+ }
29042
+ },
29043
+ className: "w-full mt-2 py-2.5 bg-danger/20 hover:bg-danger/30 border border-danger/50 text-danger rounded-md font-bold transition-all text-sm flex items-center justify-center gap-2 shadow-lg shadow-danger/10 active:scale-[0.99]",
29044
+ title: "Force push everything (including ignored files) bypassing all rules",
29045
+ children: "⚡ Master Force Push (Override All)"
29046
+ }
29047
+ )
29048
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3", children: [
29049
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-3", children: [
29050
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
29051
+ "button",
29052
+ {
29053
+ onClick: () => {
29054
+ const data = pushFailureData;
29055
+ setPushFailureData(null);
29056
+ autonomousHealAndPush(
29057
+ data.reason,
29058
+ data.operation || (isPull ? "pull" : "push"),
29059
+ data.overrideRepoPath,
29060
+ data.overrideBranch
29061
+ );
29062
+ },
29063
+ className: "flex-1 py-2 bg-brand hover:bg-brand-hover border border-white/10 text-white rounded-md font-semibold transition-all text-sm flex items-center justify-center gap-2 active:scale-[0.99]",
29064
+ children: "✨ Fix with AI"
29065
+ }
29066
+ ),
29067
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
29068
+ "button",
29069
+ {
29070
+ onClick: () => {
29071
+ setPushFailureData(null);
29072
+ handlePull();
29073
+ },
29074
+ className: "flex-1 py-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-all text-sm active:scale-[0.99]",
29075
+ children: isPull ? "Retry Pull" : "Pull Changes"
29076
+ }
29077
+ ),
29078
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
29079
+ "button",
29080
+ {
29081
+ onClick: () => setPushFailureData(null),
29082
+ className: "flex-1 py-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-colors text-sm active:scale-[0.99]",
29083
+ children: "Cancel"
29084
+ }
29085
+ )
29086
+ ] }),
29087
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
29088
+ "button",
29089
+ {
29090
+ onClick: async () => {
29091
+ const data = pushFailureData;
29092
+ setPushFailureData(null);
29093
+ try {
29094
+ const remotes = await window.api.getRemotes();
29095
+ const targetRemote = data?.overrideRepoPath || remotes[0]?.name || "origin";
29096
+ const targetBranch = data?.overrideBranch || "main";
29097
+ await window.api.masterPush(targetRemote, targetBranch);
29098
+ setPushSuccessData({
29099
+ files: "All",
29100
+ branch: targetBranch,
29101
+ repository: targetRemote
29102
+ });
29103
+ } catch (err) {
29104
+ setPushFailureData({
29105
+ reason: err.message || "Master Force Push Failed",
29106
+ operation: "push",
29107
+ overrideRepoPath: data?.overrideRepoPath,
29108
+ overrideBranch: data?.overrideBranch
29109
+ });
29110
+ }
29111
+ },
29112
+ className: "w-full py-2 bg-danger/20 hover:bg-danger/30 border border-danger/50 text-danger rounded-md font-bold transition-all text-sm flex items-center justify-center gap-2 active:scale-[0.99]",
29113
+ title: "Force push everything (including ignored files) bypassing all rules",
29114
+ children: "⚡ Master Force Push (Override All)"
29115
+ }
29116
+ )
29117
+ ] })
29118
+ ]
29119
+ }
29120
+ ) });
28447
29121
  })(),
28448
29122
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-64 lg:w-72 flex-shrink-0 bg-surface/80 backdrop-blur-md p-5 border-r border-border flex flex-col relative z-10 shadow-lg transition-colors duration-300", children: [
28449
29123
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 mb-6 p-1", children: [
@@ -28706,7 +29380,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
28706
29380
  }
28707
29381
  ),
28708
29382
  t("collaborationRepo"),
28709
- collaboratedRepos.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-auto bg-brand text-white text-brand text-[10px] font-bold px-1.5 py-0.5 rounded-full", children: collaboratedRepos.length })
29383
+ collaboratedRepos.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-auto bg-brand/20 text-brand text-[10px] font-bold px-1.5 py-0.5 rounded-full", children: collaboratedRepos.length })
28710
29384
  ]
28711
29385
  }
28712
29386
  ),
@@ -28779,7 +29453,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
28779
29453
  )
28780
29454
  ] })
28781
29455
  ] }),
28782
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 p-6 flex flex-col overflow-y-auto custom-scrollbar min-h-0 relative z-10", children: isRepo && status && branches ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 flex flex-col min-h-0 gap-4 mb-6 relative z-20", children: [
29456
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 p-6 flex flex-col overflow-y-auto custom-scrollbar min-h-0 relative z-10", children: isRepo && status ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 flex flex-col min-h-0 gap-4 mb-6 relative z-20", children: [
28783
29457
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap justify-between items-center bg-surface backdrop-blur-md border border-border p-3 rounded-xl transition-colors duration-300 gap-4 relative z-50", children: [
28784
29458
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-center gap-4 text-sm", children: [
28785
29459
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 relative", children: [
@@ -28954,7 +29628,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
28954
29628
  "button",
28955
29629
  {
28956
29630
  onClick: handleToggleAutoSync,
28957
- className: `px-2 py-1.5 rounded transition-colors flex items-center justify-center border font-medium ${autoSyncEnabled ? "bg-green-500/20 text-green-400 border-green-500/30" : "hover:bg-brand text-white text-brand border-brand/30"}`,
29631
+ className: `px-2 py-1.5 rounded transition-colors flex items-center justify-center border font-medium ${autoSyncEnabled ? "bg-green-500/20 text-green-400 border-green-500/30" : "hover:bg-brand/20 text-brand border-brand/30"}`,
28958
29632
  title: autoSyncEnabled ? "Disable Auto-Push" : "Enable Auto-Push",
28959
29633
  children: [
28960
29634
  "⚡ ",
@@ -29073,6 +29747,35 @@ Are you SURE you want to link "${repoName}" to this folder?`
29073
29747
  "Refresh"
29074
29748
  ]
29075
29749
  }
29750
+ ),
29751
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
29752
+ "button",
29753
+ {
29754
+ onClick: () => setShowForcePushModal(true),
29755
+ className: "w-full sm:w-auto px-4 py-2 sm:px-3 sm:py-1.5 bg-danger/10 hover:bg-danger/20 border border-danger/30 text-danger rounded-md text-xs font-bold active:scale-95 transition-all flex items-center justify-center gap-1.5",
29756
+ title: "Emergency Force Push (Master Override)",
29757
+ children: [
29758
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
29759
+ "svg",
29760
+ {
29761
+ className: "w-3.5 h-3.5",
29762
+ fill: "none",
29763
+ stroke: "currentColor",
29764
+ viewBox: "0 0 24 24",
29765
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
29766
+ "path",
29767
+ {
29768
+ strokeLinecap: "round",
29769
+ strokeLinejoin: "round",
29770
+ strokeWidth: 2,
29771
+ d: "M13 10V3L4 14h7v7l9-11h-7z"
29772
+ }
29773
+ )
29774
+ }
29775
+ ),
29776
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Force Push" })
29777
+ ]
29778
+ }
29076
29779
  )
29077
29780
  ] })
29078
29781
  ] }),
@@ -29119,7 +29822,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
29119
29822
  "button",
29120
29823
  {
29121
29824
  onClick: () => window.api.openExternal(remoteUrl),
29122
- className: "p-1.5 hover:bg-brand text-white text-brand rounded transition-colors flex items-center justify-center border border-brand/30",
29825
+ className: "p-1.5 hover:bg-brand/20 text-brand rounded transition-colors flex items-center justify-center border border-brand/30",
29123
29826
  title: "View Repository on GitHub",
29124
29827
  children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-3.5 h-3.5", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.205 11.387.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 21.795 24 17.298 24 12c0-6.627-5.373-12-12-12z" }) })
29125
29828
  }
@@ -29145,7 +29848,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
29145
29848
  "button",
29146
29849
  {
29147
29850
  onClick: () => setShowContributorsModal(true),
29148
- className: "px-2 py-1.5 hover:bg-brand text-white text-brand rounded transition-colors flex items-center justify-center border border-brand/30 font-medium",
29851
+ className: "px-2 py-1.5 hover:bg-brand/20 text-brand rounded transition-colors flex items-center justify-center border border-brand/30 font-medium",
29149
29852
  title: "Manage Collaborators",
29150
29853
  children: [
29151
29854
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -29298,7 +30001,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
29298
30001
  children: "Deleted"
29299
30002
  }
29300
30003
  ),
29301
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ml-auto text-xs font-bold text-brand bg-brand text-white border border-brand/20 px-3 py-1 rounded-full", children: "Collaboration Repo" })
30004
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ml-auto text-xs font-bold text-brand bg-brand/20 border border-brand/30 px-3 py-1 rounded-full", children: "Collaboration Repo" })
29302
30005
  ] }),
29303
30006
  /* @__PURE__ */ jsxRuntimeExports.jsx(
29304
30007
  CollaborationRepoView,
@@ -29365,7 +30068,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
29365
30068
  className: `text-xs font-semibold px-3 py-1.5 rounded-t-md transition-colors border-b-2 whitespace-nowrap flex-shrink-0 ${changesTab === "collaboration-repo" ? "text-primary border-brand bg-surface border-b-2" : "text-secondary border-transparent hover:text-primary"}`,
29366
30069
  children: [
29367
30070
  "Collaboration Repo",
29368
- collaboratedRepos.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-1.5 bg-brand text-white text-brand text-[10px] font-bold px-1.5 py-0.5 rounded-full", children: collaboratedRepos.length })
30071
+ collaboratedRepos.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-1.5 bg-brand/20 text-brand text-[10px] font-bold px-1.5 py-0.5 rounded-full", children: collaboratedRepos.length })
29369
30072
  ]
29370
30073
  }
29371
30074
  ),
@@ -29375,7 +30078,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
29375
30078
  {
29376
30079
  onClick: handleUploadFiles,
29377
30080
  disabled: !repoPath || isUploading,
29378
- className: "text-xs bg-brand text-white hover:bg-brand text-white text-brand border border-brand/30 px-2.5 py-1 rounded-md transition-all flex items-center gap-1.5 font-medium shadow-sm disabled:opacity-50 whitespace-nowrap flex-shrink-0",
30081
+ className: "text-xs bg-brand text-white hover:bg-brand/90 border border-brand/30 px-2.5 py-1 rounded-md transition-all flex items-center gap-1.5 font-medium shadow-sm disabled:opacity-50 whitespace-nowrap flex-shrink-0",
29379
30082
  title: "Upload files directly into this repository",
29380
30083
  children: [
29381
30084
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -29726,7 +30429,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
29726
30429
  ]
29727
30430
  }
29728
30431
  ),
29729
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-bold text-brand bg-brand text-white border border-brand/20 px-3 py-1 rounded-full", children: "Collaboration Hub" }) })
30432
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-bold text-brand bg-brand/20 border border-brand/30 px-3 py-1 rounded-full", children: "Collaboration Hub" }) })
29730
30433
  ] }),
29731
30434
  /* @__PURE__ */ jsxRuntimeExports.jsx(
29732
30435
  CollaborationRepoView,
@@ -29950,90 +30653,189 @@ Are you SURE you want to link "${repoName}" to this folder?`
29950
30653
  children: /* @__PURE__ */ jsxRuntimeExports.jsx(
29951
30654
  "svg",
29952
30655
  {
29953
- className: "w-3.5 h-3.5",
30656
+ className: "w-3.5 h-3.5",
30657
+ fill: "none",
30658
+ stroke: "currentColor",
30659
+ viewBox: "0 0 24 24",
30660
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30661
+ "path",
30662
+ {
30663
+ strokeLinecap: "round",
30664
+ strokeLinejoin: "round",
30665
+ strokeWidth: 2,
30666
+ d: "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"
30667
+ }
30668
+ )
30669
+ }
30670
+ )
30671
+ }
30672
+ )
30673
+ ] })
30674
+ ] }),
30675
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 flex flex-col items-center justify-center text-secondary relative z-10 py-6", children: [
30676
+ invitations.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-6 p-4 sm:p-5 bg-surface/90 border border-brand/40 hover:border-brand/70 rounded-2xl shadow-xl flex items-center gap-4 max-w-md w-full backdrop-blur-md animate-fade-in transition-all", children: [
30677
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-11 h-11 rounded-xl bg-brand text-white flex items-center justify-center text-xl flex-shrink-0 shadow-md", children: "🔔" }),
30678
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 text-left min-w-0", children: [
30679
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm font-bold text-primary truncate", children: [
30680
+ invitations.length,
30681
+ " Collaboration Invitation",
30682
+ invitations.length > 1 ? "s" : "",
30683
+ " Pending"
30684
+ ] }),
30685
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Accept now to clone or link and start collaborating." })
30686
+ ] }),
30687
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
30688
+ "button",
30689
+ {
30690
+ onClick: () => setShowInvitationsModal(true),
30691
+ className: "px-3.5 py-1.5 bg-brand hover:bg-brand-hover text-white text-xs font-bold rounded-lg transition-all shadow-sm flex-shrink-0 cursor-pointer",
30692
+ children: [
30693
+ "Review (",
30694
+ invitations.length,
30695
+ ")"
30696
+ ]
30697
+ }
30698
+ )
30699
+ ] }),
30700
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-24 h-24 mb-6 opacity-30 hover:opacity-50 transition-opacity", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: logo, alt: "Logo", className: "w-full h-full drop-shadow-md" }) }),
30701
+ repoPath ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
30702
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xl mb-2 text-primary font-semibold", children: "Folder Loaded" }),
30703
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-mono text-accent bg-accent/10 px-3 py-1 rounded-md mb-6 border border-accent/20", children: repoPath }),
30704
+ errorMsg ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-danger bg-danger/10 border border-danger/30 p-5 rounded-xl text-sm text-center max-w-md shadow-lg flex flex-col items-center gap-3", children: [
30705
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
30706
+ /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "Error:" }),
30707
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-1 text-xs opacity-90", children: errorMsg })
30708
+ ] }),
30709
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [
30710
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
30711
+ "button",
30712
+ {
30713
+ onClick: () => refreshRepoState(),
30714
+ className: "px-4 py-1.5 bg-brand hover:bg-brand-hover text-white text-xs font-semibold rounded-lg transition-all cursor-pointer",
30715
+ children: "Retry"
30716
+ }
30717
+ ),
30718
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
30719
+ "button",
30720
+ {
30721
+ onClick: () => setShowSetupWizard(true),
30722
+ className: "px-4 py-1.5 bg-surface-hover hover:bg-surface text-secondary hover:text-primary text-xs font-semibold rounded-lg border border-border transition-all cursor-pointer",
30723
+ children: "Setup Repository"
30724
+ }
30725
+ )
30726
+ ] })
30727
+ ] }) : !isRepo ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-3 max-w-md text-center p-6 bg-surface/50 rounded-2xl border border-border/40 backdrop-blur-sm", children: [
30728
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-secondary", children: "This folder is loaded, but Git is not initialized in it yet." }),
30729
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mt-2", children: [
30730
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
30731
+ "button",
30732
+ {
30733
+ onClick: () => setShowSetupWizard(true),
30734
+ className: "px-5 py-2.5 bg-brand hover:bg-brand-hover text-white font-semibold rounded-xl text-xs transition-all shadow-md hover:shadow-brand/20 cursor-pointer flex items-center gap-2",
30735
+ children: [
30736
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
30737
+ "svg",
30738
+ {
30739
+ className: "w-4 h-4",
30740
+ fill: "none",
30741
+ stroke: "currentColor",
30742
+ viewBox: "0 0 24 24",
30743
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30744
+ "path",
30745
+ {
30746
+ strokeLinecap: "round",
30747
+ strokeLinejoin: "round",
30748
+ strokeWidth: "2",
30749
+ d: "M12 4v16m8-8H4"
30750
+ }
30751
+ )
30752
+ }
30753
+ ),
30754
+ "Initialize Git Repository"
30755
+ ]
30756
+ }
30757
+ ),
30758
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
30759
+ "button",
30760
+ {
30761
+ onClick: async () => {
30762
+ if (!repoPath) return;
30763
+ const res = await window.api.setRepoPath(repoPath);
30764
+ if (res) {
30765
+ setRepoPath(res.path);
30766
+ setIsRepo(res.isRepo);
30767
+ if (res.isRepo) {
30768
+ await refreshRepoState();
30769
+ }
30770
+ }
30771
+ },
30772
+ className: "px-4 py-2.5 bg-surface hover:bg-surface-hover text-secondary hover:text-primary font-semibold rounded-xl text-xs border border-border transition-all cursor-pointer flex items-center gap-1.5",
30773
+ children: [
30774
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
30775
+ "svg",
30776
+ {
30777
+ className: "w-3.5 h-3.5",
30778
+ fill: "none",
30779
+ stroke: "currentColor",
30780
+ viewBox: "0 0 24 24",
30781
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30782
+ "path",
30783
+ {
30784
+ strokeLinecap: "round",
30785
+ strokeLinejoin: "round",
30786
+ strokeWidth: "2",
30787
+ d: "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"
30788
+ }
30789
+ )
30790
+ }
30791
+ ),
30792
+ "Check Again"
30793
+ ]
30794
+ }
30795
+ )
30796
+ ] })
30797
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2", children: [
30798
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "flex items-center gap-2 text-sm text-secondary", children: [
30799
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
30800
+ "svg",
30801
+ {
30802
+ className: "w-4 h-4 animate-spin text-brand",
29954
30803
  fill: "none",
29955
- stroke: "currentColor",
29956
30804
  viewBox: "0 0 24 24",
29957
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(
29958
- "path",
29959
- {
29960
- strokeLinecap: "round",
29961
- strokeLinejoin: "round",
29962
- strokeWidth: 2,
29963
- d: "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"
29964
- }
29965
- )
30805
+ children: [
30806
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
30807
+ "circle",
30808
+ {
30809
+ className: "opacity-25",
30810
+ cx: "12",
30811
+ cy: "12",
30812
+ r: "10",
30813
+ stroke: "currentColor",
30814
+ strokeWidth: "4"
30815
+ }
30816
+ ),
30817
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
30818
+ "path",
30819
+ {
30820
+ className: "opacity-75",
30821
+ fill: "currentColor",
30822
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
30823
+ }
30824
+ )
30825
+ ]
29966
30826
  }
29967
- )
29968
- }
29969
- )
29970
- ] })
29971
- ] }),
29972
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 flex flex-col items-center justify-center text-secondary relative z-10 py-6", children: [
29973
- invitations.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-6 p-4 sm:p-5 bg-surface/90 border border-brand/40 hover:border-brand/70 rounded-2xl shadow-xl flex items-center gap-4 max-w-md w-full backdrop-blur-md animate-fade-in transition-all", children: [
29974
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-11 h-11 rounded-xl bg-brand text-white flex items-center justify-center text-xl flex-shrink-0 shadow-md", children: "🔔" }),
29975
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 text-left min-w-0", children: [
29976
- /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm font-bold text-primary truncate", children: [
29977
- invitations.length,
29978
- " Collaboration Invitation",
29979
- invitations.length > 1 ? "s" : "",
29980
- " Pending"
30827
+ ),
30828
+ " ",
30829
+ "Analyzing Git Repository..."
29981
30830
  ] }),
29982
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Accept now to clone or link and start collaborating." })
29983
- ] }),
29984
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
29985
- "button",
29986
- {
29987
- onClick: () => setShowInvitationsModal(true),
29988
- className: "px-3.5 py-1.5 bg-brand hover:bg-brand-hover text-white text-xs font-bold rounded-lg transition-all shadow-sm flex-shrink-0 cursor-pointer",
29989
- children: [
29990
- "Review (",
29991
- invitations.length,
29992
- ")"
29993
- ]
29994
- }
29995
- )
29996
- ] }),
29997
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-24 h-24 mb-6 opacity-30 hover:opacity-50 transition-opacity", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: logo, alt: "Logo", className: "w-full h-full drop-shadow-md" }) }),
29998
- repoPath ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
29999
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xl mb-2 text-primary font-semibold", children: "Folder Loaded" }),
30000
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-mono text-accent bg-accent/10 px-3 py-1 rounded-md mb-6 border border-accent/20", children: repoPath }),
30001
- errorMsg ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-danger bg-danger/10 border border-danger/30 p-4 rounded-md text-sm text-center max-w-md", children: [
30002
- /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "Error:" }),
30003
- /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
30004
- errorMsg
30005
- ] }) : !isRepo ? /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm", children: 'Click "Initialize Git in Folder" in the sidebar.' }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "flex items-center gap-2 text-sm", children: [
30006
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
30007
- "svg",
30831
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
30832
+ "button",
30008
30833
  {
30009
- className: "w-4 h-4 animate-spin text-secondary",
30010
- fill: "none",
30011
- viewBox: "0 0 24 24",
30012
- children: [
30013
- /* @__PURE__ */ jsxRuntimeExports.jsx(
30014
- "circle",
30015
- {
30016
- className: "opacity-25",
30017
- cx: "12",
30018
- cy: "12",
30019
- r: "10",
30020
- stroke: "currentColor",
30021
- strokeWidth: "4"
30022
- }
30023
- ),
30024
- /* @__PURE__ */ jsxRuntimeExports.jsx(
30025
- "path",
30026
- {
30027
- className: "opacity-75",
30028
- fill: "currentColor",
30029
- d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
30030
- }
30031
- )
30032
- ]
30834
+ onClick: () => refreshRepoState(),
30835
+ className: "text-xs text-secondary hover:text-primary underline mt-2 cursor-pointer",
30836
+ children: "Force Refresh"
30033
30837
  }
30034
- ),
30035
- " ",
30036
- "Analyzing..."
30838
+ )
30037
30839
  ] })
30038
30840
  ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center flex flex-col items-center", children: [
30039
30841
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-3xl font-bold text-primary mb-2 tracking-tight", children: "GIT ELECTRON" }),
@@ -30085,7 +30887,10 @@ Are you SURE you want to link "${repoName}" to this folder?`
30085
30887
  onClick: async () => {
30086
30888
  try {
30087
30889
  await window.api.acceptInvitation(inv.id);
30088
- showToast(`Invitation accepted for ${inv.repository.full_name}!`, "success");
30890
+ showToast(
30891
+ `Invitation accepted for ${inv.repository.full_name}!`,
30892
+ "success"
30893
+ );
30089
30894
  setShowInvitationsModal(false);
30090
30895
  setShowCollabActionModal({
30091
30896
  name: inv.repository.name,
@@ -30139,6 +30944,288 @@ Are you SURE you want to link "${repoName}" to this folder?`
30139
30944
  }
30140
30945
  )
30141
30946
  ] }) }),
30947
+ showPrivacyModal && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed inset-0 bg-black/80 backdrop-blur-md flex items-center justify-center z-50 p-4 md:p-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/98 backdrop-blur-2xl rounded-2xl shadow-2xl border border-border w-full max-w-4xl h-[720px] max-h-[92vh] flex flex-col overflow-hidden animate-float text-left", children: [
30948
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-8 py-5 border-b border-border shrink-0 flex items-center justify-between bg-surface", children: [
30949
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3.5", children: [
30950
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-10 h-10 rounded-xl bg-emerald-500/10 border border-emerald-500/25 flex items-center justify-center text-emerald-400", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30951
+ "path",
30952
+ {
30953
+ strokeLinecap: "round",
30954
+ strokeLinejoin: "round",
30955
+ strokeWidth: 2,
30956
+ d: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"
30957
+ }
30958
+ ) }) }),
30959
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
30960
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-bold text-primary leading-tight", children: "Privacy & Security Trust Center" }),
30961
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Enterprise Grade • Local-First Architecture • Zero Telemetry Guaranteed" })
30962
+ ] })
30963
+ ] }),
30964
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
30965
+ "button",
30966
+ {
30967
+ type: "button",
30968
+ onClick: () => setShowPrivacyModal(false),
30969
+ className: "w-8 h-8 rounded-lg text-secondary hover:text-primary hover:bg-surface-hover flex items-center justify-center transition-colors border border-transparent hover:border-border",
30970
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30971
+ "path",
30972
+ {
30973
+ strokeLinecap: "round",
30974
+ strokeLinejoin: "round",
30975
+ strokeWidth: 2,
30976
+ d: "M6 18L18 6M6 6l12 12"
30977
+ }
30978
+ ) })
30979
+ }
30980
+ )
30981
+ ] }),
30982
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-8 md:p-10 space-y-8 bg-surface/20", children: [
30983
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-5", children: [
30984
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-2", children: [
30985
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-8 h-8 rounded-lg bg-emerald-500/10 text-emerald-400 flex items-center justify-center mb-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30986
+ "path",
30987
+ {
30988
+ strokeLinecap: "round",
30989
+ strokeLinejoin: "round",
30990
+ strokeWidth: 2,
30991
+ d: "M5 13l4 4L19 7"
30992
+ }
30993
+ ) }) }),
30994
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-bold text-primary", children: "0.00% Telemetry" }),
30995
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Zero user analytics, tracking pixels, or diagnostic beacons collected or phoned home. None." })
30996
+ ] }),
30997
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-2", children: [
30998
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-8 h-8 rounded-lg bg-brand/10 text-brand flex items-center justify-center mb-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30999
+ "path",
31000
+ {
31001
+ strokeLinecap: "round",
31002
+ strokeLinejoin: "round",
31003
+ strokeWidth: 2,
31004
+ d: "M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
31005
+ }
31006
+ ) }) }),
31007
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-bold text-primary", children: "100% Local-First" }),
31008
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Repositories, commit logs, branches, and diffs never leave your local workstation file system." })
31009
+ ] }),
31010
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-2", children: [
31011
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-8 h-8 rounded-lg bg-accent/10 text-accent flex items-center justify-center mb-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
31012
+ "path",
31013
+ {
31014
+ strokeLinecap: "round",
31015
+ strokeLinejoin: "round",
31016
+ strokeWidth: 2,
31017
+ d: "M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"
31018
+ }
31019
+ ) }) }),
31020
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-bold text-primary", children: "OS Vault Security" }),
31021
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Tokens sealed with Windows DPAPI / macOS Keychain. Direct TLS 1.3 to official GitHub APIs." })
31022
+ ] })
31023
+ ] }),
31024
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-3", children: [
31025
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
31026
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2.5", children: [
31027
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-mono font-bold text-brand bg-brand/10 border border-brand/20 px-2 py-0.5 rounded", children: "SECTION 01" }),
31028
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-bold text-primary", children: "Local-First & Zero Telemetry Architecture" })
31029
+ ] }),
31030
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-semibold text-emerald-400 bg-emerald-500/10 px-2.5 py-1 rounded-full border border-emerald-500/20", children: "Zero Surveillance" })
31031
+ ] }),
31032
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "GitQuickPush operates exclusively on your local machine as an offline-first Git client. We run zero intermediary proxy servers, host zero analytics collectors, and track zero keystrokes or repo activities. Your source code and commit history remain 100% isolated inside your workstation's local filesystem." }),
31033
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2 pt-1", children: [
31034
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ No telemetry collection" }),
31035
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ No remote code replication" }),
31036
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Works in air-gapped environments" })
31037
+ ] })
31038
+ ] }),
31039
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-3", children: [
31040
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
31041
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2.5", children: [
31042
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-mono font-bold text-brand bg-brand/10 border border-brand/20 px-2 py-0.5 rounded", children: "SECTION 02" }),
31043
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-bold text-primary", children: "Hardware-Sealed OS Keystore & Token Isolation" })
31044
+ ] }),
31045
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-semibold text-accent bg-accent/10 px-2.5 py-1 rounded-full border border-accent/20", children: "DPAPI / Keychain" })
31046
+ ] }),
31047
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "GitHub OAuth tokens and sensitive configuration parameters are encrypted using Electron's native safeStorage API, backed directly by your operating system's cryptographic master vault (Windows DPAPI, macOS Keychain, or Linux SecretService). Network authentication requests connect strictly to official github.com API endpoints over TLS 1.3 with cryptographic certificate validation." }),
31048
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2 pt-1", children: [
31049
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ OS-level hardware encryption" }),
31050
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Direct TLS 1.3 to github.com" }),
31051
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Zero third-party relay servers" })
31052
+ ] })
31053
+ ] }),
31054
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-3", children: [
31055
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
31056
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2.5", children: [
31057
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-mono font-bold text-brand bg-brand/10 border border-brand/20 px-2 py-0.5 rounded", children: "SECTION 03" }),
31058
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-bold text-primary", children: "Ephemeral AI Assistance & Privacy Guarantees" })
31059
+ ] }),
31060
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-semibold text-primary/80 bg-canvas px-2.5 py-1 rounded-full border border-border", children: "In-Memory Only" })
31061
+ ] }),
31062
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "When utilizing automated AI commit message generation or conflict diagnosis, only the necessary git diff patch is transmitted via direct TLS connection to your designated AI endpoint (GitHub Models / Google Gemini API). Data packets are processed strictly in-memory ephemerally and are never retained on disk, logged to telemetry stores, or used to train external public foundation models." }),
31063
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2 pt-1", children: [
31064
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Ephemeral in-memory analysis" }),
31065
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Never used for AI model training" }),
31066
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Fully optional & user-controlled" })
31067
+ ] })
31068
+ ] }),
31069
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-3", children: [
31070
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
31071
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2.5", children: [
31072
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-mono font-bold text-brand bg-brand/10 border border-brand/20 px-2 py-0.5 rounded", children: "SECTION 04" }),
31073
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-bold text-primary", children: "Zero Surveillance Hardware Access" })
31074
+ ] }),
31075
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-semibold text-emerald-400 bg-emerald-500/10 px-2.5 py-1 rounded-full border border-emerald-500/20", children: "Strict Sandbox" })
31076
+ ] }),
31077
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "GitQuickPush maintains zero capabilities or permissions to access your camera, microphone, device location, system contacts, or external disk directories outside of designated Git workspace roots. All file system watchers operate strictly within the repository boundaries chosen by the user." }),
31078
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2 pt-1", children: [
31079
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Camera & microphone disabled" }),
31080
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Zero location tracking" }),
31081
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Scoped strictly to repository root" })
31082
+ ] })
31083
+ ] }),
31084
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-3", children: [
31085
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
31086
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2.5", children: [
31087
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-mono font-bold text-brand bg-brand/10 border border-brand/20 px-2 py-0.5 rounded", children: "SECTION 05" }),
31088
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-bold text-primary", children: "Institutional Compliance & Corporate Readiness" })
31089
+ ] }),
31090
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-semibold text-brand bg-brand/10 px-2.5 py-1 rounded-full border border-brand/20", children: "Enterprise Ready" })
31091
+ ] }),
31092
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Because no proprietary codebases, employee identities, or repository metrics are transmitted or centralized on remote cloud infrastructure, GitQuickPush is fully aligned with institutional data sovereignty, GDPR, and enterprise security auditing standards. Organizations may freely deploy the application in strict internal environments." }),
31093
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2 pt-1", children: [
31094
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ GDPR & institutional compliance" }),
31095
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ SOC 2 alignment" }),
31096
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Open architecture auditability" })
31097
+ ] })
31098
+ ] })
31099
+ ] }),
31100
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-8 py-4.5 border-t border-border shrink-0 flex items-center justify-between bg-surface", children: [
31101
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-secondary font-mono", children: "Document ID: GQP-PRIV-2026.1 • Local-First Architecture Compliance" }),
31102
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
31103
+ "button",
31104
+ {
31105
+ type: "button",
31106
+ onClick: () => setShowPrivacyModal(false),
31107
+ className: "px-7 py-2.5 bg-brand hover:bg-brand-hover text-white rounded-xl font-bold text-xs shadow-md shadow-brand/20 transition-all active:translate-y-0.5",
31108
+ children: "Close Trust Center"
31109
+ }
31110
+ )
31111
+ ] })
31112
+ ] }) }),
31113
+ showForcePushModal && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed inset-0 bg-black/80 backdrop-blur-md flex items-center justify-center z-50 p-4 md:p-6 transition-opacity", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/98 backdrop-blur-2xl rounded-2xl shadow-2xl border border-danger/40 w-full max-w-lg overflow-hidden animate-float text-left", children: [
31114
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-6 py-5 border-b border-border flex items-center justify-between bg-danger/5", children: [
31115
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
31116
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-10 h-10 rounded-xl bg-danger/10 border border-danger/25 flex items-center justify-center text-danger", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
31117
+ "path",
31118
+ {
31119
+ strokeLinecap: "round",
31120
+ strokeLinejoin: "round",
31121
+ strokeWidth: 2,
31122
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
31123
+ }
31124
+ ) }) }),
31125
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
31126
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-base font-bold text-primary leading-tight", children: "Confirm Force Push Override" }),
31127
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-danger/80 mt-0.5 font-medium", children: "Destructive Remote Branch Override" })
31128
+ ] })
31129
+ ] }),
31130
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
31131
+ "button",
31132
+ {
31133
+ type: "button",
31134
+ onClick: () => setShowForcePushModal(false),
31135
+ className: "w-8 h-8 rounded-lg text-secondary hover:text-primary hover:bg-surface-hover flex items-center justify-center transition-colors",
31136
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
31137
+ "path",
31138
+ {
31139
+ strokeLinecap: "round",
31140
+ strokeLinejoin: "round",
31141
+ strokeWidth: 2,
31142
+ d: "M6 18L18 6M6 6l12 12"
31143
+ }
31144
+ ) })
31145
+ }
31146
+ )
31147
+ ] }),
31148
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 space-y-4", children: [
31149
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-4 rounded-xl bg-danger/10 border border-danger/30 text-xs text-danger leading-relaxed", children: [
31150
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "font-bold text-sm mb-1 flex items-center gap-1.5", children: [
31151
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "⚠️" }),
31152
+ " Warning: Non-Fast-Forward Overwrite"
31153
+ ] }),
31154
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { children: [
31155
+ "Force pushing will forcefully rewrite the remote branch history to exactly mirror your local working tree. Any remote commits not present on your local workstation will be ",
31156
+ /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { className: "font-black underline", children: "permanently lost" }),
31157
+ "."
31158
+ ] })
31159
+ ] }),
31160
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-4 rounded-xl bg-canvas border border-border space-y-2.5 text-xs", children: [
31161
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center", children: [
31162
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-secondary font-medium", children: "Active Branch:" }),
31163
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono font-bold text-primary bg-surface px-2 py-0.5 rounded border border-border", children: status?.current || "main" })
31164
+ ] }),
31165
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center", children: [
31166
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-secondary font-medium", children: "Target Remote:" }),
31167
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono font-bold text-brand bg-brand/10 px-2 py-0.5 rounded border border-brand/20", children: "origin" })
31168
+ ] }),
31169
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center", children: [
31170
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-secondary font-medium", children: "Safety Check:" }),
31171
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-warning font-semibold", children: "Bypassing Divergence Guards" })
31172
+ ] })
31173
+ ] })
31174
+ ] }),
31175
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-6 py-4 border-t border-border bg-surface flex items-center justify-end gap-3", children: [
31176
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
31177
+ "button",
31178
+ {
31179
+ type: "button",
31180
+ disabled: isExecutingForcePush,
31181
+ onClick: () => setShowForcePushModal(false),
31182
+ className: "px-4 py-2 bg-canvas border border-border hover:bg-surface-hover text-secondary hover:text-primary rounded-xl text-xs font-semibold transition-all disabled:opacity-50",
31183
+ children: "Cancel"
31184
+ }
31185
+ ),
31186
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
31187
+ "button",
31188
+ {
31189
+ type: "button",
31190
+ disabled: isExecutingForcePush,
31191
+ onClick: handleExecuteForcePush,
31192
+ className: "px-5 py-2 bg-danger hover:bg-danger/80 text-white rounded-xl text-xs font-bold transition-all shadow-md shadow-danger/25 flex items-center gap-2 disabled:opacity-50",
31193
+ children: isExecutingForcePush ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
31194
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
31195
+ "svg",
31196
+ {
31197
+ className: "w-4 h-4 animate-spin",
31198
+ fill: "none",
31199
+ stroke: "currentColor",
31200
+ viewBox: "0 0 24 24",
31201
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
31202
+ "path",
31203
+ {
31204
+ strokeLinecap: "round",
31205
+ strokeLinejoin: "round",
31206
+ strokeWidth: 2,
31207
+ d: "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"
31208
+ }
31209
+ )
31210
+ }
31211
+ ),
31212
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Overwriting Remote..." })
31213
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
31214
+ /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
31215
+ "path",
31216
+ {
31217
+ strokeLinecap: "round",
31218
+ strokeLinejoin: "round",
31219
+ strokeWidth: 2,
31220
+ d: "M13 10V3L4 14h7v7l9-11h-7z"
31221
+ }
31222
+ ) }),
31223
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Force Push Branch" })
31224
+ ] })
31225
+ }
31226
+ )
31227
+ ] })
31228
+ ] }) }),
30142
31229
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed top-6 right-6 z-[300] flex flex-col gap-3 pointer-events-none", children: toasts.map((toast) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "animate-fade-in pointer-events-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
30143
31230
  "div",
30144
31231
  {