MessageForwardedBundle

Collapsed forwarded-message bundle composed inside a MessageItem body.

Preview#

AT
Atlasowner2:24 PM
Forwarded 4 messages
Forwarded4 messages
from #release-notes
@Ada

Rollout is clear for the message reference migration.

@Will

Keep the source case with its attachment context.

release-notes.md· markdown
@Mia

Keep the original context available to reviewers.

@Nia

Follow the same message state contract in the thread.

import {
  MessageForwardedBundle,
  MessageForwardedBundleAttachment,
  MessageForwardedBundleAttachmentMeta,
  MessageForwardedBundleAttachmentName,
  MessageForwardedBundleAttachments,
  MessageForwardedBundleFooter,
  MessageForwardedBundleFooterAction,
  MessageForwardedBundleHeader,
  MessageForwardedBundleHeaderContent,
  MessageForwardedBundleHeaderCount,
  MessageForwardedBundleHeaderLabel,
  MessageForwardedBundleItem,
  MessageForwardedBundleItemAuthor,
  MessageForwardedBundleItemMeta,
  MessageForwardedBundleItems,
  MessageForwardedBundleSource,
} from "raft-ui";

<MessageForwardedBundle>
  <MessageForwardedBundleHeader>
    <MessageForwardedBundleHeaderContent>
      <MessageForwardedBundleHeaderLabel />
      <MessageForwardedBundleHeaderCount />
    </MessageForwardedBundleHeaderContent>
    <MessageForwardedBundleSource />
  </MessageForwardedBundleHeader>
  <MessageForwardedBundleItems collapsed>
    <MessageForwardedBundleItem>
      <MessageForwardedBundleItemMeta>
        <MessageForwardedBundleItemAuthor />
      </MessageForwardedBundleItemMeta>
      <MessageForwardedBundleItemContent />
      <MessageForwardedBundleAttachments>
        <MessageForwardedBundleAttachment>
          <MessageForwardedBundleAttachmentName />
          <MessageForwardedBundleAttachmentMeta />
        </MessageForwardedBundleAttachment>
      </MessageForwardedBundleAttachments>
    </MessageForwardedBundleItem>
  </MessageForwardedBundleItems>
  <MessageForwardedBundleFooter>
    <MessageForwardedBundleFooterAction />
  </MessageForwardedBundleFooter>
</MessageForwardedBundle>

One to three short forwarded messages render expanded and omit the footer. A DM, private channel, or missing target also omits the source label.

AT
Atlasowner2:25 PM
Forwarded 2 messages
Forwarded2 messages
@Ada

Rollout is clear for the message reference migration.

@Will

Keep the source case with its attachment context.

A bundle folds when the items' text together renders beyond eight lines, and folds down to that many lines (both adjustable via `foldLineLimit`). When MessageForwardedBundleItems renders without a collapsed prop the component measures this itself: the list clips with its own fade and the footer appears only while the content actually folds. Passing collapsed keeps the consumer-owned mode. The measurement reads the MessageForwardedBundleItemContent slots, so wrap each item's text body in one — unwrapped text is never measured.

Forwarded4 messages
from #release-notes
@Ada

Rollout is clear for the message reference migration.

@Will

Keep the source case with its attachment context.

release-notes.md· markdown
@Mia

Keep the original context available to reviewers.

@Nia

Follow the same message state contract in the thread.

A single forwarded item folds under the same eight-line rule, and the action labels both states through expandedContent (children render while folded). Attachment labels stay caller-owned, including their MIME-derived type text.

AT
Atlasowner2:27 PM
Forwarded 1 message
Forwardedmessage
@Nia

Before we cut over, keep the read model running against both event streams and validate account, workspace, and channel permissions in staging.

The migration needs an explicit rollback checkpoint after the first production cohort, plus a documented handoff for reconciliation and replay.

Review the operational checklist with the owners of notifications, search, and thread state before scheduling the final rollout window.

Also decide the dual-write window up front: how long both writers stay live, who watches the divergence dashboard, and which metrics gate the next cohort.

Finally, write down what "done" means for the old path — read-only, disconnected, or deleted — and add a dated note to the runbook so the next person on call can find the decision.

migration-checklist.md· markdownwebhook-cutover-plan.pdf· pdf

A public thread source is actionable and adds the thread suffix to its label.

AT
Atlasowner2:26 PM
Forwarded 1 message
@Mia

Follow the same message state contract in the thread.

Render a static source label when the original message cannot be opened, such as unavailable provenance or a composer preview. An empty forwarded-items list has no rendered bundle.

AT
Atlasowner2:28 PM
Forwarded 1 message
Forwardedmessage
from #release-notes
@Kai

The original message is no longer available to open.

API#WIP

...props
useRender.ComponentProps<"div">
Forwarded messages card root. Compose inside MessageItemEmbedded. By default the bundle folds when the items' text together renders beyond eight lines (adjustable via foldLineLimit); pass collapsed on the items to take full control.
...props
useRender.ComponentProps<"div">
Bundle header row.
...props
useRender.ComponentProps<"div">
Leading header region for the forwarded label and count.
...props
useRender.ComponentProps<"span">
Forwarded label.
...props
useRender.ComponentProps<"span">
Forwarded message count label.
...props
useRender.ComponentProps<"button">
Interactive public source link; render as an anchor when navigation is available.
...props
useRender.ComponentProps<"span">
Static public source label when the original message cannot be opened.
collapsed
boolean
Omit to keep the default fold: the component measures its item-content slots and folds when the items' text together renders beyond the fold line limit (eight by default). Pass true/false to control the fold yourself — the item list constrains to its folded height and shows its bottom fade, and the measurement is skipped (the detail view pins it open).
foldLineLimitdefault: 8
number
How many rendered text lines the default fold allows before folding (only used when collapsed is omitted).
...props
useRender.ComponentProps<"div">
Item list. Without `collapsed` the surface measures its item-content slots and owns the fold.
...props
useRender.ComponentProps<"article">
One forwarded message snapshot.
...props
useRender.ComponentProps<"div">
Author and timestamp row for an item.
...props
useRender.ComponentProps<"span">
Forwarded item author label.
...props
useRender.ComponentProps<"div">
The item's text body. The component-owned fold measures these slots: their combined content beyond eight lines folds the card.
...props
useRender.ComponentProps<"div">
Attachment-chip region for an item.
...props
useRender.ComponentProps<"span">
One forwarded attachment chip.
...props
useRender.ComponentProps<"span">
Truncated attachment filename.
...props
useRender.ComponentProps<"span">
Attachment type or other compact metadata.