code-squad-cli 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/flip/routes/file.js +122 -34
- package/dist/flip/routes/files.js +29 -2
- package/dist/flip-ui/dist/assets/index-DTf1sRAX.css +1 -0
- package/dist/flip-ui/dist/assets/index-DmJdj9bX.js +154 -0
- package/dist/flip-ui/dist/index.html +2 -2
- package/dist/index.js +179 -56
- package/package.json +1 -1
- package/dist/flip-ui/dist/assets/index-BqoCRrTA.css +0 -1
- package/dist/flip-ui/dist/assets/index-CgNq-jV5.js +0 -69
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>Flip</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-DmJdj9bX.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DTf1sRAX.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
package/dist/index.js
CHANGED
|
@@ -433,9 +433,34 @@ var DEFAULT_IGNORES = [
|
|
|
433
433
|
"yarn.lock",
|
|
434
434
|
".DS_Store"
|
|
435
435
|
];
|
|
436
|
+
var VISIBLE_DOTFILES = /* @__PURE__ */ new Set([
|
|
437
|
+
".gitignore",
|
|
438
|
+
".gitattributes",
|
|
439
|
+
".env.example",
|
|
440
|
+
".env.local.example",
|
|
441
|
+
".eslintrc",
|
|
442
|
+
".eslintrc.js",
|
|
443
|
+
".eslintrc.cjs",
|
|
444
|
+
".eslintrc.json",
|
|
445
|
+
".eslintrc.yml",
|
|
446
|
+
".prettierrc",
|
|
447
|
+
".prettierrc.js",
|
|
448
|
+
".prettierrc.cjs",
|
|
449
|
+
".prettierrc.json",
|
|
450
|
+
".prettierrc.yml",
|
|
451
|
+
".editorconfig",
|
|
452
|
+
".npmrc",
|
|
453
|
+
".nvmrc",
|
|
454
|
+
".node-version",
|
|
455
|
+
".dockerignore",
|
|
456
|
+
".browserslistrc",
|
|
457
|
+
".babelrc",
|
|
458
|
+
".babelrc.js",
|
|
459
|
+
".babelrc.json"
|
|
460
|
+
]);
|
|
436
461
|
function shouldIgnore(name) {
|
|
437
|
-
if (name.startsWith(".")
|
|
438
|
-
return
|
|
462
|
+
if (name.startsWith(".")) {
|
|
463
|
+
return !VISIBLE_DOTFILES.has(name);
|
|
439
464
|
}
|
|
440
465
|
return DEFAULT_IGNORES.includes(name);
|
|
441
466
|
}
|
|
@@ -510,42 +535,126 @@ import { Router as Router2 } from "express";
|
|
|
510
535
|
import fs3 from "fs";
|
|
511
536
|
import path3 from "path";
|
|
512
537
|
var router2 = Router2();
|
|
538
|
+
var extensionMap = {
|
|
539
|
+
// JavaScript/TypeScript
|
|
540
|
+
js: "javascript",
|
|
541
|
+
mjs: "javascript",
|
|
542
|
+
cjs: "javascript",
|
|
543
|
+
ts: "typescript",
|
|
544
|
+
mts: "typescript",
|
|
545
|
+
cts: "typescript",
|
|
546
|
+
tsx: "tsx",
|
|
547
|
+
jsx: "jsx",
|
|
548
|
+
// Systems languages
|
|
549
|
+
rs: "rust",
|
|
550
|
+
go: "go",
|
|
551
|
+
c: "c",
|
|
552
|
+
cpp: "cpp",
|
|
553
|
+
cc: "cpp",
|
|
554
|
+
cxx: "cpp",
|
|
555
|
+
h: "cpp",
|
|
556
|
+
hpp: "cpp",
|
|
557
|
+
hxx: "cpp",
|
|
558
|
+
// JVM languages
|
|
559
|
+
java: "java",
|
|
560
|
+
kt: "kotlin",
|
|
561
|
+
kts: "kotlin",
|
|
562
|
+
scala: "scala",
|
|
563
|
+
groovy: "groovy",
|
|
564
|
+
// Scripting languages
|
|
565
|
+
py: "python",
|
|
566
|
+
rb: "ruby",
|
|
567
|
+
php: "php",
|
|
568
|
+
pl: "perl",
|
|
569
|
+
lua: "lua",
|
|
570
|
+
// Mobile
|
|
571
|
+
swift: "swift",
|
|
572
|
+
m: "objective-c",
|
|
573
|
+
mm: "objective-cpp",
|
|
574
|
+
dart: "dart",
|
|
575
|
+
// Web
|
|
576
|
+
html: "html",
|
|
577
|
+
htm: "html",
|
|
578
|
+
css: "css",
|
|
579
|
+
scss: "scss",
|
|
580
|
+
sass: "sass",
|
|
581
|
+
less: "less",
|
|
582
|
+
vue: "vue",
|
|
583
|
+
svelte: "svelte",
|
|
584
|
+
astro: "astro",
|
|
585
|
+
// Data formats
|
|
586
|
+
json: "json",
|
|
587
|
+
jsonc: "jsonc",
|
|
588
|
+
yaml: "yaml",
|
|
589
|
+
yml: "yaml",
|
|
590
|
+
toml: "toml",
|
|
591
|
+
xml: "xml",
|
|
592
|
+
csv: "csv",
|
|
593
|
+
// Documentation
|
|
594
|
+
md: "markdown",
|
|
595
|
+
mdx: "mdx",
|
|
596
|
+
rst: "rst",
|
|
597
|
+
tex: "latex",
|
|
598
|
+
// Shell
|
|
599
|
+
sh: "bash",
|
|
600
|
+
bash: "bash",
|
|
601
|
+
zsh: "bash",
|
|
602
|
+
fish: "fish",
|
|
603
|
+
ps1: "powershell",
|
|
604
|
+
bat: "batch",
|
|
605
|
+
cmd: "batch",
|
|
606
|
+
// Database
|
|
607
|
+
sql: "sql",
|
|
608
|
+
prisma: "prisma",
|
|
609
|
+
graphql: "graphql",
|
|
610
|
+
gql: "graphql",
|
|
611
|
+
// Config
|
|
612
|
+
ini: "ini",
|
|
613
|
+
conf: "ini",
|
|
614
|
+
cfg: "ini",
|
|
615
|
+
env: "dotenv",
|
|
616
|
+
// Other
|
|
617
|
+
dockerfile: "dockerfile",
|
|
618
|
+
makefile: "makefile",
|
|
619
|
+
cmake: "cmake",
|
|
620
|
+
diff: "diff",
|
|
621
|
+
patch: "diff"
|
|
622
|
+
};
|
|
623
|
+
var filenameMap = {
|
|
624
|
+
"Makefile": "makefile",
|
|
625
|
+
"makefile": "makefile",
|
|
626
|
+
"GNUmakefile": "makefile",
|
|
627
|
+
"Dockerfile": "dockerfile",
|
|
628
|
+
"dockerfile": "dockerfile",
|
|
629
|
+
"Containerfile": "dockerfile",
|
|
630
|
+
"Jenkinsfile": "groovy",
|
|
631
|
+
"Vagrantfile": "ruby",
|
|
632
|
+
"Gemfile": "ruby",
|
|
633
|
+
"Rakefile": "ruby",
|
|
634
|
+
"Brewfile": "ruby",
|
|
635
|
+
"Podfile": "ruby",
|
|
636
|
+
"Fastfile": "ruby",
|
|
637
|
+
"Guardfile": "ruby",
|
|
638
|
+
".gitignore": "gitignore",
|
|
639
|
+
".gitattributes": "gitattributes",
|
|
640
|
+
".editorconfig": "editorconfig",
|
|
641
|
+
".bashrc": "bash",
|
|
642
|
+
".zshrc": "bash",
|
|
643
|
+
".bash_profile": "bash",
|
|
644
|
+
".profile": "bash",
|
|
645
|
+
"CMakeLists.txt": "cmake",
|
|
646
|
+
"CODEOWNERS": "gitignore"
|
|
647
|
+
};
|
|
513
648
|
function detectLanguage(filePath) {
|
|
649
|
+
const basename2 = path3.basename(filePath);
|
|
650
|
+
if (filenameMap[basename2]) {
|
|
651
|
+
return filenameMap[basename2];
|
|
652
|
+
}
|
|
514
653
|
const ext = path3.extname(filePath).slice(1).toLowerCase();
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
tsx: "tsx",
|
|
520
|
-
jsx: "jsx",
|
|
521
|
-
py: "python",
|
|
522
|
-
go: "go",
|
|
523
|
-
java: "java",
|
|
524
|
-
c: "c",
|
|
525
|
-
cpp: "cpp",
|
|
526
|
-
cc: "cpp",
|
|
527
|
-
cxx: "cpp",
|
|
528
|
-
h: "cpp",
|
|
529
|
-
hpp: "cpp",
|
|
530
|
-
md: "markdown",
|
|
531
|
-
json: "json",
|
|
532
|
-
yaml: "yaml",
|
|
533
|
-
yml: "yaml",
|
|
534
|
-
toml: "toml",
|
|
535
|
-
html: "html",
|
|
536
|
-
css: "css",
|
|
537
|
-
scss: "scss",
|
|
538
|
-
sh: "bash",
|
|
539
|
-
bash: "bash",
|
|
540
|
-
sql: "sql",
|
|
541
|
-
rb: "ruby",
|
|
542
|
-
swift: "swift",
|
|
543
|
-
kt: "kotlin",
|
|
544
|
-
kts: "kotlin",
|
|
545
|
-
xml: "xml",
|
|
546
|
-
vue: "vue"
|
|
547
|
-
};
|
|
548
|
-
return languageMap[ext] || "plaintext";
|
|
654
|
+
if (extensionMap[ext]) {
|
|
655
|
+
return extensionMap[ext];
|
|
656
|
+
}
|
|
657
|
+
return "text";
|
|
549
658
|
}
|
|
550
659
|
router2.get("/", (req, res) => {
|
|
551
660
|
const state = req.app.locals.state;
|
|
@@ -1488,6 +1597,37 @@ async function writeCdFile(targetPath) {
|
|
|
1488
1597
|
await fs10.promises.writeFile(cdFile, targetPath);
|
|
1489
1598
|
}
|
|
1490
1599
|
}
|
|
1600
|
+
async function cdInCurrentTerminal(targetPath) {
|
|
1601
|
+
const { exec: exec2 } = await import("child_process");
|
|
1602
|
+
const escapedPath = targetPath.replace(/'/g, "'\\''");
|
|
1603
|
+
const hasIterm = await new Promise((resolve2) => {
|
|
1604
|
+
exec2('mdfind "kMDItemCFBundleIdentifier == com.googlecode.iterm2"', (error, stdout) => {
|
|
1605
|
+
resolve2(!error && stdout.trim().length > 0);
|
|
1606
|
+
});
|
|
1607
|
+
});
|
|
1608
|
+
if (hasIterm) {
|
|
1609
|
+
const script = `
|
|
1610
|
+
tell application "iTerm2"
|
|
1611
|
+
tell current session of current window
|
|
1612
|
+
write text "cd '${escapedPath}'"
|
|
1613
|
+
end tell
|
|
1614
|
+
end tell`;
|
|
1615
|
+
return new Promise((resolve2) => {
|
|
1616
|
+
exec2(`osascript -e '${script}'`, (error) => {
|
|
1617
|
+
resolve2(!error);
|
|
1618
|
+
});
|
|
1619
|
+
});
|
|
1620
|
+
}
|
|
1621
|
+
const terminalScript = `
|
|
1622
|
+
tell application "Terminal"
|
|
1623
|
+
do script "cd '${escapedPath}'" in front window
|
|
1624
|
+
end tell`;
|
|
1625
|
+
return new Promise((resolve2) => {
|
|
1626
|
+
exec2(`osascript -e '${terminalScript}'`, (error) => {
|
|
1627
|
+
resolve2(!error);
|
|
1628
|
+
});
|
|
1629
|
+
});
|
|
1630
|
+
}
|
|
1491
1631
|
async function openNewTerminal(targetPath) {
|
|
1492
1632
|
const { exec: exec2 } = await import("child_process");
|
|
1493
1633
|
const escapedPath = targetPath.replace(/'/g, "'\\''");
|
|
@@ -1508,12 +1648,7 @@ tell application "iTerm2"
|
|
|
1508
1648
|
end tell`;
|
|
1509
1649
|
return new Promise((resolve2) => {
|
|
1510
1650
|
exec2(`osascript -e '${script}'`, (error) => {
|
|
1511
|
-
|
|
1512
|
-
console.error(chalk2.red("Failed to open iTerm2 split pane"));
|
|
1513
|
-
resolve2(false);
|
|
1514
|
-
} else {
|
|
1515
|
-
resolve2(true);
|
|
1516
|
-
}
|
|
1651
|
+
resolve2(!error);
|
|
1517
1652
|
});
|
|
1518
1653
|
});
|
|
1519
1654
|
}
|
|
@@ -1524,26 +1659,14 @@ tell application "Terminal"
|
|
|
1524
1659
|
end tell`;
|
|
1525
1660
|
return new Promise((resolve2) => {
|
|
1526
1661
|
exec2(`osascript -e '${terminalScript}'`, (error) => {
|
|
1527
|
-
|
|
1528
|
-
console.error(chalk2.red("Failed to open Terminal"));
|
|
1529
|
-
resolve2(false);
|
|
1530
|
-
} else {
|
|
1531
|
-
resolve2(true);
|
|
1532
|
-
}
|
|
1662
|
+
resolve2(!error);
|
|
1533
1663
|
});
|
|
1534
1664
|
});
|
|
1535
1665
|
}
|
|
1536
1666
|
async function interactiveMode(workspaceRoot) {
|
|
1537
1667
|
const result = await runInteraction(workspaceRoot);
|
|
1538
1668
|
if (result?.cdPath) {
|
|
1539
|
-
|
|
1540
|
-
console.log(result.cdPath);
|
|
1541
|
-
} else {
|
|
1542
|
-
console.log(chalk2.dim("\nRun this to switch:"));
|
|
1543
|
-
console.log(chalk2.cyan(` cd "${result.cdPath}"`));
|
|
1544
|
-
console.log(chalk2.dim("\nTip: Add to ~/.zshrc for auto-cd:"));
|
|
1545
|
-
console.log(chalk2.dim(' eval "$(csq --init)"'));
|
|
1546
|
-
}
|
|
1669
|
+
await cdInCurrentTerminal(result.cdPath);
|
|
1547
1670
|
}
|
|
1548
1671
|
}
|
|
1549
1672
|
async function persistentInteractiveMode(workspaceRoot) {
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
*{box-sizing:border-box;margin:0;padding:0}:root{--bg-primary: #0d1117;--bg-secondary: #161b22;--bg-tertiary: #21262d;--bg-hover: #30363d;--bg-selected: #1f6feb26;--text-primary: #e6edf3;--text-secondary: #8b949e;--text-muted: #6e7681;--border-color: #30363d;--border-subtle: #21262d;--accent-primary: #238636;--accent-primary-hover: #2ea043;--accent-secondary: #1f6feb;--git-modified: #d29922;--git-untracked: #3fb950;--git-deleted: #f85149;--git-added: #3fb950;--line-number-color: #6e7681;--selection-bg: #264f78;--diff-add-bg: rgba(46, 160, 67, .15);--diff-add-text: #7ee787;--diff-add-border: rgba(46, 160, 67, .4);--diff-delete-bg: rgba(248, 81, 73, .15);--diff-delete-text: #ffa198;--diff-delete-border: rgba(248, 81, 73, .4);--diff-hunk-bg: rgba(56, 139, 253, .1);--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;--font-mono: "SF Mono", "Menlo", "Monaco", "Consolas", monospace;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 24px;--transition-fast: .15s ease;--transition-normal: .2s ease}body{font-family:var(--font-sans);font-size:14px;background-color:var(--bg-primary);color:var(--text-primary);height:100vh;overflow:hidden}#root{height:100%}.app{display:flex;flex-direction:column;height:100%}.main-content{display:flex;flex:1;overflow:hidden}.toolbar{display:flex;align-items:center;justify-content:space-between;height:40px;padding:0 var(--space-3);background-color:var(--bg-secondary);border-bottom:1px solid var(--border-subtle)}.toolbar-left,.toolbar-center,.toolbar-right{display:flex;align-items:center;gap:var(--space-2)}.toolbar-btn{display:flex;align-items:center;justify-content:center;gap:var(--space-1);height:28px;padding:0 var(--space-2);border:none;background:transparent;border-radius:6px;color:var(--text-secondary);cursor:pointer;transition:all var(--transition-fast)}.toolbar-btn:hover{background-color:var(--bg-hover);color:var(--text-primary)}.toolbar-btn.active{background-color:var(--bg-tertiary);color:var(--text-primary)}.toolbar-btn svg{flex-shrink:0}.diff-toggle{min-width:100px}.diff-mode-label{font-size:12px}.sidebar{width:280px;background-color:var(--bg-secondary);border-right:1px solid var(--border-subtle);overflow:hidden;display:flex;flex-direction:column;transition:width var(--transition-normal),opacity var(--transition-fast)}.sidebar.collapsed{width:0;opacity:0;border-right:none}.content{flex:1;overflow:hidden;display:flex;flex-direction:column;min-width:0}.staging-panel{width:320px;background-color:var(--bg-secondary);border-left:1px solid var(--border-subtle);overflow:hidden;display:flex;flex-direction:column;transition:width var(--transition-normal),opacity var(--transition-fast)}.staging-panel.collapsed{width:0;opacity:0;border-left:none}.footer{display:flex;align-items:center;justify-content:space-between;padding:var(--space-2) var(--space-4);background-color:var(--bg-secondary);border-top:1px solid var(--border-subtle);gap:var(--space-4)}.footer-actions{display:flex;gap:var(--space-2)}.file-tree{display:flex;flex-direction:column;height:100%}.file-tree-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-3) var(--space-4);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--text-secondary);border-bottom:1px solid var(--border-subtle)}.file-tree-header-actions{display:flex;gap:var(--space-1)}.filter-btn{display:flex;align-items:center;gap:var(--space-1);padding:2px 8px;border:none;background:transparent;border-radius:4px;color:var(--text-muted);font-size:10px;font-weight:600;cursor:pointer;transition:all var(--transition-fast)}.filter-btn:hover{background-color:var(--bg-hover);color:var(--text-secondary)}.filter-btn.active{background-color:var(--accent-secondary);color:#fff}.filter-btn .count{background-color:var(--bg-hover);padding:0 4px;border-radius:3px;font-size:9px}.filter-btn.active .count{background-color:#fff3}.file-tree-content{flex:1;overflow-y:auto;padding:var(--space-1) 0}.tree-item{display:flex;align-items:center;padding:var(--space-1) var(--space-2);cursor:pointer;-webkit-user-select:none;user-select:none;gap:6px}.tree-item:hover{background-color:var(--bg-hover)}.tree-icon{font-size:10px;width:14px;text-align:center;color:var(--text-secondary)}.tree-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.git-badge{font-size:10px;font-weight:600;padding:1px 4px;border-radius:3px}.git-badge-modified{color:var(--git-modified);background-color:#d2992226}.git-badge-untracked{color:var(--git-untracked);background-color:#3fb95026}.git-badge-deleted{color:var(--git-deleted);background-color:#f8514926}.git-badge-added{color:var(--git-added);background-color:#3fb95026}.code-viewer{display:flex;flex-direction:column;height:100%;overflow:hidden}.code-viewer-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--text-secondary);gap:var(--space-2)}.code-viewer-empty .hint{font-size:12px;color:var(--text-muted)}.code-viewer-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-2) var(--space-4);background-color:var(--bg-secondary);border-bottom:1px solid var(--border-subtle)}.file-path{font-size:13px;font-family:var(--font-mono)}.file-language{font-size:11px;color:var(--text-secondary);text-transform:uppercase}.code-viewer-content{flex:1;overflow:auto;font-family:var(--font-mono);font-size:13px;line-height:1.5}.code-line{display:flex;min-height:20px;cursor:pointer}.code-line:hover{background-color:var(--bg-hover)}.code-line-selected{background-color:var(--selection-bg)!important}.code-line-added{background-color:var(--diff-add-bg)!important}.code-line-added:hover{background-color:#2ea04340!important}.code-line-deleted{background-color:var(--diff-delete-bg)!important}.code-line-deleted:hover{background-color:#f8514940!important}.line-number{display:inline-block;min-width:50px;padding:0 var(--space-3);text-align:right;color:var(--line-number-color);-webkit-user-select:none;user-select:none;background-color:var(--bg-tertiary);border-right:1px solid var(--border-subtle)}.code-line code{flex:1;padding:0 var(--space-3);white-space:pre;background:transparent}.code-line code.hljs{background:transparent;padding:0 var(--space-3)}.code-content{flex:1;padding:0 var(--space-3);white-space:pre}.staging-list{display:flex;flex-direction:column;height:100%}.staging-list-empty{padding:var(--space-4)}.staging-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-3) var(--space-4);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--text-secondary);border-bottom:1px solid var(--border-subtle)}.staging-hint{font-size:12px;color:var(--text-muted);line-height:1.5}.staging-items{flex:1;overflow-y:auto;padding:var(--space-2)}.staging-item{background-color:var(--bg-tertiary);border-radius:6px;padding:var(--space-2) var(--space-3);margin-bottom:var(--space-2)}.staging-item-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-1)}.staging-location{font-family:var(--font-mono);font-size:12px;color:var(--text-secondary)}.staging-comment{font-size:13px;line-height:1.4}.comment-input{display:flex;align-items:center;gap:var(--space-3);flex:1}.comment-selection{font-family:var(--font-mono);font-size:12px;color:var(--accent-secondary);white-space:nowrap}.comment-field{flex:1;padding:var(--space-2) var(--space-3);background-color:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;color:var(--text-primary);font-size:14px;transition:border-color var(--transition-fast)}.comment-field:focus{outline:none;border-color:var(--accent-secondary)}.comment-hint{color:var(--text-muted);font-size:13px}.fuzzy-finder-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#0009;display:flex;justify-content:center;padding-top:80px;z-index:100}.fuzzy-finder{background-color:var(--bg-secondary);border:1px solid var(--border-color);border-radius:12px;box-shadow:0 16px 48px #00000080;width:600px;max-height:400px;display:flex;flex-direction:column;overflow:hidden}.fuzzy-finder-input{padding:var(--space-4);background-color:var(--bg-tertiary);border:none;border-bottom:1px solid var(--border-subtle);color:var(--text-primary);font-size:16px}.fuzzy-finder-input:focus{outline:none}.fuzzy-finder-results{flex:1;overflow-y:auto}.fuzzy-finder-item{padding:var(--space-3) var(--space-4);cursor:pointer;font-family:var(--font-mono);font-size:13px}.fuzzy-finder-item:hover,.fuzzy-finder-item-selected{background-color:var(--bg-selected)}.fuzzy-finder-empty{padding:var(--space-4);color:var(--text-muted);text-align:center}.btn{padding:var(--space-2) var(--space-4);border:none;border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;transition:background-color var(--transition-fast)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background-color:var(--accent-primary);color:#fff}.btn-primary:hover:not(:disabled){background-color:var(--accent-primary-hover)}.btn-secondary{background-color:var(--bg-tertiary);color:var(--text-primary)}.btn-secondary:hover:not(:disabled){background-color:var(--bg-hover)}.btn-small{padding:var(--space-1) var(--space-3)}.btn-link{background:none;border:none;color:var(--accent-secondary);cursor:pointer;font-size:11px}.btn-link:hover{text-decoration:underline}.btn-icon{background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:14px;padding:2px 6px}.btn-icon:hover{color:var(--text-primary)}.diff-side-by-side{display:flex;height:100%;overflow:hidden}.diff-pane{flex:1;overflow:auto;font-family:var(--font-mono);font-size:13px;line-height:1.5}.diff-pane-left{border-right:1px solid var(--border-color)}.diff-pane-header{padding:var(--space-2) var(--space-3);background-color:var(--bg-tertiary);border-bottom:1px solid var(--border-subtle);font-size:11px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.5px}.code-viewer-loading{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text-muted)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--bg-hover);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#484f58}::-webkit-scrollbar-corner{background:transparent}
|