definePageLayout() to declare a layout for an object you own, or definePageLayoutTab() to add a single tab to a layout that already exists (yours or a standard Diex one).
definePageLayout
Use this when you own the entire detail page — typically for a custom object you defined yourself.src/page-layouts/example-record-page-layout.ts
Key points
typeis one of'RECORD_INDEX','RECORD_PAGE','DASHBOARD'or'STANDALONE_PAGE'. Use'RECORD_PAGE'to customize the detail view of a specific object.objectUniversalIdentifierspecifies which object this layout applies to.- Each
tabdefines a section of the page with atitle,position, andlayoutMode:VERTICAL_LISTfor record pages and standalone pages,GRIDfor dashboards. In aVERTICAL_LISTtab, a single widget renders full-bleed and owns the whole tab; with several widgets they stack as cards. AGRIDtab always lays its widgets out as cards on a 12-column grid, whatever their number, so pickVERTICAL_LISTwhen you want one widget to fill the page. - Set
layoutModeexplicitly. Omitting it gives youVERTICAL_LISTon aSTANDALONE_PAGEandGRIDeverywhere else, which is rarely what you want on a record page. - Each
widgetinside a tab can render a front component, a relation list, or other built-in widget types. positionon tabs controls their order. Use higher values (e.g., 50) to place custom tabs after built-in ones.
Field widgets
AFIELD widget renders one field of the record. For relation fields it can also embed a list of related records:
fieldMetadataIdtakes the universal identifier of a field on the layout’s object.fieldDisplayModeis one of'FIELD','CARD','EDITOR','VIEW'or'TABLE'.TABLEembeds a view listing the records of a one-to-many relation field.nestedRelationFieldMetadataIdis optional and takes the universal identifier of a one-to-many relation field on the relation target object, to list records two relation hops away (e.g. a Company page listing the opportunities of the company’s people, or a Person page listing the opportunities of the person’s company). The first hop can be a one-to-many or a many-to-one relation field, the second must be one-to-many (junction relations are not supported), and it requiresfieldDisplayMode: 'TABLE'— combining it with any other display mode is a validation error, since a nested widget always renders as an embedded view.
definePageLayoutTab
Use this when you only want to add a tab to an existing layout — for example, an analytics tab on the standard Company page, or an AI summary tab attached to your own object’s layout.src/page-layouts/example-extra-tab.ts
Key points
-
pageLayoutUniversalIdentifieris required and must point to a page layout that already exists at install time — either a standard Diex layout or one defined by your own app. Cross-app references to layouts owned by another installed app are not supported today. When the parent layout is missing, installation fails with a clear validation error. -
For standard Diex layouts, import identifiers from
diex-sdk/define:Each layout entry also exposes itstabsand theirwidgets, so you can reference any level:A short aliasSTANDARD_PAGE_LAYOUTis also available: -
widgetsare scoped to this tab only — they reference front components, views, etc. exactly like widgets defined inline indefinePageLayout. -
positioncontrols ordering against existing tabs on the targeted layout. Pick a value that places your tab where you want it relative to built-in tabs. -
Use this instead of
definePageLayoutwhen you only want to add to an existing layout. UsedefinePageLayoutwhen you own the entire layout.