diff --git a/.fork/customizations.yaml b/.fork/customizations.yaml index 93af1d112d46..d82430c0fb11 100644 --- a/.fork/customizations.yaml +++ b/.fork/customizations.yaml @@ -1744,7 +1744,12 @@ data-t3-native-source so it is never mistaken for a project tag). Elements whose source never resolves stay fully editable and send with selector/text/style context; no install prompt, warning toast, - or Forge handoff exists anymore. Canvas mode (the Forge's vendored + or Forge handoff exists anymore. That downgrade is VISIBLE, not + silent: the payload's per-element sourceLabel (null = unaddressed by + send time) is counted host-side (protocol.ts + countUnresolvedDesignElements) and surfaced on the composer pill and + in the send toast, because buildSend's ~1.5s native-source grace + means WHEN Send was clicked can change how precise the ask is. Canvas mode (the Forge's vendored CanvasMode, engine/vendor/canvas.ts) turns the page into a pannable/zoomable artboard — space-drag/middle-drag pan, cursor-anchored wheel and pinch zoom, the powers-of-2 ladder, @@ -1840,6 +1845,7 @@ tier: 4 files: - apps/web/src/custom/designMode/protocol.ts + - apps/web/src/custom/designMode/protocol.test.ts # Outside engine/ on purpose: like protocol.ts it crosses the TS-island fence # (the engine tsconfig includes it by path) so the web project can type-check # and unit-test it, which files under engine/ cannot be. diff --git a/.fork/notes/design-send-unresolved/pill-after.png b/.fork/notes/design-send-unresolved/pill-after.png new file mode 100644 index 000000000000..bb5b9f0d8fbc Binary files /dev/null and b/.fork/notes/design-send-unresolved/pill-after.png differ diff --git a/.fork/notes/design-send-unresolved/pill-before.png b/.fork/notes/design-send-unresolved/pill-before.png new file mode 100644 index 000000000000..cf3dbb086282 Binary files /dev/null and b/.fork/notes/design-send-unresolved/pill-before.png differ diff --git a/apps/web/src/custom/designMode/ForkComposerDesignChanges.tsx b/apps/web/src/custom/designMode/ForkComposerDesignChanges.tsx index b410d5e2ae47..c36b8ee0693e 100644 --- a/apps/web/src/custom/designMode/ForkComposerDesignChanges.tsx +++ b/apps/web/src/custom/designMode/ForkComposerDesignChanges.tsx @@ -11,6 +11,7 @@ import { useDesignChangeTargetRef, useForkPendingDesignChanges, } from "./designChangeDraftStore"; +import { countUnresolvedDesignElements } from "./protocol"; interface Props { /** The composer's own draft target — a DraftId for unstarted threads. Resolved to the @@ -65,6 +66,7 @@ function DesignChangeChip({ }) { const source = chipSource(entry); const summary = chipSummary(entry); + const unresolved = countUnresolvedDesignElements(entry); return ( {chipLabel(entry)} {source ? {source} : null} {summary ? {summary} : null} + {/* min-w-0 + truncate: this note must yield BEFORE the remove button. In a + squeezed pill every unshrinkable child clips from the right, and the + right-most child is the X — an unremovable attachment is a one-way door + (PR #71 review). */} + {unresolved > 0 ? ( + + {entry.elements.length === 1 ? "no source" : `${unresolved} without source`} + + ) : null}