@moritzwilksch/diffle 0.0.2 → 0.1.1

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.
Files changed (102) hide show
  1. package/README.md +133 -104
  2. package/dist/client/assets/{angular-html-CaJwV7TV.js → angular-html-CkdWwNDI.js} +1 -1
  3. package/dist/client/assets/{angular-ts-CkYaPIdV.js → angular-ts-CuvP0IGu.js} +1 -1
  4. package/dist/client/assets/{apl-CpcAFeKm.js → apl-pdW-dc02.js} +1 -1
  5. package/dist/client/assets/{astro-CW_unGoj.js → astro-zkH-hPtA.js} +1 -1
  6. package/dist/client/assets/{blade-CoMjczKU.js → blade-ddlHE2HC.js} +1 -1
  7. package/dist/client/assets/{c-Dl4Fx4zB.js → c-Ctj6WiaA.js} +1 -1
  8. package/dist/client/assets/{chapel-D5ok9_yq.js → chapel-W7vmpmYc.js} +1 -1
  9. package/dist/client/assets/{cobol-4i0HDNWU.js → cobol-DhORiGLX.js} +1 -1
  10. package/dist/client/assets/{coffee-BTpFkfue.js → coffee-CmpKakZz.js} +1 -1
  11. package/dist/client/assets/{cpp-Cfde_XNA.js → cpp-aSK51Qyo.js} +1 -1
  12. package/dist/client/assets/{crystal-Bg0pobHe.js → crystal-CGGaMVqP.js} +1 -1
  13. package/dist/client/assets/{css-DwVSVpMu.js → css-CbDWH8CU.js} +1 -1
  14. package/dist/client/assets/{edge-B1WmoAyP.js → edge-Bb_E62jX.js} +1 -1
  15. package/dist/client/assets/{elixir-DNd2HrCi.js → elixir-DjPlIKeD.js} +1 -1
  16. package/dist/client/assets/{elm-D0koIXHj.js → elm-B55oXPOF.js} +1 -1
  17. package/dist/client/assets/{erb-GqOwqr8c.js → erb-CXXpq1zV.js} +1 -1
  18. package/dist/client/assets/{git-rebase-BUtA34Bl.js → git-rebase-7PMXuU9B.js} +1 -1
  19. package/dist/client/assets/{glimmer-js-CoUMy8hy.js → glimmer-js-BBBBNj8H.js} +1 -1
  20. package/dist/client/assets/{glimmer-ts-DsF-4AvK.js → glimmer-ts-BJzb0Uby.js} +1 -1
  21. package/dist/client/assets/{glsl-AH2DoCfz.js → glsl-CBzawuyB.js} +1 -1
  22. package/dist/client/assets/{graphql-DT8jP-fK.js → graphql-DRKcwjOE.js} +1 -1
  23. package/dist/client/assets/{hack-_XiyStr7.js → hack-CsFE62pw.js} +1 -1
  24. package/dist/client/assets/{haml-hGrPpL3t.js → haml--KtktDGY.js} +1 -1
  25. package/dist/client/assets/{handlebars-ajgEXHEi.js → handlebars-D56IR41J.js} +1 -1
  26. package/dist/client/assets/{html-CiMg0XLL.js → html-Baytl-FU.js} +1 -1
  27. package/dist/client/assets/{html-derivative-2sDnFJyw.js → html-derivative-Cu0xLfuG.js} +1 -1
  28. package/dist/client/assets/{http-8RU82qzQ.js → http-DBz-9Rm1.js} +1 -1
  29. package/dist/client/assets/{hurl-B8rylzKw.js → hurl-CTnFLYIC.js} +1 -1
  30. package/dist/client/assets/index-BcpNE2iR.js +2924 -0
  31. package/dist/client/assets/index-CBL0EMlj.css +2 -0
  32. package/dist/client/assets/{java-DnSZzOMQ.js → java-Dno3m1M7.js} +1 -1
  33. package/dist/client/assets/{javascript-BmM_EjC_.js → javascript-_XI5Q4LF.js} +1 -1
  34. package/dist/client/assets/{jinja-BWkqqyaH.js → jinja-CjeRdbbL.js} +1 -1
  35. package/dist/client/assets/{jison-Ch4kKU1r.js → jison-C3ET6HHP.js} +1 -1
  36. package/dist/client/assets/{json-DQzba6hv.js → json-BEsHf2su.js} +1 -1
  37. package/dist/client/assets/{jsx-C2RFZfSq.js → jsx-C3QpkgV8.js} +1 -1
  38. package/dist/client/assets/{julia-DfG3dbpn.js → julia-BtHfH46Z.js} +1 -1
  39. package/dist/client/assets/{just-BdzcwoJ_.js → just-DRu-Pg-e.js} +1 -1
  40. package/dist/client/assets/{latex-CDOrdOrS.js → latex-1BoN898Q.js} +1 -1
  41. package/dist/client/assets/{liquid-seYOlojK.js → liquid-CL6XoFA-.js} +1 -1
  42. package/dist/client/assets/{lua-BLXud7HC.js → lua-ClGqXLNh.js} +1 -1
  43. package/dist/client/assets/{marko-CDlW9Noh.js → marko-BQZ0rvkW.js} +1 -1
  44. package/dist/client/assets/{mdc-ByNngFMV.js → mdc-CqTpgJx6.js} +1 -1
  45. package/dist/client/assets/{nginx-UGj-HCuj.js → nginx-B3fPtzbP.js} +1 -1
  46. package/dist/client/assets/{nim-WGnz_L4S.js → nim-CcgLIp3n.js} +1 -1
  47. package/dist/client/assets/{org--Q56RzaV.js → org-5bpEDggi.js} +1 -1
  48. package/dist/client/assets/{perl-C1sy1pky.js → perl-B_kewDRb.js} +1 -1
  49. package/dist/client/assets/{php-XGcgOFlk.js → php-DCeoSILL.js} +1 -1
  50. package/dist/client/assets/{pug-B3wKWID3.js → pug-Dojg3vEi.js} +1 -1
  51. package/dist/client/assets/{qml-CxS5ImlR.js → qml-s5uziDLI.js} +1 -1
  52. package/dist/client/assets/{r-CqHff9Km.js → r-C9fV-mBh.js} +1 -1
  53. package/dist/client/assets/{razor-SIaUNZij.js → razor-BTysEkha.js} +1 -1
  54. package/dist/client/assets/{regexp-UJ41rKpv.js → regexp-CsIP6diF.js} +1 -1
  55. package/dist/client/assets/{rst-QZZ7aawZ.js → rst-8a-JD2vB.js} +1 -1
  56. package/dist/client/assets/{ruby-B47xuou3.js → ruby-BP-9Eb2k.js} +1 -1
  57. package/dist/client/assets/{sas-Cmj7-80_.js → sas-zIaAmRUD.js} +1 -1
  58. package/dist/client/assets/{scss-BSIEbXjd.js → scss-D_zCS4rR.js} +1 -1
  59. package/dist/client/assets/{shellscript-Nto8YpA8.js → shellscript-DRVCBED5.js} +1 -1
  60. package/dist/client/assets/{shellsession-B6ppX96l.js → shellsession-B6vXqKcQ.js} +1 -1
  61. package/dist/client/assets/{soy-DMVBQAtG.js → soy-CnSSPgTt.js} +1 -1
  62. package/dist/client/assets/{sql-CVjp9fSb.js → sql-DNUVNZl5.js} +1 -1
  63. package/dist/client/assets/{stata-CUjSwXlo.js → stata-BTM4COU8.js} +1 -1
  64. package/dist/client/assets/{surrealql-DF8HYwAL.js → surrealql-D0RpP-tU.js} +1 -1
  65. package/dist/client/assets/{svelte-PhHrTfEY.js → svelte-Bgjr5_uo.js} +1 -1
  66. package/dist/client/assets/syntax.worker-BRjdyEIk.js +1 -0
  67. package/dist/client/assets/{templ-fZg_2sYU.js → templ-j4HlTKjQ.js} +1 -1
  68. package/dist/client/assets/{tex-Cz9rkka_.js → tex-Da2hGdgf.js} +1 -1
  69. package/dist/client/assets/tree-sitter-CvweAhHD.js +3980 -0
  70. package/dist/client/assets/tree-sitter-bash-F8rv_Zup.wasm +0 -0
  71. package/dist/client/assets/tree-sitter-c-DdltZG6c.wasm +0 -0
  72. package/dist/client/assets/tree-sitter-cpp-ChzgvAuy.wasm +0 -0
  73. package/dist/client/assets/tree-sitter-go-U2rTaih5.wasm +0 -0
  74. package/dist/client/assets/tree-sitter-java-Ba52ZMdq.wasm +0 -0
  75. package/dist/client/assets/tree-sitter-javascript-CgNCF_LE.wasm +0 -0
  76. package/dist/client/assets/tree-sitter-lua-BgmWez5o.wasm +0 -0
  77. package/dist/client/assets/tree-sitter-ocaml-DkwTEocs.wasm +0 -0
  78. package/dist/client/assets/tree-sitter-php-BQJOnNE4.wasm +0 -0
  79. package/dist/client/assets/tree-sitter-python-cGXEcG0A.wasm +0 -0
  80. package/dist/client/assets/tree-sitter-qKYAACSa.wasm +0 -0
  81. package/dist/client/assets/tree-sitter-ruby-C_gqAxYM.wasm +0 -0
  82. package/dist/client/assets/tree-sitter-rust-BKz9L6EP.wasm +0 -0
  83. package/dist/client/assets/tree-sitter-swift-DL346Du8.wasm +0 -0
  84. package/dist/client/assets/tree-sitter-tsx-P8oI32W_.wasm +0 -0
  85. package/dist/client/assets/tree-sitter-typescript-CJTR_Zg_.wasm +0 -0
  86. package/dist/client/assets/tree-sitter-zig-B2CxqjXH.wasm +0 -0
  87. package/dist/client/assets/{ts-tags-ClWx436c.js → ts-tags-DHDgIe3m.js} +1 -1
  88. package/dist/client/assets/{tsx-BvPjtPa1.js → tsx-BiQG1bF2.js} +1 -1
  89. package/dist/client/assets/{twig-Bd-BKVyq.js → twig-nmyN70HH.js} +1 -1
  90. package/dist/client/assets/{typescript-DsLRoAB6.js → typescript-B2CoeRXG.js} +1 -1
  91. package/dist/client/assets/{typst-CY0jyT_P.js → typst-DYnFmsYK.js} +1 -1
  92. package/dist/client/assets/{vue-BC9HKHTS.js → vue-D4W-_FLh.js} +1 -1
  93. package/dist/client/assets/{vue-html-DarBRaBw.js → vue-html-JguYDiPp.js} +1 -1
  94. package/dist/client/assets/{vue-vine-BR1aGRml.js → vue-vine-EdQ0itvY.js} +1 -1
  95. package/dist/client/assets/{xml-CbCqHKdP.js → xml-C6OfKyfM.js} +1 -1
  96. package/dist/client/assets/{xsl-BIgBy6YO.js → xsl-C_NW51H4.js} +1 -1
  97. package/dist/client/assets/{yaml-BgwEqXNj.js → yaml-DExcc3cX.js} +1 -1
  98. package/dist/client/index.html +2 -2
  99. package/dist/server/main.js +7194 -5382
  100. package/package.json +29 -16
  101. package/dist/client/assets/index-D3lOJlto.css +0 -1
  102. package/dist/client/assets/index-D98vufWy.js +0 -2896
package/package.json CHANGED
@@ -1,25 +1,24 @@
1
1
  {
2
2
  "name": "@moritzwilksch/diffle",
3
- "version": "0.0.2",
3
+ "version": "0.1.1",
4
4
  "description": "Local git diff reviewer in the browser with line comments exported as agent prompts",
5
+ "keywords": [
6
+ "agent",
7
+ "cli",
8
+ "code-review",
9
+ "diff",
10
+ "git"
11
+ ],
12
+ "homepage": "https://github.com/moritzwilksch/diffle#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/moritzwilksch/diffle/issues"
15
+ },
5
16
  "license": "Apache-2.0",
6
17
  "author": "Moritz Wilksch",
7
18
  "repository": {
8
19
  "type": "git",
9
20
  "url": "git+https://github.com/moritzwilksch/diffle.git"
10
21
  },
11
- "homepage": "https://github.com/moritzwilksch/diffle#readme",
12
- "bugs": {
13
- "url": "https://github.com/moritzwilksch/diffle/issues"
14
- },
15
- "keywords": [
16
- "git",
17
- "diff",
18
- "code-review",
19
- "agent",
20
- "cli"
21
- ],
22
- "type": "module",
23
22
  "bin": {
24
23
  "diffle": "dist/server/main.js"
25
24
  },
@@ -27,18 +26,19 @@
27
26
  "bin",
28
27
  "dist"
29
28
  ],
29
+ "type": "module",
30
30
  "publishConfig": {
31
31
  "access": "public"
32
32
  },
33
- "engines": {
34
- "node": ">=24"
35
- },
36
33
  "scripts": {
37
34
  "dev": "tsx src/cli/main.ts",
38
35
  "build": "npm run build:client && npm run build:server",
39
36
  "build:client": "vite build",
40
37
  "build:server": "tsdown",
41
38
  "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.client.json --noEmit",
39
+ "lint": "oxlint",
40
+ "format": "oxfmt",
41
+ "format:check": "oxfmt --check",
42
42
  "test": "vitest run",
43
43
  "prepack": "npm run build"
44
44
  },
@@ -48,6 +48,7 @@
48
48
  "@pierre/trees": "1.0.0-beta.6",
49
49
  "chokidar": "^5.0.0",
50
50
  "commander": "^15.0.0",
51
+ "commander-static-completion": "^0.0.1",
51
52
  "hono": "^4.13.5",
52
53
  "lucide-react": "^1.39.0",
53
54
  "picomatch": "^4.0.7",
@@ -55,21 +56,33 @@
55
56
  "react-dom": "^19.2.8",
56
57
  "react-markdown": "^10.1.0",
57
58
  "remark-gfm": "^4.0.1",
59
+ "tailwind-merge": "^3.6.0",
60
+ "web-tree-sitter": "^0.25.10",
58
61
  "ws": "^8.21.3",
59
62
  "zustand": "^5.0.15"
60
63
  },
61
64
  "devDependencies": {
65
+ "@tailwindcss/vite": "^4.3.3",
66
+ "@tree-sitter-grammars/tree-sitter-lua": "^0.4.1",
62
67
  "@types/node": "^22",
63
68
  "@types/picomatch": "^4.0.3",
64
69
  "@types/react": "^19",
65
70
  "@types/react-dom": "^19",
66
71
  "@types/ws": "^8",
67
72
  "@vitejs/plugin-react": "^5",
73
+ "eslint-plugin-better-tailwindcss": "^4.7.0",
68
74
  "jsdom": "^30.0.1",
75
+ "oxfmt": "^0.67.0",
76
+ "oxlint": "^1.82.0",
77
+ "tailwindcss": "^4.3.3",
78
+ "tree-sitter-wasms": "^0.1.13",
69
79
  "tsdown": "^0.22.14",
70
80
  "tsx": "^4",
71
81
  "typescript": "^5.9",
72
82
  "vite": "^8.2.2",
73
83
  "vitest": "^4"
84
+ },
85
+ "engines": {
86
+ "node": ">=24"
74
87
  }
75
88
  }
@@ -1 +0,0 @@
1
- :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--bg:#fff;--bg-2:#f6f8fa;--bg-3:#e6eaef;--fg:#1f2328;--fg-2:#4c5560;--border:#d0d7de;--accent:#0969da;--accent-fg:#fff;--danger:#cf222e;--warn:#9a6700;--add:#1a7f37;--del:#cf222e;--kind-type:#8250df;--kind-callable:#0969da;--kind-value:#9a6700;--search-match:#fff1a8;--search-current:#f2b705;--search-current-fg:#1f2328;--bg-card:#fff;--shadow-card:0 1px 2px #1f232814, 0 .1875rem .625rem #1f23281a;--mono:ui-monospace, "JetBrains Mono", "SF Mono", Menlo, Consolas, monospace;--sans:system-ui, -apple-system, "Segoe UI", Roboto, sans-serif}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}:root:not([data-theme=light]){--bg:#050505;--bg-2:#050505;--bg-3:#25282f;--fg:#e6e8eb;--fg-2:#a6acb5;--border:#262a30;--accent:#61afef;--accent-fg:#050505;--danger:#ef6b73;--warn:#e5c07b;--add:#98c379;--del:#ef6b73;--kind-type:#d55fde;--kind-callable:#61afef;--kind-value:#f19640;--search-match:#5a4a06;--search-current:#e5c07b;--search-current-fg:#050505;--bg-card:#12151a;--shadow-card:0 1px 2px #00000080, 0 .1875rem .625rem #0009}}:root[data-theme=dark]{--bg:#050505;--bg-2:#050505;--bg-3:#25282f;--fg:#e6e8eb;--fg-2:#a6acb5;--border:#262a30;--accent:#61afef;--accent-fg:#050505;--danger:#ef6b73;--warn:#e5c07b;--add:#98c379;--del:#ef6b73;--kind-type:#d55fde;--kind-callable:#61afef;--kind-value:#f19640;--search-match:#5a4a06;--search-current:#e5c07b;--search-current-fg:#050505;--bg-card:#12151a;--shadow-card:0 1px 2px #00000080, 0 .1875rem .625rem #0009}:root[data-theme=dark] file-tree-container{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}:root[data-theme=light] file-tree-container{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) file-tree-container{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}*{box-sizing:border-box}html{font-size:90%}html,body,#root{height:100%;margin:0}body{font:.8125rem/1.4 var(--sans);color:var(--fg);background:var(--bg)}button,input,select,textarea{font:inherit;color:inherit}button{cursor:pointer;background:var(--bg-2);border:1px solid var(--border);border-radius:.375rem;align-items:center;gap:.3125rem;padding:.1875rem .5625rem;line-height:1.2;display:inline-flex}button svg{flex:none}button.icon{padding:.1875rem .3125rem}button:hover{background:var(--bg-3)}button.primary{background:var(--accent);color:var(--accent-fg);border-color:#0000}button.danger{color:var(--danger)}button.ghost{background:0 0;border-color:#0000}button.ghost:hover{background:var(--bg-3)}button.ghost.confirm,button.ghost.confirm:hover{background:var(--accent);color:var(--accent-fg);border-color:#0000}button.ghost.danger.confirm,button.ghost.danger.confirm:hover{background:var(--danger);color:#fff}button.ghost.posted,button.ghost.posted:hover{background:var(--add);color:var(--bg);border-color:#0000}button:disabled{opacity:.5;cursor:default}kbd{font:.6875rem var(--mono);border:1px solid var(--border);background:var(--bg-2);border-radius:.25rem;padding:0 .25rem}.app{grid-template-rows:2.5rem 1fr;grid-template-columns:17.5rem 4px minmax(0,1fr) 4px 21.25rem;height:100%;display:grid}.resizer{cursor:col-resize;background:var(--border);opacity:.6;transition:opacity .12s,background .12s}.resizer:hover,body.resizing .resizer{background:var(--accent);opacity:1}body.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}button.off{opacity:.45}.header{border-bottom:1px solid var(--border);background:var(--bg-2);grid-column:1/-1;align-items:center;gap:.625rem;padding:0 .75rem;display:flex}.header .brand{letter-spacing:.02em;align-items:center;gap:.375rem;font-weight:700;display:inline-flex}.header .root{color:var(--fg-2);font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;overflow:hidden}.header .spacer{flex:1}.header .stat{color:var(--fg-2)}.header .lsp{color:var(--fg-2);white-space:nowrap;align-items:center;gap:.3125rem;font-size:.75rem;display:inline-flex}.header .lsp.unavailable{color:var(--warn)}.spin{animation:.9s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.tree{--trees-font-family:var(--sans);--trees-font-family-override:var(--sans);--trees-font-size-override:.8125rem;--trees-padding-inline-override:1rem;--trees-icon-width-override:1rem;--trees-git-lane-width-override:.75rem;--trees-bg-override:var(--bg-2);--trees-border-color-override:var(--border);--trees-fg-override:var(--fg);--trees-fg-muted-override:var(--fg-2);--trees-accent-override:var(--accent);--trees-git-added-color-override:var(--add);--trees-git-untracked-color-override:var(--add);--trees-git-modified-color-override:var(--accent);--trees-git-renamed-color-override:var(--kind-type);--trees-git-deleted-color-override:var(--del);--trees-git-ignored-color-override:var(--fg-2);background:var(--bg-2);flex-direction:column;min-height:0;display:flex}.tree .tree-head{border-bottom:1px solid var(--border);color:var(--fg-2);align-items:center;gap:.5rem;padding:.375rem .625rem;display:flex}.tree .tree-head button{white-space:nowrap;flex:none}.tree .tree-head button.confirm{background:var(--danger);color:#fff;border-color:#0000}.tree .tree-body{flex:1;min-height:0}.toggle{border:1px solid var(--border);border-radius:.375rem;display:flex;overflow:hidden}.toggle button{background:0 0;border:0;border-radius:0;padding:2px .5rem}.toggle button.on{background:var(--bg-3);font-weight:600}.review{outline:none;flex-direction:column;min-width:0;min-height:0;display:flex;position:relative}.review .codeview{background:var(--bg-2);--diffs-font-size:.8125rem;--diffs-line-height:1.25rem;--diffs-gap-block:.5rem;--diffs-gap-inline:.5rem;flex:1;min-height:0;overflow:auto}.review .codeview diffs-container{border-block:1px solid var(--border);display:block}.review .empty{color:var(--fg-2);text-align:center;padding:2.5rem}.review .banner{background:var(--bg-3);border-bottom:1px solid var(--border);color:var(--fg-2);padding:.5rem .75rem}.review .banner.error{color:var(--danger)}.review .fileview-bar{background:var(--bg-3);border-bottom:1px solid var(--border);align-items:center;gap:.75rem;padding:.375rem .75rem;font-size:.75rem;display:flex}.review .fileview-bar .path{min-width:0;font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.file-meta{font-family:var(--mono);align-items:center;gap:.625rem;font-size:.75rem;display:inline-flex}.file-meta .add{color:var(--add)}.file-meta .del{color:var(--del)}.file-meta label{cursor:pointer;font-family:var(--sans);align-items:center;gap:.25rem;display:inline-flex}.file-meta button.ghost.on{background:var(--bg-3);color:var(--accent)}.file-meta .badge{background:var(--bg-3);border-radius:.625rem;align-items:center;gap:.1875rem;padding:0 .4375rem;display:inline-flex}.annotation{font-family:var(--sans);margin:.25rem .5rem;font-size:.8125rem}.comment-card{border:1px solid var(--border);background:var(--bg-card);box-shadow:var(--shadow-card);border-radius:.375rem;padding:0;overflow:hidden}.comment-card.stale{border-style:dashed}.comment-card.focused{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent), var(--shadow-card)}.comment-card .meta{color:var(--fg-2);background:var(--bg-3);border-bottom:1px solid var(--border);align-items:center;gap:.5rem;padding:.25rem .375rem .25rem .625rem;font-size:.75rem;display:flex}.comment-card .meta>svg{color:var(--accent);flex:none}.comment-card .meta .loc{font-family:var(--mono);color:var(--fg);font-weight:600}.comment-card .meta .author{color:var(--fg-2);font-size:.6875rem;font-weight:400}.comment-card .meta .spacer{flex:1}.comment-card .meta .stale-tag{color:var(--warn);align-items:center;gap:.1875rem;display:inline-flex}.comment-card .body{word-break:break-word}.composer{border:1px solid var(--accent);background:var(--bg-2);border-radius:.375rem;padding:.5rem}.composer textarea{resize:vertical;border:1px solid var(--border);background:var(--bg);width:100%;min-height:4.375rem;font-family:var(--sans);border-radius:.25rem;padding:.375rem}.composer .row{justify-content:flex-end;align-items:center;gap:.375rem;margin-top:.375rem;display:flex}.composer .hint{color:var(--fg-2);margin-right:auto;font-size:.75rem}.panel{background:var(--bg-2);flex-direction:column;min-height:0;display:flex}.panel .panel-head{border-bottom:1px solid var(--border);align-items:center;gap:.375rem;min-height:2.5rem;padding:.375rem .625rem;display:flex}.panel .panel-head button{white-space:nowrap;flex:none;padding:.1875rem .5rem}.panel .panel-head .title{text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:.375rem;min-width:0;margin-right:auto;font-weight:600;display:inline-flex;overflow:hidden}.panel .panel-head .count{background:var(--bg-3);color:var(--fg-2);border-radius:.625rem;padding:0 .4375rem;font-weight:500}.panel .list{flex-direction:column;flex:1;gap:.875rem;padding:.625rem;display:flex;overflow:auto}.panel .group+.group{border-top:1px solid var(--border);padding-top:.75rem}.panel .group h4{font:.75rem/1.4 var(--mono);color:var(--fg-2);margin:0 0 .375rem}.filepath{font-family:var(--mono);overflow-wrap:anywhere;word-break:normal}.filepath .dir{color:var(--fg-2)}.filepath .base{color:var(--fg);font-weight:600}.filepath.nowrap{white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}.panel .item{text-align:left;border:1px solid var(--border);background:var(--bg-card);width:100%;box-shadow:var(--shadow-card);cursor:pointer;font:.8125rem/1.4 var(--sans);color:var(--fg);border-radius:.375rem;margin-bottom:.5rem;padding:0;transition:border-color .12s;display:block;overflow:hidden}.panel .item:hover{border-color:var(--accent)}.panel .item.is-stale{border-style:dashed}.panel .item .loc{color:var(--fg-2);background:var(--bg-3);border-bottom:1px solid var(--border);align-items:center;gap:.5rem;padding:.25rem .375rem .25rem .625rem;font-size:.75rem;display:flex}.panel .item .loc>svg{color:var(--accent);flex:none}.panel .item .loc .lines{font-family:var(--mono);color:var(--fg);font-weight:600}.panel .item .loc .author{color:var(--fg-2);font-size:.6875rem;font-weight:400}.panel .item .loc .author.agent{color:var(--accent)}.panel .item:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.panel .item .loc .delete{opacity:0;margin-left:auto;padding:1px .1875rem;transition:opacity .12s}.panel .item:hover .loc .delete,.panel .item:focus-within .loc .delete{opacity:1}.panel .item .loc .stale{color:var(--warn);font:.6875rem var(--sans);align-items:center;gap:.1875rem;display:inline-flex}.panel .item .content{padding:.375rem .625rem .5rem}.panel .item .quote{font:.75rem/1.4 var(--mono);color:var(--fg-2);white-space:nowrap;text-overflow:ellipsis;margin:0 0 .375rem;overflow:hidden}.panel .item .body{word-break:break-word;font:.8125rem/1.4 var(--sans)}.panel .empty{color:var(--fg-2);text-align:center;padding:1.5rem .75rem}.panel .empty p{margin:0 0 .375rem}.copy-btn{transition:background .16s,color .16s,border-color .16s;position:relative}.copy-btn .copy-icon{width:.875rem;height:.875rem;display:inline-block;position:relative}.copy-btn .copy-icon>span{justify-content:center;align-items:center;transition:opacity .16s,transform .2s cubic-bezier(.2,.8,.2,1);display:inline-flex;position:absolute;inset:0}.copy-btn .copy-icon .ok{opacity:0;transform:scale(.4)rotate(-30deg)}.copy-btn.done .copy-icon .i{opacity:0;transform:scale(.4)}.copy-btn.done .copy-icon .ok{opacity:1;transform:scale(1)rotate(0)}.copy-btn.done{background:var(--add);color:#fff;border-color:#0000}.copy-btn.done.primary{background:var(--add)}.menu-wrap{position:relative}.menu{background:var(--bg);border:1px solid var(--border);z-index:20;border-radius:.625rem;min-width:23.75rem;padding:.375rem;position:absolute;top:calc(100% + .375rem);left:0;box-shadow:0 .625rem 1.875rem #0000002e}.menu-title{color:var(--fg-2);padding:.25rem .625rem .375rem;font-size:.6875rem;font-weight:600}.menu .entry{text-align:left;width:100%;color:var(--fg);font:.8125rem/1.3 var(--sans);background:0 0;border:0;border-radius:.4375rem;grid-template-columns:1.125rem 1fr auto 1.5rem;align-items:center;gap:.625rem;min-height:2.125rem;padding:.4375rem .625rem;display:grid}.menu .entry>svg{color:var(--fg-2)}.menu .entry:hover:not(.static){background:var(--bg-3)}.menu .entry.active .label{font-weight:600}.menu .entry.active>svg{color:var(--accent)}.menu .entry .label{white-space:nowrap}.menu .entry .desc{color:var(--fg-2);font:.75rem var(--mono);justify-self:end;align-items:center;display:inline-flex}.menu .entry kbd{color:var(--fg-2);justify-self:end}.menu .entry.static{cursor:default}.menu .entry .control{justify-self:end;align-items:center;gap:.375rem;display:inline-flex}.menu .sep{background:var(--border);height:1px;margin:.375rem .25rem}.menu select,.menu input{background:var(--bg-2);border:1px solid var(--border);min-width:0;font:.75rem var(--mono);color:var(--fg);border-radius:.375rem;padding:.1875rem .5rem}.menu .control select{max-width:13.75rem}.menu .control input.count{text-align:right;width:3.5rem}.menu .two-refs{grid-template-columns:1fr auto 1fr auto;align-items:end;gap:.5rem;padding:.5rem .625rem .375rem;display:grid}.menu .two-refs .ref-select{flex-direction:column;gap:.1875rem;min-width:0;display:flex}.menu .two-refs .ref-select .lbl{color:var(--fg-2);font-size:.6875rem}.menu .two-refs select{width:100%;max-width:100%}.menu .two-refs input{width:100%}.menu:has(.two-refs){min-width:40rem}.dialog-backdrop{z-index:50;background:#00000059;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.dialog{background:var(--bg);border:1px solid var(--border);border-radius:.625rem;width:35rem;max-width:95vw;padding:1rem;box-shadow:0 1rem 3rem #0000004d}.dialog h3{margin:0 0 .5rem}.dialog p{color:var(--fg-2);margin:0 0 .5rem}.dialog textarea{width:100%;min-height:10rem;font-family:var(--mono);background:var(--bg-2);border:1px solid var(--border);border-radius:.375rem;padding:.5rem;font-size:.75rem}.dialog .row{justify-content:flex-end;gap:.375rem;margin-top:.625rem;display:flex}.dialog code{font-family:var(--mono);background:var(--bg-3);border-radius:.25rem;padding:0 .25rem}.searchbar{border-bottom:1px solid var(--border);background:var(--bg-2);align-items:center;gap:.5rem;padding:.375rem .625rem;display:flex}.searchbar input{background:var(--bg);border:1px solid var(--border);font-family:var(--mono);border-radius:.375rem;flex:1;padding:.25rem .5rem;font-size:.75rem}.searchbar .label{font:.75rem var(--mono);color:var(--fg-2);flex:1}.searchbar .label code{color:var(--fg)}.searchbar .opt{font:.6875rem var(--mono);color:var(--fg-2);border:1px solid #0000;border-radius:.25rem;padding:2px .375rem}.searchbar .opt.active{color:var(--accent);border-color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, transparent)}.symbols{z-index:30;background:var(--bg-2);border-bottom:1px solid var(--border);flex-direction:column;max-height:60%;display:flex;position:absolute;top:0;left:0;right:0;box-shadow:0 .625rem 1.875rem #0000002e}.symbols .searchbar{border-bottom:1px solid var(--border)}.symbols ul{margin:0;padding:.25rem;list-style:none;overflow:auto}.symbols li{font:.75rem var(--mono);cursor:pointer;border-radius:.375rem;grid-template-columns:4rem 1fr auto;align-items:baseline;gap:.625rem;padding:.25rem .5rem;display:grid}.symbols li.on{background:var(--bg-3)}.symbols li .kind{color:var(--fg-2);text-transform:lowercase;font-size:.6875rem}.symbols li .kind.type{color:var(--kind-type)}.symbols li .kind.callable{color:var(--kind-callable)}.symbols li .kind.value{color:var(--kind-value)}.symbols li .container{color:var(--fg-2)}.symbols li .where{color:var(--fg-2);white-space:nowrap;font-size:.6875rem}.symbols .empty{padding:.75rem}.symbol-menu{z-index:40;background:var(--bg);border:1px solid var(--border);border-radius:.5rem;gap:2px;padding:.1875rem;display:flex;position:fixed;box-shadow:0 .5rem 1.5rem #0000002e}.symbol-menu .name{border-left:1px solid var(--border);font:.75rem var(--mono);color:var(--fg);text-overflow:ellipsis;white-space:nowrap;align-self:center;max-width:13.75rem;margin-left:.25rem;padding:.1875rem .5rem;overflow:hidden}.symbol-menu button{color:var(--fg);font:.75rem var(--sans);cursor:pointer;background:0 0;border:0;border-radius:.375rem;align-items:center;gap:.375rem;padding:.25rem .5rem;display:flex}.symbol-menu button:hover{background:var(--bg-3)}.symbol-menu button kbd{margin-left:2px}.hover-tip{z-index:40;background:var(--bg);border:1px solid var(--border);border-radius:.5rem;max-width:min(40rem,90vw);max-height:45vh;padding:.5rem .75rem;font-size:.75rem;position:fixed;overflow:auto;box-shadow:0 .5rem 1.5rem #0000002e}.hover-tip .markdown pre{background:0 0;border:0;padding:0}.hover-tip .markdown pre+hr{margin:.5rem 0}.hover-tip .markdown p:last-child{margin-bottom:0}.references{flex-direction:column;width:min(60rem,92vw);max-height:80vh;padding:0;display:flex;overflow:hidden}.references-head{border-bottom:1px solid var(--border);align-items:baseline;gap:.875rem;padding:.875rem 1.125rem .625rem;display:flex}.references-head h3{margin:0;font-size:.9375rem}.references-head h3 code{color:var(--fg);background:var(--bg-3);border-radius:.3125rem;padding:1px .375rem}.references-head .hint{color:var(--fg-2);white-space:nowrap;margin-left:auto;font-size:.6875rem}.references-list{padding:.5rem .625rem .75rem;overflow:auto}.references section+section{margin-top:.625rem}.ref-file{z-index:1;background:var(--bg-3);border:1px solid var(--border);font:.75rem var(--mono);border-radius:.5rem;align-items:center;gap:.5rem;margin-bottom:2px;padding:.375rem .625rem;display:flex;position:sticky;top:0}.ref-file svg{color:var(--fg-2);flex:none}.ref-file .filepath{flex:1}.ref-file .count{background:var(--bg);border:1px solid var(--border);color:var(--fg-2);border-radius:.625rem;margin-left:auto;padding:0 .4375rem;font-size:.6875rem}.references .ref{font:.75rem/1.6 var(--mono);cursor:pointer;border-radius:.375rem;grid-template-columns:3.25rem 1fr;gap:.75rem;padding:.1875rem .625rem;display:grid}.references .ref:hover{background:var(--bg-2)}.references .ref.on{background:var(--bg-3)}.references .ref .line{color:var(--fg-2);text-align:right}.references .ref .code{white-space:pre;text-overflow:ellipsis;overflow:hidden}.searchbar .status{color:var(--fg-2);font:.75rem var(--mono);text-align:right;min-width:4.375rem}.flash{overflow-wrap:anywhere;background:var(--fg);max-width:min(48rem,90vw);color:var(--bg);z-index:60;border-radius:.5rem;padding:.75rem 1.25rem;font-size:1rem;line-height:1.4;animation:.16s flash-in;position:fixed;bottom:1.5rem;left:50%;transform:translate(-50%);box-shadow:0 .5rem 1.5rem #00000059}@keyframes flash-in{0%{opacity:0;transform:translate(-50%,.375rem)}to{opacity:1;transform:translate(-50%)}}.dialog.help{flex-direction:column;width:min(66.25rem,96vw);max-height:calc(100vh - 2rem);padding:0;display:flex;overflow:hidden}.help-head{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:.75rem 1.125rem .625rem;display:flex}.help-head h3{margin:0;font-size:.9375rem}.help-body{grid-template-columns:1fr 1fr;align-items:start;column-gap:1.75rem;padding:.5rem 1.125rem .875rem;display:grid;overflow:auto}.help-body section{margin-bottom:.5rem}.help-body h4{color:var(--fg-2);margin:.25rem 0 2px;font-size:.75rem;font-weight:600}.dialog.help table{border-collapse:collapse;width:100%;font-size:.75rem}.dialog.help td{vertical-align:top;border-bottom:1px solid var(--border);padding:.1875rem .25rem;line-height:1.4}.dialog.help tr:last-child td{border-bottom:0}.dialog.help td:first-child{white-space:nowrap;width:9.375rem}.menu .entry kbd,.menu .inline kbd{margin-left:.25rem}.comment-card.resolved{opacity:.7}.comment-card .meta .resolved-tag{color:var(--add);align-items:center;gap:.1875rem;display:inline-flex}.comment-card .message{padding:.5rem .625rem}.comment-card .message+.message{border-top:1px solid var(--border)}.comment-card .message .who{color:var(--fg-2);align-items:center;gap:.375rem;margin-bottom:2px;font-size:.6875rem;display:flex}.comment-card .message .who .spacer{flex:1}.author{font:.6875rem var(--sans);color:var(--fg-2);align-items:center;gap:.1875rem;display:inline-flex}.author.agent{color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, transparent);border-radius:.625rem;padding:0 .375rem}.markdown .suggestion{font:.75rem/1.5 var(--mono);background:var(--bg);border:1px solid var(--add);white-space:pre;border-radius:.375rem;margin:.375rem 0 0;padding:1.125rem .5rem .375rem;position:relative;overflow-x:auto}.markdown .suggestion .tag{font:.625rem var(--sans);color:var(--add);padding:2px .375rem;position:absolute;top:0;left:0}.markdown .suggestion.highlighted{white-space:normal;padding:1.125rem 0 0;overflow:hidden}.composer.reply{margin:0 .625rem .625rem}.panel .panel-filter{border-bottom:1px solid var(--border);color:var(--fg-2);cursor:pointer;align-items:center;gap:.375rem;padding:.25rem .625rem;font-size:.75rem;display:flex}.panel .stale-row{cursor:default;color:var(--warn)}.panel .stale-row button{align-items:center;gap:.25rem;margin-left:auto;padding:1px .375rem;font-size:.75rem;display:inline-flex}.panel .item.is-resolved{opacity:.65}.panel .item .loc .replies{color:var(--fg-2)}.panel .item .loc .resolved{color:var(--add);font:.6875rem var(--sans);align-items:center;gap:.1875rem;display:inline-flex}.file-meta .badge.generated,.file-meta .badge.submodule{color:var(--fg-2);font-family:var(--sans)}.file-meta .badge.restale{color:var(--warn);font-family:var(--sans)}.markdown{line-height:1.45}.markdown>:first-child{margin-top:0}.markdown>:last-child{margin-bottom:0}.markdown p,.markdown ul,.markdown ol,.markdown blockquote,.markdown pre,.markdown table{margin:0 0 .375rem}.markdown ul,.markdown ol{padding-left:1.375rem}.markdown li>p{margin:0}.markdown h1,.markdown h2,.markdown h3,.markdown h4,.markdown h5,.markdown h6{margin:.5rem 0 .25rem;font-weight:600;line-height:1.3}.markdown h1{font-size:.9375rem}.markdown h2{font-size:.875rem}.markdown h3,.markdown h4,.markdown h5,.markdown h6{font-size:.8125rem}.markdown code{font:.75rem var(--mono);background:var(--bg-3);border-radius:.25rem;padding:1px .25rem}.markdown pre{background:var(--bg);border:1px solid var(--border);border-radius:.375rem;padding:.375rem .5rem;overflow-x:auto}.markdown pre code{white-space:pre;background:0 0;padding:0;line-height:1.5;display:block}.markdown blockquote{border-left:.1875rem solid var(--border);color:var(--fg-2);padding:0 0 0 .625rem}.markdown a{color:var(--accent)}.markdown hr{border:0;border-top:1px solid var(--border);margin:.5rem 0}.markdown table{border-collapse:collapse;max-width:100%;font-size:.75rem;display:block;overflow-x:auto}.markdown th,.markdown td{border:1px solid var(--border);text-align:left;padding:2px .375rem}.markdown th{background:var(--bg-3);font-weight:600}.markdown input[type=checkbox]{vertical-align:middle;margin:0 .25rem 0 0}input[type=checkbox]:not(.markdown *){appearance:none;border:1px solid var(--border);background:var(--bg);cursor:pointer;vertical-align:middle;border-radius:.1875rem;flex:none;place-items:center;width:.875rem;height:.875rem;margin:0;transition:background 80ms,border-color 80ms;display:inline-grid}input[type=checkbox]:not(.markdown *):hover{border-color:var(--fg-2)}input[type=checkbox]:not(.markdown *):checked{background:var(--accent);border-color:var(--accent)}input[type=checkbox]:not(.markdown *):checked:after{content:"";border:solid var(--accent-fg);border-width:0 2px 2px 0;width:.25rem;height:.5rem;margin-top:-2px;transform:rotate(45deg)}input[type=checkbox]:not(.markdown *):focus-visible{outline:2px solid var(--accent);outline-offset:1px}input[type=checkbox]:not(.markdown *):disabled{opacity:.5;cursor:default}.markdown .suggestion{margin:.375rem 0}