Storefront Page Builder · QA Notes

Six components, seven control-panel gaps

Page testedABC-TEST / Cricket
Page URLapp.personacart.com/storefront/pages/3c97e831-a359-4a6e-8ff0-7a7a05abea8a/edit?storefront=075828e1-8939-4c19-a7da-7aaff18e9741
Accountsukhkmr19@gmail.com / Pass@1234567
Date2026-08-26
MethodLive reproduction, Inspector panel + DOM inspection
10
Gaps to fix
6
Confirmed working
1
Known limitation

01Rich text — format override

Gap
Size / List style apply to the whole block, not the selection

The Aa format-override button opens a popover with Size (Small/Medium/Large) and List style (Bulleted/Plain) controls. These act on the entire Rich text block, not on whatever text is currently selected — so a block that mixes a numbered list, a bulleted list, and plain paragraphs has no way to size or style each part independently.

IsSize and List style are block-wide settings in the Content-tab sidebar.
Should beSelection-scoped, like the rest of the rich-text toolbar (Bold, Italic, H2/H3, etc.) — apply only to the highlighted text, not the whole block.

Trigger button: button[aria-label="Edit text format (override active)"][data-slot="popover-trigger"], opens panel with role="radiogroup" aria-label="Rich text size" and role="radiogroup" aria-label="Rich text list style" alongside toolbar actions button[aria-label="Bold (⌘B)"] and button[aria-label="Italic (⌘I)"].

Size / List style panel disappears once mixed content exists

Once a block already contains more than one list style (e.g. a numbered list added below a bulleted list), the Size and List style section stops showing in the popover. Editing an existing mixed block gives no way back into these controls at all.

IsSize/List-style section vanishes from the popover as soon as the block has mixed list types.
Should beThe controls should never disappear — and once scoped to the selection (see above), this stops being an edge case, since each selection would carry its own size/list-style state.

Captured DOM: Inside inspector sidebar button[role="tab"]:has-text("CONTENT") → toolbar container lacks localized selection range state listener for div[data-slot="popover-content"].

02Avatar

Gap
Photo has no show/hide toggle

The Content tab exposes a Show name toggle and a Show role toggle, but the photo itself is not one of the three toggleable elements — it always renders.

IsName and role can be hidden independently. Photo cannot.
Should bePhoto, name, and role each get their own toggle — with a rule that at least one of the three stays on at all times, so the block can never render fully empty.

Captured Inspector DOM: label[data-slot="label"]:has-text("PHOTO") with input[data-slot="input"] and button[data-slot="button"]:has-text("Pick"). Below it: label:has-text("NAME") with toggle button[role="switch"][aria-label="Show name"] and label:has-text("ROLE·TITLE") with toggle button[role="switch"][aria-label="Show role"]. The photo control has no switch element.

03Badge

Gap
No custom color — tone presets only

Color is controlled by a Tone swatch row (5 fixed dots) and a Surface choice (Solid · brand bg / Tonal · tinted bg). There's no way to pick an arbitrary color — only the theme's predefined set.

Is5 preset tones, 2 surface styles. No swatch/hex input.
Should beA custom color picker alongside the tone presets, same as most other color controls in the builder.

Captured Inspector DOM: label:has-text("TONE") followed by 5 button[data-slot="button"][role="radio"] tone swatches + label:has-text("SURFACE") with div[role="radiogroup"] containing options Solid · brand bg and Tonal · tinted bg. No custom hex input or spectrum swatch picker present.

Highlight, tone, padding

Text highlight (label:has-text("HIGHLIGHT") with input[placeholder="Words to highlight"] and popover color picker), tone application, and padding all behave correctly.

04FAQ widget

Gap
No widget-level text alignment

Each FAQ item's question and answer can be aligned independently via their own per-field Aa controls — and that works. The parent FAQList widget has no equivalent: its Style tab offers only Surface / Border / Shadow & Effects / Opacity / Animation, nothing that aligns question+answer together across the whole list in one action.

IsAlignment set per field, per item — no list-wide control.
Should beA text-alignment control on the FAQ widget itself, matching what the individual FAQ item already offers, so both question and answer align together across every item at once.

Captured DOM: FAQ item has div[data-slot="collapsible-content"] with individual fields label:has-text("QUESTION") and label:has-text("ANSWER") each featuring button[aria-label="Format text: typography, color, alignment"]. In contrast, FAQListRoot on Style tab only exposes collapsible sections: SURFACE, BORDER, SHADOW & EFFECTS, OPACITY, ANIMATION, and SCROLL MOTION — no text alignment cluster.

05Row layout — "3 columns · equal"

Gap
Column count isn't enforced

Inspector reports Layout: 3 columns · equal, but the row on canvas held 5 heading children (1–2–3–4–5) side by side. Adding a child never stops at the declared column count — every new child just joins the same row.

Is"3 columns" is a label; nothing caps children at 3 or wraps the 4th into a new row.
Should beEither the 4th+ child starts a new row automatically, or the add-child action is blocked once 3 slots are filled — whichever matches the intended model for a fixed-column layout.

Captured DOM: Container · 3-col-equal (Row 6) inspector Layout tab: div[data-slot="collapsible-content"] shows STRUCTURE → LAYOUT: "3 columns · equal" and CARDS PER ROW: Default. The button:has-text("Add child") continues appending nodes into the slot array without wrapping or capacity limit.

06Icon

Gap
Same tone/color limitation as Badge

Color is restricted to the same preset tone system (e.g. primary / accent / muted) — no free color choice.

Captured DOM: label:has-text("LUCIDE ICON NAME") with div[data-slot="popover-trigger"]:has-text("Sparkles") and button[aria-label="Clear icon selection"]. Color is bound to global tone tokens without an independent custom hex picker.

Everything else

Icon swap, position within layout, size, circular background, and link behavior all work as expected. Full-bleed positioning has the same crop-dependent caveat noted for Image blocks generally — not a defect.

07Heading — Gradient text vs Highlight color (Issue 15)

Gap
Highlight color has no effect when Gradient Text is enabled

Inside the Heading component under Content settings, Gradient Text and Highlight are both exposed. When Gradient Text is enabled, the text receives the theme's gradient color. However, applying a Highlight color to the text has no visible effect — the background highlight color is completely ignored while Gradient Text is active. Disabling Gradient Text immediately causes the chosen highlight background to become visible again.

IsHighlight button remains enabled and clickable, but the applied background color is suppressed/hidden when Gradient Text is toggled on.
Should beEither the Highlight control should be disabled/greyed out when Gradient Text is ON to prevent misleading state, or both effects should render simultaneously.

Captured DOM: button[data-slot="popover-trigger"][aria-label="Highlight"] (Highlighter icon) and toggle button[role="switch"][aria-label="Gradient text"] with aria-checked="true".

08Image — Interaction & Click Action (Issue 17)

Gap
"Target Kind" option is redundant and locked

When an Image is selected under Content → Interaction, choosing a Click Action (URL, Page, Product, Collection, Anchor) exposes an additional Target Kind dropdown below it. Target Kind contains the exact same options but displays a locked status ("Locked by parent block") and cannot be changed independently.

IsA duplicate, locked Target Kind dropdown is rendered below Click Action with redundant values.
Should beRemove the redundant Target Kind field entirely since its value is already fully determined by Click Action.

Captured DOM: label:has-text("Target kind") + span[title="Locked by parent block"] with lock icon + select[disabled] containing duplicate options: url, page, product, collection, anchor.

09Image — Corners & Shape (Issue 18)

Gap
S/M/L have no visible effect and Circle is aspect-ratio dependent

Under Layout → Sizing → Image Corners, selecting S, M, or L produces no distinguishable visual change in the editor or live storefront. Furthermore, the Circle option only produces a true circle when the source image is 1:1; with 4:3 or other ratios, it distorts into an oval instead of clipping to a circle.

IsS/M/L buttons do not visibly change radius, and Circle depends on raw source aspect ratio.
Should beS, M, L apply distinct border-radius values (e.g. 4px, 8px, 16px), and Circle enforces 1:1 aspect-ratio with center crop (object-fit: cover) to always render a perfect circle.

Captured DOM: label:has-text("Image corners") with button group Square, S, M, L, Circle, Custom and helper copy "Rounds the picture itself. The Style tab's corner radius rounds the box around it."