Skip to content

feat: toolbar to headless api (state and execute)#2757

Open
artem-harbour wants to merge 1 commit intomainfrom
artem/headless-toolbar-migration-v1
Open

feat: toolbar to headless api (state and execute)#2757
artem-harbour wants to merge 1 commit intomainfrom
artem/headless-toolbar-migration-v1

Conversation

@artem-harbour
Copy link
Copy Markdown
Contributor

@artem-harbour artem-harbour commented Apr 8, 2026

Linear: SD-2348.

Migrated toolbar to headless API (state and execute path).

Notes:

  • The link item is not migrated intentionally, as this is a special case and all the logic lives in the component (LinkInput.vue).
  • Some legacy logic has been moved to adapters (getFontFamilyFallbackValue, isFontSizeMixedState) rather than headless api for now.

@artem-harbour artem-harbour self-assigned this Apr 8, 2026
@artem-harbour artem-harbour added the don't merge Don't merge yet label Apr 8, 2026
@mintlify
Copy link
Copy Markdown

mintlify bot commented Apr 8, 2026

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
SuperDoc 🟢 Ready View Preview Apr 8, 2026, 2:34 PM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@linear
Copy link
Copy Markdown

linear bot commented Apr 8, 2026

@artem-harbour artem-harbour force-pushed the artem/headless-toolbar-migration-v1 branch from 3687083 to bad1282 Compare April 8, 2026 16:23
@artem-harbour artem-harbour added ready for review and removed don't merge Don't merge yet labels Apr 8, 2026
@artem-harbour artem-harbour marked this pull request as ready for review April 8, 2026 16:58
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bad1282efc

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

@artem-harbour
Copy link
Copy Markdown
Contributor Author

@harbournick @caio-pizzol - please review this.

Copy link
Copy Markdown
Contributor

@caio-pizzol caio-pizzol left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@artem-harbour clean migration, the routing is much easier to follow now. left a few inline comments.

two things to fix: toggling formatting on empty selections loses the toggle when you click away (sticky marks), and image upload errors no longer reach onException. also flagged three lists in constants.js that could get out of sync — easy to derive them from the maps.

test-wise: no coverage for destroy/cleanup and no test for hiding tracked-change buttons based on role. not blocking, good follow-ups.

if (handledByHeadless) {
this.updateToolbarState();
if (shouldRestoreFocus) this.#scheduleRestoreEditorFocus();
return;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

when you toggle bold/italic/underline on an empty selection via toolbar, the new headless path returns before saving the sticky mark state. so if the user clicks somewhere else after toggling, the formatting is lost. adding the sync call before the return should fix it:

Suggested change
return;
if (isMarkToggle) this.#syncStickyMarksFromState();
return;

@@ -849,20 +520,157 @@ export class SuperToolbar extends EventEmitter {
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the old image upload code fired an 'exception' event when something went wrong, so consumers could handle it via onException. the new headless version just logs to console — no event reaches consumers anymore. worth wiring the error back up?

{ label: '96', key: '96pt', props: { 'data-item': 'btn-fontSize-option' } },
];

export const HEADLESS_TOOLBAR_COMMANDS = [
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TABLE_ACTION_COMMAND_IDS, HEADLESS_TOOLBAR_COMMANDS, and HEADLESS_EXECUTE_ITEMS are all just copies of the data in the two maps above. if someone adds a command to one map but forgets to update these lists, things break silently. can we derive them from the maps instead?

@artem-harbour artem-harbour force-pushed the artem/headless-toolbar-migration-v1 branch from b1cc8d2 to 600a652 Compare April 14, 2026 12:20
@artem-harbour
Copy link
Copy Markdown
Contributor Author

@harbournick @caio-pizzol - please review and merge.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants