Skip to content

Choosing a component

Several Components solve similar-looking problems, and it’s not always obvious which one to reach for. This page is the decision guide: pick by what you’re building, then follow the link to the recipe or reference.

The question is whether confirming the form runs a command, and whether it’s one step or several.

You want to…UseWhy
Collect a few fields and run one commandCommandDialogInstantiates, validates, and executes the command; handles the footer and button states. The default.
Run a command through named steps in a modalStepperCommandDialogA wizard over a single command — validate per step, navigate back and forth, execute at the end.
Run a command through named steps inline on the pageCommandStepperThe inline command wizard for a panel, route, or page region; it executes on the final step.
Embed command fields in a page, not a dialogCommandFormThe same typed fields CommandDialog uses, without the dialog chrome.
Collect data and return it without running a commandDialogA confirmation or data-entry dialog that hands values back to the caller. No command involved.
Edit ordinary local React stateCommon basic controlsNative text and choice controls expose semantic values without binding an Arc command.
Select one or more values in ordinary local React stateDropdownBinds a value or array to local options without binding an Arc command.

Rule of thumb: if confirming the dialog executes a generated command, it’s a CommandDialog (or its stepper variant). If it just gathers values and returns them, it’s a Dialog. Never reach for an application-owned modal — these wrappers handle validation timing, loading state, focus, and footers consistently.

Both render a query or observable query; the question is whether you want a whole page or a table to drop into one.

You want to…UseWhy
A full screen: a list, a toolbar of actions, detail panelsDataPageA resizable page composition with toolbar and detail areas wired to the query.
A table over an Arc query or observable queryDataTablesQuery wrappers with server paging and loaded-page rendering.
A semantic table over an already-loaded arrayDataTableCoreLocal rows, single selection, loaded-page filtering/sorting, scrolling, and stable parts.
Grouping, row expansion, or controlled lazy/server sortingProduct-owned/retained table adapterComponents does not claim these advanced state contracts; keep the existing adapter deliberately.

If you’re building a list-screen-with-actions from scratch, start with the list screen recipe, which composes DataPage with CommandDialog actions.

You want to…UseWhy
Select one or more values from local optionsDropdownSupports single, filtered, and multiple selection through a controlled value.
Show status, counts, people, progress, or loadingDisplayProvides tags, badges, chips, avatars, messages, progress indicators, and skeletons.
Send an app-wide transient notificationNotificationsProvides one shared toast queue, an imperative API, and an optional app-wide toaster.

Choose the filtering surface by where its state belongs:

You want to…UseWhy
Filter individual table columnsColumn filtersA column can use the built-in ColumnFilterMenu; the menu keeps draft changes until Apply.
Search configured fields in a DataPageDataPage.globalFilterFieldsAdds global search over the rows in the currently loaded query page.
Present option, numeric-range, or custom filter groupsFilterPanelSupplies a standalone faceted panel while the host owns how its filter state applies to the data view.

Table column and DataPage global filters operate on the currently loaded query page. Filtering the complete result set belongs in query arguments and server logic before paging; see DataPage filtering scope.

Use ActionMenubar or an ordinary product action row for flat page commands. DataPage’s built-in toolbar already renders ActionMenubar, not Toolbar — that is the default action row for a page, not a canvas tool palette. Use Toolbar only for a genuine canvas/tool-palette interaction with active tools, groups, slots, folders, and fan-out panels. It is not a one-for-one replacement for a generic Prime Toolbar, and it is not a page-level action row wearing a different name.

Structured data, history, and conversation

Section titled “Structured data, history, and conversation”
You want to…UseWhy
Explore or edit an object through a JSON SchemaObjectContentEditorRenders schema-aware properties and navigation through nested objects and arrays.
Create or edit a supported JSON SchemaSchemaEditorEdits properties, supported types, and formats in a validated table interface.
Add controlled breadcrumbs to hierarchical dataObjectNavigationalBarRenders a host-owned navigation path with breadcrumb and back actions.
Explore supplied versions, events, and state changesTimeMachineProvides an interactive timeline while the host supplies the version data.
Build topic-based conversations from host-owned dataChatProvides topic, conversation, mention, emoji, and message-action surfaces with callback outputs.

Use Canvas for a pan/zoom workspace containing positioned DOM or Pixi items, optional minimap/controls, notes, regions, or collaborative chat shapes, or PivotViewer for a faceted, zoomable card grid over a large dataset. Both belong to the Spatial capability profile and install the optional pixi.js peer — see UI foundation: Optional Pixi, clean no-Pixi core. Spatial ships at the same version and quality bar as every other component; the profile label describes what it is for and what it costs to adopt, not a lower support tier.

Canvas and PivotViewer own interaction and rendering primitives; the application owns persistence and behavior. Arc can provide commands, queries, validation, authorization, and generated bindings on its own. Applications using Arc plus Chronicle can additionally project event streams into read models — neither component has a direct Chronicle dependency; see the UI foundation capability matrix.

A typical CRUD screen combines these: a DataPage lists the rows, a toolbar button opens a CommandDialog to add one, and selecting a row opens another CommandDialog to edit it. That whole screen is the list screen with actions recipe.

Components does not ship every toolkit widget. Tabs, general-purpose sidebars, knobs, select-button groups, general popovers, grouped or expandable tables, controlled lazy/server table sorting, and specialized locale-aware inputs remain product-owned or in a separately configured UI toolkit. See Coming from PrimeReact for the current replacement boundaries.

Still deciding how to style any of this? See Styling.