Every row above has an attribute equivalent — see Data attributes. Reach for the attribute first.
"bundles" is the only subscribe topic. Before the runtime installs, dispatch returns { ok: false, code: "NOT_READY" }.
Failure codes you may see: NOT_READY, UNKNOWN_ACTION, INVALID_PAYLOAD, INVALID_QUANTITY, UNKNOWN_BUNDLE, UNKNOWN_SELECTOR, UNKNOWN_VARIANT, WRONG_SELECTOR_KIND, EMPTY_SELECTION, VARIANT_UNAVAILABLE, SOLD_OUT, CART_HTTP_ERROR, CART_REJECTED, PLUGIN_BLOCKED, HANDLER_THREW.
Anything on window.nameless prefixed with __ is an internal detail — don’t build against it.
Debugging
Pre-ship checklist
Renderer
-
defineRenderercalled once, at top level, unguarded - Repaints entirely from
snapshoton every call; no cached nodes, no accumulated state - No listeners, no
dispatch, nofetch, no globals - Branches on all three
sel.kindvalues, includingcollectionSinglewith no resolved product - Variant
<option value>is the variant id; qty controls showentry.quantity -
collectionMulticontrols carry both the selector id anddata-nameless-product-id - Tier buttons use hidden inputs, not an attribute on the button
- ATC button rendered only when
meta.atcOverrideis false - Every snapshot string escaped; every merchant-visible string through
ctx.t(and not escaped)
Styling
- Every rule scoped under
[data-nameless-widget] - No global element selectors, no theme classes, no external imports
- Class vocabulary matches the renderer exactly
- Markup still readable and operable with the CSS disabled
Plugins
-
beforehooks return within 1500ms, or tolerate being cut off - Blocks use a meaningful
codeand a shopper-readablemessage -
linePropertieskeyed by selector id;__FB_ATC_UIDleft untouched - Resolvers call
next()and adjust, rather than replacing a stage wholesale - No
dispatchcalls that adata-nameless-*attribute could have handled - Hook failures verified to leave the shopper’s add-to-cart working