The vocabulary

Everything else assumes these words. They are worth five minutes.

Node. A plain object with a component name and props: { component: 'Row', gap: 1 }. JSX produces exactly this, so <Row gap={1}/> and the object are the same value.

Graph. A screen is its root node. Children nest inside it. Nothing in a graph is a module reference, which is why it can be persisted, sent, generated or edited.

Registry. A name to a thing, resolved at mount time. Components, commands, keybindings, themes, layouts, shells, resource kinds, viewers, editors and actions each have their own typed registry - not one plugin bag.

Store. One reactive tree addressed by JSON-Pointer-shaped paths. $/scope/a/b is absolute; /a/b is relative to the surrounding data context. The first segment is a scope, and scopes are lifetimes: local dies with the mount, screen with the screen, app outlives both, modus holds the environment.

Event path. @/dialog/confirm. The same shape as a store path, a different lifetime: delivered and forgotten, with no value to read back.

Binding. { path: '$/x' } as a prop value. The runtime resolves it and subscribes to exactly that path, so nothing else re-renders the node.

Command. A registered action with an id, a title and a when clause. Buttons, keybindings, menus and the palette all run commands - which is why they cannot drift from each other.

Surface. A named region: header, rail, sidebar, aside, main, panel, status, overlay, notify. Nine names, fixed, because they are the vocabulary a layout, a keybinding scope and a shell share.

Mount. One component in one surface, under a key, with display metadata and a policy.

Layout. How a surface arranges the several mounts it holds: tabs, stack, split, bar, rail, single, inline, floating, toast. Which one a surface uses is store state, so it is switchable at runtime.

Shell. The frame around the surfaces. Where they go is the whole of what a shell decides.

Layer. A plane: base, floating, modal, notification, debug. Dialogs, menus, tooltips, palettes and toasts are entries on one, so focus trapping and dismissal are decided once.

Capability. Something the terminal can do: colour depth, Unicode level, mouse, paste, hyperlinks, alternate screen, synchronised output. Components degrade against these; they never feature-detect on their own.

Resource. Anything addressable that a viewer, editor or action can be registered for. Kinds form a hierarchy by dotted name, so file.markdown specialises file.text.

Adapter. Everything one resource type needs, as one value: kinds, a provider, viewers, a highlighter, actions, commands. Registering returns a disposable that removes exactly what it added. (The other kind of adapter is a terminal adapter, in Terminal; the two never meet.)

Document. An open buffer for a resource, at $/session/documents/<uri>. What a viewer shows and what an action transforms - so formatting a file from a read-only provider does something visible without writing anything.

Scope (syntax). What a highlighter names instead of a colour: key, string, number, comment, invalid. The theme resolves it, so the same highlighter is right on every theme and disappears on a colourless terminal.

Measurement. The rect a component was laid out into, via useMeasure. A component with flex or a height renders what fits and scrolls; one without renders its content and sizes its box. This is what keeps a long document from resizing the panes around it.


Back to top

MIT licensed. Pre-1.0 - the surface is still moving.