* Move lwr site SKILL.md * Move bootstrap-template-byo-lwr.md * Move configure-content-brandingSet.md * Move configure-content-route.md * Move configure-content-themeLayout.md * Move configure-content-view.md * Move configure-guest-sharing-rules.md * Move handle-component-and-region-ids.md * Move handle-ui-components.md * Create react site SKILL.md * Create configure-metadata-custom-site.md * Create configure-metadata-digital-experience-bundle.md * Create configure-metadata-digital-experience-config.md * Create configure-metadata-digital-experience.md * Create configure-metadata-network.md --------- Co-authored-by: Hemant Singh Bisht <hsinghbisht@salesforce.com>
6.6 KiB
UI Component Handling
Use when adding/configuring components to be used in Experience site.
Component Insertion
Insert custom Lightning Web Components (LWC) into views.
What is a Custom Component?
Any LWC in c namespace (e.g., c:heroBanner). Distinct from OOTB components (e.g., community_builder:htmlEditor).
Prerequisites for Custom LWC
js-meta.xml Requirements:
<isExposed>true</isExposed>- Targets:
lightningCommunity__Page,lightningCommunity__Default
Property Type Constraints (MANDATORY GATE):
- Supported: String, Integer, Boolean, Color, Picklist
- Unsupported: Any other type → STOP immediately
- Do NOT delete, comment, or auto-correct
- Advise user to set up Custom Property Editor (CPE) or Custom Property Type
- Type Mismatch:
type="Number"→ change totype="Integer"in js-meta.xml
Do not proceed until LWC files are compliant or user advised on CPE/CPT.
Placement Hierarchy
NEVER place components directly in top-level regions. Must nest inside community_layout:section → column region.
community_layout:sldsFlexibleLayout (root)
└── region (content/header/footer)
└── community_layout:section
└── region (column: col1/col2)
└── component(s)
Column Width & Layout
12-unit grid: Column widths sum to 12 per section.
Width Formats:
- Grid units: 8 + 4
- Percentages: 66% + 33% → 8 + 4; 50% + 50% → 6 + 6
- Ratios: 2:1 → 8 + 4; 1:1 → 6 + 6; equal thirds → 4 + 4 + 4
Layout Rules:
- One section = one horizontal row
- Multiple rows = multiple sections (siblings)
- Multiple components in column = vertical stack
Set width in sectionConfig (JSON string attribute on section component).
sectionConfig Structure
Top-level (when parsed):
UUID: Section ID (matches section component'sid)columns: Array of column definitions
Each column:
UUID: Column ID (matches column region'sid)columnKey: Column identifier (e.g.,col1,col2) - matches column region'snamecolumnName: Display name (e.g., "Column 1")columnWidth: String from"1"to"12"(must sum to 12)seedComponents: Array ornull(typically[]ornull)
Example (serialized as JSON string in sectionConfig attribute):
{
"UUID": "295e6a8b-fd94-485b-af9d-7ccf5b3048ee",
"columns": [
{
"UUID": "7e1f7e33-5ba8-4fef-8494-6ea3e90b22a0",
"columnKey": "col1",
"columnName": "Column 1",
"columnWidth": "12",
"seedComponents": null
}
]
}
Named Region Creation
In order to create a component with drag-n-droppable region/slot that can be used in Experience Builder sites and persist across views, there are multiple steps needed.
Page layout components should add the lightningCommunity__Page_Layout target in js-meta.xml. Theme layout components should add the lightningCommunity__Theme_Layout target in js-meta.xml. Add lightningCommunity__Page as a target for page layouts and any component with slots that is not explicitly defined as a theme layout.
The js file in LWC need to declare named slots:
/**
* @slot header
* @slot footer
*/
export default class YourComponentName extends LightningElement {}
Do not add any other comments in the declaration comment block. The named @slot annotations must be the last comments in the block before the class declaration.
In html, named slots are needed. and in the above example.
For theme layout component, a with no name is the main content region, a slot with name is a sticky region that doesn't change from page to page that uses the same theme layout component.
No need to declare target config properties for the slots/regions. See the example below for adding a component with named slots into a view.
Component Structure
{
"id": "[UNIQUE_UUID]",
"type": "component",
"definition": "[NAMESPACE]:[COMPONENT_NAME]",
"attributes": {
"[ATTRIBUTE_NAME]": "[ATTRIBUTE_VALUE]"
}
}
Field Definitions:
id: Unique UUID (seehandle-component-and-region-ids.md)type: Always"component"definition:- Custom LWC:
c:[componentName](e.g.,c:heroBanner) - OOTB:
[namespace]:[componentName](e.g.,community_builder:richTextEditor)
- Custom LWC:
attributes: Component properties- Omit if no attributes (don't include empty object)
- Custom LWC: Only
@apiproperties intargetConfigs(withlightningCommunity__Defaulttarget) - OOTB: Only exposed schema properties
Complete Examples
Example 1: Overall structure
Correct nesting: content region → section → column region → components
{
"type": "region",
"name": "content",
"children": [
{
"attributes": {
"sectionConfig": "{\"UUID\":\"295e6a8b-fd94-485b-af9d-7ccf5b3048ee\",\"columns\":[{\"UUID\":\"7e1f7e33-5ba8-4fef-8494-6ea3e90b22a0\",\"columnName\":\"Column 1\",\"columnKey\":\"col1\",\"columnWidth\":\"12\",\"seedComponents\":null}]}"
},
"children": [
{
"children": [
{
"definition": "c:testComponent",
"id": "2ae498bd-2871-487d-8fb1-b186376cee3b",
"type": "component"
},
{
"id": "7c7d3b6a-1e2f-4a33-9c1e-8b2a6d5f4e3b",
"type": "component",
"definition": "c:helloWorld",
"attributes": {
"title": "Hello"
}
}
],
"id": "7e1f7e33-5ba8-4fef-8494-6ea3e90b22a0",
"name": "col1",
"title": "Column 1",
"type": "region"
}
],
"definition": "community_layout:section",
"id": "295e6a8b-fd94-485b-af9d-7ccf5b3048ee",
"type": "component"
}
]
}
CRITICAL: Follow UUID generation process (handle-component-and-region-ids.md) when inserting components.
Example 2: Representing slots If a component with slots (i.e. @slot annotation) is inserted, slots must appear as named regions. In this example the component threeColumn has 3 slots, named left, center, and right.
{
"attributes" : { },
"children" : [ {
"id" : "4c6148c7-c07e-4245-ae50-ac07891046f2",
"name" : "left",
"title" : "left",
"type" : "region"
}, {
"id" : "f362e789-7f09-40b4-a59f-03f76ea73401",
"name" : "center",
"title" : "center",
"type" : "region"
}, {
"id" : "2678ddd4-a1a4-41c4-bf5a-1a3e55891eb2",
"name" : "right",
"title" : "right",
"type" : "region"
} ],
"definition" : "c:threeColumn",
"id" : "b9e517c5-90ac-49e9-91b7-3730512c95a3",
"type" : "component"
}