You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(record): declare inputs for the seven configurable record:* blocks, and curate six (#3027)
Seven record:* blocks shipped with renderers that read props but declared no
inputs. That combination is the worst of both: the renderer honours `limit`,
`severity`, `location` …, while every authoring surface — the designer panel,
the AI vocabulary, the generated manifest — reports the block takes no
configuration. #3013 recorded them as deliberately uncurated for exactly that
reason.
The declarations mirror what each renderer actually reads:
record:activity 11 from RecordActivityComponentProps
record:chatter 5 from RecordChatterComponentProps
record:discussion 5 (same renderer, same inputs)
record:alert 8 severity, title, body, visible, icon, action,
dismissible, dismissKey
record:quick_actions 7 actionNames, requiredPermissions, location, align,
inline, variant, size
record:history 3 limit, emptyText, unknownUserText
record:reference_rail 1 hideEmpty
inputs describe what an AUTHOR writes, which is a subset of what the renderer
reads. `entries`, `loading` and resolved `actions` are injected by the host
shell off RecordContext; declaring them would invite a model to hand-write the
data the page is supposed to fetch. `aria` is omitted for the reason it is
omitted on record:details — an accessibility escape hatch, not a layout choice.
`location` takes its enum from the spec's ACTION_LOCATIONS rather than
restating it, per #3019.
Six of the seven join PUBLIC_BLOCKS: configurable and absent from the contract
is the state #3006 was about. The contract goes 36 -> 42 tags, all resolving.
record:chatter stays out — same renderer as record:discussion under a
Salesforce-familiar name, kept for schemas already in the wild. Two spellings
of one block is ambiguity an authoring model cannot resolve, so the vocabulary
carries the spec's name. A test compares the two input lists, so the day they
diverge the exclusion stops being justified and fails.
A companion assertion requires every curated record:* tag to declare inputs. A
curated tag with none reads as "takes no configuration" when the renderer in
fact reads props — the same gap #3006 opened, pointed the other way.
Claude-Session: https://claude.ai/code/session_01N4mrr1ihhwnfEHFSWmGoMp
Co-authored-by: Claude <noreply@anthropic.com>
// `record:chatter` and `record:discussion` are the same renderer under two
318
+
// names. The spec prefers `discussion` for new Lightning-style record pages;
319
+
// `chatter` stays for Salesforce-familiar authors and for schemas already in
320
+
// the wild. Both carry the same inputs — an author who reaches for either gets
321
+
// the same configuration surface.
322
+
constCHATTER_INPUTS: ComponentInput[]=[
323
+
{name: 'position',type: 'enum',label: 'Position',enum: ['bottom','right','left'],defaultValue: 'bottom',description: 'Where the panel docks relative to the record body'},
324
+
{name: 'width',type: 'string',label: 'Width',description: 'Panel width as a CSS value (side positions only)'},
{name: 'actionNames',type: 'array',label: 'Actions',description: 'Action names to expose, in order (else every action declared for the object at this location)'},
370
+
{name: 'requiredPermissions',type: 'array',label: 'Required Permissions',description: 'Hide the whole bar unless the user holds these permissions'},
371
+
// Derived from the spec's own vocabulary rather than restated — #3019.
372
+
{name: 'location',type: 'enum',label: 'Location',enum: [...ACTION_LOCATIONS],defaultValue: 'record_header',description: 'Which declared action location this bar renders'},
0 commit comments