How one record renders as a list card — the mobile answer to Filament's
data table. Laravel derives a default from the table columns; a resource
may override any slot. Every slot is optional: a card with only a title is
a valid list tile.
ColorPicker. The panel declares one of four string formats via
->hex()/->hsl()/->rgb()/->rgba() — getFormat() is the ONLY
accessor ColorPicker exposes (measured in vendor/filament/forms/src/
Components/ColorPicker.php), and the value on the wire is a plain string
in that format. This client never converts it to another one: an rgb
field gets rgb back, byte for byte, everywhere it did not itself edit
the text.
A file upload field. readOnly defaults to true so an older server
that never publishes the key — meaning it predates upload support
entirely — reads as inert rather than a renderer guessing it can accept
one. A current server publishes false for a writable field, single or
multiple.
One geographic point. Numeric strings are accepted because the upstream
Filament plugin documents and stores that shape; the mobile client always
exposes numbers and sends numbers back.
One file from Spatie's medialibrary — the client's read of an entry in
the <field>.__media sibling a medialibrary-backed field publishes
alongside its raw value (a media-uuid string, or a list of them for a
multi-file field). The raw value is what a form submits back; this is
what a screen renders.
One relation manager published for a resource: a related list of records
rendered as cards, e.g. a banner's tags. Absent from the contract entirely
on a server predating P6d — that reads as no relations, not an error.
A resource's drag-to-reorder capability (P18) — present on
ResourceSchema.reorder if and only if the web panel's table declared a
non-pivot reorder column and authorized this user for it. See
contract/README.md's "Reordering" section for the full server contract.
The web sidebar's count badge for one resource — the value is whatever
string the panel renders (usually a count), the colour the same semantic
vocabulary card badges use (success, warning, …).
What the authenticated user may do with a resource, as decided by the
Laravel policies. Every flag denies by default: a missing key must never
read as permission.
One Filament resource, rendered as a list of cards plus create/edit/view
pages. Construct it directly for a Dart-defined override, or via
ResourceSchema.fromJson for the server-served schema — same class, same
renderer, one code path.
The attrs a node in the closed vocabulary carries: textAlign on
paragraph/heading, level on heading, src on image. All three
live on one small value type rather than a RichNode subclass per node
kind, since no node carries more than one of them.
A parsed rich-text document — the client's read of the ProseMirror tree
TipTap/Filament's RichContentRenderer publishes as <path>.__rich.doc,
alongside the flattened <path>.__rich.text a card reads instead
(design spec, "Wire shape"). The sibling is absent entirely when there is
nothing to convert — absence means unavailable, and every consumer falls
back to the raw string; that fallback happens above this parser, which
only ever sees a sibling that exists.
A mark applied to a text node — bold, italic, link, strike,
underline or code. Only link carries an attribute in the closed
vocabulary (design spec), so href is the one typed extra rather than a
generic bag.
One node of the ProseMirror tree: doc, paragraph, text, heading,
bulletList, orderedList, listItem, blockquote, horizontalRule,
image — or a type this build does not recognise, carried through by its
raw string rather than rejected (see RichDocument's doc).
slider. min/max/step are presentation bounds for the control; the
enforceable half of the same declaration already arrives as the node's
ordinary rules (required/numeric/min/max, which Filament's
Slider force-registers server-side), so client-side validation needs no
slider-specific machinery at all.
toggle_buttons. Carries the same flattened option shape select/radio
publish (SelectOption), but never an optionsUrl — the type has no
search affordance server-side, so an over-cap field inlines its full list
and this client renders however many options arrive.
Client-side hints for immediate feedback only. The server revalidates
every submission, so anything not expressible here is simply omitted
rather than approximated.