@liquidcommerce/elements-sdk 2.6.0-beta.13 → 2.6.0-beta.130

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/README.md +102 -2518
  2. package/dist/index.checkout.esm.js +22267 -0
  3. package/dist/index.esm.js +30400 -20620
  4. package/dist/ssr-stub.checkout.esm.js +17 -0
  5. package/dist/ssr-stub.esm.js +281 -0
  6. package/dist/types/auto-initialize/checkout.d.ts +2 -0
  7. package/dist/types/auto-initialize/shared-utils.d.ts +51 -0
  8. package/dist/types/{elements-base-client.d.ts → clients/base.d.ts} +16 -2
  9. package/dist/types/clients/builder.d.ts +3 -0
  10. package/dist/types/clients/checkout.d.ts +6 -0
  11. package/dist/types/clients/helpers.d.ts +8 -0
  12. package/dist/types/clients/main.d.ts +3 -0
  13. package/dist/types/constants/core.constant.d.ts +13 -18
  14. package/dist/types/constants/index.d.ts +1 -0
  15. package/dist/types/constants/prop65.constant.d.ts +8 -0
  16. package/dist/types/core/a11y/announcer.service.d.ts +16 -0
  17. package/dist/types/core/a11y/focus-manager.service.d.ts +21 -0
  18. package/dist/types/core/a11y/focusable.d.ts +5 -0
  19. package/dist/types/core/a11y/glyph-button.d.ts +8 -0
  20. package/dist/types/core/a11y/index.d.ts +6 -0
  21. package/dist/types/core/a11y/required.d.ts +1 -0
  22. package/dist/types/core/a11y/single-select.d.ts +20 -0
  23. package/dist/types/core/api/api-client.service.d.ts +23 -18
  24. package/dist/types/core/api/api-result.d.ts +19 -0
  25. package/dist/types/core/api/auth-client.service.d.ts +37 -13
  26. package/dist/types/core/api/http-client.service.d.ts +0 -8
  27. package/dist/types/core/base-component.service.d.ts +4 -1
  28. package/dist/types/core/client/actions/base-action.service.d.ts +22 -0
  29. package/dist/types/core/client/actions/client-address-action.service.d.ts +18 -0
  30. package/dist/types/core/client/actions/client-analytics-action.service.d.ts +35 -0
  31. package/dist/types/core/client/actions/client-cart-action.service.d.ts +38 -0
  32. package/dist/types/core/client/actions/client-checkout-action.service.d.ts +81 -0
  33. package/dist/types/core/client/actions/client-product-action.service.d.ts +15 -0
  34. package/dist/types/core/client/client-action.service.d.ts +7 -74
  35. package/dist/types/core/client/client-config.service.d.ts +12 -5
  36. package/dist/types/core/debug-panel/debug-panel.styles.d.ts +1 -1
  37. package/dist/types/core/google-tag-manager.service.d.ts +13 -3
  38. package/dist/types/core/logger/logger.service.d.ts +1 -1
  39. package/dist/types/core/pubsub/interfaces/address.interface.d.ts +3 -0
  40. package/dist/types/core/pubsub/interfaces/cart.interface.d.ts +6 -1
  41. package/dist/types/core/pubsub/interfaces/checkout.interface.d.ts +54 -48
  42. package/dist/types/core/pubsub/interfaces/core.interface.d.ts +18 -7
  43. package/dist/types/core/pubsub/pubsub.service.d.ts +1 -2
  44. package/dist/types/core/singleton-manager.service.d.ts +12 -8
  45. package/dist/types/core/store/interfaces/cart.interface.d.ts +2 -3
  46. package/dist/types/core/store/interfaces/checkout.interface.d.ts +39 -107
  47. package/dist/types/core/store/interfaces/core.interface.d.ts +12 -2
  48. package/dist/types/core/store/interfaces/metadata.interface.d.ts +11 -0
  49. package/dist/types/core/store/interfaces/product-list.interface.d.ts +30 -0
  50. package/dist/types/core/store/interfaces/product.interface.d.ts +1 -0
  51. package/dist/types/core/store/store.constant.d.ts +5 -0
  52. package/dist/types/core/store/store.service.d.ts +1 -0
  53. package/dist/types/core/telemetry/telemetry.service.d.ts +1 -0
  54. package/dist/types/enums/core.enum.d.ts +51 -2
  55. package/dist/types/enums/index.d.ts +0 -1
  56. package/dist/types/index.checkout.d.ts +11 -0
  57. package/dist/types/index.checkout.umd.d.ts +4 -0
  58. package/dist/types/index.d.ts +9 -3
  59. package/dist/types/interfaces/analytics.interface.d.ts +41 -0
  60. package/dist/types/interfaces/api/cart.interface.d.ts +12 -7
  61. package/dist/types/interfaces/api/checkout.interface.d.ts +275 -0
  62. package/dist/types/interfaces/api/delivery.interface.d.ts +24 -0
  63. package/dist/types/interfaces/api/index.d.ts +6 -0
  64. package/dist/types/interfaces/api/product-list.interface.d.ts +15 -6
  65. package/dist/types/interfaces/api/product.interface.d.ts +10 -4
  66. package/dist/types/interfaces/client.interface.d.ts +79 -0
  67. package/dist/types/interfaces/component.interface.d.ts +7 -0
  68. package/dist/types/interfaces/config.interface.d.ts +45 -0
  69. package/dist/types/interfaces/configs/address.interface.d.ts +1 -1
  70. package/dist/types/interfaces/configs/cart.interface.d.ts +2 -1
  71. package/dist/types/interfaces/configs/checkout.interface.d.ts +3 -1
  72. package/dist/types/interfaces/configs/global.interface.d.ts +9 -3
  73. package/dist/types/interfaces/configs/index.d.ts +1 -0
  74. package/dist/types/interfaces/configs/product-list.interface.d.ts +49 -0
  75. package/dist/types/interfaces/configs/product.interface.d.ts +7 -1
  76. package/dist/types/interfaces/injection.interface.d.ts +56 -0
  77. package/dist/types/modules/address/address-display.component.d.ts +3 -1
  78. package/dist/types/modules/address/address-input.component.d.ts +11 -1
  79. package/dist/types/modules/address/address.command.d.ts +3 -2
  80. package/dist/types/modules/address/styles/register-styles.d.ts +1 -0
  81. package/dist/types/modules/cart/cart.commands.d.ts +11 -5
  82. package/dist/types/modules/cart/components/cart-body.component.d.ts +1 -0
  83. package/dist/types/modules/cart/components/cart-fulfillment.component.d.ts +1 -1
  84. package/dist/types/modules/cart/components/cart-item-quantity-price.component.d.ts +5 -0
  85. package/dist/types/modules/cart/components/cart-item.component.d.ts +6 -0
  86. package/dist/types/modules/cart/styles/register-styles.d.ts +1 -0
  87. package/dist/types/modules/checkout/checkout.commands.d.ts +128 -12
  88. package/dist/types/modules/checkout/checkout.component.d.ts +7 -1
  89. package/dist/types/modules/checkout/components/checkout-billing.component.d.ts +5 -2
  90. package/dist/types/modules/checkout/components/checkout-buyer.component.d.ts +1 -0
  91. package/dist/types/modules/checkout/components/checkout-completed.component.d.ts +7 -0
  92. package/dist/types/modules/checkout/components/checkout-deliver-to.component.d.ts +1 -0
  93. package/dist/types/modules/checkout/components/checkout-delivery-method.component.d.ts +22 -0
  94. package/dist/types/modules/checkout/components/checkout-delivery-scheduling.component.d.ts +51 -0
  95. package/dist/types/modules/checkout/components/checkout-express-checkout.component.d.ts +63 -0
  96. package/dist/types/modules/checkout/components/checkout-express-completion.component.d.ts +21 -0
  97. package/dist/types/modules/checkout/components/checkout-header.component.d.ts +1 -0
  98. package/dist/types/modules/checkout/components/checkout-item-quantity.component.d.ts +4 -0
  99. package/dist/types/modules/checkout/components/checkout-item.component.d.ts +2 -0
  100. package/dist/types/modules/checkout/components/checkout-items.component.d.ts +4 -3
  101. package/dist/types/modules/checkout/components/checkout-order-summary.component.d.ts +3 -0
  102. package/dist/types/modules/checkout/components/checkout-payment.component.d.ts +8 -1
  103. package/dist/types/modules/checkout/components/checkout-place-order-button.component.d.ts +1 -5
  104. package/dist/types/modules/checkout/components/checkout-presale-countdown.component.d.ts +15 -1
  105. package/dist/types/modules/checkout/components/checkout-presale-expired.component.d.ts +7 -1
  106. package/dist/types/modules/checkout/components/checkout-prop65-warning.component.d.ts +8 -0
  107. package/dist/types/modules/checkout/components/checkout-send-as-gift.component.d.ts +3 -0
  108. package/dist/types/modules/checkout/components/checkout-stripe-form.component.d.ts +7 -3
  109. package/dist/types/modules/checkout/components/checkout-stripe-handler.component.d.ts +4 -0
  110. package/dist/types/modules/checkout/components/checkout-tips.component.d.ts +4 -2
  111. package/dist/types/modules/checkout/components/index.d.ts +5 -0
  112. package/dist/types/modules/checkout/components/promo-pc-gc.component.d.ts +0 -2
  113. package/dist/types/modules/checkout/components/required-fields-legend.d.ts +1 -0
  114. package/dist/types/modules/checkout/constant.d.ts +15 -0
  115. package/dist/types/modules/checkout/customer-prefill.d.ts +5 -0
  116. package/dist/types/modules/checkout/express-wallet.d.ts +12 -0
  117. package/dist/types/modules/checkout/payment-session-error.d.ts +4 -0
  118. package/dist/types/modules/checkout/stripe-js.d.ts +2 -0
  119. package/dist/types/modules/checkout/styles/delivery-method.style.d.ts +1 -0
  120. package/dist/types/modules/checkout/styles/express-checkout.style.d.ts +1 -0
  121. package/dist/types/modules/checkout/styles/express-completion.style.d.ts +1 -0
  122. package/dist/types/modules/checkout/styles/register-styles.d.ts +1 -0
  123. package/dist/types/modules/product/components/components.d.ts +26 -2
  124. package/dist/types/modules/product/components/index.d.ts +1 -0
  125. package/dist/types/modules/product/components/product-add-to-cart-section.component.d.ts +8 -1
  126. package/dist/types/modules/product/components/product-delivery-estimate.component.d.ts +11 -0
  127. package/dist/types/modules/product/components/product-description.component.d.ts +1 -0
  128. package/dist/types/modules/product/components/product-drawer.component.d.ts +6 -0
  129. package/dist/types/modules/product/components/product-image-carousel.component.d.ts +5 -0
  130. package/dist/types/modules/product/components/product-options.component.d.ts +2 -1
  131. package/dist/types/modules/product/components/product-prop65-warning.d.ts +1 -0
  132. package/dist/types/modules/product/components/product-retailers-carousel.component.d.ts +6 -0
  133. package/dist/types/modules/product/components/product-retailers-popup-list.component.d.ts +12 -2
  134. package/dist/types/modules/product/components/product-retailers-popup.component.d.ts +1 -0
  135. package/dist/types/modules/product/components/product-retailers.component.d.ts +1 -0
  136. package/dist/types/modules/product/product.commands.d.ts +5 -5
  137. package/dist/types/modules/product/product.component.d.ts +3 -0
  138. package/dist/types/modules/product/styles/prop65-warning.style.d.ts +1 -0
  139. package/dist/types/modules/product/styles/register-styles.d.ts +1 -0
  140. package/dist/types/modules/product-list/components/card-components/index.d.ts +6 -0
  141. package/dist/types/modules/product-list/components/card-components/product-badge.d.ts +9 -0
  142. package/dist/types/modules/product-list/components/card-components/product-button.d.ts +11 -0
  143. package/dist/types/modules/product-list/components/card-components/product-fulfillment-text.d.ts +2 -0
  144. package/dist/types/modules/product-list/components/card-components/product-price-and-personalization.d.ts +14 -0
  145. package/dist/types/modules/product-list/components/card-components/product-quantity-selector.d.ts +11 -0
  146. package/dist/types/modules/product-list/components/card-components/product-sizes-list.d.ts +14 -0
  147. package/dist/types/modules/product-list/components/filter-components/index.d.ts +7 -0
  148. package/dist/types/modules/product-list/components/filter-components/product-list-apply-filter-button.d.ts +1 -0
  149. package/dist/types/modules/product-list/components/{product-list-filters-subcomponents/product-list-checkbox-filter.components.d.ts → filter-components/product-list-checkbox-filter.d.ts} +1 -0
  150. package/dist/types/modules/product-list/components/filter-components/product-list-chip.d.ts +5 -0
  151. package/dist/types/modules/product-list/components/filter-components/product-list-filters-chips.d.ts +13 -0
  152. package/dist/types/modules/product-list/components/filter-components/product-list-fulfillment-filter.d.ts +15 -0
  153. package/dist/types/modules/product-list/components/{product-list-filters-subcomponents/product-list-price-filter.components.d.ts → filter-components/product-list-price-filter.d.ts} +2 -1
  154. package/dist/types/modules/product-list/components/filter-components/product-list-toggle-filters.d.ts +7 -0
  155. package/dist/types/modules/product-list/components/index.d.ts +6 -2
  156. package/dist/types/modules/product-list/components/product-list-card-loading.component.d.ts +3 -1
  157. package/dist/types/modules/product-list/components/product-list-card.component.d.ts +39 -31
  158. package/dist/types/modules/product-list/components/product-list-engraving.component.d.ts +12 -0
  159. package/dist/types/modules/product-list/components/product-list-filters.component.d.ts +58 -36
  160. package/dist/types/modules/product-list/components/product-list-product-engraving-lines.component.d.ts +22 -0
  161. package/dist/types/modules/product-list/components/product-list-product-pre-cart.component.d.ts +54 -0
  162. package/dist/types/modules/product-list/components/product-list-search.component.d.ts +25 -0
  163. package/dist/types/modules/product-list/product-list-filter.registry.d.ts +42 -0
  164. package/dist/types/modules/product-list/product-list-filter.utils.d.ts +7 -0
  165. package/dist/types/modules/product-list/product-list-order.utils.d.ts +3 -0
  166. package/dist/types/modules/product-list/product-list-query-params.utils.d.ts +3 -0
  167. package/dist/types/modules/product-list/product-list.commands.d.ts +27 -7
  168. package/dist/types/modules/product-list/product-list.component.d.ts +23 -47
  169. package/dist/types/modules/product-list/product-list.constants.d.ts +38 -0
  170. package/dist/types/modules/product-list/product-list.interface.d.ts +17 -28
  171. package/dist/types/modules/product-list/styles/product-list-card.style.d.ts +1 -0
  172. package/dist/types/modules/product-list/styles/product-list-filters.style.d.ts +1 -0
  173. package/dist/types/modules/product-list/styles/register-styles.d.ts +1 -0
  174. package/dist/types/modules/theme-provider/constants/component-groupings.d.ts +1 -0
  175. package/dist/types/modules/theme-provider/constants/css-variable-mappings.d.ts +1 -1
  176. package/dist/types/modules/theme-provider/services/style-registry.service.d.ts +16 -0
  177. package/dist/types/modules/theme-provider/services/stylesheet-generator.service.d.ts +0 -1
  178. package/dist/types/modules/theme-provider/styles/register-styles.d.ts +1 -0
  179. package/dist/types/modules/theme-provider/theme-provider.service.d.ts +2 -2
  180. package/dist/types/modules/ui-components/alert/alert.component.d.ts +10 -10
  181. package/dist/types/modules/ui-components/buttons/buttons-open-cart.component.d.ts +5 -0
  182. package/dist/types/modules/ui-components/drawer/drawer.component.d.ts +15 -0
  183. package/dist/types/modules/ui-components/engraving/engraving-form.component.d.ts +9 -1
  184. package/dist/types/modules/ui-components/engraving/engraving-view.component.d.ts +7 -1
  185. package/dist/types/modules/ui-components/input/index.d.ts +0 -1
  186. package/dist/types/modules/ui-components/input/input.component.d.ts +15 -2
  187. package/dist/types/modules/ui-components/lce-element/lce-element.component.d.ts +2 -1
  188. package/dist/types/modules/ui-components/promo-code-ticker/promo-code-ticker.component.d.ts +1 -1
  189. package/dist/types/modules/ui-components/ui.commands.d.ts +7 -1
  190. package/dist/types/ssr/stub.checkout.d.ts +8 -0
  191. package/dist/types/ssr/stub.d.ts +12 -0
  192. package/dist/types/static/icon/arrow-right.icon.d.ts +1 -1
  193. package/dist/types/static/icon/bag.icon.d.ts +1 -1
  194. package/dist/types/static/icon/check.icon.d.ts +2 -0
  195. package/dist/types/static/icon/checkbox.icon.d.ts +1 -1
  196. package/dist/types/static/icon/chevron-down.icon.d.ts +1 -1
  197. package/dist/types/static/icon/chevron-left.icon.d.ts +1 -1
  198. package/dist/types/static/icon/chevron-up.icon.d.ts +1 -1
  199. package/dist/types/static/icon/close.icon.d.ts +1 -1
  200. package/dist/types/static/icon/error-info.icon.d.ts +1 -1
  201. package/dist/types/static/icon/filter.icon.d.ts +1 -1
  202. package/dist/types/static/icon/icon.a11y.d.ts +1 -0
  203. package/dist/types/static/icon/icon.types.d.ts +1 -0
  204. package/dist/types/static/icon/index.d.ts +2 -0
  205. package/dist/types/static/icon/info.icon.d.ts +1 -1
  206. package/dist/types/static/icon/loading-spinner.icon.d.ts +1 -1
  207. package/dist/types/static/icon/search.icon.d.ts +1 -1
  208. package/dist/types/static/icon/success.icon.d.ts +1 -1
  209. package/dist/types/static/icon/trash.icon.d.ts +1 -1
  210. package/dist/types/static/icon/warning.icon.d.ts +1 -1
  211. package/dist/types/utils/delivery-scheduling.d.ts +43 -0
  212. package/dist/types/utils/dom-compat.d.ts +2 -0
  213. package/dist/types/utils/format.d.ts +9 -14
  214. package/dist/types/utils/image-bg-removal.d.ts +3 -0
  215. package/dist/types/utils/places-session-token.d.ts +1 -0
  216. package/dist/types/utils/product-selection.d.ts +16 -0
  217. package/dist/types/utils/product.d.ts +21 -0
  218. package/dist/types/utils/timezone.d.ts +6 -0
  219. package/docs/v1/README.md +214 -0
  220. package/docs/v1/api/actions/address-actions.md +290 -0
  221. package/docs/v1/api/actions/analytics-actions.md +326 -0
  222. package/docs/v1/api/actions/cart-actions.md +364 -0
  223. package/docs/v1/api/actions/checkout-actions.md +629 -0
  224. package/docs/v1/api/actions/product-actions.md +204 -0
  225. package/docs/v1/api/client.md +671 -0
  226. package/docs/v1/api/configuration.md +587 -0
  227. package/docs/v1/api/injection-methods.md +331 -0
  228. package/docs/v1/api/typescript-types.md +610 -0
  229. package/docs/v1/api/ui-helpers.md +200 -0
  230. package/docs/v1/examples/advanced-patterns.md +199 -0
  231. package/docs/v1/examples/checkout-flow.md +90 -0
  232. package/docs/v1/examples/custom-theming.md +76 -0
  233. package/docs/v1/examples/multi-product-page.md +90 -0
  234. package/docs/v1/examples/simple-product-page.md +89 -0
  235. package/docs/v1/getting-started/concepts.md +521 -0
  236. package/docs/v1/getting-started/installation.md +351 -0
  237. package/docs/v1/getting-started/quick-start.md +410 -0
  238. package/docs/v1/guides/accessibility.md +295 -0
  239. package/docs/v1/guides/address-component.md +441 -0
  240. package/docs/v1/guides/best-practices.md +365 -0
  241. package/docs/v1/guides/cart-component.md +800 -0
  242. package/docs/v1/guides/checkout-component.md +916 -0
  243. package/docs/v1/guides/events.md +1061 -0
  244. package/docs/v1/guides/product-component.md +761 -0
  245. package/docs/v1/guides/product-list-component.md +730 -0
  246. package/docs/v1/guides/theming.md +243 -0
  247. package/docs/v1/integration/angular.md +39 -0
  248. package/docs/v1/integration/laravel.md +41 -0
  249. package/docs/v1/integration/nextjs.md +69 -0
  250. package/docs/v1/integration/proxy-setup.md +106 -0
  251. package/docs/v1/integration/react.md +64 -0
  252. package/docs/v1/integration/vanilla-js.md +84 -0
  253. package/docs/v1/integration/vue.md +58 -0
  254. package/docs/v1/reference/analytics.md +176 -0
  255. package/docs/v1/reference/browser-support.md +47 -0
  256. package/docs/v1/reference/error-handling.md +83 -0
  257. package/docs/v1/reference/performance.md +52 -0
  258. package/docs/v1/reference/telemetry.md +85 -0
  259. package/docs/v1/reference/troubleshooting.md +135 -0
  260. package/package.json +75 -45
  261. package/dist/types/elements-builder-client.d.ts +0 -2
  262. package/dist/types/elements-client-helper.d.ts +0 -4
  263. package/dist/types/elements-client.d.ts +0 -2
  264. package/dist/types/enums/cloud.enum.d.ts +0 -97
  265. package/dist/types/interfaces/cloud/checkout.interface.d.ts +0 -218
  266. package/dist/types/interfaces/cloud/core.interface.d.ts +0 -22
  267. package/dist/types/interfaces/cloud/index.d.ts +0 -3
  268. package/dist/types/interfaces/cloud/retailer.interface.d.ts +0 -67
  269. package/dist/types/interfaces/cloud/user.interface.d.ts +0 -100
  270. package/dist/types/interfaces/core.interface.d.ts +0 -111
  271. package/dist/types/modules/checkout/components/checkout.type.d.ts +0 -4
  272. package/dist/types/modules/product-list/components/product-list-filters-subcomponents/index.d.ts +0 -6
  273. package/dist/types/modules/product-list/components/product-list-filters-subcomponents/product-list-apply-filter-button.component.d.ts +0 -1
  274. package/dist/types/modules/product-list/components/product-list-filters-subcomponents/product-list-delivery-options-filter.components.d.ts +0 -16
  275. package/dist/types/modules/product-list/components/product-list-filters-subcomponents/product-list-search.component.d.ts +0 -16
  276. package/dist/types/modules/product-list/components/product-list-filters-subcomponents/product-list-toggle-filters.components.d.ts +0 -18
  277. package/dist/types/modules/theme-provider/styles/address/index.d.ts +0 -1
  278. package/dist/types/modules/theme-provider/styles/cart/index.d.ts +0 -1
  279. package/dist/types/modules/theme-provider/styles/checkout/index.d.ts +0 -1
  280. package/dist/types/modules/theme-provider/styles/product/index.d.ts +0 -3
  281. package/dist/types/modules/theme-provider/styles/product-list/index.d.ts +0 -1
  282. package/dist/types/modules/theme-provider/styles/ui/index.d.ts +0 -3
  283. package/dist/types/modules/ui-components/input/birthdate-input.component.d.ts +0 -53
  284. package/dist/types/utils/helper.d.ts +0 -28
  285. package/docs/ACTIONS.md +0 -1300
  286. package/docs/BROWSER_SUPPORT.md +0 -279
  287. package/docs/CONFIGURATION.md +0 -853
  288. package/docs/DOCUMENTATION_INDEX.md +0 -311
  289. package/docs/EVENTS.md +0 -798
  290. package/docs/PROXY.md +0 -228
  291. package/docs/THEMING.md +0 -592
  292. package/docs/TROUBLESHOOTING.md +0 -793
  293. package/umd/elements.js +0 -1
  294. /package/dist/types/{auto-initialize.d.ts → auto-initialize/main.d.ts} +0 -0
  295. /package/dist/types/modules/{theme-provider/styles/address → address/styles}/address.style.d.ts +0 -0
  296. /package/dist/types/modules/{theme-provider/styles/cart → cart/styles}/cart.style.d.ts +0 -0
  297. /package/dist/types/modules/{theme-provider/styles/checkout → checkout/styles}/checkout.style.d.ts +0 -0
  298. /package/dist/types/modules/{theme-provider/styles/product → product/styles}/image-carousel.style.d.ts +0 -0
  299. /package/dist/types/modules/{theme-provider/styles/product → product/styles}/product.style.d.ts +0 -0
  300. /package/dist/types/modules/{theme-provider/styles/product → product/styles}/retailers.style.d.ts +0 -0
  301. /package/dist/types/modules/{theme-provider/styles/product-list → product-list/styles}/product-list.style.d.ts +0 -0
  302. /package/dist/types/modules/{theme-provider/styles/ui → ui-components/styles}/drawer.style.d.ts +0 -0
  303. /package/dist/types/modules/{theme-provider/styles/ui → ui-components/styles}/loading.style.d.ts +0 -0
  304. /package/dist/types/modules/{theme-provider/styles/ui → ui-components/styles}/promo-code-ticker.style.d.ts +0 -0
@@ -0,0 +1,761 @@
1
+ # Product Component
2
+
3
+ The Product component displays product information with add-to-cart functionality, image carousel, size selection, and fulfillment options.
4
+
5
+ ## Overview
6
+
7
+ The Product component automatically:
8
+ - Displays product images in a carousel
9
+ - Shows product name, description, and pricing
10
+ - Provides size selection
11
+ - Offers fulfillment type options (shipping/on-demand delivery)
12
+ - Handles retailer selection
13
+ - Includes add-to-cart functionality
14
+ - Supports product personalization/engraving
15
+ - Adjusts pricing based on delivery location
16
+
17
+ ## Basic Usage
18
+
19
+ ### Declarative Setup
20
+
21
+ The simplest way to add a product is using HTML data attributes:
22
+
23
+ ```html
24
+ <script
25
+ defer
26
+ data-liquid-commerce-elements
27
+ data-token="YOUR_API_KEY"
28
+ data-env="production"
29
+ data-container-1="product-display"
30
+ data-product-1="00619947000020"
31
+ type="text/javascript"
32
+ src="https://elements.reservebar-worker.workers.dev/all/elements.js"
33
+ ></script>
34
+
35
+ <div id="product-display"></div>
36
+ ```
37
+
38
+ **Multiple products:**
39
+
40
+ ```html
41
+ <script
42
+ defer
43
+ data-liquid-commerce-elements
44
+ data-token="YOUR_API_KEY"
45
+ data-env="production"
46
+ data-container-1="product-1"
47
+ data-product-1="00619947000020"
48
+ data-container-2="product-2"
49
+ data-product-2="08504405135"
50
+ type="text/javascript"
51
+ src="https://elements.reservebar-worker.workers.dev/all/elements.js"
52
+ ></script>
53
+
54
+ <div id="product-1"></div>
55
+ <div id="product-2"></div>
56
+ ```
57
+
58
+ ### Alternative: Annotated Elements
59
+
60
+ Use `data-lce-product` on any div:
61
+
62
+ ```html
63
+ <script
64
+ defer
65
+ data-liquid-commerce-elements
66
+ data-token="YOUR_API_KEY"
67
+ data-env="production"
68
+ type="text/javascript"
69
+ src="https://elements.reservebar-worker.workers.dev/all/elements.js"
70
+ ></script>
71
+
72
+ <div data-lce-product="00619947000020"></div>
73
+ <div data-lce-product="08504405135"></div>
74
+ ```
75
+
76
+ The SDK automatically generates IDs and injects products into these elements.
77
+
78
+ ### Alternative: JSON Configuration
79
+
80
+ For many products, use a JSON script tag:
81
+
82
+ ```html
83
+ <script
84
+ defer
85
+ data-liquid-commerce-elements
86
+ data-token="YOUR_API_KEY"
87
+ data-env="production"
88
+ type="text/javascript"
89
+ src="https://elements.reservebar-worker.workers.dev/all/elements.js"
90
+ ></script>
91
+
92
+ <script data-liquid-commerce-elements-products type="application/json">
93
+ [
94
+ { "containerId": "product-1", "identifier": "00619947000020" },
95
+ { "containerId": "product-2", "identifier": "08504405135" },
96
+ { "containerId": "product-3", "identifier": "08068660001" }
97
+ ]
98
+ </script>
99
+
100
+ <div id="product-1"></div>
101
+ <div id="product-2"></div>
102
+ <div id="product-3"></div>
103
+ ```
104
+
105
+ ### Programmatic Setup
106
+
107
+ Use the JavaScript API for dynamic product injection:
108
+
109
+ ```javascript
110
+ const client = await Elements('YOUR_API_KEY', {
111
+ env: 'production'
112
+ });
113
+
114
+ await client.injectProductElement([
115
+ { containerId: 'product-display', identifier: '00619947000020' }
116
+ ]);
117
+ ```
118
+
119
+ **With NPM:**
120
+
121
+ ```javascript
122
+ import { Elements } from '@liquidcommerce/elements-sdk';
123
+
124
+ const client = await Elements('YOUR_API_KEY', { env: 'production' });
125
+
126
+ await client.injectProductElement([
127
+ { containerId: 'product-1', identifier: '00619947000020' },
128
+ { containerId: 'product-2', identifier: '08504405135' }
129
+ ]);
130
+ ```
131
+
132
+ ## Product Identifiers
133
+
134
+ Products can be identified using:
135
+
136
+ - **UPC**: `00619947000020`
137
+ - **Salsify Grouping**: `GROUPING-12345`
138
+
139
+ The SDK automatically resolves any of these identifier types.
140
+
141
+ ## Features
142
+
143
+ ### Image Carousel
144
+
145
+ Products with multiple images display in an interactive carousel:
146
+
147
+ - Swipe/arrow navigation
148
+ - Thumbnail preview
149
+ - Lazy loading for performance
150
+
151
+ **Background removal:** Product images (the main detail image and the gallery) automatically have their white/near-white background removed so photos blend into the surrounding page background instead of sitting on a white box. The SDK picks the technique per image based on the host background — blending the white away on light backgrounds, or keying it out to true transparency on dark or transparent backgrounds — and skips SVG artwork, which is already transparent. This is applied automatically and is not currently host-configurable.
152
+
153
+ ### Size Selection
154
+
155
+ For products with multiple sizes:
156
+
157
+ - Size selector
158
+ - Price updates per size
159
+ - Availability checking per size
160
+ - Out-of-stock indication
161
+
162
+ #### Preselect a Size via URL
163
+
164
+ Use the `lce_size` query parameter to preselect a size when the product page loads:
165
+
166
+ ```
167
+ https://yoursite.com/products/buffalo-trace?lce_size=750ml
168
+ ```
169
+
170
+ - The value is compared against each size's full label as shown on the page.
171
+ - Matching is case-insensitive and ignores spacing and punctuation — only letters, digits, and decimal points are compared — so `750 ML`, `750ml`, and `750ML` all select a `750ml` size, while decimals are kept so `1.0L` and `1.75L` stay distinct.
172
+ - If the value matches no size, the default size selection is used.
173
+
174
+ **Pack sizes:** the label includes the pack description when present (e.g. `50 ML (12PK)`). To select that size, include the pack in the value:
175
+
176
+ ```
177
+ https://yoursite.com/products/mini-bottles?lce_size=50ml(12pk)
178
+ ```
179
+
180
+ Both `50ml(12pk)` and `50ml12pk` match `50 ML (12PK)` (punctuation is ignored). A value of just `50ml` only matches a size whose label is `50 ML` with no pack.
181
+
182
+ `lce_size` is a fixed parameter name (not configured through a script attribute) and only applies to the product page.
183
+
184
+ ### Fulfillment Types
185
+
186
+ Two fulfillment options:
187
+
188
+ **Shipping**
189
+ - Standard delivery
190
+ - Nationwide availability
191
+ - Carrier-based shipping
192
+
193
+ **On-Demand Delivery**
194
+ - Same-day or scheduled delivery
195
+ - Local availability only
196
+ - Location-dependent pricing
197
+
198
+ The component shows only available fulfillment types based on the user's location.
199
+
200
+ ### Retailer Selection
201
+
202
+ For products with multiple retailers:
203
+
204
+ **Carousel View** (default)
205
+ - Swipeable carousel of retailer cards
206
+ - Shows retailer address, shipping/delivery expectation time, and pricing
207
+ - Select with one tap
208
+
209
+ **Popup View**
210
+ - "See Delivery Options" button (shows the available fulfillment count, e.g. "See Delivery Options (3)")
211
+ - Opens a plain, scrollable list of the available delivery/retailer options
212
+ - No filtering or search — select a retailer from the list to choose it
213
+
214
+ **Delivery Estimate Only**
215
+ - Used when the `showOnlyOneRetailer` and `hideRetailerName` admin settings are both on
216
+ - Each size arrives with a single retailer and a single delivery method, so there is nothing to choose
217
+ - Shows only the delivery estimate, e.g. "Ships in 2-3 days" or "Arrives in 60 minutes", and never the retailer name; the engraving form does the same
218
+ - Product list cards and their pre-cart follow the same settings: the "Ships from" line shows the estimate instead, and the "Delivery Options" button is not shown
219
+ - The retailer is still shown in the cart and checkout
220
+
221
+ Both settings are made in the LiquidCommerce admin, because the narrowing happens in the availability response. Setting them through `customTheme` changes the display only: the shopper would see one estimate while the store still holds every retailer.
222
+
223
+ ### Personalization/Engraving
224
+
225
+ For products that support personalization:
226
+
227
+ - Engraving form appears automatically
228
+ - Character limits enforced
229
+ - Additional fees displayed
230
+
231
+ ### Quantity Selection
232
+
233
+ Adjust product quantity before adding to cart:
234
+
235
+ - Increment/decrement buttons
236
+ - Direct input field
237
+ - Inventory limits enforced
238
+
239
+ ### California Proposition 65 Warning
240
+
241
+ When the shopper's address is in California, the product element ends with a collapsed
242
+ **CA WARNING — California Proposition 65** row. Expanding it shows the alcoholic-beverage warning
243
+ required by 27 CCR § 25607.4, verbatim, with a link to
244
+ [www.P65Warnings.ca.gov/alcohol](https://www.p65warnings.ca.gov/alcohol). The row appears and
245
+ disappears in place as the address changes; with no address set, or an address in another state, it
246
+ is not rendered.
247
+
248
+ This is a compliance requirement for alcohol sold online to California, so for a California address
249
+ it cannot be turned off: there is no layout option, theme token or attribute that removes the row or
250
+ changes its wording. It takes its
251
+ colours, fonts and dividers from your theme (`defaultTextColor`, `accentColor`, the heading and
252
+ paragraph fonts) so it fits your design — check that `defaultTextColor` reaches 4.5:1 against your
253
+ product background, since the SDK renders it as given.
254
+
255
+ ## Actions API
256
+
257
+ Programmatically interact with products:
258
+
259
+ ### Get Product Details
260
+
261
+ Retrieve product information:
262
+
263
+ ```javascript
264
+ const productData = window.LiquidCommerce.elements.actions.product.getDetails('00619947000020');
265
+
266
+ console.log(productData);
267
+ // {
268
+ // identifier: '00619947000020',
269
+ // name: 'Premium Whiskey',
270
+ // priceInfo: { currency: 'USD', minimum: 4999, average: 4999, maximum: 4999 },
271
+ // selectedSizeId: '750ml',
272
+ // selectedFulfillmentType: 'shipping',
273
+ // selectedFulfillmentId: 'fulfillment_123',
274
+ // productHasAvailability: true,
275
+ // fulfillmentHasAvailability: true,
276
+ // sizes: { '750ml': { ... } },
277
+ // ...
278
+ // }
279
+ ```
280
+
281
+ **Note:** The product must be injected and loaded before calling `getDetails()`. If the product hasn't been loaded, an error is thrown.
282
+
283
+ ### Get Product Availability by State
284
+
285
+ Check availability for one or more products in a given state. Returns a `Promise<IProductAvailabilityResponse>`:
286
+
287
+ ```javascript
288
+ const availability = await window.LiquidCommerce.elements.actions.product.getProductAvailabilityByState(
289
+ ['00619947000020', '08504405135'],
290
+ 'NY'
291
+ );
292
+
293
+ console.log(availability);
294
+ // {
295
+ // products: [...],
296
+ // retailers: { ... }
297
+ // }
298
+ ```
299
+
300
+ The `state` argument is optional; at least one product identifier is required.
301
+
302
+ ## Events
303
+
304
+ Listen for product-related events:
305
+
306
+ ### Product Loaded
307
+
308
+ Fired when product data is successfully loaded:
309
+
310
+ ```javascript
311
+ window.addEventListener('lce:actions.product_loaded', (event) => {
312
+ const { identifier, name, priceInfo } = event.detail.data;
313
+ console.log(`Product loaded: ${name} - $${priceInfo.minimum / 100}`);
314
+ });
315
+ ```
316
+
317
+ ### Product Add to Cart
318
+
319
+ Fired when user clicks "Add to Cart":
320
+
321
+ ```javascript
322
+ window.addEventListener('lce:actions.product_add_to_cart', (event) => {
323
+ const { identifier, quantity, fulfillmentId } = event.detail.data;
324
+ console.log(`Adding ${quantity}x ${identifier} (${fulfillmentId})`);
325
+ });
326
+ ```
327
+
328
+ ### Size Changed
329
+
330
+ Fired when user selects a different size:
331
+
332
+ ```javascript
333
+ window.addEventListener('lce:actions.product_size_changed', (event) => {
334
+ const { identifier, selectedSizeId, selectedSize } = event.detail.data;
335
+ console.log(`Size changed to ${selectedSize} (${selectedSizeId})`);
336
+ });
337
+ ```
338
+
339
+ ### Fulfillment Type Changed
340
+
341
+ Fired when user switches between shipping and on-demand:
342
+
343
+ ```javascript
344
+ window.addEventListener('lce:actions.product_fulfillment_type_changed', (event) => {
345
+ const { identifier, selectedFulfillmentType } = event.detail.data;
346
+ console.log(`Fulfillment type changed to: ${selectedFulfillmentType}`);
347
+ });
348
+ ```
349
+
350
+ ### Fulfillment (Retailer) Changed
351
+
352
+ Fired when user selects a different retailer:
353
+
354
+ ```javascript
355
+ window.addEventListener('lce:actions.product_fulfillment_changed', (event) => {
356
+ const { identifier, selectedFulfillmentId, selectedFulfillmentType } = event.detail.data;
357
+ console.log(`Fulfillment changed to ${selectedFulfillmentId} (${selectedFulfillmentType})`);
358
+ });
359
+ ```
360
+
361
+ ### Quantity Increased/Decreased
362
+
363
+ Fired when user adjusts quantity:
364
+
365
+ ```javascript
366
+ window.addEventListener('lce:actions.product_quantity_increase', (event) => {
367
+ const { identifier, quantity } = event.detail.data;
368
+ console.log(`Quantity increased to: ${quantity}`);
369
+ });
370
+
371
+ window.addEventListener('lce:actions.product_quantity_decrease', (event) => {
372
+ const { identifier, quantity } = event.detail.data;
373
+ console.log(`Quantity decreased to: ${quantity}`);
374
+ });
375
+ ```
376
+
377
+ ## Customization
378
+
379
+ ### Theme Configuration
380
+
381
+ Customize product appearance globally:
382
+
383
+ ```javascript
384
+ const client = await Elements('YOUR_API_KEY', {
385
+ env: 'production',
386
+ customTheme: {
387
+ product: {
388
+ theme: {
389
+ backgroundColor: '#ffffff'
390
+ },
391
+ layout: {
392
+ showImages: true,
393
+ showOnlyMainImage: false, // Show all images or just the main one
394
+ showTitle: true,
395
+ showDescription: true,
396
+ descriptionPosition: 'below', // Description placement: 'above' or 'below'
397
+ showQuantityCounter: true,
398
+ showOffHours: true, // Show when retailer is closed
399
+ quantityCounterStyle: 'outlined', // or 'ghost'
400
+ fulfillmentDisplay: 'carousel', // or 'popup'
401
+ enableShippingFulfillment: true,
402
+ enableOnDemandFulfillment: true,
403
+ primaryFulfillmentMethod: 'shipping', // or 'onDemand'
404
+ addToCartButtonText: 'Add to Cart',
405
+ addToCartButtonShowTotalPrice: true,
406
+ buyNowButtonText: 'Buy Now',
407
+ preSaleButtonText: 'Pre-Order',
408
+ prioritizeEngraving: false, // Show engraving option before add-to-cart
409
+ noAvailabilityText: 'Not available in your area'
410
+ }
411
+ }
412
+ }
413
+ });
414
+ ```
415
+
416
+ ### Global Theme
417
+
418
+ Set colors, fonts, and styles that apply to all components:
419
+
420
+ ```javascript
421
+ customTheme: {
422
+ global: {
423
+ theme: {
424
+ primaryColor: '#007bff',
425
+ accentColor: '#28a745',
426
+ buttonCornerRadius: '8px',
427
+ cardCornerRadius: '12px',
428
+ headingFont: {
429
+ name: 'Poppins',
430
+ weights: [400, 600, 700]
431
+ },
432
+ paragraphFont: {
433
+ name: 'Inter',
434
+ weights: [400, 500]
435
+ }
436
+ }
437
+ }
438
+ }
439
+ ```
440
+
441
+ See [Theming Guide](./theming.md) for complete theming options.
442
+
443
+ ## Address Requirement
444
+
445
+ Products require a delivery address for:
446
+ - Availability checking
447
+ - Accurate pricing
448
+ - Delivery options
449
+
450
+ ### Automatic Address Collection
451
+
452
+ If no address is set, the SDK automatically:
453
+ 1. Prompts for address when user clicks "Add to Cart"
454
+ 2. Shows address input drawer
455
+ 3. Validates and saves address
456
+ 4. Completes the add-to-cart action
457
+
458
+ ### Pre-set Address
459
+
460
+ Set address programmatically to skip prompting:
461
+
462
+ ```javascript
463
+ // Using Google Places ID
464
+ await window.LiquidCommerce.elements.actions.address.setAddressByPlacesId('ChIJ...');
465
+
466
+ // Or manually
467
+ await window.LiquidCommerce.elements.actions.address.setAddressManually(
468
+ {
469
+ one: '123 Main St',
470
+ two: 'Apt 4',
471
+ city: 'New York',
472
+ state: 'NY',
473
+ zip: '10001',
474
+ country: 'US'
475
+ },
476
+ {
477
+ latitude: 40.7128,
478
+ longitude: -74.0060
479
+ }
480
+ );
481
+ ```
482
+
483
+ ## Presale Products
484
+
485
+ Products in presale mode:
486
+ - Display "Pre-Order" button (customizable text)
487
+ - Cannot be added to cart, it will send the user to checkout directly
488
+ - Show presale countdown if configured
489
+ - Display expected availability date
490
+
491
+ Presale products are handled automatically; no special configuration needed.
492
+
493
+ ## Component Management
494
+
495
+ ### Rerender Product
496
+
497
+ Force a product to reload and rerender:
498
+
499
+ ```javascript
500
+ const components = window.LiquidCommerce.elements.getInjectedComponents();
501
+ const productComponent = components.get('product-1');
502
+
503
+ if (productComponent) {
504
+ productComponent.rerender();
505
+ }
506
+ ```
507
+
508
+ ### Get Component Type
509
+
510
+ Check if a component is a product:
511
+
512
+ ```javascript
513
+ const component = components.get('product-1');
514
+ const type = component.getType();
515
+ console.log(type); // 'product'
516
+ ```
517
+
518
+ ### Get Container Element
519
+
520
+ Access the container DOM element:
521
+
522
+ ```javascript
523
+ const component = components.get('product-1');
524
+ const container = component.getElement();
525
+ console.log(container); // <div id="product-1">...</div>
526
+ ```
527
+
528
+ ## Error Handling
529
+
530
+ ### Product Not Found
531
+
532
+ If a product identifier doesn't exist:
533
+
534
+ ```javascript
535
+ // An error view is shown in the container, and the store entry's `error`
536
+ // is set to 'Product data not found'. In debug/logging mode the SDK warns:
537
+ // "No product data found for the provided product IDs."
538
+ ```
539
+
540
+ ### No Availability
541
+
542
+ If a product isn't available in the user's location:
543
+
544
+ ```javascript
545
+ // Shows: "Not available in your area" (customizable)
546
+ // User cannot add to cart
547
+ ```
548
+
549
+ ### Loading Errors
550
+
551
+ If product data fails to load:
552
+
553
+ ```javascript
554
+ // Shows error view with retry option
555
+ // Console logs detailed error information
556
+ ```
557
+
558
+ ## Use Cases
559
+
560
+ ### Basic Product Page
561
+
562
+ ```html
563
+ <!DOCTYPE html>
564
+ <html>
565
+ <head>
566
+ <script
567
+ defer
568
+ data-liquid-commerce-elements
569
+ data-token="YOUR_API_KEY"
570
+ data-env="production"
571
+ data-container-1="product"
572
+ data-product-1="00619947000020"
573
+ type="text/javascript"
574
+ src="https://elements.reservebar-worker.workers.dev/all/elements.js"
575
+ ></script>
576
+ </head>
577
+ <body>
578
+ <div id="product"></div>
579
+ </body>
580
+ </html>
581
+ ```
582
+
583
+ ### Dynamic Product Selection
584
+
585
+ ```javascript
586
+ import { Elements } from '@liquidcommerce/elements-sdk';
587
+
588
+ const client = await Elements('YOUR_API_KEY', { env: 'production' });
589
+
590
+ // User selects product from dropdown
591
+ document.getElementById('product-selector').addEventListener('change', async (e) => {
592
+ const selectedId = e.target.value;
593
+
594
+ // Clear existing product
595
+ document.getElementById('product').innerHTML = '';
596
+
597
+ // Inject new product
598
+ await client.injectProductElement([
599
+ { containerId: 'product', identifier: selectedId }
600
+ ]);
601
+ });
602
+ ```
603
+
604
+ ### Analytics Integration
605
+
606
+ ```javascript
607
+ // Track product views
608
+ window.addEventListener('lce:actions.product_loaded', (event) => {
609
+ gtag('event', 'view_item', {
610
+ items: [{
611
+ item_id: event.detail.data.identifier,
612
+ item_name: event.detail.data.name,
613
+ price: event.detail.data.priceInfo.minimum / 100
614
+ }]
615
+ });
616
+ });
617
+
618
+ // Track add to cart
619
+ window.addEventListener('lce:actions.product_add_to_cart', (event) => {
620
+ gtag('event', 'add_to_cart', {
621
+ items: [{
622
+ item_id: event.detail.data.identifier,
623
+ quantity: event.detail.data.quantity
624
+ }]
625
+ });
626
+ });
627
+ ```
628
+
629
+ ### Multi-Product Gallery
630
+
631
+ ```javascript
632
+ const products = [
633
+ '00619947000020',
634
+ '08504405135',
635
+ '08068660001',
636
+ '07549900125'
637
+ ];
638
+
639
+ const client = await Elements('YOUR_API_KEY', { env: 'production' });
640
+
641
+ // Create containers
642
+ const gallery = document.getElementById('product-gallery');
643
+ const productParams = products.map((id, index) => {
644
+ const container = document.createElement('div');
645
+ container.className = 'product-card';
646
+ container.id = `product-${index}`;
647
+ gallery.appendChild(container);
648
+
649
+ return { containerId: `product-${index}`, identifier: id };
650
+ });
651
+
652
+ // Inject all products
653
+ await client.injectProductElement(productParams);
654
+ ```
655
+
656
+ ## Best Practices
657
+
658
+ ### Container Sizing
659
+
660
+ Provide adequate space for the product component:
661
+
662
+ ```css
663
+ #product-display {
664
+ min-height: 600px; /* Prevents layout shift */
665
+ max-width: 1200px;
666
+ margin: 0 auto;
667
+ }
668
+ ```
669
+
670
+ ### Loading States
671
+
672
+ Show a loading indicator while the product loads:
673
+
674
+ ```javascript
675
+ // Show loader
676
+ document.getElementById('product').innerHTML = '<div class="loader">Loading...</div>';
677
+
678
+ await client.injectProductElement([
679
+ { containerId: 'product', identifier: '00619947000020' }
680
+ ]);
681
+
682
+ // Loader is automatically replaced when product loads
683
+ ```
684
+
685
+ ### Error Handling
686
+
687
+ Listen for errors and provide fallback:
688
+
689
+ ```javascript
690
+ try {
691
+ await client.injectProductElement([
692
+ { containerId: 'product', identifier: productId }
693
+ ]);
694
+ } catch (error) {
695
+ console.error('Failed to load product:', error);
696
+ document.getElementById('product').innerHTML =
697
+ '<p>Unable to load product. Please try again later.</p>';
698
+ }
699
+ ```
700
+
701
+ ### Performance
702
+
703
+ For product listings, lazy load products as they come into view:
704
+
705
+ ```javascript
706
+ const observer = new IntersectionObserver(async (entries) => {
707
+ for (const entry of entries) {
708
+ if (entry.isIntersecting) {
709
+ const container = entry.target;
710
+ const productId = container.dataset.productId;
711
+
712
+ await client.injectProductElement([
713
+ { containerId: container.id, identifier: productId }
714
+ ]);
715
+
716
+ observer.unobserve(container);
717
+ }
718
+ }
719
+ });
720
+
721
+ // Observe all product containers
722
+ document.querySelectorAll('.product-placeholder').forEach(el => {
723
+ observer.observe(el);
724
+ });
725
+ ```
726
+
727
+ ## Troubleshooting
728
+
729
+ ### Product Not Displaying
730
+
731
+ 1. Check browser console for errors
732
+ 2. Verify container ID exists in the DOM
733
+ 3. Confirm product identifier is valid
734
+ 4. Check that SDK is initialized (`window.LiquidCommerce.elements` exists)
735
+
736
+ ### Wrong Pricing
737
+
738
+ - Ensure user's address is set correctly
739
+ - Verify product has availability in user's location
740
+ - Check that fulfillment type is supported
741
+
742
+ ### Images Not Loading
743
+
744
+ - Check network tab for 404 errors
745
+ - Verify product has images in the catalog
746
+ - Ensure no ad blockers are interfering
747
+
748
+ ### Size Selector Not Showing
749
+
750
+ - Product must have multiple sizes to show selector
751
+ - Check that sizes have availability
752
+ - Verify theme config hasn't hidden the selector
753
+
754
+ ## See Also
755
+
756
+ - [Cart Component](./cart-component.md) - Shopping cart functionality
757
+ - [Address Component](./address-component.md) - Location management
758
+ - [Checkout Component](./checkout-component.md) - Complete purchase flow
759
+ - [Theming](./theming.md) - Customize appearance
760
+ - [Events](./events.md) - All available events
761
+ - [Actions API](../api/actions/product-actions.md) - Product actions reference