Verified Web implementations
Patterns
Current Quiet Sky behavior evidenced in production source. “Shared” means reusable within the named product area; it does not imply a centralized design-system React package.
Every specimen on this page is hand-built from tokens.css and demo.css. None of them imports from the frontend, none is interactive, and none should be treated as evidence of behaviour. The source path on each row is the evidence. Two sections carry a geometry diagram instead of a specimen, because a static copy of them would assert the opposite of the spec.
Navigation
Responsive, resizable rail
Desktop width is drag-resizable from 280–500px and auto-collapses when an open activity panel would leave less than 550px for chat. Below 768px, the shell switches to a full-screen list or an 88vw/320px slide-over drawer.
Responsive shell
Owns the mobile full-screen list and slide-over drawer behavior.
web/src/app/[slug]/social/_components/ChatListView/index.tsxDesktop sizing
Persists the selected width under aic_channel_list_width, measures viewport constraints, and exposes a five-pixel resize target.
…/ChatListView/components/DesktopChatListView.tsxRail contents
Composes product links, rooms, unread badges, agent sessions, notifications, and footer actions.
…/ChatListView/components/ConvergenceRailLayout.tsxContents at the 280px minimum
Chat pane
Fixed at the 280px minimum. Drag-resize to 500px, auto-collapse below the 550px chat threshold, and the mobile slide-over are not reproduced. A static mock cannot show any of them, and a wider one would silently assert a width the spec does not fix.
Widths the rail actually responds to
The load-bearing behaviour is the range, not any single width. The selected desktop width persists under aic_channel_list_width and the resize target is five pixels wide.
Identity
Agent avatar with owner satellite
An agent is a cyan dot with a pulsing hairline halo. When ownership needs disambiguation, the owner’s image or initial appears as a 46% satellite at the lower-right. This is the current identity decision.
Implementation
Bot rendering, owner fallback, authenticated media, and accessible labels are centralized in the social Avatar component.
web/src/app/[slug]/social/_components/Avatar.tsxSizes, presence, and stacking
Four sizes: 40, 28, 26, and 20. The agent form is the same frame with the logotype's particle inside it, a solid accent dot at 44% inside one hairline halo, which is the ratio the icon family and the app tile also use. Presence is a filled mint dot for online and a hollow ring for away, never a colour change to the avatar itself. A stack overlaps at 8px and terminates in a count rather than growing.
Selection
Segmented control
Use for a short, exclusive choice. The active segment lifts onto a raised surface and the group exposes radio semantics.
Implementation
Command Center provides the current pill-track treatment. Workflows copies that recipe locally, while Routines owns a typed radiogroup variant. There is no app-wide primitive.
web/src/app/[slug]/social/_components/chat/AgentActivityPanel/commandCenter/CommandCenterTab.tsx · …/workflows/_components/quietSky.tsx · …/routines/_components/SegmentedControl.tsxBoth selection recipes
Pill track · exclusive choice
The active segment lifts onto a raised surface. Use for two to four short, mutually exclusive options that fit on one line.
Underline · navigation between views
Use when the choice swaps a whole view rather than filtering one, and when a count belongs on a tab. The underline is the accent; the label carries no fill.
Calendar & calls
Event and call-history patterns
Agenda events and call history are separate production recipes. Events expose temporal state, response state, agent preparation, joining, and attendee details; Calls adds live/history grouping, recap generation, Scribe notes, and chat references.
Agenda event card
Expandable gateway-backed event with live/soon/ended chips, attendee response dots, cleaned description, preparation, call action, and details.
web/src/app/[slug]/social/_components/chat/AgentActivityPanel/agenda/EventCard.tsx · SmartAgendaList.tsxAgenda data
Normalizes connected-gateway occurrences and time zones, with explicit loading, refresh, density, and error states.
web/src/hooks/useAgendaEventsQuery.tsCalls shell
Groups historical calls by day, keeps live calls above history, and opens recap or Scribe content in an inset dialog.
web/src/app/[slug]/social/calendar/_components/CalendarPage.tsxCall history card
Shows date, duration, participants, recap state, parent room, tagging, summary, and Scribe actions.
…/calendar/_components/CallHistoryCard.tsxLive call card
Separates currently active calls from historical records and supports immediate join behavior.
…/calendar/_components/LiveCallCard.tsxWeek strip and agenda event
The card, not the agenda shell. Temporal state is a chip, response state is a dot per attendee, and the accent hairline marks the event as current. A filled dot is accepted, a danger dot declined, a hollow ring pending. Loading, refresh, and error states belong to the agenda query and are not shown.
Call history row
Recap is generated when the call ends.
Agreed to hold the enterprise tier and revisit the seat minimum after the Thursday review.
No recap. The call was too short to summarise.
Live calls sit above history and share the row shape, which is what lets a call move from one group to the other without changing appearance. An absent recap is stated rather than left blank, and an untitled call is admitted rather than given a generated name.
Messaging
Rich composer
The current composer persists drafts and attachments, hydrates without a blank flash, handles mentions and meeting tags, previews links, supports voice recording, and blocks unsafe cross-room sharing behind confirmation.
Composer surface
Owns rich editing, attachments, drafts, model controls, recording, reply state, and send validation.
web/src/app/[slug]/social/_components/chat/ChatInput.tsxReuse
The main Matrix chat and thread side panel both wire the shared composer behavior into their own send state.
…/chat/ChatPanel.tsx · ThreadSidePanel.tsxEntity picker
Resolves people and agents; agent results preserve the owner-satellite identity rule.
…/chat/ComposerTagPickerPopover.tsxComposer surface, both send states
Empty · send disabled
Send is disabled until there is content or an attachment, so a stray press cannot post an empty message.
Draft with attachment and reply · send enabled
A mention is accent text, never a filled pill, so a sentence with three mentions still reads as a sentence.
Draft persistence, hydration without a blank flash, link previews, voice recording, and the cross-room share confirmation are behaviours. None of them is visible in a static frame, and none is reproduced here.
Skills & Apps
Marketplace hero, cards, and management
A width-capped product column connects the build hero, progress, Yours/Discover views, search, sort, view toggles, install feedback, cards, and detail dialogs.
Marketplace shell
Coordinates build, browse, manage, install, publish, and preview states with accessible live feedback.
web/src/app/[slug]/social/skills-and-apps/_components/SkillsAndAppsMarketplace.tsxBuild hero
Prompt-first creation accepts text or file input, submits on Enter, and rotates through starter ideas.
…/skills-and-apps/_components/MarketplaceHero.tsxCatalog cards & rows
Grid and text-forward list views show real metadata, preview state, usage, sharing, and install/update actions.
…/skills-and-apps/_components/MarketplaceCard.tsx · MarketplaceRow.tsxPersonal inventory
Unifies owned skills, apps, and dashboards with search, filtering, empty states, and row actions.
…/skills-and-apps/_components/YoursView.tsx · YoursRow.tsxDetail dialog
Provides item metadata, ownership, previews, install state, and owner identity.
…/skills-and-apps/_components/MarketplaceItemDetailDialog.tsxBuild hero
What should it do?
Describe an app or a skill. Attach a file if you have a spec.
Prompt-first: the input is the primary action and the starter ideas rotate. Enter submits. Text or a file are both accepted.
Card view and row view
Reads room membership and licence counts, then flags rooms that will cross the seat minimum this month.
Turns merged pull requests into a plain-language changelog and posts it to the room you choose.
The same items in both views. Cards lead with a preview thumbnail and are for browsing; rows lead with the description and are for deciding. Install state is a label in both, so scanning either view answers the same question. Neither view invents metadata: the row admits “used 31 times” or nothing.
Awareness
Notifications
The rail popover merges notification history with participated threads, filters All/DMs/Mentions/Thread, marks room or all items read, preserves agent identity, and repositions on scroll and resize.
Bell & popover
The bell combines chat and product-update unread state. Its 384px portaled feed clamps to the viewport and connects filters, exact-message navigation, and read-state hooks.
web/src/app/[slug]/social/_components/ChatListView/components/NotificationBell.tsx · NotificationPopover.tsxTransient toasts
A separate app-wide stack presents up to four actionable default, success, or error notices and defaults to a four-second dismissal.
web/src/components/feedback/toast/NotificationToaster.tsx · toastStore.tsRail popover at its production 384px
Mentioned you: can you take the seat-minimum numbers before Thursday?
Recap ready for the 34-minute pricing follow-up.
Declined Design review and suggested Thursday instead.
Fixed geometry, so the specimen reproduces faithfully. Unread is a recessed surface plus a leading dot, not a bold label, which keeps a long unread list readable. Agents keep their identity form in the feed. The real popover is portaled and clamps to the viewport; that clamping is not shown.
Transient toasts
Three variants, one shape: a pip carries the state and the text stays the same size in all three. Up to four stack at once and the default dismissal is four seconds. An error toast keeps its action, because a notice you cannot act on is not worth interrupting for.
Settings
Responsive settings geometry
One 90vh modal owns account, appearance, billing, usage, connectors, vault, and feedback. It caps at 480px on mobile and 1000px on desktop; desktop adds a fixed 280px navigation column, while mobile uses stacked drill-down.
Core settings modal
Responsive portal with explicit view titles, navigation stack, feature-gated destinations, and dedicated content modules.
web/src/app/[slug]/social/_settings/_components/CoreSettingsModal.tsxGeometry, both breakpoints
A diagram, not a specimen. Rendering a 90vh modal live means either an overlay that hijacks this page or a scaled iframe, and both misrepresent the thing more than a labelled drawing does. The navigation column is fixed at 280px on desktop; on mobile it becomes the first screen of a drill-down stack rather than shrinking.
Row shapes inside a settings group
Four row shapes cover the whole modal: a drill-down with its current value, a switch, a masked secret, and a destructive action. A destructive row is danger-coloured text on the normal surface, never a filled red row, so it reads as available rather than as an error already in progress.
Agent execution
Live agent and checkpoint states
Chat exposes streamed agent work; Workflows exposes structured runs and human gates. Both are backend-fed, and approval is server-authoritative.
Live chat agent
An expandable activity bar shows elapsed time, sticky turn detail, abort, recent tools and narration, and pending/in-progress/completed plan tasks.
web/src/app/[slug]/social/_components/chat/AgentThinkingBar.tsx · web/src/hooks/agentcore-gateway/aicBotState.tsRun anatomy
Step list → named working state → checkpoint or prompt → delivery/done row.
web/src/features/workflows-shared/WorkflowRunPanel.tsxStep cards
Maps state to restrained semantics; “mutation” is intentionally not treated as success before completion.
web/src/features/workflows-shared/WorkflowStepCards.tsxRun anatomy
Move Design review to Thursday 10:00 and tell all four guests. This changes a shared calendar.
Five states, four visual treatments. Completed steps take a filled mint pip, the running step takes a pulsing accent pip, and pending steps take a hollow ring with tertiary text so the run reads top to bottom without a legend.
The mutation step is the point. It sits pending behind a checkpoint even though the agent already knows what it will do, because approval is server-authoritative and nothing here may claim success ahead of the backend. Deny is danger-coloured text and not a filled red button: refusing is a normal outcome, not an error. Only the delivery row, after the fact, is allowed the success treatment.
Live chat activity bar
Elapsed time, the current turn, and an abort are always reachable while an agent runs. The meter track is --track and the fill is accent. Narration that has not arrived yet is a breathing skeleton rather than a spinner, because the shape of the pending content is known.