mirror of
https://github.com/multica-ai/multica.git
synced 2026-07-28 05:46:58 +02:00
Collapse the five separate attachment render paths (file-card NodeView,
image NodeView, readonly markdown img/fileCard renderers, AttachmentList
standalone fallback, and the parallel packages/ui/markdown renderer) into
one <Attachment attachment={a} /> dispatcher.
Fixes a P0 visual regression: a PNG attached to a message but not inlined
in the markdown body used to render as a gray "file card" because
getPreviewKind() lacked an "image" branch and image rendering bypassed
the dispatcher entirely. Now every surface routes through <Attachment>,
so the same PNG renders as a real <img> with hover toolbar and
preview-modal everywhere.
Key changes:
- PreviewKind gains "image"; getPreviewKind() detects image/* + common
extensions before the html/text branches (so svg stays image, not text).
- AttachmentPreviewModal gains case "image" (replaces the standalone
ImageLightbox, which is deleted).
- New packages/views/editor/attachment.tsx owns all kind-aware routing
(image | html | file) and dispatches preview modal + download via the
existing useAttachmentPreview / useDownloadAttachment hooks. Subsumes
the deleted AttachmentBlock.
- AttachmentInput.url accepts a forceKind hint so callers that *know*
the structural kind (markdown , Tiptap image node) skip the
filename-based autodetect — fixes a regression where empty or
descriptive alt text would route an image to the file-card chrome.
- Tiptap NodeViews (file-card.tsx, image-view.tsx) shrink to thin
wrappers that forward editor hints (selected, deleteNode, uploading)
to <Attachment>.
- ReadonlyContent and AttachmentList each mount their own
AttachmentDownloadProvider so url → record resolution works outside
ContentEditor's provider.
- packages/ui/markdown gains optional renderImage / renderFileCard slot
props; packages/views/common/markdown.tsx injects <Attachment> into
those slots and threads message attachments through to chat /
skill-file viewers.
- chat-message-list passes message.attachments to every <Markdown> call
site and renders a standalone AttachmentList under each bubble for
attachments not referenced in the body.
Tests: attachment.test.tsx covers 9 scenarios (record image / pdf / html;
url-only image with resolver hit and miss; uploading state; editable
delete; forceKind regression). attachment-preview-modal.test.tsx gains
image-dispatch cases. 652/652 unit tests pass.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
27 lines
975 B
TypeScript
27 lines
975 B
TypeScript
export {
|
|
ContentEditor,
|
|
type ContentEditorProps,
|
|
type ContentEditorRef,
|
|
} from "./content-editor";
|
|
export {
|
|
TitleEditor,
|
|
type TitleEditorProps,
|
|
type TitleEditorRef,
|
|
} from "./title-editor";
|
|
export { copyMarkdown } from "./utils/clipboard";
|
|
export { ReadonlyContent } from "./readonly-content";
|
|
export { useFileDropZone } from "./use-file-drop-zone";
|
|
export { FileDropOverlay } from "./file-drop-overlay";
|
|
export { useDownloadAttachment } from "./use-download-attachment";
|
|
export { AttachmentDownloadProvider } from "./attachment-download-context";
|
|
export {
|
|
AttachmentPreviewModal,
|
|
useAttachmentPreview,
|
|
isPreviewable,
|
|
} from "./attachment-preview-modal";
|
|
export type { AttachmentPreviewHandle } from "./attachment-preview-modal";
|
|
export { AttachmentCard } from "./attachment-card";
|
|
export type { AttachmentCardProps } from "./attachment-card";
|
|
export { Attachment } from "./attachment";
|
|
export type { AttachmentInput, AttachmentProps } from "./attachment";
|