From 998fb29c46bcde3490f4036649c8655103ecbd84 Mon Sep 17 00:00:00 2001 From: swithek <52840391+swithek@users.noreply.github.com> Date: Sat, 26 Sep 2026 20:02:48 +0200 Subject: [PATCH] add diff popover --- web/AGENTS.md | 7 + web/app/components/editor/attribute-names.ts | 3 + .../editor/blocks/figma/FigmaBlock.vue | 9 +- .../figma/FigmaDiffDetails.nuxt.test.ts | 69 ++++++ .../editor/blocks/figma/FigmaDiffDetails.vue | 94 +++++++ .../editor/blocks/file/FileBlock.nuxt.test.ts | 10 +- .../editor/blocks/file/FileBlock.vue | 19 +- .../blocks/file/FileDiffDetails.nuxt.test.ts | 67 +++++ .../editor/blocks/file/FileDiffDetails.vue | 64 +++++ .../editor/blocks/image/ImageBlock.vue | 9 +- .../image/ImageDiffDetails.nuxt.test.ts | 82 +++++++ .../editor/blocks/image/ImageDiffDetails.vue | 57 +++++ .../editor/blocks/mermaid/MainBlock.vue | 5 +- .../mermaid/MermaidDiffDetails.nuxt.test.ts | 94 +++++++ .../blocks/mermaid/MermaidDiffDetails.vue | 75 ++++++ .../editor/blocks/mermaid/diff-lines.test.ts | 137 +++++++++++ .../editor/blocks/mermaid/diff-lines.ts | 89 +++++++ .../editor/blocks/metrics/MainBlock.vue | 5 +- .../metrics/MetricDiffDetails.nuxt.test.ts | 200 +++++++++++++++ .../blocks/metrics/MetricDiffDetails.vue | 161 ++++++++++++ .../editor/diff/DiffBeforeAfter.nuxt.test.ts | 52 ++++ .../editor/diff/DiffBeforeAfter.vue | 48 ++++ .../editor/diff/DiffChangeMarker.nuxt.test.ts | 92 ++++++- .../editor/diff/DiffChangeMarker.vue | 73 ++++-- .../editor/diff/DiffFieldChanges.nuxt.test.ts | 65 +++++ .../editor/diff/DiffFieldChanges.vue | 44 ++++ .../editor/diff/change-count.test.ts | 173 ++++++++++++- .../components/editor/diff/change-count.ts | 230 ++++++++++++------ web/i18n/locales/en/editor.json | 25 +- 29 files changed, 1935 insertions(+), 123 deletions(-) create mode 100644 web/app/components/editor/blocks/figma/FigmaDiffDetails.nuxt.test.ts create mode 100644 web/app/components/editor/blocks/figma/FigmaDiffDetails.vue create mode 100644 web/app/components/editor/blocks/file/FileDiffDetails.nuxt.test.ts create mode 100644 web/app/components/editor/blocks/file/FileDiffDetails.vue create mode 100644 web/app/components/editor/blocks/image/ImageDiffDetails.nuxt.test.ts create mode 100644 web/app/components/editor/blocks/image/ImageDiffDetails.vue create mode 100644 web/app/components/editor/blocks/mermaid/MermaidDiffDetails.nuxt.test.ts create mode 100644 web/app/components/editor/blocks/mermaid/MermaidDiffDetails.vue create mode 100644 web/app/components/editor/blocks/mermaid/diff-lines.test.ts create mode 100644 web/app/components/editor/blocks/mermaid/diff-lines.ts create mode 100644 web/app/components/editor/blocks/metrics/MetricDiffDetails.nuxt.test.ts create mode 100644 web/app/components/editor/blocks/metrics/MetricDiffDetails.vue create mode 100644 web/app/components/editor/diff/DiffBeforeAfter.nuxt.test.ts create mode 100644 web/app/components/editor/diff/DiffBeforeAfter.vue create mode 100644 web/app/components/editor/diff/DiffFieldChanges.nuxt.test.ts create mode 100644 web/app/components/editor/diff/DiffFieldChanges.vue diff --git a/web/AGENTS.md b/web/AGENTS.md index 193ddc14..6d1a378d 100644 --- a/web/AGENTS.md +++ b/web/AGENTS.md @@ -93,6 +93,13 @@ there when none exists. (custom nodes; `upload-handler.ts` routes dropped files), `comments/`, `diff/`, `drag-handle/`, `slash/`, `link/`, `ai/`, `hooks/`. Editor-wide state is [app/stores/editor.ts](app/stores/editor.ts). +- **Diff view**: adding or changing a block or node includes its branch + diff. Expose `diffStatus` on its node view and style it as added, removed + and modified. A block changed through its attributes renders + `DiffChangeMarker` with a `DiffDetails.vue` card in its own + directory. Attributes that count as one change, count per list item or + are never set by a user are declared in + [diff/change-count.ts](app/components/editor/diff/change-count.ts). - **Routing**: one dynamic page, `app/pages/[[organizationSlug]]/[[documentSlug]].vue`; [app/middleware/01.redirect.global.ts](app/middleware/01.redirect.global.ts) diff --git a/web/app/components/editor/attribute-names.ts b/web/app/components/editor/attribute-names.ts index 476c8d82..1e58966b 100644 --- a/web/app/components/editor/attribute-names.ts +++ b/web/app/components/editor/attribute-names.ts @@ -2,3 +2,6 @@ // editor modules export const NODE_COMMENT_ID_ATTR = "nodeCommentId" + +// set on image and file blocks while their upload is in flight +export const UPLOADING_ATTR = "uploading" diff --git a/web/app/components/editor/blocks/figma/FigmaBlock.vue b/web/app/components/editor/blocks/figma/FigmaBlock.vue index 3f7be025..f703bb54 100644 --- a/web/app/components/editor/blocks/figma/FigmaBlock.vue +++ b/web/app/components/editor/blocks/figma/FigmaBlock.vue @@ -4,6 +4,7 @@ import { computePosition, flip, offset, shift } from "@floating-ui/dom" import { cn } from "~/lib/utils" import { DiffStatus } from "~/components/editor/diff/position-map" import DiffChangeMarker from "~/components/editor/diff/DiffChangeMarker.vue" +import FigmaDiffDetails from "./FigmaDiffDetails.vue" import { isFigmaUrl, convertToEmbedUrl } from "./index" const props = defineProps(nodeViewProps) @@ -262,7 +263,9 @@ onBeforeUnmount(() => { :style="{ height: `${displayHeight}px` }" allowfullscreen /> - + + +