From 9f725af44d0ac82e87d649b4285e11bd35b9b2d9 Mon Sep 17 00:00:00 2001 From: Kyle Boe Date: Tue, 3 Mar 2026 09:55:43 -0800 Subject: [PATCH 1/7] Pass diff_id to DiffComponent render --- lib/diff_web/views/live_view.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/diff_web/views/live_view.ex b/lib/diff_web/views/live_view.ex index bccae08..df86d8e 100644 --- a/lib/diff_web/views/live_view.ex +++ b/lib/diff_web/views/live_view.ex @@ -21,7 +21,7 @@ defmodule DiffWeb.LiveView do # Take the first diff (should only be one per file) diff = List.first(diffs) - DiffWeb.DiffComponent.render(%{diff: diff}) + DiffWeb.DiffComponent.render(%{diff: diff, diff_id: diff_id}) |> Phoenix.HTML.Safe.to_iodata() |> IO.iodata_to_binary() |> sanitize_utf8() From d097dae93047e33513323f9b1246bdb2db9e8d10 Mon Sep 17 00:00:00 2001 From: Kyle Boe Date: Tue, 3 Mar 2026 09:56:03 -0800 Subject: [PATCH 2/7] Update diff container ID format --- lib/diff_web/templates/live/diff.html.leex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/diff_web/templates/live/diff.html.leex b/lib/diff_web/templates/live/diff.html.leex index 1a35425..d738b32 100644 --- a/lib/diff_web/templates/live/diff.html.leex +++ b/lib/diff_web/templates/live/diff.html.leex @@ -36,7 +36,7 @@ <% end %> <%= for diff_id <- @loaded_diffs do %> -
+
<%= raw(Map.fetch!(@loaded_diff_content, diff_id)) %>
<% end %> From 43ce2feaf283b1676123ed41364662eb6118fca0 Mon Sep 17 00:00:00 2001 From: Kyle Boe Date: Tue, 3 Mar 2026 09:56:55 -0800 Subject: [PATCH 3/7] Use phx-click with class toggle for dynamic LiveView content integration --- .../live/components/diff_component.ex | 49 +++++++++---------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/lib/diff_web/live/components/diff_component.ex b/lib/diff_web/live/components/diff_component.ex index 78757eb..ab3a093 100644 --- a/lib/diff_web/live/components/diff_component.ex +++ b/lib/diff_web/live/components/diff_component.ex @@ -1,18 +1,27 @@ defmodule DiffWeb.DiffComponent do use DiffWeb, :live_component + alias Phoenix.LiveView.JS def render(assigns) do ~H"""
-
+
<%= diff_status(@diff) %> <%= file_header(@diff, diff_status(@diff)) %> - - + + + + + + + + + +
-
+
<%= for chunk <- @diff.chunks do %> @@ -46,31 +55,17 @@ defmodule DiffWeb.DiffComponent do """ end - defp file_header(diff, status) do - from = diff.from - to = diff.to - - case status do - "changed" -> from - "renamed" -> "#{from} -> #{to}" - "removed" -> from - "added" -> to - end - end - - defp diff_status(diff) do - from = diff.from - to = diff.to + defp file_header(%{from: from}, "changed"), do: from + defp file_header(%{from: from, to: to}, "renamed"), do: "#{from} -> #{to}" + defp file_header(%{from: from}, "removed"), do: from + defp file_header(%{to: to}, "added"), do: to - cond do - !from -> "added" - !to -> "removed" - from == to -> "changed" - true -> "renamed" - end - end + defp diff_status(%{from: nil, to: _to}), do: "added" + defp diff_status(%{from: _from, to: nil}), do: "removed" + defp diff_status(%{from: from, to: to}) when from == to, do: "changed" + defp diff_status(_), do: "renamed" - defp line_number(ln) when is_nil(ln), do: "" + defp line_number(nil), do: "" defp line_number(ln), do: to_string(ln) defp line_id(diff, line) do From 2c8fd68c141fe8e4d9f7554fc215d6277aa1df52 Mon Sep 17 00:00:00 2001 From: Kyle Boe Date: Tue, 3 Mar 2026 09:57:09 -0800 Subject: [PATCH 4/7] Remove broken click event listeners for file headers --- assets/js/app.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/assets/js/app.js b/assets/js/app.js index ff4282e..901c14b 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -87,19 +87,3 @@ lines.forEach(line => { } }) }) - -const fileHeaders = document.querySelectorAll('.ghd-file-header') -fileHeaders.forEach(header => { - header.addEventListener('click', e => { - const parent = header.parentNode - - parent.querySelectorAll('.ghd-diff').forEach(diff => { - diff.classList.toggle('hidden') - }) - header.classList.toggle('collapsed') && scrollIfNeeded(header) - }) -}) - -const scrollIfNeeded = elem => { - elem.getBoundingClientRect().top < 0 && elem.scrollIntoView(true) -} From 89593f69c78e264d4015d9f23bda142191c8cbe4 Mon Sep 17 00:00:00 2001 From: Kyle Boe Date: Tue, 3 Mar 2026 10:14:04 -0800 Subject: [PATCH 5/7] Refactor ghd-file-header styles for improved diff visibility and layout --- assets/css/app.css | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/assets/css/app.css b/assets/css/app.css index ebecd5f..c322644 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -193,35 +193,22 @@ input.search-input:focus { position: -webkit-sticky; position: sticky; top: 0px; + display: flex; + align-items: center; + justify-content: space-between; z-index: 1; } -.ghd-file-header .reveal-diff { - display: none; - float: right; +.ghd-file-header .show-hide-diff { color: #999; } -.ghd-file-header .reveal-diff path { +.ghd-file-header .show-hide-diff path { fill: #999; } -.ghd-file-header.collapsed .reveal-diff { - display: block; -} - -.ghd-file-header .collapse-diff { - display: block; - float: right; - color: #999; -} - -.ghd-file-header .collapse-diff path { - fill: #999; -} - -.ghd-file-header.collapsed .collapse-diff { - display: none; +.ghd-file:has(.hidden) .show-hide-diff { + rotate: 180deg; } .ghd-chunk-header .ghd-line-number { From fb963e90637ba19920df2ac994d91dd77ea2e4ac Mon Sep 17 00:00:00 2001 From: Kyle Boe Date: Tue, 3 Mar 2026 10:14:17 -0800 Subject: [PATCH 6/7] Refactor diff component header for improved structure and clarity --- .../live/components/diff_component.ex | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/lib/diff_web/live/components/diff_component.ex b/lib/diff_web/live/components/diff_component.ex index ab3a093..abf26eb 100644 --- a/lib/diff_web/live/components/diff_component.ex +++ b/lib/diff_web/live/components/diff_component.ex @@ -6,20 +6,15 @@ defmodule DiffWeb.DiffComponent do ~H"""
- - <%= diff_status(@diff) %> - - <%= file_header(@diff, diff_status(@diff)) %> - - - - - - - - - - +
+ + <%= diff_status(@diff) %> + + <%= file_header(@diff, diff_status(@diff)) %> +
+ + +
From d3cbec66c7a181f5941704a027c4afc05a77c9a3 Mon Sep 17 00:00:00 2001 From: Kyle Boe Date: Tue, 3 Mar 2026 10:19:55 -0800 Subject: [PATCH 7/7] Remove useless nil check --- lib/diff_web/live/components/diff_component.ex | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/diff_web/live/components/diff_component.ex b/lib/diff_web/live/components/diff_component.ex index abf26eb..d7f23f4 100644 --- a/lib/diff_web/live/components/diff_component.ex +++ b/lib/diff_web/live/components/diff_component.ex @@ -60,7 +60,6 @@ defmodule DiffWeb.DiffComponent do defp diff_status(%{from: from, to: to}) when from == to, do: "changed" defp diff_status(_), do: "renamed" - defp line_number(nil), do: "" defp line_number(ln), do: to_string(ln) defp line_id(diff, line) do