feat(APP-998): support chat side panel, email escape hatch, centralized copy#1242
feat(APP-998): support chat side panel, email escape hatch, centralized copy#1242tyhonchik wants to merge 7 commits into
Conversation
The chat is no longer a Radix Dialog overlay with a blur backdrop: on lg+ screens it is an in-flow, full-height side panel the rest of the layout resizes around (animated width, non-modal, page keeps its own scroll and stays interactive), below lg it opens fullscreen with the page scroll locked behind it. The panel shell now lives in the app layout; the widget just fills its container. The only trigger is a new header button (feedback icon <-> chevron) pinned to the trailing edge of all three navigation bars, right next to the panel; the footer Support entry reverts to the plain external portal link.
…t email The external support portal is deprecated as the chat's escape hatch: the header link and the error suggestions now point to support@aragon.org (mailto) instead. The supportPortalUrl prop is removed from the widget API and the host; the footer keeps its own external portal link.
Pure string moves, no wording changes. Every user-facing string of the widget now lives in a single copy module (packages/assistant-chat/src/copy.ts), including the service error texts and file alerts; components only reference it. On the service side, the static Linear ticket texts move from linear/issueBody.ts into chat/prompts/issueTexts.ts so all service copy (prompts, fixed replies, ticket texts) is edited under chat/prompts/.
|
E2E results (preview) Smoke
|
…inst them Release flows now name a scope from .github/release-scopes.yml instead of hardcoding package lists; pnpm validate:changesets (wired into pnpm test) rejects changesets that mix packages from different release scopes, which changeset version --ignore refuses at release time. The APP-998 changeset is split per scope accordingly.
…screen readers Below the lg breakpoint the open panel covers the whole viewport but left the covered app column reachable; it is now made inert while the drawer is open (re-evaluated across breakpoint changes). The closed panel is also aria-hidden so its kept-mounted content stops being a complementary landmark.
74fb406 to
fae492f
Compare
| assistant: | ||
| - "@aragon/assistant" | ||
| - "@aragon/assistant-contracts" | ||
| - "@aragon/assistant-chat" |
There was a problem hiding this comment.
@aragon/assistant-chat ships inside the app bundle (@aragon/app depends on it and the app release filter includes packages/assistant-chat/**), but this maps it only to the assistant release scope. That means an app release can deploy assistant-chat changes without consuming the assistant-chat changeset/version/changelog; the package version would move later through an assistant flow that doesn't deploy the widget.
Can we either put app-bundled packages in the app scope, or make the coupled release behavior explicit so the tag that deploys the app also consumes the widget changeset it ships?
|
One copy miss I couldn't leave inline because the file isn't in the diff: Can we update those fixed replies too, so users who hit the hard limit aren't sent looking for a button that no longer exists? |
This turns the support chat from a blur overlay into a side panel the app resizes around, and centralizes all chat/assistant copy. Previously the chat was a Radix Dialog pinned over the page — backdrop blur, focus trap, page frozen behind it — opened from a footer link, with its strings scattered across a dozen widget components and the service. Now the chat is a full-height column next to the app (the header, content and footer shrink to fit), toggled from a button at the trailing edge of every navigation bar, and every string has exactly one home. The panel shell moves out of the widget into the app layout — the upcoming assistant-ui rework only swaps the panel's innards.
Changes
lg+the panel is a sticky, full-viewport-height column (clamp(500px, 30vw, 640px)) with a ~300ms width animation; belowlgit opens fullscreen with the page scroll locked behind it. Non-modal by design: no backdrop, no focus trap, no ESC-close — the page stays scrollable and interactive while the chat is open, andoverscroll-containkeeps the chat scroll from chaining into the page. While closed the panel stays mounted (the conversation survives reopening) butinert.SupportChatTrigger(feedback icon ↔ chevron) sits at the trailing edge of all three navbars via a newtrailingslot onNavigation.Container, so it lands right next to the panel. The footer "Support" entry reverts to the plain external portal link regardless of the flag; open/close state lives in a newSupportChatContextProviderin the root layout.support@aragon.org(mailto) instead of the portal; thesupportPortalUrlprop is removed from the widget API end-to-end.packages/assistant-chat/src/copy.ts; components only reference it. Service-side, the static Linear ticket texts move fromlinear/issueBody.tsintochat/prompts/issueTexts.ts, so all service copy (prompts, fixed replies, ticket texts) is edited underchat/prompts/. Pure string moves, zero wording changes.ChatDrawerdeleted along with the widget's@radix-ui/react-dialogdependency;AssistantChatnow just fills whatever container the host renders it in.Note
The chat UI itself (message list, composer, status strip) is intentionally untouched — the assistant-ui evaluation happens in a follow-up branch based on this one. Wording changes beyond the portal→email swap are also out of scope here.
🤖 Generated with Claude Code