container and attaches delegated listeners. The value is always the selector’s sel.id (except data-nameless-atc, which takes the bundle id).
Each
<option value="…"> in a variant <select> must be the variant id — the runtime reads select.value verbatim.
Prefer these attributes over
dispatch. Quantity, variant, selection, and add-to-cart all have a supported path already. That path stays correct through repaints, PDP coupling, plugin hooks, and the override pipeline. See Runtime API.Quantity patterns
Placement rules
- Single-product selectors (
productSingle, orcollectionSinglewith a resolved product): one variant<select>and one qty control per selector, and nodata-nameless-product-id. collectionMulti: every variant select, qty input, checkbox, and card on a row carries both the selector id anddata-nameless-product-id="{product.id}".- Pair exactly one checkbox with one number input per add-on selector — never two number inputs for the same selector/product pair.
- Tier buttons need at least two hidden qty inputs with distinct selector ids.
- Controls inside a disabled
<fieldset>, or carryingdisabled/aria-disabled="true", are ignored by the runtime. - Don’t put interaction attributes on anything that shouldn’t trigger an action.
- Render the ATC button enabled unless the bundle is genuinely unbuyable (e.g. a selected item is sold out); the runtime takes over its label and disabled state during the request.
collectionMulti row you don’t need to send a variant when the quantity moves from 0 upward — the runtime resolves it from the existing selection or the product’s first available variant.
When snapshot.meta.atcOverride is true, omit [data-nameless-atc] entirely. See Renderer function.