Skip to main content
After each render the runtime queries these attributes inside 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, or collectionSingle with a resolved product): one variant <select> and one qty control per selector, and no data-nameless-product-id.
  • collectionMulti: every variant select, qty input, checkbox, and card on a row carries both the selector id and data-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 carrying disabled / 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.
On a 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.