Using Lightning Base Components
Lightning Base Components (LBC) are the lightning-* web components shipped
by Salesforce. This skill routes an agent through the right decision sequence
so the final component choice is as specific as possible and backed by
real API docs — not a hand-rolled reimplementation of something that already
exists.
When to Use This Skill
- User describes a UI need ("searchable dropdown", "record edit form",
"modal with footer") and asks which
lightning-* component fits.
- User is about to build a primitive (button group, combobox, toast) and
should be using LBC instead.
- User asks you to review LWC markup for LBC-related issues — specifically
overriding SLDS classes or restyling LBC internals.
- User needs the authoritative props/events/slots for a specific
lightning-* tag.
Prerequisites
- Knowledge of which LBC namespace your org uses (
lightning is the default
public namespace; some platforms expose lightning-community or others —
the user's meta files will clarify).
- The skill ships authoritative API docs for every Lightning Base Component
in references/lightning-components.md.
Each component is a
# Component API Structure block; grep for
**Name:** <camelCaseName> (e.g. **Name:** datatable) to jump to its
Properties / Methods / Events / Slots. Read this rather than relying on
cached knowledge — LBC evolves and the reference is the source of truth.
Workflow
Step 1 — Read the entire component index first
Open lightning-component-index.md
and scan all entries before making any selection. This is non-negotiable:
LBC's value comes from picking the most specialized component, and skipping
the scan leads to reinventing compound widgets out of primitives.
As you scan, compile a candidate list — every component whose description
touches any aspect of the use case. Do not filter or rank yet.
Step 2 — Narrow to the most specific fit per feature
Once the scan is complete:
- For each feature in the use case, select the most specific component
that covers it. Prefer a specialized compound (
lightning-record-form,
lightning-tabset, lightning-datatable) over a generic primitive
(lightning-input, lightning-button) when the specialized one covers
the scenario end-to-end.
- Avoid duplication: if
lightning-record-form already renders fields for a
record, do not pair it with lightning-input-field unless you're
explicitly overriding behavior.
Step 3 — Share the shortlist and confirm
Present the final shortlist to the developer with a one-line rationale per
component. Wait for explicit confirmation before pulling full API docs. This
prevents the agent from burning context on components the developer has
already mentally ruled out.
Step 4 — Retrieve full API docs
Once confirmed, use the bundled helper to pull the exact API blocks — this
avoids ad-hoc grepping across a large reference:
scripts/extract-component-docs.sh <camelCaseName> [<camelCaseName>...]
Convert lightning-<foo> tags to camelCase (no lightning- prefix):
lightning-datatable → datatable
lightning-record-edit-form → recordEditForm
lightning-button-icon → buttonIcon
Each returned block has the same shape: Basic Information (tag, namespace,
type), Properties (name, type, default, description), Methods,
Events, Slots, and (where applicable) usage notes. This skill is about
picking the components; the bundled reference is about wiring them.
Step 5 — Produce integration guidance
Using the per-component reference, walk the developer through:
- The exact
<lightning-...> tag and required attributes.
- Which events to bind (
onchange, oncommit, onsuccess, …) and what
the event payload contains.
- Any slots to fill (headers, footers, custom content).
- Known constraints from the component docs (e.g.
lightning-record-form
requires object-api-name and record-id for edit/view modes).
Step 6 — Respect LBC styling rules
Do not override SLDS classes on LBC internals. See
lbc-expert-guidance.md for specifics.
Common issues:
- Targeting
.slds-button or .slds-input in the host component's CSS to
restyle an LBC — LBC ships inside a shadow root, so these selectors
either leak into sibling components or get stripped entirely. Use the
component's documented styling hooks (--sds-c-button-*, etc.) instead.
- Wrapping an LBC just to mutate its internal markup. You can't — the
markup is hidden behind the shadow root. If the component doesn't expose
the slot/prop you need, that's a platform-level gap, not a restyling job.
Examples
Example — "I need a multi-select combobox with typeahead"
- Scan the component index end-to-end.
- Candidate list includes:
lightning-combobox, lightning-dual-listbox,
lightning-record-picker.
- Shortlist:
lightning-dual-listbox (the documented multi-select base
component). Rule out lightning-combobox — its documented API is
single-select; it has no type="multi" and no multi-select mode.
Flag that lightning-record-picker only fits if the values are record IDs.
- Developer confirms
lightning-dual-listbox.
- Run
scripts/extract-component-docs.sh dualListbox.
- Return the
options, value, onchange payload, and required label
props from the block's Properties / Events sections.
Example — "I'm going to write my own modal"
- Scan finds
lightning-modal, lightning-modal-body,
lightning-modal-footer, lightning-modal-header.
- Shortlist is the 4 modal components.
- Confirm.
- Run
scripts/extract-component-docs.sh modal modalHeader modalBody modalFooter
→ full modal API (how to extend LightningModal, the static .open()
pattern, slotting the header/body/footer).
- Steer the developer away from rolling their own dialog.
Verification Checklist
Troubleshooting
- Grep for
**Name:** <name> returns no match — name is wrong, or the
reference uses a different camelCase. Double-check against the component
index (lightning-record-form → recordForm,
lightning-record-view-form → recordViewForm,
lightning-button-icon → buttonIcon).
- Proposed component doesn't have the prop you expected — trust the
real API doc over memory. LBC evolves; cached knowledge lies.
- Developer resists the shortlist — don't skip Step 4. Still retrieve
the docs for the developer's preferred choice so they see the actual
trade-offs.
- Developer wants to restyle LBC internals — redirect to styling hooks
(see the LBC Expert reference). Refusing shadow DOM penetration is the
correct answer.
1---
2name: experience-lwc-base-components-integrate
3description: "Pick the right Lightning Base Component (`lightning-*`) for a given UI task, retrieve its full API (props, methods, events, slots) from the bundled per-component reference, and wire it into an LWC (LWC `.html`, `.js`, and `.css` files) without breaking SLDS. Use this skill when users say \"I need a Lightning modal / datatable / combobox / record form\", ask which `lightning-*` component fits a use case, want a shortlist of LBC candidates, are about to hand-roll a UI that a base component already provides, or are editing an LWC bundle's `.html` / `.js` / `.css` and need to select or wire a base component. Also triggers on \"Lightning base component\", \"LBC\", \"lightning-combobox\", \"lightning-datatable\", \"use `lightning-` tag\". DO NOT TRIGGER for applying SLDS design tokens, blueprints, or styling guidance in general — that is `design-systems-slds-apply`; this skill only selects and wires `lightning-*` base components."
4metadata:
5 version: "1.0"
6 domains: ["Experience"]
7 relatedSkills:
8 - design-systems-slds-apply
9---
10
11<!-- adk-managed-skill -->
12
13# Using Lightning Base Components
14
15Lightning Base Components (LBC) are the `lightning-*` web components shipped
16by Salesforce. This skill routes an agent through the right decision sequence
17so the final component choice is **as specific as possible** and backed by
18real API docs — not a hand-rolled reimplementation of something that already
19exists.
20
21## When to Use This Skill
22
23- User describes a UI need ("searchable dropdown", "record edit form",
24 "modal with footer") and asks which `lightning-*` component fits.
25- User is about to build a primitive (button group, combobox, toast) and
26 should be using LBC instead.
27- User asks you to review LWC markup for LBC-related issues — specifically
28 overriding SLDS classes or restyling LBC internals.
29- User needs the authoritative props/events/slots for a specific
30 `lightning-*` tag.
31
32## Prerequisites
33
34- Knowledge of which LBC namespace your org uses (`lightning` is the default
35 public namespace; some platforms expose `lightning-community` or others —
36 the user's meta files will clarify).
37- The skill ships authoritative API docs for every Lightning Base Component
38 in [references/lightning-components.md](references/lightning-components.md).
39 Each component is a `# Component API Structure` block; grep for
40 `**Name:** <camelCaseName>` (e.g. `**Name:** datatable`) to jump to its
41 Properties / Methods / Events / Slots. Read this rather than relying on
42 cached knowledge — LBC evolves and the reference is the source of truth.
43
44
45## Workflow
46
47### Step 1 — Read the **entire** component index first
48
49Open [lightning-component-index.md](references/lightning-component-index.md)
50and scan **all** entries before making any selection. This is non-negotiable:
51LBC's value comes from picking the most specialized component, and skipping
52the scan leads to reinventing compound widgets out of primitives.
53
54As you scan, compile a **candidate list** — every component whose description
55touches any aspect of the use case. Do not filter or rank yet.
56
57### Step 2 — Narrow to the most specific fit per feature
58
59Once the scan is complete:
60
61- For each feature in the use case, select the **most specific** component
62 that covers it. Prefer a specialized compound (`lightning-record-form`,
63 `lightning-tabset`, `lightning-datatable`) over a generic primitive
64 (`lightning-input`, `lightning-button`) when the specialized one covers
65 the scenario end-to-end.
66- Avoid duplication: if `lightning-record-form` already renders fields for a
67 record, do not pair it with `lightning-input-field` unless you're
68 explicitly overriding behavior.
69
70### Step 3 — Share the shortlist and confirm
71
72Present the final shortlist to the developer with a one-line rationale per
73component. Wait for explicit confirmation before pulling full API docs. This
74prevents the agent from burning context on components the developer has
75already mentally ruled out.
76
77### Step 4 — Retrieve full API docs
78
79Once confirmed, use the bundled helper to pull the exact API blocks — this
80avoids ad-hoc grepping across a large reference:
81
82```bash
83scripts/extract-component-docs.sh <camelCaseName> [<camelCaseName>...]
84```
85
86Convert `lightning-<foo>` tags to camelCase (no `lightning-` prefix):
87
88- `lightning-datatable` → `datatable`
89- `lightning-record-edit-form` → `recordEditForm`
90- `lightning-button-icon` → `buttonIcon`
91
92Each returned block has the same shape: **Basic Information** (tag, namespace,
93type), **Properties** (name, type, default, description), **Methods**,
94**Events**, **Slots**, and (where applicable) usage notes. This skill is about
95**picking** the components; the bundled reference is about **wiring** them.
96
97### Step 5 — Produce integration guidance
98
99Using the per-component reference, walk the developer through:
100
101- The exact `<lightning-...>` tag and required attributes.
102- Which events to bind (`onchange`, `oncommit`, `onsuccess`, …) and what
103 the event payload contains.
104- Any slots to fill (headers, footers, custom content).
105- Known constraints from the component docs (e.g. `lightning-record-form`
106 requires `object-api-name` and `record-id` for edit/view modes).
107
108### Step 6 — Respect LBC styling rules
109
110Do not override SLDS classes on LBC internals. See
111[lbc-expert-guidance.md](references/lbc-expert-guidance.md) for specifics.
112Common issues:
113
114- Targeting `.slds-button` or `.slds-input` in the host component's CSS to
115 restyle an LBC — LBC ships inside a shadow root, so these selectors
116 either leak into sibling components or get stripped entirely. Use the
117 component's documented styling hooks (`--sds-c-button-*`, etc.) instead.
118- Wrapping an LBC just to mutate its internal markup. You can't — the
119 markup is hidden behind the shadow root. If the component doesn't expose
120 the slot/prop you need, that's a platform-level gap, not a restyling job.
121
122
123## Examples
124
125### Example — "I need a multi-select combobox with typeahead"
126
1271. Scan the component index end-to-end.
1282. Candidate list includes: `lightning-combobox`, `lightning-dual-listbox`,
129 `lightning-record-picker`.
1303. Shortlist: `lightning-dual-listbox` (the documented multi-select base
131 component). Rule out `lightning-combobox` — its documented API is
132 single-select; it has no `type="multi"` and no multi-select mode.
133 Flag that `lightning-record-picker` only fits if the values are record IDs.
1344. Developer confirms `lightning-dual-listbox`.
1355. Run `scripts/extract-component-docs.sh dualListbox`.
1366. Return the `options`, `value`, `onchange` payload, and required label
137 props from the block's Properties / Events sections.
138
139### Example — "I'm going to write my own modal"
140
1411. Scan finds `lightning-modal`, `lightning-modal-body`,
142 `lightning-modal-footer`, `lightning-modal-header`.
1432. Shortlist is the 4 modal components.
1443. Confirm.
1454. Run `scripts/extract-component-docs.sh modal modalHeader modalBody modalFooter`
146 → full modal API (how to extend `LightningModal`, the static `.open()`
147 pattern, slotting the header/body/footer).
1485. Steer the developer away from rolling their own dialog.
149
150
151## Verification Checklist
152
153- [ ] The full component index was scanned before any selection (no
154 keyword-search shortcutting).
155- [ ] Candidate list included every component that touches the use case.
156- [ ] Final shortlist selects the **most specific** component per feature.
157- [ ] Developer confirmed the shortlist before the bundled component
158 reference was opened.
159- [ ] Integration guidance cites props / events / slots from the real API
160 docs (not inferred).
161- [ ] No suggestions to restyle LBC by overriding SLDS classes.
162
163
164## Troubleshooting
165
166- **Grep for `**Name:** <name>` returns no match** — name is wrong, or the
167 reference uses a different camelCase. Double-check against the component
168 index (`lightning-record-form` → `recordForm`,
169 `lightning-record-view-form` → `recordViewForm`,
170 `lightning-button-icon` → `buttonIcon`).
171- **Proposed component doesn't have the prop you expected** — trust the
172 real API doc over memory. LBC evolves; cached knowledge lies.
173- **Developer resists the shortlist** — don't skip Step 4. Still retrieve
174 the docs for the developer's preferred choice so they see the actual
175 trade-offs.
176- **Developer wants to restyle LBC internals** — redirect to styling hooks
177 (see the LBC Expert reference). Refusing shadow DOM penetration is the
178 correct answer.