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.

Production-backedWebVerified 2026-09-03Specimens are static

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.

Feature-local social shellStatic specimen

Responsive shell

Owns the mobile full-screen list and slide-over drawer behavior.

web/src/app/[slug]/social/_components/ChatListView/index.tsx

Desktop sizing

Persists the selected width under aic_channel_list_width, measures viewport constraints, and exposes a five-pixel resize target.

…/ChatListView/components/DesktopChatListView.tsx

Rail contents

Composes product links, rooms, unread badges, agent sessions, notifications, and footer actions.

…/ChatListView/components/ConvergenceRailLayout.tsx

Contents at the 280px minimum

All conversations4
Calendar
Skills & Apps
Rooms
DRDesign review2
Q3Q3 planning
Thread · pricing page
Agents
Scribe
Scheduler
JJeet

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

Desktop · viewport ≥ 768px 280 min to 500 max chat pane collapses the rail below 550px drag range, 5px target Mobile · viewport < 768px 320 or 88vw slide-over drawer, or a full-screen list

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.

Shared social componentStatic specimen

Implementation

Bot rendering, owner fallback, authenticated media, and accessible labels are centralized in the social Avatar component.

web/src/app/[slug]/social/_components/Avatar.tsx

Sizes, presence, and stacking

JZ JZ JZ JZ AM RK JZAMRK+7

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.

Feature-local recipeStatic specimen

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.tsx

Both 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.

Feature-local systemsStatic specimen

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.tsx

Agenda data

Normalizes connected-gateway occurrences and time zones, with explicit loading, refresh, density, and error states.

web/src/hooks/useAgendaEventsQuery.ts

Calls 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.tsx

Call history card

Shows date, duration, participants, recap state, parent room, tagging, summary, and Scribe actions.

…/calendar/_components/CallHistoryCard.tsx

Live call card

Separates currently active calls from historical records and supports immediate join behavior.

…/calendar/_components/LiveCallCard.tsx

Week strip and agenda event

Mon1
Tue2
Wed3
Thu4
Fri5
Sat6
Sun7
10:00 – 10:45
Design review
Organised by Amara Mensah
Live
Scribe prepared a brief from the last two calls
4 guests · 2 accepted, 1 declined, 1 pending
AMAmara MensahOrganiser
JZJeet Zandawala
RKRina Koda
TBTom Bardy

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

Wednesday 3 September
Live now · 12 min
Design review
AMJZ2 on the call

Recap is generated when the call ends.

09:15 · 34 min · Q3 planning
Pricing follow-up
RKTBJZ3 attended

Agreed to hold the enterprise tier and revisit the seat minimum after the Thursday review.

Yesterday 16:40 · 8 min
Untitled call
JZ1 attended

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.

Shared chat componentStatic specimen

Composer surface

Owns rich editing, attachments, drafts, model controls, recording, reply state, and send validation.

web/src/app/[slug]/social/_components/chat/ChatInput.tsx

Reuse

The main Matrix chat and thread side panel both wire the shared composer behavior into their own send state.

…/chat/ChatPanel.tsx · ThreadSidePanel.tsx

Entity picker

Resolves people and agents; agent results preserve the owner-satellite identity rule.

…/chat/ComposerTagPickerPopover.tsx

Composer surface, both send states

Empty · send disabled

Message Design review…
Sonnet

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

Replying to Amara · “hold the enterprise tier”
Thursday works. @Scribe can you pull the seat-minimum numbers first?
q3-pricing.pdf

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.

Feature-local systemStatic specimen

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.tsx

Build hero

Prompt-first creation accepts text or file input, submits on Enter, and rotates through starter ideas.

…/skills-and-apps/_components/MarketplaceHero.tsx

Catalog 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.tsx

Personal inventory

Unifies owned skills, apps, and dashboards with search, filtering, empty states, and row actions.

…/skills-and-apps/_components/YoursView.tsx · YoursRow.tsx

Detail dialog

Provides item metadata, ownership, previews, install state, and owner identity.

…/skills-and-apps/_components/MarketplaceItemDetailDialog.tsx

Build hero

What should it do?

Describe an app or a skill. Attach a file if you have a spec.

A dashboard that tracks seat usage per room…
Summarise my week Track seat usage Draft release notes

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

Search 42 items
Preview
Seat usageDashboard · Amara Mensah
Installed
Release notesSkill · used 31 times
Weekly digestSkill · shared with 4 rooms
Seat usage
Dashboard · Amara Mensah · updated yesterday

Reads room membership and licence counts, then flags rooms that will cross the seat minimum this month.

Preview
RK
Release notes
Skill · Rina Koda · used 31 times

Turns merged pull requests into a plain-language changelog and posts it to the room you choose.

Installed

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.

Feature-local rail componentStatic specimen

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.tsx

Transient 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.ts

Rail popover at its production 384px

Notifications
AM
Amara Mensah · Design review

Mentioned you: can you take the seat-minimum numbers before Thursday?

Scribe · Q3 planning

Recap ready for the 34-minute pricing follow-up.

RK
Rina Koda

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

Draft savedRestored the attachment from your last session.
Recap publishedPosted to Q3 planning.
Could not sendThe room rejected the attachment. Try a smaller file.

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.

Feature-local modal systemStatic specimen

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.tsx

Geometry, both breakpoints

Desktop max-width 1000 · height 90vh 280 fixed View title Content module fills the rest 90vh Mobile ≤ 480 ‹ Back · title One view at a time stacked drill-down

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

AppearanceSystem
Compact density
Reduce motion
Vault key
Delete workspace

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.

Shared feature componentsStatic specimen

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.ts

Run anatomy

Step list → named working state → checkpoint or prompt → delivery/done row.

web/src/features/workflows-shared/WorkflowRunPanel.tsx

Step cards

Maps state to restrained semantics; “mutation” is intentionally not treated as success before completion.

web/src/features/workflows-shared/WorkflowStepCards.tsx

Run anatomy

Reschedule design review
Read the invite4 guests, 1 declined0.4s
Check calendarsThursday 10:00 is clear for all four1.2s
Drafting the messageWriting to Design review…now
Move the eventWaiting on approval
Notify the guests
Approval needed

Move Design review to Thursday 10:00 and tell all four guests. This changes a shared calendar.

Moved to Thursday 10:00 4 guests notified · 2.1s

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

Scribe is workingReading Q3 planning · 14 messages0:12
3 of 5 tools

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.