Docs / Developer / UI component catalog

UI component catalog

Auto-generated by scripts/hooks/component-catalog.ts from exported UI entries under
src/ui (.tsx React components, ADR-008) and exported create/build/swatch/inject helpers in
src/ui/_shared (.ts). Do not hand-edit: regenerate with
bun run scripts/hooks/component-catalog.ts. A
pre-commit gate (--check) fails the commit when this file drifts from the real exports.

Use this for

The answer for the common needs, before searching the table below. For buttons, color pickers and fonts, lint and the style guard block the alternatives.

Need Use
Any action with text Button (src/ui/components/button): primary once per view, danger for destructive, quiet for low emphasis
An icon-only action IconButton with a label
One (or several) of a few options Segmented
Sections of a room or editor Tabs
A small on/off filter or tag Chip
A row in a list, rail or picker ListRow
A row in a popup menu MenuItem
A header that opens and closes a section Disclosure
A small square (rail icon, swatch, thumb, app, add) Tile
A larger clickable surface (choice, art, entry, file drop) Card
A pager dot, canvas port or handle Dot
A value inside text that edits on click InlineValue
The click-away layer behind a wing or menu Scrim
A document tab DocTab
An icon Ic (src/ui/_shared/ic.tsx)
A color SwatchRow; solid or gradient fill: PaintPicker
An on/off switch Toggle (card for a whole-row setting card)
A dialog InkDialog or DialogCore
Fonts var(--font-fancy) titles, var(--font-body) text, var(--font-mono) code; never a font name

Components (React, .tsx)

Name File Signature Doc Styles
AccentRow src/ui/apps/scenes/scene-accent-row.tsx ({ prefs, colors, onSet }: { prefs: { get(key: string): unknown }; colors: PieceColors; onSet(key: string, value: unk...
AccessChip src/ui/apps/scenes/compendium/tabs/settings/access-chip.tsx ({ ctx, chat, bookId, bookName, onChat }: { ctx: AppContext; chat: Chat; bookId: string; bookName: string; onChat(cha...
AccessibilityRows src/ui/apps/settings/sections/accessibility-rows.tsx ({ prefs }: { prefs: Prefs })
Act src/ui/apps/scenes/stage-act.tsx ({ id, title, status, open, onToggle, children }: { id: string; title: string; status: string; open: boolean; onToggl...
ActionRow src/ui/apps/scenes/messenger/frames/settings-rows.tsx ({ label, description, value, action, onAction, variant = "secondary" }: RowCopy & { value?: string; action: string; ... A value and a button ("Name shown to the model, Mina, Edit"), or just a button when there is no value.
ActivityCard src/ui/apps/scenes/compendium/activity-card.tsx ({ row, now, actions }: { row: ActivityRow; now: number; actions: CardActions })
ActivityLine src/ui/apps/scenes/props/story-director/director-parts.tsx ({ entry, now, open, onToggle, clamp }: { entry: DirectorActivity; now: number; open?: boolean; onToggle?: () => void... One line of the feed: the result dot, the type in its color, the turn, the time and the description (RoleCall's ActivityEntryCard and the floating popover's row).
ActivityTab src/ui/apps/scenes/compendium/tabs/activity.tsx ({ ctx, chatId, feed, extra = [], extraWhy, pop }: { ctx: AppContext; chatId: string; feed: Receipts; extra?: readonl...
ActivityTab src/ui/apps/scenes/props/story-director/tab-activity.tsx ({ entries, now, onClear, locked }: { entries: readonly DirectorActivity[]; now: number; onClear(): void; locked: boo...
AddByModel src/ui/apps/scenes/props/trackers/items/generate-kit.tsx ({ ctx, chatId, ask, label, noun, namePlaceholder, guidePlaceholder, labels, preview, accept }: AddProps) RoleCall's "Add ..." form: a dashed button that opens a name and a guide, then Generate.
AddEnemy src/ui/apps/scenes/props/trackers/battle/battle-parts.tsx ({ onAdd, onCancel }: { onAdd(e: Omit<Enemy, "id">): void; onCancel(): void })
AdditionalLayout src/ui/apps/scenes/layouts/additional-layout.tsx (p: LayoutProps)
AddMenu src/ui/apps/workbench/nodes/Board.tsx ({ disabled, onAdd }: { disabled: boolean; onAdd(type: "note" | "frame"): void }) .view .head .grow .addWrap .addMenu .area .canvas .world ...
AddParticipant src/ui/apps/scenes/cast/add-participant.tsx ({ rows, onChange, messenger }: { rows: readonly Pick<RosterRow, "name">[]; onChange(c: ParticipantChange): void; mes...
AddPopover src/ui/apps/scenes/scene-lore-books.tsx ({ library, inScene, onPick, onCreate, onClose }: { library: StudioEntitySummary[] | null; inScene: ReadonlySet<strin... The dashed button's popover: "+ New Lorebook" (name it first, then Create) over the library list.
AdvancedBody src/ui/apps/scenes/messenger/settings/scene/memory-rows.tsx ({ env }: { env: SceneEnv }) The summary model's own settings: method, reasoning, limits and the prompt template.
AgentControls src/ui/apps/scenes/final-cut/fc-agent.tsx ({ ctx, pass, lib, onChange }: { ctx: AppContext; pass: FinalCutPass; lib: FinalCutLibrary; onChange: Change })
AgentEditor src/ui/apps/workbench/promptbook/agent-editor.tsx ({ entity, revision, ctx, piece, topRight }: KindEditorProps) .root .toolbar .layout .main .phaseList .phase .rehearsal .recipes ...
AgentPage src/ui/apps/scenes/messenger/settings/scene/finalcut-agent.tsx ({ env }: { env: SceneEnv })
AgentRoom src/ui/apps/agent/room.tsx ({ ctx, onClose }: { ctx: AppContext; onClose?: () => void }) Shows the screen the agent can see, and talks to whichever model the vault has.
AiPanel src/ui/apps/scenes/compendium/storyboards/dossier-parts.tsx ({ ai, included, onOff, onMode, onRadius }: { ai: DossierAiContext; included: boolean; onOff(): void; onMode(mode: Co...
AiTabs src/ui/apps/scenes/scene-ai-tabs.tsx ({ model, generation, initialTab, single }: { model: JSX.Element; generation?: JSX.Element; initialTab?: string; sing...
AiWing src/ui/apps/scenes/scene-ai-wing.tsx ({ ctx, chat, onPicked, onClose }: { ctx: AppContext; chat: Chat; onPicked(chat: Chat): void; onClose?(): void })
AllowRows src/ui/apps/scenes/messenger/settings/scene/compendium-passes.tsx ({ a }: { a: WingArgs }) What Compendium may file: one switch per entry type.
AllowSection src/ui/apps/scenes/compendium/tabs/settings/filing.tsx ({ compendium, set }: SectionProps)
AltFields src/ui/components/alt-fields/index.tsx ({ value, onChange }: AltFieldsProps) .wrap .section .gtitle
AnalysisTab src/ui/apps/scenes/props/story-director/tab-analysis.tsx ({ state }: { state: DirectorState })
AnimatedThemeToggler src/ui/components/animated-theme-toggler/index.tsx ({ theme, onToggle, duration = 400, fromCenter = false, id, }: AnimatedThemeTogglerProps) Switch between paper and stage with a reveal that grows from the control. .iconStack .hidden .shown
AntiSlopCard src/ui/apps/scenes/final-cut/fc-anti-slop.tsx ({ pass, models, onToggle, onChange }: { pass: FinalCutPass | undefined; models: SceneModels; onToggle(): void; onCha...
AntiSlopPage src/ui/apps/scenes/messenger/settings/scene/finalcut-antislop.tsx ({ env }: { env: SceneEnv })
AntiSlopSetPage src/ui/apps/scenes/messenger/settings/scene/finalcut-antislop.tsx ({ env, raw }: { env: SceneEnv; raw: string })
App src/ui/shell/App.tsx ({ forceSkipTitle = false, testListRetryDelaysMs, pieces: injectedPieces }: AppProps = {}) .shellContainer .shell .appContents .studio-app-surface .studio-app-room .tourHelp .dirty
AppCatalog src/ui/apps/app-catalog/index.tsx ({ ctx }: { ctx: AppContext }) Browse and open every official app packaged in this build. .room .grid .card .cardHead .mark .name .description .cardFoot ...
AppMark src/ui/components/app-mark/index.tsx ({ markSvg, className }: AppMarkProps) Render one sanitized application mark.
AppRooms src/ui/shell/AppRooms.tsx ({ app, activeAppId, workspaceAppId, overlayAppId, workspace, overlay, overlayOpen, ctx }: { app: BunzaiApp | null; a...
ArcsTab src/ui/apps/scenes/props/story-director/tab-arcs.tsx ({ state, onResolve, locked }: { state: DirectorState; onResolve(id: string): void; locked: boolean })
Area src/ui/apps/scenes/final-cut/fc-controls.tsx ({ label, value, placeholder, onChange }: { label: string; value: string; placeholder?: string; onChange(next: string...
AssetCard src/ui/apps/library/rc-cards.tsx (props: CardProps) AssetCard (RC's library AssetCard, vertical, a fixed 520px): lorebooks get the square book cover
AssetManager src/ui/components/asset-manager/index.tsx ({ assets, onChange, onOpenSprites, uploadAsset }: AssetManagerProps) .wrap .group .ghead .handoff .tiles .tile .preview .img ...
AttachLoreDialog src/ui/components/attach-lore-dialog/index.tsx ({ books, alreadyLinked, onConfirm, onDismiss, }: AttachLoreDialogProps) .sheet .body .kick .h .p .empty .list .row ...
AttachPanel src/ui/components/sprite-pack/dialog-panels.tsx ({ packCatalog, attachId, attachBusy, onAttachId, onAttach, }: { packCatalog: readonly PackCatalogEntry[]; attachId: ... .sheet .bar .lbl .sel .meta .grid .gridViewport .gridSpace ...
AutoRetryRow src/ui/apps/scenes/props/story-director/director-runtime.tsx ({ panel, save }: { panel: DirectorPanel; save: Save })
AutoUpdate src/ui/apps/scenes/props/story-director/auto-update.tsx ({ ctx, chat, panel, save, onChat }: { ctx: AppContext; chat: Chat; panel: DirectorPanel; save: Save; onChat?: (chat:...
AutoUpdateBooth src/ui/apps/scenes/props/story-director/auto-update.tsx ({ panel, save }: { panel: DirectorPanel; save: Save }) The Booth's part: the switch, and one quiet line with the way to the settings. No trackers and no call budget here.
AutoUpdateLine src/ui/apps/scenes/props/story-director/tracker-update-ui.tsx ({ view, dm }: { view: Pick<TrackerView, "module" | "stored">; dm: TrackerUpdateLine }) What the tracker's menu says about automatic updates: read only.
Avatar src/ui/apps/scenes/messenger/messenger-parts.tsx ({ name, art }: { name: string; art?: ReactNode })
AvatarCrop src/ui/components/avatar-crop/index.tsx ({ value, onChange, imageSrc }: AvatarCropProps) .wrap .help .meta .actions .row .canvas .img .sel ...
BackdropLayer src/ui/apps/scenes/scene-backdrop-layer.tsx ({ ctx, backdrop, character }: { ctx: AppContext; backdrop: ChatBackdrop | undefined; character?: CharacterBackdrop |... backdrop is the scene's pick; character is the card's pinned background, shown only while the scene has no pick of its own (RoleCall useCharacterLoad.ts:556-577).
BackdropPicker src/ui/apps/scenes/scene-backdrop-picker.tsx ({ ctx, backdrop, onPick, onClose }: { ctx: AppContext; backdrop: ChatBackdrop | undefined; onPick(backdrop: ChatBack...
BackdropRow src/ui/apps/scenes/scene-backdrop-wing.tsx ({ ctx, chat, cardPinned, onChat }: { ctx: AppContext; chat: Chat; cardPinned?: boolean; onChat(chat: Chat): void })
BackdropThumb src/ui/apps/scenes/scene-backdrop-layer.tsx ({ refValue, mime, className }: { refValue: string; mime?: string; className?: string }) A small picture of a pack item, for the picker's tiles and the Stage wing's row. It asks for a thumbnail and falls back to the full picture when the server cannot make one; a video shows its first frame.
BackdropVideo src/ui/apps/scenes/scene-backdrop-layer.tsx ({ sha, rate, className, style }: { sha: string; rate: number; className?: string; style?: CSSProperties }) A looping muted video from the asset route; it holds still while the tab is hidden, so it costs nothing unseen.
Badge src/ui/apps/scenes/props/story-director/director-parts.tsx ({ tone = "mute", children, title }: { tone?: "ok" | "info" | "warn" | "mute" | "danger" | "select"; children: ReactN...
BankPicker src/ui/apps/scenes/final-cut/fc-bank-picker.tsx ({ pass, onChange }: { pass: FinalCutPass; onChange: Change })
BenchImport src/ui/apps/workbench/regex/bench-import.tsx ({ ctx, sample, existingRules, onImportPicked, }: BenchImportProps) .wrap .hiddenInput .drop .dropOver .summary .impRow .impEffect .impCell ...
BenchPane src/ui/apps/workbench/regex/bench-pane.tsx ({ ctx, rules, initialTab = "try", onClose, onImportPicked, }: BenchPaneProps) .pane .phead .pheadB .pbody .sampleCard .schead .scheadB .scheadI ...
BentoCard src/ui/components/bento-card/index.tsx ({ title, icon, aff, filled, off, offMode = "dim", missing, onMove, children }: BentoCardProps) One card of the editor bento. Folds from its chevron; lens states per vs-editor-2. .card .off .head .mark .title .aff .dot .full ...
BentoView src/ui/apps/workbench/presenters/bento-view.tsx ({ bcard, leftCard, sealedCard, macroCard, columns, spanRow, styles }: BentoViewProps)
BiblePane src/ui/apps/macro-lab/bible-pane.tsx ({ lens, onInsert, }: { lens: MacroDialect; onInsert: (token: string) => void; }) .room .lenses .inst .boxes .stack .box .boxHead .boxTitle ...
BinderSide src/ui/apps/workbench/lore/binder-side.tsx ({ sidePane, setSidePane, body, baseline, entry, notes, styles, setSession, extraFindings, }: BinderSideProps)
Block src/ui/apps/scenes/props/trackers/items/item-parts.tsx ({ title, children }: { title: string; children: ReactNode }) A labelled block of a card's body: a small heading over its content.
BlockContent src/ui/apps/workbench/preset/block-content.tsx ({ block, onPatch }: BlockContentProps) .root .workspace .listCol .list .listInner .listRow .autosaveStalled .empty ...
BlockList src/ui/apps/workbench/preset/block-list.tsx ({ blocks, groups = [], collapsedGroups, onToggleGroup, totalBlocks, tab, query, onClearQuery, onShowAll, selectedId,... .root .workspace .listCol .list .listInner .listRow .autosaveStalled .empty ...
BlockRow src/ui/apps/workbench/preset/block-row.tsx ({ block, focusKey, index, depth, posinset, setsize, active, selected, expanded, onSelectRow, onToggleCheck, onToggle... Memoized: editing one block must re-render only that block's row, not .rowWrapOpen .prow .rowIndent .prowActive .prowSel .prowOff .check .checkOn ...
BoardLayer src/ui/apps/workbench/nodes/Board.tsx (p: BoardLayerProps) .view .head .grow .addWrap .addMenu .area .canvas .world ...
BondsPanel src/ui/apps/scenes/props/trackers/bonds/bonds-panel.tsx ({ ctx, chat, onChat, popOut }: PopoutContext)
BookAccessRows src/ui/apps/scenes/messenger/settings/scene/compendium-books.tsx ({ a }: { a: WingArgs }) One access choice per book, as in the Compendium's access chip.
BookBar src/ui/apps/scenes/compendium/compendium-shell.tsx ({ books, bookId, onBook, access, chip }: { books: readonly SceneLoreBook[]; bookId: string; onBook(id: string): void...
BookBoard src/ui/apps/workbench/promptbook/book-board.tsx ({ phases, selected, onSelect, onChange, ctx, bookId }: { phases: readonly BookPhase[]; selected: string; onSelect(id... .root .toolbar .layout .main .phaseList .phase .rehearsal .recipes ...
BookCards src/ui/apps/workbench/promptbook/book-cards.tsx ({ phase, ctx, onChange, expanded }: { phase: BookPhase; ctx: AppContext; onChange(p: BookPhase): void; expanded: boo... .root .toolbar .layout .main .phaseList .phase .rehearsal .recipes ...
BookCover src/ui/apps/library/book-cover.tsx ({ title, choice }: { title: string; choice: BookCoverChoice }) .cover .dialog .editor .fields
BookCoverDialog src/ui/apps/library/book-cover.tsx ({ title, initial, onSave, onDismiss }: { title: string; initial: BookCoverChoice | null; onSave(choice: BookCoverCho... .cover .dialog .editor .fields
BookList src/ui/apps/scenes/scene-lore-books.tsx ({ books, characterName, selectedId, onSelect, onToggle, onRemove, onAdd, lastTurn }: { books: readonly SceneLoreBook...
BooksSection src/ui/apps/scenes/compendium/tabs/settings/books.tsx ({ ctx, chat, compendium, lore, set }: SectionProps)
BootErrorScreen src/ui/shell/BootErrorScreen.tsx ({ problem }: { problem: BootProblem | null })
BoothFallbackRow src/ui/apps/scenes/booth-fallback-row.tsx ({ ctx, models }: { ctx: AppContext; models: SceneModels })
BoothGeneration src/ui/apps/scenes/booth-preset-row.tsx ({ chat, preset, own, windowTokens }: { chat: Chat; preset: BoothPreset; own: ScenePresetOwn; windowTokens: number | ...
BoothLoreRow src/ui/apps/scenes/booth-lore-row.tsx ({ ctx, chatId }: { ctx: AppContext; chatId: string })
BoothModelPicker src/ui/apps/scenes/booth-model-picker.tsx ({ current, models, onPick }: { current: ChatConnection | undefined; models: SceneModels; onPick(c: ChatConnection): ...
BoothModelRow src/ui/apps/scenes/booth-model-row.tsx ({ ctx, chat, models }: { ctx: AppContext; chat: Chat; models: SceneModels })
BoothNavigator src/ui/apps/scenes/booth-navigator.tsx ({ ctx, scene, art }: { ctx: AppContext; scene: OpenScene; art: JSX.Element })
BoothPresetCard src/ui/apps/scenes/booth-preset-row.tsx ({ chat, preset, own, onOpen }: { chat: Chat; preset: BoothPreset; own: ScenePresetOwn; onOpen(): void })
BoothReadout src/ui/apps/scenes/booth-readout.tsx ({ ctx, scene }: { ctx: AppContext; scene: OpenScene })
BoothSummaryRow src/ui/apps/scenes/booth-summary-row.tsx ({ ctx, chat, onOpen }: { ctx: AppContext; chat: Chat; onOpen(): void })
BoothWing src/ui/apps/scenes/scene-booth-wing.tsx ({ ctx, scene, busy, art, onChat, onSettings, onOpen }: { ctx: AppContext; scene: OpenScene; busy: boolean; art: JSX....
BottomSheet src/ui/components/bottom-sheet/index.tsx ({ title, ariaLabel, onDismiss, titleAction, footerAction, children }: BottomSheetProps) A scrim + grab-handle sheet docked to the pane's bottom; clicking the scrim dismisses. .overlay .sheet .grab .titleRow .title .body .footer
BranchTree src/ui/apps/scenes/scene-tree.tsx ({ ctx, chatId, onBack, onOpen }: { ctx: AppContext; chatId: string; onBack(): void; onOpen(): void })
Browse src/ui/apps/scenes/compendium/tabs/browse.tsx ({ model, bookName, state, onState, tree }: { model: BookModel; bookName: string; state: BrowseState; onState(next: P...
Bubble src/ui/apps/scenes/scene-bubble.tsx (p: BubbleProps)
BudgetRows src/ui/apps/scenes/messenger/settings/user/budget-rows.tsx ({ ctx }: { ctx: AppContext })
BulkBar src/ui/apps/workbench/preset/bulk-bar.tsx ({ count, onClear, onEnable, onDisable, onDuplicate, onDelete }: BulkBarProps) .toolbar .topRow .searchWrap .searchIcon .search .stats .statNum .actions ...
Button src/ui/components/button/index.tsx ({ children, variant = "secondary", size = "md", icon, block, menu, tone, vars, "data-part": part, type = "button", .... .btn .seg .tab .chip .primary .danger .quiet .sm ...
CallDetail src/ui/apps/scenes/context/this-turn-call.tsx ({ row, trace }: { row: CallRow; trace: SceneTrace })
Card src/ui/components/button/surfaces.tsx ({ kind, heading, subtitle, art, kicker, children, selected, mark = "Picked", accent, primary, onFiles, vars, "data-p... .tile .card .dot .icon .swatch .thumb .mark .app ...
CardNotice src/ui/apps/scenes/scene-card.tsx ({ card, onRevert }: { card: CardState; onRevert(): void })
CardRow src/ui/apps/library/card-row.tsx ({ pieces, layout, vctx, peeks, meta, now, newTile }: { pieces: readonly StudioEntitySummary[]; layout: ShelfLayout; ...
CardsView src/ui/apps/workbench/lore/cards-view.tsx ({ entries, writeFor, onSelect, onPatch, onAdd, }: CardsViewProps) .grid .gridSpace .gridRow .ecard .ecardOff .echead .etitle .esnip ...
CastBody src/ui/apps/scenes/compendium/storyboards/dossier-views.tsx ({ d, open, ai }: { d: CastDossier; open: Open; ai: JSX.Element })
CastConfirm src/ui/apps/scenes/cast/cast-dialogs.tsx ({ from, to, onCancel, onConfirm }: { from: string | null; to: string | null; onCancel(): void; onConfirm(): void }) The confirm before the scene plays someone else: what changes and what does not.
CastFooter src/ui/apps/scenes/cast/cast-parts.tsx ({ dirty, saving, busy, note, what, saveLabel, onSave, children }: { dirty: boolean; saving: boolean; busy: boolean; ... The pinned footer: the note about the last save, the tab's own buttons, then Save (Saved when clean).
CastHero src/ui/apps/scenes/cast/cast-parts.tsx ({ icon, eyebrow, title, emphasis, sub }: { icon: IconName; eyebrow: string; title: string; emphasis: string; sub?: s... The wing's hero card: icon, eyebrow, a title with its accent word, and a subtitle.
CastInspector src/ui/apps/scenes/messenger/panels/cast/cast-inspector.tsx ({ program, onOpenProgram, children }: { program: EditorId; onOpenProgram(id: string): void; children: ReactNode })
CastPortrait src/ui/apps/scenes/cast/cast-parts.tsx ({ art, standIn, chip, name, lines, topLeft, upload, onPick, children }: { art: JSX.Element | null; standIn: ReactNod... The tall portrait column: art or a stand-in, a change-image button, the now chip, and the caller's captions.
CastWing src/ui/apps/scenes/scene-cast-wing.tsx ({ ctx, scene, busy, card, onScene, onUpdate, onRevert, initialTab, single }: { ctx: AppContext; single?: boolean; in... The Cast wing's three tabs (Character, Persona, Participants) and everything that changes who is in the scene.
Catalogue src/ui/apps/scenes/compendium/browse/catalogue.tsx ({ model, sub, onSub, query, onQuery, selectedId, onOpen, tree }: { model: BookModel; sub: SubTab; onSub(s: SubTab): ...
CatchThinking src/ui/apps/scenes/generation/catch-thinking.tsx ({ value, prefill, onChange }: { value: ReasoningCapture | undefined; prefill: string | undefined; onChange(next: Rea...
Cell src/ui/apps/scenes/compendium/cells/cell.tsx ({ title, dot, wide, children }: { title?: string; dot?: string; wide?: boolean; children: ReactNode })
ChainsSheet src/ui/apps/scenes/props/trackhare/chains-sheet.tsx ({ sheetRef, lore, replyNumber, onClose }: { sheetRef: RefObject<HTMLElement | null>; lore: SceneTrace["lore"]; reply...
ChangeBlock src/ui/apps/scenes/messenger/transcript/reply-changes.tsx ({ trackers, onOpen, onMarker }: { trackers: readonly TrackerChanged[]; onOpen(trackerId: string): void; onMarker(): ... The trackers one reply changed, each in its own style. Nothing at all when none of them draws anything.
ChangesPane src/ui/apps/workbench/lore/changes-pane.tsx ({ baseline, body, onRevertField, onRestoreEntry, onUndoSwap, onJumpEntry, onClose, }: ChangesPaneProps) .pane .head .clean .block .field .fieldK .diffCols .dFrom ...
ChangesRow src/ui/apps/scenes/messenger/settings/scene/changes-row.tsx ({ a }: { a: WingArgs })
CharacterCard src/ui/apps/library/rc-cards.tsx (props: CardProps) ContentCharacterCard (RC's DiscoveryCharacterCardV3 in library mode), for characters and
CharacterDefaultRows src/ui/apps/scenes/messenger/settings/character-defaults.tsx ({ a }: { a: WingArgs })
CharacterEditor src/ui/apps/workbench/Editor.tsx ({ entity, revision, ctx, piece, topRight }: CharacterEditorProps) .room .stage .soon .ghostRoom .ghostErr .skel .ghostActions .recents ...
CharacterEditorView src/ui/apps/workbench/presenters/character-editor-view.tsx ({ ctx, piece, topRight, prefs, bodyViews, coverage, platformLabel, chips, nativeStub, setNativeStub, workshop, setWo...
CharacterFilter src/ui/apps/scenes/scene-lore-advanced.tsx ({ entry, onPatch }: { entry: LorebookEntry; onPatch: Patch })
CharacterFilterBlock src/ui/apps/workbench/lore/platforms/filter-block.tsx ({ entry, styles, onPatch, }: { entry: LorebookEntry; styles: Readonly<Record<string, string>>; onPatch: (patch: Part...
CharacterForm src/ui/apps/scenes/cast/cast-character-tab.tsx ({ ctx, id, chatId, chat, editor, summary, art, version, variants, variantId, busy, onVariant }: { ctx: AppContext; i... The Character tab: the card's fields in RoleCall's order, the look strip, and the pinned Save.
CharacterHero src/ui/apps/scenes/messenger/settings/character-stats.tsx ({ a }: { a: WingArgs })
CharacterLibrary src/ui/apps/scenes/booth-navigator.tsx ({ ctx, currentId, onClose, onStarted }: { ctx: AppContext; currentId: string; onClose(): void; onStarted?(): void }) onStarted runs once the new scene exists, just before the page moves to it (the Messenger drops its cached scene list there).
CharacterTextControl src/ui/apps/workbench/controls/character-text-control.tsx ({ field, value, onChange, styles, id, disabled, readOnly, maxLength, onFocus, defaultRendered }: { field: Pick<Field...
ChatLayoutRow src/ui/apps/settings/sections/chat-layout-row.tsx ({ prefs }: { prefs: { get(key: string): unknown; set(key: string, value: unknown): void } }) .grid
Check src/ui/apps/scenes/final-cut/fc-controls.tsx ({ label, checked, onChange }: { label: string; checked: boolean; onChange(next: boolean): void })
Checkbox src/ui/components/rc-controls/index.tsx ({ className, ...rest }: Omit<InputHTMLAttributes, "type">) .sr-only .field .area .chip .check .tipWrap .tip
CheckedText src/ui/apps/scenes/messenger/settings/scene/drafts.tsx ({ saved, write, check, rows, delay = SAVE_MS, ...copy }: RowCopy & { saved: string; rows?: number; delay?: number; c... A text area that saves what was typed once it rests, unless check names what is wrong with it.
Chevron src/ui/apps/scenes/props/story-director/director-parts.tsx ({ open }: { open: boolean })
Chip src/ui/components/button/index.tsx ({ children, pressed, color, count, muted, tone, vars, "data-part": part, type = "button", ...rest }: ChipProps) .btn .seg .tab .chip .primary .danger .quiet .sm ...
Chip src/ui/components/rc-controls/index.tsx ({ className, ...rest }: HTMLAttributes) .sr-only .field .area .chip .check .tipWrap .tip
Chips src/ui/apps/scenes/props/trackers/items/item-parts.tsx ({ items, bad }: { items: readonly string[]; bad?: boolean })
ChoiceBody src/ui/_shared/field-bodies.tsx ({ field, update, startsAt }: { field: BodyField; update: Update; startsAt: boolean }) .toc .module .css .title .rows .add .page .pager ...
ChoiceList src/ui/agent/kit-choice.tsx ({ choices, answered, busy, onSend, }: { choices: AskChoices; answered?: string | undefined; busy?: boolean; onSend: ...
ChoicesRow src/ui/apps/scenes/scene-choices.tsx ({ ctx, chat, body, choices }: { ctx: AppContext; chat: Chat; body: PresetBody; choices: SceneChoices })
ChoiceWalkthrough src/ui/apps/scenes/scene-choice-walkthrough.tsx ({ groups, selections, onSelect, onSave, onClose, readme, presetName, peeks, startAt = 0, onStep }: { groups: ChoiceG...
ChromeAct src/ui/apps/scenes/stage-chrome-act.tsx ({ look, set }: StageActProps)
ClosePieceDialog src/ui/shell/ClosePieceDialog.tsx ()
ClosePiecePrompt src/ui/shell/ClosePieceDialog.tsx ({ name, onDiscard, onKeep, }: ClosePiecePromptProps)
CodeEditor src/ui/components/code-editor/index.tsx (props: CodeEditorProps) .wrap .gutter .stack .pre .ta .macro .string .comment ...
CodexPanel src/ui/apps/scenes/props/trackers/codex/codex-panel.tsx ({ ctx, chat, onChat, popOut }: PopoutContext)
CodexSections src/ui/apps/scenes/props/trackers/codex/codex-parts.tsx ({ e, stats }: { e: Shared; stats?: { label: string; s: Partial<Record<"hp" | "maxHp" | "mp" | "maxMp" | "attack" | "...
CollectionsBar src/ui/apps/library/collections-bar.tsx (input: CollectionsBarInput)
ColorEditor src/ui/apps/scenes/cast/participant-colors.tsx ({ row, enabled, onColors, palette = [] }: { row: RosterRow; enabled: boolean; onColors(colors: string[] | null): voi...
ColorPicker src/ui/components/color-picker/index.tsx ({ value, onChange }: ColorPickerProps) .cp .sv .hue .thumb .foot .chip .hex
ColourRows src/ui/apps/scenes/messenger/settings/user/appearance.tsx ({ a, env, part }: { a: WingArgs; env: RowEnv; part: "text" | "accent" }) Message colours, scene accent, studio colour. Preferences are not reactive, so a write counts a repaint of this list and the page.
CombatLog src/ui/apps/scenes/props/trackers/battle/battle-parts.tsx ({ log, onClear }: { log: readonly string[]; onClear(): void })
CombatPanel src/ui/apps/scenes/props/trackers/battle/battle-panel.tsx ({ ctx, chat, onChat, popOut }: PopoutContext)
CompareDialog src/ui/apps/scenes/scene-compare.tsx ({ api, target, onClose, onStale, setStatus }: { api: AppContext["api"]; target: CompareTarget; onClose(): void; onSt...
CompendiumRows src/ui/apps/scenes/messenger/settings/scene/world.tsx ({ a, open }: { a: WingArgs; open: OpenProgram }) One access choice per book, as in the Compendium's access chip, and the way to the Compendium.
CompendiumSettingsTab src/ui/apps/scenes/compendium/tabs/settings/index.tsx ({ ctx, chat, onChat, bookId }: { ctx: AppContext; chat: Chat; onChat(chat: Chat): void; bookId?: string })
CompendiumWing src/ui/apps/scenes/compendium/compendium-wing.tsx ({ ctx, chat, books, activity, settings, headerActions, chip, recentWrites, notice, banner, onChat }: CompendiumWingP...
CompendiumWithFiling src/ui/apps/scenes/compendium/compendium-mounts.tsx ({ ctx, chat, books, settings, chip, onChat = () => undefined }: { ctx: AppContext; chat: Chat; books: readonly Scene...
Compose src/ui/apps/scenes/context/tabs-request.tsx ({ trace, highlight, onClear }: { trace: SceneTrace; highlight: Highlight; onClear(): void })
ComposerTools src/ui/apps/scenes/scene-composer-tools.tsx ({ open, rows, onToggle, onPick, onExpand }: ComposerToolsProps)
ConfirmSwitch src/ui/apps/settings/sections/updates-dialogs.tsx ({ installed, target, kind, onConfirm, onCancel, }: { installed: string; target: string; kind: "update" | "rollback";... Confirm a switch. Rollbacks read as danger; a rollback to a pre-feature version says so plainly. .wrap .module .css .blurb .card .hero .cardTitle .cardBody ...
ConnectionRows src/ui/apps/scenes/messenger/settings/user/connection.tsx ({ open }: { open: OpenProgram })
ConstraintsSection src/ui/apps/scenes/compendium/tabs/settings/tree.tsx ({ ctx, chat, bookId, set }: SectionProps)
ContentCard src/ui/apps/workbench/persona/persona-cards.tsx ({ body, onBody, writeFor, }: { body: PersonaBody; onBody: OnBody; writeFor: PersonaWriteForProfile; }) The flat identity text (the whole persona on section-less platforms). .root .body .idRow .honest .traits .traitsHead .traitAdd .stops ...
ContextMenu src/ui/apps/scenes/messenger/frames/context-menu.tsx ({ items, at, label = "Context menu", onClose, bounds = viewportNow }: ContextMenuProps)
ContextMenuButton src/ui/_shared/context-menu-button.tsx ({ name, className }: { name: string; className: string })
ContextSection src/ui/apps/scenes/context/context-wing.tsx ({ wing, resize, ...props }: ContextProps & { wing: Wing; resize?: WingResize; initialTab?: string; single?: boolean }) The wing's panel: the section RoleCall draws, in the frame every wing shares (its width and drag edge are the page's: use-wing-widths.ts).
ContextWing src/ui/apps/scenes/context/context-wing.tsx ({ initialTab, single, ...props }: ContextProps & { initialTab?: string; single?: boolean })
Contract src/ui/apps/scenes/final-cut/fc-contract.tsx ({ passes, rulebook }: { passes: readonly FinalCutPass[]; rulebook: readonly RulebookEntry[] })
ControlsBody src/ui/apps/scenes/messenger/settings/scene/memory-rows.tsx ({ env }: { env: SceneEnv }) How summaries run: automatic or manual, how often, with which model and window, and the manual run.
Conversation src/ui/apps/table-read/conversation.tsx ({ session, drafts, busy, running, now, change, reader }: { session: TableReadSession; drafts: TableReadDraftStore; b... .room .setup .readerGrid .readerPortrait .readerSelect .tempos .setupBody .setupAside ...
CopyableBand src/ui/agent/kit-bands.tsx ({ className, text, onNotice, onClick, children, }: { className: string; text?: string; onNotice?: (message: string) ... A band with a copy corner.
CoreGroup src/ui/apps/scenes/generation/core-group.tsx ({ env, params, searching }: { env: GenerationEnv; params: readonly ParamDef[]; searching: boolean }) The Core cards that match the search (all of them when it is blank).
CoreWing src/ui/apps/scenes/scene-core-wing.tsx ({ ctx, scene }: { ctx: AppContext; scene: OpenScene })
CorrectionTools src/ui/apps/scenes/scene-correct.tsx ({ api, chatId, message, selection, onApply, onClose }: { api: Pick<ScenesApi, "runSceneDraft" | "listGuides">; chatI...
CorruptionPanel src/ui/apps/scenes/props/trackers/corruption/corruption-panel.tsx ({ ctx, chat, onChat, popOut }: PopoutContext)
Creature src/ui/apps/scenes/compendium/cells/cells-featured.tsx ({ m, onOpen }: { m: BookModel } & Open)
CrossEntryBoost src/ui/apps/scenes/scene-lore-advanced.tsx ({ entry, candidates, onPatch }: { entry: LorebookEntry; candidates: readonly { id: string; title: string }[]; onPatc... RoleCall's Cross-Entry Boosting: when this entry fires, the listed entries of this book are likelier to (core/lore/engine/boosting.ts).
CrossRefCell src/ui/apps/scenes/compendium/cells/cell-graph.tsx ({ m, onOpen }: { m: BookModel; onOpen(id: string): void })
CssAdvancedPane src/ui/components/css-workshop/advanced-pane.tsx ({ value, onChange, doc, selected, onSelectRule, onRuleChange, onChip, }: CssAdvancedPaneProps) Code + breakdown split for advanced authors. .root .banner .packRow .row .packLabel .knobLabel .sourceLabel .importFlash ...
CssAssistPane src/ui/components/css-workshop/assist-pane.tsx ({ pack, doc, selected, onSelectRule, onAddRule, onRuleChange, onDeleteRule, }: CssAssistPaneProps) Structured assist over one rule at a time. .root .banner .packRow .row .packLabel .knobLabel .sourceLabel .importFlash ...
CssSourcePane src/ui/components/css-workshop/source-pane.tsx ({ value, onChange, onChip }: CssSourcePaneProps) Source tab: chips assist, editor is the sheet. .root .banner .packRow .row .packLabel .knobLabel .sourceLabel .importFlash ...
CssStarters src/ui/components/css-workshop/starters.tsx ({ packId, packBlurb, onApply }: CssStartersProps) Recipe list filtered by active target pack. .root .banner .packRow .row .packLabel .knobLabel .sourceLabel .importFlash ...
CssWorkshop src/ui/components/css-workshop/index.tsx ({ value, onChange, defaultPackId = "universal", onPackChange, note = DEFAULT_NOTE, mode: modeProp, onModeChange, ini... Main assisted CSS editor shell. .root .banner .packRow .row .packLabel .knobLabel .sourceLabel .importFlash ...
CssWorkshopRoom src/ui/apps/css-workshop/room.tsx ({ ctx }: CssWorkshopRoomProps) Full app canvas for the CSS Workshop dock tile. .room .stage .flash .clearSheet .clearTitle .clearBody .clearActs
CueGrid src/ui/components/stage-dossier/index.tsx ({ values, onChange, flubbed = [], label = "Your cues", }: { values: readonly string[]; onChange: (next: string[]) =>... The cue grid: twelve inputs for typing the words back. Pasting all twelve into any cue fills the .dossier .hero .head .act .marquee .flourish .direction .paren ...
CustomRequestParams src/ui/apps/scenes/generation-params-custom.tsx ({ samplers, onSave }: { samplers: SceneGeneration; onSave(key: Field, text: string): void })
CustomTagRows src/ui/apps/scenes/messenger/settings/scene/writing-tags.tsx ({ prompting }: { prompting: PromptingView })
CutFromDialog src/ui/apps/scenes/scene-cuts.tsx ({ onCancel, onConfirm }: { onCancel(): void; onConfirm(): void })
CutLine src/ui/apps/scenes/scene-cuts.tsx ({ count, onRestore }: { count: number; onRestore(): void }) One line where a cut was: every message of one cut shares it.
CutOff src/ui/apps/scenes/scene-turn-parts.tsx ({ busy, onRegenerate }: { busy: boolean; onRegenerate(): void })
CutSceneDialog src/ui/apps/scenes/scenes-dialogs.tsx ({ scenes, onCancel, onCut }: { scenes: Pick<SceneSummary, "title">[]; onCancel(): void; onCut(): void })
CyclesPanel src/ui/apps/scenes/props/trackers/cycles/cycles-panel.tsx ({ ctx, chat, onChat, popOut }: PopoutContext)
DamageNotice src/ui/apps/library/damage-notice.tsx (props: { entries: readonly StudioDamagedEntry[]; studioDir?: string; prefs?: { get(key: string): unknown; set(key: s...
Dark src/ui/apps/scenes/props/story-director/director-shared.tsx ()
Dashboard src/ui/apps/scenes/compendium/tabs/dashboard.tsx ({ model, bookName, onOpen, onTree, headerActions, banner, recentWrites = [], maintenance }: { model: BookModel; book...
DataRows src/ui/apps/scenes/messenger/settings/user/data.tsx ()
DebugTab src/ui/apps/scenes/props/story-director/tab-debug.tsx ({ panel, onEdit, locked }: { panel: DirectorPanel; onEdit: EditFn; locked: boolean })
DefaultPersona src/ui/apps/scenes/messenger/settings/scene/persona-rows.tsx ({ ctx }: { ctx: AppContext }) The persona new scenes start with: the pref the Cast wing's "Set as default" writes. The Cast wing cannot clear it, so there is no empty choice once one is set.
DefaultsSection src/ui/apps/scenes/cast/cast-defaults.tsx ({ ctx, chat }: { ctx: Pick<AppContext, "prefs" | "api">; chat: Pick<OpenScene["chat"], "backdrop" | "preset" | "cast...
DeleteEntryDialog src/ui/apps/scenes/scene-lore-entries.tsx ({ title, onCancel, onConfirm }: { title: string; onCancel(): void; onConfirm(): void })
DeleteFolderDialog src/ui/apps/scenes/scenes-dialogs.tsx ({ name, onCancel, onDelete }: { name: string; onCancel(): void; onDelete(): void })
DeleteMenu src/ui/apps/scenes/scene-cuts.tsx ({ onPick }: { onPick(scope: CutScope, skipConfirm: boolean): void })
DeleteNote src/ui/apps/scenes/messenger/panels/lore/lore-list.tsx ({ w, bookName }: { w: LoreApi; bookName: string }) The inline delete confirmation (panels.html 3f), shared by the list and the inspector. It asks before confirmDeleteEntry removes the entry from its book.
DeleteTakeDialog src/ui/apps/scenes/scene-takes.tsx ({ take, onCancel, onConfirm }: { take: TakeSummary; onCancel(): void; onConfirm(): void })
Desktop98 src/ui/apps/scenes/layouts/desktop98.tsx (p: LayoutProps)
DesktopNoticeRow src/ui/apps/scenes/messenger/settings/user/desktop-notice.tsx ({ a }: { a: WingArgs })
DetailHint src/ui/apps/scenes/scene-lore-entries.tsx ({ empty, onAdd }: { empty: boolean; onAdd(): void }) The editor pane while no entry is open (RoleCall's "Select an Entry" and "Empty Lorebook").
DiagnosticsSection src/ui/apps/scenes/compendium/tabs/settings/diagnostics.tsx ({ ctx, chat, compendium, lore }: SectionProps)
DialogCore src/ui/components/dialog-core/index.tsx ({ children, placement, ariaLabel, onDismiss, overlayClassName, className, labelledBy, tabIndex, as = "div", sheetRef... Shared modal shell. Visual wrappers select placement/classes and keep their own content lifecycle. .overlay .center .pane-bottom .fullscreen .embedded
DialogFooter src/ui/components/ink-dialog/chrome.tsx ({ onCancel, onApply, separated = false, }: { onCancel(): void; onApply(): void; separated?: boolean; }) .head .title .foot .separated
DialogHeader src/ui/components/ink-dialog/chrome.tsx ({ title, onClose }: { title: string; onClose(): void }) .head .title .foot .separated
Dice src/ui/apps/scenes/props/trackers/battle/battle-parts.tsx ({ history, onRoll, onClear }: { history: readonly DiceRoll[]; onRoll(expression: string): void; onClear(): void })
DiceEditor src/ui/apps/workbench/pieces/dice-editor.tsx ({ entity, revision, ctx, piece, topRight, rand = Math.random }: KindEditorProps & { rand?: () => number }) .root .problem .cols .flush .colsPair .rail .railTitle .section ...
DiceTable src/ui/apps/workbench/pieces/dice-table.tsx ({ rows, lit, result, canRoll, onChange, onRoll }: { rows: readonly DiceRow[]; lit: number | undefined; result: strin... .root .problem .cols .flush .colsPair .rail .railTitle .section ...
DiffSections src/ui/apps/scenes/props/trackers/refresh/refresh-diff.tsx ({ diff, skipped }: { diff: ModuleDiff; skipped: readonly Skipped[] })
Direction src/ui/components/stage-dossier/index.tsx ({ children }: { children: ReactNode }) The parenthesised stage direction: the one theatrical aside, in plain words. .dossier .hero .head .act .marquee .flourish .direction .paren ...
DirectorBody src/ui/apps/scenes/props/story-director/director-shared.tsx ({ chatId, tab, panel, now, locked, edit }: { chatId?: string; tab: DirectorTabId; panel: DirectorPanel; now: number;... The open tab's body: the feed always, the empty stage when nothing is saved yet, else the tab. locked turns every edit control off (a save in flight, or an earlier turn on show).
DirectorBooth src/ui/apps/scenes/props/story-director/director-booth.tsx ({ ctx, chat, busy, onProps }: { ctx: AppContext; chat: Chat; busy: boolean; onProps(): void })
DirectorCommandMode src/ui/apps/scenes/props/story-director/director-model.tsx ({ panel, save }: { panel: DirectorPanel; save: Save })
DirectorFab src/ui/apps/scenes/props/story-director/director-fab.tsx ({ ctx, chat }: { ctx: AppContext; chat: Chat })
DirectorModel src/ui/apps/scenes/props/story-director/director-model.tsx ({ ctx, chat, panel, save, label, description }: { ctx: AppContext; chat: Chat; panel: DirectorPanel; save: Save; lab...
DirectorModelRow src/ui/apps/scenes/messenger/settings/scene/director-model-row.tsx ({ a, settings, save }: { a: WingArgs; settings: DirectorPanel["settings"]; save(patch: DirectorSettingsPatch): Promi...
DirectorNotes src/ui/apps/scenes/props/story-director/director-shared.tsx ({ viewing, turn, on, live, note, onDismiss }: { viewing: boolean; turn: number; on: boolean; live: DirectorLive; not... The notes under the toolbar: reading an earlier turn, the Director off, a plan in flight, a plan that failed, and the last edit's refusal.
DirectorPanelView src/ui/apps/scenes/props/story-director/director-panel.tsx ({ ctx, chat, id, popOut }: PopoutContext)
DirectorReasoning src/ui/apps/scenes/props/story-director/director-model.tsx ({ panel, save }: { panel: DirectorPanel; save: Save })
DirectorSettings src/ui/apps/scenes/props/story-director/director-settings.tsx ({ ctx, chat, onChat }: { ctx: AppContext; chat: Chat; onChat?(chat: Chat): void })
DirectorTour src/ui/apps/scenes/props/story-director/director-tour.tsx ({ ctx }: { ctx: AppContext })
DirectorUpdateLine src/ui/apps/scenes/props/story-director/tracker-update-ui.tsx ({ dm }: { dm: TrackerUpdateLine })
Disclosure src/ui/apps/scenes/context/memory-controls.tsx ({ open, onToggle, icon, title, hint, children }: { open: boolean; onToggle(open: boolean): void; icon: IconName; tit...
Disclosure src/ui/components/button/rows.tsx ({ open, label, summary, leading, trailing, variant = "section", depth = 0, chevron = true, vars, "data-part": part, ... .row .item .fold .lead .text .clip .sub .meta ...
Dividers src/ui/apps/scenes/messenger/transcript/use-transcript-decor.tsx ({ day, fresh }: { day: string | undefined; fresh: boolean })
DocContent src/ui/apps/docs/doc-content.tsx ({ doc, docs, figures, body, anchor, loading, onPick }: DocContentProps) .host .room .mobileHead .mobileTitle .desktopNav .desktopToc .mobileSheet .nav ...
Dock src/ui/shell/Dock.tsx ({ onNavigate, pendingAppId }: { onNavigate?: () => void; pendingAppId?: string } = {}) .lane .bar .apps .mark .divider .collapse .nav .handle ...
DockedHead src/ui/apps/agent/premiere-frame.tsx ({ model, watching, standingOn }: { model: string; watching: boolean; standingOn: string | null }) The docked header: the shared RoomHeader, with the live dot and the model in its kicker.
DockedSurface src/ui/apps/scenes/messenger/shell/surface-host.tsx ({ ctx, program, holder, pinned, onTogglePin, onClose }: HostProps & { pinned: boolean; onTogglePin(): void })
DocNav src/ui/apps/docs/doc-nav.tsx ({ docs, activeId, query, onQuery, onPick }: DocNavProps) .host .room .mobileHead .mobileTitle .desktopNav .desktopToc .mobileSheet .nav ...
DocsRoom src/ui/apps/docs/room.tsx ({ ctx }: { ctx: AppContext }) .host .room .mobileHead .mobileTitle .desktopNav .desktopToc .mobileSheet .nav ...
DocTab src/ui/components/button/index.tsx ({ children, kind, selected, accent, onClose, closeLabel = "Close", vars, "data-part": part, type = "button", ...rest... A document tab in the Workbench strip: selectable, closable, draggable, with a context menu (all native props pass). .btn .seg .tab .chip .primary .danger .quiet .sm ...
DocToc src/ui/apps/docs/doc-toc.tsx ({ anchors, activeSlug, onJump }: DocTocProps) .host .room .mobileHead .mobileTitle .desktopNav .desktopToc .mobileSheet .nav ...
Dossier src/ui/components/stage-dossier/index.tsx ({ act, title, accent, hero, children, }: { act: string; title: string; accent?: string; hero?: boolean; children: Re... A dossier: the act label, a marquee with one colored word, the flourish, then the body. .dossier .hero .head .act .marquee .flourish .direction .paren ...
Dot src/ui/components/button/surfaces.tsx ({ kind = "pager", label, current, pressed, color, vars, title, "data-part": part, type = "button", ...rest }: DotProps) .tile .card .dot .icon .swatch .thumb .mark .app ...
DraftStatusStrip src/ui/apps/scenes/scene-draft-status.tsx ({ drafts, persona }: { drafts: ComposerDrafts; persona: string })
DramaturgSettings src/ui/apps/scenes/props/dramaturg/dramaturg-settings.tsx ({ ctx, chat }: { ctx: AppContext; chat: Chat })
Drawer src/ui/apps/scenes/compendium/standardize/standardize-cards.tsx ({ run, onCancel }: { run: RunSnapshot; onCancel(): void })
DrillRow src/ui/apps/scenes/messenger/frames/settings-rows.tsx ({ label, description, value, onOpen }: RowCopy & { value?: string; onOpen(): void }) A row that opens a deeper page: value and chevron.
DropVeil src/ui/shell/DropVeil.tsx ()
EditBox src/ui/apps/scenes/scene-edit-box.tsx ({ value, onChange, onSave, onCancel }: { value: string; onChange(text: string): void; onSave(): void; onCancel(): vo...
EditorArrangement src/ui/apps/workbench/presenters/editor-modebar.tsx (p: { mode: ModeProps["mode"]; editorLayout: "bento" | "playbill"; setEditorLayout(layout: "bento" | "playbill"): voi...
EditorChrome src/ui/apps/workbench/presenters/editor-chrome.tsx (p: EditorChromeProps)
EditorConflict src/ui/apps/workbench/editor-conflict.tsx ({ what, onTakeTheirs, onKeepMine }: EditorConflictProps) .bar .text .title .actions
EditorControls src/ui/apps/scenes/final-cut/fc-editor.tsx ({ pass, onChange }: { pass: FinalCutPass; onChange: Change })
EditorDialogs src/ui/apps/workbench/presenters/editor-dialogs.tsx ({ exportOpen, setExportOpen, spritesOpen, setSpritesOpen, setSpritesFocusLabel, spritesFocusLabel, namedOpen, setNam...
EditorEhead src/ui/components/editor-ehead/index.tsx ({ mark, kind, deck, name, onNameChange, namePlaceholder, nameAriaLabel, meta, dirty, saving, onSave, saveTitle = "Sa... .ehead .spine .spineMark .spineText .kind .spineName .spineMeta .num ...
EditorField src/ui/apps/workbench/layout/editor-field.tsx ({ label, hint, required, htmlFor, meter, wide, children }: EditorFieldProps) .dim .dot .full .rail .hint
EditorLayout src/ui/apps/workbench/layout/editor-layout.tsx ({ label, sections, rail, active: activeProp, onActiveChange, railWidth = "narrow" }: EditorLayoutProps) .dim .dot .full .rail .hint
EditorLeftCard src/ui/apps/workbench/presenters/editor-left.tsx ({ artUrl, draft, piece, vary, styles, setField, mediaCaps, spriteCount, namedCount, setSpritesOpen, setSpritesFocusL...
EditorModeSwitch src/ui/apps/workbench/presenters/editor-modebar.tsx ({ mode, setMode }: ModeProps)
EditorPage src/ui/apps/scenes/messenger/settings/scene/finalcut-editor.tsx ({ env }: { env: SceneEnv })
EffectReview src/ui/extensions/effect-review.tsx ({ value }: { value: unknown }) .review .group .value
EmojiPicker src/ui/apps/scenes/cast/emoji-picker.tsx ({ anchor, onPick, onClose }: { anchor: HTMLElement | null; onPick(emoji: string): void; onClose(): void }) RoleCall's emoji picker, portaled under its button and loaded when first opened.
Empty src/ui/apps/scenes/compendium/cells/cell.tsx ({ children }: { children: ReactNode })
Empty src/ui/apps/scenes/compendium/storyboards/dossier-parts.tsx ({ children }: { children: ReactNode })
Empty src/ui/apps/scenes/props/trackers/items/item-parts.tsx ({ icon, title, hint }: { icon: IconName; title: string; hint: string })
EnemyCard src/ui/apps/scenes/props/trackers/battle/battle-parts.tsx ({ enemy, current, onDamage, onHeal, onRemove }: { enemy: Enemy; current: boolean; onDamage(n: number): void; onHeal(...
EnginePane src/ui/apps/macro-lab/engine-pane.tsx ({ engine, lensLabel, state, onResolve, }: { engine: MacroEngineInfo | null; lensLabel: string; state: EngineState; o... .room .lenses .inst .boxes .stack .box .boxHead .boxTitle ...
EngineRoots src/ui/apps/settings/sections/engines.tsx () One row per engine Bunzai can drive: where its checkout is, and whether one answered. .field .path .acts .note .good .said
EntriesPanel src/ui/apps/scenes/scene-lore-entries.tsx ({ entries, selectedId, query, onQuery, bookId, lastTurn, saving, host, actions, onAddEntry, onOpenBook, children }: ...
EntryBody src/ui/apps/scenes/compendium/fields/blocks.tsx ({ type, data }: { type: EntryType; data: Rec }) Every type's body: tiles, blocks, then Other Fields (what no block names and the header does not show).
EntryCounts src/ui/apps/scenes/compendium/cells/cells-lists.tsx ({ d }: { d: Dashboard })
EntryEditor src/ui/apps/scenes/scene-lore-entry.tsx ({ entry, globalScanDepth, boostCandidates, groups, advancedOpen, onToggleAdvanced, note, onPatch, onClose }: { entry...
EntryPage src/ui/apps/scenes/compendium/entry-page.tsx ({ m, id, bookName, onOpen }: { m: BookModel; id: string; bookName: string; onOpen(id: string): void })
EntryPicker src/ui/apps/scenes/compendium/browse/tree-menu.tsx ({ title, entries, exclude, onPick, onCancel }: { title: string; entries: readonly CompendiumEntry[]; exclude: string...
EntryTocItem src/ui/apps/workbench/lore/entry-toc-item.tsx ({ entry, writeFor, styles, categories, onPatch, onOpen, onDuplicate, onDelete, onOpenBeside, }: EntryTocItemProps)
EntryWhenWhere src/ui/apps/workbench/lore/entry-when-where.tsx ({ entry, writeFor, styles, onPatch, folds, onFoldToggle, }: EntryWhenWhereProps)
ErrorRow src/ui/agent/kit-bands.tsx ({ text, onNotice, }: { text: string; onNotice?: (message: string) => void; }) A failure, as a band rather than as a loose paragraph.
EventsPanel src/ui/apps/scenes/props/trackers/events/events-panel.tsx ({ ctx, chat, onChat, popOut }: PopoutContext)
ExampleMode src/ui/apps/workbench/regex/example-mode.tsx ({ exampleText, styles, onChangeExamples }: ExampleModeProps)
ExpandBox src/ui/components/expand/index.tsx ({ label, children, onExpandedChange }: ExpandBoxProps) Wraps one editor with an expand control and the fullscreen sheet it expands into. .frame .inlineToggle .away .scrim .sheet .head .title .hint ...
ExpandTextarea src/ui/components/expand/index.tsx ({ label, grow = false, ...rest }: ExpandTextareaProps) A textarea that can go fullscreen: drop-in for a raw one, same props, same value ownership. .frame .inlineToggle .away .scrim .sheet .head .title .hint ...
ExportButton src/ui/apps/scenes/compendium/export-button.tsx ({ ctx, bookId, bookName }: { ctx: AppContext; bookId: string; bookName: string })
ExportDialog src/ui/components/export-dialog/index.tsx ({ ctx, entity, name, hasPackage = false, onClose, }: ExportDialogProps) .sheet .title .sub .chips .chip .list .honesty .line ...
ExpressionGroups src/ui/components/expression-map/groups.tsx ({ value, onChange }: ExpressionGroupsProps) .wrap .group .head .name .add
ExpressionMap src/ui/components/expression-map/index.tsx ({ value, onChange, hideEnabled }: ExpressionMapProps) .wrap .note .row .k .lbl .sel .gtitle
ExpressionStage src/ui/components/expression-stage/index.tsx ({ pack, profile }: ExpressionStageProps) .wrap .seal .row .face .moods .ta .hit
ExtensionManager src/ui/apps/settings/sections/extensions.tsx ({ ctx }: { ctx: AppContext }) .manager .module .css .review .import .requirement .catalog .title ...
ExtensionRenderer src/ui/extensions/renderer.tsx ({ packageId, packageName, descriptor, declaredCommands, assets = {}, disabled = false, onCommand }: ExtensionRendere... Renders only the shared bounded descriptor language, with package commands checked at the host boundary. .root .stack .row .text .control .list .image
ExtensionSettingsEditor src/ui/extensions/settings-editor.tsx ({ id, packageName, enabled, recoveryRequired, canWrite, api }: { id: string; packageName: string; enabled: boolean; ...
FailCard src/ui/apps/scenes/scene-turn-parts.tsx ({ code, message, draft, onDismiss, onRetry }: { code: string; message: string; draft: string; onDismiss(): void; onR... RoleCall's failure card: the draft shows, and is not saved. Retry asks again for the same message.
FailureModeSelect src/ui/apps/scenes/final-cut/fc-pass-chrome.tsx ({ value, onChange }: { value: FailureMode; onChange(next: FailureMode): void })
FailureRow src/ui/apps/scenes/messenger/settings/scene/finalcut-kit.tsx ({ value, onChange }: { value: FinalCutPass["failureMode"]; onChange(next: FinalCutPass["failureMode"]): void })
FavoriteModels src/ui/apps/scenes/messenger/settings/scene/models-page.tsx ({ env }: { env: SceneEnv })
FavoriteRow src/ui/apps/scenes/messenger/settings/scene/overview-rows.tsx ({ a }: { a: WingArgs }) The star on the scene: shown in the Scenes list's Fan Favorites shelf.
FeaturedCast src/ui/apps/scenes/compendium/cells/cells-featured.tsx ({ m, onOpen }: { m: BookModel } & Open)
FeatureNode src/ui/apps/workbench/nodes/EngineNodes.tsx (p: FeatureNodeProps) A feature that splices into the request (trackers, library trackers, storyboards). Its port is a piece node's port: drag a wire to a block to put its marker there. .view .head .grow .addWrap .addMenu .area .canvas .world ...
Field src/ui/apps/scenes/context/memory-controls.tsx ({ label, hint, children }: { label: string; hint?: ReactNode; children: ReactNode })
Field src/ui/apps/scenes/stage-controls.tsx ({ icon, label, help, children }: { icon: IconName; label: string; help?: string; children: ReactNode })
FieldBlock src/ui/apps/scenes/compendium/fields/blocks.tsx ({ label, children, tile }: { label: string; children: ReactNode; tile?: boolean })
FieldEdit src/ui/apps/scenes/messenger/panels/trackers/library-edit.tsx ({ field, record, set, disabled }: { field: TrackerField; record: TrackerRecord; set: SetField; disabled?: boolean }) One field's editor, with its icon and name; disabled while there is nothing to attach a change to.
FieldEditor src/ui/_shared/field-editor.tsx ({ tool = false, fields, make, onChange, above }: { tool?: boolean; fields: readonly F[]; make(name: string): F; onCh... .toc .module .css .title .rows .add .page .pager ...
FieldForm src/ui/components/field-form/index.tsx ({ fields, value, onChange }: FieldFormProps) .grid .field .half .label .text .num .sel .rmax ...
FieldIcon src/ui/apps/scenes/messenger/panels/trackers/library-draw.tsx ({ icon }: { icon?: string | undefined }) A field's icon, or nothing when the id is not one the build draws.
FieldRead src/ui/apps/scenes/messenger/panels/trackers/library-draw.tsx ({ view }: { view: FieldView }) One field as the card draws it: a bar with "7/20", the number, pips with the current one lit, one pip, or the quoted text.
FilingRows src/ui/apps/scenes/messenger/settings/scene/compendium-passes.tsx ({ a }: { a: WingArgs }) After a reply: filing on, what to preserve, the Guide, how often and when.
FilingSection src/ui/apps/scenes/compendium/tabs/settings/filing.tsx ({ compendium, guides, set }: SectionProps)
Filters src/ui/apps/scenes/props/trackers/items/item-parts.tsx ({ options, value, onChange, icons }: { options: readonly T[]; value: T; onChange(v: T): void; icons?: Partial<Record...
FinalCutActivity src/ui/apps/scenes/final-cut/fc-activity.tsx ({ api, chatId, messageId, enabled, onApply, onApplyRerun, onClose }: { api: Pick<ScenesApi, "getFinalCutRun" | "reru...
FinalCutBody src/ui/apps/scenes/messenger/settings/scene/writing-lists.tsx ({ env }: { env: SceneEnv })
FinalCutTab src/ui/apps/scenes/final-cut/final-cut-tab.tsx ({ ctx, chat, onChanged }: { ctx: AppContext; chat: Chat; onChanged(chat: Chat): void })
FinalCutWing src/ui/apps/scenes/scene-final-cut.tsx ({ ctx, chat, onChanged, initialTab, single }: { ctx: AppContext; chat: Chat; onChanged(chat: Chat): void; initialTab...
FindPanel src/ui/apps/scenes/scene-find.tsx (p: FindPanelProps)
FinePrint src/ui/apps/workbench/regex/fine-print.tsx ({ rule, rules, writeFor, styles, onPatch }: FinePrintProps)
Finished src/ui/apps/scenes/compendium/standardize/standardize-cards.tsx ({ run, reverting, canRevert, onDismiss, onRevert }: { run: RunSnapshot; reverting: boolean; canRevert: boolean; onDi... The finished run: Complete, or Stopped when Cancel ended it.
FirstLanding src/ui/apps/library/first-landing.tsx ({ css, damaged, studioDir, onDrop, onPickImport, onStartFresh, overlay, }: DoorsBase & { onDrop: (evt: DragEvent<HTM... FIRST LANDING (locked): two massive door-cards, verbatim copy, nothing else competing.
Fld src/ui/apps/scenes/messenger/panels/lore/lore-inspector.tsx ({ label, hint, aside, children }: { label: string; hint?: string; aside?: ReactNode; children: ReactNode })
FloatingAgent src/ui/agent/floating-agent.tsx ({ ctx, open, onClose, }: { ctx: AppContext; open: boolean; onClose: () => void; }) .panel .panelDrag .bar .grip .title .body .handle .hn ...
FloatingSurface src/ui/apps/scenes/messenger/shell/surface-host.tsx ({ ctx, program, holder, onClose, workshop }: HostProps & { workshop?: WorkshopScene }) workshop is what the workshop layer shows of the scene; without it every layer is the plain titled page.
Flow src/ui/apps/scenes/context/tabs-request.tsx ({ trace }: { trace: SceneTrace })
FlowView src/ui/apps/workbench/presenters/flow-view.tsx (props: FlowViewProps)
FocusToggle src/ui/components/focus-toggle/index.tsx ({ focused, onToggle }: FocusToggleProps) The expand/shrink icon button. Static first-party markup parsed via DOMParser + importNode .btn
FoldedSay src/ui/agent/kit-bands.tsx ({ text, onToggle }: { text: string; onToggle: () => void }) A long reply, folded to one line.
FolderInspector src/ui/apps/workbench/lore/folder-inspector.tsx ({ category, categories, edges, collapsed, styles, onRename, onMove, onToggleEnabled, onClone, onToggleCollapse, onDe...
FolderNameDialog src/ui/apps/scenes/scenes-dialogs.tsx ({ mode, initial, onCancel, onSave }: { mode: "new" | "rename"; initial: string; onCancel(): void; onSave(name: strin...
FolderRow src/ui/apps/scenes/messenger/settings/scene/overview-rows.tsx ({ a }: { a: WingArgs }) The story folder the scene sits in; "No folder" takes it out.
FoldoutTabs src/ui/apps/scenes/scene-foldout.tsx ({ area, group, tabs, active, onSelect }: { area: string; group: string; tabs: readonly FoldoutTab[]; active: Id;... The tab strip over a wing panel: the breadcrumb and one square tile per panel, the open one marked.
FollowDialog src/ui/shell/FollowDialog.tsx ()
FontPreview src/ui/components/sealed-media/font-preview.tsx ({ sha, name }: { sha: string; name: string }) .box .img .audio .video .none .font
ForkDialog src/ui/apps/scenes/scene-takes.tsx ({ number, defaultName, retake, onCancel, onCreate }: { number: number; defaultName: string; retake?: boolean; onCanc... retake is Retake from here: the same dialog, told that a fresh reply is written on the new take (message number is the one it answers).
FormSection src/ui/apps/scenes/cast/cast-parts.tsx ({ title, icon, tone, note, expand, children, "data-part": part }: { title: string; icon: IconName; tone: string; not... A titled form card with a tone from one deck token and an optional expand button.
FormulaEditor src/ui/apps/workbench/pieces/formula-editor.tsx ({ entity, revision, ctx, piece, topRight }: KindEditorProps) .root .problem .cols .flush .colsPair .rail .railTitle .section ...
FullChatWings src/ui/apps/scenes/layouts/full-chat-wings.tsx ({ wing, side, extra, onWing, renderWing }: { wing: string | null; side: "l" | "r" | undefined; extra: readonly Wing[...
FullscreenLayer src/ui/apps/scenes/fullscreen-layer.tsx ({ children, label }: { children: ReactNode; label: string })
GalleryGrid src/ui/apps/scenes/stage-gallery-grid.tsx ({ items, onOpen }: { items: readonly GalleryItem[]; onOpen(item: GalleryItem): void })
GalleryLightbox src/ui/apps/scenes/stage-gallery-lightbox.tsx ({ item, busy = false, onUse, onClose }: { item: GalleryItem; busy?: boolean; onUse?(): void; onClose(): void }) onUse is absent where the picture is only for looking at (a message portrait), and the button goes with it.
GalleryPane src/ui/apps/workbench/regex/gallery-pane.tsx ({ onPick, onStartBlank, onClose }: GalleryPaneProps) .pane .phead .pheadB .pheadKick .grid .cat .cards .ba ...
GateCard src/ui/agent/gate-card.tsx ({ request, busy, onAnswer, }: { request: GateView | null; busy?: boolean; onAnswer: (choice: GateAnswerChoice) => vo...
GenerationParamGroups src/ui/apps/scenes/generation-params-groups.tsx ({ own, presetSamplers, provider, model, query = "", thinking }: { own: ScenePresetOwn; presetSamplers: PresetSampler...
GenerationTab src/ui/apps/scenes/generation/generation-tab.tsx ({ ctx, chat, onChat }: { ctx: AppContext; chat: Chat; onChat(chat: Chat): void })
GhostButton src/ui/components/stage-dossier/index.tsx ({ onClick, disabled, children }: { onClick: () => void; disabled?: boolean; children: ReactNode }) A quiet choice: the dashed button that never competes with the call to action. .dossier .hero .head .act .marquee .flourish .direction .paren ...
GradientControl src/ui/apps/workbench/controls/color-controls.tsx ({ value, onChange, styles }: GradientControlProps)
GraphDetail src/ui/apps/scenes/compendium/graph/graph-side.tsx ({ node, connections, total, onPick, onOpen }: DetailProps)
GraphExploreModal src/ui/apps/scenes/compendium/graph/graph-explore.tsx ({ m, onOpen, onClose, layoutOf = sharedLayoutOf }: GraphExploreProps)
GraphSide src/ui/apps/scenes/compendium/graph/graph-side.tsx ({ f, onF, counts, query, onQuery, hits, edgeLabels, onEdgeLabels }: SideProps)
GreetingPicker src/ui/apps/scenes/scene-greeting-picker.tsx ({ count, index, onPick }: { count: number; index: number; onPick(i: number): void })
Group src/ui/apps/scenes/scene-lore-advanced.tsx ({ entry, groups, onPatch }: { entry: LorebookEntry; groups: readonly string[]; onPatch: Patch })
Guidance src/ui/apps/scenes/compendium/tabs/settings/recall.tsx ({ value, guide, guides, onText, onGuide, copy = RECALL_COPY }: { value: string; guide: string | undefined; guides: S... RoleCall's PhaseGuidanceEditor (:433-493): inline guidance, and the Guide whose current text is sent first. Typing is saved once it rests, and when the tab closes.
GuideEditor src/ui/apps/scenes/scene-guide-editor.tsx ({ draft, creating, on, busy, error, onChange, onToggleOn, onDuplicate, onDelete, onCancel, onSave }: { draft: GuideI...
GuidesBody src/ui/apps/scenes/messenger/settings/scene/writing-lists.tsx ({ env }: { env: SceneEnv })
HareHits src/ui/apps/scenes/props/trackhare/hare-hits.tsx ({ trace, group, sort, showMisses }: { trace: SceneTrace; group: boolean; sort: SortMode; showMisses: boolean })
HareLogo src/ui/apps/scenes/props/trackhare/hare-logo.tsx ({ size = 26 }: { size?: number })
HareOptions src/ui/apps/scenes/props/trackhare/hare-options.tsx ({ panelRef, group, sort, misses, onSetGroup, onSetSort, onSetMisses, onResetPlace }: { panelRef: RefObject<HTMLDivEl...
HarePopover src/ui/apps/scenes/props/trackhare/hare-popover.tsx ({ panelRef, traceState, density, group, sort, showMisses, pop, onToggleDensity, onPickReply, onOpenTokens, onOpenCha...
HareRows src/ui/apps/scenes/messenger/settings/scene/prop-pref-rows.tsx ({ a }: { a: WingArgs })
HareStage src/ui/apps/scenes/props/trackhare/hare-stage.tsx ({ ctx, chat }: { ctx: AppContext; chat: Chat })
Header src/ui/apps/scenes/messenger/shell/header.tsx (p: HeaderProps)
HealthPane src/ui/apps/workbench/lore/health-pane.tsx ({ body, onTransform, onJumpEntry, onClose, extraFindings = [], }: HealthPaneProps) .pane .head .clean .gedge .gfirst .glast .gitem .ghead ...
HealthPane src/ui/apps/workbench/regex/health-pane.tsx ({ findings, rules, onClose, onGoTo, onFix }: HealthPaneProps) .pane .phead .pheadB .pheadKick .allClear .groups .groupTitle .row ...
HealthReport src/ui/apps/settings/sections/health-report.tsx () The Check my library card: nothing until asked, then the job's state. .wrap .module .css .card .cardTitle .cardBody .subtle .actions ...
HeldCard src/ui/apps/scenes/scene-turn-parts.tsx ({ draft, onDiscard, onKeep }: { draft: string; onDiscard(): void; onKeep(): void }) Bunzai: the take changed while the reply was written; the reply waits to be added or discarded.
HelpDot src/ui/apps/workbench/preset/help-dot.tsx ({ help }: { help: FieldHelp }) .sideHead .sideHeadTitle .sideEmpty .sideEmptyTitle .sideEmptyHint .sideBody .sideRow .sideHintLine ...
HelperInstalledLine src/ui/apps/settings/sections/helper-card.tsx ({ h }: { h: HelperControls }) Shown on the off card: which helper is installed, and a way to fetch it again. .wrap .module .css .blurb .card .hero .cardTitle .cardBody ...
HelperMissingCard src/ui/apps/settings/sections/helper-card.tsx ({ detail, h }: { detail?: string; h: HelperControls }) Recovery when a helper is unavailable: offer a pinned download where published, otherwise LAN. .wrap .module .css .blurb .card .hero .cardTitle .cardBody ...
Hero src/ui/apps/scenes/compendium/compendium-shell.tsx ()
HiddenWorld src/ui/apps/scenes/props/story-director/debug-hidden.tsx ({ arcs, notes, onEdit, locked }: { arcs: readonly DirectorInvisibleArc[]; notes: readonly DirectorNote[]; onEdit: Ed...
HistorianRows src/ui/apps/scenes/messenger/settings/scene/compendium-tools.tsx ({ a }: { a: WingArgs }) Historian summaries: interval, context overlap and summary-aware truncation.
HistorianSection src/ui/apps/scenes/compendium/tabs/settings/historian.tsx ({ compendium, set }: SectionProps)
HistoryList src/ui/apps/scenes/scene-history.tsx ({ history, onRestore }: { history: HistoryView; onRestore(index: number): void }) The Edit history popover: the text now, then each earlier text newest first with Restore.
HorizonBadge src/ui/apps/scenes/props/story-director/director-parts.tsx ({ horizon }: { horizon: DirectorHorizon })
HostCommandMenu src/ui/extensions/host-command-menu.tsx ({ api, resources, onActivate }: HostCommandMenuProps) .commandScroll .commandRows
HtmlDocEditor src/ui/apps/workbench/htmldoc-editor.tsx ({ entity, revision, ctx, piece, topRight }: HtmlDocEditorProps) .room .head .name .summary .split .grip .pane .paneHead ...
HtmlView src/ui/apps/html-view/index.tsx ({ ctx }: { ctx: AppContext }) .room .body .quiet .frame .big .expand
Ic src/ui/_shared/ic.tsx ({ name, size = 16, fill = false, className }: { name: IconName; size?: number; fill?: boolean; className?: string }) fill draws a lucide glyph solid, as RoleCall does for the Booth bolt and the stop square; mdi glyphs are always solid.
Icon src/ui/apps/library/icon.tsx ({ svg }: { svg: string })
IconBox src/ui/components/icon-box/index.tsx ({ svg, size = 2 }: IconBoxProps) A bordered square that parses and mounts a static SVG mark. .box
IconButton src/ui/components/button/index.tsx ({ label, icon, variant = "secondary", size = "md", badge, tone, vars, "data-part": part, type = "button", title, ...... .btn .seg .tab .chip .primary .danger .quiet .sm ...
IconPicker src/ui/components/icon-picker/index.tsx ({ value, onChange, label = "Icon" }: { value: string | undefined; onChange(next: string | undefined): void; label?: ... .root .row .list .scroll
IdentityCard src/ui/apps/workbench/persona/persona-cards.tsx ({ body, onBody }: { body: PersonaBody; onBody: OnBody }) Identity: tagline + pronouns/height/age + the BRIEF with its never-injected honesty line. .root .body .idRow .honest .traits .traitsHead .traitAdd .stops ...
ImagePromptEditor src/ui/components/image-prompt/index.tsx ({ value, onChange }: ImagePromptEditorProps) .wrap .section .lbl .input .ta .rows .row .add
ImportOverlay src/ui/apps/library/import-sheet.tsx ({ state, onCommit, onCancel, onAddMore, }: { state: ImportState; onCommit: (checkedIndexes: number[]) => void; onCan...
IngestRows src/ui/apps/scenes/messenger/settings/scene/compendium-tools.tsx ({ a, open }: { a: WingArgs; open: OpenProgram }) Import chat history: the options the run reads, and the way to the run itself.
IngestSection src/ui/apps/scenes/compendium/tabs/settings/ingest.tsx ({ ctx, chat, compendium, bookId, set }: SectionProps)
Injection src/ui/apps/scenes/scene-lore-advanced.tsx ({ entry, groups, onPatch }: { entry: LorebookEntry; groups: readonly string[]; onPatch: Patch })
InjectionCard src/ui/apps/workbench/persona/injection-card.tsx ({ body, onBody, stops, labels, showWrapper, locked = false, lens = false }: InjectionCardProps) .root .body .idRow .honest .traits .traitsHead .traitAdd .stops ...
InjectionStatus src/ui/apps/scenes/cast/cast-injection.tsx ({ scan }: { scan: PresetScan }) RoleCall's status over the stops: scanning, "Auto-injecting via ", or the plain invitation.
InkDialog src/ui/components/ink-dialog/index.tsx ({ children, onDismiss, ariaLabel, sheetClassName }: InkDialogProps) A centered modal sheet over a dark scrim; clicking the scrim or pressing Escape calls onDismiss. .overlay .sheet
InlineValue src/ui/components/button/controls.tsx ({ children, vars, "data-part": part, type = "button", ...rest }: InlineValueProps) A value read inside prose; clicking it is the caller's cue to swap in an input. Keeps the text's own font. .toggle .whole .track .knob .on .mixed .sm .inline ...
Input src/ui/components/rc-controls/index.tsx ({ className, ...rest }: InputHTMLAttributes) .sr-only .field .area .chip .check .tipWrap .tip
Inspector src/ui/apps/workbench/nodes/Inspector.tsx (p: InspectorProps) .view .head .grow .addWrap .addMenu .area .canvas .world ...
InspectorShell src/ui/apps/scenes/context/inspector-shell.tsx ({ bodies, tab, onTab, onReview }: { bodies: InspectorBodies; tab: InspectorTab; onTab(tab: InspectorTab): void; onRe...
InterviewScene src/ui/apps/table-read/interview-scene.tsx ({ pending, questionId, reader }: { pending: boolean; questionId?: string; reader: ReaderArt }) .scene .dialogue .art .spotlight .figure .nameplate .table .papers ...
InventoryPanel src/ui/apps/scenes/props/trackers/inventory/inventory-panel.tsx ({ ctx, chat, onChat, popOut }: PopoutContext)
ItemCard src/ui/apps/scenes/props/trackers/items/item-parts.tsx ({ color, icon, title, meta, right, preview, under, foot, chip, veil, mod, badge, open, onToggle, removed, children }...
ItemList src/ui/apps/scenes/props/trackers/items/item-parts.tsx ({ items, render }: { items: readonly T[]; render: (item: T) => ReactNode }) The cards of one tracker, windowed: a tracker holds up to 300 expandable cards. The cards keep their own open state in the panel.
ItemTiles src/ui/apps/scenes/messenger/panels/trackers/library-draw.tsx ({ tiles, onPick, tail }: { tiles: readonly ItemTile[]; onPick(name: string): void; tail?: JSX.Element }) The tiles of a list tracker's rows: a windowed grid in its own scroll box, so a list of any length stays light. Every tile is a button: it picks the row.
KeyHints src/ui/agent/kit-widgets.tsx ({ hints }: { hints: readonly { key: string; label?: string }[] }) A row of keyboard hints: a bright key, then a muted label. Kit's CLI signature.
KeyValues src/ui/apps/scenes/props/story-director/director-parts.tsx ({ data }: { data: Record<string, unknown> }) RoleCall's generic key and value block (Turn Analysis, Pacing Analysis): a string, a list, or a field set, under a small heading each.
KeywordChips src/ui/apps/workbench/lore/keyword-chips.tsx ({ triggers, onChange, styles, placeholder, ariaLabel, advanced = false, pickedIndex, onPick, entryProbability = 100,...
KitCommandBand src/ui/agent/kit-command-bands.tsx ({ title, widget, onSend, onRewind, }: { title: string; widget: KitWidget; onSend: (line: string) => void; onRewind: ... Draw whatever this line carried.
KitMarkdown src/ui/agent/kit-markdown.tsx ({ text }: { text: string }) A whole reply.
KnowledgePanel src/ui/apps/scenes/props/trackers/knowledge/knowledge-panel.tsx ({ ctx, chat, onChat, popOut }: PopoutContext)
KnowledgeRail src/ui/apps/workbench/lore/KnowledgeRail.tsx ({ ctx, refs, onChange }: KnowledgeRailProps) .rail .head .empty .row .rowMissing .attach .pick .pickBook
LanCard src/ui/apps/settings/sections/lan-card.tsx ({ ctx, hidden, redacted, }: { ctx: AppContext; hidden: boolean; redacted: boolean; }) .wrap .module .css .blurb .card .hero .cardTitle .cardBody ...
LanguageSection src/ui/apps/scenes/compendium/tabs/settings/language.tsx ({ compendium, set }: SectionProps)
Lasso src/ui/apps/library/lasso.tsx ({ box }: { box: { left: number; top: number; right: number; bottom: number } | null })
LastAsUserRow src/ui/apps/scenes/scene-last-as-user-row.tsx ({ ctx, chat, onChanged }: { ctx: AppContext; chat: Chat; onChanged(chat: Chat): void })
LastTurnFoot src/ui/apps/scenes/scene-lore-books.tsx ({ lastTurn }: { lastTurn: LastTurn })
Layer src/ui/apps/scenes/messenger/frames/layer.tsx ({ label, onClose, children }: LayerProps)
LayoutChooser src/ui/apps/scenes/layout-chooser/index.tsx ({ onChoose }: { onChoose: (layout: ChatLayout) => void }) .page .dialog .title .sr .backdrop .veil .rays .content ...
LayoutGate src/ui/apps/scenes/layout-chooser/layout-gate.tsx ({ ctx, children }: { ctx: AppContext; children: ReactNode })
LeavingGate src/ui/components/leaving-gate/index.tsx () .scrim .card .kicker .lede .badge .tile .globe .pname ...
LensRail src/ui/components/lens-rail/index.tsx ({ platforms, selected, onToggle, onClear, offTarget, onOffTarget }: LensRailProps) One-line sideways-scrolling lens chips; Bunzai (full card) first, off-target mode at the tail. .rail .scroll .offt .fade
LibraryCard src/ui/apps/scenes/messenger/panels/trackers/library-draw.tsx ({ tracker, onOpen }: { tracker: SceneTracker; onOpen(): void }) The card of one linked tracker: its name, the Library tag, the reply that last changed it, and its fields or items. Clicking the head opens it.
LibraryDetail src/ui/apps/scenes/messenger/panels/trackers/library-detail.tsx ({ ctx, data, tracker, edit, running, onBack }: { ctx: AppContext; data: SceneTrackers; tracker: SceneTracker; edit: ...
LibraryExtensionCommandMenu src/ui/apps/library/extension-command-menu.tsx ({ ctx, pieces }: { ctx: AppContext; pieces: readonly StudioEntitySummary[] })
LibraryGate src/ui/shell/library-gate.tsx ({ children, pieces: injectedPieces }: { children: ReactNode; pieces?: PieceStore }) .stage .inner .row .rowText .rowLabel .rowHint .proof .count ...
LibraryPick src/ui/apps/scenes/messenger/panels/trackers/library-pick.tsx ({ ctx, chat, linked, bodies, builtIn, builtInOn, onChat, onBack }: { ctx: AppContext; chat: Chat; linked: readonly s...
LibraryPicker src/ui/apps/scenes/scene-lore-books.tsx ({ library, inScene, onPick }: { library: StudioEntitySummary[] | null; inScene: ReadonlySet; onPick(id: stri... My Library, searchable. A book the scene already reads is listed but cannot be added twice.
LibraryRail src/ui/apps/library/rail.tsx (props: LibraryRailProps)
LightRays src/ui/components/light-rays/index.tsx ({ followMouse = true, mouseInfluence = .35, fog = true }: { followMouse?: boolean; mouseInfluence?: number; fog?: bo... .rays .canvas .fallback
Line src/ui/apps/scenes/final-cut/fc-controls.tsx ({ label, value, onChange }: { label: string; value: string; onChange(next: string): void })
LineField src/ui/apps/scenes/cast/cast-parts.tsx ({ label, value, onChange, placeholder, tone, disabled }: { label: string; value: string; onChange(v: string): void; ... A labelled one-line input.
Lines src/ui/components/stage-dossier/index.tsx ({ heading, children }: { heading: string; children: ReactNode }) The lines box with its accent spine. .dossier .hero .head .act .marquee .flourish .direction .paren ...
LinkedScenes src/ui/apps/workbench/pieces/linked-scenes.tsx ({ ctx, kind, id }: { ctx: AppContext; kind: string; id: string }) .root .problem .cols .flush .colsPair .rail .railTitle .section ...
LinkedSets src/ui/apps/workbench/preset/linked-sets.tsx (props: LinkedSetsProps) .groups .group .title .module .css .choices .choice .empty
LinkOut src/ui/components/link-out/index.tsx ({ icon, title, meta, action, onAction, empty, emptyLabel }: LinkOutProps) .row .ic .body .title .meta .pending .empty
ListEditor src/ui/components/list-editor/index.tsx ({ items, fields, onChange, addLabel, itemTitle, makeItem }: ListEditorProps) .wrap .item .ihead .ititle
ListRow src/ui/components/button/rows.tsx ({ label, subtitle, leading, meta, trailing, variant = "plain", selected, depth = 0, accent, wrap, vars, "data-part":... .row .item .fold .lead .text .clip .sub .meta ...
ListToolbar src/ui/apps/workbench/preset/list-toolbar.tsx ({ counts, query, onQuery, tab, onTab, onExpandAll, onCollapseAll, onAdd, onAddCategory, placedSlots, onAddMarker, }:... .toolbar .topRow .searchWrap .searchIcon .search .stats .statNum .actions ...
LiveBubble src/ui/apps/scenes/scene-turn-parts.tsx ({ n, who, tone, art, live, format, prefs, speakers }: { speakers?: readonly Speaker[] | undefined; n: number; who: s... The reply being written, in its own bubble: no message id yet, so none of Bubble's edit/branch/cut
LiveBuild src/ui/apps/workbench/preset/live-build.tsx ({ body, onSelect }: LiveBuildProps) .wrap .head .headline .module .css .weight .empty .list ...
LivePreview src/ui/apps/scenes/cast/cast-injection.tsx ({ body, character, scan }: { body: PersonaBody; character: CharacterBody; scan: PresetScan }) RoleCall's Live Preview: the eye, where it lands, the block as sent, and the token count.
LivePreview src/ui/apps/workbench/preset/live-preview.tsx ({ body, onPatchContent, onSelect }: LivePreviewProps) .wrap .head .headline .module .css .volatile .empty .list ...
LiveSwitch src/ui/apps/scenes/final-cut/fc-anti-slop.tsx ({ on, onToggle }: { on: boolean; onToggle(): void })
LivingCard src/ui/apps/table-read/living-card.tsx ({ session, drafts, change }: { session: TableReadSession; drafts: TableReadDraftStore; change(command: TableReadComm... .room .setup .readerGrid .readerPortrait .readerSelect .tempos .setupBody .setupAside ...
LoadoutBanner src/ui/apps/scenes/loadout/loadout-banner.tsx ({ receipt, now, working, busy, onUndo }: { receipt: LoadoutReceipt; now: number; working: boolean; busy: boolean; on...
LoadoutBar src/ui/apps/scenes/loadout/loadout-bar.tsx ({ ctx, scene, busy, onSettings, now = Date.now, tickMs = 15_000 }: { ctx: AppContext; scene: OpenScene; busy: boolea...
LoadoutReview src/ui/apps/scenes/loadout/loadout-review.tsx ({ ctx, chatId, loadout, applying, onCancel, onApply }: { ctx: AppContext; chatId: string; loadout: LoadoutRecord; ap...
LoadoutSaveDialog src/ui/apps/scenes/loadout/loadout-save-dialog.tsx ({ ctx, chatId, loadouts, onSaved, onClose }: { ctx: AppContext; chatId: string; loadouts: readonly LoadoutRecord[]; ...
LoadoutSwitcher src/ui/apps/scenes/loadout/loadout-switcher.tsx ({ ctx, chatId, list, active, busy, onApply, onSaveCurrent, onRetry, onClose }: { ctx: AppContext; chatId: string; li...
LockNotice src/ui/apps/scenes/compendium/standardize/standardize-cards.tsx ()
LogitBiasManager src/ui/apps/scenes/generation-params-bias.tsx ({ entries, model, onChange }: { entries: BiasEntry[]; model: string | undefined; onChange(entries: BiasEntry[]): voi...
Lore src/ui/apps/scenes/context/tab-lore.tsx ({ trace }: { trace: SceneTrace })
LoreAdvanced src/ui/apps/scenes/messenger/panels/lore/lore-inspector-advanced.tsx ({ entry, groups, candidates, onPatch }: { entry: LorebookEntry; groups: readonly string[]; candidates: readonly { id...
LorebookEditor src/ui/apps/workbench/LorebookEditor.tsx ({ entity, revision, ctx, piece, topRight }: LorebookEditorProps) .room .stage .soon .ghostRoom .ghostErr .skel .ghostActions .recents ...
LorebookRows src/ui/apps/scenes/messenger/settings/scene/world.tsx ({ a, open }: { a: WingArgs; open: OpenProgram }) One switch per lorebook the scene reads, plus the way to the Lorebooks program. The Control Booth page shows the same rows.
LoreBooks src/ui/apps/scenes/messenger/panels/lore/lore-books.tsx ({ w, characterName }: { w: LoreApi; characterName: string })
LoreBookSettings src/ui/apps/workbench/lore/book-settings.tsx ({ body, styles, onBook }: BookSettingsProps)
LorebooksSection src/ui/apps/scenes/cast/cast-lorebooks.tsx ({ ctx, chatId, onOpenEditor }: { ctx: AppContext; chatId: string; onOpenEditor(): void })
LoreBulkBar src/ui/apps/workbench/lore/bulk-bar.tsx ({ count, styles, onEnable, onDelete, onClear, onMove, }: BulkBarProps)
LoreCategories src/ui/components/lore-categories/index.tsx ({ categories, onChange }: LoreCategoriesProps) .wrap .head .label .empty .list .row .name .id ...
LoreEntryPage src/ui/apps/workbench/lore/entry-page.tsx ({ entry, writeFor, styles, onPatch, index, count, onPrev, onNext, tokenEstimate, prefs, }: EntryPageProps)
LoreEntryRail src/ui/apps/workbench/lore/entry-rail.tsx ({ body, focusedId, entries, notes, styles, onOpenHealth, onOpenChanges, onOpenRehearsal, onSelectEntry, }: EntryRail...
LoreEntryToc src/ui/apps/workbench/lore/entry-toc.tsx ({ bookId, searchRevision, draftChanged, search, entries, focusedId, writeFor, styles, categories = [], onSelect, onA...
LoreHeader src/ui/apps/scenes/scene-lore-books.tsx ({ title, stats, onBack, onLibrary }: { title: string; stats?: string; onBack?(): void; onLibrary?(): void; })
LoreHelp src/ui/apps/scenes/lore-fields.tsx ({ title, text }: { title: string; text: string }) RoleCall's "?" help button: the title and its description ride the hover text.
LoreInspector src/ui/apps/scenes/messenger/panels/lore/lore-inspector.tsx ({ w, book, entry }: { w: LoreApi; book: SceneLoreBook; entry: LorebookEntry })
LoreList src/ui/apps/scenes/messenger/panels/lore/lore-list.tsx ({ w }: { w: LoreApi })
LoreNode src/ui/apps/workbench/nodes/EngineNodes.tsx (p: LoreNodeProps) .view .head .grow .addWrap .addMenu .area .canvas .world ...
LoreNum src/ui/apps/scenes/lore-fields.tsx ({ value, onChange, fallback, min, max, step, float, className, label }: { value: number; onChange(n: number): void; ...
LorePanel src/ui/apps/scenes/messenger/panels/lore/lore-panel.tsx ({ ctx, chat, characterName, onLore }: { ctx: AppContext; chat: Chat; characterName: string; onLore(books: SceneLoreB...
LoreSpecialTriggers src/ui/components/lore-special-triggers/index.tsx ({ triggers, onChange, advanced = false, }: LoreSpecialTriggersProps) .wrap .menu .section .note .badge
LoreState src/ui/apps/scenes/context/lore-state.tsx ({ ctx, chat, state }: { ctx: AppContext; chat: Chat; state: TraceState })
LoreSwitch src/ui/apps/scenes/lore-fields.tsx ({ on, onChange, label }: { on: boolean; onChange(on: boolean): void; label: string })
LoreWing src/ui/apps/scenes/scene-lore-wing.tsx ({ ctx, chat, characterName, onLore }: { ctx: AppContext; chat: Chat; characterName: string; onLore(books: SceneLoreB... The Lorebook wing for Full Chat.
LoreWorkshopDialog src/ui/apps/library/lore-workshop-dialog.tsx ({ ctx, state, onDone, onDismiss, }: LoreWorkshopDialogProps)
MachineRows src/ui/apps/scenes/messenger/settings/user/studio.tsx ({ ctx }: { ctx: AppContext }) Whole-machine tools (remote access, updates, the engine checkouts, about) are the Settings app's own pages.
MacroAssist src/ui/apps/workbench/workshop/macros/chips.tsx ({ value, onInsert, vars }: MacroAssistProps) .macroAssist .macroChips .macroPreview
MacroChips src/ui/apps/workbench/pieces/macro-chips.tsx ({ macros, onInsert, children }: { macros: readonly MacroHint[]; onInsert(snippet: string): void; children?: ReactNod... .root .problem .cols .flush .colsPair .rail .railTitle .section ...
MacroErrors src/ui/apps/scenes/context/tab-macros.tsx ({ errors }: { errors: MacroReport["errors"] }) The failed macros, each as written with the engine's message (shared with State's Macro Errors tile).
MacroLab src/ui/apps/macro-lab/index.tsx ({ ctx }: { ctx: AppContext }) .room .lenses .inst .boxes .stack .box .boxHead .boxTitle ...
MacroPreview src/ui/apps/scenes/macro-preview.tsx ({ content, prefs }: { content: string; prefs: AppContext["prefs"] })
MacroReference src/ui/apps/workbench/preset/macro-reference.tsx ({ groups }: MacroReferenceProps) .macros .macrosHead .macrosLabel .module .css .macrosHint .macroScroll .macroGroup ...
Macros src/ui/apps/scenes/context/tab-macros.tsx ({ trace }: { trace: SceneTrace })
MapBody src/ui/apps/scenes/compendium/storyboards/dossier-views.tsx ({ d, open, ai }: { d: MapDossier; open: Open; ai: JSX.Element })
MarinaraFolderToc src/ui/apps/workbench/lore/folder-toc.tsx ({ entries, categories, edges, focusedId, selectedFolderId, collapsed, writeFor, styles, bookName, onSelectEntry, onS...
MarkerMenu src/ui/apps/workbench/preset/marker-menu.tsx ({ placed, onAdd }: { placed: ReadonlySet; onAdd(slot: string): void }) .toolbar .topRow .searchWrap .searchIcon .search .stats .statNum .actions ...
MasterSection src/ui/apps/scenes/compendium/tabs/settings/master.tsx ({ compendium, set }: SectionProps)
MemberFace src/ui/apps/scenes/messenger/panels/cast/member-face.tsx ({ row, big }: { row: RosterRow; big?: boolean })
MemberRow src/ui/apps/scenes/messenger/panels/cast/member-row.tsx ({ chatId, row, onProfile, onChange }: MemberRowProps)
Members src/ui/apps/scenes/messenger/shell/members.tsx ({ ctx, scene, name, canOpen, drawer = false, onOpen, onClose }: MembersProps)
MembersPanel src/ui/apps/scenes/messenger/panels/cast/members-panel.tsx ({ ctx, scene, onOpenProgram }: { ctx: AppContext; scene: OpenScene; onOpenProgram(id: string): void })
MemoriesPanel src/ui/apps/scenes/props/trackers/memories/memories-panel.tsx ({ ctx, chat, onChat, popOut }: PopoutContext)
MemoryDefaultRows src/ui/apps/scenes/messenger/settings/user/memory-defaults.tsx ({ ctx }: { ctx: AppContext })
MemoryTab src/ui/apps/scenes/context/memory-tab.tsx ({ ctx, scene, onChat }: ContextProps)
Menu src/ui/shell/Menu.tsx ()
MenuItem src/ui/components/button/rows.tsx ({ children, icon, hint, danger, checked, description, accent, vars, "data-part": part, type = "button", role = "menu... .row .item .fold .lead .text .clip .sub .meta ...
MenuList src/ui/apps/scenes/messenger/frames/context-menu.tsx ({ items, label, onDone, onEscape, autoFocus = true }: MenuListProps)
MessageAct src/ui/apps/scenes/stage-message-act.tsx ({ look, set, prefs, onSet }: StageActProps)
MessageFormatField src/ui/apps/settings/sections/models-message-format.tsx ({ value, onChange }: { value: MessageFormat; onChange(next: MessageFormat): void }) .list .empty .row .rowActive .pick .name .model .key ...
Messenger src/ui/apps/scenes/messenger/messenger.tsx ({ args, ...props }: Omit<MessengerChromeProps, "renderSettings" | "renderPersonaSwap" | "onChat"> & { args: WingArgs... args is what the settings content reads of the page; null while the scene loads, which leaves the settings layer unopened.
MessengerBooth src/ui/apps/scenes/messenger/panels/booth/messenger-booth.tsx ({ args, open }: { args: WingArgs; open(programId: string): void })
MessengerChrome src/ui/apps/scenes/messenger/messenger-chrome.tsx ({ ctx, chatId, scene, name, personaName, programs, request, actions, loreBooks, onBack, onTake, onSurface, renderPro...
MessengerDirectorPanel src/ui/apps/scenes/messenger/panels/director/director-view.tsx ({ ctx, chat, id, popOut, onChat }: PopoutContext)
MessengerTrackersPanel src/ui/apps/scenes/messenger/panels/trackers/trackers-panel.tsx ({ ctx, chat, onChat, ids }: PopoutContext & { ids: readonly string[] })
MetaRow src/ui/apps/scenes/scene-meta.tsx (p: MetaFacts & { versions?: { index: number; count: number; isNew: boolean; busy: boolean; onPrev(): void; onNext():...
Meter src/ui/apps/scenes/compendium/storyboards/dossier-parts.tsx ({ label, value, max = 100, tone }: { label: string; value: number; max?: number; tone: Tone })
MeterBar src/ui/agent/kit-meters.tsx ({ tokens, maxContext, }: { tokens: Tokens; maxContext: number | undefined; }) The composed row, which is the single widget the window drops in.
MiniSelect src/ui/apps/workbench/workshop/mini-select.tsx ({ opts, value, onChange }: MiniSelectProps) .shell .rail .railhead .icoSealed .editor .ehead .sub .add ...
MobileEditorHead src/ui/components/mobile-editor-head/index.tsx ({ name, sub, dirty, saving, onBack, onSave, menu }: MobileEditorHeadProps) Back / name / save / kebab at 2.2rem touch targets; the kebab holds the long tail. .head .name .kebabWrap .menu
ModeGuided src/ui/apps/workbench/regex/mode-guided.tsx ({ rule, writeFor, styles, onPatch, onEscape }: ModeGuidedProps)
ModelChoice src/ui/apps/workbench/promptbook/model-choice.tsx ({ ctx, value, onChange }: { ctx: AppContext; value: ChatConnection | undefined; onChange(c: ChatConnection): void })
ModelPick src/ui/apps/scenes/final-cut/fc-pass-chrome.tsx ({ pass, models, onChange }: { pass: FinalCutPass; models: SceneModels; onChange: Change })
ModelRow src/ui/apps/scenes/messenger/settings/scene/finalcut-kit.tsx ({ label, description, current, models, onPick }: { label: string; description: string; current: FinalCutPass["connec... A model of the scene's connections, or "the scene's model" (nothing set). The select twin of Full Chat's model picker; the pick is the same connection field.
ModelSection src/ui/apps/scenes/compendium/tabs/settings/model.tsx ({ chat, compendium, models, set }: SectionProps)
ModelSelect src/ui/apps/scenes/messenger/settings/scene/model-select.tsx ({ models, current, none, onPick, ...copy }: RowCopy & { models: SceneModels; current: ChatConnection | undefined | n... none is the empty choice's words; current is the saved model, if any. A pick of the empty choice calls onPick(null).
ModeSelect src/ui/apps/workbench/lore/entry-toc-mode.tsx ({ mode, vectorOk, styles, onChange, }: { mode: EntryFireMode; vectorOk: boolean; styles: Readonly<Record<string, str...
ModeWords src/ui/apps/workbench/regex/mode-words.tsx ({ rule, styles, onPatch }: ModeWordsProps)
MonoTag src/ui/components/mono-tag/index.tsx ({ children, dim }: MonoTagProps) A mono, uppercase, letter-spaced meta label. .tag .tagDim
MoodDot src/ui/apps/scenes/props/story-director/director-parts.tsx ({ mood }: { mood: string }) RoleCall's MoodIndicator: red for danger, amber for tense, green for calm, violet otherwise.
MotionAct src/ui/apps/scenes/stage-motion-act.tsx ({ look, set, prefs, onSet }: StageActProps)
MoveToFolderDialog src/ui/apps/scenes/scenes-dialogs.tsx ({ scene, folders, onCancel, onPick }: { scene: Pick<SceneSummary, "title" | "folderId">; folders: (SceneFolder & { c...
MusicDrills src/ui/apps/scenes/messenger/settings/user/music.tsx ({ open, library }: { open: OpenProgram; library: boolean })
MusicMini src/ui/apps/scenes/stage-music-mini.tsx ({ ctx, player = sharedMusic, onExpand = () => openStageTab("music") }: { ctx: AppContext; player?: MusicPlayer; onEx...
MusicPanel src/ui/apps/scenes/stage-music-panel.tsx ({ ctx, player = sharedMusic }: { ctx: AppContext; player?: MusicPlayer })
MusicTabRow src/ui/apps/scenes/props/mood-music/music-tab-row.tsx ({ ctx }: { ctx: AppContext; chat: Chat })
NamedAssets src/ui/components/named-assets/index.tsx ({ value, onChange, assetFiles, macroHint = true, upload, onUploadGrant, }: NamedAssetsProps) .sheet .table .assetScroll .thead .tbody .spacer .virtualRow .kind ...
NamedAssetsDialog src/ui/components/named-assets/dialog.tsx ({ characterName, value, upload, assetFiles, onApply, discardUploads, pinUploads, unpinUploads, onClose, }: NamedAsse... .sheet .table .assetScroll .thead .tbody .spacer .virtualRow .kind ...
NamedSwatches src/ui/apps/scenes/cast/cast-palette.tsx ({ value, onChange, signature, onSignature, signatureCaption, lockSignatureName }: { value: readonly NamedSwatch[]; o...
NavigationOverlay src/ui/shell/NavigationOverlay.tsx ({ onNavigate, ctx, Widgets, onSurfaceTarget }: { onNavigate(): void; ctx?: AppContext; Widgets?: BunzaiApp["OverlayW... .scrim .sheet .layout .appSurface .header .panel .quick .body ...
NewInDeckButton src/ui/apps/library/new-in-deck-button.tsx ({ kind, ctx, onCreated, compact = false, tile = false }: NewInDeckButtonProps)
NewPersona src/ui/apps/scenes/cast/cast-dialogs.tsx ({ busy, onCreate, onCancel }: { busy: boolean; onCreate(input: { name: string; content: string }, cast: boolean): vo... The New persona form: a name and the identity text, then Create or Create and cast.
NewStoryCard src/ui/apps/scenes/scenes-cards.tsx ({ characterName, onStart }: { characterName: string; onStart(): void })
NextSend src/ui/apps/scenes/context/next-send.tsx ({ state }: { state: ForecastState })
NodeCanvas src/ui/apps/workbench/nodes/NodeCanvas.tsx (p: NodeCanvasProps) .view .head .grow .addWrap .addMenu .area .canvas .world ...
NodesView src/ui/apps/workbench/nodes/NodesView.tsx ({ ctx, pieces, onView }: { ctx: AppContext; pieces: readonly StudioEntitySummary[]; onView(view: View): void }) .view .head .grow .addWrap .addMenu .area .canvas .world ...
NoMatchNotice src/ui/apps/library/search-bar.tsx ({ query, deckPlural, deckTotal, elsewhere, onJump, onClear, }: NoMatchNoticeProps)
NovelAiBiasBlock src/ui/apps/workbench/lore/platforms/novelai-bias.tsx ({ entry, styles, onPatch, }: { entry: LorebookEntry; styles: Readonly<Record<string, string>>; onPatch: (patch: Part...
NumberBody src/ui/_shared/field-bodies.tsx ({ field, tops, update }: { field: BodyField; tops: readonly string[]; update: Update }) .toc .module .css .title .rows .add .page .pager ...

| NumberBox | src/ui/apps/scenes/context/memory-controls.tsx | ({ value, label, min, step = 1, float = false, placeholder, onCommit }: { value: number | undefined; label: string; m... | A whole-number box: what is typed stays until you leave it, then onCommit gets the number, or null for an empty or unusable box. | |
| NumberInput | src/ui/components/number-input/index.tsx | ({ value, onChange, ...rest }: Omit<InputHTMLAttributes, "value" | "onChange" | "type"> & { value: ... | | |
| NumberRow | src/ui/apps/scenes/messenger/frames/settings-rows.tsx | ({ label, description, value, min, max, step, onChange }: RowCopy & { value: number; min?: number; max?: number; step... | A number box; an empty or half-typed box reports nothing rather than 0. | |
| OfNote | src/ui/apps/scenes/compendium/cells/cells-lists.tsx | ({ d, onOpen }: { d: Dashboard } & Open) | | |
| OpeningLines | src/ui/apps/settings/sections/security-flows.tsx | ({ hasPassword, onDone, onCancel }: { hasPassword: boolean; onDone: () => void; onCancel: () => void }) | Act 0 shows the words once; Act 1 is the audition, where they are typed back. | .wrap .module .css .card .cardTitle .cardBody .subtle .actions ... |
| OpeningRows | src/ui/apps/scenes/messenger/settings/scene/overview-rows.tsx | ({ a }: { a: WingArgs }) | Which greeting opens the scene and what it says. Only before the first send: after it the greeting is the scene's first message and is edited there. | |
| OpsPane | src/ui/apps/macro-lab/ops-pane.tsx | ({ onInsert }: { onInsert: (token: string) => void }) | | .tableWrap .table .opCell .opAction .opFamily .gap .gapWord .room ... |
| OptionCards | src/ui/apps/workbench/controls/option-cards.tsx | ({ options, value, onSelect, styles }: OptionCardsProps) | | |
| OrderSwitch | src/ui/apps/library/rail.tsx | ({ order, onOrder }: { order: ShelfOrder; onOrder(next: ShelfOrder): void }) | The top bar's All / Recent switch (RC's filter pair). Recent is the Workbench's own recency. | |
| OutOfTimeLine | src/ui/apps/scenes/messenger/transcript/reply-changes.tsx | ({ macros, onInspect }: { macros: readonly { macro: string }[]; onInspect(): void }) | "1 macro ran out of time building this prompt ({{tally}}). Prompt Inspector". | |
| OutputModeRow | src/ui/apps/scenes/messenger/settings/scene/finalcut-kit.tsx | ({ value, onChange }: { value: OutputMode | undefined; onChange(next: OutputMode): void }) | | |
| OutputModeToggle | src/ui/apps/scenes/final-cut/fc-pass-chrome.tsx | ({ value, onChange }: { value: OutputMode | undefined; onChange(next: OutputMode): void }) | | |
| OverlayWidget | src/ui/components/overlay-widget/index.tsx | ({ title, children }: { title: string; children: ReactNode }) | | .overlay-widget .overlay-widget-content .overlay-widget-grid .overlay-widget-tile .overlay-widget-swatch .overlay-widget-page |
| OverlayWidgets | src/ui/apps/agent/overlay.tsx | ({ ctx, onActivate }: OverlayWidgetProps) | | |
| OverlayWidgets | src/ui/apps/app-catalog/overlay.tsx | ({ ctx, onActivate }: OverlayWidgetProps) | | .room .grid .card .cardHead .mark .name .description .cardFoot ... |
| OverlayWidgets | src/ui/apps/css-workshop/overlay.tsx | ({ ctx, onActivate }: OverlayWidgetProps) | | .room .stage .flash .clearSheet .clearTitle .clearBody .clearActs |
| OverlayWidgets | src/ui/apps/docs/overlay.tsx | ({ ctx, onActivate }: OverlayWidgetProps) | | .host .room .mobileHead .mobileTitle .desktopNav .desktopToc .mobileSheet .nav ... |
| OverlayWidgets | src/ui/apps/html-view/overlay.tsx | ({ ctx, onActivate }: OverlayWidgetProps) | | .room .body .quiet .frame .big .expand |
| OverlayWidgets | src/ui/apps/library/overlay.tsx | ({ ctx, onActivate }: OverlayWidgetProps) | | .counts .overlay-widget-grid |
| OverlayWidgets | src/ui/apps/macro-lab/overlay.tsx | ({ ctx, onActivate }: OverlayWidgetProps) | | .room .lenses .inst .boxes .stack .box .boxHead .boxTitle ... |
| OverlayWidgets | src/ui/apps/press/overlay.tsx | ({ ctx, onActivate }: OverlayWidgetProps) | | .roomHost .room2 .rail .stamp .kcard .kick .num .offerList ... |
| OverlayWidgets | src/ui/apps/scenes/overlay.tsx | ({ ctx, onActivate }: OverlayWidgetProps) | | |
| OverlayWidgets | src/ui/apps/settings/overlay.tsx | ({ ctx, onActivate }: OverlayWidgetProps) | | .roomHost .room .shell .rail .tabs .act .lb .lbText ... |
| OverlayWidgets | src/ui/apps/workbench/overlay.tsx | ({ ctx, onActivate }: OverlayWidgetProps) | | .room .stage .soon .ghostRoom .ghostErr .skel .ghostActions .recents ... |
| PackEditor | src/ui/apps/workbench/PackEditor.tsx | ({ entity, revision, ctx, piece, topRight }: PackEditorProps) | | .root .bar .kindTag .name .flag .room .aside .cover ... |
| PaintPicker | src/ui/components/paint-picker/index.tsx | ({ value, allow: allowProp, onChange }: PaintPickerProps) | | .pp .modes .grad .bar .stop .sel .row .out ... |
| PairRow | src/ui/apps/scenes/messenger/frames/settings-rows.tsx | ({ a, b }: { a: PairSide; b: PairSide }) | Two labeled dropdowns side by side. | |
| PaletteCard | src/ui/apps/workbench/persona/persona-cards.tsx | ({ body, onBody }: { body: PersonaBody; onBody: OnBody }) | Color palette on the SHARED controls (registry-first): SwatchRow is the signature slot (the | .root .body .idRow .honest .traits .traitsHead .traitAdd .stops ... |
| PaletteControl | src/ui/apps/workbench/controls/color-controls.tsx | ({ value, onChange, styles, twoField }: PaletteControlProps) | | |
| Panel | src/ui/components/panel/index.tsx | ({ children, deck, as: Tag = "section", "data-part": part, className, style, ...rest }: PanelProps) | | .panel |
| PanelSwitcher | src/ui/apps/scenes/messenger/frames/panel-switcher.tsx | ({ panels, openId, onOpen, onClose, onTogglePin }: PanelSwitcherProps) | | |
| ParamCard | src/ui/apps/scenes/generation-params-card.tsx | ({ def, state, provider, greyed, model, onChange }: Props) | | |
| ParamRows | src/ui/apps/scenes/messenger/settings/scene/writing-params.tsx | ({ env, own, presetSamplers, provider, thinking }: { env: SceneEnv; own: ScenePresetOwn; presetSamplers: PresetSample... | | |
| ParamsPanel | src/ui/apps/scenes/generation/params-panel.tsx | ({ env, query }: { env: GenerationEnv; query: string }) | | |
| ParticipantRow | src/ui/apps/scenes/cast/participant-row.tsx | ({ chatId, row, colorsOn, onChange }: { chatId: string; row: RosterRow; colorsOn: boolean; onChange(c: ParticipantCha... | | |
| ParticipantRows | src/ui/apps/scenes/messenger/settings/scene/world.tsx | ({ a, open }: { a: WingArgs; open: OpenProgram }) | One presence choice per participant, as the Participants tab's Scene select, and the way to the Participants program. | |
| ParticipantsTab | src/ui/apps/scenes/cast/cast-participants-tab.tsx | ({ ctx, scene }: { ctx: AppContext; scene: OpenScene }) | | |
| PartyPanel | src/ui/apps/scenes/props/trackers/party/party-panel.tsx | ({ ctx, chat, onChat, popOut }: PopoutContext) | | |
| PassBody | src/ui/apps/scenes/messenger/settings/scene/finalcut-kit.tsx | ({ env, type, label, description, part, children }: { env: SceneEnv; type: PassType; label: string; description: stri... | One pass's page: its switch, then (while it is on, as in Full Chat) the rows children draws for the stored pass. | |
| PassChrome | src/ui/apps/scenes/final-cut/fc-pass-chrome.tsx | ({ pass, models, onChange, strip = true }: { pass: FinalCutPass; models: SceneModels; onChange: Change; strip?: boole... | | |
| PassChromeRows | src/ui/apps/scenes/messenger/settings/scene/finalcut-kit.tsx | ({ page, type, strip = true }: { page: PassPage; type: PassType; strip?: boolean }) | The rows of Full Chat's PassChrome: model, temperature, cross-message context, then the two input switches (strip false for the Anti-Slop pass, which has no thinking to cut). | |
| PersonaEditor | src/ui/apps/workbench/PersonaEditor.tsx | (props: PersonaEditorProps) | | .room .stage .soon .ghostRoom .ghostErr .skel .ghostActions .recents ... |
| PersonaEditorView | src/ui/apps/workbench/persona/persona-editor.tsx | ({ entity, revision, ctx, piece, topRight }: PersonaEditorViewProps) | | .root .body .idRow .honest .traits .traitsHead .traitAdd .stops ... |
| PersonaFace | src/ui/apps/scenes/scene-persona-picker.tsx | ({ persona, className }: { persona: PickerPersona; className?: string }) | A persona's portrait, else its picked emoji, else its initial. | |
| PersonaForm | src/ui/apps/scenes/cast/cast-persona-tab.tsx | ({ ctx, id, editor, summary, art, stats, defaultId, busy, character, scan, onOpenPicker, onSetDefault }: { ctx: AppCo... | The Persona tab: the Starring line, appearance, personality, injection, and the Default persona and Save footer. | |
| PersonalityPicker | src/ui/apps/scenes/props/story-director/personality-picker.tsx | ({ value, onPick, disabled }: { value: DirectorPersonality; onPick(id: DirectorPersonality): void; disabled?: boolean }) | | |
| PersonaPicker | src/ui/apps/scenes/scene-persona-picker.tsx | ({ ctx, personas, activeId, defaultId, busy, onCast, onNew, onClose }: { ctx: AppContext; personas: readonly PickerPe... | The Casting Call: search, portrait tiles, the Lead Role card, Clear role and Cast. It only chooses; the caller confirms and casts. | |
| PersonaSwap | src/ui/apps/scenes/messenger/shell/persona-swap.tsx | ({ args, onClose, onNew }: { args: WingArgs; onClose(): void; onNew(): void }) | | |
| PerspectivePill | src/ui/apps/scenes/scene-draft-status.tsx | ({ onPick, disabled }: { onPick(perspective: Perspective): void; disabled?: boolean }) | Picking a segment fires the expansion at once, as RoleCall's does; 1ST is lit until another is picked. | |
| PhaseEditor | src/ui/apps/workbench/promptbook/phase-editor.tsx | ({ phase, earlier, ctx, onChange, cards, onRemove, uploads, stageAsset, pinUploads, discardUploads, onAddAttachment, ... | | .root .toolbar .layout .main .phaseList .phase .rehearsal .recipes ... |
| PhasePicker | src/ui/apps/workbench/regex/phase-picker.tsx | ({ phases, writeFor, styles, onToggle }: PhasePickerProps) | | |
| PickHint | src/ui/apps/scenes/scene-lore-books.tsx | ({ hasBooks }: { hasBooks: boolean }) | The right pane while no book is open. | |
| PieceFrame | src/ui/apps/workbench/pieces/piece-frame.tsx | ({ kind, noun, piece, session, meta, topRight, onName, children }: { kind: string; noun: string; piece: StudioEntityS... | | .root .problem .cols .flush .colsPair .rail .railTitle .section ... |
| PieceNode | src/ui/apps/workbench/nodes/PieceNode.tsx | (p: PieceNodeProps) | | .view .head .grow .addWrap .addMenu .area .canvas .world ... |
| PiecePreview | src/ui/apps/library/piece-preview.tsx | ({ peek, cardFacts, expanded = false }: { peek?: PiecePeek | null; cardFacts?: CardFacts; expanded?: boolean }) | | .preview .tagline .description .expanded .facts .tags |
| PipelineLayer | src/ui/apps/workbench/nodes/PipelineLayer.tsx | (p: PipelineLayerProps) | | .view .head .grow .addWrap .addMenu .area .canvas .world ... |
| PipelineNode | src/ui/apps/workbench/nodes/PipelineNode.tsx | (p: PipelineNodeProps) | | .view .head .grow .addWrap .addMenu .area .canvas .world ... |
| PlatformTabs | src/ui/components/platform-tabs/index.tsx | ({ platforms, selected, onToggle, onClear, offTarget, onOffTarget }: PlatformTabsProps) | Multi-select platform lens tabs + the dim/hide off-target switch (vs-editor-2). | .strip .hint .offt |
| PlaybackTab | src/ui/apps/workbench/lore/playback-tab.tsx | ({ body, onJumpEntry }: PlaybackTabProps) | | .pane .head .chat .rowUser .rowBot .user .bot .empty ... |
| PlaybillView | src/ui/apps/workbench/presenters/playbill-view.tsx | ({ leftCard, sealedCard, acts, actModules, lensHides, lensDims, wideKinds, panelKinds, controlFor, nativeItems, nativ... | | |
| PlayingAs | src/ui/apps/scenes/messenger/settings/scene/persona-rows.tsx | ({ a, open }: { a: WingArgs; open: OpenProgram }) | | |
| Pledge | src/ui/components/stage-dossier/index.tsx | ({ checked, onChange, children }: { checked: boolean; onChange: (v: boolean) => void; children: ReactNode }) | The pledge checkbox. | .dossier .hero .head .act .marquee .flourish .direction .paren ... |
| PlotsInMotion | src/ui/apps/scenes/compendium/cells/cells-lists.tsx | ({ d, onOpen }: { d: Dashboard } & Open) | | |
| Popout | src/ui/apps/scenes/messenger/frames/popout.tsx | ({ title, onClose, width = 420, initial = { x: 120, y: 96 }, bounds = viewportNow, children }: PopoutProps) | | |
| PopoutButton | src/ui/apps/scenes/popout/popout-panel.tsx | ({ id, onClick }: { id: string; onClick(): void }) | The docked spot's button: it floats the content. | |
| PopoutHost | src/ui/apps/scenes/popout/popout-host.tsx | ({ ctx, chat, kinds, onChat }: { ctx: AppContext; chat: Chat; kinds: readonly PopoutKind[]; onChat?: (chat: Chat) => ... | | |
| PopoutPanel | src/ui/apps/scenes/popout/popout-panel.tsx | ({ kind, c, saved, view, onDrop, onClose }: { kind: PopoutKind; c: PopoutContext; saved: Pos | null; view: Box; onDro... | | |
| PopoutPlaceholder | src/ui/apps/scenes/popout/popout-panel.tsx | ({ kind, onBack }: { kind: PopoutKind; onBack(): void }) | What the docked spot shows while its panel floats. | |
| PopoutSlot | src/ui/apps/scenes/popout/popout-host.tsx | ({ kind, ctx, chat, onChat }: { kind: PopoutKind; ctx: AppContext; chat: Chat; onChat?: (chat: Chat) => void }) | | |
| PortableLora | src/ui/components/portable-lora/index.tsx | ({ value, onChange }: PortableLoraProps) | | .wrap .warn .lbl .input .ta .row .k .clear |
| PortraitCard | src/ui/apps/workbench/controls/portrait-card.tsx | ({ artUrl, artRef, name, tokens, updatedAt, sourceVariant, vary, styles, onPortraitChange, showSprites = true, onOpen... | | |
| PortraitZoom | src/ui/apps/scenes/scene-portrait-zoom.tsx | ({ chatId, snapshotVersion, name, children }: { chatId: string; snapshotVersion: number; name: string; children: Reac... | | |
| PositionPicker | src/ui/apps/scenes/scene-lore-advanced.tsx | ({ entry, onPatch }: { entry: LorebookEntry; onPatch: Patch }) | The seven position cards as one picker; @ Depth and Append add a row below for the depth and the role to place it as. | |
| PositionPicker | src/ui/apps/workbench/lore/position-picker.tsx | ({ position, depth, role, writeFor, showDepth, showRole, styles, onPatch, }: PositionPickerProps) | | |
| PresetCard | src/ui/apps/library/rc-cards.tsx | (props: CardProps) | ContentPresetCard: the sampler strip, the prompt count, a cover ONLY when the preset carries art | |
| PresetEditor | src/ui/apps/workbench/PresetEditor.tsx | (props: PresetEditorProps) | | .room .stage .soon .ghostRoom .ghostErr .skel .ghostActions .recents ... |
| PresetEditorView | src/ui/apps/workbench/preset/preset-editor.tsx | ({ entity, revision, ctx, piece, topRight }: PresetEditorViewProps) | | .root .workspace .listCol .list .listInner .listRow .autosaveStalled .empty ... |
| PresetWing | src/ui/apps/scenes/scene-preset-wing.tsx | ({ ctx, chat, text, onChanged }: { ctx: AppContext; chat: Chat; text: PresetText; onChanged(chat: Chat): void }) | | |
| Pressure | src/ui/apps/scenes/context/pressure.tsx | ({ meter, thresholds, target, onThresholds, onTarget }: { meter: Meter; thresholds: Thresholds; target: number | null... | | |
| PressureRows | src/ui/apps/scenes/messenger/settings/scene/pressure-rows.tsx | ({ a }: { a: WingArgs }) | | |
| PreviewCard | src/ui/apps/workbench/persona/persona-cards.tsx | ({ xml, tokens, stopLabel }: { xml: string; tokens: number; stopLabel: string }) | Live preview: the REAL compiler's output + the shared token convention. | .root .body .idRow .honest .traits .traitsHead .traitAdd .stops ... |
| Problem | src/ui/apps/scenes/compendium/standardize/standardize-cards.tsx | ({ title, text, log, onDismiss }: { title: string; text: string; log?: readonly RunLine[]; onDismiss(): void }) | | |
| ProfileCard | src/ui/apps/scenes/messenger/panels/cast/profile-card.tsx | ({ chatId, row, colorsOn, onChange, onOpenProgram, onClose }: ProfileCardProps) | | |
| ProfileRows | src/ui/apps/scenes/messenger/settings/user/profile.tsx | ({ a, open }: { a: WingArgs; open: OpenProgram }) | | |
| ProgramPortals | src/ui/apps/scenes/messenger/shell/program-holders.tsx | ({ ids, programs, holderOf, render }: { ids: readonly string[]; programs: readonly P[]; holderOf: HolderOf; render(pr... | Renders each visited program into its holder, wherever the holder currently sits. | |
| ProgramSlot | src/ui/apps/scenes/messenger/shell/program-holders.tsx | ({ holder }: { holder: HTMLElement }) | The open surface's slot for one program: the holder sits here while this is mounted. | |
| ProgressChecklist | src/ui/components/progress-checklist/index.tsx | ({ items, extraStat, compact = false }: ProgressChecklistProps) | Bar + count chip; the checklist itself lives in a bottom sheet. | .prog .compact .bar .row .ok .no .pendingLabel |
| PromptBlocksPage | src/ui/apps/scenes/messenger/settings/scene/prompt-blocks.tsx | ({ env }: { env: SceneEnv }) | The page body: choices, then one switch per block, then the way to the prompt text. | |
| PromptbookEditor | src/ui/apps/workbench/promptbook/promptbook-editor.tsx | ({ entity, revision, ctx, piece, topRight }: KindEditorProps) | | .root .toolbar .layout .main .phaseList .phase .rehearsal .recipes ... |
| PromptEditor | src/ui/apps/scenes/scene-preset-parts.tsx | ({ prompt, loadedAt, presetName, note, prefs, onText, onClose }: { prompt: PresetPrompt | null; loadedAt: number; pre... | One block's text. Typing saves to the preset after a pause (RoleCall saves after 500 ms). | |
| PromptEditPanel | src/ui/apps/workbench/preset/prompt-edit-panel.tsx | ({ ownerKey, block, stops, writeFor, groups, onSetGroup, onClose, onPatch, uploads, stageAsset, pinUploads, discardUp... | | .sideHead .sideHeadTitle .sideEmpty .sideEmptyTitle .sideEmptyHint .sideBody .sideRow .sideHintLine ... |
| PromptingWing | src/ui/apps/scenes/scene-prompting.tsx | ({ ctx, chat, presetBody, onChanged, onBody, initialTab, single }: { ctx: AppContext; single?: boolean; initialTab?: ... | | |
| PromptInspector | src/ui/apps/scenes/scene-inspector.tsx | ({ review, onAnswer }: { review: Review; onAnswer(answer: { kind: "send"; edits: Record<number, string> } | { kind: "... | | |
| PromptList | src/ui/apps/scenes/scene-preset-parts.tsx | ({ body, toggles, selected, templates, prefs, onSelect, onToggle, onToggleGroup }: { body: PresetBody; templates?(que... | | |
| PropRow | src/ui/apps/scenes/props/prop-row.tsx | ({ prop, on, tips, onToggle, onGear }: { prop: RowProps; on: boolean; tips: boolean; onToggle(): void; onGear?(): voi... | | |
| PropsWing | src/ui/apps/scenes/props/props-wing.tsx | ({ list, load, onToggle, onRetry, prefs, host }: { list: readonly SceneProp[]; load: PropsLoad; onToggle(id: string, ... | | |
| PropTile | src/ui/apps/scenes/props/prop-tile.tsx | ({ prop, on, tips, onToggle, onGear, subOn }: { prop: SceneProp; on: boolean; tips: boolean; onToggle(): void; onGear... | | |
| PropTip | src/ui/apps/scenes/props/prop-tip.tsx | ({ title, tip, notes = [], tone, enabled, children }: { title: string; tip: PropTipContent; notes?: readonly string[]... | | |
| PropTool | src/ui/apps/scenes/messenger/settings/bodies.tsx | ({ a, prop }: { a: WingArgs; prop: SceneProp }) | A Prop's own panel while the Prop is on (Story Director, the trackers). | |
| PropWingBody | src/ui/apps/scenes/scene-prop-wing.tsx | ({ prop, state }: { prop: SceneProp; state: PropWingHost }) | | |
| Proscenium | src/ui/components/proscenium/index.tsx | ({ label, art, children }: { label: string; art: ReactNode; children: ReactNode }) | | .frame .inset .screen .content .overlay |
| Prose | src/ui/apps/scenes/prose.tsx | ({ text, speakers }: { text: string; speakers?: readonly Speaker[] }) | | |
| ProseSection | src/ui/apps/scenes/cast/cast-parts.tsx | ({ title, icon, tone, value, onChange, rows = 3, placeholder, note, disabled, "data-part": part }: { title: string; i... | A prose section: RoleCall's titled card with a text area that can go fullscreen. | |
| ProtectedDialog | src/ui/_shared/protected-dialog.tsx | ({ children, variant, ariaLabel, labelledBy, role, className, style }: ProtectedDialogProps) | | .dialog .full .card |
| ProtectedLine | src/ui/apps/settings/section-contract.tsx | ({ children }: { children: ReactNode }) | The lock line that opens a protected page or panel: a gold left edge, no frame. | .roomHost .room .shell .rail .tabs .act .lb .lbText ... |
| ProveThen | src/ui/apps/settings/sections/security-flows.tsx | ({ hasPassword, label, action, onDone, onCancel }: { hasPassword: boolean; label: string; action: () => Promise<unkno... | A change that only needs the fresh proof (removing the password, forgetting a computer). | .wrap .module .css .card .cardTitle .cardBody .subtle .actions ... |
| PublishRows | src/ui/apps/scenes/messenger/settings/user/studio.tsx | ({ ctx }: { ctx: AppContext }) | One switch per publish platform the format registry knows, saved as the same list the Settings app saves. | |
| QuestsBody | src/ui/apps/scenes/compendium/storyboards/dossier-views.tsx | ({ d, open, ai }: { d: QuestsDossier; open: Open; ai: JSX.Element }) | | |
| QueuedPiecePreview | src/ui/apps/library/piece-preview.tsx | ({ e, queue, ctx, expanded = false }: { e: StudioEntitySummary; queue: PeekQueue; ctx: DeckViewContext; expanded?: bo... | Compact views share the shelf's bounded, write- and lifetime-fenced peek queue. | .preview .tagline .description .expanded .facts .tags |
| QuickReplyEditor | src/ui/apps/workbench/quickreply/editor.tsx | ({ entity, revision, ctx, piece, topRight }: QuickReplyEditorProps) | | .root .body .list .items .itemsSpace .virtualRow .row .stack ... |
| QuickReplyList | src/ui/apps/workbench/quickreply/reply-list.tsx | ({ replies, onAdd, onPatch, onRemove }: { replies: readonly QuickReply[]; onAdd(): void; onPatch(id: string, patch: P... | | .root .body .list .items .itemsSpace .virtualRow .row .stack ... |
| RadioCards | src/ui/apps/scenes/messenger/frames/settings-rows.tsx | ({ label, value, options, onChange }: { label: string; value: T; options: readonly ChoiceOption[]; onChange(value:... | One choice of a few, each with a one-line description, as cards. | |
| Rail | src/ui/apps/scenes/messenger/shell/rail.tsx | (p: RailProps) | | |
| Range | src/ui/apps/scenes/final-cut/fc-controls.tsx | ({ label, value, min, max, step, display, footer, onChange }: { label: string; value: number; min: number; max: numbe... | | |
| RatingSection | src/ui/apps/scenes/cast/cast-rating-tags.tsx | ({ value, onChange }: { value: string; onChange(next: string): void }) | | |
| RawExtensions | src/ui/components/raw-extensions/index.tsx | ({ data, handled, onChange }: RawExtensionsProps) | | .wrap .head .row .key .text .num .json .bad |
| ReaderPicker | src/ui/apps/table-read/reader-picker.tsx | ({ value, onChange, compact = false }: { value: ReaderArt; onChange(value: ReaderArt): void; compact?: boolean }) | | .room .setup .readerGrid .readerPortrait .readerSelect .tempos .setupBody .setupAside ... |
| ReadingPane | src/ui/apps/macro-lab/reading-pane.tsx | ({ text, lens, }: { text: string; lens: MacroDialect; }) | | .room .lenses .inst .boxes .stack .box .boxHead .boxTitle ... |
| ReasoningBlocks | src/ui/apps/scenes/scene-reasoning-blocks.tsx | (p: ReasoningBlocksProps) | The blocks of one message; nothing at all when it has no thinking. | |
| ReasoningGroup | src/ui/apps/scenes/generation/reasoning-group.tsx | ({ env, prompting, params, searching }: { env: GenerationEnv; prompting: PromptingView; params: readonly ParamDef[]; ... | | |
| RecallRows | src/ui/apps/scenes/messenger/settings/scene/compendium-passes.tsx | ({ a }: { a: WingArgs }) | Before a reply: recall on, what to prioritize, and the Guide. | |
| RecallSection | src/ui/apps/scenes/compendium/tabs/settings/recall.tsx | ({ compendium, guides, set }: SectionProps) | | |
| Recaps | src/ui/apps/scenes/compendium/cells/cells-lists.tsx | ({ d, onOpen }: { d: Dashboard } & Open) | | |
| Recast | src/ui/apps/settings/sections/security-flows.tsx | ({ label, hasPassword, onForget, onDone, onCancel }: { label: string; hasPassword: boolean; onForget: () => Promise<u... | "Recast": forgetting another computer asks first, then goes through the fresh proof. | .wrap .module .css .card .cardTitle .cardBody .subtle .actions ... |
| RecentWrites | src/ui/apps/scenes/compendium/cells/cells-lists.tsx | ({ writes, onOpen }: { writes: readonly RecentWrite[] } & Open) | | |
| Recommendations | src/ui/components/recommendations/index.tsx | ({ value, onChange }: RecommendationsProps) | | .wrap .group .ghead |
| ReconcileButton | src/ui/apps/scenes/compendium/reconcile-modal.tsx | ({ ctx, chat, books, locked = false }: { ctx: AppContext; chat: Chat; books: readonly SceneLoreBook[]; locked?: boole... | | |
| ReconcileCard | src/ui/apps/scenes/cast/reconcile-card.tsx | ({ available, state, onRun, onConfirm, onUndo, onDismiss }: { available: number; state: Reconcile; onRun(count: numbe... | | |
| Recursion | src/ui/apps/scenes/scene-lore-advanced.tsx | ({ entry, onPatch }: { entry: LorebookEntry; onPatch: Patch }) | The Recursion choice: whether this entry's text can set off other entries, or waits for a later pass. | |
| RefreshAllBox | src/ui/apps/scenes/props/trackers/refresh/refresh-all.tsx | ({ host, boards }: { host: Host; boards: readonly Board[] }) | | |
| RefreshButton | src/ui/apps/scenes/props/trackers/refresh/refresh-ui.tsx | ({ r, label }: { r: Refresh; label: string }) | | |
| RefreshByModel | src/ui/apps/scenes/props/trackers/items/generate-kit.tsx | ({ ctx, chatId, ask, noun, existing, preview, accept, extra, inline }: RefreshProps) | RoleCall's expanded-card Refresh: a button that opens an optional guide, then Generate. | |
| RefreshNotice | src/ui/apps/scenes/props/trackers/refresh/refresh-ui.tsx | ({ r, label }: { r: Refresh; label: string }) | Under the strip: reading (with Cancel), the reason it failed, or that nothing needed to change. | |
| RefreshOverlay | src/ui/apps/scenes/props/trackers/refresh/refresh-ui.tsx | ({ r, label }: { r: Refresh; label: string }) | RoleCall's panel-level busy overlay, kept click-through so the panel stays usable under it. | |
| RefreshSheet | src/ui/apps/scenes/props/trackers/refresh/refresh-ui.tsx | ({ r, label }: { r: Refresh; label: string }) | | |
| RegexBody | src/ui/apps/scenes/messenger/settings/scene/writing-lists.tsx | ({ env }: { env: SceneEnv }) | | |
| RegexCard | src/ui/apps/library/rc-cards.tsx | (props: CardProps) | The regex card: RC's ContentRegexCard content (the rules-on header, what the set does) in the SAME | |
| RegexScripts | src/ui/apps/scenes/messenger/panels/workshop/regex-scripts.tsx | ({ ctx, chat, onChat }: { ctx: AppContext; chat: Chat; onChat(chat: Chat): void }) | | |
| RegexSetEditor | src/ui/apps/workbench/regex/set-editor.tsx | ({ entity, revision, ctx, piece, topRight }: RegexSetEditorProps) | | |
| RegexWorkshopDialog | src/ui/apps/library/regex-workshop-dialog.tsx | ({ ctx, state, onDone, onDismiss, }: RegexWorkshopDialogProps) | | |
| Rehearsal | src/ui/agent/kit-widgets.tsx | ({ text, startedAt }: { text: string; startedAt: number }) | The open rehearsal: the model's reasoning while it is still happening. | |
| Rehearsal | src/ui/apps/settings/sections/security-flows.tsx | ({ due, onWriteNew, onDone, onCancel }: { due: boolean; onWriteNew: () => void; onDone: () => void; onCancel: () => v... | The occasional rehearsal: all twelve words, since no single word is stored. | .wrap .module .css .card .cardTitle .cardBody .subtle .actions ... |
| RehearsalPane | src/ui/apps/workbench/lore/rehearsal-pane.tsx | ({ body, onClose, onJumpEntry, onAddKeyword, }: RehearsalPaneProps) | | .pane .head .chat .rowUser .rowBot .user .bot .empty ... |
| RehearsalTrace | src/ui/agent/kit-widgets.tsx | ({ text, seconds, open, onToggle, }: { text: string; seconds: number; open: boolean; onToggle: () => void; }) | A landed rehearsal, folded to one line. | |
| RenameSceneDialog | src/ui/apps/scenes/scenes-dialogs.tsx | ({ title, onCancel, onSave }: { title: string; onCancel(): void; onSave(title: string): void }) | | |
| RenderBox | src/ui/components/render-box/index.tsx | ({ value, format, children, defaultRendered = true, displayOnly = false, onLinkClick, }: RenderBoxProps) | A content box that toggles between a sanitized rendered view and its raw source. | .box .bar .out .src .plain |
| RenownBody | src/ui/apps/scenes/compendium/storyboards/dossier-views.tsx | ({ d, open, ai }: { d: RenownDossier; open: Open; ai: JSX.Element }) | | |
| RequestNode | src/ui/apps/workbench/nodes/EngineNodes.tsx | (p: RequestNodeProps) | | .view .head .grow .addWrap .addMenu .area .canvas .world ... |
| ResetConfirm | src/ui/apps/scenes/props/story-director/director-shared.tsx | ({ busy, edit, onClose }: { busy: boolean; edit: DirectorData["edit"]; onClose(): void }) | The Reset DM confirm; Reset writes edit({ op: "reset" }) and the card closes whether or not it landed (a refusal shows as the note). | |
| ResetLink | src/ui/apps/scenes/stage-controls.tsx | ({ onClick, label = "Reset" }: { onClick(): void; label?: string }) | Reset, shown once a value differs from the default (RoleCall shows it on the colour rows). | |
| ResponseSchema | src/ui/components/response-schema/index.tsx | ({ value, onChange }: ResponseSchemaProps) | | .wrap .lbl .row .input .sel .ta .name .grid ... |
| RestoreDialog | src/ui/apps/settings/sections/backups-dialogs.tsx | ({ copy, onClose, onUndo }: { copy: Copy; onClose: () => void; onUndo: (undo: Copy) => void }) | | .wrap .module .css .card .cardTitle .cardBody .subtle .actions ... |
| RevertDone | src/ui/apps/scenes/compendium/standardize/standardize-cards.tsx | ({ result, onDismiss }: { result: RevertResult; onDismiss(): void }) | | |
| RoomFrame | src/ui/apps/agent/premiere-frame.tsx | ({ floating, children }: { floating: boolean; children: ReactNode }) | The room's root: the floating Kit panel keeps a plain section, the docked room is the framed Panel. | |
| RoomHeader | src/ui/components/room-header/index.tsx | ({ kicker, title, lede, actions, align = "left", "data-part": part }: RoomHeaderProps) | | .header .text .kicker .title .num .lede .actions |
| RowList | src/ui/apps/scenes/messenger/settings/row-view.tsx | ({ rows, env }: { rows: readonly RowDef[]; env: RowEnv }) | A section body made of rows. | |
| RpgStats | src/ui/components/rpg-stats/index.tsx | ({ value, onChange }: RpgStatsProps) | | .wrap .row .k .group .gtitle |
| RuleKnobs | src/ui/components/css-workshop/knobs.tsx | ({ rule, onChange }: RuleKnobsProps) | Property knobs for the selected rule. | .root .banner .packRow .row .packLabel .knobLabel .sourceLabel .importFlash ... |
| RulePage | src/ui/apps/workbench/regex/rule-page.tsx | ({ rule, rules, writeFor, index, count, styles, onPrev, onNext, onPatch, onDuplicate, onDelete, }: RulePageProps) | | |
| RuleRail | src/ui/apps/workbench/regex/rule-rail.tsx | ({ rule, styles, onOpenBench, findings, onOpenHealth }: RuleRailProps) | | |
| RuleToc | src/ui/apps/workbench/regex/rule-toc.tsx | ({ rules, focusedId, styles, onSelect, onAdd, slowIds }: RuleTocProps) | | |
| RuntimeNumbers | src/ui/apps/scenes/props/story-director/director-runtime.tsx | ({ panel, save }: { panel: DirectorPanel; save: Save }) | | |
| SafetyCard | src/ui/apps/scenes/final-cut/fc-anti-slop.tsx | ({ pass, onToggle, onChange }: { pass: FinalCutPass | undefined; onToggle(): void; onChange: Change }) | | |
| SafetyPage | src/ui/apps/scenes/messenger/settings/scene/finalcut-checks.tsx | ({ env }: { env: SceneEnv }) | | |
| SamplerBar | src/ui/apps/scenes/scene-preset-parts.tsx | ({ preset, own, onSet, booth = false }: { preset: PresetSamplers; own: Samplers; onSet(key: K, ... | | |
| SamplerCard | src/ui/apps/scenes/scene-sampler-card.tsx | (p: SamplerCardProps) | | |
| SamplersBody | src/ui/apps/scenes/messenger/settings/scene/writing-samplers.tsx | ({ env }: { env: SceneEnv }) | The body of the Samplers section. | |
| SavedNumber | src/ui/apps/scenes/messenger/settings/scene/saved.tsx | ({ saved, min, max, step, write, ...copy }: RowCopy & { saved: number; min: number; max: number; step?: number; write... | | |
| SavedSlider | src/ui/apps/scenes/messenger/settings/scene/saved.tsx | ({ saved, write, ...rest }: RowCopy & { saved: number; min: number; max: number; step?: number; unit?: string; write(... | | |
| SavedText | src/ui/apps/scenes/messenger/settings/scene/saved.tsx | ({ saved, write, rows, ...copy }: RowCopy & { saved: string; rows?: number; write(value: string): void | Promise<void... | | |
| SavedToggle | src/ui/apps/scenes/messenger/settings/scene/saved.tsx | ({ saved, write, ...copy }: RowCopy & { saved: boolean; write(on: boolean): Promise }) | A switch that shows the asked state while write runs. write reports its own failure (it must not reject). | |
| SaveText | src/ui/apps/scenes/messenger/settings/scene/drafts.tsx | ({ saved, write, rows, action, ...copy }: RowCopy & { saved: string; rows?: number; action: string; write(text: strin... | A text area saved by its own button: a summary written by hand is kept as written, so it is never saved halfway, and a blank one is never saved. | |
| SceneArt | src/ui/_shared/scene-art.tsx | ({ ctx, chatId, characterId, snapshotVersion, hasArt, name, trimTop }: { ctx: Pick<AppContext, "pieces">; chatId: str... | | |
| SceneAvatar | src/ui/apps/scenes/messenger/messenger-parts.tsx | ({ ctx, scene }: { ctx: AppContext; scene: Pick<SceneSummary, "id" | "snapshotVersion" | "hasPortrait" | "cast"> & { ... | | |
| SceneCard | src/ui/apps/scenes/scenes-cards.tsx | ({ ctx, s, picked, onClick, posinset, setsize, focusKey, compact }: { ctx: AppContext; s: SceneSummary; picked: boole... | | |
| SceneCompare | src/ui/apps/scenes/scene-compare.tsx | ({ api, chatId, scene, messageId, onClose, onStale, setStatus }: { api: AppContext["api"]; chatId: string; scene: Ope... | The page's one mount: finds the message in the open scene and compares its saved versions. Nothing when it has fewer than two or is gone. | |
| SceneComposer | src/ui/apps/scenes/scene-composer.tsx | ({ api, chatId, prefs, persona, expandTick, name, connected, busy, showAiHint, tools, steering, onSteer, onCancelStee... | | |
| SceneGrid | src/ui/apps/scenes/scenes-cards.tsx | ({ ctx, scenes, excludeId, picked, onPick, children, layout = "cards", groupByTime = true }: { ctx: AppContext; scene... | | |
| SceneGuidesWing | src/ui/apps/scenes/scene-guides-wing.tsx | ({ prompting, on }: { prompting: ScenePrompting; on: readonly string[] }) | | |
| SceneHero | src/ui/apps/scenes/scenes-hero.tsx | ({ ctx, scene, picked, onOpen }: { ctx: AppContext; scene: SceneSummary; picked?: boolean; onOpen(): void }) | | |
| SceneHud | src/ui/apps/scenes/scene-hud.tsx | ({ take, messages, model }: { take: string; messages: number; model: string }) | | |
| SceneNoteWing | src/ui/apps/scenes/scene-note-wing.tsx | ({ saved, onSave }: { saved: ChatNote | undefined; onSave(note: ChatNote): Promise }) | | |
| ScenePage | src/ui/apps/scenes/scene-page.tsx | ({ ctx, chatId, navigationTicketId = null, loadId = null, onBack, onTree }: { ctx: AppContext; chatId: string; naviga... | | |
| SceneRegexWing | src/ui/apps/scenes/scene-regex-wing.tsx | ({ ctx, picks }: { ctx: AppContext; picks: SceneRegexPicks }) | | |
| ScenesList | src/ui/apps/scenes/scenes-list.tsx | ({ ctx, onOpen }: { ctx: AppContext; onOpen(id: string): void }) | | .room .lib .rc .lrail .lrail-head .ttl .tile .lsec ... |
| ScenesSide | src/ui/apps/scenes/scenes-side.tsx | ({ ctx, scenes, cut, folders, rail, onSelect, onOpen, onRestore, onNewFolder, drawerOpen }: { ctx: AppContext; scenes... | | |
| SceneTool | src/ui/apps/scenes/messenger/settings/bodies.tsx | ({ a, wing, tab }: { a: WingArgs; wing: string; tab?: string }) | One tab of one wing, drawn alone. tab is a Messenger program's tab (messenger/programs.ts); a wing with a single body takes none. | |
| SceneWritingTools | src/ui/apps/scenes/scene-writing-tools.tsx | ({ text }: { text: PresetText }) | | |
| Scrim | src/ui/components/button/controls.tsx | ({ label, children, transparent, vars, "data-part": part, type = "button", ...rest }: ScrimProps) | The click-away layer behind a wing, menu or sheet: covers its positioned parent; clicking it dismisses. | .toggle .whole .track .knob .on .mixed .sm .inline ... |
| ScriptSheetBench | src/ui/apps/workbench/script-sheet-bench.tsx | (props: KindEditorProps) | | .room .stage .soon .ghostRoom .ghostErr .skel .ghostActions .recents ... |
| ScriptSheetEditor | src/ui/_shared/script-sheet-editor.tsx | ({ initial, samplers, actions, save, choose, onBack, extraDirty = false, handle, onState }: { initial?: SheetDraft; s... | | .root .discard .nameRow .foot .name .role .text .problem |
| SealedHtmlPreview | src/ui/components/sealed-html-preview/index.tsx | ({ html, css = "", title = "Backdrop preview", fill = false, }: SealedHtmlPreviewProps) | Sandboxed iframe preview of card backdrop HTML. | .frame .fill |
| SealedMedia | src/ui/components/sealed-media/index.tsx | ({ kind, src, name, artRef }: SealedMediaProps) | | .box .img .audio .video .none .font |
| SearchBox | src/ui/apps/library/search-bar.tsx | ({ value, onChange, hint, status, onRetry }: SearchBoxProps) | | |
| Searchlight | src/ui/agent/kit-widgets.tsx | ({ on }: { on: boolean }) | The searchlight: a rose beam gliding along the composer's top edge while a turn runs. | |
| SecretField | src/ui/components/stage-dossier/index.tsx | ({ id, label, value, onChange, onEnter, invalid }: { id: string; label: string; value: string; onChange: (v: string) ... | A password field no password manager is invited to keep: the library's password is the key to | .dossier .hero .head .act .marquee .flourish .direction .paren ... |
| Section | src/ui/apps/scenes/compendium/storyboards/dossier-parts.tsx | ({ title, sub, tone = "ok", children }: { title: string; sub?: string; tone?: Tone; children: ReactNode }) | | |
| Section | src/ui/apps/scenes/props/story-director/director-parts.tsx | ({ title, icon, children }: { title: string; icon: IconName; children: ReactNode }) | | |
| Section | src/ui/apps/scenes/props/trackers/codex/codex-parts.tsx | ({ icon, tone, title, aside, children }: { icon: IconName; tone: string; title: string; aside?: ReactNode; children: ... | | |
| SectionCard | src/ui/apps/workbench/persona/persona-cards.tsx | ({ body, onBody, writeFor, sectionKey, title, placeholder, }: { body: PersonaBody; onBody: OnBody; writeFor: PersonaW... | One canonical text section as a bento tile; Personality also carries the trait chips. | .root .body .idRow .honest .traits .traitsHead .traitAdd .stops ... |
| SegControl | src/ui/apps/settings/section-contract.tsx | ({ options, current, onPick, disabled = false, label = "Choose one", }: { options: { value: T; label: string }[]; cur... | A house segmented control bound call-and-response to a settings value. | .roomHost .room .shell .rail .tabs .act .lb .lbText ... |
| Segmented | src/ui/components/button/index.tsx | (props: SegmentedProps) | Pick one (or, with multiple, several) of a few options. | .btn .seg .tab .chip .primary .danger .quiet .sm ... |
| SegmentedRow | src/ui/apps/scenes/messenger/frames/settings-rows.tsx | ({ label, description, value, options, onChange }: RowCopy & { value: T; options: readonly ChoiceOption[]; onChang... | | |
| Sel | src/ui/apps/scenes/final-cut/fc-controls.tsx | ({ label, value, options, onChange }: { label: string; value: string; options: Options; onChange(next: string): void }) | | |
| Select | src/ui/components/rc-controls/index.tsx | ({ className, ...rest }: SelectHTMLAttributes) | | .sr-only .field .area .chip .check .tipWrap .tip |
| SelectRow | src/ui/apps/scenes/messenger/frames/settings-rows.tsx | ({ label, description, value, options, onChange }: RowCopy & { value: T; options: readonly ChoiceOption[]; onChang... | | |
| SendBar | src/ui/apps/library/send-bar.tsx | ({ staged, entities, onSend, onDelete, onSelectAll, onClear, }: SendBarProps) | | |
| SettingCard | src/ui/apps/scenes/generation/setting-card.tsx | ({ def, enabled, value, toggle = true, options, indent, parentOn = true, onToggle, onChange }: SettingCardProps) | | |
| SettingsBar | src/ui/apps/workbench/preset/settings-bar.tsx | ({ body, ctx, showSamplers, onDescription, onSampler, onBehaviorRefs, onQuickReplyRefs, }: SettingsBarProps) | | .bar .body .note .grid .root .workspace .listCol .list ... |
| SettingsField | src/ui/apps/scenes/compendium/tabs/settings/parts.tsx | ({ label, hint, children }: { label: string; hint?: string; children: ReactNode }) | | |
| SettingsHost | src/ui/apps/scenes/messenger/shell/settings-host.tsx | ({ args, scope, onClose, onOpen }: { args: WingArgs; scope: SettingsScopeId; onClose(): void; onOpen: OpenProgram }) | | |
| SettingsRange | src/ui/apps/scenes/compendium/tabs/settings/parts.tsx | ({ label, hint, value, min, max, step, onChange }: { label: string; hint?: string; value: number; min: number; max: n... | RoleCall's range slider (RangeSlider): a labelled range with its value shown. | |
| SettingsRow | src/ui/apps/settings/section-contract.tsx | ({ label, hint, children }: { label: string; hint: string; children: ReactNode }) | A titled control row: label + hint on the left, the control on the right. | .roomHost .room .shell .rail .tabs .act .lb .lbText ... |
| SettingsSection | src/ui/apps/scenes/compendium/tabs/settings/parts.tsx | ({ id, title, blurb, dot, children }: { id: string; title: string; blurb?: string; dot?: string; children: ReactNode }) | | |
| SettingsSegmented | src/ui/apps/scenes/compendium/tabs/settings/parts.tsx | ({ label, hint, value, options, onChange }: { label: string; hint?: string; value: T; options: readonly { value: T; l... | | |
| SettingsStepper | src/ui/apps/scenes/compendium/tabs/settings/parts.tsx | ({ label, hint, value, min, max, step = 1, onChange }: { label: string; hint?: string; value: number; min: number; ma... | | |
| SettingsSwitch | src/ui/apps/scenes/compendium/tabs/settings/parts.tsx | ({ on, onChange, label }: { on: boolean; onChange(on: boolean): void; label: string }) | | |
| SettingsToggle | src/ui/apps/scenes/compendium/tabs/settings/parts.tsx | ({ on, onChange, label, hint }: { on: boolean; onChange(on: boolean): void; label: string; hint?: string }) | | |
| SettingsWindow | src/ui/apps/scenes/messenger/frames/settings-window.tsx | ({ scope, resolveDeep, initialCategory, onClose, onDeepChange }: SettingsWindowProps) | | |
| Setup | src/ui/apps/table-read/setup.tsx | ({ ctx, drafts, busy, onStart, reader, onReaderChange }: { ctx: AppContext; drafts: TableReadDraftStore; busy: boolea... | | .room .setup .readerGrid .readerPortrait .readerSelect .tempos .setupBody .setupAside ... |
| SetupWizard | src/ui/setup/wizard.tsx | ({ ctx, existing, onComplete }: SetupWizardProps) | Renders the wizard; calls onComplete with the draft (all keys filled) when OPEN VAUDE is pressed. | |
| SheetSlicePanel | src/ui/components/sprite-pack/dialog-panels.tsx | ({ sheetCols, sheetRows, sheetRef, onCols, onRows, onPick, onFile, }: { sheetCols: number; sheetRows: number; sheetRe... | | .sheet .bar .lbl .sel .meta .grid .gridViewport .gridSpace ... |
| ShelfKicker | src/ui/components/ticket-window/index.tsx | ({ children }: { children: string }) | The mono microlabel naming a strip shelf; siblings (variants, expressions) borrow it so every | .sheet .booth .marquee .marqueeTitle .glass .glassDrag .monogram .emptyLine ... |
| Shelves | src/ui/apps/library/shelves.tsx | (props: ShelvesProps) | | |
| Sidebar | src/ui/apps/scenes/messenger/shell/sidebar.tsx | (p: SidebarProps) | | |
| SideEffects | src/ui/apps/scenes/scene-lore-advanced.tsx | ({ value, onChange }: { value: EntrySideEffects | null; onChange(next: EntrySideEffects | null): void }) | RoleCall's Side Effects: variable operations that run when the entry fires, over the scene's own variables (core/assembly/lore-effects.ts). | |
| SidePanel | src/ui/apps/scenes/messenger/frames/side-panel.tsx | ({ title, subtitle, width = "side", pinned = false, onTogglePin, onPopOut, onClose, children }: SidePanelProps) | | |
| SizeDial | src/ui/apps/library/shelves.tsx | ({ ctx, sizeRem, setSizeRem, rootRef, prefKey }: { ctx: AppContext; sizeRem: number; setSizeRem(next: number): void; ... | The art dial, in the top bar: one size for the whole page. It sizes the cards (at its resting | |
| SkillConditionEditor | src/ui/apps/workbench/pieces/skill-condition.tsx | ({ value, onChange }: { value: SkillCondition; onChange(next: SkillCondition): void }) | | .root .problem .cols .flush .colsPair .rail .railTitle .section ... |
| SkillEditor | src/ui/apps/workbench/pieces/skill-editor.tsx | ({ entity, revision, ctx, piece, topRight }: KindEditorProps) | | .root .problem .cols .flush .colsPair .rail .railTitle .section ... |
| SlashMenu | src/ui/agent/slash-menu.tsx | ({ title, choices, active, onPick, }: { title: string; choices: readonly SlashChoice[]; active: number; onPick: (inde... | | |
| Slider | src/ui/components/slider/index.tsx | ({ value, defaultValue, min, max, step = 1, onChange, format, label, help, color, readout = true, style, onInput, ...... | | .sr-only .range .wrap .card .head .label .help .value ... |
| SliderField | src/ui/apps/scenes/stage-controls.tsx | ({ icon, label, caption, value, limits, format, help, changed, onChange, onReset }: { icon: IconName; label: string; ... | | |
| SliderRow | src/ui/apps/scenes/messenger/frames/settings-rows.tsx | ({ label, description, value, min, max, step = 1, unit = "", onChange }: SliderRowProps) | | |
| SoonPropRow | src/ui/apps/scenes/props/prop-row.tsx | ({ row, tips }: { row: SoonRow; tips: boolean }) | RoleCall's DisabledExtension (:2240): the same row, dimmed, with no switch and a grey gear that does nothing. | |
| Sources | src/ui/apps/scenes/context/tabs-request.tsx | ({ trace, onHighlight }: { trace: SceneTrace; onHighlight(h: NonNullable): void }) | | |
| SpellbookPanel | src/ui/apps/scenes/props/trackers/spellbook/spellbook-panel.tsx | ({ ctx, chat, onChat, popOut }: PopoutContext) | | |
| SpellDetail | src/ui/apps/scenes/props/trackers/spellbook/spell-detail.tsx | ({ spell, tactical }: { spell: Spell; tactical: boolean }) | | |
| SplitGrip | src/ui/apps/scenes/split-grip.tsx | ({ rule, size, grows, label, onLive, onSave }: { rule: SizeRule; size: number; grows: Grows; label: string; onLive(px... | | |
| SplitPane | src/ui/components/split-pane/index.tsx | ({ left, right, defaultSplit = 0.28, stored, onSplit, className, label = "Resize panels", }: { left: ReactNode; right... | | .host .pane .grip .gripOn |
| SpotifyMini | src/ui/apps/scenes/stage-spotify-mini.tsx | ({ feed, onExpand = () => openStageTab("spotify") }: { feed: SpotifyFeed; onExpand?: () => void }) | | |
| SpotifyPanel | src/ui/apps/scenes/stage-spotify-panel.tsx | ({ feed }: { feed: SpotifyFeed }) | | |
| SpotifyRows | src/ui/apps/scenes/messenger/settings/user/music.tsx | ({ ctx, open, player }: { ctx: AppContext; open: OpenProgram; player: boolean }) | | |
| Spotlight | src/ui/apps/scenes/compendium/cells/cells-featured.tsx | ({ m, onOpen }: { m: BookModel } & Open) | | |
| SpritePack | src/ui/components/sprite-pack/index.tsx | ({ value, onChange, showEnabled = false, showDefault = true, allowMultiFile = true, profile, showSlots = false, focus... | | .sheet .bar .lbl .sel .meta .grid .gridViewport .gridSpace ... |
| SpritePackDialog | src/ui/components/sprite-pack/dialog.tsx | ({ characterName, pack, groups: initialGroups = {}, targets = [], showEnabled = false, showDefault = true, showGroups... | | .sheet .bar .lbl .sel .meta .grid .gridViewport .gridSpace ... |
| SpriteParts | src/ui/components/sprite-parts/index.tsx | ({ value, visualType = "sprite", onChange, onVisualTypeChange, }: SpritePartsProps) | | .wrap .row .lbl .sel .input .parts .part .color ... |
| SpritePreview | src/ui/components/sprite-pack/presentation.tsx | ({ refValue, alt }: { refValue: string; alt: string }) | | .sheet .bar .lbl .sel .meta .grid .gridViewport .gridSpace ... |
| StageActions | src/ui/components/stage-dossier/index.tsx | ({ cta, onCta, disabled, children, }: { cta: string; onCta: () => void; disabled?: boolean; children?: ReactNode; }) | The big call to action (a full-width Stamp) and, optionally, quiet ways out beside it. | .dossier .hero .head .act .marquee .flourish .direction .paren ... |
| StageAppearance | src/ui/apps/scenes/stage-appearance.tsx | ({ prefs, onSet, backdrop, backdropSet, colors }: AppearanceProps) | | |
| StageDoor | src/ui/shell/library-gate.tsx | ({ status }: { status: Status }) | The stage door: the password, or the lines (a new computer, or a forgotten password). | .stage .inner .row .rowText .rowLabel .rowHint .proof .count ... |
| StageGallery | src/ui/apps/scenes/stage-gallery.tsx | ({ ctx, chat, scene, onChat }: StageTabProps) | | |
| Stagehand | src/ui/agent/kit-widgets.tsx | ({ startedAt }: { startedAt: number }) | The stagehand: the hushed in-transcript line while Kit is out working. | |
| StageLightsRow | src/ui/apps/settings/sections/stage-lights-row.tsx | ({ prefs }: { prefs: Prefs }) | | |
| StageNote | src/ui/components/stage-dossier/index.tsx | ({ label, tone, children }: { label: string; tone: "warn" | "flub"; children: ReactNode }) | STAGE DIRECTION (a warning, gilt) or LINE FLUB (an error). | .dossier .hero .head .act .marquee .flourish .direction .paren ... |
| StageWing | src/ui/apps/scenes/scene-stage-wing.tsx | ({ host, initialTab, single, ...appearance }: StageProps & { initialTab?: string; single?: boolean }) | | |
| StandardizeBanner | src/ui/apps/scenes/compendium/standardize/standardize-banner.tsx | ({ ctx, chat, onChat, bookId, model, std }: { ctx: AppContext; chat: Chat; onChat(chat: Chat): void; bookId: string; ... | | |
| StandardizeRows | src/ui/apps/scenes/messenger/settings/scene/compendium-tools.tsx | ({ a, open }: { a: WingArgs; open: OpenProgram }) | Standardization defaults: batch size, model source and retry, and the way to the run and its revert. | |
| StandardizeSection | src/ui/apps/scenes/compendium/tabs/settings/standardize.tsx | ({ ctx, chat, compendium, bookId, set }: SectionProps) | | |
| Starting | src/ui/apps/scenes/scene-turn-parts.tsx | () | | |
| StateGraphPane | src/ui/apps/workbench/workshop/state-graph/pane.tsx | ({ triggers, defaultVarsText, onApply, }: StateGraphPaneProps) | | .shell .rail .railhead .icoSealed .editor .ehead .sub .add ... |
| StateTab | src/ui/apps/scenes/context/tab-state.tsx | ({ ctx, chatId, version, trace }: { ctx: AppContext; chatId: string; version: unknown; trace?: SceneTrace | null }) | | |
| StatRow | src/ui/apps/scenes/compendium/storyboards/dossier-parts.tsx | ({ tiles }: { tiles: readonly { label: string; value: ReactNode; tone: Tone }[] }) | | |
| StatsPanel | src/ui/apps/scenes/props/trackers/resources/resources-panel.tsx | ({ ctx, chat, onChat, popOut }: PopoutContext) | | |
| StatusBadge | src/ui/apps/scenes/props/story-director/director-parts.tsx | ({ status }: { status: string }) | | |
| StatusBar | src/ui/shell/StatusBar.tsx | ({ pieces }: { pieces: PieceStore }) | | |
| StatusToast | src/ui/agent/kit-bands.tsx | ({ text }: { text: string | null }) | A brief statement about something the window itself just did. | |
| Stepper | src/ui/apps/scenes/props/trackers/items/item-parts.tsx | ({ value, onMinus, onPlus, label }: { value: number; onMinus(): void; onPlus(): void; label: string }) | RoleCall's +/- stepper beside a quantity. | |
| Storyboards | src/ui/apps/scenes/compendium/tabs/storyboards.tsx | ({ ctx, chat, entries, onChat, onOpen }: { ctx: AppContext; chat: Chat; entries: readonly CompendiumEntry[]; onChat?(... | | |
| Storybook | src/ui/apps/scenes/layouts/storybook.tsx | (p: LayoutProps) | | |
| StoryTab | src/ui/apps/scenes/props/story-director/tab-story.tsx | ({ state, chatId }: { state: DirectorState; chatId?: string }) | chatId is the scene whose composer a suggested action fills; without it the actions stay plain text. | |
| StructuredPersona | src/ui/components/structured-persona/index.tsx | ({ value, onChange }: StructuredPersonaProps) | | .wrap .kinds .attr .top .key .chips .chip .chipInput ... |
| StubEditor | src/ui/components/stub-editor/index.tsx | ({ title, note, onClose, children }: StubEditorProps) | | .head .note .body .close |
| StudioRows | src/ui/apps/scenes/messenger/settings/user/studio.tsx | ({ env }: { env: RowEnv }) | | |
| StudioTool | src/ui/apps/scenes/messenger/settings/bodies.tsx | ({ a, id }: { a: WingArgs; id: string }) | One Settings-app section (models, backups, security...) as it stands there. Nothing renders if the registry has no such section. | |
| StudioUnreachable | src/ui/apps/library/first-landing.tsx | ({ css, damaged, studioDir, onRetry, }: DoorsBase & { onRetry: () => void }) | The studio did not answer. NO create button: the pieces are probably all still there. | |
| StudioUpdate | src/ui/shell/StudioUpdate.tsx | ({ compact = false }: { compact?: boolean }) | | .notice .announcement |
| SubFeatureList | src/ui/apps/scenes/props/trackers/sub-features.tsx | ({ ctx, chat, onChat, module, subs, tone }: { ctx: AppContext; chat: Chat; onChat?(chat: Chat): void; module: Tracker... | | |
| SummaryBody | src/ui/apps/scenes/messenger/settings/scene/memory-rows.tsx | ({ env }: { env: SceneEnv }) | The include, hide and keep switches and the text itself. | |
| SummaryRows | src/ui/apps/scenes/messenger/settings/user/studio.tsx | ({ ctx }: { ctx: AppContext }) | | |
| SwapLine | src/ui/apps/scenes/cast/swap-line.tsx | ({ name }: { name: string | null }) | The transcript's "you now play X" line (part scene.cast.line). | |
| SwatchRow | src/ui/components/swatch-row/index.tsx | ({ palette, value, onChange, allowCustom }: SwatchRowProps) | | .wrap .row .panel .cell .empty |
| SwatchSettingRow | src/ui/apps/scenes/messenger/settings/user/swatch-row.tsx | ({ label, description, value, palette = [], onChange, onReset }: { label: string; description?: string; value: string... | | |
| SwitchProgress | src/ui/apps/settings/sections/updates-dialogs.tsx | ({ message }: { message: string }) | Progress while a switch runs (the manager's status message). | .wrap .module .css .blurb .card .hero .cardTitle .cardBody ... |
| SwitchResult | src/ui/apps/settings/sections/updates-dialogs.tsx | ({ outcome, onDone, onUndo, }: { outcome: SwitchOutcome; onDone: () => void; onUndo: (from: string) => void; }) | The post-restart popup, from the pending-switch marker. Undo (back to where you came from) on success. | .wrap .module .css .blurb .card .hero .cardTitle .cardBody ... |
| SwitchRow | src/ui/apps/scenes/context/memory-controls.tsx | ({ title, description, checked, onChange, icon, disabled = false }: { title: string; description?: ReactNode; checked... | | |
| SwitchRow | src/ui/apps/scenes/stage-controls.tsx | ({ icon, name, on, tone, help, onChange }: { icon: IconName; name: string; on: boolean; tone: string; help?: string; ... | the Toggle row: a tinted icon tile, the name, the switch. tone is the row's own token. | |
| SystemPromptItem | src/ui/apps/scenes/scene-preset-templates.tsx | ({ field, body, text }: { field: SystemPromptKey; body: PresetBody; text: PresetText }) | The editor for one system prompt, keyed so a reload of the preset shows the text that came in. | |
| TableRead | src/ui/apps/table-read/index.tsx | ({ ctx }: { ctx: AppContext }) | | .room .setup .readerGrid .readerPortrait .readerSelect .tempos .setupBody .setupAside ... |
| Tabs | src/ui/apps/scenes/compendium/storyboards/dossier-parts.tsx | ({ tabs, active, onChange, label }: { tabs: readonly { id: T; label: string; count?: ReactNode }[]; active: T; onChan... | | |
| Tabs | src/ui/apps/scenes/props/trackers/items/item-parts.tsx | ({ tabs, value, onChange }: { tabs: readonly TabDef[]; value: T; onChange(v: T): void }) | The module's tab strip, drawn with the Stats panel's classes. | |
| Tabs | src/ui/components/button/index.tsx | ({ items, value, onChange, label, "data-part": part, idPrefix, orientation = "horizontal" }: TabsProps) | Sections of one room or editor: a tablist with arrow-key movement. The caller renders the panel. | .btn .seg .tab .chip .primary .danger .quiet .sm ... |
| TabStrip | src/ui/apps/scenes/compendium/compendium-shell.tsx | ({ tab, onTab }: { tab: TabId; onTab(t: TabId): void }) | | |
| TabStrip | src/ui/shell/TabStrip.tsx | () | | .shellContainer .shell .appContents .studio-app-surface .studio-app-room .tourHelp .dirty |
| TagsSection | src/ui/apps/scenes/cast/cast-rating-tags.tsx | ({ tags, onChange }: { tags: readonly string[]; onChange(next: string[]): void }) | | |
| TakeCompare | src/ui/apps/scenes/scene-tree-compare.tsx | ({ api, chatId, a, b, onClose }: { api: Pick<ScenesApi, "compareTakes">; chatId: string; a: string; b: string; onClos... | | |
| TakesControl | src/ui/apps/scenes/scene-takes.tsx | ({ open, onToggle, ...menu }: TakesMenuProps & { open: boolean; onToggle(): void }) | The pill with its menu (RoleCall's BranchIndicator): the take you are on, a count of how many takes there are, and the sentence RoleCall reads out. | |
| TakesMenu | src/ui/apps/scenes/scene-takes.tsx | ({ takes, activeId, onSwitch, onRename, onDelete, onTree }: TakesMenuProps) | | |
| TemplateItem | src/ui/apps/scenes/scene-preset-templates.tsx | ({ label, content, loadedAt, onSave }: { label: string; content: string; loadedAt: number; onSave(text: string, loade... | One field: its label and size, and when open its text, saved to the preset 500 ms after typing stops, on leaving the field and on closing. | |
| TemplatesSection | src/ui/apps/scenes/scene-preset-templates.tsx | ({ body, text, query }: { body: PresetBody; text: PresetText; query: string }) | The Preset tab's Templates section: collapsed, with how many of the eight are set; the tab's prompt search narrows it. | |
| Textarea | src/ui/components/rc-controls/index.tsx | ({ className, ...rest }: TextareaHTMLAttributes) | | .sr-only .field .area .chip .check .tipWrap .tip |
| TextAreaRow | src/ui/apps/scenes/messenger/frames/settings-rows.tsx | ({ label, description, value, rows = 4, onChange }: RowCopy & { value: string; rows?: number; onChange(value: string)... | | |
| TextBody | src/ui/_shared/field-bodies.tsx | ({ field, update }: { field: BodyField; update: Update }) | | .toc .module .css .title .rows .add .page .pager ... |
| TheKey | src/ui/apps/settings/sections/security-flows.tsx | ({ hasWords, hasPassword, onWriteLines, onDone, onCancel, }: { hasWords: boolean; hasPassword: boolean; onWriteLines:... | Act II, the key: the password, typed twice, and when the door asks for it. Lines come first. | .wrap .module .css .card .cardTitle .cardBody .subtle .actions ... |
| ThemeManager | src/ui/apps/settings/sections/theme-manager.tsx | ({ ctx }: { ctx: AppContext }) | | .manager .module .css .catalog .strip .name |
| ThemeRows | src/ui/apps/scenes/messenger/settings/user/appearance.tsx | ({ env }: { env: RowEnv }) | The requested studio theme (the same preference the Settings app writes) and a drill to the package manager. | |
| ThemeSlot | src/ui/_shared/theme-slot.tsx | ({ id }: { id: SlotId }) | | |
| ThemeSwatches | src/ui/apps/scenes/cast/cast-palette.tsx | ({ value, onChange, max = 3 }: { value: readonly string[]; onChange(next: string[]): void; max?: number }) | | |
| ThemeTool | src/ui/apps/scenes/messenger/settings/bodies.tsx | ({ a }: { a: WingArgs }) | | |
| ThinkingCallout | src/ui/apps/scenes/generation/thinking-callout.tsx | () | | |
| ThinkingGroup | src/ui/apps/scenes/generation/thinking-group.tsx | ({ env, prompting }: { env: GenerationEnv; prompting: PromptingView }) | | |
| ThisTurn | src/ui/apps/scenes/context/this-turn.tsx | ({ state, onPick, onRefresh }: { state: TraceState; onPick(messageId: string): void; onRefresh(): void }) | | |
| ThreatRadar | src/ui/apps/scenes/compendium/cells/cells-lists.tsx | ({ d, onOpen }: { d: Dashboard } & Open) | | |
| TicketWindow | src/ui/components/ticket-window/index.tsx | ({ label, title, artUrl, artRef, monogram, onPick, onRemove, alternates, onHang, onAdd, uploadAsset, }: TicketWindowP... | | .sheet .booth .marquee .marqueeTitle .glass .glassDrag .monogram .emptyLine ... |
| Tile | src/ui/components/button/surfaces.tsx | ({ kind, label, icon, art, color, selected, badge, size = "md", caption, vars, title, "data-part": part, type = "butt... | | .tile .card .dot .icon .swatch .thumb .mark .app ... |
| Tiles | src/ui/apps/scenes/stage-controls.tsx | ({ label, items, value, onPick }: { label: string; items: readonly { id: T; label: string; icon: IconName }[]; value:... | | |
| Timing | src/ui/apps/scenes/scene-lore-advanced.tsx | ({ entry, onPatch }: { entry: LorebookEntry; onPatch: Patch }) | The Timing cells: how long an entry stays on after it fires (sticky), rests (cooldown) and waits (delay), in messages. | |
| TitleScreen | src/ui/shell/TitleScreen.tsx | ({ onDone, listScenes = api.listScenes, pieces }: TitleScreenProps) | Resume the latest scene or use the existing Library, import and Scenes entry points. | .stage .closing .word .scene .art .marquee .tag .actions ... |
| Toast | src/ui/_shared/toast.tsx | ({ message, actionLabel, onAction, onDismiss }: { message: string; actionLabel: string; onAction(): void; onDismiss?:... | | |
| Toggle | src/ui/components/button/controls.tsx | ({ on, onChange, label, children, size = "md", mixed, isolate, tone, card, vars, onClick, "data-part": part, type = "... | | .toggle .whole .track .knob .on .mixed .sm .inline ... |
| ToggleRow | src/ui/apps/scenes/messenger/frames/settings-rows.tsx | ({ label, description, on, onChange }: RowCopy & { on: boolean; onChange(on: boolean): void }) | | |
| TokensSheet | src/ui/apps/scenes/props/trackhare/tokens-sheet.tsx | ({ trace, model, onClose }: { trace: SceneTrace; model: string; onClose(): void }) | | |
| ToolAccessRows | src/ui/apps/scenes/scene-booth-wing.tsx | ({ ctx, chat, onChanged, windowTokens }: { ctx: AppContext; chat: Chat; onChanged(chat: Chat): void; windowTokens?: n... | Narrator Tool Access and Max tool rounds (RoleCall's Runtime Setup, QuickPlayPanel.tsx:2101-2149; stageSettings.agentLoopEnabled and | |
| ToolAction | src/ui/apps/workbench/pieces/tool-action.tsx | ({ body, ctx, setAction }: { body: ToolBody; ctx: AppContext; setAction(action: Action): void }) | | .root .problem .cols .flush .colsPair .rail .railTitle .section ... |
| ToolEditor | src/ui/apps/workbench/pieces/tool-editor.tsx | ({ entity, revision, ctx, piece, topRight, rand = Math.random }: KindEditorProps & { rand?: () => number }) | | .root .problem .cols .flush .colsPair .rail .railTitle .section ... |
| ToolRail | src/ui/apps/workbench/pieces/tool-rail.tsx | ({ body, ctx, problem, rand }: { body: ToolBody; ctx: AppContext; problem: string | null; rand: () => number }) | | .root .problem .cols .flush .colsPair .rail .railTitle .section ... |
| ToolsCard | src/ui/apps/scenes/final-cut/fc-tools-card.tsx | ({ tools, models, onChange }: { tools: FinalCutTools | undefined; models: SceneModels; onChange(next: FinalCutTools):... | | |
| ToolsPage | src/ui/apps/scenes/messenger/settings/scene/finalcut-checks.tsx | ({ env }: { env: SceneEnv }) | One page for the five tools: the rows of each tool under its own name, all on the page's one Final Cut writer. | |
| ToolTiles | src/ui/apps/scenes/booth-tools.tsx | ({ ctx, chat, onChanged, windowTokens, accessOn }: { ctx: AppContext; chat: Chat; onChanged(chat: Chat): void; access... | | |
| Tooltip | src/ui/components/rc-controls/index.tsx | ({ text, children }: { text: string; children: ReactNode }) | A hover and focus bubble over its child; the text is also the child's accessible description. | .sr-only .field .area .chip .check .tipWrap .tip |
| TooltipRow | src/ui/apps/scenes/messenger/settings/scene/prop-pref-rows.tsx | ({ a }: { a: WingArgs }) | | |
| ToolTry | src/ui/apps/workbench/pieces/tool-try.tsx | ({ body, ctx, problem, rand }: { body: ToolBody; ctx: AppContext; problem: string | null; rand: () => number }) | | .root .problem .cols .flush .colsPair .rail .railTitle .section ... |
| TourGuide | src/ui/components/tour-guide/index.tsx | ({ tour, ctx, onClose }: TourGuideProps) | | .rail .kick .skip .dots .done .now .count .title ... |
| TrackerAutoRows | src/ui/apps/scenes/messenger/settings/scene/tracker-rows.tsx | ({ a }: { a: WingArgs }) | Each tracker's own switch and number for the Story Director's automatic updates; the default is the Director's "Every N replies". | |
| TrackerCardColors | src/ui/components/tracker-card-colors/index.tsx | ({ value, onChange }: TrackerCardColorsProps) | | .wrap .help .colorBlock .k .cssIn |
| TrackerContextRows | src/ui/apps/scenes/messenger/settings/scene/tracker-rows.tsx | ({ a }: { a: WingArgs }) | | |
| TrackerEditor | src/ui/apps/workbench/pieces/tracker-editor.tsx | ({ entity, revision, ctx, piece, topRight }: KindEditorProps) | | .root .problem .cols .flush .colsPair .rail .railTitle .section ... |
| TrackerFace | src/ui/apps/scenes/messenger/panels/trackers/library-draw.tsx | ({ body, value, onPick }: { body: TrackerBody; value: TrackerValue; onPick(row: string): void }) | A record's fields (the card leaves out a number that is another field's top: its bar shows it) or a list's rows as tiles. | |
| TrackerFrame | src/ui/apps/scenes/props/trackers/tracker-frame.tsx | ({ label, title, description, icon, tone, tokens, view, onClear, popOut, badge, actions, children }: FrameProps) | | |
| TrackerRail | src/ui/apps/workbench/pieces/tracker-rail.tsx | ({ body }: { body: TrackerBody }) | | .root .problem .cols .flush .colsPair .rail .railTitle .section ... |
| TrackerSettings | src/ui/apps/workbench/pieces/tracker-settings.tsx | ({ body, edit, onTemplate }: { body: TrackerBody; edit(update: (body: TrackerBody) => TrackerBody): void; onTemplate(... | | .root .problem .cols .flush .colsPair .rail .railTitle .section ... |
| TrackerSetup | src/ui/components/tracker-setup/index.tsx | ({ value, onChange }: TrackerSetupProps) | | .wrap .wt .notes .k .sel .ta .mod .on ... |
| Transcript | src/ui/agent/kit-transcript.tsx | ({ lines, streaming, busy, problem, acts, onFold, onNotice, onAnswer, }: { lines: readonly ChatLine[]; streaming: str... | The whole transcript. | |
| TransferBench | src/ui/components/transfer-bench/index.tsx | ({ leftTitle, rightTitle, left, right, name, namePlaceholder = "Name for the new book", applyLabel = "Apply", require... | | .wrap .nameRow .note .bench .col .colHead .small .list ... |
| TranslatorControls | src/ui/apps/scenes/final-cut/fc-translator.tsx | ({ pass, onChange }: { pass: FinalCutPass; onChange: Change }) | | |
| TranslatorPage | src/ui/apps/scenes/messenger/settings/scene/finalcut-translator.tsx | ({ env }: { env: SceneEnv }) | | |
| TrashPanel | src/ui/apps/library/trash-panel.tsx | ({ ctx, onBack, onRestored }: { ctx: AppContext; onBack(): void; onRestored(): void }) | | |
| TreeBuildSection | src/ui/apps/scenes/compendium/tabs/settings/tree.tsx | ({ compendium, set }: SectionProps) | | |
| TreeCell | src/ui/apps/scenes/compendium/cells/cells-featured.tsx | ({ m, onOpen, onTree }: { m: BookModel; onTree(): void } & Open) | | |
| TreeMaintenance | src/ui/apps/scenes/compendium/tabs/tree-maintenance.tsx | ({ store }: { store: CompendiumTreeStore }) | | |
| TreeMenu | src/ui/apps/scenes/compendium/browse/tree-menu.tsx | ({ target, flags, bounds, onToggle, onMove, onClose }: { target: MenuTarget; flags: Flags; bounds: { width: number; h... | | |
| TreeRows | src/ui/apps/scenes/messenger/settings/scene/compendium-tools.tsx | ({ a, open }: { a: WingArgs; open: OpenProgram }) | Tree building: granularity, entry detail, placement and refine, and the way to the locks and pins kept on the open book. | |
| TriggerBox | src/ui/apps/scenes/scene-lore-keys.tsx | ({ triggers, two = false, advanced, placeholder, onChange }: { triggers: readonly Trigger[]; two?: boolean; advanced:... | | |
| TriggerEditor | src/ui/apps/workbench/lore/trigger-editor.tsx | ({ triggers, onChange, styles, advanced, placeholder, ariaLabel, showSpecials = false, entryProbability = 100, }: Tri... | | |
| TuningRows | src/ui/apps/scenes/messenger/settings/scene/compendium-passes.tsx | ({ a }: { a: WingArgs }) | Retrieval tuning: how many entries, how much of each, how many recent messages, how deep, and how several books are laid out. | |
| TuningSection | src/ui/apps/scenes/compendium/tabs/settings/recall.tsx | ({ compendium, set }: SectionProps) | | |
| TurnList | src/ui/apps/scenes/props/trackers/battle/battle-parts.tsx | ({ order, current, round, enemies, onNext }: { order: readonly string[]; current: string | null; round: number; enemi... | | |
| TurnStatus | src/ui/apps/scenes/scene-turn-parts.tsx | ({ live }: { live: LiveTurn | null }) | The active workflow or Final Cut pass, before the reply is saved. | |
| TypeAct | src/ui/apps/scenes/stage-type-act.tsx | ({ look, set, accent }: StageActProps & { accent: string }) | accent is the colour the Dialogue picker starts from: the scene accent (RoleCall started it from a fixed violet, F5). | |
| UpdateBadge | src/ui/apps/scenes/scene-card.tsx | ({ onClick }: { onClick(): void }) | | |
| UpdateCardDialog | src/ui/apps/scenes/scene-card.tsx | ({ card, onCancel, onUpdate }: { card: CardState; onCancel(): void; onUpdate(): void }) | | |
| UserBanksCard | src/ui/apps/scenes/final-cut/fc-user-banks.tsx | ({ lib }: { lib: FinalCutLibrary }) | | |
| Value | src/ui/apps/scenes/compendium/fields/blocks.tsx | ({ v }: { v: unknown }) | | |
| VariableHistory | src/ui/apps/scenes/context/variable-history.tsx | ({ ctx, chatId, scope, storedKey }: { ctx: AppContext; chatId: string; scope: "local" | "global"; storedKey: string }) | | |
| VariantStrip | src/ui/components/variant-strip/index.tsx | ({ variants, activeId, artUrl, variantArt = {}, onSelect, onAdd, onRemove, onRename, onMode, }: VariantStripProps) | | .wrap .row .editRow .name .mode .face |
| ViewSwitch | src/ui/apps/workbench/nodes/ViewSwitch.tsx | ({ view, onChange }: { view: View; onChange(view: View): void }) | | .view .head .grow .addWrap .addMenu .area .canvas .world ... |
| VirtualRows | src/ui/_shared/virtual-list/rows.tsx | ({ scroll, items, keyOf, render, estimate, gap = 0, className, rowClassName, pinKey = null, pick = true }: { scroll?:... | | |
| VirtualShelf | src/ui/_shared/virtual-list/shelf.tsx | ({ items, keyOf, render, head, tail, rowClass, estimate = ROW_ESTIMATE_PX, pinKey = null }: { items: readonly T[]; ke... | | |
| Voice | src/ui/components/stage-dossier/index.tsx | ({ children }: { children: ReactNode }) | One line of voice, centered. | .dossier .hero .head .act .marquee .flourish .direction .paren ... |
| VoiceSetup | src/ui/components/voice-setup/index.tsx | ({ value, onChange }: VoiceSetupProps) | | .wrap .grid .lbl .sel .input .extras .exrow .add |
| WatchNote | src/ui/agent/kit-widgets.tsx | ({ kinds }: { kinds: readonly string[] }) | The watcher: something changed in the studio that Kit did not do. | |
| WebView | src/ui/apps/workbench/lore/web-view.tsx | ({ body, onSelect, onFallbackCards }: WebViewProps) | | .wrap .filters .svg .edge .edgeDim .node .nodeDim .label ... |
| WingFrame | src/ui/apps/scenes/scene-wing-frame.tsx | ({ wing, extra, resize, children }: { wing: Wing; extra?: string; resize?: WingResize; children: ReactNode }) | | |
| WingPanel | src/ui/apps/scenes/scene-wings.tsx | ({ id, tab, bare, single, castPanel, booth, ai, aiGeneration, stage, prompting, world, props, finalCut, context, core... | | |
| WingRails | src/ui/apps/scenes/scene-wing-rail.tsx | ({ open, onToggle, extra = [] }: { open: string | null; onToggle(id: string): void; extra?: readonly Wing[] }) | | |
| WingResizeEdge | src/ui/apps/scenes/wing-resize-edge.tsx | (props: WingResize & { side: "l" | "r"; label: string }) | | |
| WingSlot | src/ui/apps/scenes/scene-wing-frame.tsx | ({ side, open, children }: { side: "l" | "r"; open: boolean; children?: ReactNode }) | One side's box for the open wing. Its width is the scene root's --wing-w; the rail reads its data-* to place its labels. | |
| WordList | src/ui/components/stage-dossier/index.tsx | ({ words }: { words: readonly string[] }) | Numbered words, shown to be written down. | .dossier .hero .head .act .marquee .flourish .direction .paren ... |
| WorkbenchRows | src/ui/apps/scenes/messenger/settings/user/studio.tsx | ({ env }: { env: RowEnv }) | | |
| Workshop | src/ui/apps/scenes/messenger/panels/workshop/workshop-layer.tsx | ({ program, holder, scene, onClose, body, onPopOut }: { program: Program; holder: HTMLElement; scene: WorkshopScene; ... | body replaces the program's holder (the "is floating" placeholder); onPopOut floats the page. | |
| WorkshopCodePane | src/ui/apps/workbench/workshop/code-pane.tsx | (props: WorkshopCodePaneProps) | | .macroAssist .macroChips .macroPreview .shell .rail .railhead .icoSealed .editor ... |
| WorkshopConsole | src/ui/apps/workbench/workshop/console.tsx | (props: WorkshopConsoleProps) | | .shell .rail .railhead .icoSealed .editor .ehead .sub .add ... |
| WorkshopEhead | src/ui/apps/workbench/workshop/ehead.tsx | ({ title, sub, trailing }: WorkshopEheadProps) | | .shell .rail .railhead .icoSealed .editor .ehead .sub .add ... |
| WorkshopNotice | src/ui/apps/workbench/workshop/notice.tsx | ({ kind, children, role = "status" }: WorkshopNoticeProps) | | .shell .rail .railhead .icoSealed .editor .ehead .sub .add ... |
| WorkshopRail | src/ui/apps/workbench/workshop/rail.tsx | ({ parts, part, onPart, hasPackage }: WorkshopRailProps) | | .shell .rail .railhead .icoSealed .editor .ehead .sub .add ... |
| WorkshopStarters | src/ui/apps/workbench/workshop/starters.tsx | ({ emptyTriggers, undo, onApply }: WorkshopStartersProps) | | .shell .rail .railhead .icoSealed .editor .ehead .sub .add ... |
| WorkshopTriggerCard | src/ui/apps/workbench/workshop/trigger-card.tsx | ({ trigger: t, index: ti, triggers, onWrite, vars = [], }: WorkshopTriggerCardProps) | | .shell .rail .railhead .icoSealed .editor .ehead .sub .add ... |
| WorkshopTriggersPane | src/ui/apps/workbench/workshop/triggers-pane.tsx | ({ triggers, onWrite, undo, vars = [], }: WorkshopTriggersPaneProps) | | .shell .rail .railhead .icoSealed .editor .ehead .sub .add ... |
| WorkshopVariablesPane | src/ui/apps/workbench/workshop/variables-pane.tsx | ({ vars, onChange }: WorkshopVariablesPaneProps) | | .shell .rail .railhead .icoSealed .editor .ehead .sub .add ... |
| WorkshopView | src/ui/apps/workbench/workshop/view.tsx | ({ draft, setField, original, setOriginal, targets = [], ctx, }: WorkshopViewProps) | | .shell .rail .railhead .icoSealed .editor .ehead .sub .add ... |
| WorldConcepts | src/ui/apps/scenes/compendium/cells/cells-lists.tsx | ({ d, onOpen }: { d: Dashboard } & Open) | | |
| WorldWing | src/ui/apps/scenes/scene-world-wing.tsx | ({ lore, compendium, linked, initialTab, single }: { lore: JSX.Element; compendium: JSX.Element; linked: string; init... | | |
| WriteBookRows | src/ui/apps/scenes/messenger/settings/scene/compendium-books.tsx | ({ a }: { a: WingArgs }) | The default write book (only a book that allows writes can be it) and "Make a book for this scene". | |
| WriteForStrip | src/ui/components/write-for-strip/index.tsx | ({ profiles, labels, value, onChange, }: WriteForStripProps

) | | .strip .stripLabel |
| YesNoBody | src/ui/_shared/field-bodies.tsx | ({ field, update }: { field: BodyField; update: Update }) | | .toc .module .css .title .rows .add .page .pager ... |
| ZoomArt | src/ui/apps/scenes/scene-portrait-zoom.tsx | (props: ComponentProps) | | |

Shared UI helpers (src/ui/_shared, .ts)

Name File Signature Doc Styles
buildTimeline src/ui/_shared/version-history.ts ( releases: readonly ReleaseInfo[], installed: string, hasMore = false, ) Build the timeline against the running version. Relation and behind-count come from the SIGN of
createArtCache src/ui/_shared/art-cache.ts ( limits: { maxEntries?: number; maxBytes?: number } = {}, deps: Partial = {}, ) In-flight requests reserve the route's full 32 MiB maximum until the actual Blob size is known.