Form card: an optional heading row (title, subtitle, a status line and a trailing slot), a responsive column grid for the fields, and an action bar. Children of the default slot lay out in the grid; give a child data-span="full" to span every column. Dirty tracking and autosave wiring are per app; this is the visual contract.
Fields lay out in the column grid; data-span="full" spans every column. The action bar slots in as actions, and a status line inside it sits at the start of the bar.
header-end sits at the end of the heading row, after any status line, the way sui-card places its own: a status pill, or a small action such as an edit button. The row renders for it alone, with no heading.
suiPrimary and suiSecondary fire on the click, whether or not the browser then accepts a submit. primary-loading shows the spinner while a save is in flight and suppresses suiPrimary.
primary-disabled greys the Save button while there is nothing to save, and hide-secondary drops the outline button for a bar with one action. Both are live, so a field edit can arm the bar and a finished save can disarm it.
state and time are live: a record editor writes them as a save runs and the line changes without moving focus, which the polite live region then announces. time is read only on the saved line, and with no time the line reads "Saved just now" in the language of the page.
Card title (the reference title prop; renamed for the native attribute).
subtitle
subtitle
stringstring | undefined
Muted line under the heading.
Slots
Slot
Description
(default)
Fields, laid out in the column grid. data-span="full" spans all columns.
actions
The action bar, typically sui-form-actions.
header-end
Trailing content in the heading row, after the status: a status pill or a small action, placed the way sui-card places its own. The row renders when this slot, status or heading has content.
status
Status line in the heading row, typically sui-save-status.
<sui-form-actions>
Properties
Property
Attribute
Type
Default
Description
form
form
stringstring | undefined
Id of the form both buttons act on, for a bar that sits outside the <form> element: the sticky case, a dialog footer, and any layout where the card is not itself the form. The id of a sui-form host works as it is: the bar finds the native form the element renders inside it. A <form id="customer"> of your own is named the same way.
hideSecondary
hide-secondary
boolean
false
Hides the secondary button.
primaryDisabled
primary-disabled
boolean
false
Disables the primary button (e.g. nothing to save).
primaryLabel
primary-label
stringstring | undefined
Primary (brand) button label. Verb-first.
primaryLoading
primary-loading
boolean
false
Shows the primary button in its loading state while a save is in flight.
primaryType
primary-type
"button" | "submit"
'button'
Native type of the primary button. submit makes it the form's submitter: the browser validates the fields, focuses and messages the first invalid one, and blocks the submit. The default button leaves the save to suiPrimary.
secondaryLabel
secondary-label
stringstring | undefined
Secondary (outline) button label.
secondaryType
secondary-type
"button" | "reset"
'button'
Native type of the secondary button. reset restores every field to the value it mounted with; the default button leaves the cancel to suiSecondary.
sticky
sticky
boolean
false
Pin the bar to the bottom of its scroll container.
Events
Event
Detail
React
Vue
Description
suiPrimary
void
onSuiPrimary
@sui-primary
Fires when the primary button is clicked, even when the browser then refuses the submit as invalid. Listen to the form's own submit event for the validated path.
suiSecondary
void
onSuiSecondary
@sui-secondary
Fires when the secondary button is clicked.
Slots
Slot
Description
status
Status line on the left, typically sui-save-status.
When the record was saved, in the page's language, e.g. "2 min ago". The saved line reads "Saved 2 min ago"; without it, "Saved just now".
Types
SuiSaveStatetype
No members.
Theming
Every design token this element can render with, read from its own stylesheets and the ones it imports. Set a token on :root or on any ancestor and every use below follows it. The values shown are the ones in the theme you are viewing. The list is read per stylesheet, so an element that imports a shared drawing module lists that module's tokens too, whether or not it paints with all of them.