Elementor Pro V4 — Visual Builder Skill
How to Use This Skill
This file covers the V4 panel structure and decision rules. Detailed references are in:
- references/panel.md — Full tab/widget/field reference, Variables Manager, Class Manager
- references/classes.md — Class system, variable naming, how many to create, state variants
- references/patterns.md — Reusable layout patterns with panel instructions
- references/troubleshooting.md — Common problems and fixes
Read the relevant reference before giving panel instructions.
V4 vs V3: What Changed
V4 is a breaking change from V3 in several areas. Never suggest V3 patterns.
| Area | V3 | V4 |
|---|---|---|
| Primary layout widget | Container | Flexbox (atomic) |
| Secondary layout widget | Inner Container | Div block (atomic) |
| Panel tabs | Content / Style / Advanced | General / Style / Interactions — no Advanced tab |
| Class system | Limited | Class Manager — global reusable classes with 4 states |
| Design tokens | Not native | Variables Manager — CSS custom properties |
| Interactions | Basic | Native per-element, stackable, scroll-triggered |
| Typography | Text Editor widget | Paragraph (atomic) replaces Text Editor |
Critical: If you catch yourself writing "Advanced tab" or "Container widget" — stop. Those are V3. In V4: Style tab, Flexbox widget, and Interactions tab.
First Questions to Ask
Before giving panel instructions, clarify two things if not already known:
1. Are you using a dark/light mode theme switcher? If yes → all colors must use CSS variables. Hardcoded panel values won't respond to the theme toggle. If no → colors can be set directly in the panel. Variables are still recommended for global consistency but not required.
2. Do you have an existing class and variable system, or are we building one? If existing → ask for their variable names and class conventions before creating new ones. If building from scratch → create a logical system together. See references/classes.md for recommended starting sets and naming conventions.
Decision Hierarchy
Before suggesting ANY implementation, work through this order:
- Can existing classes handle it? Stack them. (
t-h2 + is-accent) - Can panel Style tab settings handle it? Use them as a LOCAL value.
- Can a CSS variable handle it? Reference it via the variable picker (ƒ icon).
- Does it need a new global class? Create in Class Manager, set properties via panel.
- Does it need a new variable? Create in Variables Manager.
- Does it absolutely need Custom Code? Stop and rethink — there is almost always a panel-first solution.
- If Custom Code is truly unavoidable: create a separate named snippet. Never add to the Design Tokens snippet.
Global class vs local: If a property will be reused on multiple elements → global class. If it's one-off → local.
Common AI Mistakes in Elementor V4
❌ Referencing the Advanced tab V4 has no Advanced tab. Properties live across General, Style, and Interactions tabs only. The Custom CSS field is at the bottom of the Style tab but should always be left empty.
❌ Suggesting inline CSS or custom CSS per widget Classes first, panel settings second. Custom CSS on individual widgets bypasses the class system and creates unmaintainable one-offs.
❌ Confusing Flexbox with Container
Container is the V3 widget. In V4, use Flexbox (in Atomic Elements). Different widgets, different behavior.
❌ Hardcoding hex colors when using a theme switcher If the project uses a dark/light mode toggle, all colors must use CSS variables. Hardcoded hex values won't respond to theme changes. If there is no theme switcher, colors can be set directly in the panel — ask first.
❌ Using fixed heights for layout
Use Flex child > Flex Size: custom (grow: 1) to fill available space. Fixed heights break responsive behavior.
❌ Using margins on children for even spacing Set gaps on the parent Flexbox. Use margins on specific children only for irregular spacing.
❌ Suggesting position: absolute for layout problems Most layout problems can be solved with Flex child settings. Absolute is a last resort.
❌ Assuming Laptop is a default breakpoint V4 ships with 3 breakpoints: Desktop, Tablet (1024px), Phone (767px). Laptop (1366px) is a custom breakpoint — useful to add, but not present by default.
❌ Assuming all items start without padding Some V4 widgets have a default padding of 10px. Always explicitly set padding to 0 if not needed, rather than assuming it starts at zero.
Instruction Format
Always give instructions in tab order: General → Style → Interactions. Never describe CSS — describe panel field names and values.
WIDGET: Flexbox
NAME: "Hero Content"
(This is what to type in the Structure panel label field)
GENERAL TAB:
HTML Tag: Section
ID: hero-content [only if needed for JS or anchor links]
STYLE TAB:
Classes: l-stack ← GLOBAL CLASS
Layout:
Display: Flex ← from class l-stack
Direction: Column ← from class l-stack
Justify: Center ← LOCAL
Align: Center ← LOCAL
Gap, Row: var(--spacing_md) ← LOCAL, use variable picker (ƒ)
Spacing:
Padding, Top: var(--spacing_xl) ← LOCAL
Padding, Bottom: var(--spacing_xl) ← LOCAL
Size:
Height: 90vh ← LOCAL
INTERACTIONS TAB:
1: Page load / Fade In / 750ms / delay 0ms
Labels:
← GLOBAL CLASS— property is set by the class, don't override locally← LOCAL— set directly in the panel for this element only← NEW CLASS [name]— create in Class Manager first, then applyuse variable picker— click the ƒ icon in the field, never type hex
Panel language, not CSS:
| ❌ CSS | ✅ Panel |
|---|---|
| "Set margin-top to auto" | Spacing > Margin > Top: auto ← LOCAL |
| "Add border-radius: 50%" | Border > Radius: 50px (link all corners) ← LOCAL |
| "Use position: absolute" | Position > Position: Absolute ← LOCAL |
| "Set display: flex" | Layout > Display: Flex ← from class or LOCAL |
Layer Architecture
Page
└── Flexbox "Section Wrap" ← outermost, always Flexbox
├── Flexbox "Section Content" ← primary layout container
│ ├── Flexbox "Group A" ← element grouping
│ │ ├── Heading "..."
│ │ └── Paragraph "..."
│ └── Flexbox "Group B"
│ └── Image "..."
└── Div block "Transition" ← decorative, non-structural
Structure panel naming: Every layer should be renamed in the Structure panel (right sidebar). Use descriptive names — not the widget default ("Flexbox 3"). The NAME field in instruction format above is what to type in the Structure panel rename field. Good examples: "Hero Wrap", "Nav Row", "Card Group", "Fold Crease". Clear layer names are essential for team collaboration and debugging.
Rules:
- Outermost section = always Flexbox (never Div block)
- Nesting limit: 4 levels maximum
- Space distribution: Flex child > Flex Size (grow), not fixed heights
- Even spacing: gaps on parent Flexbox
- Irregular spacing: margin on specific child only
Responsive System
Default V4 breakpoints: Desktop (base), Tablet (1024px), Phone (767px).
Laptop (1366px) is a recommended custom breakpoint — add via Elementor > Site Settings > Layout. Not present by default.
Desktop is always the base. Set all properties at desktop first, then switch the breakpoint selector in the panel header to override at smaller sizes. Overrides cascade down — a Tablet override applies to Phone unless Phone has its own explicit override.
CSS variables do not change per breakpoint. For responsive sizing without breakpoint overrides, use clamp() in Variables Manager. Example:
/* In Variables Manager — scales fluidly between 16px at 320px viewport and 24px at 1440px */
--spacing_section: clamp(1rem, 3vw, 1.5rem);
/* For font sizes */
--font_h1: clamp(2rem, 5vw, 4rem);
Use clamp for