Replies: 1 comment
|
Hi @imccyu — sorry for the ping. This is currently blocking a real third-party plugin use case that needs an additive right-side panel which participates in AppFrame reflow without replacing the shipped details occupant. Since you've recently worked on the client slot/layout architecture, I'd appreciate any guidance on the intended extension direction here. Thanks! |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Summary
Plugins currently have two supported surfaces that are relevant to right-side panels:
shell.overlay, which is additive but rendered as a floating overlaydetails, which participates in the real layout but is a single-occupant slot used by the first-party tool-details panelNeither currently provides a generic additive, non-overlapping, width-reserving third-party panel that can sit beside the conversation without replacing native Harness UI.
This is a generic plugin-extension capability request rather than a request for a plugin-specific API.
Problem
shell.overlayshell.overlayis:kind: 'list'scope: 'root'However, it is rendered inside the AppFrame's floating overlay layer.
It does not participate in the shell's grid columns, reserves no layout width, and does not cause the center/conversation column to reflow.
As a result, a right-positioned plugin panel registered through
shell.overlaynecessarily covers part of the conversation.detailsThe
detailssurface has the opposite properties:ctx.layout.openDetails()/closeDetails()But
detailsis:kind: 'single'scope: 'session'and is already occupied by the first-party conversation
DetailsPanel/ tool-details UI.A third-party plugin registering its own component into
detailstherefore replaces the native tool-details occupant rather than coexisting with it.So today a plugin effectively has two choices:
shell.overlayand cover part of the conversation; ordetailsand displace the first-party details panel.Neither is a good general extension contract for:
Source evidence
Relevant areas in the current source include:
packages/client/ui-layout/src/client/index.tsdetailsas a session-scopedsingleslotshell.overlayas a root-scopedlistslotpackages/client/ui-layout/src/client/AppFrame.tsxshell.overlayin the floating overlay layercomputeColumns(...)for layout width allocationpackages/client/ui-layout/src/client/columns.tspackages/client/ui-layout/src/client/stores.tspackages/client/ui-layout/src/client/service.tsopenDetails()/closeDetails()the first-party conversation UI registers its own DetailsPanel into the
detailssurfaceThis appears to be an extension-contract limitation rather than a CSS issue in an individual plugin.
Required properties of a generic plugin panel contract
A general solution would ideally support:
detailscolumnDesign alternatives
I do not think the current source makes one design uniquely correct, so I would prefer maintainer guidance before proposing an implementation.
Option A — Make
detailsmulti-tenantChange
detailsfrom a single occupant into some form of container, such as a list, tab set, or composed panel area.The first-party tool-details panel would become one entry and plugins could add others.
Advantages
Trade-offs
singleslot semanticDetailsPanelOption B — Add a separate plugin right-rail column
Introduce a new additive right-side layout surface, conceptually something like:
The exact name and shape are only illustrative.
This rail would reserve real AppFrame width while leaving the existing native
detailscolumn unchanged.Advantages
detailssemanticsTrade-offs
computeColumnswould need to support an additional layout regionOption C — Generalized reservable panel instances
Instead of defining one additional right rail, allow plugins to declare panel instances that participate in shell layout and reserve space.
Advantages
Trade-offs
Questions for maintainers
I would appreciate guidance on the intended direction, particularly:
detailsconcept, or remain separate from it?detailspanel and a plugin right rail ever be visible at the same time?detailssurface?This is intended as a design discussion rather than a prescriptive implementation request.
Backward compatibility
Ideally, any extension would preserve the current behavior when no third-party panel is registered:
detailsbehavior remains unchangedshell.overlaysemantics remain unchangedPractical validation
This limitation was encountered while building a real third-party Harness plugin.
We tested both currently supported approaches:
shell.overlayworks and is additive, but the panel covers part of the conversation because the overlay does not participate in layoutdetailsproduces the desired real reflow, but replaces the native tool-details occupantWe rejected the second approach because a third-party plugin should not gain its UI by removing an existing first-party Harness capability.
That experiment was not pushed upstream; it was only used to validate the current extension behavior.
I couldn't find an existing public discussion, issue, or PR covering this. If this is already being discussed elsewhere or internally, please point me to the relevant direction.
All reactions