Problem
The composer ToolbarButton takes a prop named type, but it is not the HTML button type. It is the TipTap node or mark name that editor.isActive checks: editor?.isActive(type || '') (apps/webapp/src/components/chatroom/components/MessageComposer/components/ui/Button.tsx:8-9, :39). The composer ToolbarButton never passes type on, so the shared button falls back to its default type="button" (apps/webapp/src/components/ui/Button.tsx:119, :130).
The send button passes type="submit", and the same fallback applies, so it renders type="button". It passes no editor, so no active check runs either (apps/webapp/src/components/chatroom/components/MessageComposer/components/Actions/ActionButtons/ComposerPrimaryAction.tsx:74). No form wraps the composer. The line before it, disabled={!canSend}, sits inside the if (canSend) branch, so it is always false (:62, :73).
A reader expects type="submit" to submit a form. The name does not say what the prop does.
The chatroom docs describe the dead prop as live: "ComposerPrimaryAction reads disabled={!canSend}" (apps/webapp/src/components/chatroom/CLAUDE.md:73).
Acceptance criteria
Agent Brief
Category: enhancement
Summary: Rename the type prop of the composer ToolbarButton so it says it holds a node or mark name. Remove two props that do nothing.
Current behavior:
type on the composer ToolbarButton is a TipTap node or mark name for editor.isActive. The send button passes type="submit" and an always-false disabled.
Desired behavior:
The prop name says it holds a node or mark name. The dead props are gone. The rendered HTML and the behavior do not change.
Key interfaces:
- The composer
ToolbarButton props.
ComposerPrimaryAction — its send branch.
BoldButton and the other format buttons — they pass a node or mark name.
Out of scope
Notes
The evidence is a code trace on 14ab7f9c1.
Problem
The composer
ToolbarButtontakes a prop namedtype, but it is not the HTML button type. It is the TipTap node or mark name thateditor.isActivechecks:editor?.isActive(type || '')(apps/webapp/src/components/chatroom/components/MessageComposer/components/ui/Button.tsx:8-9,:39). The composerToolbarButtonnever passestypeon, so the shared button falls back to its defaulttype="button"(apps/webapp/src/components/ui/Button.tsx:119,:130).The send button passes
type="submit", and the same fallback applies, so it renderstype="button". It passes noeditor, so no active check runs either (apps/webapp/src/components/chatroom/components/MessageComposer/components/Actions/ActionButtons/ComposerPrimaryAction.tsx:74). No form wraps the composer. The line before it,disabled={!canSend}, sits inside theif (canSend)branch, so it is always false (:62,:73).A reader expects
type="submit"to submit a form. The name does not say what the prop does.The chatroom docs describe the dead prop as live: "
ComposerPrimaryActionreadsdisabled={!canSend}" (apps/webapp/src/components/chatroom/CLAUDE.md:73).Acceptance criteria
activeName. Every caller of the composerToolbarButtonis updated.type="submit"ordisabled={!canSend}.apps/webapp/src/components/chatroom/CLAUDE.mdno longer says the send button readsdisabled={!canSend}.bun run typecheckpasses.Agent Brief
Category: enhancement
Summary: Rename the
typeprop of the composerToolbarButtonso it says it holds a node or mark name. Remove two props that do nothing.Current behavior:
typeon the composerToolbarButtonis a TipTap node or mark name foreditor.isActive. The send button passestype="submit"and an always-falsedisabled.Desired behavior:
The prop name says it holds a node or mark name. The dead props are gone. The rendered HTML and the behavior do not change.
Key interfaces:
ToolbarButtonprops.ComposerPrimaryAction— its send branch.BoldButtonand the other format buttons — they pass a node or mark name.Out of scope
@components/ui/Button.ToolbarButton. It has the sametypeprop and the sameeditor.isActivecheck. Rename it in a separate issue.Notes
The evidence is a code trace on
14ab7f9c1.