Skip to content

finding(types/plugin-chatbot): chatbot-floating declares two keys nothing reads - displayMode (designer control included) and FloatingChatbotConfig.triggerIcon #7654

Description

@claude

Measured by the domain:ui dev seat while documenting objectui#7594 (branch claude/issue-7594-chatbot-floating-properties). Filed unassigned, ungraded - triage owns routing. Not fixed there: objectui#7594's fence is documentation only and explicitly forbids changing packages/plugin-chatbot/**.

The fact

Two keys on the chatbot-floating surface are declared, offered to authors, and read by nothing.

1. displayMode - declared three times, consumed zero times:

site what it declares
packages/types/src/complex.ts:865 displayMode?: 'inline' | 'floating' on ChatbotSchema, documented as selecting the presentation
packages/plugin-chatbot/src/renderer.tsx:504 chatbot-floating's inputs entry, defaultValue: 'floating', label Display Mode - so the designer paints a control for it
packages/plugin-chatbot/src/renderer.tsx:526 defaultProps.displayMode: 'floating' - so designer-created nodes carry the value

Read-site census, whole repo, tracked files, dist/ excluded:

git grep -n 'displayMode' -- ':!**/dist/**'

returns only those three declarations, the @object-ui/types doc comment beside them, one CHANGELOG line, the zod-mirror-parity ledger entry, and two unrelated displayMode props on GridField / MasterDetailForm. No renderer branches on it. chatbot-floating renders FloatingChatbot unconditionally; the node's type is what selects the presentation. Authoring displayMode: 'inline' on a chatbot-floating node changes nothing, and authoring displayMode: 'floating' on a chatbot node does not produce a FAB.

2. FloatingChatbotConfig.triggerIcon - packages/types/src/complex.ts:907, declared triggerIcon?: string with @default 'MessageCircle'. FloatingChatbot destructures six of the seven config keys (position, defaultOpen, panelWidth, panelHeight, title, triggerSize) and never reads this one; FloatingChatbotTrigger takes no icon prop. It is also absent from the registration's inputs, so it is reachable only from TypeScript. git grep -n 'triggerIcon' -- ':!**/dist/**' returns the declaration and one CHANGELOG line - nothing else.

Why it is worth a card

displayMode is the sharper of the two: the property panel shows a Display Mode control that cannot change anything, and the published type's own comment tells an author it selects between inline and floating. An AI author reading either surface learns a switch that does not exist. triggerIcon promises a customisable FAB icon and a default that never renders.

Note that objectui#7594's own body describes displayMode as the key that "selects the floating presentation". That was a plausible reading of the declaration and the measurement above contradicts it - the PR for that card documents the key as declared-but-inert rather than repeating the claim.

Not a duplicate

Dedup ran against the repo-scoped open-issue list (381 open issues, PRs excluded) with a lit positive control - chatbot-floating returns objectui#7594, so the zeros below are real readings and not a dark instrument. triggerIcon: 0 hits. FloatingChatbotConfig: 0 hits. displayMode: objectui#7594 and objectui#6152 only.

objectui#6152 is adjacent, not the same axis. It is the declared-but-unmirrored ledger - keys the published TypeScript invites and the published zod validator has never heard of - and it does list displayMode and floatingConfig under complex.zod.ts#ChatbotSchema. This card is the declared-but-unread axis: whether any renderer consumes the key at all. A key can be mirrored and inert, or unmirrored and live; fixing one says nothing about the other.

Suggested route

ADR-0049 enforce-or-remove, one decision per key. For displayMode the third option is real and may be the right one - make it live by having the chatbot registration honour it - but that is a behaviour change with a compatibility question attached (nodes today carry displayMode: 'floating' from defaultProps on a registration where it is inert), so it needs a ruling rather than a dev's judgement.


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfindingpm:dispatched

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions