Skip to content

[Feature Request] Copy selection as rich text (for Outlook and Slack) #1972

Closed

Description

@delmicio

Problem

I review plans and documents in Plannotator, then share parts of them by email (Outlook) and in chat (Slack). Every copy action in the UI copies plain text only. The selection toolbar's copy button, Vim Y and "Copy as markdown" on tables all go through copyTextToClipboard() in packages/ui/utils/clipboard.ts, which calls navigator.clipboard.writeText(). When I paste, I lose headings, bold, links, lists and code formatting.

Today I paste the text into an external converter first:

Their output is what I want from a "Copy for Outlook" or "Copy for Slack" action, without leaving Plannotator.

Proposal

Add a built-in Copy as rich text action to the selection toolbar, with a keyboard shortcut. It writes one ClipboardItem with two formats:

  • text/html: the rendered selection. Outlook, Word, Google Docs and other apps that accept rich text keep the formatting.
  • text/plain: the current plain text, as the fallback.

If the HTML copy does not paste well into Slack, add a second action, Copy for Slack. It writes Slack markup as plain text (*bold*, _italic_, <url|text>, • bullets, code blocks), like Slackdown does.

Alternative considered

Expose the existing selectionActions prop (packages/ui/utils/selectionActions.ts, used in AnnotationToolbar.tsx) through config, so that users can add their own copy actions. #1572 made that seam opt-in for host apps only ("Plannotator as the provider of these capabilities, not a product that uses them"), so a built-in action seems a better fit. If configurable actions are acceptable, the seam already provides the button, the dropdown and the selection context.

Notes

  • Clean up the copied HTML. Remove annotation highlights, data-block-id attributes, toolbar elements and theme colors, so that dark-theme colors do not appear in an email.
  • ClipboardItem needs a secure context. The fallback added in fix(ui): fall back to legacy copy in insecure browser contexts #1174 could also call clipboardData.setData('text/html', ...) in its copy handler, so that the action still works over plain HTTP on remote hosts.

Version: plannotator 0.28.22 (Pi extension). I checked the code paths above against main

Activity

  1. backnotprop commented on Oct 26, 2026

    @backnotprop
    Owner

    Fixed in #2191.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions