summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/pierre/comment-hover.ts
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-26 18:23:04 -0600
committerGitHub <[email protected]>2026-02-26 18:23:04 -0600
commitfc52e4b2d3a41efde772e6de8fb2e01f27821701 (patch)
treecf23af294a00a10e55f230232585344c111f0bb9 /packages/ui/src/pierre/comment-hover.ts
parent9a6bfeb782766099d4ce3a98bb9e7b4e79f8bfe6 (diff)
downloadopencode-fc52e4b2d3a41efde772e6de8fb2e01f27821701.tar.gz
opencode-fc52e4b2d3a41efde772e6de8fb2e01f27821701.zip
feat(app): better diff/code comments (#14621)
Co-authored-by: adamelmore <[email protected]> Co-authored-by: David Hill <[email protected]>
Diffstat (limited to 'packages/ui/src/pierre/comment-hover.ts')
-rw-r--r--packages/ui/src/pierre/comment-hover.ts74
1 files changed, 74 insertions, 0 deletions
diff --git a/packages/ui/src/pierre/comment-hover.ts b/packages/ui/src/pierre/comment-hover.ts
new file mode 100644
index 000000000..1d3674cf6
--- /dev/null
+++ b/packages/ui/src/pierre/comment-hover.ts
@@ -0,0 +1,74 @@
+export type HoverCommentLine = {
+ lineNumber: number
+ side?: "additions" | "deletions"
+}
+
+export function createHoverCommentUtility(props: {
+ label: string
+ getHoveredLine: () => HoverCommentLine | undefined
+ onSelect: (line: HoverCommentLine) => void
+}) {
+ if (typeof document === "undefined") return
+
+ const button = document.createElement("button")
+ button.type = "button"
+ button.ariaLabel = props.label
+ button.textContent = "+"
+ button.style.width = "20px"
+ button.style.height = "20px"
+ button.style.display = "flex"
+ button.style.alignItems = "center"
+ button.style.justifyContent = "center"
+ button.style.border = "none"
+ button.style.borderRadius = "var(--radius-md)"
+ button.style.background = "var(--icon-interactive-base)"
+ button.style.color = "var(--white)"
+ button.style.boxShadow = "var(--shadow-xs)"
+ button.style.fontSize = "14px"
+ button.style.lineHeight = "1"
+ button.style.cursor = "pointer"
+ button.style.position = "relative"
+ button.style.left = "30px"
+ button.style.top = "calc((var(--diffs-line-height, 24px) - 20px) / 2)"
+
+ let line: HoverCommentLine | undefined
+
+ const sync = () => {
+ const next = props.getHoveredLine()
+ if (!next) return
+ line = next
+ }
+
+ const loop = () => {
+ if (!button.isConnected) return
+ sync()
+ requestAnimationFrame(loop)
+ }
+
+ const open = () => {
+ const next = props.getHoveredLine() ?? line
+ if (!next) return
+ props.onSelect(next)
+ }
+
+ requestAnimationFrame(loop)
+ button.addEventListener("mouseenter", sync)
+ button.addEventListener("mousemove", sync)
+ button.addEventListener("pointerdown", (event) => {
+ event.preventDefault()
+ event.stopPropagation()
+ sync()
+ })
+ button.addEventListener("mousedown", (event) => {
+ event.preventDefault()
+ event.stopPropagation()
+ sync()
+ })
+ button.addEventListener("click", (event) => {
+ event.preventDefault()
+ event.stopPropagation()
+ open()
+ })
+
+ return button
+}