What nessa-ui covers
Give me the tour. What does @nessa-ui/react actually cover, and what am I still expected to write myself?
09:41

Three layers, and only the first two are ours.

LayerShips in the packageYou own
PrimitivesButton, Input, Badge, Cardpalette, radius, density
ConversationMessage, Composer, ConversationRailcopy, model list, policy
LayoutAppShell, SplitView, WindowDeckpersistence

Every surface is a compound component with data-slot attributes, so restyling is a class away and nothing is locked behind a variant prop.

09:42
Show me the smallest chat surface I can ship.
09:44

Five components, no provider, no context:

import { Message, MessageBubble, MessageContent } from "@nessa-ui/react"; export function Transcript({ turns }: { turns: Turn[] }) {  return (    <div role="log" className="flex flex-col gap-3">      {turns.map((turn, i) => (        <Message key={i} from={turn.role}>          <MessageContent>            <MessageBubble variant={turn.role === "user" ? "primary" : "plain"}>              {turn.text}            </MessageBubble>          </MessageContent>        </Message>      ))}    </div>  );}

Alignment, bubble shape, hover actions and the streaming fade come from the slots. Swap variant and it is still your palette.

09:51
How does streaming text land? Does the whole transcript re-render per token?
09:58

No. New text mounts inside per-word spans that fade from transparent; already-painted words keep their DOM nodes, so the work per token is proportional to the tail, not the transcript:

work(t)  =  O ⁣(wnew(t))notO ⁣(∑i=1nwi)\text{work}(t) \;=\; O\!\left(w_{\text{new}}(t)\right) \quad\text{not}\quad O\!\left(\sum_{i=1}^{n} w_i\right)

Code, math and diagram nodes are excluded from the fade wrapper, so a half-parsed fence never animates character by character.

09:41
Draw me the render pipeline for a streamed markdown reply.
09:42

MathBlock holds the last valid render while intermediate TeX is unparseable, which is why formulas grow instead of flashing an error.

09:44
Our retrieval answers cite sources. Can the transcript carry citations and the scoring maths together?
09:47

Ranking is plain cosine similarity over normalised embeddings so a citation is just a hover target inside the sentence it supports.

sim(q,d)=q⋅d∥q∥ ∥d∥,pi=esi/τ∑jesj/τ\text{sim}(q, d) = \frac{q \cdot d}{\lVert q \rVert \, \lVert d \rVert}, \qquad p_i = \frac{e^{s_i / \tau}}{\sum_j e^{s_j / \tau}}
09:51
Show me what landed in the last release.
09:58
Changes
284 additions, 137 deletions
  • packages/react/src/components/conversation-rail.tsx148 additions, 0 deletions
  • packages/react/src/components/workflow-canvas/node.tsx62 additions, 41 deletions
  • packages/react/src/components/event-calendar.tsx34 additions, 58 deletions

ConversationRail is the headline: turn markers beside the transcript that widen toward the pointer and preview on hover. It is in this pane, to the left, once the pane is wide enough for it.

09:42
So what is left for me to build?
09:44

Your product. We hand you interaction and state:

  • keyboard and focus behaviour, including roving focus in lists and canvases
  • drag, drop and resize with commit semantics you can veto
  • streaming, queueing and cancellation in the composer
  • layout persistence for panes, docks and splits

What we deliberately do not hand you is opinion. There is no brand colour, no mandated font, no copy. Tokens sit on --nessa-* variables, and every themed surface in this harness, including the eleven presets in Settings, is a variable swap rather than a fork.

09:47
run-4192.json