@flanksource/clicky-ui 0.3.58 → 0.3.60

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 (504) hide show
  1. package/NOTICE.md +58 -0
  2. package/dist/clicky.cjs +3 -1
  3. package/dist/clicky.d.ts +1 -0
  4. package/dist/clicky.d.ts.map +1 -1
  5. package/dist/clicky.js +3 -1
  6. package/dist/data/Clicky.cjs +23 -270
  7. package/dist/data/Clicky.cjs.map +1 -1
  8. package/dist/data/Clicky.d.ts +5 -29
  9. package/dist/data/Clicky.d.ts.map +1 -1
  10. package/dist/data/Clicky.js +11 -259
  11. package/dist/data/Clicky.js.map +1 -1
  12. package/dist/data/PromptBanner.model.cjs +10 -0
  13. package/dist/data/PromptBanner.model.cjs.map +1 -1
  14. package/dist/data/PromptBanner.model.d.ts +2 -0
  15. package/dist/data/PromptBanner.model.d.ts.map +1 -1
  16. package/dist/data/PromptBanner.model.js +10 -1
  17. package/dist/data/PromptBanner.model.js.map +1 -1
  18. package/dist/data/PromptDialog.cjs +16 -49
  19. package/dist/data/PromptDialog.cjs.map +1 -1
  20. package/dist/data/PromptDialog.d.ts +7 -1
  21. package/dist/data/PromptDialog.d.ts.map +1 -1
  22. package/dist/data/PromptDialog.js +17 -50
  23. package/dist/data/PromptDialog.js.map +1 -1
  24. package/dist/data/PromptForm.cjs +79 -0
  25. package/dist/data/PromptForm.cjs.map +1 -0
  26. package/dist/data/PromptForm.d.ts +26 -0
  27. package/dist/data/PromptForm.d.ts.map +1 -0
  28. package/dist/data/PromptForm.js +79 -0
  29. package/dist/data/PromptForm.js.map +1 -0
  30. package/dist/data/PromptIndicator.cjs +82 -0
  31. package/dist/data/PromptIndicator.cjs.map +1 -0
  32. package/dist/data/PromptIndicator.d.ts +19 -0
  33. package/dist/data/PromptIndicator.d.ts.map +1 -0
  34. package/dist/data/PromptIndicator.js +82 -0
  35. package/dist/data/PromptIndicator.js.map +1 -0
  36. package/dist/data/PromptList.cjs +67 -0
  37. package/dist/data/PromptList.cjs.map +1 -0
  38. package/dist/data/PromptList.d.ts +13 -0
  39. package/dist/data/PromptList.d.ts.map +1 -0
  40. package/dist/data/PromptList.js +67 -0
  41. package/dist/data/PromptList.js.map +1 -0
  42. package/dist/data/clicky-download.cjs +251 -0
  43. package/dist/data/clicky-download.cjs.map +1 -0
  44. package/dist/data/clicky-download.d.ts +55 -0
  45. package/dist/data/clicky-download.d.ts.map +1 -0
  46. package/dist/data/clicky-download.js +244 -0
  47. package/dist/data/clicky-download.js.map +1 -0
  48. package/dist/data/git/GitChangeList.cjs +11 -4
  49. package/dist/data/git/GitChangeList.cjs.map +1 -1
  50. package/dist/data/git/GitChangeList.d.ts +2 -35
  51. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  52. package/dist/data/git/GitChangeList.js +11 -4
  53. package/dist/data/git/GitChangeList.js.map +1 -1
  54. package/dist/data/git/GitLink.cjs +13 -0
  55. package/dist/data/git/GitLink.cjs.map +1 -0
  56. package/dist/data/git/GitLink.d.ts +8 -0
  57. package/dist/data/git/GitLink.d.ts.map +1 -0
  58. package/dist/data/git/GitLink.js +13 -0
  59. package/dist/data/git/GitLink.js.map +1 -0
  60. package/dist/data/git/git-links.cjs +54 -0
  61. package/dist/data/git/git-links.cjs.map +1 -0
  62. package/dist/data/git/git-links.d.ts +4 -0
  63. package/dist/data/git/git-links.d.ts.map +1 -0
  64. package/dist/data/git/git-links.js +53 -0
  65. package/dist/data/git/git-links.js.map +1 -0
  66. package/dist/data/git/index.d.ts +3 -0
  67. package/dist/data/git/index.d.ts.map +1 -1
  68. package/dist/data/git/types.d.ts +54 -0
  69. package/dist/data/git/types.d.ts.map +1 -0
  70. package/dist/data/test-runner/MatrixMarks.cjs +4 -3
  71. package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
  72. package/dist/data/test-runner/MatrixMarks.d.ts +7 -4
  73. package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
  74. package/dist/data/test-runner/MatrixMarks.js +4 -3
  75. package/dist/data/test-runner/MatrixMarks.js.map +1 -1
  76. package/dist/data/test-runner/TestRunSummary.cjs +1 -1
  77. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  78. package/dist/data/test-runner/TestRunSummary.js +1 -1
  79. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  80. package/dist/data/test-runner/TestTree.cjs +1 -1
  81. package/dist/data/test-runner/TestTree.cjs.map +1 -1
  82. package/dist/data/test-runner/TestTree.js +1 -1
  83. package/dist/data/test-runner/TestTree.js.map +1 -1
  84. package/dist/data/test-runner/TestTreeNode.cjs +2 -2
  85. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  86. package/dist/data/test-runner/TestTreeNode.js +2 -2
  87. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  88. package/dist/data/test-runner/adapter.cjs +7 -0
  89. package/dist/data/test-runner/adapter.cjs.map +1 -1
  90. package/dist/data/test-runner/adapter.d.ts +7 -0
  91. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  92. package/dist/data/test-runner/adapter.js +7 -0
  93. package/dist/data/test-runner/adapter.js.map +1 -1
  94. package/dist/data/test-runner/index.d.ts +1 -1
  95. package/dist/data/test-runner/index.d.ts.map +1 -1
  96. package/dist/data/test-runner/marks.cjs +3 -3
  97. package/dist/data/test-runner/marks.cjs.map +1 -1
  98. package/dist/data/test-runner/marks.js +3 -3
  99. package/dist/data/test-runner/marks.js.map +1 -1
  100. package/dist/data/test-runner/matrix-marks.cjs +12 -3
  101. package/dist/data/test-runner/matrix-marks.cjs.map +1 -1
  102. package/dist/data/test-runner/matrix-marks.d.ts +13 -0
  103. package/dist/data/test-runner/matrix-marks.d.ts.map +1 -1
  104. package/dist/data/test-runner/matrix-marks.js +12 -3
  105. package/dist/data/test-runner/matrix-marks.js.map +1 -1
  106. package/dist/data/test-runner/status.cjs +1 -1
  107. package/dist/data/test-runner/status.cjs.map +1 -1
  108. package/dist/data/test-runner/status.js +1 -1
  109. package/dist/data/test-runner/status.js.map +1 -1
  110. package/dist/data/test-runner/types.d.ts +2 -0
  111. package/dist/data/test-runner/types.d.ts.map +1 -1
  112. package/dist/data/traces/index.d.ts +2 -0
  113. package/dist/data/traces/index.d.ts.map +1 -1
  114. package/dist/data/traces/otel/OtelTraceDetail.cjs +102 -78
  115. package/dist/data/traces/otel/OtelTraceDetail.cjs.map +1 -1
  116. package/dist/data/traces/otel/OtelTraceDetail.d.ts +6 -2
  117. package/dist/data/traces/otel/OtelTraceDetail.d.ts.map +1 -1
  118. package/dist/data/traces/otel/OtelTraceDetail.js +102 -78
  119. package/dist/data/traces/otel/OtelTraceDetail.js.map +1 -1
  120. package/dist/data/traces/otel/OtelTraceTable.cjs +43 -7
  121. package/dist/data/traces/otel/OtelTraceTable.cjs.map +1 -1
  122. package/dist/data/traces/otel/OtelTraceTable.d.ts +14 -3
  123. package/dist/data/traces/otel/OtelTraceTable.d.ts.map +1 -1
  124. package/dist/data/traces/otel/OtelTraceTable.js +44 -8
  125. package/dist/data/traces/otel/OtelTraceTable.js.map +1 -1
  126. package/dist/data/traces/otel/profile-listing.cjs +61 -0
  127. package/dist/data/traces/otel/profile-listing.cjs.map +1 -0
  128. package/dist/data/traces/otel/profile-listing.d.ts +23 -0
  129. package/dist/data/traces/otel/profile-listing.d.ts.map +1 -0
  130. package/dist/data/traces/otel/profile-listing.js +60 -0
  131. package/dist/data/traces/otel/profile-listing.js.map +1 -0
  132. package/dist/data/traces/otel/profile-spans.cjs +22 -0
  133. package/dist/data/traces/otel/profile-spans.cjs.map +1 -0
  134. package/dist/data/traces/otel/profile-spans.d.ts +4 -0
  135. package/dist/data/traces/otel/profile-spans.d.ts.map +1 -0
  136. package/dist/data/traces/otel/profile-spans.js +22 -0
  137. package/dist/data/traces/otel/profile-spans.js.map +1 -0
  138. package/dist/data/traces/otel/span-traces.cjs +7 -1
  139. package/dist/data/traces/otel/span-traces.cjs.map +1 -1
  140. package/dist/data/traces/otel/span-traces.d.ts +2 -0
  141. package/dist/data/traces/otel/span-traces.d.ts.map +1 -1
  142. package/dist/data/traces/otel/span-traces.js +7 -2
  143. package/dist/data/traces/otel/span-traces.js.map +1 -1
  144. package/dist/data/useClickyTableMenu.cjs +33 -0
  145. package/dist/data/useClickyTableMenu.cjs.map +1 -0
  146. package/dist/data/useClickyTableMenu.d.ts +17 -0
  147. package/dist/data/useClickyTableMenu.d.ts.map +1 -0
  148. package/dist/data/useClickyTableMenu.js +33 -0
  149. package/dist/data/useClickyTableMenu.js.map +1 -0
  150. package/dist/data/verification/adapterViews.cjs +3 -1
  151. package/dist/data/verification/adapterViews.cjs.map +1 -1
  152. package/dist/data/verification/adapterViews.d.ts +5 -2
  153. package/dist/data/verification/adapterViews.d.ts.map +1 -1
  154. package/dist/data/verification/adapterViews.js +4 -2
  155. package/dist/data/verification/adapterViews.js.map +1 -1
  156. package/dist/data/verification/adapters.cjs +28 -7
  157. package/dist/data/verification/adapters.cjs.map +1 -1
  158. package/dist/data/verification/adapters.d.ts +7 -1
  159. package/dist/data/verification/adapters.d.ts.map +1 -1
  160. package/dist/data/verification/adapters.js +28 -7
  161. package/dist/data/verification/adapters.js.map +1 -1
  162. package/dist/data/verification/stepKind.cjs +1 -0
  163. package/dist/data/verification/stepKind.cjs.map +1 -1
  164. package/dist/data/verification/stepKind.d.ts.map +1 -1
  165. package/dist/data/verification/stepKind.js +1 -0
  166. package/dist/data/verification/stepKind.js.map +1 -1
  167. package/dist/data/verification/stepKindViews.cjs +17 -0
  168. package/dist/data/verification/stepKindViews.cjs.map +1 -1
  169. package/dist/data/verification/stepKindViews.d.ts +4 -0
  170. package/dist/data/verification/stepKindViews.d.ts.map +1 -1
  171. package/dist/data/verification/stepKindViews.js +17 -1
  172. package/dist/data/verification/stepKindViews.js.map +1 -1
  173. package/dist/data/version-info.cjs +3 -3
  174. package/dist/data/version-info.js +3 -3
  175. package/dist/data.cjs +121 -2
  176. package/dist/data.d.ts +3 -0
  177. package/dist/data.d.ts.map +1 -1
  178. package/dist/data.js +55 -3
  179. package/dist/git.cjs +6 -0
  180. package/dist/git.d.ts +4 -0
  181. package/dist/git.d.ts.map +1 -0
  182. package/dist/git.js +3 -0
  183. package/dist/hooks/use-prompts.cjs +18 -11
  184. package/dist/hooks/use-prompts.cjs.map +1 -1
  185. package/dist/hooks/use-prompts.d.ts.map +1 -1
  186. package/dist/hooks/use-prompts.js +18 -11
  187. package/dist/hooks/use-prompts.js.map +1 -1
  188. package/dist/icons/components/UiApi.cjs +37 -0
  189. package/dist/icons/components/UiApi.cjs.map +1 -0
  190. package/dist/icons/components/UiApi.d.ts +9 -0
  191. package/dist/icons/components/UiApi.d.ts.map +1 -0
  192. package/dist/icons/components/UiApi.js +35 -0
  193. package/dist/icons/components/UiApi.js.map +1 -0
  194. package/dist/icons/components/UiApiBridge.cjs +38 -0
  195. package/dist/icons/components/UiApiBridge.cjs.map +1 -0
  196. package/dist/icons/components/UiApiBridge.d.ts +9 -0
  197. package/dist/icons/components/UiApiBridge.d.ts.map +1 -0
  198. package/dist/icons/components/UiApiBridge.js +36 -0
  199. package/dist/icons/components/UiApiBridge.js.map +1 -0
  200. package/dist/icons/components/UiApiGateway.cjs +33 -0
  201. package/dist/icons/components/UiApiGateway.cjs.map +1 -0
  202. package/dist/icons/components/UiApiGateway.d.ts +9 -0
  203. package/dist/icons/components/UiApiGateway.d.ts.map +1 -0
  204. package/dist/icons/components/UiApiGateway.js +31 -0
  205. package/dist/icons/components/UiApiGateway.js.map +1 -0
  206. package/dist/icons/components/UiApiRequest.cjs +37 -0
  207. package/dist/icons/components/UiApiRequest.cjs.map +1 -0
  208. package/dist/icons/components/UiApiRequest.d.ts +9 -0
  209. package/dist/icons/components/UiApiRequest.d.ts.map +1 -0
  210. package/dist/icons/components/UiApiRequest.js +35 -0
  211. package/dist/icons/components/UiApiRequest.js.map +1 -0
  212. package/dist/icons/components/UiArrowDecision.cjs +51 -0
  213. package/dist/icons/components/UiArrowDecision.cjs.map +1 -0
  214. package/dist/icons/components/UiArrowDecision.d.ts +15 -0
  215. package/dist/icons/components/UiArrowDecision.d.ts.map +1 -0
  216. package/dist/icons/components/UiArrowDecision.js +48 -0
  217. package/dist/icons/components/UiArrowDecision.js.map +1 -0
  218. package/dist/icons/components/UiArrowSquareIn.cjs +51 -0
  219. package/dist/icons/components/UiArrowSquareIn.cjs.map +1 -0
  220. package/dist/icons/components/UiArrowSquareIn.d.ts +15 -0
  221. package/dist/icons/components/UiArrowSquareIn.d.ts.map +1 -0
  222. package/dist/icons/components/UiArrowSquareIn.js +48 -0
  223. package/dist/icons/components/UiArrowSquareIn.js.map +1 -0
  224. package/dist/icons/components/UiBatchCheck.cjs +55 -0
  225. package/dist/icons/components/UiBatchCheck.cjs.map +1 -0
  226. package/dist/icons/components/UiBatchCheck.d.ts +15 -0
  227. package/dist/icons/components/UiBatchCheck.d.ts.map +1 -0
  228. package/dist/icons/components/UiBatchCheck.js +52 -0
  229. package/dist/icons/components/UiBatchCheck.js.map +1 -0
  230. package/dist/icons/components/UiBatchJob.cjs +39 -0
  231. package/dist/icons/components/UiBatchJob.cjs.map +1 -0
  232. package/dist/icons/components/UiBatchJob.d.ts +9 -0
  233. package/dist/icons/components/UiBatchJob.d.ts.map +1 -0
  234. package/dist/icons/components/UiBatchJob.js +37 -0
  235. package/dist/icons/components/UiBatchJob.js.map +1 -0
  236. package/dist/icons/components/UiBatchRequest.cjs +39 -0
  237. package/dist/icons/components/UiBatchRequest.cjs.map +1 -0
  238. package/dist/icons/components/UiBatchRequest.d.ts +9 -0
  239. package/dist/icons/components/UiBatchRequest.d.ts.map +1 -0
  240. package/dist/icons/components/UiBatchRequest.js +37 -0
  241. package/dist/icons/components/UiBatchRequest.js.map +1 -0
  242. package/dist/icons/components/UiBpmnConditional.cjs +29 -0
  243. package/dist/icons/components/UiBpmnConditional.cjs.map +1 -0
  244. package/dist/icons/components/UiBpmnConditional.d.ts +9 -0
  245. package/dist/icons/components/UiBpmnConditional.d.ts.map +1 -0
  246. package/dist/icons/components/UiBpmnConditional.js +27 -0
  247. package/dist/icons/components/UiBpmnConditional.js.map +1 -0
  248. package/dist/icons/components/UiBranchFlow.cjs +33 -0
  249. package/dist/icons/components/UiBranchFlow.cjs.map +1 -0
  250. package/dist/icons/components/UiBranchFlow.d.ts +9 -0
  251. package/dist/icons/components/UiBranchFlow.d.ts.map +1 -0
  252. package/dist/icons/components/UiBranchFlow.js +31 -0
  253. package/dist/icons/components/UiBranchFlow.js.map +1 -0
  254. package/dist/icons/components/UiClassicBatch.cjs +29 -0
  255. package/dist/icons/components/UiClassicBatch.cjs.map +1 -0
  256. package/dist/icons/components/UiClassicBatch.d.ts +9 -0
  257. package/dist/icons/components/UiClassicBatch.d.ts.map +1 -0
  258. package/dist/icons/components/UiClassicBatch.js +27 -0
  259. package/dist/icons/components/UiClassicBatch.js.map +1 -0
  260. package/dist/icons/components/UiCodeFile.cjs +29 -0
  261. package/dist/icons/components/UiCodeFile.cjs.map +1 -0
  262. package/dist/icons/components/UiCodeFile.d.ts +9 -0
  263. package/dist/icons/components/UiCodeFile.d.ts.map +1 -0
  264. package/dist/icons/components/UiCodeFile.js +27 -0
  265. package/dist/icons/components/UiCodeFile.js.map +1 -0
  266. package/dist/icons/components/UiColumnsLayout.cjs +29 -0
  267. package/dist/icons/components/UiColumnsLayout.cjs.map +1 -0
  268. package/dist/icons/components/UiColumnsLayout.d.ts +9 -0
  269. package/dist/icons/components/UiColumnsLayout.d.ts.map +1 -0
  270. package/dist/icons/components/UiColumnsLayout.js +27 -0
  271. package/dist/icons/components/UiColumnsLayout.js.map +1 -0
  272. package/dist/icons/components/UiCondition.cjs +37 -0
  273. package/dist/icons/components/UiCondition.cjs.map +1 -0
  274. package/dist/icons/components/UiCondition.d.ts +9 -0
  275. package/dist/icons/components/UiCondition.d.ts.map +1 -0
  276. package/dist/icons/components/UiCondition.js +35 -0
  277. package/dist/icons/components/UiCondition.js.map +1 -0
  278. package/dist/icons/components/UiConditions.cjs +29 -0
  279. package/dist/icons/components/UiConditions.cjs.map +1 -0
  280. package/dist/icons/components/UiConditions.d.ts +9 -0
  281. package/dist/icons/components/UiConditions.d.ts.map +1 -0
  282. package/dist/icons/components/UiConditions.js +27 -0
  283. package/dist/icons/components/UiConditions.js.map +1 -0
  284. package/dist/icons/components/UiDelayQueue.cjs +40 -0
  285. package/dist/icons/components/UiDelayQueue.cjs.map +1 -0
  286. package/dist/icons/components/UiDelayQueue.d.ts +9 -0
  287. package/dist/icons/components/UiDelayQueue.d.ts.map +1 -0
  288. package/dist/icons/components/UiDelayQueue.js +38 -0
  289. package/dist/icons/components/UiDelayQueue.js.map +1 -0
  290. package/dist/icons/components/UiDynamicForm.cjs +51 -0
  291. package/dist/icons/components/UiDynamicForm.cjs.map +1 -0
  292. package/dist/icons/components/UiDynamicForm.d.ts +15 -0
  293. package/dist/icons/components/UiDynamicForm.d.ts.map +1 -0
  294. package/dist/icons/components/UiDynamicForm.js +48 -0
  295. package/dist/icons/components/UiDynamicForm.js.map +1 -0
  296. package/dist/icons/components/UiFlowArrow.cjs +51 -0
  297. package/dist/icons/components/UiFlowArrow.cjs.map +1 -0
  298. package/dist/icons/components/UiFlowArrow.d.ts +15 -0
  299. package/dist/icons/components/UiFlowArrow.d.ts.map +1 -0
  300. package/dist/icons/components/UiFlowArrow.js +48 -0
  301. package/dist/icons/components/UiFlowArrow.js.map +1 -0
  302. package/dist/icons/components/UiFormFields.cjs +33 -0
  303. package/dist/icons/components/UiFormFields.cjs.map +1 -0
  304. package/dist/icons/components/UiFormFields.d.ts +9 -0
  305. package/dist/icons/components/UiFormFields.d.ts.map +1 -0
  306. package/dist/icons/components/UiFormFields.js +31 -0
  307. package/dist/icons/components/UiFormFields.js.map +1 -0
  308. package/dist/icons/components/UiFormStep.cjs +38 -0
  309. package/dist/icons/components/UiFormStep.cjs.map +1 -0
  310. package/dist/icons/components/UiFormStep.d.ts +9 -0
  311. package/dist/icons/components/UiFormStep.d.ts.map +1 -0
  312. package/dist/icons/components/UiFormStep.js +36 -0
  313. package/dist/icons/components/UiFormStep.js.map +1 -0
  314. package/dist/icons/components/UiGatewayApi.cjs +32 -0
  315. package/dist/icons/components/UiGatewayApi.cjs.map +1 -0
  316. package/dist/icons/components/UiGatewayApi.d.ts +9 -0
  317. package/dist/icons/components/UiGatewayApi.d.ts.map +1 -0
  318. package/dist/icons/components/UiGatewayApi.js +30 -0
  319. package/dist/icons/components/UiGatewayApi.js.map +1 -0
  320. package/dist/icons/components/UiImportArrow.cjs +29 -0
  321. package/dist/icons/components/UiImportArrow.cjs.map +1 -0
  322. package/dist/icons/components/UiImportArrow.d.ts +9 -0
  323. package/dist/icons/components/UiImportArrow.d.ts.map +1 -0
  324. package/dist/icons/components/UiImportArrow.js +27 -0
  325. package/dist/icons/components/UiImportArrow.js.map +1 -0
  326. package/dist/icons/components/UiInputField.cjs +33 -0
  327. package/dist/icons/components/UiInputField.cjs.map +1 -0
  328. package/dist/icons/components/UiInputField.d.ts +9 -0
  329. package/dist/icons/components/UiInputField.d.ts.map +1 -0
  330. package/dist/icons/components/UiInputField.js +31 -0
  331. package/dist/icons/components/UiInputField.js.map +1 -0
  332. package/dist/icons/components/UiInsertTable.cjs +29 -0
  333. package/dist/icons/components/UiInsertTable.cjs.map +1 -0
  334. package/dist/icons/components/UiInsertTable.d.ts +9 -0
  335. package/dist/icons/components/UiInsertTable.d.ts.map +1 -0
  336. package/dist/icons/components/UiInsertTable.js +27 -0
  337. package/dist/icons/components/UiInsertTable.js.map +1 -0
  338. package/dist/icons/components/UiLayoutTemplate.cjs +32 -0
  339. package/dist/icons/components/UiLayoutTemplate.cjs.map +1 -0
  340. package/dist/icons/components/UiLayoutTemplate.d.ts +9 -0
  341. package/dist/icons/components/UiLayoutTemplate.d.ts.map +1 -0
  342. package/dist/icons/components/UiLayoutTemplate.js +30 -0
  343. package/dist/icons/components/UiLayoutTemplate.js.map +1 -0
  344. package/dist/icons/components/UiLayoutWindow.cjs +56 -0
  345. package/dist/icons/components/UiLayoutWindow.cjs.map +1 -0
  346. package/dist/icons/components/UiLayoutWindow.d.ts +15 -0
  347. package/dist/icons/components/UiLayoutWindow.d.ts.map +1 -0
  348. package/dist/icons/components/UiLayoutWindow.js +53 -0
  349. package/dist/icons/components/UiLayoutWindow.js.map +1 -0
  350. package/dist/icons/components/UiListEnd.cjs +33 -0
  351. package/dist/icons/components/UiListEnd.cjs.map +1 -0
  352. package/dist/icons/components/UiListEnd.d.ts +9 -0
  353. package/dist/icons/components/UiListEnd.d.ts.map +1 -0
  354. package/dist/icons/components/UiListEnd.js +31 -0
  355. package/dist/icons/components/UiListEnd.js.map +1 -0
  356. package/dist/icons/components/UiListEndLine.cjs +51 -0
  357. package/dist/icons/components/UiListEndLine.cjs.map +1 -0
  358. package/dist/icons/components/UiListEndLine.d.ts +15 -0
  359. package/dist/icons/components/UiListEndLine.d.ts.map +1 -0
  360. package/dist/icons/components/UiListEndLine.js +48 -0
  361. package/dist/icons/components/UiListEndLine.js.map +1 -0
  362. package/dist/icons/components/UiListNumbers.cjs +51 -0
  363. package/dist/icons/components/UiListNumbers.cjs.map +1 -0
  364. package/dist/icons/components/UiListNumbers.d.ts +15 -0
  365. package/dist/icons/components/UiListNumbers.d.ts.map +1 -0
  366. package/dist/icons/components/UiListNumbers.js +48 -0
  367. package/dist/icons/components/UiListNumbers.js.map +1 -0
  368. package/dist/icons/components/UiLowPriority.cjs +29 -0
  369. package/dist/icons/components/UiLowPriority.cjs.map +1 -0
  370. package/dist/icons/components/UiLowPriority.d.ts +9 -0
  371. package/dist/icons/components/UiLowPriority.d.ts.map +1 -0
  372. package/dist/icons/components/UiLowPriority.js +27 -0
  373. package/dist/icons/components/UiLowPriority.js.map +1 -0
  374. package/dist/icons/components/UiMergeQueue.cjs +38 -0
  375. package/dist/icons/components/UiMergeQueue.cjs.map +1 -0
  376. package/dist/icons/components/UiMergeQueue.d.ts +9 -0
  377. package/dist/icons/components/UiMergeQueue.d.ts.map +1 -0
  378. package/dist/icons/components/UiMergeQueue.js +36 -0
  379. package/dist/icons/components/UiMergeQueue.js.map +1 -0
  380. package/dist/icons/components/UiPipelineStage.cjs +33 -0
  381. package/dist/icons/components/UiPipelineStage.cjs.map +1 -0
  382. package/dist/icons/components/UiPipelineStage.d.ts +9 -0
  383. package/dist/icons/components/UiPipelineStage.d.ts.map +1 -0
  384. package/dist/icons/components/UiPipelineStage.js +31 -0
  385. package/dist/icons/components/UiPipelineStage.js.map +1 -0
  386. package/dist/icons/components/UiPlaylistRemove.cjs +29 -0
  387. package/dist/icons/components/UiPlaylistRemove.cjs.map +1 -0
  388. package/dist/icons/components/UiPlaylistRemove.d.ts +9 -0
  389. package/dist/icons/components/UiPlaylistRemove.d.ts.map +1 -0
  390. package/dist/icons/components/UiPlaylistRemove.js +27 -0
  391. package/dist/icons/components/UiPlaylistRemove.js.map +1 -0
  392. package/dist/icons/components/UiReportForms.cjs +51 -0
  393. package/dist/icons/components/UiReportForms.cjs.map +1 -0
  394. package/dist/icons/components/UiReportForms.d.ts +15 -0
  395. package/dist/icons/components/UiReportForms.d.ts.map +1 -0
  396. package/dist/icons/components/UiReportForms.js +48 -0
  397. package/dist/icons/components/UiReportForms.js.map +1 -0
  398. package/dist/icons/components/UiScreenTemplate.cjs +29 -0
  399. package/dist/icons/components/UiScreenTemplate.cjs.map +1 -0
  400. package/dist/icons/components/UiScreenTemplate.d.ts +9 -0
  401. package/dist/icons/components/UiScreenTemplate.d.ts.map +1 -0
  402. package/dist/icons/components/UiScreenTemplate.js +27 -0
  403. package/dist/icons/components/UiScreenTemplate.js.map +1 -0
  404. package/dist/icons/components/UiServices.cjs +29 -0
  405. package/dist/icons/components/UiServices.cjs.map +1 -0
  406. package/dist/icons/components/UiServices.d.ts +9 -0
  407. package/dist/icons/components/UiServices.d.ts.map +1 -0
  408. package/dist/icons/components/UiServices.js +27 -0
  409. package/dist/icons/components/UiServices.js.map +1 -0
  410. package/dist/icons/components/UiSkipCircle.cjs +51 -0
  411. package/dist/icons/components/UiSkipCircle.cjs.map +1 -0
  412. package/dist/icons/components/UiSkipCircle.d.ts +15 -0
  413. package/dist/icons/components/UiSkipCircle.d.ts.map +1 -0
  414. package/dist/icons/components/UiSkipCircle.js +48 -0
  415. package/dist/icons/components/UiSkipCircle.js.map +1 -0
  416. package/dist/icons/components/UiTaskBatch.cjs +33 -0
  417. package/dist/icons/components/UiTaskBatch.cjs.map +1 -0
  418. package/dist/icons/components/UiTaskBatch.d.ts +9 -0
  419. package/dist/icons/components/UiTaskBatch.d.ts.map +1 -0
  420. package/dist/icons/components/UiTaskBatch.js +31 -0
  421. package/dist/icons/components/UiTaskBatch.js.map +1 -0
  422. package/dist/icons/components/UiTodoList.cjs +29 -0
  423. package/dist/icons/components/UiTodoList.cjs.map +1 -0
  424. package/dist/icons/components/UiTodoList.d.ts +9 -0
  425. package/dist/icons/components/UiTodoList.d.ts.map +1 -0
  426. package/dist/icons/components/UiTodoList.js +27 -0
  427. package/dist/icons/components/UiTodoList.js.map +1 -0
  428. package/dist/icons/components/UiTrayArrowDown.cjs +51 -0
  429. package/dist/icons/components/UiTrayArrowDown.cjs.map +1 -0
  430. package/dist/icons/components/UiTrayArrowDown.d.ts +15 -0
  431. package/dist/icons/components/UiTrayArrowDown.d.ts.map +1 -0
  432. package/dist/icons/components/UiTrayArrowDown.js +48 -0
  433. package/dist/icons/components/UiTrayArrowDown.js.map +1 -0
  434. package/dist/icons/components/UiVault.cjs +51 -0
  435. package/dist/icons/components/UiVault.cjs.map +1 -0
  436. package/dist/icons/components/UiVault.d.ts +15 -0
  437. package/dist/icons/components/UiVault.d.ts.map +1 -0
  438. package/dist/icons/components/UiVault.js +48 -0
  439. package/dist/icons/components/UiVault.js.map +1 -0
  440. package/dist/icons/components/UiWebServiceDefinition.cjs +39 -0
  441. package/dist/icons/components/UiWebServiceDefinition.cjs.map +1 -0
  442. package/dist/icons/components/UiWebServiceDefinition.d.ts +9 -0
  443. package/dist/icons/components/UiWebServiceDefinition.d.ts.map +1 -0
  444. package/dist/icons/components/UiWebServiceDefinition.js +37 -0
  445. package/dist/icons/components/UiWebServiceDefinition.js.map +1 -0
  446. package/dist/icons/components/UiWebhook.cjs +29 -0
  447. package/dist/icons/components/UiWebhook.cjs.map +1 -0
  448. package/dist/icons/components/UiWebhook.d.ts +9 -0
  449. package/dist/icons/components/UiWebhook.d.ts.map +1 -0
  450. package/dist/icons/components/UiWebhook.js +27 -0
  451. package/dist/icons/components/UiWebhook.js.map +1 -0
  452. package/dist/icons/components/UiWebhookLine.cjs +51 -0
  453. package/dist/icons/components/UiWebhookLine.cjs.map +1 -0
  454. package/dist/icons/components/UiWebhookLine.d.ts +15 -0
  455. package/dist/icons/components/UiWebhookLine.d.ts.map +1 -0
  456. package/dist/icons/components/UiWebhookLine.js +48 -0
  457. package/dist/icons/components/UiWebhookLine.js.map +1 -0
  458. package/dist/icons/index.d.ts +58 -0
  459. package/dist/icons/index.d.ts.map +1 -1
  460. package/dist/icons/registry.cjs +90 -0
  461. package/dist/icons/registry.cjs.map +1 -1
  462. package/dist/icons/registry.d.ts.map +1 -1
  463. package/dist/icons/registry.js +90 -0
  464. package/dist/icons/registry.js.map +1 -1
  465. package/dist/icons.cjs +103 -0
  466. package/dist/icons.js +46 -1
  467. package/dist/index.cjs +128 -3
  468. package/dist/index.js +59 -4
  469. package/dist/overlay/DropdownMenu.cjs +17 -14
  470. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  471. package/dist/overlay/DropdownMenu.d.ts +1 -0
  472. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  473. package/dist/overlay/DropdownMenu.js +18 -15
  474. package/dist/overlay/DropdownMenu.js.map +1 -1
  475. package/dist/rpc/EntityExplorerApp.cjs +49 -12
  476. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  477. package/dist/rpc/EntityExplorerApp.d.ts +10 -1
  478. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  479. package/dist/rpc/EntityExplorerApp.js +51 -14
  480. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  481. package/dist/rpc/EntitySurface.cjs +38 -0
  482. package/dist/rpc/EntitySurface.cjs.map +1 -0
  483. package/dist/rpc/EntitySurface.d.ts +17 -0
  484. package/dist/rpc/EntitySurface.d.ts.map +1 -0
  485. package/dist/rpc/EntitySurface.js +38 -0
  486. package/dist/rpc/EntitySurface.js.map +1 -0
  487. package/dist/rpc/ExplorerNav.cjs +48 -0
  488. package/dist/rpc/ExplorerNav.cjs.map +1 -0
  489. package/dist/rpc/ExplorerNav.d.ts +12 -0
  490. package/dist/rpc/ExplorerNav.d.ts.map +1 -0
  491. package/dist/rpc/ExplorerNav.js +48 -0
  492. package/dist/rpc/ExplorerNav.js.map +1 -0
  493. package/dist/rpc/explorer-nav-context.cjs +5 -0
  494. package/dist/rpc/explorer-nav-context.cjs.map +1 -0
  495. package/dist/rpc/explorer-nav-context.d.ts +11 -0
  496. package/dist/rpc/explorer-nav-context.d.ts.map +1 -0
  497. package/dist/rpc/explorer-nav-context.js +6 -0
  498. package/dist/rpc/explorer-nav-context.js.map +1 -0
  499. package/dist/rpc.cjs +4 -0
  500. package/dist/rpc.d.ts +2 -0
  501. package/dist/rpc.d.ts.map +1 -1
  502. package/dist/rpc.js +3 -1
  503. package/dist/styles.css +1 -1
  504. package/package.json +6 -1
@@ -14,6 +14,7 @@ const require_Checkbox = require("../../components/Checkbox.cjs");
14
14
  const require_code_highlight = require("../code-highlight.cjs");
15
15
  const require_CodeDiff = require("../CodeDiff.cjs");
16
16
  const require_git_dates = require("./git-dates.cjs");
17
+ const require_git_links = require("./git-links.cjs");
17
18
  let react = require("react");
18
19
  let react_jsx_runtime = require("react/jsx-runtime");
19
20
  // src/data/git/GitChangeList.tsx
@@ -156,6 +157,7 @@ function CommitRow({ commit, selected, slots }) {
156
157
  const [expandedState, diffState, toggle] = useLazyDiff(commit, loadDiff);
157
158
  const expanded = !onOpen && expandedState;
158
159
  const author = displayAuthor(commit);
160
+ const href = commit.href ?? (commit.repository ? require_git_links.gitWebLink(commit.repository, { commit: commit.sha }) : void 0);
159
161
  const canExpand = Boolean(onOpen || loadDiff || renderExpanded || commit.body);
160
162
  const activate = onOpen ? () => onOpen(commit) : toggle;
161
163
  const selectable = onToggleSelect !== void 0;
@@ -228,8 +230,8 @@ function CommitRow({ commit, selected, slots }) {
228
230
  })
229
231
  ]
230
232
  }),
231
- commit.href ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
232
- href: commit.href,
233
+ href ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
234
+ href,
233
235
  target: "_blank",
234
236
  rel: "noopener noreferrer",
235
237
  className: "mt-0.5 inline-flex shrink-0 items-center gap-1 font-mono text-cyan-600 hover:underline",
@@ -359,6 +361,11 @@ function FileRow({ file, loadDiff, diffMaxHeightClassName }) {
359
361
  const status = statusView(file.status);
360
362
  const StatusIcon = status.icon;
361
363
  const path = splitPath(file.path);
364
+ if (file.href === void 0 && file.repository && !file.commit) throw new Error(`Git file "${file.path}" requires a commit for its repository link`);
365
+ const href = file.href ?? (file.repository && file.commit ? require_git_links.gitWebLink(file.repository, {
366
+ commit: file.commit,
367
+ file: file.path
368
+ }) : void 0);
362
369
  const canExpand = Boolean(loadDiff);
363
370
  function onKeyDown(event) {
364
371
  if (!canExpand || !isActivationKey(event)) return;
@@ -403,8 +410,8 @@ function FileRow({ file, loadDiff, diffMaxHeightClassName }) {
403
410
  ...file.additions !== void 0 ? { additions: file.additions } : {},
404
411
  ...file.deletions !== void 0 ? { deletions: file.deletions } : {}
405
412
  }),
406
- file.href && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
407
- href: file.href,
413
+ href && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
414
+ href,
408
415
  target: "_blank",
409
416
  rel: "noopener noreferrer",
410
417
  className: "shrink-0 text-muted-foreground hover:text-foreground",
@@ -1 +1 @@
1
- {"version":3,"file":"GitChangeList.cjs","names":["dateKey","formatGitCommitDateHeader","_Fragment","useState","UiChevronDown","UiChevronRight","cn","languageFromPath","CodeDiff","Checkbox","UiGitCommit","UiClock","formatFallbackTime","UiLinkExternal","useMemo","UiFilePlus","UiRemove","UiFileCode","UiCode2","UiFile","UiDiff"],"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 { Checkbox } from \"../../components/Checkbox\";\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\ntype GitCommitListBaseProps<T extends GitCommitItem> = {\n commits: T[];\n renderTime?: (iso: string) => ReactNode;\n groupByDate?: boolean;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n /** SHAs whose leading checkbox is checked. Only read when `onToggleSelect` is set. */\n selectedShas?: string[];\n /** Renders a leading checkbox per commit; called with the commit whose box was toggled. */\n onToggleSelect?: (commit: T) => void;\n /** Accessible name of a commit's checkbox. Defaults to `Select commit <short sha>`. */\n selectLabel?: (commit: T) => string;\n /** Why a commit cannot be selected; its checkbox is then disabled with the reason as its tooltip. */\n selectBlockReason?: (commit: T) => string | null | undefined;\n /** Inline badges rendered after the commit title. */\n renderBadges?: (commit: T) => ReactNode;\n /** An extra line rendered between the title and the author/time line. */\n renderSubtitle?: (commit: T) => ReactNode;\n};\n\n// The expanded body is either the lazily loaded unified diff (`loadDiff` →\n// `GitDiffPanel`) or a host-rendered node (`renderExpanded`), never both.\n// `renderExpanded` is only called while the row is expanded, so a host\n// component it returns can fetch on mount. `onOpen` replaces expansion: the\n// row navigates to the host's commit view instead of opening in place.\ntype GitCommitListBody<T extends GitCommitItem> =\n | { loadDiff?: GitDiffLoader<T>; renderExpanded?: never; onOpen?: never }\n | { renderExpanded: (commit: T) => ReactNode; loadDiff?: never; onOpen?: never }\n | { onOpen: (commit: T) => void; loadDiff?: never; renderExpanded?: never };\n\nexport type GitCommitListProps<T extends GitCommitItem = GitCommitItem> =\n GitCommitListBaseProps<T> & GitCommitListBody<T>;\n\nexport type GitFileListProps = {\n files: GitFileChangeItem[];\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\ntype CommitGroup<T extends GitCommitItem> = {\n key: string;\n label: string;\n commits: T[];\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<T extends GitCommitItem>(commits: T[], enabled: boolean): CommitGroup<T>[] {\n if (!enabled) return [{ key: \"all\", label: \"\", commits }];\n const groups: CommitGroup<T>[] = [];\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\n// Every optional CommitRow input, resolved once by GitCommitList so the row\n// receives a single object instead of a dozen conditional spreads.\ntype CommitRowSlots<T extends GitCommitItem> = {\n loadDiff: GitDiffLoader<T> | undefined;\n renderExpanded: ((commit: T) => ReactNode) | undefined;\n onOpen: ((commit: T) => void) | undefined;\n renderTime: ((iso: string) => ReactNode) | undefined;\n renderBadges: ((commit: T) => ReactNode) | undefined;\n renderSubtitle: ((commit: T) => ReactNode) | undefined;\n onToggleSelect: ((commit: T) => void) | undefined;\n selectLabel: ((commit: T) => string) | undefined;\n selectBlockReason: ((commit: T) => string | null | undefined) | undefined;\n diffMaxHeightClassName: string | undefined;\n};\n\nfunction CommitRow<T extends GitCommitItem>({\n commit,\n selected,\n slots,\n}: {\n commit: T;\n selected: boolean;\n slots: CommitRowSlots<T>;\n}) {\n const { loadDiff, renderExpanded, onOpen, renderTime, renderBadges, renderSubtitle, onToggleSelect } = slots;\n const [expandedState, diffState, toggle] = useLazyDiff(commit, loadDiff);\n const expanded = !onOpen && expandedState;\n const author = displayAuthor(commit);\n const canExpand = Boolean(onOpen || loadDiff || renderExpanded || commit.body);\n const activate = onOpen ? () => onOpen(commit) : toggle;\n const selectable = onToggleSelect !== undefined;\n const selectBlocked = selectable ? slots.selectBlockReason?.(commit) || undefined : undefined;\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n activate();\n }\n\n return (\n <div\n data-commit={commit.sha}\n data-selected={selectable ? String(selected) : undefined}\n className={cn(selectable && selected && \"bg-primary/5\")}\n >\n <div className={cn(\"flex items-start transition-colors\", canExpand && \"hover:bg-muted/70\")}>\n {selectable && (\n <span className=\"flex shrink-0 pl-3 pt-3.5\" title={selectBlocked}>\n <Checkbox\n checked={selected}\n disabled={Boolean(selectBlocked)}\n onChange={() => onToggleSelect(commit)}\n aria-label={slots.selectLabel ? slots.selectLabel(commit) : `Select commit ${shortSha(commit)}`}\n />\n </span>\n )}\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n aria-expanded={canExpand && !onOpen ? expanded : undefined}\n className={cn(\n \"flex min-h-14 min-w-0 flex-1 items-start gap-2 py-2 pr-3 text-xs\",\n selectable ? \"pl-2\" : \"pl-3\",\n canExpand && \"cursor-pointer\",\n )}\n onClick={canExpand ? activate : 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=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n <span className=\"min-w-0 truncate font-medium text-foreground\" title={commit.title}>\n {commit.title}\n </span>\n {renderBadges?.(commit)}\n </div>\n {renderSubtitle?.(commit)}\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 </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 {renderExpanded\n ? renderExpanded(commit)\n : loadDiff && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(slots.diffMaxHeightClassName\n ? { maxHeightClassName: slots.diffMaxHeightClassName }\n : {})}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function GitCommitList<T extends GitCommitItem = GitCommitItem>(\n props: GitCommitListProps<T>,\n) {\n const {\n commits,\n groupByDate = true,\n emptyLabel = \"No commits found\",\n className,\n selectedShas,\n } = props;\n const groups = useMemo(() => groupCommits(commits, groupByDate), [commits, groupByDate]);\n const slots: CommitRowSlots<T> = {\n loadDiff: props.loadDiff,\n renderExpanded: props.renderExpanded,\n onOpen: props.onOpen,\n renderTime: props.renderTime,\n renderBadges: props.renderBadges,\n renderSubtitle: props.renderSubtitle,\n onToggleSelect: props.onToggleSelect,\n selectLabel: props.selectLabel,\n selectBlockReason: props.selectBlockReason,\n diffMaxHeightClassName: props.diffMaxHeightClassName,\n };\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 selected={selectedShas?.includes(commit.sha) ?? false}\n slots={slots}\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"],"mappings":"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"}
1
+ {"version":3,"file":"GitChangeList.cjs","names":["dateKey","formatGitCommitDateHeader","_Fragment","useState","UiChevronDown","UiChevronRight","cn","languageFromPath","CodeDiff","gitWebLink","Checkbox","UiGitCommit","UiClock","formatFallbackTime","UiLinkExternal","useMemo","UiFilePlus","UiRemove","UiFileCode","UiCode2","UiFile","UiDiff"],"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 { Checkbox } from \"../../components/Checkbox\";\nimport {\n CodeDiff,\n type DiffLineTarget,\n type DiffLineWidget,\n} from \"../CodeDiff\";\nimport { languageFromPath } from \"../code-highlight\";\nimport {\n dateKey,\n formatFallbackTime,\n formatGitCommitDateHeader,\n} from \"./git-dates\";\nimport type {\n GitCommitItem,\n GitDiffLoader,\n GitDiffPayload,\n GitFileChangeItem,\n} from \"./types\";\nimport { gitWebLink } from \"./git-links\";\nexport type {\n GitCommitItem,\n GitDiffLoader,\n GitDiffPayload,\n GitFileChangeItem,\n GitFileChangeStatus,\n} from \"./types\";\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\ntype GitCommitListBaseProps<T extends GitCommitItem> = {\n commits: T[];\n renderTime?: (iso: string) => ReactNode;\n groupByDate?: boolean;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n /** SHAs whose leading checkbox is checked. Only read when `onToggleSelect` is set. */\n selectedShas?: string[];\n /** Renders a leading checkbox per commit; called with the commit whose box was toggled. */\n onToggleSelect?: (commit: T) => void;\n /** Accessible name of a commit's checkbox. Defaults to `Select commit <short sha>`. */\n selectLabel?: (commit: T) => string;\n /** Why a commit cannot be selected; its checkbox is then disabled with the reason as its tooltip. */\n selectBlockReason?: (commit: T) => string | null | undefined;\n /** Inline badges rendered after the commit title. */\n renderBadges?: (commit: T) => ReactNode;\n /** An extra line rendered between the title and the author/time line. */\n renderSubtitle?: (commit: T) => ReactNode;\n};\n\n// The expanded body is either the lazily loaded unified diff (`loadDiff` →\n// `GitDiffPanel`) or a host-rendered node (`renderExpanded`), never both.\n// `renderExpanded` is only called while the row is expanded, so a host\n// component it returns can fetch on mount. `onOpen` replaces expansion: the\n// row navigates to the host's commit view instead of opening in place.\ntype GitCommitListBody<T extends GitCommitItem> =\n | { loadDiff?: GitDiffLoader<T>; renderExpanded?: never; onOpen?: never }\n | {\n renderExpanded: (commit: T) => ReactNode;\n loadDiff?: never;\n onOpen?: never;\n }\n | { onOpen: (commit: T) => void; loadDiff?: never; renderExpanded?: never };\n\nexport type GitCommitListProps<T extends GitCommitItem = GitCommitItem> =\n GitCommitListBaseProps<T> & GitCommitListBody<T>;\n\nexport type GitFileListProps = {\n files: GitFileChangeItem[];\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\ntype CommitGroup<T extends GitCommitItem> = {\n key: string;\n label: string;\n commits: T[];\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<T extends GitCommitItem>(\n commits: T[],\n enabled: boolean,\n): CommitGroup<T>[] {\n if (!enabled) return [{ key: \"all\", label: \"\", commits }];\n const groups: CommitGroup<T>[] = [];\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 && (\n <span className=\"text-emerald-600 dark:text-emerald-400\">+{adds}</span>\n )}\n {dels > 0 && (\n <span className=\"text-rose-600 dark:text-rose-400\">-{dels}</span>\n )}\n </>\n );\n}\n\nfunction useLazyDiff<T>(\n item: T,\n loader: GitDiffLoader<T> | undefined,\n): [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 (\n !expanded &&\n loader &&\n !state.payload &&\n !state.loading &&\n !state.error\n ) {\n setState({ loading: true, payload: null, error: \"\" });\n loader(item)\n .then((payload) => setState({ loading: false, payload, error: \"\" }))\n .catch((error) =>\n setState({\n loading: false,\n payload: null,\n error: messageFromError(error),\n }),\n );\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\n className={cn(\n \"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\",\n className,\n )}\n >\n Loading diff...\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n className={cn(\n \"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\",\n className,\n )}\n >\n {error}\n </div>\n );\n }\n\n if (payload?.binary) {\n return (\n <div\n className={cn(\n \"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\",\n className,\n )}\n >\n Binary file not shown.\n </div>\n );\n }\n\n if (!payload?.diff) {\n return (\n <div\n className={cn(\n \"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\",\n className,\n )}\n >\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\n// Every optional CommitRow input, resolved once by GitCommitList so the row\n// receives a single object instead of a dozen conditional spreads.\ntype CommitRowSlots<T extends GitCommitItem> = {\n loadDiff: GitDiffLoader<T> | undefined;\n renderExpanded: ((commit: T) => ReactNode) | undefined;\n onOpen: ((commit: T) => void) | undefined;\n renderTime: ((iso: string) => ReactNode) | undefined;\n renderBadges: ((commit: T) => ReactNode) | undefined;\n renderSubtitle: ((commit: T) => ReactNode) | undefined;\n onToggleSelect: ((commit: T) => void) | undefined;\n selectLabel: ((commit: T) => string) | undefined;\n selectBlockReason: ((commit: T) => string | null | undefined) | undefined;\n diffMaxHeightClassName: string | undefined;\n};\n\nfunction CommitRow<T extends GitCommitItem>({\n commit,\n selected,\n slots,\n}: {\n commit: T;\n selected: boolean;\n slots: CommitRowSlots<T>;\n}) {\n const {\n loadDiff,\n renderExpanded,\n onOpen,\n renderTime,\n renderBadges,\n renderSubtitle,\n onToggleSelect,\n } = slots;\n const [expandedState, diffState, toggle] = useLazyDiff(commit, loadDiff);\n const expanded = !onOpen && expandedState;\n const author = displayAuthor(commit);\n const href =\n commit.href ??\n (commit.repository\n ? gitWebLink(commit.repository, { commit: commit.sha })\n : undefined);\n const canExpand = Boolean(\n onOpen || loadDiff || renderExpanded || commit.body,\n );\n const activate = onOpen ? () => onOpen(commit) : toggle;\n const selectable = onToggleSelect !== undefined;\n const selectBlocked = selectable\n ? slots.selectBlockReason?.(commit) || undefined\n : undefined;\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n activate();\n }\n\n return (\n <div\n data-commit={commit.sha}\n data-selected={selectable ? String(selected) : undefined}\n className={cn(selectable && selected && \"bg-primary/5\")}\n >\n <div\n className={cn(\n \"flex items-start transition-colors\",\n canExpand && \"hover:bg-muted/70\",\n )}\n >\n {selectable && (\n <span className=\"flex shrink-0 pl-3 pt-3.5\" title={selectBlocked}>\n <Checkbox\n checked={selected}\n disabled={Boolean(selectBlocked)}\n onChange={() => onToggleSelect(commit)}\n aria-label={\n slots.selectLabel\n ? slots.selectLabel(commit)\n : `Select commit ${shortSha(commit)}`\n }\n />\n </span>\n )}\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n aria-expanded={canExpand && !onOpen ? expanded : undefined}\n className={cn(\n \"flex min-h-14 min-w-0 flex-1 items-start gap-2 py-2 pr-3 text-xs\",\n selectable ? \"pl-2\" : \"pl-3\",\n canExpand && \"cursor-pointer\",\n )}\n onClick={canExpand ? activate : 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=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n <span\n className=\"min-w-0 truncate font-medium text-foreground\"\n title={commit.title}\n >\n {commit.title}\n </span>\n {renderBadges?.(commit)}\n </div>\n {renderSubtitle?.(commit)}\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5 text-muted-foreground\">\n {commit.authorAvatarUrl && (\n <AvatarImage\n src={commit.authorAvatarUrl}\n alt={author || \"Commit author\"}\n />\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\n ? renderTime(commit.committedAt)\n : 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 {href ? (\n <a\n href={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\">\n {shortSha(commit)}\n </span>\n )}\n {canExpand && (\n <span className=\"mt-1 shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\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 {renderExpanded\n ? renderExpanded(commit)\n : loadDiff && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(slots.diffMaxHeightClassName\n ? { maxHeightClassName: slots.diffMaxHeightClassName }\n : {})}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function GitCommitList<T extends GitCommitItem = GitCommitItem>(\n props: GitCommitListProps<T>,\n) {\n const {\n commits,\n groupByDate = true,\n emptyLabel = \"No commits found\",\n className,\n selectedShas,\n } = props;\n const groups = useMemo(\n () => groupCommits(commits, groupByDate),\n [commits, groupByDate],\n );\n const slots: CommitRowSlots<T> = {\n loadDiff: props.loadDiff,\n renderExpanded: props.renderExpanded,\n onOpen: props.onOpen,\n renderTime: props.renderTime,\n renderBadges: props.renderBadges,\n renderSubtitle: props.renderSubtitle,\n onToggleSelect: props.onToggleSelect,\n selectLabel: props.selectLabel,\n selectBlockReason: props.selectBlockReason,\n diffMaxHeightClassName: props.diffMaxHeightClassName,\n };\n\n if (commits.length === 0) {\n return (\n <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"overflow-hidden rounded-md border border-border\",\n className,\n )}\n >\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 selected={selectedShas?.includes(commit.sha) ?? false}\n slots={slots}\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 {\n label: \"Added\",\n icon: UiFilePlus,\n iconClassName: \"text-emerald-600 dark:text-emerald-400\",\n };\n case \"deleted\":\n return {\n label: \"Deleted\",\n icon: UiRemove,\n iconClassName: \"text-rose-600 dark:text-rose-400\",\n };\n case \"renamed\":\n return {\n label: \"Renamed\",\n icon: UiFileCode,\n iconClassName: \"text-sky-600 dark:text-sky-400\",\n };\n case \"copied\":\n return {\n label: \"Copied\",\n icon: UiCode2,\n iconClassName: \"text-sky-600 dark:text-sky-400\",\n };\n default:\n return {\n label: \"Modified\",\n icon: UiFile,\n iconClassName: \"text-amber-600 dark:text-amber-400\",\n };\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 {\n directory: `${path.slice(0, index)}/`,\n basename: path.slice(index + 1),\n };\n}\n\nfunction DiffBars({\n additions = 0,\n deletions = 0,\n}: {\n additions?: number;\n deletions?: number;\n}) {\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\n key={`a${index}`}\n className=\"inline-block h-2 w-1.5 rounded-sm bg-emerald-500\"\n />\n ))}\n {Array.from({ length: delBars }).map((_, index) => (\n <span\n key={`d${index}`}\n className=\"inline-block h-2 w-1.5 rounded-sm bg-rose-500\"\n />\n ))}\n {total === 0 && (\n <span className=\"inline-block h-2 w-1.5 rounded-sm bg-muted-foreground/30\" />\n )}\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 if (file.href === undefined && file.repository && !file.commit)\n throw new Error(\n `Git file \"${file.path}\" requires a commit for its repository link`,\n );\n const href =\n file.href ??\n (file.repository && file.commit\n ? gitWebLink(file.repository, { commit: file.commit, file: file.path })\n : undefined);\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 && (\n <span className=\"text-muted-foreground\">{path.directory}</span>\n )}\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\">\n {status.label}\n </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\n ? { additions: file.additions }\n : {})}\n {...(file.deletions !== undefined\n ? { deletions: file.deletions }\n : {})}\n />\n {href && (\n <a\n href={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\n ? { maxHeightClassName: diffMaxHeightClassName }\n : {})}\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 (\n <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"overflow-hidden rounded-md border border-border\",\n className,\n )}\n >\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\n className={cn(\n \"flex items-center gap-2 text-xs text-muted-foreground\",\n className,\n )}\n >\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\">\n +{additions}\n </span>\n <span className=\"text-rose-600 dark:text-rose-400\">-{deletions}</span>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,39 +1,7 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { DiffLineTarget, DiffLineWidget } from '../CodeDiff.js';
3
- export type GitDiffPayload = {
4
- diff: string;
5
- truncated?: boolean;
6
- binary?: boolean;
7
- path?: string;
8
- commit?: string;
9
- };
10
- export type GitDiffLoader<T> = (item: T) => Promise<GitDiffPayload>;
11
- export type GitCommitItem = {
12
- id?: string;
13
- sha: string;
14
- shortSha?: string;
15
- title: string;
16
- body?: string;
17
- authorName?: string;
18
- authorLogin?: string;
19
- authorAvatarUrl?: string;
20
- committedAt?: string;
21
- additions?: number;
22
- deletions?: number;
23
- changedFiles?: number;
24
- href?: string;
25
- };
26
- export type GitFileChangeStatus = "added" | "modified" | "deleted" | "renamed" | "copied" | string;
27
- export type GitFileChangeItem = {
28
- id?: string;
29
- path: string;
30
- previousPath?: string;
31
- status?: GitFileChangeStatus;
32
- additions?: number;
33
- deletions?: number;
34
- href?: string;
35
- binary?: boolean;
36
- };
3
+ import { GitCommitItem, GitDiffLoader, GitDiffPayload, GitFileChangeItem } from './types.js';
4
+ export type { GitCommitItem, GitDiffLoader, GitDiffPayload, GitFileChangeItem, GitFileChangeStatus, } from './types.js';
37
5
  export type GitDiffPanelProps = {
38
6
  loading?: boolean;
39
7
  payload?: GitDiffPayload | null;
@@ -96,5 +64,4 @@ export declare function GitChangedFilesSummary({ files, additions, deletions, cl
96
64
  deletions: number;
97
65
  className?: string;
98
66
  }): import("react").JSX.Element;
99
- export {};
100
67
  //# sourceMappingURL=GitChangeList.d.ts.map
@@ -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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"}
@@ -14,6 +14,7 @@ import { Checkbox } from "../../components/Checkbox.js";
14
14
  import { languageFromPath } from "../code-highlight.js";
15
15
  import { CodeDiff } from "../CodeDiff.js";
16
16
  import { dateKey, formatFallbackTime, formatGitCommitDateHeader } from "./git-dates.js";
17
+ import { gitWebLink } from "./git-links.js";
17
18
  import { useMemo, useState } from "react";
18
19
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
19
20
  // src/data/git/GitChangeList.tsx
@@ -156,6 +157,7 @@ function CommitRow({ commit, selected, slots }) {
156
157
  const [expandedState, diffState, toggle] = useLazyDiff(commit, loadDiff);
157
158
  const expanded = !onOpen && expandedState;
158
159
  const author = displayAuthor(commit);
160
+ const href = commit.href ?? (commit.repository ? gitWebLink(commit.repository, { commit: commit.sha }) : void 0);
159
161
  const canExpand = Boolean(onOpen || loadDiff || renderExpanded || commit.body);
160
162
  const activate = onOpen ? () => onOpen(commit) : toggle;
161
163
  const selectable = onToggleSelect !== void 0;
@@ -228,8 +230,8 @@ function CommitRow({ commit, selected, slots }) {
228
230
  })
229
231
  ]
230
232
  }),
231
- commit.href ? /* @__PURE__ */ jsxs("a", {
232
- href: commit.href,
233
+ href ? /* @__PURE__ */ jsxs("a", {
234
+ href,
233
235
  target: "_blank",
234
236
  rel: "noopener noreferrer",
235
237
  className: "mt-0.5 inline-flex shrink-0 items-center gap-1 font-mono text-cyan-600 hover:underline",
@@ -359,6 +361,11 @@ function FileRow({ file, loadDiff, diffMaxHeightClassName }) {
359
361
  const status = statusView(file.status);
360
362
  const StatusIcon = status.icon;
361
363
  const path = splitPath(file.path);
364
+ if (file.href === void 0 && file.repository && !file.commit) throw new Error(`Git file "${file.path}" requires a commit for its repository link`);
365
+ const href = file.href ?? (file.repository && file.commit ? gitWebLink(file.repository, {
366
+ commit: file.commit,
367
+ file: file.path
368
+ }) : void 0);
362
369
  const canExpand = Boolean(loadDiff);
363
370
  function onKeyDown(event) {
364
371
  if (!canExpand || !isActivationKey(event)) return;
@@ -403,8 +410,8 @@ function FileRow({ file, loadDiff, diffMaxHeightClassName }) {
403
410
  ...file.additions !== void 0 ? { additions: file.additions } : {},
404
411
  ...file.deletions !== void 0 ? { deletions: file.deletions } : {}
405
412
  }),
406
- file.href && /* @__PURE__ */ jsx("a", {
407
- href: file.href,
413
+ href && /* @__PURE__ */ jsx("a", {
414
+ href,
408
415
  target: "_blank",
409
416
  rel: "noopener noreferrer",
410
417
  className: "shrink-0 text-muted-foreground hover:text-foreground",
@@ -1 +1 @@
1
- {"version":3,"file":"GitChangeList.js","names":["_Fragment"],"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 { Checkbox } from \"../../components/Checkbox\";\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\ntype GitCommitListBaseProps<T extends GitCommitItem> = {\n commits: T[];\n renderTime?: (iso: string) => ReactNode;\n groupByDate?: boolean;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n /** SHAs whose leading checkbox is checked. Only read when `onToggleSelect` is set. */\n selectedShas?: string[];\n /** Renders a leading checkbox per commit; called with the commit whose box was toggled. */\n onToggleSelect?: (commit: T) => void;\n /** Accessible name of a commit's checkbox. Defaults to `Select commit <short sha>`. */\n selectLabel?: (commit: T) => string;\n /** Why a commit cannot be selected; its checkbox is then disabled with the reason as its tooltip. */\n selectBlockReason?: (commit: T) => string | null | undefined;\n /** Inline badges rendered after the commit title. */\n renderBadges?: (commit: T) => ReactNode;\n /** An extra line rendered between the title and the author/time line. */\n renderSubtitle?: (commit: T) => ReactNode;\n};\n\n// The expanded body is either the lazily loaded unified diff (`loadDiff` →\n// `GitDiffPanel`) or a host-rendered node (`renderExpanded`), never both.\n// `renderExpanded` is only called while the row is expanded, so a host\n// component it returns can fetch on mount. `onOpen` replaces expansion: the\n// row navigates to the host's commit view instead of opening in place.\ntype GitCommitListBody<T extends GitCommitItem> =\n | { loadDiff?: GitDiffLoader<T>; renderExpanded?: never; onOpen?: never }\n | { renderExpanded: (commit: T) => ReactNode; loadDiff?: never; onOpen?: never }\n | { onOpen: (commit: T) => void; loadDiff?: never; renderExpanded?: never };\n\nexport type GitCommitListProps<T extends GitCommitItem = GitCommitItem> =\n GitCommitListBaseProps<T> & GitCommitListBody<T>;\n\nexport type GitFileListProps = {\n files: GitFileChangeItem[];\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\ntype CommitGroup<T extends GitCommitItem> = {\n key: string;\n label: string;\n commits: T[];\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<T extends GitCommitItem>(commits: T[], enabled: boolean): CommitGroup<T>[] {\n if (!enabled) return [{ key: \"all\", label: \"\", commits }];\n const groups: CommitGroup<T>[] = [];\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\n// Every optional CommitRow input, resolved once by GitCommitList so the row\n// receives a single object instead of a dozen conditional spreads.\ntype CommitRowSlots<T extends GitCommitItem> = {\n loadDiff: GitDiffLoader<T> | undefined;\n renderExpanded: ((commit: T) => ReactNode) | undefined;\n onOpen: ((commit: T) => void) | undefined;\n renderTime: ((iso: string) => ReactNode) | undefined;\n renderBadges: ((commit: T) => ReactNode) | undefined;\n renderSubtitle: ((commit: T) => ReactNode) | undefined;\n onToggleSelect: ((commit: T) => void) | undefined;\n selectLabel: ((commit: T) => string) | undefined;\n selectBlockReason: ((commit: T) => string | null | undefined) | undefined;\n diffMaxHeightClassName: string | undefined;\n};\n\nfunction CommitRow<T extends GitCommitItem>({\n commit,\n selected,\n slots,\n}: {\n commit: T;\n selected: boolean;\n slots: CommitRowSlots<T>;\n}) {\n const { loadDiff, renderExpanded, onOpen, renderTime, renderBadges, renderSubtitle, onToggleSelect } = slots;\n const [expandedState, diffState, toggle] = useLazyDiff(commit, loadDiff);\n const expanded = !onOpen && expandedState;\n const author = displayAuthor(commit);\n const canExpand = Boolean(onOpen || loadDiff || renderExpanded || commit.body);\n const activate = onOpen ? () => onOpen(commit) : toggle;\n const selectable = onToggleSelect !== undefined;\n const selectBlocked = selectable ? slots.selectBlockReason?.(commit) || undefined : undefined;\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n activate();\n }\n\n return (\n <div\n data-commit={commit.sha}\n data-selected={selectable ? String(selected) : undefined}\n className={cn(selectable && selected && \"bg-primary/5\")}\n >\n <div className={cn(\"flex items-start transition-colors\", canExpand && \"hover:bg-muted/70\")}>\n {selectable && (\n <span className=\"flex shrink-0 pl-3 pt-3.5\" title={selectBlocked}>\n <Checkbox\n checked={selected}\n disabled={Boolean(selectBlocked)}\n onChange={() => onToggleSelect(commit)}\n aria-label={slots.selectLabel ? slots.selectLabel(commit) : `Select commit ${shortSha(commit)}`}\n />\n </span>\n )}\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n aria-expanded={canExpand && !onOpen ? expanded : undefined}\n className={cn(\n \"flex min-h-14 min-w-0 flex-1 items-start gap-2 py-2 pr-3 text-xs\",\n selectable ? \"pl-2\" : \"pl-3\",\n canExpand && \"cursor-pointer\",\n )}\n onClick={canExpand ? activate : 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=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n <span className=\"min-w-0 truncate font-medium text-foreground\" title={commit.title}>\n {commit.title}\n </span>\n {renderBadges?.(commit)}\n </div>\n {renderSubtitle?.(commit)}\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 </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 {renderExpanded\n ? renderExpanded(commit)\n : loadDiff && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(slots.diffMaxHeightClassName\n ? { maxHeightClassName: slots.diffMaxHeightClassName }\n : {})}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function GitCommitList<T extends GitCommitItem = GitCommitItem>(\n props: GitCommitListProps<T>,\n) {\n const {\n commits,\n groupByDate = true,\n emptyLabel = \"No commits found\",\n className,\n selectedShas,\n } = props;\n const groups = useMemo(() => groupCommits(commits, groupByDate), [commits, groupByDate]);\n const slots: CommitRowSlots<T> = {\n loadDiff: props.loadDiff,\n renderExpanded: props.renderExpanded,\n onOpen: props.onOpen,\n renderTime: props.renderTime,\n renderBadges: props.renderBadges,\n renderSubtitle: props.renderSubtitle,\n onToggleSelect: props.onToggleSelect,\n selectLabel: props.selectLabel,\n selectBlockReason: props.selectBlockReason,\n diffMaxHeightClassName: props.diffMaxHeightClassName,\n };\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 selected={selectedShas?.includes(commit.sha) ?? false}\n slots={slots}\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"],"mappings":"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"}
1
+ {"version":3,"file":"GitChangeList.js","names":["_Fragment"],"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 { Checkbox } from \"../../components/Checkbox\";\nimport {\n CodeDiff,\n type DiffLineTarget,\n type DiffLineWidget,\n} from \"../CodeDiff\";\nimport { languageFromPath } from \"../code-highlight\";\nimport {\n dateKey,\n formatFallbackTime,\n formatGitCommitDateHeader,\n} from \"./git-dates\";\nimport type {\n GitCommitItem,\n GitDiffLoader,\n GitDiffPayload,\n GitFileChangeItem,\n} from \"./types\";\nimport { gitWebLink } from \"./git-links\";\nexport type {\n GitCommitItem,\n GitDiffLoader,\n GitDiffPayload,\n GitFileChangeItem,\n GitFileChangeStatus,\n} from \"./types\";\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\ntype GitCommitListBaseProps<T extends GitCommitItem> = {\n commits: T[];\n renderTime?: (iso: string) => ReactNode;\n groupByDate?: boolean;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n /** SHAs whose leading checkbox is checked. Only read when `onToggleSelect` is set. */\n selectedShas?: string[];\n /** Renders a leading checkbox per commit; called with the commit whose box was toggled. */\n onToggleSelect?: (commit: T) => void;\n /** Accessible name of a commit's checkbox. Defaults to `Select commit <short sha>`. */\n selectLabel?: (commit: T) => string;\n /** Why a commit cannot be selected; its checkbox is then disabled with the reason as its tooltip. */\n selectBlockReason?: (commit: T) => string | null | undefined;\n /** Inline badges rendered after the commit title. */\n renderBadges?: (commit: T) => ReactNode;\n /** An extra line rendered between the title and the author/time line. */\n renderSubtitle?: (commit: T) => ReactNode;\n};\n\n// The expanded body is either the lazily loaded unified diff (`loadDiff` →\n// `GitDiffPanel`) or a host-rendered node (`renderExpanded`), never both.\n// `renderExpanded` is only called while the row is expanded, so a host\n// component it returns can fetch on mount. `onOpen` replaces expansion: the\n// row navigates to the host's commit view instead of opening in place.\ntype GitCommitListBody<T extends GitCommitItem> =\n | { loadDiff?: GitDiffLoader<T>; renderExpanded?: never; onOpen?: never }\n | {\n renderExpanded: (commit: T) => ReactNode;\n loadDiff?: never;\n onOpen?: never;\n }\n | { onOpen: (commit: T) => void; loadDiff?: never; renderExpanded?: never };\n\nexport type GitCommitListProps<T extends GitCommitItem = GitCommitItem> =\n GitCommitListBaseProps<T> & GitCommitListBody<T>;\n\nexport type GitFileListProps = {\n files: GitFileChangeItem[];\n loadDiff?: GitDiffLoader<GitFileChangeItem>;\n emptyLabel?: string;\n className?: string;\n diffMaxHeightClassName?: string;\n};\n\ntype CommitGroup<T extends GitCommitItem> = {\n key: string;\n label: string;\n commits: T[];\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<T extends GitCommitItem>(\n commits: T[],\n enabled: boolean,\n): CommitGroup<T>[] {\n if (!enabled) return [{ key: \"all\", label: \"\", commits }];\n const groups: CommitGroup<T>[] = [];\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 && (\n <span className=\"text-emerald-600 dark:text-emerald-400\">+{adds}</span>\n )}\n {dels > 0 && (\n <span className=\"text-rose-600 dark:text-rose-400\">-{dels}</span>\n )}\n </>\n );\n}\n\nfunction useLazyDiff<T>(\n item: T,\n loader: GitDiffLoader<T> | undefined,\n): [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 (\n !expanded &&\n loader &&\n !state.payload &&\n !state.loading &&\n !state.error\n ) {\n setState({ loading: true, payload: null, error: \"\" });\n loader(item)\n .then((payload) => setState({ loading: false, payload, error: \"\" }))\n .catch((error) =>\n setState({\n loading: false,\n payload: null,\n error: messageFromError(error),\n }),\n );\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\n className={cn(\n \"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\",\n className,\n )}\n >\n Loading diff...\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n className={cn(\n \"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\",\n className,\n )}\n >\n {error}\n </div>\n );\n }\n\n if (payload?.binary) {\n return (\n <div\n className={cn(\n \"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\",\n className,\n )}\n >\n Binary file not shown.\n </div>\n );\n }\n\n if (!payload?.diff) {\n return (\n <div\n className={cn(\n \"border-t border-border bg-muted/40 px-3 py-3 text-xs text-muted-foreground\",\n className,\n )}\n >\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\n// Every optional CommitRow input, resolved once by GitCommitList so the row\n// receives a single object instead of a dozen conditional spreads.\ntype CommitRowSlots<T extends GitCommitItem> = {\n loadDiff: GitDiffLoader<T> | undefined;\n renderExpanded: ((commit: T) => ReactNode) | undefined;\n onOpen: ((commit: T) => void) | undefined;\n renderTime: ((iso: string) => ReactNode) | undefined;\n renderBadges: ((commit: T) => ReactNode) | undefined;\n renderSubtitle: ((commit: T) => ReactNode) | undefined;\n onToggleSelect: ((commit: T) => void) | undefined;\n selectLabel: ((commit: T) => string) | undefined;\n selectBlockReason: ((commit: T) => string | null | undefined) | undefined;\n diffMaxHeightClassName: string | undefined;\n};\n\nfunction CommitRow<T extends GitCommitItem>({\n commit,\n selected,\n slots,\n}: {\n commit: T;\n selected: boolean;\n slots: CommitRowSlots<T>;\n}) {\n const {\n loadDiff,\n renderExpanded,\n onOpen,\n renderTime,\n renderBadges,\n renderSubtitle,\n onToggleSelect,\n } = slots;\n const [expandedState, diffState, toggle] = useLazyDiff(commit, loadDiff);\n const expanded = !onOpen && expandedState;\n const author = displayAuthor(commit);\n const href =\n commit.href ??\n (commit.repository\n ? gitWebLink(commit.repository, { commit: commit.sha })\n : undefined);\n const canExpand = Boolean(\n onOpen || loadDiff || renderExpanded || commit.body,\n );\n const activate = onOpen ? () => onOpen(commit) : toggle;\n const selectable = onToggleSelect !== undefined;\n const selectBlocked = selectable\n ? slots.selectBlockReason?.(commit) || undefined\n : undefined;\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (!canExpand || !isActivationKey(event)) return;\n event.preventDefault();\n activate();\n }\n\n return (\n <div\n data-commit={commit.sha}\n data-selected={selectable ? String(selected) : undefined}\n className={cn(selectable && selected && \"bg-primary/5\")}\n >\n <div\n className={cn(\n \"flex items-start transition-colors\",\n canExpand && \"hover:bg-muted/70\",\n )}\n >\n {selectable && (\n <span className=\"flex shrink-0 pl-3 pt-3.5\" title={selectBlocked}>\n <Checkbox\n checked={selected}\n disabled={Boolean(selectBlocked)}\n onChange={() => onToggleSelect(commit)}\n aria-label={\n slots.selectLabel\n ? slots.selectLabel(commit)\n : `Select commit ${shortSha(commit)}`\n }\n />\n </span>\n )}\n <div\n role={canExpand ? \"button\" : undefined}\n tabIndex={canExpand ? 0 : undefined}\n aria-expanded={canExpand && !onOpen ? expanded : undefined}\n className={cn(\n \"flex min-h-14 min-w-0 flex-1 items-start gap-2 py-2 pr-3 text-xs\",\n selectable ? \"pl-2\" : \"pl-3\",\n canExpand && \"cursor-pointer\",\n )}\n onClick={canExpand ? activate : 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=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n <span\n className=\"min-w-0 truncate font-medium text-foreground\"\n title={commit.title}\n >\n {commit.title}\n </span>\n {renderBadges?.(commit)}\n </div>\n {renderSubtitle?.(commit)}\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5 text-muted-foreground\">\n {commit.authorAvatarUrl && (\n <AvatarImage\n src={commit.authorAvatarUrl}\n alt={author || \"Commit author\"}\n />\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\n ? renderTime(commit.committedAt)\n : 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 {href ? (\n <a\n href={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\">\n {shortSha(commit)}\n </span>\n )}\n {canExpand && (\n <span className=\"mt-1 shrink-0\">\n <Chevron expanded={expanded} />\n </span>\n )}\n </div>\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 {renderExpanded\n ? renderExpanded(commit)\n : loadDiff && (\n <GitDiffPanel\n loading={diffState.loading}\n payload={diffState.payload}\n error={diffState.error}\n {...(slots.diffMaxHeightClassName\n ? { maxHeightClassName: slots.diffMaxHeightClassName }\n : {})}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function GitCommitList<T extends GitCommitItem = GitCommitItem>(\n props: GitCommitListProps<T>,\n) {\n const {\n commits,\n groupByDate = true,\n emptyLabel = \"No commits found\",\n className,\n selectedShas,\n } = props;\n const groups = useMemo(\n () => groupCommits(commits, groupByDate),\n [commits, groupByDate],\n );\n const slots: CommitRowSlots<T> = {\n loadDiff: props.loadDiff,\n renderExpanded: props.renderExpanded,\n onOpen: props.onOpen,\n renderTime: props.renderTime,\n renderBadges: props.renderBadges,\n renderSubtitle: props.renderSubtitle,\n onToggleSelect: props.onToggleSelect,\n selectLabel: props.selectLabel,\n selectBlockReason: props.selectBlockReason,\n diffMaxHeightClassName: props.diffMaxHeightClassName,\n };\n\n if (commits.length === 0) {\n return (\n <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"overflow-hidden rounded-md border border-border\",\n className,\n )}\n >\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 selected={selectedShas?.includes(commit.sha) ?? false}\n slots={slots}\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 {\n label: \"Added\",\n icon: UiFilePlus,\n iconClassName: \"text-emerald-600 dark:text-emerald-400\",\n };\n case \"deleted\":\n return {\n label: \"Deleted\",\n icon: UiRemove,\n iconClassName: \"text-rose-600 dark:text-rose-400\",\n };\n case \"renamed\":\n return {\n label: \"Renamed\",\n icon: UiFileCode,\n iconClassName: \"text-sky-600 dark:text-sky-400\",\n };\n case \"copied\":\n return {\n label: \"Copied\",\n icon: UiCode2,\n iconClassName: \"text-sky-600 dark:text-sky-400\",\n };\n default:\n return {\n label: \"Modified\",\n icon: UiFile,\n iconClassName: \"text-amber-600 dark:text-amber-400\",\n };\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 {\n directory: `${path.slice(0, index)}/`,\n basename: path.slice(index + 1),\n };\n}\n\nfunction DiffBars({\n additions = 0,\n deletions = 0,\n}: {\n additions?: number;\n deletions?: number;\n}) {\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\n key={`a${index}`}\n className=\"inline-block h-2 w-1.5 rounded-sm bg-emerald-500\"\n />\n ))}\n {Array.from({ length: delBars }).map((_, index) => (\n <span\n key={`d${index}`}\n className=\"inline-block h-2 w-1.5 rounded-sm bg-rose-500\"\n />\n ))}\n {total === 0 && (\n <span className=\"inline-block h-2 w-1.5 rounded-sm bg-muted-foreground/30\" />\n )}\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 if (file.href === undefined && file.repository && !file.commit)\n throw new Error(\n `Git file \"${file.path}\" requires a commit for its repository link`,\n );\n const href =\n file.href ??\n (file.repository && file.commit\n ? gitWebLink(file.repository, { commit: file.commit, file: file.path })\n : undefined);\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 && (\n <span className=\"text-muted-foreground\">{path.directory}</span>\n )}\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\">\n {status.label}\n </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\n ? { additions: file.additions }\n : {})}\n {...(file.deletions !== undefined\n ? { deletions: file.deletions }\n : {})}\n />\n {href && (\n <a\n href={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\n ? { maxHeightClassName: diffMaxHeightClassName }\n : {})}\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 (\n <div className={cn(\"py-4 text-xs text-muted-foreground\", className)}>\n {emptyLabel}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"overflow-hidden rounded-md border border-border\",\n className,\n )}\n >\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\n className={cn(\n \"flex items-center gap-2 text-xs text-muted-foreground\",\n className,\n )}\n >\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\">\n +{additions}\n </span>\n <span className=\"text-rose-600 dark:text-rose-400\">-{deletions}</span>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ const require_git_links = require("./git-links.cjs");
2
+ let react_jsx_runtime = require("react/jsx-runtime");
3
+ // src/data/git/GitLink.tsx
4
+ function GitLink({ repository, target, children, ...props }) {
5
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
6
+ ...props,
7
+ href: require_git_links.gitWebLink(repository, target),
8
+ children
9
+ });
10
+ }
11
+ exports.GitLink = GitLink;
12
+
13
+ //# sourceMappingURL=GitLink.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitLink.cjs","names":["gitWebLink"],"sources":["../../../src/data/git/GitLink.tsx"],"sourcesContent":["import type { AnchorHTMLAttributes } from \"react\";\nimport { gitWebLink } from \"./git-links\";\nimport type { GitTarget, GitWebRepository } from \"./types\";\n\nexport type GitLinkProps = Omit<\n AnchorHTMLAttributes<HTMLAnchorElement>,\n \"href\" | \"target\"\n> & {\n repository: GitWebRepository;\n target: GitTarget;\n};\n\nexport function GitLink({\n repository,\n target,\n children,\n ...props\n}: GitLinkProps) {\n return (\n <a {...props} href={gitWebLink(repository, target)}>\n {children}\n </a>\n );\n}\n"],"mappings":";;;AAYA,SAAgB,QAAQ,EACtB,YACA,QACA,UACA,GAAG,SACY;CACf,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;EAAG,GAAI;EAAO,MAAMA,kBAAAA,WAAW,YAAY,MAAM;EAC9C;CACA,CAAA;AAEP"}
@@ -0,0 +1,8 @@
1
+ import { AnchorHTMLAttributes } from 'react';
2
+ import { GitTarget, GitWebRepository } from './types.js';
3
+ export type GitLinkProps = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, "href" | "target"> & {
4
+ repository: GitWebRepository;
5
+ target: GitTarget;
6
+ };
7
+ export declare function GitLink({ repository, target, children, ...props }: GitLinkProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=GitLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitLink.d.ts","sourceRoot":"","sources":["../../../src/data/git/GitLink.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG,IAAI,CAC7B,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,MAAM,GAAG,QAAQ,CAClB,GAAG;IACF,UAAU,EAAE,gBAAgB,CAAC;IAC7B,MAAM,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,wBAAgB,OAAO,CAAC,EACtB,UAAU,EACV,MAAM,EACN,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,YAAY,+BAMd"}
@@ -0,0 +1,13 @@
1
+ import { gitWebLink } from "./git-links.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ // src/data/git/GitLink.tsx
4
+ function GitLink({ repository, target, children, ...props }) {
5
+ return /* @__PURE__ */ jsx("a", {
6
+ ...props,
7
+ href: gitWebLink(repository, target),
8
+ children
9
+ });
10
+ }
11
+ export { GitLink };
12
+
13
+ //# sourceMappingURL=GitLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitLink.js","names":[],"sources":["../../../src/data/git/GitLink.tsx"],"sourcesContent":["import type { AnchorHTMLAttributes } from \"react\";\nimport { gitWebLink } from \"./git-links\";\nimport type { GitTarget, GitWebRepository } from \"./types\";\n\nexport type GitLinkProps = Omit<\n AnchorHTMLAttributes<HTMLAnchorElement>,\n \"href\" | \"target\"\n> & {\n repository: GitWebRepository;\n target: GitTarget;\n};\n\nexport function GitLink({\n repository,\n target,\n children,\n ...props\n}: GitLinkProps) {\n return (\n <a {...props} href={gitWebLink(repository, target)}>\n {children}\n </a>\n );\n}\n"],"mappings":";;;AAYA,SAAgB,QAAQ,EACtB,YACA,QACA,UACA,GAAG,SACY;CACf,OACE,oBAAC,KAAD;EAAG,GAAI;EAAO,MAAM,WAAW,YAAY,MAAM;EAC9C;CACA,CAAA;AAEP"}