@flanksource/clicky-ui 0.3.44 → 0.3.46

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 (537) hide show
  1. package/README.md +24 -0
  2. package/dist/ai.cjs +4 -2
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +3 -1
  5. package/dist/components/MdxEditorField.cjs +40 -22
  6. package/dist/components/MdxEditorField.cjs.map +1 -1
  7. package/dist/components/MdxEditorField.d.ts.map +1 -1
  8. package/dist/components/MdxEditorField.js +41 -23
  9. package/dist/components/MdxEditorField.js.map +1 -1
  10. package/dist/components/json-schema-form-item-summary.cjs +6 -1
  11. package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
  12. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
  13. package/dist/components/json-schema-form-item-summary.js +6 -1
  14. package/dist/components/json-schema-form-item-summary.js.map +1 -1
  15. package/dist/data/AccessMark.cjs +23 -0
  16. package/dist/data/AccessMark.cjs.map +1 -0
  17. package/dist/data/AccessMark.d.ts +11 -0
  18. package/dist/data/AccessMark.d.ts.map +1 -0
  19. package/dist/data/AccessMark.js +23 -0
  20. package/dist/data/AccessMark.js.map +1 -0
  21. package/dist/data/CodeBlock.cjs +3 -2
  22. package/dist/data/CodeBlock.cjs.map +1 -1
  23. package/dist/data/CodeBlock.d.ts +3 -1
  24. package/dist/data/CodeBlock.d.ts.map +1 -1
  25. package/dist/data/CodeBlock.js +3 -2
  26. package/dist/data/CodeBlock.js.map +1 -1
  27. package/dist/data/CodeDiff.cjs +116 -23
  28. package/dist/data/CodeDiff.cjs.map +1 -1
  29. package/dist/data/CodeDiff.d.ts +26 -0
  30. package/dist/data/CodeDiff.d.ts.map +1 -1
  31. package/dist/data/CodeDiff.js +116 -23
  32. package/dist/data/CodeDiff.js.map +1 -1
  33. package/dist/data/GraphDiagram.cjs +75 -11
  34. package/dist/data/GraphDiagram.cjs.map +1 -1
  35. package/dist/data/GraphDiagram.d.ts +17 -2
  36. package/dist/data/GraphDiagram.d.ts.map +1 -1
  37. package/dist/data/GraphDiagram.js +76 -12
  38. package/dist/data/GraphDiagram.js.map +1 -1
  39. package/dist/data/GraphDiagramGroups.cjs +100 -0
  40. package/dist/data/GraphDiagramGroups.cjs.map +1 -0
  41. package/dist/data/GraphDiagramGroups.d.ts +24 -0
  42. package/dist/data/GraphDiagramGroups.d.ts.map +1 -0
  43. package/dist/data/GraphDiagramGroups.js +100 -0
  44. package/dist/data/GraphDiagramGroups.js.map +1 -0
  45. package/dist/data/GraphDiagramNodes.cjs +46 -51
  46. package/dist/data/GraphDiagramNodes.cjs.map +1 -1
  47. package/dist/data/GraphDiagramNodes.d.ts +8 -9
  48. package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
  49. package/dist/data/GraphDiagramNodes.js +46 -51
  50. package/dist/data/GraphDiagramNodes.js.map +1 -1
  51. package/dist/data/JsonView.cjs +118 -49
  52. package/dist/data/JsonView.cjs.map +1 -1
  53. package/dist/data/JsonView.d.ts +13 -10
  54. package/dist/data/JsonView.d.ts.map +1 -1
  55. package/dist/data/JsonView.js +118 -49
  56. package/dist/data/JsonView.js.map +1 -1
  57. package/dist/data/MarkdownEditor.cjs +2 -2
  58. package/dist/data/MarkdownEditor.cjs.map +1 -1
  59. package/dist/data/MarkdownEditor.js +2 -2
  60. package/dist/data/MarkdownEditor.js.map +1 -1
  61. package/dist/data/TreeNode.cjs +1 -1
  62. package/dist/data/TreeNode.cjs.map +1 -1
  63. package/dist/data/TreeNode.d.ts.map +1 -1
  64. package/dist/data/TreeNode.js +1 -1
  65. package/dist/data/TreeNode.js.map +1 -1
  66. package/dist/data/ai/AdvancedChatConfig.cjs +90 -249
  67. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
  68. package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
  69. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
  70. package/dist/data/ai/AdvancedChatConfig.js +91 -250
  71. package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
  72. package/dist/data/ai/ChatButton.cjs +2 -0
  73. package/dist/data/ai/ChatButton.cjs.map +1 -1
  74. package/dist/data/ai/ChatButton.d.ts +1 -1
  75. package/dist/data/ai/ChatButton.d.ts.map +1 -1
  76. package/dist/data/ai/ChatButton.js +2 -0
  77. package/dist/data/ai/ChatButton.js.map +1 -1
  78. package/dist/data/ai/ChatFab.cjs +5 -1
  79. package/dist/data/ai/ChatFab.cjs.map +1 -1
  80. package/dist/data/ai/ChatFab.d.ts +5 -1
  81. package/dist/data/ai/ChatFab.d.ts.map +1 -1
  82. package/dist/data/ai/ChatFab.js +5 -1
  83. package/dist/data/ai/ChatFab.js.map +1 -1
  84. package/dist/data/ai/ChatWindow.cjs +2 -8
  85. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  86. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  87. package/dist/data/ai/ChatWindow.js +2 -8
  88. package/dist/data/ai/ChatWindow.js.map +1 -1
  89. package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
  90. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  91. package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
  92. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  93. package/dist/data/ai/ChatWindow.runtime.js +0 -5
  94. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  95. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
  96. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
  97. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
  98. package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
  99. package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
  100. package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
  101. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
  102. package/dist/data/ai/SessionInspector.approvals.js +3 -6
  103. package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
  104. package/dist/data/ai/SessionViewer.cjs +13 -4
  105. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  106. package/dist/data/ai/SessionViewer.d.ts +5 -1
  107. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  108. package/dist/data/ai/SessionViewer.header.cjs +1 -1
  109. package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
  110. package/dist/data/ai/SessionViewer.header.js +1 -1
  111. package/dist/data/ai/SessionViewer.header.js.map +1 -1
  112. package/dist/data/ai/SessionViewer.js +13 -4
  113. package/dist/data/ai/SessionViewer.js.map +1 -1
  114. package/dist/data/ai/SessionViewer.model.cjs +2 -0
  115. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  116. package/dist/data/ai/SessionViewer.model.d.ts +1 -0
  117. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  118. package/dist/data/ai/SessionViewer.model.js +2 -0
  119. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  120. package/dist/data/ai/SessionViewer.rows.cjs +41 -27
  121. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  122. package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
  123. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  124. package/dist/data/ai/SessionViewer.rows.js +41 -27
  125. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  126. package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
  127. package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
  128. package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
  129. package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
  130. package/dist/data/ai/SessionViewer.tokens.js +35 -0
  131. package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
  132. package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
  133. package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
  134. package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
  135. package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
  136. package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
  137. package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
  138. package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
  139. package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
  140. package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
  141. package/dist/data/ai/SessionViewer.tool-details.js +3 -1
  142. package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
  143. package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
  144. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
  145. package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
  146. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
  147. package/dist/data/ai/SessionViewer.tool-row.js +55 -35
  148. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
  149. package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
  150. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  151. package/dist/data/ai/SessionViewerMenu.cjs +18 -1
  152. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
  153. package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
  154. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
  155. package/dist/data/ai/SessionViewerMenu.js +18 -1
  156. package/dist/data/ai/SessionViewerMenu.js.map +1 -1
  157. package/dist/data/ai/ToolPreferences.cjs +149 -143
  158. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  159. package/dist/data/ai/ToolPreferences.d.ts +20 -6
  160. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  161. package/dist/data/ai/ToolPreferences.js +151 -146
  162. package/dist/data/ai/ToolPreferences.js.map +1 -1
  163. package/dist/data/ai/ToolPreferences.model.cjs +14 -10
  164. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  165. package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
  166. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  167. package/dist/data/ai/ToolPreferences.model.js +15 -11
  168. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  169. package/dist/data/ai/ToolPreferencesList.cjs +1 -0
  170. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  171. package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
  172. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  173. package/dist/data/ai/ToolPreferencesList.js +2 -1
  174. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  175. package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
  176. package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
  177. package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
  178. package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
  179. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
  180. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
  181. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
  182. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
  183. package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
  184. package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
  185. package/dist/data/ai/ToolSchemaBrowser.js +53 -54
  186. package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
  187. package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
  188. package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
  189. package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
  190. package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
  191. package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
  192. package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
  193. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
  194. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
  195. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
  196. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
  197. package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
  198. package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
  199. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
  200. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
  201. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
  202. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
  203. package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
  204. package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
  205. package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
  206. package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
  207. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
  208. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
  209. package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
  210. package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
  211. package/dist/data/ai/index.d.ts +2 -2
  212. package/dist/data/ai/index.d.ts.map +1 -1
  213. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
  214. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
  215. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
  216. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
  217. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
  218. package/dist/data/ai/session-token-sizing.d.ts +32 -0
  219. package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
  220. package/dist/data/ai/use-session-token-sizing.cjs +73 -0
  221. package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
  222. package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
  223. package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
  224. package/dist/data/ai/use-session-token-sizing.js +73 -0
  225. package/dist/data/ai/use-session-token-sizing.js.map +1 -0
  226. package/dist/data/call-graph/CallGraph.cjs +269 -0
  227. package/dist/data/call-graph/CallGraph.cjs.map +1 -0
  228. package/dist/data/call-graph/CallGraph.d.ts +78 -0
  229. package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
  230. package/dist/data/call-graph/CallGraph.js +269 -0
  231. package/dist/data/call-graph/CallGraph.js.map +1 -0
  232. package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
  233. package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
  234. package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
  235. package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
  236. package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
  237. package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
  238. package/dist/data/call-graph/CallGraphMembers.cjs +51 -0
  239. package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
  240. package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
  241. package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
  242. package/dist/data/call-graph/CallGraphMembers.js +51 -0
  243. package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
  244. package/dist/data/call-graph/CallGraphParts.cjs +204 -0
  245. package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
  246. package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
  247. package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
  248. package/dist/data/call-graph/CallGraphParts.js +204 -0
  249. package/dist/data/call-graph/CallGraphParts.js.map +1 -0
  250. package/dist/data/call-graph/CallGraphToolbar.cjs +198 -0
  251. package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
  252. package/dist/data/call-graph/CallGraphToolbar.d.ts +55 -0
  253. package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
  254. package/dist/data/call-graph/CallGraphToolbar.js +198 -0
  255. package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
  256. package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
  257. package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
  258. package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
  259. package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
  260. package/dist/data/call-graph/call-graph-exclude.js +75 -0
  261. package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
  262. package/dist/data/call-graph/call-graph-labels.cjs +96 -0
  263. package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
  264. package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
  265. package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
  266. package/dist/data/call-graph/call-graph-labels.js +96 -0
  267. package/dist/data/call-graph/call-graph-labels.js.map +1 -0
  268. package/dist/data/call-graph/call-graph-model.cjs +312 -0
  269. package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
  270. package/dist/data/call-graph/call-graph-model.d.ts +138 -0
  271. package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
  272. package/dist/data/call-graph/call-graph-model.js +312 -0
  273. package/dist/data/call-graph/call-graph-model.js.map +1 -0
  274. package/dist/data/call-graph/call-graph-vocabulary.cjs +195 -0
  275. package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
  276. package/dist/data/call-graph/call-graph-vocabulary.d.ts +76 -0
  277. package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
  278. package/dist/data/call-graph/call-graph-vocabulary.js +195 -0
  279. package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
  280. package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
  281. package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
  282. package/dist/data/call-graph/index.d.ts +7 -0
  283. package/dist/data/call-graph/index.d.ts.map +1 -0
  284. package/dist/data/call-graph/types.cjs +5 -0
  285. package/dist/data/call-graph/types.cjs.map +1 -0
  286. package/dist/data/call-graph/types.d.ts +140 -0
  287. package/dist/data/call-graph/types.d.ts.map +1 -0
  288. package/dist/data/call-graph/types.js +5 -0
  289. package/dist/data/call-graph/types.js.map +1 -0
  290. package/dist/data/call-graph/use-call-graph.cjs +93 -0
  291. package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
  292. package/dist/data/call-graph/use-call-graph.d.ts +24 -0
  293. package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
  294. package/dist/data/call-graph/use-call-graph.js +93 -0
  295. package/dist/data/call-graph/use-call-graph.js.map +1 -0
  296. package/dist/data/chat/Chat.cjs +39 -15
  297. package/dist/data/chat/Chat.cjs.map +1 -1
  298. package/dist/data/chat/Chat.d.ts.map +1 -1
  299. package/dist/data/chat/Chat.fixtures.cjs +2 -2
  300. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  301. package/dist/data/chat/Chat.fixtures.js +2 -2
  302. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  303. package/dist/data/chat/Chat.js +40 -16
  304. package/dist/data/chat/Chat.js.map +1 -1
  305. package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
  306. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  307. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  308. package/dist/data/chat/ChatRuntimeToolbar.js +3 -6
  309. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  310. package/dist/data/chat/ContextMeter.bar.cjs +5 -8
  311. package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
  312. package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
  313. package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
  314. package/dist/data/chat/ContextMeter.bar.js +5 -8
  315. package/dist/data/chat/ContextMeter.bar.js.map +1 -1
  316. package/dist/data/chat/ContextMeter.cjs +18 -19
  317. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  318. package/dist/data/chat/ContextMeter.d.ts +1 -1
  319. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  320. package/dist/data/chat/ContextMeter.js +18 -19
  321. package/dist/data/chat/ContextMeter.js.map +1 -1
  322. package/dist/data/chat/Conversation.cjs +2 -1
  323. package/dist/data/chat/Conversation.cjs.map +1 -1
  324. package/dist/data/chat/Conversation.d.ts +4 -1
  325. package/dist/data/chat/Conversation.d.ts.map +1 -1
  326. package/dist/data/chat/Conversation.js +2 -1
  327. package/dist/data/chat/Conversation.js.map +1 -1
  328. package/dist/data/chat/Message.cjs +39 -12
  329. package/dist/data/chat/Message.cjs.map +1 -1
  330. package/dist/data/chat/Message.d.ts +1 -1
  331. package/dist/data/chat/Message.d.ts.map +1 -1
  332. package/dist/data/chat/Message.js +40 -13
  333. package/dist/data/chat/Message.js.map +1 -1
  334. package/dist/data/chat/ToolCall.cjs +60 -5
  335. package/dist/data/chat/ToolCall.cjs.map +1 -1
  336. package/dist/data/chat/ToolCall.d.ts +7 -2
  337. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  338. package/dist/data/chat/ToolCall.js +60 -5
  339. package/dist/data/chat/ToolCall.js.map +1 -1
  340. package/dist/data/chat/approval.cjs.map +1 -1
  341. package/dist/data/chat/approval.d.ts +2 -2
  342. package/dist/data/chat/approval.d.ts.map +1 -1
  343. package/dist/data/chat/approval.js.map +1 -1
  344. package/dist/data/chat/tool-policy.cjs +59 -2
  345. package/dist/data/chat/tool-policy.cjs.map +1 -1
  346. package/dist/data/chat/tool-policy.d.ts +9 -0
  347. package/dist/data/chat/tool-policy.d.ts.map +1 -1
  348. package/dist/data/chat/tool-policy.js +59 -2
  349. package/dist/data/chat/tool-policy.js.map +1 -1
  350. package/dist/data/chat/types.cjs +6 -0
  351. package/dist/data/chat/types.cjs.map +1 -1
  352. package/dist/data/chat/types.d.ts +13 -4
  353. package/dist/data/chat/types.d.ts.map +1 -1
  354. package/dist/data/chat/types.js +7 -1
  355. package/dist/data/chat/types.js.map +1 -1
  356. package/dist/data/chat/usage-snapshot.cjs +11 -6
  357. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  358. package/dist/data/chat/usage-snapshot.d.ts +0 -1
  359. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  360. package/dist/data/chat/usage-snapshot.js +11 -6
  361. package/dist/data/chat/usage-snapshot.js.map +1 -1
  362. package/dist/data/data-access.cjs +8 -0
  363. package/dist/data/data-access.cjs.map +1 -0
  364. package/dist/data/data-access.d.ts +5 -0
  365. package/dist/data/data-access.d.ts.map +1 -0
  366. package/dist/data/data-access.js +8 -0
  367. package/dist/data/data-access.js.map +1 -0
  368. package/dist/data/diagnostics/StackFrameRow.cjs +3 -3
  369. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
  370. package/dist/data/diagnostics/StackFrameRow.js +3 -3
  371. package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
  372. package/dist/data/git/GitChangeList.cjs +6 -2
  373. package/dist/data/git/GitChangeList.cjs.map +1 -1
  374. package/dist/data/git/GitChangeList.d.ts +6 -1
  375. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  376. package/dist/data/git/GitChangeList.js +6 -2
  377. package/dist/data/git/GitChangeList.js.map +1 -1
  378. package/dist/data/graph-columns-layout.cjs +61 -14
  379. package/dist/data/graph-columns-layout.cjs.map +1 -1
  380. package/dist/data/graph-columns-layout.d.ts +42 -0
  381. package/dist/data/graph-columns-layout.d.ts.map +1 -1
  382. package/dist/data/graph-columns-layout.js +61 -14
  383. package/dist/data/graph-columns-layout.js.map +1 -1
  384. package/dist/data/graph-diagram-model.cjs +5 -0
  385. package/dist/data/graph-diagram-model.cjs.map +1 -1
  386. package/dist/data/graph-diagram-model.d.ts +24 -0
  387. package/dist/data/graph-diagram-model.d.ts.map +1 -1
  388. package/dist/data/graph-diagram-model.js +5 -0
  389. package/dist/data/graph-diagram-model.js.map +1 -1
  390. package/dist/data/graph-edge-routing.cjs +9 -3
  391. package/dist/data/graph-edge-routing.cjs.map +1 -1
  392. package/dist/data/graph-edge-routing.d.ts +2 -0
  393. package/dist/data/graph-edge-routing.d.ts.map +1 -1
  394. package/dist/data/graph-edge-routing.js +9 -3
  395. package/dist/data/graph-edge-routing.js.map +1 -1
  396. package/dist/data/graph-group-window.cjs +60 -0
  397. package/dist/data/graph-group-window.cjs.map +1 -0
  398. package/dist/data/graph-group-window.d.ts +33 -0
  399. package/dist/data/graph-group-window.d.ts.map +1 -0
  400. package/dist/data/graph-group-window.js +60 -0
  401. package/dist/data/graph-group-window.js.map +1 -0
  402. package/dist/data/json-view/JsonSource.cjs +84 -0
  403. package/dist/data/json-view/JsonSource.cjs.map +1 -0
  404. package/dist/data/json-view/JsonSource.d.ts +7 -0
  405. package/dist/data/json-view/JsonSource.d.ts.map +1 -0
  406. package/dist/data/json-view/JsonSource.js +84 -0
  407. package/dist/data/json-view/JsonSource.js.map +1 -0
  408. package/dist/data/json-view/parse-prefix.cjs +132 -0
  409. package/dist/data/json-view/parse-prefix.cjs.map +1 -0
  410. package/dist/data/json-view/parse-prefix.d.ts +11 -0
  411. package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
  412. package/dist/data/json-view/parse-prefix.js +132 -0
  413. package/dist/data/json-view/parse-prefix.js.map +1 -0
  414. package/dist/data/json-view/parse-source.cjs +62 -0
  415. package/dist/data/json-view/parse-source.cjs.map +1 -0
  416. package/dist/data/json-view/parse-source.d.ts +16 -0
  417. package/dist/data/json-view/parse-source.d.ts.map +1 -0
  418. package/dist/data/json-view/parse-source.js +62 -0
  419. package/dist/data/json-view/parse-source.js.map +1 -0
  420. package/dist/data/json-view/story-fixtures.d.ts +6 -0
  421. package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
  422. package/dist/data/json-view/types.d.ts +14 -0
  423. package/dist/data/json-view/types.d.ts.map +1 -0
  424. package/dist/data/runtime/RuntimeBar.cjs +2 -5
  425. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  426. package/dist/data/runtime/RuntimeBar.d.ts +2 -4
  427. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  428. package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
  429. package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
  430. package/dist/data/runtime/RuntimeBar.fields.js +2 -2
  431. package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
  432. package/dist/data/runtime/RuntimeBar.js +2 -5
  433. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  434. package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
  435. package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
  436. package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
  437. package/dist/data/runtime/RuntimeBar.selection.js +5 -2
  438. package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
  439. package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
  440. package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
  441. package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
  442. package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
  443. package/dist/data/runtime/RuntimeBarActions.js +1 -5
  444. package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
  445. package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
  446. package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
  447. package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
  448. package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
  449. package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
  450. package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
  451. package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
  452. package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
  453. package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
  454. package/dist/data/runtime/RuntimeBarLayout.js +8 -27
  455. package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
  456. package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
  457. package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
  458. package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
  459. package/dist/data/runtime/RuntimeBarSegment.js +1 -5
  460. package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
  461. package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
  462. package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
  463. package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
  464. package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
  465. package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
  466. package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
  467. package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
  468. package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
  469. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
  470. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
  471. package/dist/data/use-group-windows.cjs +50 -0
  472. package/dist/data/use-group-windows.cjs.map +1 -0
  473. package/dist/data/use-group-windows.d.ts +27 -0
  474. package/dist/data/use-group-windows.d.ts.map +1 -0
  475. package/dist/data/use-group-windows.js +50 -0
  476. package/dist/data/use-group-windows.js.map +1 -0
  477. package/dist/data/use-pan-zoom.cjs +23 -10
  478. package/dist/data/use-pan-zoom.cjs.map +1 -1
  479. package/dist/data/use-pan-zoom.d.ts +16 -2
  480. package/dist/data/use-pan-zoom.d.ts.map +1 -1
  481. package/dist/data/use-pan-zoom.js +23 -10
  482. package/dist/data/use-pan-zoom.js.map +1 -1
  483. package/dist/data/version-info.cjs +3 -3
  484. package/dist/data/version-info.js +3 -3
  485. package/dist/data.cjs +36 -2
  486. package/dist/data.cjs.map +1 -1
  487. package/dist/data.d.ts +5 -2
  488. package/dist/data.d.ts.map +1 -1
  489. package/dist/data.js +35 -1
  490. package/dist/data.js.map +1 -1
  491. package/dist/hooks/event-hub.cjs +229 -0
  492. package/dist/hooks/event-hub.cjs.map +1 -0
  493. package/dist/hooks/event-hub.d.ts +26 -0
  494. package/dist/hooks/event-hub.d.ts.map +1 -0
  495. package/dist/hooks/event-hub.js +229 -0
  496. package/dist/hooks/event-hub.js.map +1 -0
  497. package/dist/hooks.cjs +2 -0
  498. package/dist/hooks.cjs.map +1 -1
  499. package/dist/hooks.d.ts +1 -0
  500. package/dist/hooks.d.ts.map +1 -1
  501. package/dist/hooks.js +2 -0
  502. package/dist/hooks.js.map +1 -1
  503. package/dist/index.cjs +40 -4
  504. package/dist/index.cjs.map +1 -1
  505. package/dist/index.js +37 -1
  506. package/dist/index.js.map +1 -1
  507. package/dist/layout/Workspace.cjs +13 -4
  508. package/dist/layout/Workspace.cjs.map +1 -1
  509. package/dist/layout/Workspace.d.ts +7 -2
  510. package/dist/layout/Workspace.d.ts.map +1 -1
  511. package/dist/layout/Workspace.js +13 -4
  512. package/dist/layout/Workspace.js.map +1 -1
  513. package/dist/lib/permission-strategies.cjs +71 -11
  514. package/dist/lib/permission-strategies.cjs.map +1 -1
  515. package/dist/lib/permission-strategies.d.ts +3 -0
  516. package/dist/lib/permission-strategies.d.ts.map +1 -1
  517. package/dist/lib/permission-strategies.js +71 -11
  518. package/dist/lib/permission-strategies.js.map +1 -1
  519. package/dist/overlay/modalStack.cjs +13 -6
  520. package/dist/overlay/modalStack.cjs.map +1 -1
  521. package/dist/overlay/modalStack.d.ts.map +1 -1
  522. package/dist/overlay/modalStack.js +13 -6
  523. package/dist/overlay/modalStack.js.map +1 -1
  524. package/dist/styles.css +1 -1
  525. package/package.json +5 -3
  526. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
  527. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
  528. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
  529. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
  530. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
  531. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
  532. package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
  533. package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
  534. package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
  535. package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
  536. package/dist/data/runtime/RuntimeBar.context.js +0 -8
  537. package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
@@ -28,13 +28,13 @@ function StackFrameRow({
28
28
  "div",
29
29
  {
30
30
  className: [
31
- "group grid gap-2 px-3 py-1.5 text-xs",
31
+ "group grid gap-x-2 gap-y-0.5 px-3 py-0.5 text-xs",
32
32
  showIndex ? "grid-cols-[2rem_minmax(0,1fr)_auto]" : "grid-cols-[1.25rem_minmax(0,1fr)_auto]",
33
33
  frame.runtime ? "text-muted-foreground" : "text-foreground"
34
34
  ].join(" "),
35
35
  children: [
36
36
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-end gap-1 pt-0.5 font-mono text-[10px] text-muted-foreground", children: [
37
- showIndex && /* @__PURE__ */ jsxRuntime.jsx("span", { children: index + 1 }),
37
+ showIndex && /* @__PURE__ */ jsxRuntime.jsx("span", { "data-frame-index": true, children: index + 1 }),
38
38
  /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: frameIcon(frame), className: "mt-px shrink-0 text-[11px]" })
39
39
  ] }),
40
40
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5", children: isAnnotation ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -56,7 +56,7 @@ function StackFrameRow({
56
56
  }
57
57
  ) : /* @__PURE__ */ jsxRuntime.jsx("div", {}),
58
58
  !isAnnotation && FrameSourceWindow_utils.frameHasSource(frame) ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-3", children: /* @__PURE__ */ jsxRuntime.jsx(FrameSourceWindow.FrameSourceWindow, { frame }) }) : null,
59
- detail ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-3", children: detail }) : null
59
+ detail ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-start-2 col-span-2 min-w-0", children: detail }) : null
60
60
  ]
61
61
  }
62
62
  );
@@ -1 +1 @@
1
- {"version":3,"file":"StackFrameRow.cjs","sources":["../../../src/data/diagnostics/StackFrameRow.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport {\n UiChip,\n UiDebugStepOver,\n UiLock,\n UiMethod,\n UiStackFrameDot,\n UiSync,\n UiWatch,\n} from \"../../icons\";\nimport { FrameSourceWindow } from \"./FrameSourceWindow\";\nimport { frameHasSource } from \"./FrameSourceWindow.utils\";\nimport type { ParsedThreadFrame } from \"./jvm-stacktrace\";\n\n// StackFrameActions renders trailing per-frame affordances. It is a slot: the\n// shared library never knows what the actions do, only where they go.\nexport type StackFrameActions = (frame: ParsedThreadFrame, index: number) => ReactNode;\nexport type StackFramePart = \"method\" | \"class\" | \"location\";\nexport type StackFramePartRenderer = (\n part: StackFramePart,\n frame: ParsedThreadFrame,\n index: number,\n) => ReactNode;\nexport type StackFrameDetailRenderer = (frame: ParsedThreadFrame, index: number) => ReactNode;\nexport type StackFrameActionsVisibility = \"hover\" | \"always\";\n\nexport interface StackFrameRowProps {\n frame: ParsedThreadFrame;\n index: number;\n /** Show the 1-based frame ordinal in the gutter. */\n showIndex?: boolean;\n /** Trailing actions for this frame, revealed on hover/focus. */\n frameActions?: StackFrameActions;\n /** Replace the method, class, or location label while preserving row layout. */\n renderFramePart?: StackFramePartRenderer;\n /** Additional detail rendered below an ordinary frame. */\n renderFrameDetail?: StackFrameDetailRenderer;\n /** Whether actions are hover-only or permanently visible. */\n frameActionsVisibility?: StackFrameActionsVisibility;\n}\n\n// StackFrameRow is THE stack-frame renderer. Both an exception dump (via\n// StackTrace) and a JVM thread dump (via JvmStackTrace) render their frames\n// through it, so a frame looks and behaves the same wherever it is shown.\n//\n// Thread dumps carry lock/monitor annotation entries alongside real frames —\n// `frame.kind !== \"frame\"` — which are rendered as their own muted rows with a\n// lock/wait icon and no source window. An exception dump simply never produces\n// them.\nexport function StackFrameRow({\n frame,\n index,\n showIndex = false,\n frameActions,\n renderFramePart,\n renderFrameDetail,\n frameActionsVisibility = \"hover\",\n}: StackFrameRowProps) {\n const isAnnotation = frame.kind !== \"frame\";\n const methodName = frame.displayName || frame.method || frame.functionName;\n const actions = frameActions?.(frame, index);\n const detail = !isAnnotation ? renderFrameDetail?.(frame, index) : null;\n\n return (\n <div\n className={[\n \"group grid gap-2 px-3 py-1.5 text-xs\",\n showIndex ? \"grid-cols-[2rem_minmax(0,1fr)_auto]\" : \"grid-cols-[1.25rem_minmax(0,1fr)_auto]\",\n frame.runtime ? \"text-muted-foreground\" : \"text-foreground\",\n ].join(\" \")}\n >\n <div className=\"flex items-start justify-end gap-1 pt-0.5 font-mono text-[10px] text-muted-foreground\">\n {showIndex && <span>{index + 1}</span>}\n <Icon icon={frameIcon(frame)} className=\"mt-px shrink-0 text-[11px]\" />\n </div>\n\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5\">\n {isAnnotation ? (\n <>\n <span className=\"min-w-0 break-all font-mono font-semibold leading-4 opacity-70\">\n {frame.functionName}\n </span>\n {frame.annotationText && (\n <span className=\"min-w-0 break-all font-mono text-[11px] font-normal opacity-80\">\n {frame.annotationText}\n </span>\n )}\n </>\n ) : (\n <>\n {renderFramePart ? (\n renderFramePart(\"method\", frame, index)\n ) : (\n <span className=\"min-w-0 break-all font-mono font-semibold leading-4\">\n {methodName}\n </span>\n )}\n {frame.class && (\n renderFramePart ? (\n renderFramePart(\"class\", frame, index)\n ) : (\n <span className=\"min-w-0 break-all font-mono text-[11px] text-muted-foreground\">\n {frame.class}\n </span>\n )\n )}\n {frame.location && (\n renderFramePart ? (\n renderFramePart(\"location\", frame, index)\n ) : (\n <span className=\"rounded border border-border bg-muted/40 px-1.5 py-px font-mono text-[10px] text-muted-foreground\">\n {frame.location}\n </span>\n )\n )}\n </>\n )}\n </div>\n </div>\n\n {actions ? (\n <div\n className={[\n \"flex shrink-0 items-start gap-1\",\n frameActionsVisibility === \"hover\"\n ? \"opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\"\n : \"opacity-100\",\n ].join(\" \")}\n >\n {actions}\n </div>\n ) : (\n <div />\n )}\n\n {!isAnnotation && frameHasSource(frame) ? (\n <div className=\"col-span-3\">\n <FrameSourceWindow frame={frame} />\n </div>\n ) : null}\n {detail ? <div className=\"col-span-3\">{detail}</div> : null}\n </div>\n );\n}\n\nfunction frameIcon(frame: ParsedThreadFrame) {\n switch (frame.kind) {\n case \"locked\":\n return UiLock;\n case \"waiting_to_lock\":\n return UiSync;\n case \"waiting_on\":\n case \"parking\":\n return UiWatch;\n default:\n break;\n }\n if (frame.nativeMethod) return UiChip;\n if (frame.runtime) return UiDebugStepOver;\n return frame.method || frame.class ? UiMethod : UiStackFrameDot;\n}\n"],"names":["jsxs","jsx","Icon","Fragment","frameHasSource","FrameSourceWindow","UiLock","UiSync","UiWatch","UiChip","UiDebugStepOver","UiMethod","UiStackFrameDot"],"mappings":";;;;;;;;;;;;;AAkDO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,yBAAyB;AAC3B,GAAuB;AACrB,QAAM,eAAe,MAAM,SAAS;AACpC,QAAM,aAAa,MAAM,eAAe,MAAM,UAAU,MAAM;AAC9D,QAAM,UAAU,6CAAe,OAAO;AACtC,QAAM,SAAS,CAAC,eAAe,uDAAoB,OAAO,SAAS;AAEnE,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY,wCAAwC;AAAA,QACpD,MAAM,UAAU,0BAA0B;AAAA,MAAA,EAC1C,KAAK,GAAG;AAAA,MAEV,UAAA;AAAA,QAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,yFACZ,UAAA;AAAA,UAAA,aAAaC,2BAAAA,IAAC,QAAA,EAAM,UAAA,QAAQ,GAAE;AAAA,yCAC9BC,KAAAA,MAAA,EAAK,MAAM,UAAU,KAAK,GAAG,WAAU,6BAAA,CAA6B;AAAA,QAAA,GACvE;AAAA,QAEAD,2BAAAA,IAAC,SAAI,WAAU,WACb,yCAAC,OAAA,EAAI,WAAU,2DACZ,UAAA,eACCD,2BAAAA,KAAAG,WAAAA,UAAA,EACE,UAAA;AAAA,UAAAF,2BAAAA,IAAC,QAAA,EAAK,WAAU,kEACb,UAAA,MAAM,cACT;AAAA,UACC,MAAM,kBACLA,2BAAAA,IAAC,UAAK,WAAU,kEACb,gBAAM,eAAA,CACT;AAAA,QAAA,EAAA,CAEJ,IAEAD,2BAAAA,KAAAG,WAAAA,UAAA,EACG,UAAA;AAAA,UAAA,kBACC,gBAAgB,UAAU,OAAO,KAAK,IAEtCF,2BAAAA,IAAC,QAAA,EAAK,WAAU,uDACb,UAAA,WAAA,CACH;AAAA,UAED,MAAM,UACL,kBACE,gBAAgB,SAAS,OAAO,KAAK,IAErCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,iEACb,gBAAM,MAAA,CACT;AAAA,UAGH,MAAM,aACL,kBACE,gBAAgB,YAAY,OAAO,KAAK,IAExCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,qGACb,gBAAM,UACT;AAAA,QAAA,EAAA,CAGN,GAEJ,GACF;AAAA,QAEC,UACCA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,2BAA2B,UACvB,kFACA;AAAA,YAAA,EACJ,KAAK,GAAG;AAAA,YAET,UAAA;AAAA,UAAA;AAAA,QAAA,mCAGF,OAAA,EAAI;AAAA,QAGN,CAAC,gBAAgBG,wBAAAA,eAAe,KAAK,IACpCH,2BAAAA,IAAC,OAAA,EAAI,WAAU,cACb,UAAAA,2BAAAA,IAACI,kBAAAA,mBAAA,EAAkB,MAAA,CAAc,GACnC,IACE;AAAA,QACH,SAASJ,2BAAAA,IAAC,OAAA,EAAI,WAAU,cAAc,kBAAO,IAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG7D;AAEA,SAAS,UAAU,OAA0B;AAC3C,UAAQ,MAAM,MAAA;AAAA,IACZ,KAAK;AACH,aAAOK,OAAAA;AAAAA,IACT,KAAK;AACH,aAAOC,OAAAA;AAAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAOC,QAAAA;AAAAA,EAEP;AAEJ,MAAI,MAAM,aAAc,QAAOC,OAAAA;AAC/B,MAAI,MAAM,QAAS,QAAOC,gBAAAA;AAC1B,SAAO,MAAM,UAAU,MAAM,QAAQC,SAAAA,WAAWC,gBAAAA;AAClD;;"}
1
+ {"version":3,"file":"StackFrameRow.cjs","sources":["../../../src/data/diagnostics/StackFrameRow.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport {\n UiChip,\n UiDebugStepOver,\n UiLock,\n UiMethod,\n UiStackFrameDot,\n UiSync,\n UiWatch,\n} from \"../../icons\";\nimport { FrameSourceWindow } from \"./FrameSourceWindow\";\nimport { frameHasSource } from \"./FrameSourceWindow.utils\";\nimport type { ParsedThreadFrame } from \"./jvm-stacktrace\";\n\n// StackFrameActions renders trailing per-frame affordances. It is a slot: the\n// shared library never knows what the actions do, only where they go.\nexport type StackFrameActions = (frame: ParsedThreadFrame, index: number) => ReactNode;\nexport type StackFramePart = \"method\" | \"class\" | \"location\";\nexport type StackFramePartRenderer = (\n part: StackFramePart,\n frame: ParsedThreadFrame,\n index: number,\n) => ReactNode;\nexport type StackFrameDetailRenderer = (frame: ParsedThreadFrame, index: number) => ReactNode;\nexport type StackFrameActionsVisibility = \"hover\" | \"always\";\n\nexport interface StackFrameRowProps {\n frame: ParsedThreadFrame;\n index: number;\n /** Show the 1-based frame ordinal in the gutter. */\n showIndex?: boolean;\n /** Trailing actions for this frame, revealed on hover/focus. */\n frameActions?: StackFrameActions;\n /** Replace the method, class, or location label while preserving row layout. */\n renderFramePart?: StackFramePartRenderer;\n /** Additional detail rendered below an ordinary frame. */\n renderFrameDetail?: StackFrameDetailRenderer;\n /** Whether actions are hover-only or permanently visible. */\n frameActionsVisibility?: StackFrameActionsVisibility;\n}\n\n// StackFrameRow is THE stack-frame renderer. Both an exception dump (via\n// StackTrace) and a JVM thread dump (via JvmStackTrace) render their frames\n// through it, so a frame looks and behaves the same wherever it is shown.\n//\n// Thread dumps carry lock/monitor annotation entries alongside real frames —\n// `frame.kind !== \"frame\"` — which are rendered as their own muted rows with a\n// lock/wait icon and no source window. An exception dump simply never produces\n// them.\nexport function StackFrameRow({\n frame,\n index,\n showIndex = false,\n frameActions,\n renderFramePart,\n renderFrameDetail,\n frameActionsVisibility = \"hover\",\n}: StackFrameRowProps) {\n const isAnnotation = frame.kind !== \"frame\";\n const methodName = frame.displayName || frame.method || frame.functionName;\n const actions = frameActions?.(frame, index);\n const detail = !isAnnotation ? renderFrameDetail?.(frame, index) : null;\n\n return (\n <div\n className={[\n \"group grid gap-x-2 gap-y-0.5 px-3 py-0.5 text-xs\",\n showIndex ? \"grid-cols-[2rem_minmax(0,1fr)_auto]\" : \"grid-cols-[1.25rem_minmax(0,1fr)_auto]\",\n frame.runtime ? \"text-muted-foreground\" : \"text-foreground\",\n ].join(\" \")}\n >\n <div className=\"flex items-start justify-end gap-1 pt-0.5 font-mono text-[10px] text-muted-foreground\">\n {showIndex && <span data-frame-index>{index + 1}</span>}\n <Icon icon={frameIcon(frame)} className=\"mt-px shrink-0 text-[11px]\" />\n </div>\n\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5\">\n {isAnnotation ? (\n <>\n <span className=\"min-w-0 break-all font-mono font-semibold leading-4 opacity-70\">\n {frame.functionName}\n </span>\n {frame.annotationText && (\n <span className=\"min-w-0 break-all font-mono text-[11px] font-normal opacity-80\">\n {frame.annotationText}\n </span>\n )}\n </>\n ) : (\n <>\n {renderFramePart ? (\n renderFramePart(\"method\", frame, index)\n ) : (\n <span className=\"min-w-0 break-all font-mono font-semibold leading-4\">\n {methodName}\n </span>\n )}\n {frame.class && (\n renderFramePart ? (\n renderFramePart(\"class\", frame, index)\n ) : (\n <span className=\"min-w-0 break-all font-mono text-[11px] text-muted-foreground\">\n {frame.class}\n </span>\n )\n )}\n {frame.location && (\n renderFramePart ? (\n renderFramePart(\"location\", frame, index)\n ) : (\n <span className=\"rounded border border-border bg-muted/40 px-1.5 py-px font-mono text-[10px] text-muted-foreground\">\n {frame.location}\n </span>\n )\n )}\n </>\n )}\n </div>\n </div>\n\n {actions ? (\n <div\n className={[\n \"flex shrink-0 items-start gap-1\",\n frameActionsVisibility === \"hover\"\n ? \"opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\"\n : \"opacity-100\",\n ].join(\" \")}\n >\n {actions}\n </div>\n ) : (\n <div />\n )}\n\n {!isAnnotation && frameHasSource(frame) ? (\n <div className=\"col-span-3\">\n <FrameSourceWindow frame={frame} />\n </div>\n ) : null}\n {detail ? <div className=\"col-start-2 col-span-2 min-w-0\">{detail}</div> : null}\n </div>\n );\n}\n\nfunction frameIcon(frame: ParsedThreadFrame) {\n switch (frame.kind) {\n case \"locked\":\n return UiLock;\n case \"waiting_to_lock\":\n return UiSync;\n case \"waiting_on\":\n case \"parking\":\n return UiWatch;\n default:\n break;\n }\n if (frame.nativeMethod) return UiChip;\n if (frame.runtime) return UiDebugStepOver;\n return frame.method || frame.class ? UiMethod : UiStackFrameDot;\n}\n"],"names":["jsxs","jsx","Icon","Fragment","frameHasSource","FrameSourceWindow","UiLock","UiSync","UiWatch","UiChip","UiDebugStepOver","UiMethod","UiStackFrameDot"],"mappings":";;;;;;;;;;;;;AAkDO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,yBAAyB;AAC3B,GAAuB;AACrB,QAAM,eAAe,MAAM,SAAS;AACpC,QAAM,aAAa,MAAM,eAAe,MAAM,UAAU,MAAM;AAC9D,QAAM,UAAU,6CAAe,OAAO;AACtC,QAAM,SAAS,CAAC,eAAe,uDAAoB,OAAO,SAAS;AAEnE,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY,wCAAwC;AAAA,QACpD,MAAM,UAAU,0BAA0B;AAAA,MAAA,EAC1C,KAAK,GAAG;AAAA,MAEV,UAAA;AAAA,QAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,yFACZ,UAAA;AAAA,UAAA,aAAaC,2BAAAA,IAAC,QAAA,EAAK,oBAAgB,MAAE,kBAAQ,GAAE;AAAA,yCAC/CC,KAAAA,MAAA,EAAK,MAAM,UAAU,KAAK,GAAG,WAAU,6BAAA,CAA6B;AAAA,QAAA,GACvE;AAAA,QAEAD,2BAAAA,IAAC,SAAI,WAAU,WACb,yCAAC,OAAA,EAAI,WAAU,2DACZ,UAAA,eACCD,2BAAAA,KAAAG,WAAAA,UAAA,EACE,UAAA;AAAA,UAAAF,2BAAAA,IAAC,QAAA,EAAK,WAAU,kEACb,UAAA,MAAM,cACT;AAAA,UACC,MAAM,kBACLA,2BAAAA,IAAC,UAAK,WAAU,kEACb,gBAAM,eAAA,CACT;AAAA,QAAA,EAAA,CAEJ,IAEAD,2BAAAA,KAAAG,WAAAA,UAAA,EACG,UAAA;AAAA,UAAA,kBACC,gBAAgB,UAAU,OAAO,KAAK,IAEtCF,2BAAAA,IAAC,QAAA,EAAK,WAAU,uDACb,UAAA,WAAA,CACH;AAAA,UAED,MAAM,UACL,kBACE,gBAAgB,SAAS,OAAO,KAAK,IAErCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,iEACb,gBAAM,MAAA,CACT;AAAA,UAGH,MAAM,aACL,kBACE,gBAAgB,YAAY,OAAO,KAAK,IAExCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,qGACb,gBAAM,UACT;AAAA,QAAA,EAAA,CAGN,GAEJ,GACF;AAAA,QAEC,UACCA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,2BAA2B,UACvB,kFACA;AAAA,YAAA,EACJ,KAAK,GAAG;AAAA,YAET,UAAA;AAAA,UAAA;AAAA,QAAA,mCAGF,OAAA,EAAI;AAAA,QAGN,CAAC,gBAAgBG,wBAAAA,eAAe,KAAK,IACpCH,2BAAAA,IAAC,OAAA,EAAI,WAAU,cACb,UAAAA,2BAAAA,IAACI,kBAAAA,mBAAA,EAAkB,MAAA,CAAc,GACnC,IACE;AAAA,QACH,SAASJ,2BAAAA,IAAC,OAAA,EAAI,WAAU,kCAAkC,kBAAO,IAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGjF;AAEA,SAAS,UAAU,OAA0B;AAC3C,UAAQ,MAAM,MAAA;AAAA,IACZ,KAAK;AACH,aAAOK,OAAAA;AAAAA,IACT,KAAK;AACH,aAAOC,OAAAA;AAAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAOC,QAAAA;AAAAA,EAEP;AAEJ,MAAI,MAAM,aAAc,QAAOC,OAAAA;AAC/B,MAAI,MAAM,QAAS,QAAOC,gBAAAA;AAC1B,SAAO,MAAM,UAAU,MAAM,QAAQC,SAAAA,WAAWC,gBAAAA;AAClD;;"}
@@ -26,13 +26,13 @@ function StackFrameRow({
26
26
  "div",
27
27
  {
28
28
  className: [
29
- "group grid gap-2 px-3 py-1.5 text-xs",
29
+ "group grid gap-x-2 gap-y-0.5 px-3 py-0.5 text-xs",
30
30
  showIndex ? "grid-cols-[2rem_minmax(0,1fr)_auto]" : "grid-cols-[1.25rem_minmax(0,1fr)_auto]",
31
31
  frame.runtime ? "text-muted-foreground" : "text-foreground"
32
32
  ].join(" "),
33
33
  children: [
34
34
  /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-end gap-1 pt-0.5 font-mono text-[10px] text-muted-foreground", children: [
35
- showIndex && /* @__PURE__ */ jsx("span", { children: index + 1 }),
35
+ showIndex && /* @__PURE__ */ jsx("span", { "data-frame-index": true, children: index + 1 }),
36
36
  /* @__PURE__ */ jsx(Icon, { icon: frameIcon(frame), className: "mt-px shrink-0 text-[11px]" })
37
37
  ] }),
38
38
  /* @__PURE__ */ jsx("div", { className: "min-w-0", children: /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5", children: isAnnotation ? /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -54,7 +54,7 @@ function StackFrameRow({
54
54
  }
55
55
  ) : /* @__PURE__ */ jsx("div", {}),
56
56
  !isAnnotation && frameHasSource(frame) ? /* @__PURE__ */ jsx("div", { className: "col-span-3", children: /* @__PURE__ */ jsx(FrameSourceWindow, { frame }) }) : null,
57
- detail ? /* @__PURE__ */ jsx("div", { className: "col-span-3", children: detail }) : null
57
+ detail ? /* @__PURE__ */ jsx("div", { className: "col-start-2 col-span-2 min-w-0", children: detail }) : null
58
58
  ]
59
59
  }
60
60
  );
@@ -1 +1 @@
1
- {"version":3,"file":"StackFrameRow.js","sources":["../../../src/data/diagnostics/StackFrameRow.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport {\n UiChip,\n UiDebugStepOver,\n UiLock,\n UiMethod,\n UiStackFrameDot,\n UiSync,\n UiWatch,\n} from \"../../icons\";\nimport { FrameSourceWindow } from \"./FrameSourceWindow\";\nimport { frameHasSource } from \"./FrameSourceWindow.utils\";\nimport type { ParsedThreadFrame } from \"./jvm-stacktrace\";\n\n// StackFrameActions renders trailing per-frame affordances. It is a slot: the\n// shared library never knows what the actions do, only where they go.\nexport type StackFrameActions = (frame: ParsedThreadFrame, index: number) => ReactNode;\nexport type StackFramePart = \"method\" | \"class\" | \"location\";\nexport type StackFramePartRenderer = (\n part: StackFramePart,\n frame: ParsedThreadFrame,\n index: number,\n) => ReactNode;\nexport type StackFrameDetailRenderer = (frame: ParsedThreadFrame, index: number) => ReactNode;\nexport type StackFrameActionsVisibility = \"hover\" | \"always\";\n\nexport interface StackFrameRowProps {\n frame: ParsedThreadFrame;\n index: number;\n /** Show the 1-based frame ordinal in the gutter. */\n showIndex?: boolean;\n /** Trailing actions for this frame, revealed on hover/focus. */\n frameActions?: StackFrameActions;\n /** Replace the method, class, or location label while preserving row layout. */\n renderFramePart?: StackFramePartRenderer;\n /** Additional detail rendered below an ordinary frame. */\n renderFrameDetail?: StackFrameDetailRenderer;\n /** Whether actions are hover-only or permanently visible. */\n frameActionsVisibility?: StackFrameActionsVisibility;\n}\n\n// StackFrameRow is THE stack-frame renderer. Both an exception dump (via\n// StackTrace) and a JVM thread dump (via JvmStackTrace) render their frames\n// through it, so a frame looks and behaves the same wherever it is shown.\n//\n// Thread dumps carry lock/monitor annotation entries alongside real frames —\n// `frame.kind !== \"frame\"` — which are rendered as their own muted rows with a\n// lock/wait icon and no source window. An exception dump simply never produces\n// them.\nexport function StackFrameRow({\n frame,\n index,\n showIndex = false,\n frameActions,\n renderFramePart,\n renderFrameDetail,\n frameActionsVisibility = \"hover\",\n}: StackFrameRowProps) {\n const isAnnotation = frame.kind !== \"frame\";\n const methodName = frame.displayName || frame.method || frame.functionName;\n const actions = frameActions?.(frame, index);\n const detail = !isAnnotation ? renderFrameDetail?.(frame, index) : null;\n\n return (\n <div\n className={[\n \"group grid gap-2 px-3 py-1.5 text-xs\",\n showIndex ? \"grid-cols-[2rem_minmax(0,1fr)_auto]\" : \"grid-cols-[1.25rem_minmax(0,1fr)_auto]\",\n frame.runtime ? \"text-muted-foreground\" : \"text-foreground\",\n ].join(\" \")}\n >\n <div className=\"flex items-start justify-end gap-1 pt-0.5 font-mono text-[10px] text-muted-foreground\">\n {showIndex && <span>{index + 1}</span>}\n <Icon icon={frameIcon(frame)} className=\"mt-px shrink-0 text-[11px]\" />\n </div>\n\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5\">\n {isAnnotation ? (\n <>\n <span className=\"min-w-0 break-all font-mono font-semibold leading-4 opacity-70\">\n {frame.functionName}\n </span>\n {frame.annotationText && (\n <span className=\"min-w-0 break-all font-mono text-[11px] font-normal opacity-80\">\n {frame.annotationText}\n </span>\n )}\n </>\n ) : (\n <>\n {renderFramePart ? (\n renderFramePart(\"method\", frame, index)\n ) : (\n <span className=\"min-w-0 break-all font-mono font-semibold leading-4\">\n {methodName}\n </span>\n )}\n {frame.class && (\n renderFramePart ? (\n renderFramePart(\"class\", frame, index)\n ) : (\n <span className=\"min-w-0 break-all font-mono text-[11px] text-muted-foreground\">\n {frame.class}\n </span>\n )\n )}\n {frame.location && (\n renderFramePart ? (\n renderFramePart(\"location\", frame, index)\n ) : (\n <span className=\"rounded border border-border bg-muted/40 px-1.5 py-px font-mono text-[10px] text-muted-foreground\">\n {frame.location}\n </span>\n )\n )}\n </>\n )}\n </div>\n </div>\n\n {actions ? (\n <div\n className={[\n \"flex shrink-0 items-start gap-1\",\n frameActionsVisibility === \"hover\"\n ? \"opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\"\n : \"opacity-100\",\n ].join(\" \")}\n >\n {actions}\n </div>\n ) : (\n <div />\n )}\n\n {!isAnnotation && frameHasSource(frame) ? (\n <div className=\"col-span-3\">\n <FrameSourceWindow frame={frame} />\n </div>\n ) : null}\n {detail ? <div className=\"col-span-3\">{detail}</div> : null}\n </div>\n );\n}\n\nfunction frameIcon(frame: ParsedThreadFrame) {\n switch (frame.kind) {\n case \"locked\":\n return UiLock;\n case \"waiting_to_lock\":\n return UiSync;\n case \"waiting_on\":\n case \"parking\":\n return UiWatch;\n default:\n break;\n }\n if (frame.nativeMethod) return UiChip;\n if (frame.runtime) return UiDebugStepOver;\n return frame.method || frame.class ? UiMethod : UiStackFrameDot;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAkDO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,yBAAyB;AAC3B,GAAuB;AACrB,QAAM,eAAe,MAAM,SAAS;AACpC,QAAM,aAAa,MAAM,eAAe,MAAM,UAAU,MAAM;AAC9D,QAAM,UAAU,6CAAe,OAAO;AACtC,QAAM,SAAS,CAAC,eAAe,uDAAoB,OAAO,SAAS;AAEnE,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY,wCAAwC;AAAA,QACpD,MAAM,UAAU,0BAA0B;AAAA,MAAA,EAC1C,KAAK,GAAG;AAAA,MAEV,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,yFACZ,UAAA;AAAA,UAAA,aAAa,oBAAC,QAAA,EAAM,UAAA,QAAQ,GAAE;AAAA,8BAC9B,MAAA,EAAK,MAAM,UAAU,KAAK,GAAG,WAAU,6BAAA,CAA6B;AAAA,QAAA,GACvE;AAAA,QAEA,oBAAC,SAAI,WAAU,WACb,8BAAC,OAAA,EAAI,WAAU,2DACZ,UAAA,eACC,qBAAA,UAAA,EACE,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAU,kEACb,UAAA,MAAM,cACT;AAAA,UACC,MAAM,kBACL,oBAAC,UAAK,WAAU,kEACb,gBAAM,eAAA,CACT;AAAA,QAAA,EAAA,CAEJ,IAEA,qBAAA,UAAA,EACG,UAAA;AAAA,UAAA,kBACC,gBAAgB,UAAU,OAAO,KAAK,IAEtC,oBAAC,QAAA,EAAK,WAAU,uDACb,UAAA,WAAA,CACH;AAAA,UAED,MAAM,UACL,kBACE,gBAAgB,SAAS,OAAO,KAAK,IAErC,oBAAC,QAAA,EAAK,WAAU,iEACb,gBAAM,MAAA,CACT;AAAA,UAGH,MAAM,aACL,kBACE,gBAAgB,YAAY,OAAO,KAAK,IAExC,oBAAC,QAAA,EAAK,WAAU,qGACb,gBAAM,UACT;AAAA,QAAA,EAAA,CAGN,GAEJ,GACF;AAAA,QAEC,UACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,2BAA2B,UACvB,kFACA;AAAA,YAAA,EACJ,KAAK,GAAG;AAAA,YAET,UAAA;AAAA,UAAA;AAAA,QAAA,wBAGF,OAAA,EAAI;AAAA,QAGN,CAAC,gBAAgB,eAAe,KAAK,IACpC,oBAAC,OAAA,EAAI,WAAU,cACb,UAAA,oBAAC,mBAAA,EAAkB,MAAA,CAAc,GACnC,IACE;AAAA,QACH,SAAS,oBAAC,OAAA,EAAI,WAAU,cAAc,kBAAO,IAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG7D;AAEA,SAAS,UAAU,OAA0B;AAC3C,UAAQ,MAAM,MAAA;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,EAEP;AAEJ,MAAI,MAAM,aAAc,QAAO;AAC/B,MAAI,MAAM,QAAS,QAAO;AAC1B,SAAO,MAAM,UAAU,MAAM,QAAQ,WAAW;AAClD;"}
1
+ {"version":3,"file":"StackFrameRow.js","sources":["../../../src/data/diagnostics/StackFrameRow.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport {\n UiChip,\n UiDebugStepOver,\n UiLock,\n UiMethod,\n UiStackFrameDot,\n UiSync,\n UiWatch,\n} from \"../../icons\";\nimport { FrameSourceWindow } from \"./FrameSourceWindow\";\nimport { frameHasSource } from \"./FrameSourceWindow.utils\";\nimport type { ParsedThreadFrame } from \"./jvm-stacktrace\";\n\n// StackFrameActions renders trailing per-frame affordances. It is a slot: the\n// shared library never knows what the actions do, only where they go.\nexport type StackFrameActions = (frame: ParsedThreadFrame, index: number) => ReactNode;\nexport type StackFramePart = \"method\" | \"class\" | \"location\";\nexport type StackFramePartRenderer = (\n part: StackFramePart,\n frame: ParsedThreadFrame,\n index: number,\n) => ReactNode;\nexport type StackFrameDetailRenderer = (frame: ParsedThreadFrame, index: number) => ReactNode;\nexport type StackFrameActionsVisibility = \"hover\" | \"always\";\n\nexport interface StackFrameRowProps {\n frame: ParsedThreadFrame;\n index: number;\n /** Show the 1-based frame ordinal in the gutter. */\n showIndex?: boolean;\n /** Trailing actions for this frame, revealed on hover/focus. */\n frameActions?: StackFrameActions;\n /** Replace the method, class, or location label while preserving row layout. */\n renderFramePart?: StackFramePartRenderer;\n /** Additional detail rendered below an ordinary frame. */\n renderFrameDetail?: StackFrameDetailRenderer;\n /** Whether actions are hover-only or permanently visible. */\n frameActionsVisibility?: StackFrameActionsVisibility;\n}\n\n// StackFrameRow is THE stack-frame renderer. Both an exception dump (via\n// StackTrace) and a JVM thread dump (via JvmStackTrace) render their frames\n// through it, so a frame looks and behaves the same wherever it is shown.\n//\n// Thread dumps carry lock/monitor annotation entries alongside real frames —\n// `frame.kind !== \"frame\"` — which are rendered as their own muted rows with a\n// lock/wait icon and no source window. An exception dump simply never produces\n// them.\nexport function StackFrameRow({\n frame,\n index,\n showIndex = false,\n frameActions,\n renderFramePart,\n renderFrameDetail,\n frameActionsVisibility = \"hover\",\n}: StackFrameRowProps) {\n const isAnnotation = frame.kind !== \"frame\";\n const methodName = frame.displayName || frame.method || frame.functionName;\n const actions = frameActions?.(frame, index);\n const detail = !isAnnotation ? renderFrameDetail?.(frame, index) : null;\n\n return (\n <div\n className={[\n \"group grid gap-x-2 gap-y-0.5 px-3 py-0.5 text-xs\",\n showIndex ? \"grid-cols-[2rem_minmax(0,1fr)_auto]\" : \"grid-cols-[1.25rem_minmax(0,1fr)_auto]\",\n frame.runtime ? \"text-muted-foreground\" : \"text-foreground\",\n ].join(\" \")}\n >\n <div className=\"flex items-start justify-end gap-1 pt-0.5 font-mono text-[10px] text-muted-foreground\">\n {showIndex && <span data-frame-index>{index + 1}</span>}\n <Icon icon={frameIcon(frame)} className=\"mt-px shrink-0 text-[11px]\" />\n </div>\n\n <div className=\"min-w-0\">\n <div className=\"flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5\">\n {isAnnotation ? (\n <>\n <span className=\"min-w-0 break-all font-mono font-semibold leading-4 opacity-70\">\n {frame.functionName}\n </span>\n {frame.annotationText && (\n <span className=\"min-w-0 break-all font-mono text-[11px] font-normal opacity-80\">\n {frame.annotationText}\n </span>\n )}\n </>\n ) : (\n <>\n {renderFramePart ? (\n renderFramePart(\"method\", frame, index)\n ) : (\n <span className=\"min-w-0 break-all font-mono font-semibold leading-4\">\n {methodName}\n </span>\n )}\n {frame.class && (\n renderFramePart ? (\n renderFramePart(\"class\", frame, index)\n ) : (\n <span className=\"min-w-0 break-all font-mono text-[11px] text-muted-foreground\">\n {frame.class}\n </span>\n )\n )}\n {frame.location && (\n renderFramePart ? (\n renderFramePart(\"location\", frame, index)\n ) : (\n <span className=\"rounded border border-border bg-muted/40 px-1.5 py-px font-mono text-[10px] text-muted-foreground\">\n {frame.location}\n </span>\n )\n )}\n </>\n )}\n </div>\n </div>\n\n {actions ? (\n <div\n className={[\n \"flex shrink-0 items-start gap-1\",\n frameActionsVisibility === \"hover\"\n ? \"opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\"\n : \"opacity-100\",\n ].join(\" \")}\n >\n {actions}\n </div>\n ) : (\n <div />\n )}\n\n {!isAnnotation && frameHasSource(frame) ? (\n <div className=\"col-span-3\">\n <FrameSourceWindow frame={frame} />\n </div>\n ) : null}\n {detail ? <div className=\"col-start-2 col-span-2 min-w-0\">{detail}</div> : null}\n </div>\n );\n}\n\nfunction frameIcon(frame: ParsedThreadFrame) {\n switch (frame.kind) {\n case \"locked\":\n return UiLock;\n case \"waiting_to_lock\":\n return UiSync;\n case \"waiting_on\":\n case \"parking\":\n return UiWatch;\n default:\n break;\n }\n if (frame.nativeMethod) return UiChip;\n if (frame.runtime) return UiDebugStepOver;\n return frame.method || frame.class ? UiMethod : UiStackFrameDot;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAkDO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,yBAAyB;AAC3B,GAAuB;AACrB,QAAM,eAAe,MAAM,SAAS;AACpC,QAAM,aAAa,MAAM,eAAe,MAAM,UAAU,MAAM;AAC9D,QAAM,UAAU,6CAAe,OAAO;AACtC,QAAM,SAAS,CAAC,eAAe,uDAAoB,OAAO,SAAS;AAEnE,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY,wCAAwC;AAAA,QACpD,MAAM,UAAU,0BAA0B;AAAA,MAAA,EAC1C,KAAK,GAAG;AAAA,MAEV,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,yFACZ,UAAA;AAAA,UAAA,aAAa,oBAAC,QAAA,EAAK,oBAAgB,MAAE,kBAAQ,GAAE;AAAA,8BAC/C,MAAA,EAAK,MAAM,UAAU,KAAK,GAAG,WAAU,6BAAA,CAA6B;AAAA,QAAA,GACvE;AAAA,QAEA,oBAAC,SAAI,WAAU,WACb,8BAAC,OAAA,EAAI,WAAU,2DACZ,UAAA,eACC,qBAAA,UAAA,EACE,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAU,kEACb,UAAA,MAAM,cACT;AAAA,UACC,MAAM,kBACL,oBAAC,UAAK,WAAU,kEACb,gBAAM,eAAA,CACT;AAAA,QAAA,EAAA,CAEJ,IAEA,qBAAA,UAAA,EACG,UAAA;AAAA,UAAA,kBACC,gBAAgB,UAAU,OAAO,KAAK,IAEtC,oBAAC,QAAA,EAAK,WAAU,uDACb,UAAA,WAAA,CACH;AAAA,UAED,MAAM,UACL,kBACE,gBAAgB,SAAS,OAAO,KAAK,IAErC,oBAAC,QAAA,EAAK,WAAU,iEACb,gBAAM,MAAA,CACT;AAAA,UAGH,MAAM,aACL,kBACE,gBAAgB,YAAY,OAAO,KAAK,IAExC,oBAAC,QAAA,EAAK,WAAU,qGACb,gBAAM,UACT;AAAA,QAAA,EAAA,CAGN,GAEJ,GACF;AAAA,QAEC,UACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,2BAA2B,UACvB,kFACA;AAAA,YAAA,EACJ,KAAK,GAAG;AAAA,YAET,UAAA;AAAA,UAAA;AAAA,QAAA,wBAGF,OAAA,EAAI;AAAA,QAGN,CAAC,gBAAgB,eAAe,KAAK,IACpC,oBAAC,OAAA,EAAI,WAAU,cACb,UAAA,oBAAC,mBAAA,EAAkB,MAAA,CAAc,GACnC,IACE;AAAA,QACH,SAAS,oBAAC,OAAA,EAAI,WAAU,kCAAkC,kBAAO,IAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGjF;AAEA,SAAS,UAAU,OAA0B;AAC3C,UAAQ,MAAM,MAAA;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,EAEP;AAEJ,MAAI,MAAM,aAAc,QAAO;AAC/B,MAAI,MAAM,QAAS,QAAO;AAC1B,SAAO,MAAM,UAAU,MAAM,QAAQ,WAAW;AAClD;"}
@@ -106,7 +106,9 @@ function GitDiffPanel({
106
106
  error,
107
107
  emptyLabel = "No text diff available",
108
108
  className,
109
- maxHeightClassName = "max-h-[520px]"
109
+ maxHeightClassName = "max-h-[520px]",
110
+ onLineAction,
111
+ lineWidgets
110
112
  }) {
111
113
  if (loading) {
112
114
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils.cn("border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground", className), children: "Loading diff..." });
@@ -129,7 +131,9 @@ function GitDiffPanel({
129
131
  bare: true,
130
132
  unified: payload.diff,
131
133
  className: utils.cn("overflow-auto px-1 py-2", maxHeightClassName),
132
- ...language ? { language } : {}
134
+ ...language ? { language } : {},
135
+ ...onLineAction ? { onLineAction } : {},
136
+ ...lineWidgets ? { lineWidgets } : {}
133
137
  }
134
138
  )
135
139
  ] });
@@ -1 +1 @@
1
- {"version":3,"file":"GitChangeList.cjs","sources":["../../../src/data/git/GitChangeList.tsx"],"sourcesContent":["import { useMemo, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n UiChevronDown,\n UiChevronRight,\n UiClock,\n UiCode2,\n UiDiff,\n UiFile,\n UiFileCode,\n UiFilePlus,\n UiGitCommit,\n UiLinkExternal,\n UiRemove,\n} from \"../../icons\";\nimport type { IconComponent } from \"../../icons/types\";\nimport { CodeDiff } from \"../CodeDiff\";\nimport { languageFromPath } from \"../code-highlight\";\nimport { dateKey, formatFallbackTime, formatGitCommitDateHeader } from \"./git-dates\";\n\nexport type GitDiffPayload = {\n diff: string;\n truncated?: boolean;\n binary?: boolean;\n path?: string;\n commit?: string;\n};\n\nexport type GitDiffLoader<T> = (item: T) => Promise<GitDiffPayload>;\n\nexport type GitCommitItem = {\n id?: string;\n sha: string;\n shortSha?: string;\n title: string;\n body?: string;\n authorName?: string;\n authorLogin?: string;\n authorAvatarUrl?: string;\n committedAt?: string;\n additions?: number;\n deletions?: number;\n changedFiles?: number;\n href?: string;\n};\n\nexport type GitFileChangeStatus =\n | \"added\"\n | \"modified\"\n | \"deleted\"\n | \"renamed\"\n | \"copied\"\n | string;\n\nexport type GitFileChangeItem = {\n id?: string;\n path: string;\n previousPath?: string;\n status?: GitFileChangeStatus;\n additions?: number;\n deletions?: number;\n href?: string;\n binary?: boolean;\n};\n\ntype DiffState = {\n loading: boolean;\n payload: GitDiffPayload | null;\n error: string;\n};\n\nexport type GitDiffPanelProps = {\n loading?: boolean;\n payload?: GitDiffPayload | null;\n error?: string;\n emptyLabel?: string;\n className?: string;\n maxHeightClassName?: string;\n};\n\nexport type GitCommitListProps = {\n commits: GitCommitItem[];\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n groupByDate?: boolean;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\nexport type GitFileListProps = {\n files: GitFileChangeItem[];\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\ntype CommitGroup = {\n key: string;\n label: string;\n commits: GitCommitItem[];\n};\n\nconst DIFF_INITIAL_STATE: DiffState = {\n loading: false,\n payload: null,\n error: \"\",\n};\n\nfunction messageFromError(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === \"string\") return error;\n return \"Failed to load diff\";\n}\n\nfunction isActivationKey(event: KeyboardEvent<HTMLDivElement>): boolean {\n return event.key === \"Enter\" || event.key === \" \";\n}\n\nfunction groupCommits(commits: GitCommitItem[], enabled: boolean): CommitGroup[] {\n if (!enabled) return [{ key: \"all\", label: \"\", commits }];\n const groups: CommitGroup[] = [];\n const indexByKey = new Map<string, number>();\n for (const commit of commits) {\n const key = dateKey(commit.committedAt);\n const existing = indexByKey.get(key);\n if (existing != null) {\n groups[existing]?.commits.push(commit);\n continue;\n }\n indexByKey.set(key, groups.length);\n groups.push({\n key,\n label: formatGitCommitDateHeader(commit.committedAt),\n commits: [commit],\n });\n }\n return groups;\n}\n\nfunction shortSha(commit: GitCommitItem): string {\n return commit.shortSha || commit.sha.slice(0, 7);\n}\n\nfunction displayAuthor(commit: GitCommitItem): string {\n return commit.authorLogin || commit.authorName || \"\";\n}\n\nfunction statText(additions?: number, deletions?: number): ReactNode {\n const adds = additions ?? 0;\n const dels = deletions ?? 0;\n if (adds === 0 && dels === 0) return null;\n return (\n <>\n <span aria-hidden>·</span>\n {adds > 0 && <span className=\"text-emerald-600 dark:text-emerald-400\">+{adds}</span>}\n {dels > 0 && <span className=\"text-rose-600 dark:text-rose-400\">-{dels}</span>}\n </>\n );\n}\n\nfunction useLazyDiff<T>(item: T, loader: GitDiffLoader<T> | undefined): [boolean, DiffState, () => void] {\n const [expanded, setExpanded] = useState(false);\n const [state, setState] = useState<DiffState>(DIFF_INITIAL_STATE);\n\n function toggle() {\n setExpanded(open => !open);\n if (!expanded && loader && !state.payload && !state.loading && !state.error) {\n setState({ loading: true, payload: null, error: \"\" });\n loader(item)\n .then(payload => setState({ loading: false, payload, error: \"\" }))\n .catch(error => setState({ loading: false, payload: null, error: messageFromError(error) }));\n }\n }\n\n return [expanded, state, toggle];\n}\n\nfunction Chevron({ expanded }: { expanded: boolean }) {\n const Icon = expanded ? UiChevronDown : UiChevronRight;\n return <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />;\n}\n\nfunction AvatarImage({ src, alt }: { src: string; alt: string }) {\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-4 w-4 rounded-full border border-border object-cover\"\n loading=\"lazy\"\n />\n );\n}\n\nexport function GitDiffPanel({\n loading,\n payload,\n error,\n emptyLabel = \"No text diff available\",\n className,\n maxHeightClassName = \"max-h-[520px]\",\n}: GitDiffPanelProps) {\n if (loading) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Loading diff...\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"border-t border-border bg-rose-50 px-3 py-3 text-xs text-rose-700 dark:bg-rose-950/30 dark:text-rose-300\", className)}>\n {error}\n </div>\n );\n }\n\n if (payload?.binary) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Binary file not shown.\n </div>\n );\n }\n\n if (!payload?.diff) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n {emptyLabel}\n </div>\n );\n }\n\n const language = languageFromPath(payload.path);\n return (\n <div className={cn(\"border-t border-border\", className)}>\n {payload.truncated && (\n <div className=\"border-b border-border bg-amber-100/70 px-3 py-1.5 text-xs text-amber-800 [[data-theme=dark]_&]:bg-amber-950/40 [[data-theme=dark]_&]:text-amber-200\">\n Diff truncated.\n </div>\n )}\n <CodeDiff\n bare\n unified={payload.diff}\n className={cn(\"overflow-auto px-1 py-2\", maxHeightClassName)}\n {...(language ? { language } : {})}\n />\n </div>\n );\n}\n\nfunction CommitRow({\n commit,\n loadDiff,\n renderTime,\n diffMaxHeightClassName,\n}: {\n commit: GitCommitItem;\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(commit, loadDiff);\n const author = displayAuthor(commit);\n const canExpand = Boolean(loadDiff || commit.body);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-14 items-start gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <UiGitCommit className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-foreground\" title={commit.title}>\n {commit.title}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5 text-muted-foreground\">\n {commit.authorAvatarUrl && (\n <AvatarImage src={commit.authorAvatarUrl} alt={author || \"Commit author\"} />\n )}\n {author && <span>{author}</span>}\n {commit.committedAt && (\n <>\n <span aria-hidden>·</span>\n <span className=\"inline-flex items-center gap-1\">\n <UiClock className=\"h-3 w-3\" />\n {renderTime ? renderTime(commit.committedAt) : formatFallbackTime(commit.committedAt)}\n </span>\n </>\n )}\n {statText(commit.additions, commit.deletions)}\n {(commit.changedFiles ?? 0) > 0 && (\n <>\n <span aria-hidden>·</span>\n <span>{commit.changedFiles} files</span>\n </>\n )}\n </div>\n </div>\n {commit.href ? (\n <a\n href={commit.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-0.5 inline-flex shrink-0 items-center gap-1 font-mono text-cyan-600 hover:underline\"\n onClick={event => event.stopPropagation()}\n >\n {shortSha(commit)}\n <UiLinkExternal className=\"h-3 w-3\" />\n </a>\n ) : (\n <span className=\"mt-0.5 shrink-0 font-mono text-cyan-600\">{shortSha(commit)}</span>\n )}\n {canExpand && (\n <span className=\"mt-1 shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <div className=\"border-t border-border bg-secondary/50\">\n {commit.body && (\n <pre className=\"mx-3 my-2 whitespace-pre-wrap rounded bg-muted px-3 py-2 font-mono text-[11px] leading-5 text-muted-foreground\">\n {commit.body}\n </pre>\n )}\n {loadDiff && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function GitCommitList({\n commits,\n loadDiff,\n renderTime,\n groupByDate = true,\n emptyLabel = \"No commits found\",\n className,\n diffMaxHeightClassName,\n}: GitCommitListProps) {\n const groups = useMemo(() => groupCommits(commits, groupByDate), [commits, groupByDate]);\n\n if (commits.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n {groups.map(group => (\n <section key={group.key} aria-label={group.label || \"Commits\"}>\n {group.label && (\n <div className=\"border-b border-border bg-muted/60 px-3 py-2 text-xs font-semibold text-foreground\">\n {group.label}\n </div>\n )}\n <div className=\"divide-y divide-border\">\n {group.commits.map(commit => (\n <CommitRow\n key={commit.id || commit.sha}\n commit={commit}\n {...(loadDiff ? { loadDiff } : {})}\n {...(renderTime ? { renderTime } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n\ntype StatusView = {\n label: string;\n icon: IconComponent;\n iconClassName: string;\n};\n\nfunction normalizedStatus(status?: string): string {\n return (status || \"modified\").toLowerCase();\n}\n\nfunction statusView(status?: string): StatusView {\n switch (normalizedStatus(status)) {\n case \"added\":\n return { label: \"Added\", icon: UiFilePlus, iconClassName: \"text-emerald-600 dark:text-emerald-400\" };\n case \"deleted\":\n return { label: \"Deleted\", icon: UiRemove, iconClassName: \"text-rose-600 dark:text-rose-400\" };\n case \"renamed\":\n return { label: \"Renamed\", icon: UiFileCode, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n case \"copied\":\n return { label: \"Copied\", icon: UiCode2, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n default:\n return { label: \"Modified\", icon: UiFile, iconClassName: \"text-amber-600 dark:text-amber-400\" };\n }\n}\n\nfunction splitPath(path: string): { directory: string; basename: string } {\n const index = path.lastIndexOf(\"/\");\n if (index < 0) return { directory: \"\", basename: path };\n return { directory: `${path.slice(0, index)}/`, basename: path.slice(index + 1) };\n}\n\nfunction DiffBars({ additions = 0, deletions = 0 }: { additions?: number; deletions?: number }) {\n const total = additions + deletions;\n const maxBars = 5;\n const addBars = total > 0 ? Math.round((additions / total) * maxBars) : 0;\n const delBars = total > 0 ? maxBars - addBars : 0;\n return (\n <span className=\"inline-flex gap-px\" aria-hidden>\n {Array.from({ length: addBars }).map((_, index) => (\n <span key={`a${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-emerald-500\" />\n ))}\n {Array.from({ length: delBars }).map((_, index) => (\n <span key={`d${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-rose-500\" />\n ))}\n {total === 0 && <span className=\"inline-block h-2 w-1.5 rounded-sm bg-muted-foreground/30\" />}\n </span>\n );\n}\n\nfunction FileRow({\n file,\n loadDiff,\n diffMaxHeightClassName,\n}: {\n file: GitFileChangeItem;\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(file, loadDiff);\n const status = statusView(file.status);\n const StatusIcon = status.icon;\n const path = splitPath(file.path);\n const canExpand = Boolean(loadDiff);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-11 items-center gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <StatusIcon className={cn(\"h-4 w-4 shrink-0\", status.iconClassName)} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-mono text-foreground\" title={file.path}>\n {path.directory && <span className=\"text-muted-foreground\">{path.directory}</span>}\n <span>{path.basename}</span>\n </div>\n {file.previousPath && (\n <div className=\"mt-0.5 truncate font-mono text-[11px] text-muted-foreground\">\n from {file.previousPath}\n </div>\n )}\n </div>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">{status.label}</span>\n <span className=\"shrink-0 tabular-nums text-emerald-600 dark:text-emerald-400\">\n +{file.additions ?? 0}\n </span>\n <span className=\"shrink-0 tabular-nums text-rose-600 dark:text-rose-400\">\n -{file.deletions ?? 0}\n </span>\n <DiffBars\n {...(file.additions !== undefined ? { additions: file.additions } : {})}\n {...(file.deletions !== undefined ? { deletions: file.deletions } : {})}\n />\n {file.href && (\n <a\n href={file.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={event => event.stopPropagation()}\n aria-label={`Open ${file.path}`}\n >\n <UiLinkExternal className=\"h-3.5 w-3.5\" />\n </a>\n )}\n {canExpand && (\n <span className=\"shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n );\n}\n\nexport function GitFileList({\n files,\n loadDiff,\n emptyLabel = \"No changed files found\",\n className,\n diffMaxHeightClassName,\n}: GitFileListProps) {\n if (files.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n <div className=\"divide-y divide-border\">\n {files.map(file => (\n <FileRow\n key={file.id || file.path}\n file={file}\n {...(loadDiff ? { loadDiff } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </div>\n );\n}\n\nexport function GitChangedFilesSummary({\n files,\n additions,\n deletions,\n className,\n}: {\n files: number;\n additions: number;\n deletions: number;\n className?: string;\n}) {\n return (\n <div className={cn(\"flex items-center gap-2 text-xs text-muted-foreground\", className)}>\n <span className=\"inline-flex items-center gap-1 font-medium\">\n <UiDiff className=\"h-3.5 w-3.5\" />\n {files} file{files === 1 ? \"\" : \"s\"} changed\n </span>\n <span aria-hidden>·</span>\n <span className=\"text-emerald-600 dark:text-emerald-400\">+{additions}</span>\n <span className=\"text-rose-600 dark:text-rose-400\">-{deletions}</span>\n </div>\n );\n}\n"],"names":["dateKey","formatGitCommitDateHeader","jsxs","Fragment","jsx","useState","UiChevronDown","UiChevronRight","cn","languageFromPath","CodeDiff","UiGitCommit","UiClock","formatFallbackTime","UiLinkExternal","useMemo","UiFilePlus","UiRemove","UiFileCode","UiCode2","UiFile","UiDiff"],"mappings":";;;;;;;;;;;;;;;;;;;AAwGA,MAAM,qBAAgC;AAAA,EACpC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT;AAEA,SAAS,iBAAiB,OAAwB;AAChD,MAAI,iBAAiB,MAAO,QAAO,MAAM;AACzC,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA+C;AACtE,SAAO,MAAM,QAAQ,WAAW,MAAM,QAAQ;AAChD;AAEA,SAAS,aAAa,SAA0B,SAAiC;;AAC/E,MAAI,CAAC,QAAS,QAAO,CAAC,EAAE,KAAK,OAAO,OAAO,IAAI,SAAS;AACxD,QAAM,SAAwB,CAAA;AAC9B,QAAM,iCAAiB,IAAA;AACvB,aAAW,UAAU,SAAS;AAC5B,UAAM,MAAMA,SAAAA,QAAQ,OAAO,WAAW;AACtC,UAAM,WAAW,WAAW,IAAI,GAAG;AACnC,QAAI,YAAY,MAAM;AACpB,mBAAO,QAAQ,MAAf,mBAAkB,QAAQ,KAAK;AAC/B;AAAA,IACF;AACA,eAAW,IAAI,KAAK,OAAO,MAAM;AACjC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,OAAOC,SAAAA,0BAA0B,OAAO,WAAW;AAAA,MACnD,SAAS,CAAC,MAAM;AAAA,IAAA,CACjB;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,SAAS,QAA+B;AAC/C,SAAO,OAAO,YAAY,OAAO,IAAI,MAAM,GAAG,CAAC;AACjD;AAEA,SAAS,cAAc,QAA+B;AACpD,SAAO,OAAO,eAAe,OAAO,cAAc;AACpD;AAEA,SAAS,SAAS,WAAoB,WAA+B;AACnE,QAAM,OAAO,aAAa;AAC1B,QAAM,OAAO,aAAa;AAC1B,MAAI,SAAS,KAAK,SAAS,EAAG,QAAO;AACrC,SACEC,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,eAAW,MAAC,UAAA,KAAC;AAAA,IAClB,OAAO,KAAKF,gCAAC,QAAA,EAAK,WAAU,0CAAyC,UAAA;AAAA,MAAA;AAAA,MAAE;AAAA,IAAA,GAAK;AAAA,IAC5E,OAAO,KAAKA,gCAAC,QAAA,EAAK,WAAU,oCAAmC,UAAA;AAAA,MAAA;AAAA,MAAE;AAAA,IAAA,EAAA,CAAK;AAAA,EAAA,GACzE;AAEJ;AAEA,SAAS,YAAe,MAAS,QAAwE;AACvG,QAAM,CAAC,UAAU,WAAW,IAAIG,MAAAA,SAAS,KAAK;AAC9C,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAoB,kBAAkB;AAEhE,WAAS,SAAS;AAChB,gBAAY,CAAA,SAAQ,CAAC,IAAI;AACzB,QAAI,CAAC,YAAY,UAAU,CAAC,MAAM,WAAW,CAAC,MAAM,WAAW,CAAC,MAAM,OAAO;AAC3E,eAAS,EAAE,SAAS,MAAM,SAAS,MAAM,OAAO,IAAI;AACpD,aAAO,IAAI,EACR,KAAK,CAAA,YAAW,SAAS,EAAE,SAAS,OAAO,SAAS,OAAO,GAAA,CAAI,CAAC,EAChE,MAAM,CAAA,UAAS,SAAS,EAAE,SAAS,OAAO,SAAS,MAAM,OAAO,iBAAiB,KAAK,EAAA,CAAG,CAAC;AAAA,IAC/F;AAAA,EACF;AAEA,SAAO,CAAC,UAAU,OAAO,MAAM;AACjC;AAEA,SAAS,QAAQ,EAAE,YAAmC;AACpD,QAAM,OAAO,WAAWC,cAAAA,gBAAgBC,eAAAA;AACxC,SAAOH,2BAAAA,IAAC,MAAA,EAAK,WAAU,oCAAA,CAAoC;AAC7D;AAEA,SAAS,YAAY,EAAE,KAAK,OAAqC;AAC/D,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAU;AAAA,MACV,SAAQ;AAAA,IAAA;AAAA,EAAA;AAGd;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,qBAAqB;AACvB,GAAsB;AACpB,MAAI,SAAS;AACX,0CACG,OAAA,EAAI,WAAWI,MAAAA,GAAG,8EAA8E,SAAS,GAAG,UAAA,mBAE7G;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,0CACG,OAAA,EAAI,WAAWA,MAAAA,GAAG,4GAA4G,SAAS,GACrI,UAAA,OACH;AAAA,EAEJ;AAEA,MAAI,mCAAS,QAAQ;AACnB,0CACG,OAAA,EAAI,WAAWA,MAAAA,GAAG,8EAA8E,SAAS,GAAG,UAAA,0BAE7G;AAAA,EAEJ;AAEA,MAAI,EAAC,mCAAS,OAAM;AAClB,0CACG,OAAA,EAAI,WAAWA,MAAAA,GAAG,8EAA8E,SAAS,GACvG,UAAA,YACH;AAAA,EAEJ;AAEA,QAAM,WAAWC,cAAAA,iBAAiB,QAAQ,IAAI;AAC9C,yCACG,OAAA,EAAI,WAAWD,MAAAA,GAAG,0BAA0B,SAAS,GACnD,UAAA;AAAA,IAAA,QAAQ,aACPJ,2BAAAA,IAAC,OAAA,EAAI,WAAU,wJAAuJ,UAAA,mBAEtK;AAAA,IAEFA,2BAAAA;AAAAA,MAACM,SAAAA;AAAAA,MAAA;AAAA,QACC,MAAI;AAAA,QACJ,SAAS,QAAQ;AAAA,QACjB,WAAWF,MAAAA,GAAG,2BAA2B,kBAAkB;AAAA,QAC1D,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,MAAC;AAAA,IAAA;AAAA,EAClC,GACF;AAEJ;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,CAAC,UAAU,WAAW,MAAM,IAAI,YAAY,QAAQ,QAAQ;AAClE,QAAM,SAAS,cAAc,MAAM;AACnC,QAAM,YAAY,QAAQ,YAAY,OAAO,IAAI;AAEjD,WAAS,UAAU,OAAsC;AACvD,QAAI,CAAC,aAAa,CAAC,gBAAgB,KAAK,EAAG;AAC3C,UAAM,eAAA;AACN,WAAA;AAAA,EACF;AAEA,yCACG,OAAA,EACC,UAAA;AAAA,IAAAN,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,YAAY,WAAW;AAAA,QAC7B,UAAU,YAAY,IAAI;AAAA,QAC1B,WAAWM,MAAAA;AAAAA,UACT;AAAA,UACA,aAAa;AAAA,QAAA;AAAA,QAEf,SAAS,YAAY,SAAS;AAAA,QAC9B,WAAW,YAAY,YAAY;AAAA,QAEnC,UAAA;AAAA,UAAAJ,2BAAAA,IAAC,UAAK,WAAU,wGACd,yCAACO,YAAAA,aAAA,EAAY,WAAU,eAAc,EAAA,CACvC;AAAA,UACAT,2BAAAA,KAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAAE,2BAAAA,IAAC,SAAI,WAAU,wCAAuC,OAAO,OAAO,OACjE,iBAAO,MAAA,CACV;AAAA,YACAF,2BAAAA,KAAC,OAAA,EAAI,WAAU,kEACZ,UAAA;AAAA,cAAA,OAAO,kDACL,aAAA,EAAY,KAAK,OAAO,iBAAiB,KAAK,UAAU,gBAAA,CAAiB;AAAA,cAE3E,UAAUE,2BAAAA,IAAC,QAAA,EAAM,UAAA,OAAA,CAAO;AAAA,cACxB,OAAO,eACNF,2BAAAA,KAAAC,WAAAA,UAAA,EACE,UAAA;AAAA,gBAAAC,2BAAAA,IAAC,QAAA,EAAK,eAAW,MAAC,UAAA,KAAC;AAAA,gBACnBF,2BAAAA,KAAC,QAAA,EAAK,WAAU,kCACd,UAAA;AAAA,kBAAAE,2BAAAA,IAACQ,QAAAA,SAAA,EAAQ,WAAU,UAAA,CAAU;AAAA,kBAC5B,aAAa,WAAW,OAAO,WAAW,IAAIC,SAAAA,mBAAmB,OAAO,WAAW;AAAA,gBAAA,EAAA,CACtF;AAAA,cAAA,GACF;AAAA,cAED,SAAS,OAAO,WAAW,OAAO,SAAS;AAAA,eAC1C,OAAO,gBAAgB,KAAK,KAC5BX,gCAAAC,WAAAA,UAAA,EACE,UAAA;AAAA,gBAAAC,2BAAAA,IAAC,QAAA,EAAK,eAAW,MAAC,UAAA,KAAC;AAAA,gDAClB,QAAA,EAAM,UAAA;AAAA,kBAAA,OAAO;AAAA,kBAAa;AAAA,gBAAA,EAAA,CAAM;AAAA,cAAA,EAAA,CACnC;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,GACF;AAAA,UACC,OAAO,OACNF,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAM,OAAO;AAAA,cACb,QAAO;AAAA,cACP,KAAI;AAAA,cACJ,WAAU;AAAA,cACV,SAAS,CAAA,UAAS,MAAM,gBAAA;AAAA,cAEvB,UAAA;AAAA,gBAAA,SAAS,MAAM;AAAA,gBAChBE,2BAAAA,IAACU,eAAAA,gBAAA,EAAe,WAAU,UAAA,CAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,IAGtCV,2BAAAA,IAAC,QAAA,EAAK,WAAU,2CAA2C,UAAA,SAAS,MAAM,GAAE;AAAA,UAE7E,4CACE,QAAA,EAAK,WAAU,iBACd,UAAAA,+BAAC,SAAA,EAAQ,UAAoB,EAAA,CAC/B;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGH,YACCF,2BAAAA,KAAC,OAAA,EAAI,WAAU,0CACZ,UAAA;AAAA,MAAA,OAAO,QACNE,2BAAAA,IAAC,OAAA,EAAI,WAAU,kHACZ,iBAAO,MACV;AAAA,MAED,YACCA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,UAAU;AAAA,UACnB,SAAS,UAAU;AAAA,UACnB,OAAO,UAAU;AAAA,UAChB,GAAI,yBAAyB,EAAE,oBAAoB,2BAA2B,CAAA;AAAA,QAAC;AAAA,MAAA;AAAA,IAClF,EAAA,CAEJ;AAAA,EAAA,GAEJ;AAEJ;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AAAA,EACb;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,SAASW,cAAQ,MAAM,aAAa,SAAS,WAAW,GAAG,CAAC,SAAS,WAAW,CAAC;AAEvF,MAAI,QAAQ,WAAW,GAAG;AACxB,0CAAQ,OAAA,EAAI,WAAWP,MAAAA,GAAG,sCAAsC,SAAS,GAAI,UAAA,YAAW;AAAA,EAC1F;AAEA,SACEJ,2BAAAA,IAAC,OAAA,EAAI,WAAWI,MAAAA,GAAG,mDAAmD,SAAS,GAC5E,UAAA,OAAO,IAAI,WACVN,2BAAAA,KAAC,WAAA,EAAwB,cAAY,MAAM,SAAS,WACjD,UAAA;AAAA,IAAA,MAAM,SACLE,2BAAAA,IAAC,OAAA,EAAI,WAAU,sFACZ,gBAAM,OACT;AAAA,mCAED,OAAA,EAAI,WAAU,0BACZ,UAAA,MAAM,QAAQ,IAAI,CAAA,WACjBA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEC;AAAA,QACC,GAAI,WAAW,EAAE,SAAA,IAAa,CAAA;AAAA,QAC9B,GAAI,aAAa,EAAE,WAAA,IAAe,CAAA;AAAA,QAClC,GAAI,yBAAyB,EAAE,2BAA2B,CAAA;AAAA,MAAC;AAAA,MAJvD,OAAO,MAAM,OAAO;AAAA,IAAA,CAM5B,EAAA,CACH;AAAA,EAAA,EAAA,GAhBY,MAAM,GAiBpB,CACD,GACH;AAEJ;AAQA,SAAS,iBAAiB,QAAyB;AACjD,UAAQ,UAAU,YAAY,YAAA;AAChC;AAEA,SAAS,WAAW,QAA6B;AAC/C,UAAQ,iBAAiB,MAAM,GAAA;AAAA,IAC7B,KAAK;AACH,aAAO,EAAE,OAAO,SAAS,MAAMY,WAAAA,YAAY,eAAe,yCAAA;AAAA,IAC5D,KAAK;AACH,aAAO,EAAE,OAAO,WAAW,MAAMC,SAAAA,UAAU,eAAe,mCAAA;AAAA,IAC5D,KAAK;AACH,aAAO,EAAE,OAAO,WAAW,MAAMC,WAAAA,YAAY,eAAe,iCAAA;AAAA,IAC9D,KAAK;AACH,aAAO,EAAE,OAAO,UAAU,MAAMC,QAAAA,SAAS,eAAe,iCAAA;AAAA,IAC1D;AACE,aAAO,EAAE,OAAO,YAAY,MAAMC,OAAAA,QAAQ,eAAe,qCAAA;AAAA,EAAqC;AAEpG;AAEA,SAAS,UAAU,MAAuD;AACxE,QAAM,QAAQ,KAAK,YAAY,GAAG;AAClC,MAAI,QAAQ,EAAG,QAAO,EAAE,WAAW,IAAI,UAAU,KAAA;AACjD,SAAO,EAAE,WAAW,GAAG,KAAK,MAAM,GAAG,KAAK,CAAC,KAAK,UAAU,KAAK,MAAM,QAAQ,CAAC,EAAA;AAChF;AAEA,SAAS,SAAS,EAAE,YAAY,GAAG,YAAY,KAAiD;AAC9F,QAAM,QAAQ,YAAY;AAC1B,QAAM,UAAU;AAChB,QAAM,UAAU,QAAQ,IAAI,KAAK,MAAO,YAAY,QAAS,OAAO,IAAI;AACxE,QAAM,UAAU,QAAQ,IAAI,UAAU,UAAU;AAChD,SACElB,2BAAAA,KAAC,QAAA,EAAK,WAAU,sBAAqB,eAAW,MAC7C,UAAA;AAAA,IAAA,MAAM,KAAK,EAAE,QAAQ,QAAA,CAAS,EAAE,IAAI,CAAC,GAAG,yCACtC,QAAA,EAAuB,WAAU,sDAAvB,IAAI,KAAK,EAAiE,CACtF;AAAA,IACA,MAAM,KAAK,EAAE,QAAQ,QAAA,CAAS,EAAE,IAAI,CAAC,GAAG,yCACtC,QAAA,EAAuB,WAAU,mDAAvB,IAAI,KAAK,EAA8D,CACnF;AAAA,IACA,UAAU,KAAKE,2BAAAA,IAAC,QAAA,EAAK,WAAU,2DAAA,CAA2D;AAAA,EAAA,GAC7F;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,CAAC,UAAU,WAAW,MAAM,IAAI,YAAY,MAAM,QAAQ;AAChE,QAAM,SAAS,WAAW,KAAK,MAAM;AACrC,QAAM,aAAa,OAAO;AAC1B,QAAM,OAAO,UAAU,KAAK,IAAI;AAChC,QAAM,YAAY,QAAQ,QAAQ;AAElC,WAAS,UAAU,OAAsC;AACvD,QAAI,CAAC,aAAa,CAAC,gBAAgB,KAAK,EAAG;AAC3C,UAAM,eAAA;AACN,WAAA;AAAA,EACF;AAEA,yCACG,OAAA,EACC,UAAA;AAAA,IAAAF,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,YAAY,WAAW;AAAA,QAC7B,UAAU,YAAY,IAAI;AAAA,QAC1B,WAAWM,MAAAA;AAAAA,UACT;AAAA,UACA,aAAa;AAAA,QAAA;AAAA,QAEf,SAAS,YAAY,SAAS;AAAA,QAC9B,WAAW,YAAY,YAAY;AAAA,QAEnC,UAAA;AAAA,UAAAJ,+BAAC,cAAW,WAAWI,MAAAA,GAAG,oBAAoB,OAAO,aAAa,GAAG;AAAA,UACrEN,2BAAAA,KAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAAA,gCAAC,OAAA,EAAI,WAAU,sCAAqC,OAAO,KAAK,MAC7D,UAAA;AAAA,cAAA,KAAK,aAAaE,2BAAAA,IAAC,QAAA,EAAK,WAAU,yBAAyB,eAAK,WAAU;AAAA,cAC3EA,2BAAAA,IAAC,QAAA,EAAM,UAAA,KAAK,SAAA,CAAS;AAAA,YAAA,GACvB;AAAA,YACC,KAAK,gBACJF,gCAAC,OAAA,EAAI,WAAU,+DAA8D,UAAA;AAAA,cAAA;AAAA,cACrE,KAAK;AAAA,YAAA,EAAA,CACb;AAAA,UAAA,GAEJ;AAAA,UACAE,2BAAAA,IAAC,QAAA,EAAK,WAAU,8CAA8C,iBAAO,OAAM;AAAA,UAC3EF,2BAAAA,KAAC,QAAA,EAAK,WAAU,gEAA+D,UAAA;AAAA,YAAA;AAAA,YAC3E,KAAK,aAAa;AAAA,UAAA,GACtB;AAAA,UACAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,0DAAyD,UAAA;AAAA,YAAA;AAAA,YACrE,KAAK,aAAa;AAAA,UAAA,GACtB;AAAA,UACAE,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACE,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAA,IAAc,CAAA;AAAA,cACnE,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,cAAc,CAAA;AAAA,YAAC;AAAA,UAAA;AAAA,UAEtE,KAAK,QACJA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAM,KAAK;AAAA,cACX,QAAO;AAAA,cACP,KAAI;AAAA,cACJ,WAAU;AAAA,cACV,SAAS,CAAA,UAAS,MAAM,gBAAA;AAAA,cACxB,cAAY,QAAQ,KAAK,IAAI;AAAA,cAE7B,UAAAA,2BAAAA,IAACU,eAAAA,gBAAA,EAAe,WAAU,cAAA,CAAc;AAAA,YAAA;AAAA,UAAA;AAAA,UAG3C,4CACE,QAAA,EAAK,WAAU,YACd,UAAAV,+BAAC,SAAA,EAAQ,UAAoB,EAAA,CAC/B;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGH,YACCA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,UAAU;AAAA,QACnB,SAAS,UAAU;AAAA,QACnB,OAAO,UAAU;AAAA,QAChB,GAAI,yBAAyB,EAAE,oBAAoB,2BAA2B,CAAA;AAAA,MAAC;AAAA,IAAA;AAAA,EAClF,GAEJ;AAEJ;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AACF,GAAqB;AACnB,MAAI,MAAM,WAAW,GAAG;AACtB,0CAAQ,OAAA,EAAI,WAAWI,MAAAA,GAAG,sCAAsC,SAAS,GAAI,UAAA,YAAW;AAAA,EAC1F;AAEA,SACEJ,2BAAAA,IAAC,OAAA,EAAI,WAAWI,MAAAA,GAAG,mDAAmD,SAAS,GAC7E,UAAAJ,2BAAAA,IAAC,OAAA,EAAI,WAAU,0BACZ,UAAA,MAAM,IAAI,CAAA,SACTA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MAEC;AAAA,MACC,GAAI,WAAW,EAAE,SAAA,IAAa,CAAA;AAAA,MAC9B,GAAI,yBAAyB,EAAE,2BAA2B,CAAA;AAAA,IAAC;AAAA,IAHvD,KAAK,MAAM,KAAK;AAAA,EAAA,CAKxB,GACH,EAAA,CACF;AAEJ;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,yCACG,OAAA,EAAI,WAAWI,MAAAA,GAAG,yDAAyD,SAAS,GACnF,UAAA;AAAA,IAAAN,2BAAAA,KAAC,QAAA,EAAK,WAAU,8CACd,UAAA;AAAA,MAAAE,2BAAAA,IAACiB,OAAAA,QAAA,EAAO,WAAU,cAAA,CAAc;AAAA,MAC/B;AAAA,MAAM;AAAA,MAAM,UAAU,IAAI,KAAK;AAAA,MAAI;AAAA,IAAA,GACtC;AAAA,IACAjB,2BAAAA,IAAC,QAAA,EAAK,eAAW,MAAC,UAAA,KAAC;AAAA,IACnBF,2BAAAA,KAAC,QAAA,EAAK,WAAU,0CAAyC,UAAA;AAAA,MAAA;AAAA,MAAE;AAAA,IAAA,GAAU;AAAA,IACrEA,2BAAAA,KAAC,QAAA,EAAK,WAAU,oCAAmC,UAAA;AAAA,MAAA;AAAA,MAAE;AAAA,IAAA,EAAA,CAAU;AAAA,EAAA,GACjE;AAEJ;;;;;"}
1
+ {"version":3,"file":"GitChangeList.cjs","sources":["../../../src/data/git/GitChangeList.tsx"],"sourcesContent":["import { useMemo, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n UiChevronDown,\n UiChevronRight,\n UiClock,\n UiCode2,\n UiDiff,\n UiFile,\n UiFileCode,\n UiFilePlus,\n UiGitCommit,\n UiLinkExternal,\n UiRemove,\n} from \"../../icons\";\nimport type { IconComponent } from \"../../icons/types\";\nimport { CodeDiff, type DiffLineTarget, type DiffLineWidget } from \"../CodeDiff\";\nimport { languageFromPath } from \"../code-highlight\";\nimport { dateKey, formatFallbackTime, formatGitCommitDateHeader } from \"./git-dates\";\n\nexport type GitDiffPayload = {\n diff: string;\n truncated?: boolean;\n binary?: boolean;\n path?: string;\n commit?: string;\n};\n\nexport type GitDiffLoader<T> = (item: T) => Promise<GitDiffPayload>;\n\nexport type GitCommitItem = {\n id?: string;\n sha: string;\n shortSha?: string;\n title: string;\n body?: string;\n authorName?: string;\n authorLogin?: string;\n authorAvatarUrl?: string;\n committedAt?: string;\n additions?: number;\n deletions?: number;\n changedFiles?: number;\n href?: string;\n};\n\nexport type GitFileChangeStatus =\n | \"added\"\n | \"modified\"\n | \"deleted\"\n | \"renamed\"\n | \"copied\"\n | string;\n\nexport type GitFileChangeItem = {\n id?: string;\n path: string;\n previousPath?: string;\n status?: GitFileChangeStatus;\n additions?: number;\n deletions?: number;\n href?: string;\n binary?: boolean;\n};\n\ntype DiffState = {\n loading: boolean;\n payload: GitDiffPayload | null;\n error: string;\n};\n\nexport type GitDiffPanelProps = {\n loading?: boolean;\n payload?: GitDiffPayload | null;\n error?: string;\n emptyLabel?: string;\n className?: string;\n maxHeightClassName?: string;\n /** Forwarded to `CodeDiff`: shows a gutter \"+\" button per numbered line. */\n onLineAction?: (target: DiffLineTarget) => void;\n /** Forwarded to `CodeDiff`: rows rendered under the matching diff line. */\n lineWidgets?: DiffLineWidget[];\n};\n\nexport type GitCommitListProps = {\n commits: GitCommitItem[];\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n groupByDate?: boolean;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\nexport type GitFileListProps = {\n files: GitFileChangeItem[];\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\ntype CommitGroup = {\n key: string;\n label: string;\n commits: GitCommitItem[];\n};\n\nconst DIFF_INITIAL_STATE: DiffState = {\n loading: false,\n payload: null,\n error: \"\",\n};\n\nfunction messageFromError(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === \"string\") return error;\n return \"Failed to load diff\";\n}\n\nfunction isActivationKey(event: KeyboardEvent<HTMLDivElement>): boolean {\n return event.key === \"Enter\" || event.key === \" \";\n}\n\nfunction groupCommits(commits: GitCommitItem[], enabled: boolean): CommitGroup[] {\n if (!enabled) return [{ key: \"all\", label: \"\", commits }];\n const groups: CommitGroup[] = [];\n const indexByKey = new Map<string, number>();\n for (const commit of commits) {\n const key = dateKey(commit.committedAt);\n const existing = indexByKey.get(key);\n if (existing != null) {\n groups[existing]?.commits.push(commit);\n continue;\n }\n indexByKey.set(key, groups.length);\n groups.push({\n key,\n label: formatGitCommitDateHeader(commit.committedAt),\n commits: [commit],\n });\n }\n return groups;\n}\n\nfunction shortSha(commit: GitCommitItem): string {\n return commit.shortSha || commit.sha.slice(0, 7);\n}\n\nfunction displayAuthor(commit: GitCommitItem): string {\n return commit.authorLogin || commit.authorName || \"\";\n}\n\nfunction statText(additions?: number, deletions?: number): ReactNode {\n const adds = additions ?? 0;\n const dels = deletions ?? 0;\n if (adds === 0 && dels === 0) return null;\n return (\n <>\n <span aria-hidden>·</span>\n {adds > 0 && <span className=\"text-emerald-600 dark:text-emerald-400\">+{adds}</span>}\n {dels > 0 && <span className=\"text-rose-600 dark:text-rose-400\">-{dels}</span>}\n </>\n );\n}\n\nfunction useLazyDiff<T>(item: T, loader: GitDiffLoader<T> | undefined): [boolean, DiffState, () => void] {\n const [expanded, setExpanded] = useState(false);\n const [state, setState] = useState<DiffState>(DIFF_INITIAL_STATE);\n\n function toggle() {\n setExpanded(open => !open);\n if (!expanded && loader && !state.payload && !state.loading && !state.error) {\n setState({ loading: true, payload: null, error: \"\" });\n loader(item)\n .then(payload => setState({ loading: false, payload, error: \"\" }))\n .catch(error => setState({ loading: false, payload: null, error: messageFromError(error) }));\n }\n }\n\n return [expanded, state, toggle];\n}\n\nfunction Chevron({ expanded }: { expanded: boolean }) {\n const Icon = expanded ? UiChevronDown : UiChevronRight;\n return <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />;\n}\n\nfunction AvatarImage({ src, alt }: { src: string; alt: string }) {\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-4 w-4 rounded-full border border-border object-cover\"\n loading=\"lazy\"\n />\n );\n}\n\nexport function GitDiffPanel({\n loading,\n payload,\n error,\n emptyLabel = \"No text diff available\",\n className,\n maxHeightClassName = \"max-h-[520px]\",\n onLineAction,\n lineWidgets,\n}: GitDiffPanelProps) {\n if (loading) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Loading diff...\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"border-t border-border bg-rose-50 px-3 py-3 text-xs text-rose-700 dark:bg-rose-950/30 dark:text-rose-300\", className)}>\n {error}\n </div>\n );\n }\n\n if (payload?.binary) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Binary file not shown.\n </div>\n );\n }\n\n if (!payload?.diff) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n {emptyLabel}\n </div>\n );\n }\n\n const language = languageFromPath(payload.path);\n return (\n <div className={cn(\"border-t border-border\", className)}>\n {payload.truncated && (\n <div className=\"border-b border-border bg-amber-100/70 px-3 py-1.5 text-xs text-amber-800 [[data-theme=dark]_&]:bg-amber-950/40 [[data-theme=dark]_&]:text-amber-200\">\n Diff truncated.\n </div>\n )}\n <CodeDiff\n bare\n unified={payload.diff}\n className={cn(\"overflow-auto px-1 py-2\", maxHeightClassName)}\n {...(language ? { language } : {})}\n {...(onLineAction ? { onLineAction } : {})}\n {...(lineWidgets ? { lineWidgets } : {})}\n />\n </div>\n );\n}\n\nfunction CommitRow({\n commit,\n loadDiff,\n renderTime,\n diffMaxHeightClassName,\n}: {\n commit: GitCommitItem;\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(commit, loadDiff);\n const author = displayAuthor(commit);\n const canExpand = Boolean(loadDiff || commit.body);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-14 items-start gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <UiGitCommit className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-foreground\" title={commit.title}>\n {commit.title}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5 text-muted-foreground\">\n {commit.authorAvatarUrl && (\n <AvatarImage src={commit.authorAvatarUrl} alt={author || \"Commit author\"} />\n )}\n {author && <span>{author}</span>}\n {commit.committedAt && (\n <>\n <span aria-hidden>·</span>\n <span className=\"inline-flex items-center gap-1\">\n <UiClock className=\"h-3 w-3\" />\n {renderTime ? renderTime(commit.committedAt) : formatFallbackTime(commit.committedAt)}\n </span>\n </>\n )}\n {statText(commit.additions, commit.deletions)}\n {(commit.changedFiles ?? 0) > 0 && (\n <>\n <span aria-hidden>·</span>\n <span>{commit.changedFiles} files</span>\n </>\n )}\n </div>\n </div>\n {commit.href ? (\n <a\n href={commit.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-0.5 inline-flex shrink-0 items-center gap-1 font-mono text-cyan-600 hover:underline\"\n onClick={event => event.stopPropagation()}\n >\n {shortSha(commit)}\n <UiLinkExternal className=\"h-3 w-3\" />\n </a>\n ) : (\n <span className=\"mt-0.5 shrink-0 font-mono text-cyan-600\">{shortSha(commit)}</span>\n )}\n {canExpand && (\n <span className=\"mt-1 shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <div className=\"border-t border-border bg-secondary/50\">\n {commit.body && (\n <pre className=\"mx-3 my-2 whitespace-pre-wrap rounded bg-muted px-3 py-2 font-mono text-[11px] leading-5 text-muted-foreground\">\n {commit.body}\n </pre>\n )}\n {loadDiff && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function GitCommitList({\n commits,\n loadDiff,\n renderTime,\n groupByDate = true,\n emptyLabel = \"No commits found\",\n className,\n diffMaxHeightClassName,\n}: GitCommitListProps) {\n const groups = useMemo(() => groupCommits(commits, groupByDate), [commits, groupByDate]);\n\n if (commits.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n {groups.map(group => (\n <section key={group.key} aria-label={group.label || \"Commits\"}>\n {group.label && (\n <div className=\"border-b border-border bg-muted/60 px-3 py-2 text-xs font-semibold text-foreground\">\n {group.label}\n </div>\n )}\n <div className=\"divide-y divide-border\">\n {group.commits.map(commit => (\n <CommitRow\n key={commit.id || commit.sha}\n commit={commit}\n {...(loadDiff ? { loadDiff } : {})}\n {...(renderTime ? { renderTime } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n\ntype StatusView = {\n label: string;\n icon: IconComponent;\n iconClassName: string;\n};\n\nfunction normalizedStatus(status?: string): string {\n return (status || \"modified\").toLowerCase();\n}\n\nfunction statusView(status?: string): StatusView {\n switch (normalizedStatus(status)) {\n case \"added\":\n return { label: \"Added\", icon: UiFilePlus, iconClassName: \"text-emerald-600 dark:text-emerald-400\" };\n case \"deleted\":\n return { label: \"Deleted\", icon: UiRemove, iconClassName: \"text-rose-600 dark:text-rose-400\" };\n case \"renamed\":\n return { label: \"Renamed\", icon: UiFileCode, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n case \"copied\":\n return { label: \"Copied\", icon: UiCode2, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n default:\n return { label: \"Modified\", icon: UiFile, iconClassName: \"text-amber-600 dark:text-amber-400\" };\n }\n}\n\nfunction splitPath(path: string): { directory: string; basename: string } {\n const index = path.lastIndexOf(\"/\");\n if (index < 0) return { directory: \"\", basename: path };\n return { directory: `${path.slice(0, index)}/`, basename: path.slice(index + 1) };\n}\n\nfunction DiffBars({ additions = 0, deletions = 0 }: { additions?: number; deletions?: number }) {\n const total = additions + deletions;\n const maxBars = 5;\n const addBars = total > 0 ? Math.round((additions / total) * maxBars) : 0;\n const delBars = total > 0 ? maxBars - addBars : 0;\n return (\n <span className=\"inline-flex gap-px\" aria-hidden>\n {Array.from({ length: addBars }).map((_, index) => (\n <span key={`a${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-emerald-500\" />\n ))}\n {Array.from({ length: delBars }).map((_, index) => (\n <span key={`d${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-rose-500\" />\n ))}\n {total === 0 && <span className=\"inline-block h-2 w-1.5 rounded-sm bg-muted-foreground/30\" />}\n </span>\n );\n}\n\nfunction FileRow({\n file,\n loadDiff,\n diffMaxHeightClassName,\n}: {\n file: GitFileChangeItem;\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(file, loadDiff);\n const status = statusView(file.status);\n const StatusIcon = status.icon;\n const path = splitPath(file.path);\n const canExpand = Boolean(loadDiff);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-11 items-center gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <StatusIcon className={cn(\"h-4 w-4 shrink-0\", status.iconClassName)} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-mono text-foreground\" title={file.path}>\n {path.directory && <span className=\"text-muted-foreground\">{path.directory}</span>}\n <span>{path.basename}</span>\n </div>\n {file.previousPath && (\n <div className=\"mt-0.5 truncate font-mono text-[11px] text-muted-foreground\">\n from {file.previousPath}\n </div>\n )}\n </div>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">{status.label}</span>\n <span className=\"shrink-0 tabular-nums text-emerald-600 dark:text-emerald-400\">\n +{file.additions ?? 0}\n </span>\n <span className=\"shrink-0 tabular-nums text-rose-600 dark:text-rose-400\">\n -{file.deletions ?? 0}\n </span>\n <DiffBars\n {...(file.additions !== undefined ? { additions: file.additions } : {})}\n {...(file.deletions !== undefined ? { deletions: file.deletions } : {})}\n />\n {file.href && (\n <a\n href={file.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={event => event.stopPropagation()}\n aria-label={`Open ${file.path}`}\n >\n <UiLinkExternal className=\"h-3.5 w-3.5\" />\n </a>\n )}\n {canExpand && (\n <span className=\"shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n );\n}\n\nexport function GitFileList({\n files,\n loadDiff,\n emptyLabel = \"No changed files found\",\n className,\n diffMaxHeightClassName,\n}: GitFileListProps) {\n if (files.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n <div className=\"divide-y divide-border\">\n {files.map(file => (\n <FileRow\n key={file.id || file.path}\n file={file}\n {...(loadDiff ? { loadDiff } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </div>\n );\n}\n\nexport function GitChangedFilesSummary({\n files,\n additions,\n deletions,\n className,\n}: {\n files: number;\n additions: number;\n deletions: number;\n className?: string;\n}) {\n return (\n <div className={cn(\"flex items-center gap-2 text-xs text-muted-foreground\", className)}>\n <span className=\"inline-flex items-center gap-1 font-medium\">\n <UiDiff className=\"h-3.5 w-3.5\" />\n {files} file{files === 1 ? \"\" : \"s\"} changed\n </span>\n <span aria-hidden>·</span>\n <span className=\"text-emerald-600 dark:text-emerald-400\">+{additions}</span>\n <span className=\"text-rose-600 dark:text-rose-400\">-{deletions}</span>\n </div>\n );\n}\n"],"names":["dateKey","formatGitCommitDateHeader","jsxs","Fragment","jsx","useState","UiChevronDown","UiChevronRight","cn","languageFromPath","CodeDiff","UiGitCommit","UiClock","formatFallbackTime","UiLinkExternal","useMemo","UiFilePlus","UiRemove","UiFileCode","UiCode2","UiFile","UiDiff"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
+ import { DiffLineTarget, DiffLineWidget } from '../CodeDiff.js';
2
3
  export type GitDiffPayload = {
3
4
  diff: string;
4
5
  truncated?: boolean;
@@ -40,6 +41,10 @@ export type GitDiffPanelProps = {
40
41
  emptyLabel?: string;
41
42
  className?: string;
42
43
  maxHeightClassName?: string;
44
+ /** Forwarded to `CodeDiff`: shows a gutter "+" button per numbered line. */
45
+ onLineAction?: (target: DiffLineTarget) => void;
46
+ /** Forwarded to `CodeDiff`: rows rendered under the matching diff line. */
47
+ lineWidgets?: DiffLineWidget[];
43
48
  };
44
49
  export type GitCommitListProps = {
45
50
  commits: GitCommitItem[];
@@ -57,7 +62,7 @@ export type GitFileListProps = {
57
62
  className?: string;
58
63
  diffMaxHeightClassName?: string;
59
64
  };
60
- export declare function GitDiffPanel({ loading, payload, error, emptyLabel, className, maxHeightClassName, }: GitDiffPanelProps): import("react").JSX.Element;
65
+ export declare function GitDiffPanel({ loading, payload, error, emptyLabel, className, maxHeightClassName, onLineAction, lineWidgets, }: GitDiffPanelProps): import("react").JSX.Element;
61
66
  export declare function GitCommitList({ commits, loadDiff, renderTime, groupByDate, emptyLabel, className, diffMaxHeightClassName, }: GitCommitListProps): import("react").JSX.Element;
62
67
  export declare function GitFileList({ files, loadDiff, emptyLabel, className, diffMaxHeightClassName, }: GitFileListProps): import("react").JSX.Element;
63
68
  export declare function GitChangedFilesSummary({ files, additions, deletions, className, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"GitChangeList.d.ts","sourceRoot":"","sources":["../../../src/data/git/GitChangeList.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GitChangeList.d.ts","sourceRoot":"","sources":["../../../src/data/git/GitChangeList.tsx"],"names":[],"mappings":"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"}
@@ -104,7 +104,9 @@ function GitDiffPanel({
104
104
  error,
105
105
  emptyLabel = "No text diff available",
106
106
  className,
107
- maxHeightClassName = "max-h-[520px]"
107
+ maxHeightClassName = "max-h-[520px]",
108
+ onLineAction,
109
+ lineWidgets
108
110
  }) {
109
111
  if (loading) {
110
112
  return /* @__PURE__ */ jsx("div", { className: cn("border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground", className), children: "Loading diff..." });
@@ -127,7 +129,9 @@ function GitDiffPanel({
127
129
  bare: true,
128
130
  unified: payload.diff,
129
131
  className: cn("overflow-auto px-1 py-2", maxHeightClassName),
130
- ...language ? { language } : {}
132
+ ...language ? { language } : {},
133
+ ...onLineAction ? { onLineAction } : {},
134
+ ...lineWidgets ? { lineWidgets } : {}
131
135
  }
132
136
  )
133
137
  ] });
@@ -1 +1 @@
1
- {"version":3,"file":"GitChangeList.js","sources":["../../../src/data/git/GitChangeList.tsx"],"sourcesContent":["import { useMemo, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n UiChevronDown,\n UiChevronRight,\n UiClock,\n UiCode2,\n UiDiff,\n UiFile,\n UiFileCode,\n UiFilePlus,\n UiGitCommit,\n UiLinkExternal,\n UiRemove,\n} from \"../../icons\";\nimport type { IconComponent } from \"../../icons/types\";\nimport { CodeDiff } from \"../CodeDiff\";\nimport { languageFromPath } from \"../code-highlight\";\nimport { dateKey, formatFallbackTime, formatGitCommitDateHeader } from \"./git-dates\";\n\nexport type GitDiffPayload = {\n diff: string;\n truncated?: boolean;\n binary?: boolean;\n path?: string;\n commit?: string;\n};\n\nexport type GitDiffLoader<T> = (item: T) => Promise<GitDiffPayload>;\n\nexport type GitCommitItem = {\n id?: string;\n sha: string;\n shortSha?: string;\n title: string;\n body?: string;\n authorName?: string;\n authorLogin?: string;\n authorAvatarUrl?: string;\n committedAt?: string;\n additions?: number;\n deletions?: number;\n changedFiles?: number;\n href?: string;\n};\n\nexport type GitFileChangeStatus =\n | \"added\"\n | \"modified\"\n | \"deleted\"\n | \"renamed\"\n | \"copied\"\n | string;\n\nexport type GitFileChangeItem = {\n id?: string;\n path: string;\n previousPath?: string;\n status?: GitFileChangeStatus;\n additions?: number;\n deletions?: number;\n href?: string;\n binary?: boolean;\n};\n\ntype DiffState = {\n loading: boolean;\n payload: GitDiffPayload | null;\n error: string;\n};\n\nexport type GitDiffPanelProps = {\n loading?: boolean;\n payload?: GitDiffPayload | null;\n error?: string;\n emptyLabel?: string;\n className?: string;\n maxHeightClassName?: string;\n};\n\nexport type GitCommitListProps = {\n commits: GitCommitItem[];\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n groupByDate?: boolean;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\nexport type GitFileListProps = {\n files: GitFileChangeItem[];\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\ntype CommitGroup = {\n key: string;\n label: string;\n commits: GitCommitItem[];\n};\n\nconst DIFF_INITIAL_STATE: DiffState = {\n loading: false,\n payload: null,\n error: \"\",\n};\n\nfunction messageFromError(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === \"string\") return error;\n return \"Failed to load diff\";\n}\n\nfunction isActivationKey(event: KeyboardEvent<HTMLDivElement>): boolean {\n return event.key === \"Enter\" || event.key === \" \";\n}\n\nfunction groupCommits(commits: GitCommitItem[], enabled: boolean): CommitGroup[] {\n if (!enabled) return [{ key: \"all\", label: \"\", commits }];\n const groups: CommitGroup[] = [];\n const indexByKey = new Map<string, number>();\n for (const commit of commits) {\n const key = dateKey(commit.committedAt);\n const existing = indexByKey.get(key);\n if (existing != null) {\n groups[existing]?.commits.push(commit);\n continue;\n }\n indexByKey.set(key, groups.length);\n groups.push({\n key,\n label: formatGitCommitDateHeader(commit.committedAt),\n commits: [commit],\n });\n }\n return groups;\n}\n\nfunction shortSha(commit: GitCommitItem): string {\n return commit.shortSha || commit.sha.slice(0, 7);\n}\n\nfunction displayAuthor(commit: GitCommitItem): string {\n return commit.authorLogin || commit.authorName || \"\";\n}\n\nfunction statText(additions?: number, deletions?: number): ReactNode {\n const adds = additions ?? 0;\n const dels = deletions ?? 0;\n if (adds === 0 && dels === 0) return null;\n return (\n <>\n <span aria-hidden>·</span>\n {adds > 0 && <span className=\"text-emerald-600 dark:text-emerald-400\">+{adds}</span>}\n {dels > 0 && <span className=\"text-rose-600 dark:text-rose-400\">-{dels}</span>}\n </>\n );\n}\n\nfunction useLazyDiff<T>(item: T, loader: GitDiffLoader<T> | undefined): [boolean, DiffState, () => void] {\n const [expanded, setExpanded] = useState(false);\n const [state, setState] = useState<DiffState>(DIFF_INITIAL_STATE);\n\n function toggle() {\n setExpanded(open => !open);\n if (!expanded && loader && !state.payload && !state.loading && !state.error) {\n setState({ loading: true, payload: null, error: \"\" });\n loader(item)\n .then(payload => setState({ loading: false, payload, error: \"\" }))\n .catch(error => setState({ loading: false, payload: null, error: messageFromError(error) }));\n }\n }\n\n return [expanded, state, toggle];\n}\n\nfunction Chevron({ expanded }: { expanded: boolean }) {\n const Icon = expanded ? UiChevronDown : UiChevronRight;\n return <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />;\n}\n\nfunction AvatarImage({ src, alt }: { src: string; alt: string }) {\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-4 w-4 rounded-full border border-border object-cover\"\n loading=\"lazy\"\n />\n );\n}\n\nexport function GitDiffPanel({\n loading,\n payload,\n error,\n emptyLabel = \"No text diff available\",\n className,\n maxHeightClassName = \"max-h-[520px]\",\n}: GitDiffPanelProps) {\n if (loading) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Loading diff...\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"border-t border-border bg-rose-50 px-3 py-3 text-xs text-rose-700 dark:bg-rose-950/30 dark:text-rose-300\", className)}>\n {error}\n </div>\n );\n }\n\n if (payload?.binary) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Binary file not shown.\n </div>\n );\n }\n\n if (!payload?.diff) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n {emptyLabel}\n </div>\n );\n }\n\n const language = languageFromPath(payload.path);\n return (\n <div className={cn(\"border-t border-border\", className)}>\n {payload.truncated && (\n <div className=\"border-b border-border bg-amber-100/70 px-3 py-1.5 text-xs text-amber-800 [[data-theme=dark]_&]:bg-amber-950/40 [[data-theme=dark]_&]:text-amber-200\">\n Diff truncated.\n </div>\n )}\n <CodeDiff\n bare\n unified={payload.diff}\n className={cn(\"overflow-auto px-1 py-2\", maxHeightClassName)}\n {...(language ? { language } : {})}\n />\n </div>\n );\n}\n\nfunction CommitRow({\n commit,\n loadDiff,\n renderTime,\n diffMaxHeightClassName,\n}: {\n commit: GitCommitItem;\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(commit, loadDiff);\n const author = displayAuthor(commit);\n const canExpand = Boolean(loadDiff || commit.body);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-14 items-start gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <UiGitCommit className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-foreground\" title={commit.title}>\n {commit.title}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5 text-muted-foreground\">\n {commit.authorAvatarUrl && (\n <AvatarImage src={commit.authorAvatarUrl} alt={author || \"Commit author\"} />\n )}\n {author && <span>{author}</span>}\n {commit.committedAt && (\n <>\n <span aria-hidden>·</span>\n <span className=\"inline-flex items-center gap-1\">\n <UiClock className=\"h-3 w-3\" />\n {renderTime ? renderTime(commit.committedAt) : formatFallbackTime(commit.committedAt)}\n </span>\n </>\n )}\n {statText(commit.additions, commit.deletions)}\n {(commit.changedFiles ?? 0) > 0 && (\n <>\n <span aria-hidden>·</span>\n <span>{commit.changedFiles} files</span>\n </>\n )}\n </div>\n </div>\n {commit.href ? (\n <a\n href={commit.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-0.5 inline-flex shrink-0 items-center gap-1 font-mono text-cyan-600 hover:underline\"\n onClick={event => event.stopPropagation()}\n >\n {shortSha(commit)}\n <UiLinkExternal className=\"h-3 w-3\" />\n </a>\n ) : (\n <span className=\"mt-0.5 shrink-0 font-mono text-cyan-600\">{shortSha(commit)}</span>\n )}\n {canExpand && (\n <span className=\"mt-1 shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <div className=\"border-t border-border bg-secondary/50\">\n {commit.body && (\n <pre className=\"mx-3 my-2 whitespace-pre-wrap rounded bg-muted px-3 py-2 font-mono text-[11px] leading-5 text-muted-foreground\">\n {commit.body}\n </pre>\n )}\n {loadDiff && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function GitCommitList({\n commits,\n loadDiff,\n renderTime,\n groupByDate = true,\n emptyLabel = \"No commits found\",\n className,\n diffMaxHeightClassName,\n}: GitCommitListProps) {\n const groups = useMemo(() => groupCommits(commits, groupByDate), [commits, groupByDate]);\n\n if (commits.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n {groups.map(group => (\n <section key={group.key} aria-label={group.label || \"Commits\"}>\n {group.label && (\n <div className=\"border-b border-border bg-muted/60 px-3 py-2 text-xs font-semibold text-foreground\">\n {group.label}\n </div>\n )}\n <div className=\"divide-y divide-border\">\n {group.commits.map(commit => (\n <CommitRow\n key={commit.id || commit.sha}\n commit={commit}\n {...(loadDiff ? { loadDiff } : {})}\n {...(renderTime ? { renderTime } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n\ntype StatusView = {\n label: string;\n icon: IconComponent;\n iconClassName: string;\n};\n\nfunction normalizedStatus(status?: string): string {\n return (status || \"modified\").toLowerCase();\n}\n\nfunction statusView(status?: string): StatusView {\n switch (normalizedStatus(status)) {\n case \"added\":\n return { label: \"Added\", icon: UiFilePlus, iconClassName: \"text-emerald-600 dark:text-emerald-400\" };\n case \"deleted\":\n return { label: \"Deleted\", icon: UiRemove, iconClassName: \"text-rose-600 dark:text-rose-400\" };\n case \"renamed\":\n return { label: \"Renamed\", icon: UiFileCode, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n case \"copied\":\n return { label: \"Copied\", icon: UiCode2, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n default:\n return { label: \"Modified\", icon: UiFile, iconClassName: \"text-amber-600 dark:text-amber-400\" };\n }\n}\n\nfunction splitPath(path: string): { directory: string; basename: string } {\n const index = path.lastIndexOf(\"/\");\n if (index < 0) return { directory: \"\", basename: path };\n return { directory: `${path.slice(0, index)}/`, basename: path.slice(index + 1) };\n}\n\nfunction DiffBars({ additions = 0, deletions = 0 }: { additions?: number; deletions?: number }) {\n const total = additions + deletions;\n const maxBars = 5;\n const addBars = total > 0 ? Math.round((additions / total) * maxBars) : 0;\n const delBars = total > 0 ? maxBars - addBars : 0;\n return (\n <span className=\"inline-flex gap-px\" aria-hidden>\n {Array.from({ length: addBars }).map((_, index) => (\n <span key={`a${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-emerald-500\" />\n ))}\n {Array.from({ length: delBars }).map((_, index) => (\n <span key={`d${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-rose-500\" />\n ))}\n {total === 0 && <span className=\"inline-block h-2 w-1.5 rounded-sm bg-muted-foreground/30\" />}\n </span>\n );\n}\n\nfunction FileRow({\n file,\n loadDiff,\n diffMaxHeightClassName,\n}: {\n file: GitFileChangeItem;\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(file, loadDiff);\n const status = statusView(file.status);\n const StatusIcon = status.icon;\n const path = splitPath(file.path);\n const canExpand = Boolean(loadDiff);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-11 items-center gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <StatusIcon className={cn(\"h-4 w-4 shrink-0\", status.iconClassName)} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-mono text-foreground\" title={file.path}>\n {path.directory && <span className=\"text-muted-foreground\">{path.directory}</span>}\n <span>{path.basename}</span>\n </div>\n {file.previousPath && (\n <div className=\"mt-0.5 truncate font-mono text-[11px] text-muted-foreground\">\n from {file.previousPath}\n </div>\n )}\n </div>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">{status.label}</span>\n <span className=\"shrink-0 tabular-nums text-emerald-600 dark:text-emerald-400\">\n +{file.additions ?? 0}\n </span>\n <span className=\"shrink-0 tabular-nums text-rose-600 dark:text-rose-400\">\n -{file.deletions ?? 0}\n </span>\n <DiffBars\n {...(file.additions !== undefined ? { additions: file.additions } : {})}\n {...(file.deletions !== undefined ? { deletions: file.deletions } : {})}\n />\n {file.href && (\n <a\n href={file.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={event => event.stopPropagation()}\n aria-label={`Open ${file.path}`}\n >\n <UiLinkExternal className=\"h-3.5 w-3.5\" />\n </a>\n )}\n {canExpand && (\n <span className=\"shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n );\n}\n\nexport function GitFileList({\n files,\n loadDiff,\n emptyLabel = \"No changed files found\",\n className,\n diffMaxHeightClassName,\n}: GitFileListProps) {\n if (files.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n <div className=\"divide-y divide-border\">\n {files.map(file => (\n <FileRow\n key={file.id || file.path}\n file={file}\n {...(loadDiff ? { loadDiff } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </div>\n );\n}\n\nexport function GitChangedFilesSummary({\n files,\n additions,\n deletions,\n className,\n}: {\n files: number;\n additions: number;\n deletions: number;\n className?: string;\n}) {\n return (\n <div className={cn(\"flex items-center gap-2 text-xs text-muted-foreground\", className)}>\n <span className=\"inline-flex items-center gap-1 font-medium\">\n <UiDiff className=\"h-3.5 w-3.5\" />\n {files} file{files === 1 ? \"\" : \"s\"} changed\n </span>\n <span aria-hidden>·</span>\n <span className=\"text-emerald-600 dark:text-emerald-400\">+{additions}</span>\n <span className=\"text-rose-600 dark:text-rose-400\">-{deletions}</span>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GitChangeList.js","sources":["../../../src/data/git/GitChangeList.tsx"],"sourcesContent":["import { useMemo, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n UiChevronDown,\n UiChevronRight,\n UiClock,\n UiCode2,\n UiDiff,\n UiFile,\n UiFileCode,\n UiFilePlus,\n UiGitCommit,\n UiLinkExternal,\n UiRemove,\n} from \"../../icons\";\nimport type { IconComponent } from \"../../icons/types\";\nimport { CodeDiff, type DiffLineTarget, type DiffLineWidget } from \"../CodeDiff\";\nimport { languageFromPath } from \"../code-highlight\";\nimport { dateKey, formatFallbackTime, formatGitCommitDateHeader } from \"./git-dates\";\n\nexport type GitDiffPayload = {\n diff: string;\n truncated?: boolean;\n binary?: boolean;\n path?: string;\n commit?: string;\n};\n\nexport type GitDiffLoader<T> = (item: T) => Promise<GitDiffPayload>;\n\nexport type GitCommitItem = {\n id?: string;\n sha: string;\n shortSha?: string;\n title: string;\n body?: string;\n authorName?: string;\n authorLogin?: string;\n authorAvatarUrl?: string;\n committedAt?: string;\n additions?: number;\n deletions?: number;\n changedFiles?: number;\n href?: string;\n};\n\nexport type GitFileChangeStatus =\n | \"added\"\n | \"modified\"\n | \"deleted\"\n | \"renamed\"\n | \"copied\"\n | string;\n\nexport type GitFileChangeItem = {\n id?: string;\n path: string;\n previousPath?: string;\n status?: GitFileChangeStatus;\n additions?: number;\n deletions?: number;\n href?: string;\n binary?: boolean;\n};\n\ntype DiffState = {\n loading: boolean;\n payload: GitDiffPayload | null;\n error: string;\n};\n\nexport type GitDiffPanelProps = {\n loading?: boolean;\n payload?: GitDiffPayload | null;\n error?: string;\n emptyLabel?: string;\n className?: string;\n maxHeightClassName?: string;\n /** Forwarded to `CodeDiff`: shows a gutter \"+\" button per numbered line. */\n onLineAction?: (target: DiffLineTarget) => void;\n /** Forwarded to `CodeDiff`: rows rendered under the matching diff line. */\n lineWidgets?: DiffLineWidget[];\n};\n\nexport type GitCommitListProps = {\n commits: GitCommitItem[];\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n groupByDate?: boolean;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\nexport type GitFileListProps = {\n files: GitFileChangeItem[];\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\ntype CommitGroup = {\n key: string;\n label: string;\n commits: GitCommitItem[];\n};\n\nconst DIFF_INITIAL_STATE: DiffState = {\n loading: false,\n payload: null,\n error: \"\",\n};\n\nfunction messageFromError(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === \"string\") return error;\n return \"Failed to load diff\";\n}\n\nfunction isActivationKey(event: KeyboardEvent<HTMLDivElement>): boolean {\n return event.key === \"Enter\" || event.key === \" \";\n}\n\nfunction groupCommits(commits: GitCommitItem[], enabled: boolean): CommitGroup[] {\n if (!enabled) return [{ key: \"all\", label: \"\", commits }];\n const groups: CommitGroup[] = [];\n const indexByKey = new Map<string, number>();\n for (const commit of commits) {\n const key = dateKey(commit.committedAt);\n const existing = indexByKey.get(key);\n if (existing != null) {\n groups[existing]?.commits.push(commit);\n continue;\n }\n indexByKey.set(key, groups.length);\n groups.push({\n key,\n label: formatGitCommitDateHeader(commit.committedAt),\n commits: [commit],\n });\n }\n return groups;\n}\n\nfunction shortSha(commit: GitCommitItem): string {\n return commit.shortSha || commit.sha.slice(0, 7);\n}\n\nfunction displayAuthor(commit: GitCommitItem): string {\n return commit.authorLogin || commit.authorName || \"\";\n}\n\nfunction statText(additions?: number, deletions?: number): ReactNode {\n const adds = additions ?? 0;\n const dels = deletions ?? 0;\n if (adds === 0 && dels === 0) return null;\n return (\n <>\n <span aria-hidden>·</span>\n {adds > 0 && <span className=\"text-emerald-600 dark:text-emerald-400\">+{adds}</span>}\n {dels > 0 && <span className=\"text-rose-600 dark:text-rose-400\">-{dels}</span>}\n </>\n );\n}\n\nfunction useLazyDiff<T>(item: T, loader: GitDiffLoader<T> | undefined): [boolean, DiffState, () => void] {\n const [expanded, setExpanded] = useState(false);\n const [state, setState] = useState<DiffState>(DIFF_INITIAL_STATE);\n\n function toggle() {\n setExpanded(open => !open);\n if (!expanded && loader && !state.payload && !state.loading && !state.error) {\n setState({ loading: true, payload: null, error: \"\" });\n loader(item)\n .then(payload => setState({ loading: false, payload, error: \"\" }))\n .catch(error => setState({ loading: false, payload: null, error: messageFromError(error) }));\n }\n }\n\n return [expanded, state, toggle];\n}\n\nfunction Chevron({ expanded }: { expanded: boolean }) {\n const Icon = expanded ? UiChevronDown : UiChevronRight;\n return <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />;\n}\n\nfunction AvatarImage({ src, alt }: { src: string; alt: string }) {\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-4 w-4 rounded-full border border-border object-cover\"\n loading=\"lazy\"\n />\n );\n}\n\nexport function GitDiffPanel({\n loading,\n payload,\n error,\n emptyLabel = \"No text diff available\",\n className,\n maxHeightClassName = \"max-h-[520px]\",\n onLineAction,\n lineWidgets,\n}: GitDiffPanelProps) {\n if (loading) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Loading diff...\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={cn(\"border-t border-border bg-rose-50 px-3 py-3 text-xs text-rose-700 dark:bg-rose-950/30 dark:text-rose-300\", className)}>\n {error}\n </div>\n );\n }\n\n if (payload?.binary) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n Binary file not shown.\n </div>\n );\n }\n\n if (!payload?.diff) {\n return (\n <div className={cn(\"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\", className)}>\n {emptyLabel}\n </div>\n );\n }\n\n const language = languageFromPath(payload.path);\n return (\n <div className={cn(\"border-t border-border\", className)}>\n {payload.truncated && (\n <div className=\"border-b border-border bg-amber-100/70 px-3 py-1.5 text-xs text-amber-800 [[data-theme=dark]_&]:bg-amber-950/40 [[data-theme=dark]_&]:text-amber-200\">\n Diff truncated.\n </div>\n )}\n <CodeDiff\n bare\n unified={payload.diff}\n className={cn(\"overflow-auto px-1 py-2\", maxHeightClassName)}\n {...(language ? { language } : {})}\n {...(onLineAction ? { onLineAction } : {})}\n {...(lineWidgets ? { lineWidgets } : {})}\n />\n </div>\n );\n}\n\nfunction CommitRow({\n commit,\n loadDiff,\n renderTime,\n diffMaxHeightClassName,\n}: {\n commit: GitCommitItem;\n loadDiff?: GitDiffLoader<GitCommitItem>;\n renderTime?: (iso: string) => ReactNode;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(commit, loadDiff);\n const author = displayAuthor(commit);\n const canExpand = Boolean(loadDiff || commit.body);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-14 items-start gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <span className=\"mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <UiGitCommit className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-medium text-foreground\" title={commit.title}>\n {commit.title}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5 text-muted-foreground\">\n {commit.authorAvatarUrl && (\n <AvatarImage src={commit.authorAvatarUrl} alt={author || \"Commit author\"} />\n )}\n {author && <span>{author}</span>}\n {commit.committedAt && (\n <>\n <span aria-hidden>·</span>\n <span className=\"inline-flex items-center gap-1\">\n <UiClock className=\"h-3 w-3\" />\n {renderTime ? renderTime(commit.committedAt) : formatFallbackTime(commit.committedAt)}\n </span>\n </>\n )}\n {statText(commit.additions, commit.deletions)}\n {(commit.changedFiles ?? 0) > 0 && (\n <>\n <span aria-hidden>·</span>\n <span>{commit.changedFiles} files</span>\n </>\n )}\n </div>\n </div>\n {commit.href ? (\n <a\n href={commit.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-0.5 inline-flex shrink-0 items-center gap-1 font-mono text-cyan-600 hover:underline\"\n onClick={event => event.stopPropagation()}\n >\n {shortSha(commit)}\n <UiLinkExternal className=\"h-3 w-3\" />\n </a>\n ) : (\n <span className=\"mt-0.5 shrink-0 font-mono text-cyan-600\">{shortSha(commit)}</span>\n )}\n {canExpand && (\n <span className=\"mt-1 shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <div className=\"border-t border-border bg-secondary/50\">\n {commit.body && (\n <pre className=\"mx-3 my-2 whitespace-pre-wrap rounded bg-muted px-3 py-2 font-mono text-[11px] leading-5 text-muted-foreground\">\n {commit.body}\n </pre>\n )}\n {loadDiff && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function GitCommitList({\n commits,\n loadDiff,\n renderTime,\n groupByDate = true,\n emptyLabel = \"No commits found\",\n className,\n diffMaxHeightClassName,\n}: GitCommitListProps) {\n const groups = useMemo(() => groupCommits(commits, groupByDate), [commits, groupByDate]);\n\n if (commits.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n {groups.map(group => (\n <section key={group.key} aria-label={group.label || \"Commits\"}>\n {group.label && (\n <div className=\"border-b border-border bg-muted/60 px-3 py-2 text-xs font-semibold text-foreground\">\n {group.label}\n </div>\n )}\n <div className=\"divide-y divide-border\">\n {group.commits.map(commit => (\n <CommitRow\n key={commit.id || commit.sha}\n commit={commit}\n {...(loadDiff ? { loadDiff } : {})}\n {...(renderTime ? { renderTime } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n\ntype StatusView = {\n label: string;\n icon: IconComponent;\n iconClassName: string;\n};\n\nfunction normalizedStatus(status?: string): string {\n return (status || \"modified\").toLowerCase();\n}\n\nfunction statusView(status?: string): StatusView {\n switch (normalizedStatus(status)) {\n case \"added\":\n return { label: \"Added\", icon: UiFilePlus, iconClassName: \"text-emerald-600 dark:text-emerald-400\" };\n case \"deleted\":\n return { label: \"Deleted\", icon: UiRemove, iconClassName: \"text-rose-600 dark:text-rose-400\" };\n case \"renamed\":\n return { label: \"Renamed\", icon: UiFileCode, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n case \"copied\":\n return { label: \"Copied\", icon: UiCode2, iconClassName: \"text-sky-600 dark:text-sky-400\" };\n default:\n return { label: \"Modified\", icon: UiFile, iconClassName: \"text-amber-600 dark:text-amber-400\" };\n }\n}\n\nfunction splitPath(path: string): { directory: string; basename: string } {\n const index = path.lastIndexOf(\"/\");\n if (index < 0) return { directory: \"\", basename: path };\n return { directory: `${path.slice(0, index)}/`, basename: path.slice(index + 1) };\n}\n\nfunction DiffBars({ additions = 0, deletions = 0 }: { additions?: number; deletions?: number }) {\n const total = additions + deletions;\n const maxBars = 5;\n const addBars = total > 0 ? Math.round((additions / total) * maxBars) : 0;\n const delBars = total > 0 ? maxBars - addBars : 0;\n return (\n <span className=\"inline-flex gap-px\" aria-hidden>\n {Array.from({ length: addBars }).map((_, index) => (\n <span key={`a${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-emerald-500\" />\n ))}\n {Array.from({ length: delBars }).map((_, index) => (\n <span key={`d${index}`} className=\"inline-block h-2 w-1.5 rounded-sm bg-rose-500\" />\n ))}\n {total === 0 && <span className=\"inline-block h-2 w-1.5 rounded-sm bg-muted-foreground/30\" />}\n </span>\n );\n}\n\nfunction FileRow({\n file,\n loadDiff,\n diffMaxHeightClassName,\n}: {\n file: GitFileChangeItem;\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n diffMaxHeightClassName?: string;\n}) {\n const [expanded, diffState, toggle] = useLazyDiff(file, loadDiff);\n const status = statusView(file.status);\n const StatusIcon = status.icon;\n const path = splitPath(file.path);\n const canExpand = Boolean(loadDiff);\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n toggle();\n }\n\n return (\n <div>\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n className={cn(\n \"flex min-h-11 items-center gap-2 px-3 py-2 text-xs transition-colors\",\n canExpand && \"cursor-pointer hover:bg-muted/70\",\n )}\n onClick={canExpand ? toggle : undefined}\n onKeyDown={canExpand ? onKeyDown : undefined}\n >\n <StatusIcon className={cn(\"h-4 w-4 shrink-0\", status.iconClassName)} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate font-mono text-foreground\" title={file.path}>\n {path.directory && <span className=\"text-muted-foreground\">{path.directory}</span>}\n <span>{path.basename}</span>\n </div>\n {file.previousPath && (\n <div className=\"mt-0.5 truncate font-mono text-[11px] text-muted-foreground\">\n from {file.previousPath}\n </div>\n )}\n </div>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">{status.label}</span>\n <span className=\"shrink-0 tabular-nums text-emerald-600 dark:text-emerald-400\">\n +{file.additions ?? 0}\n </span>\n <span className=\"shrink-0 tabular-nums text-rose-600 dark:text-rose-400\">\n -{file.deletions ?? 0}\n </span>\n <DiffBars\n {...(file.additions !== undefined ? { additions: file.additions } : {})}\n {...(file.deletions !== undefined ? { deletions: file.deletions } : {})}\n />\n {file.href && (\n <a\n href={file.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={event => event.stopPropagation()}\n aria-label={`Open ${file.path}`}\n >\n <UiLinkExternal className=\"h-3.5 w-3.5\" />\n </a>\n )}\n {canExpand && (\n <span className=\"shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\n {expanded && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(diffMaxHeightClassName ? { maxHeightClassName: diffMaxHeightClassName } : {})}\n />\n )}\n </div>\n );\n}\n\nexport function GitFileList({\n files,\n loadDiff,\n emptyLabel = \"No changed files found\",\n className,\n diffMaxHeightClassName,\n}: GitFileListProps) {\n if (files.length === 0) {\n return <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>{emptyLabel}</div>;\n }\n\n return (\n <div className={cn(\"overflow-hidden rounded-md border border-border\", className)}>\n <div className=\"divide-y divide-border\">\n {files.map(file => (\n <FileRow\n key={file.id || file.path}\n file={file}\n {...(loadDiff ? { loadDiff } : {})}\n {...(diffMaxHeightClassName ? { diffMaxHeightClassName } : {})}\n />\n ))}\n </div>\n </div>\n );\n}\n\nexport function GitChangedFilesSummary({\n files,\n additions,\n deletions,\n className,\n}: {\n files: number;\n additions: number;\n deletions: number;\n className?: string;\n}) {\n return (\n <div className={cn(\"flex items-center gap-2 text-xs text-muted-foreground\", className)}>\n <span className=\"inline-flex items-center gap-1 font-medium\">\n <UiDiff className=\"h-3.5 w-3.5\" />\n {files} file{files === 1 ? \"\" : \"s\"} changed\n </span>\n <span aria-hidden>·</span>\n <span className=\"text-emerald-600 dark:text-emerald-400\">+{additions}</span>\n <span className=\"text-rose-600 dark:text-rose-400\">-{deletions}</span>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}