Skip to content

Search is only available in production builds. Try building and previewing the site to test it out locally.

ProductCustomizableOptions container

The ProductCustomizableOptions container renders selectable choices and shopper-input fields for the current product’s customizable options. Supported controls include dropdown menus, radio buttons, checkboxes, text fields, multiline text fields, dates, local date-times, and times.

The container receives initial product data during initialization to preload the component. It then listens for pdp/data events in its scope to update product data and for pdp/values events to keep displayed selections in sync with the current configuration.

Render typeControlSelection
drop_downDropdown menuOne value per option.
radioRadio button groupOne value per option.
checkboxCheckbox groupMultiple values per option.
multipleCheckbox groupMultiple values per option. Not a native multi-select list.

Each selected value adds its encoded selectable[].values[].id to optionsUIDs. Fixed surcharges are formatted in the product’s currency. Percentage surcharges are shown as percentages. These labels do not update the displayed product total.

Render typeControlMetadata
fieldText inputPositive integer range.from and range.to values specify minimum and maximum lengths.
areaMultiline text inputSame length constraints. Line breaks are preserved.
dateDate inputLocal calendar date.
date_timeLocal date-time inputNo timezone conversion.
timeTime inputLocal time.
fileDisabled file inputDisplays a localized unsupported message. Upload is not implemented.

Labels indicate required options and show nonzero option prices in the product’s currency.

Invalid length limits are ignored, and a maximum of 0 means unlimited. Maximum length is enforced when shoppers enter or paste text. Minimum length is set on the input control but does not block Add to Cart. If the minimum exceeds the maximum, the minimum is ignored.

Keep the encoded shopperInput[].id unchanged when passing { uid, value } entries to the cart. Do not decode or encode it again. The container preserves whitespace and multiline text.

Date and time controls store cart-compatible strings in enteredOptions without timezone conversion:

Render typeShopper inputStored value
date2026-10-022026-10-02 00:00:00
date_time2026-10-02T14:302026-10-02 14:30:00
time14:301970-01-01 14:30:00

The embedded ProductDetails container renders these controls too. Use either the standalone container or the embedded rendering path, not both on the same PDP.

The ProductCustomizableOptions container provides the following configuration options:

ParameterTypeReq?Description
scopestringNoUnique identifier for the PDP context. Only containers rendered with this scope will respond to product events.
initialDataProductModelNoInitial product data used before scoped pdp/data events arrive.
classNamestringNoAdditional CSS class applied to the container wrapper.

This container does not expose any customizable slots.

The following example demonstrates how to render the ProductCustomizableOptions container:

import { render as provider } from '@dropins/storefront-pdp/render.js';
import ProductCustomizableOptions from '@dropins/storefront-pdp/containers/ProductCustomizableOptions.js';
await provider.render(ProductCustomizableOptions, {
scope: 'example', // optional
})(block);