From 008af1815647cf2cfb465127641d20e5cb93643b Mon Sep 17 00:00:00 2001 From: Jay V Date: Thu, 26 Jun 2025 13:06:37 -0400 Subject: [PATCH] docs: share page responsive diff --- packages/web/src/components/DiffView.tsx | 191 +++++++++++------- .../web/src/components/diffview.module.css | 33 ++- .../src/components/markdownview.module.css | 2 + 3 files changed, 139 insertions(+), 87 deletions(-) diff --git a/packages/web/src/components/DiffView.tsx b/packages/web/src/components/DiffView.tsx index 237f25bd..66dd7f0f 100644 --- a/packages/web/src/components/DiffView.tsx +++ b/packages/web/src/components/DiffView.tsx @@ -54,8 +54,8 @@ const DiffView: Component = (props) => { // Pair removals with additions const maxLength = Math.max(removals.length, additions.length) for (let k = 0; k < maxLength; k++) { - const hasLeft = !!removals[k] - const hasRight = !!additions[k] + const hasLeft = k < removals.length + const hasRight = k < additions.length if (hasLeft && hasRight) { // Replacement - left is removed, right is added @@ -71,8 +71,8 @@ const DiffView: Component = (props) => { right: "", type: "removed" }) - } else { - // Pure addition + } else if (hasRight) { + // Pure addition - only create if we actually have content diffRows.push({ left: "", right: additions[k], @@ -111,85 +111,136 @@ const DiffView: Component = (props) => { return diffRows }) + const mobileRows = createMemo(() => { + const mobileBlocks: { type: 'removed' | 'added' | 'unchanged', lines: string[] }[] = [] + const currentRows = rows() + + let i = 0 + while (i < currentRows.length) { + const removedLines: string[] = [] + const addedLines: string[] = [] + + // Collect consecutive modified/removed/added rows + while (i < currentRows.length && + (currentRows[i].type === 'modified' || + currentRows[i].type === 'removed' || + currentRows[i].type === 'added')) { + const row = currentRows[i] + if (row.left && (row.type === 'removed' || row.type === 'modified')) { + removedLines.push(row.left) + } + if (row.right && (row.type === 'added' || row.type === 'modified')) { + addedLines.push(row.right) + } + i++ + } + + // Add grouped blocks + if (removedLines.length > 0) { + mobileBlocks.push({ type: 'removed', lines: removedLines }) + } + if (addedLines.length > 0) { + mobileBlocks.push({ type: 'added', lines: addedLines }) + } + + // Add unchanged rows as-is + if (i < currentRows.length && currentRows[i].type === 'unchanged') { + mobileBlocks.push({ + type: 'unchanged', + lines: [currentRows[i].left] + }) + i++ + } + } + + return mobileBlocks + }) + return (
- {rows().map((r) => ( -
-
- - {(r.type === "added" || r.type === "modified") && r.right !== undefined && ( +
+ {rows().map((r) => ( +
+
+ +
+
- )} +
+ ))} +
-
- +
+ {mobileRows().map((block) => ( +
+ {block.lines.map((line) => ( + + ))}
-
- ))} + ))} +
) } export default DiffView -// String to test diff viewer with -const testDiff = `--- combined_before.txt 2025-06-24 16:38:08 -+++ combined_after.txt 2025-06-24 16:38:12 -@@ -1,21 +1,25 @@ - unchanged line --deleted line --old content -+added line -+new content - --removed empty line below -+added empty line above - -- tab indented --trailing spaces --very long line that will definitely wrap in most editors and cause potential alignment issues when displayed in a two column diff view --unicode content: πŸš€ ✨ δΈ­ζ–‡ --mixed content with tabs and spaces -+ space indented -+no trailing spaces -+short line -+very long replacement line that will also wrap and test how the diff viewer handles long line additions after short line removals -+different unicode: πŸŽ‰ πŸ’» ζ—₯本θͺž -+normalized content with consistent spacing -+newline to content - --content to remove --whitespace only: --multiple --consecutive --deletions --single deletion -+ -+single addition -+first addition -+second addition -+third addition - line before addition -+first added line -+ -+third added line - line after addition - final unchanged line` +// const testDiff = `--- combined_before.txt 2025-06-24 16:38:08 +// +++ combined_after.txt 2025-06-24 16:38:12 +// @@ -1,21 +1,25 @@ +// unchanged line +// -deleted line +// -old content +// +added line +// +new content +// +// -removed empty line below +// +added empty line above +// +// - tab indented +// -trailing spaces +// -very long line that will definitely wrap in most editors and cause potential alignment issues when displayed in a two column diff view +// -unicode content: πŸš€ ✨ δΈ­ζ–‡ +// -mixed content with tabs and spaces +// + space indented +// +no trailing spaces +// +short line +// +very long replacement line that will also wrap and test how the diff viewer handles long line additions after short line removals +// +different unicode: πŸŽ‰ πŸ’» ζ—₯本θͺž +// +normalized content with consistent spacing +// +newline to content +// +// -content to remove +// -whitespace only: +// -multiple +// -consecutive +// -deletions +// -single deletion +// + +// +single addition +// +first addition +// +second addition +// +third addition +// line before addition +// +first added line +// + +// +third added line +// line after addition +// final unchanged line` diff --git a/packages/web/src/components/diffview.module.css b/packages/web/src/components/diffview.module.css index b3f61ac0..a748c5d0 100644 --- a/packages/web/src/components/diffview.module.css +++ b/packages/web/src/components/diffview.module.css @@ -6,6 +6,19 @@ border-radius: 0.25rem; } +.desktopView { + display: block; +} + +.mobileView { + display: none; +} + +.mobileBlock { + display: flex; + flex-direction: column; +} + .row { display: grid; grid-template-columns: 1fr 1fr; @@ -98,25 +111,11 @@ } @media (max-width: 40rem) { - .row { - grid-template-columns: 1fr; - } - - .afterColumn { + .desktopView { display: none; } - .beforeColumn { - border-right: none; - } - - [data-section="cell"] { - &[data-display-mobile="true"] { - display: flex; - } - - &[data-display-mobile="false"] { - display: none; - } + .mobileView { + display: block; } } diff --git a/packages/web/src/components/markdownview.module.css b/packages/web/src/components/markdownview.module.css index 37a10dfa..a4360bde 100644 --- a/packages/web/src/components/markdownview.module.css +++ b/packages/web/src/components/markdownview.module.css @@ -30,6 +30,8 @@ h4, h5, h6 { + font-size: 0.875rem; + font-weight: 600; margin-bottom: 0.5rem; }