@dropins/storefront-pdp 1.2.1-alpha1 → 1.2.1-beta1

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 (51) hide show
  1. package/api/fetch-graphql/fetch-graphql.d.ts +2 -2
  2. package/api/initialize/initialize.d.ts +3 -3
  3. package/api.js +1 -0
  4. package/api.js.map +1 -0
  5. package/chunks/PriceRange.js +1 -0
  6. package/chunks/PriceRange.js.map +1 -0
  7. package/chunks/Swatches.js +1 -0
  8. package/chunks/Swatches.js.map +1 -0
  9. package/chunks/Zoom.js +2 -1
  10. package/chunks/Zoom.js.map +1 -0
  11. package/chunks/date.js +1 -0
  12. package/chunks/date.js.map +1 -0
  13. package/chunks/getFetchedProductData.js +1 -0
  14. package/chunks/getFetchedProductData.js.map +1 -0
  15. package/chunks/isProductConfigurationValid.js +7 -6
  16. package/chunks/isProductConfigurationValid.js.map +1 -0
  17. package/components/Swatches/Swatches.d.ts +1 -1
  18. package/containers/ProductAttributes/ProductAttributes.d.ts +8 -1
  19. package/containers/ProductAttributes.js +2 -1
  20. package/containers/ProductAttributes.js.map +1 -0
  21. package/containers/ProductDescription/ProductDescription.d.ts +1 -1
  22. package/containers/ProductDescription.js +1 -0
  23. package/containers/ProductDescription.js.map +1 -0
  24. package/containers/ProductDetails/ProductDetails.d.ts +3 -3
  25. package/containers/ProductDetails.js +2 -1
  26. package/containers/ProductDetails.js.map +1 -0
  27. package/containers/ProductGallery/ProductGallery.d.ts +2 -2
  28. package/containers/ProductGallery.js +1 -0
  29. package/containers/ProductGallery.js.map +1 -0
  30. package/containers/ProductHeader/ProductHeader.d.ts +1 -1
  31. package/containers/ProductHeader.js +1 -0
  32. package/containers/ProductHeader.js.map +1 -0
  33. package/containers/ProductOptions/ProductOptions.d.ts +2 -2
  34. package/containers/ProductOptions.js +1 -0
  35. package/containers/ProductOptions.js.map +1 -0
  36. package/containers/ProductPrice/ProductPrice.d.ts +1 -1
  37. package/containers/ProductPrice.js +1 -0
  38. package/containers/ProductPrice.js.map +1 -0
  39. package/containers/ProductQuantity/ProductQuantity.d.ts +1 -1
  40. package/containers/ProductQuantity.js +2 -1
  41. package/containers/ProductQuantity.js.map +1 -0
  42. package/containers/ProductShortDescription/ProductShortDescription.d.ts +1 -1
  43. package/containers/ProductShortDescription.js +1 -0
  44. package/containers/ProductShortDescription.js.map +1 -0
  45. package/fragments.js +1 -0
  46. package/fragments.js.map +1 -0
  47. package/lib/url-params.d.ts +1 -0
  48. package/package.json +1 -1
  49. package/render/render.d.ts +1 -1
  50. package/render.js +2 -1
  51. package/render.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isProductConfigurationValid.js","sources":["/@dropins/storefront-pdp/src/lib/url-params.ts","/@dropins/storefront-pdp/src/data/transforms/acdl-context.ts","/@dropins/storefront-pdp/src/lib/acdl.ts","/@dropins/storefront-pdp/src/data/models/acdl-models.ts","/@dropins/storefront-pdp/src/data/transforms/product-transform.ts","/@dropins/storefront-pdp/src/api/initialize/initialize.ts","/@dropins/storefront-pdp/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-pdp/src/api/getProductData/graphql/getProductData.graphql.ts","/@dropins/storefront-pdp/src/api/getProductData/getProductData.ts","/@dropins/storefront-pdp/src/api/getRefinedProduct/graphql/RefineProductQuery.graphql.ts","/@dropins/storefront-pdp/src/api/getRefinedProduct/getRefinedProduct.ts","/@dropins/storefront-pdp/src/api/fetchProductData/fetchProductData.ts","/@dropins/storefront-pdp/src/api/setProductConfigurationValues/setProductConfigurationValues.ts","/@dropins/storefront-pdp/src/api/getProductConfigurationValues/getProductConfigurationValues.ts","/@dropins/storefront-pdp/src/api/setProductConfigurationValid/setProductConfigurationValid.ts","/@dropins/storefront-pdp/src/api/isProductConfigurationValid/isProductConfigurationValid.ts"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nexport function setUrlParams(\n params: Record<string, string | number | null>\n): void {\n const urlSearchParams = new URLSearchParams(window.location.search);\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === null) {\n urlSearchParams.delete(key);\n } else {\n urlSearchParams.set(key, String(value));\n }\n });\n\n let url = window.location.pathname;\n url += `?${urlSearchParams.toString()}`;\n url += window.location.hash;\n\n window.history.replaceState({}, '', url);\n}\n\nexport function getUrlParams(): Record<string, string> {\n const urlSearchParams = new URLSearchParams(window.location.search);\n const params: Record<string, string> = {};\n\n urlSearchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n\nexport function getValidatedQuantityFromUrl(\n defaultQuantity: number = 1\n): number {\n const urlParams = getUrlParams() || {};\n const quantityParam = urlParams.quantity; // 'quantity' is the key\n\n if (quantityParam) {\n const parsedQuantity = parseInt(quantityParam, 10);\n\n if (\n !isNaN(parsedQuantity) &&\n Number.isInteger(parsedQuantity) &&\n parsedQuantity > 0\n ) {\n // Return the valid quantity from the URL\n return parsedQuantity;\n }\n }\n\n // Return the default quantity if the parameter is missing, invalid, or not positive\n return defaultQuantity;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { ProductModel } from '../models';\n\nimport { Product } from '../models/acdl-models';\n\nexport function transformProduct(product: ProductModel): Product {\n return {\n productId: Number(product?.externalId),\n name: product?.name,\n sku: product?.variantSku || product?.sku,\n topLevelSku: product?.sku,\n specialToDate: undefined,\n specialFromDate: undefined,\n newToDate: undefined,\n newFromDate: undefined,\n createdAt: undefined,\n updatedAt: undefined,\n manufacturer: undefined,\n countryOfManufacture: undefined,\n categories: undefined,\n productType: product?.productType,\n pricing: {\n regularPrice: product?.prices?.regular?.amount || 0,\n minimalPrice: product?.prices?.final?.minimumAmount,\n maximalPrice: product?.prices?.final?.maximumAmount,\n specialPrice: product?.prices?.final?.amount,\n tierPricing: undefined,\n currencyCode: product?.prices?.final?.currency || 'USD',\n },\n canonicalUrl: product?.url,\n mainImageUrl: product?.images?.[0]?.url,\n };\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\n/* Publish functions for the Adobe Client Data Layer (ACDL) */\n\nimport { ProductModel } from '../data/models';\nimport { transformProduct } from '../data/transforms/acdl-context';\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/contexts.ts\n */\nexport const contexts = {\n PRODUCT_CONTEXT: 'productContext',\n};\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/events.ts\n */\nexport const events = {\n PRODUCT_PAGE_VIEW: 'product-page-view',\n};\n\nexport function getAdobeDataLayer() {\n // @ts-ignore\n window.adobeDataLayer = window.adobeDataLayer || [];\n // @ts-ignore\n return window.adobeDataLayer;\n}\n\n/**\n* Sets a context in the Adobe Client Data Layer (ACDL)\n* Logic based on: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/Base.ts#L6\n*/\nfunction setContext(name: string, data: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n // Clear existing context\n adobeDataLayer.push({\n [name]: null,\n });\n\n // Set new context\n adobeDataLayer.push({\n [name]: data,\n });\n}\n\n/**\n * Pushes an event to the Adobe Client Data Layer (ACDL)\n * Logic based on: https://github.com/adobe/commerce-events/blob/1973d0ce28471ef190fa06dad6359ffa0ab51db6/packages/storefront-events-sdk/src/Base.ts#L34\n */\nfunction pushEvent(event: string, additionalContext?: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n adobeDataLayer.push((acdl: any) => {\n const state = acdl.getState ? acdl.getState() : {};\n\n acdl.push({\n event,\n eventInfo: {\n ...state,\n ...additionalContext,\n },\n });\n });\n}\n\n// Triggered when a product page is viewed\nexport function publishProductPageViewEvent(product: ProductModel) {\n const productItem = transformProduct(product);\n setContext(contexts.PRODUCT_CONTEXT, productItem);\n pushEvent(events.PRODUCT_PAGE_VIEW);\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\n/**\n * ACDL Product Types from:\n * https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/types/schemas/product.ts\n */\n\nexport type Product = {\n productId: number;\n name: string;\n sku: string;\n topLevelSku?: string | null;\n specialToDate?: string | null;\n specialFromDate?: string | null;\n newToDate?: string | null;\n newFromDate?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n manufacturer?: string | null;\n countryOfManufacture?: string | null;\n categories?: string[] | null;\n productType?: ProductType;\n pricing?: {\n regularPrice: number;\n minimalPrice?: number;\n maximalPrice?: number;\n specialPrice?: number;\n tierPricing?: {\n customerGroupId?: number | null;\n qty: number;\n value: number;\n }[];\n currencyCode: string | null;\n };\n canonicalUrl?: string | null;\n mainImageUrl?: string | null;\n};\n\nexport enum ProductType {\n ComplexProduct = 'complex',\n SimpleProduct = 'simple'\n}\n\nexport enum ProductViewType {\n ComplexProductView = 'ComplexProductView',\n SimpleProductView = 'SimpleProductView'\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { ProductType, ProductViewType } from '../models/acdl-models';\n\nexport function transformProductData(\n data: any,\n options?: {\n preselectFirstOption?: boolean;\n }\n): ProductModel | null {\n const isBundle =\n data?.options?.[0]?.values?.[0]?.__typename ===\n 'ProductViewOptionValueProduct';\n const optionUIDs = getOptionUIDs(\n data,\n isBundle,\n options?.preselectFirstOption\n );\n const productType =\n data?.__typename === ProductViewType.SimpleProductView\n ? ProductType.SimpleProduct\n : ProductType.ComplexProduct;\n\n const productData = data\n ? ({\n name: data.name,\n sku: data.sku,\n isBundle,\n addToCartAllowed: data.addToCartAllowed,\n inStock: data.inStock,\n shortDescription: data.shortDescription,\n metaDescription: data.metaDescription,\n metaKeyword: data.metaKeyword,\n metaTitle: data.metaTitle,\n description: data.description,\n images: transformImages(data),\n prices: transformPrices(data, isBundle, optionUIDs),\n attributes: transformAttributes(data),\n options: transformOptions(data, isBundle),\n optionUIDs,\n url: data.url,\n urlKey: data.urlKey,\n externalId: data.externalId,\n externalParentId: data.externalParentId,\n variantSku: data.variantSku,\n productType,\n } as ProductModel)\n : null;\n\n // extend the model with custom transformer\n return merge(\n productData,\n config.getConfig()?.models?.ProductDetails?.transformer?.(data) ??\n config.getConfig()?.models?.ProductDetails?.transform?.(data)\n );\n}\n\nfunction transformImages(data: any) {\n return data.images\n ?.filter((image: any) => !image.roles?.includes('hide_from_pdp'))\n ?.map((image: any) => {\n // Remove protocol from image URL\n image.url = image.url.replace(/^https?:/, '');\n\n return image;\n });\n}\n\nfunction transformAttributes(data: any) {\n return (\n data.attributes\n // only show attributes that are visible in PDP\n ?.filter(({ roles }: any) => roles?.indexOf('visible_in_pdp') !== -1)\n // transform attribute values\n ?.map(({ label, value, name }: any) => {\n return {\n id: name,\n label,\n value: value.toString().split(',').join(', '),\n };\n })\n );\n}\n\nfunction transformOptions(data: any, isBundle?: boolean) {\n const { options, optionUIDs } = data;\n\n return options?.map(({ id, title, required, multi, values }: any) => {\n const typename = values?.[0]?.__typename;\n let type: string = values?.[0].type;\n\n if (type) {\n type = type\n .replace('COLOR_HEX', 'color')\n .replace('TEXT', 'text')\n .replace('IMAGE', 'image');\n } else {\n type = 'dropdown';\n }\n\n return {\n id,\n type,\n typename,\n label: title,\n required,\n multiple: multi,\n items: isBundle\n ? mapBundleOptionValues(values, optionUIDs)\n : mapOptionValues(values, optionUIDs, type),\n };\n });\n}\n\nfunction mapBundleOptionValues(values: any, optionUIDs: string[]) {\n return values\n ?.filter(({ enabled }: any) => typeof enabled === 'undefined' || enabled)\n .map(({ id, title, inStock, isDefault, product }: any) => {\n return {\n id,\n inStock,\n label: title,\n selected: optionUIDs?.indexOf(id) > -1 || isDefault,\n value: id,\n product,\n };\n });\n}\n\nfunction mapOptionValues(values: any, optionUIDs: string[], type: string) {\n return values?.map(({ id, title, inStock, value }: any) => {\n return {\n id,\n inStock,\n label: title,\n selected: optionUIDs?.indexOf(id) > -1,\n value:\n type?.toLowerCase() === 'dropdown'\n ? id\n : value?.replace(/^https?:/, ''),\n };\n });\n}\n\nfunction transformPrices(\n data: any,\n isBundle: boolean,\n defaultOptionUIDs?: string[]\n) {\n const { price, priceRange, options, optionUIDs = defaultOptionUIDs } = data;\n let { __typename: type } = data;\n\n function getSimpleProductPrices() {\n const regularPrice = price.regular.amount.value;\n const finalPrice = price.final?.amount.value ?? price.regular.amount.value;\n\n const currency =\n price.regular.amount.currency === 'NONE' //temporary fix if there is no currency\n ? 'USD'\n : price?.regular.amount.currency;\n\n return [regularPrice, finalPrice, finalPrice, currency];\n }\n\n function getComplexProductPrices() {\n const finalMinimumPrice = priceRange?.minimum?.final.amount.value;\n const finalMaximumPrice = priceRange?.maximum?.final.amount.value;\n let regularPrice;\n\n if (\n priceRange?.minimum?.regular?.amount.value ===\n priceRange?.maximum?.regular?.amount.value\n ) {\n regularPrice = priceRange?.minimum?.regular?.amount.value;\n }\n\n const currency =\n priceRange?.minimum?.final?.amount.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount.currency;\n\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n function getBundleProductPrice() {\n // Currently the Catalog Service does not have support for the individual prices of the options of a fixed bundle,\n // so the price used in UI is taken from the priceRange object.\n\n // The dynamic bundle has full support in Catalog Service.\n // If there are pre-selected values of the option, then the starting price is the sum of those and\n // after each selection, the price is updated with the sum of prices for the selected options.\n // This is not supported by default and needs to be updated in the drop-in upon each selection.\n\n let maxSumRegular = 0;\n let bundlePrice = 0;\n options?.forEach((option: any) => {\n const values = option?.values;\n if (values && Array.isArray(values)) {\n const regularAmounts = values\n .map((value) => value?.product?.price?.regular?.amount?.value)\n .filter((amount) => amount !== undefined);\n\n const maxRegularAmount =\n regularAmounts.length > 0 ? Math.max(...regularAmounts) : 0;\n maxSumRegular += maxRegularAmount;\n }\n option?.values?.forEach((value: any) => {\n if (optionUIDs?.includes(value.id)) {\n bundlePrice += value?.product?.price?.final?.amount?.value;\n }\n });\n });\n\n const finalMinimumPrice = priceRange?.minimum?.final.amount.value;\n const finalMaximumPrice = priceRange?.maximum?.final.amount.value;\n let regularPrice;\n\n if (\n priceRange?.minimum?.regular?.amount.value ===\n priceRange?.maximum?.regular?.amount.value\n ) {\n regularPrice = priceRange?.minimum?.regular?.amount.value;\n }\n\n const currency =\n priceRange?.minimum?.final?.amount.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount.currency;\n\n if (isBundle && optionUIDs?.length < 1) {\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n return maxSumRegular === priceRange?.maximum.regular.amount.value\n ? [bundlePrice, bundlePrice, bundlePrice, currency]\n : [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n const [regularPrice, finalMinimumPrice, finalMaximumPrice, currency] =\n type === 'SimpleProductView'\n ? getSimpleProductPrices()\n : isBundle\n ? getBundleProductPrice()\n : getComplexProductPrices();\n\n const visible =\n type === 'SimpleProductView'\n ? price?.roles?.includes('visible')\n : priceRange?.maximum?.roles?.includes('visible') &&\n priceRange?.minimum?.roles?.includes('visible');\n\n if (finalMaximumPrice && finalMinimumPrice === finalMaximumPrice) {\n const hasDiscount = regularPrice && finalMinimumPrice !== regularPrice;\n\n return {\n regular: {\n amount: regularPrice,\n currency,\n variant: hasDiscount ? 'strikethrough' : 'default',\n },\n final: {\n amount: finalMaximumPrice,\n currency,\n variant: 'default',\n },\n visible,\n };\n }\n\n return {\n final: {\n minimumAmount: finalMinimumPrice,\n maximumAmount: finalMaximumPrice,\n currency,\n },\n visible,\n };\n}\n\nfunction getOptionUIDs(\n data: any,\n isBundle?: boolean,\n preselectFirstOption?: boolean\n): string[] {\n if (isBundle) {\n const selections: Array<string | null> = data?.options?.map(\n ({ values }: any) => {\n const defaultSelection =\n values?.find(({ isDefault }: any) => isDefault)?.id ?? null;\n const preselectedFirstOption = preselectFirstOption\n ? values[0].id\n : null;\n return defaultSelection || preselectedFirstOption;\n }\n );\n\n return selections.filter((selection) => selection !== null) as string[];\n }\n\n return data?.optionUIDs;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { Initializer } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { ProductModel } from '@/pdp/data/models';\nimport {\n fetchProductData,\n setProductConfigurationValid,\n setProductConfigurationValues,\n} from '@/pdp/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n getUrlParams,\n getValidatedQuantityFromUrl,\n} from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport { transformProductData } from '@/pdp/data/transforms/product-transform';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n defaultLocale?: string;\n sku?: string;\n acdl?: boolean;\n anchors?: string[];\n persistURLParams?: boolean;\n preselectFirstOption?: boolean;\n optionsUIDs?: string[];\n models?: {\n [name: string]: {\n initialData: any;\n /** @deprecated Use \"transformer\" instead */\n transform?: (data?: ProductModel) => ProductModel;\n transformer?: (data?: ProductModel) => ProductModel;\n fallbackData?: (\n parentProduct: any,\n simpleProduct: ProductModel\n ) => ProductModel;\n };\n };\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (_config) => {\n const initialData = _config?.models?.ProductDetails?.initialData;\n\n // Get URL parameters safely\n const urlParams = getUrlParams() || {};\n\n // Get optionsUIDs from URL params or config\n const optionsUIDs =\n urlParams.optionsUIDs?.split(',') || initialData?.optionsUIDs;\n\n // Get and validate quantity from URL params\n const initialQuantity = getValidatedQuantityFromUrl(1); // Default quantity to 1 - Ensures backward compatibility\n\n // Set default config\n const defaultConfig: ConfigProps = {\n defaultLocale: 'en-US',\n persistURLParams: false,\n acdl: false,\n optionsUIDs,\n };\n\n const config = { ...defaultConfig, ..._config };\n\n initialize.config.setConfig({ ...config });\n\n if (config?.sku) {\n // Get PDP data\n const data = initialData\n ? transformProductData(initialData)\n : await fetchProductData(config.sku, {\n preselectFirstOption: config.preselectFirstOption,\n });\n\n // Emit PDP initial data\n events.emit('pdp/data', data);\n\n // Set default values for product configuration\n const defaultValues = {\n sku: config.sku,\n quantity: initialQuantity, // Use the determined quantity from URL params or default to 1\n optionsUIDs: data?.optionUIDs,\n };\n\n setProductConfigurationValues(() => ({ ...defaultValues }));\n\n setProductConfigurationValid(() => {\n // configurable product, check if all options are selected\n if (data?.options) {\n // all selections should be made\n return data.options.length === data?.optionUIDs?.length;\n }\n\n // simple product\n return true;\n });\n\n // Publish ACDL event\n if (config.acdl && data) {\n publishProductPageViewEvent(data);\n }\n }\n },\n\n listeners: () => [\n events.on('locale', async () => {\n const { sku } = initialize.config.getConfig();\n\n if (sku) {\n const next = await fetchProductData(sku);\n events.emit('pdp/data', next);\n }\n }),\n ],\n});\n\nexport const config = initialize.config;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const GET_PRODUCT_DATA = `\nquery GET_PRODUCT_DATA($skus: [String]) {\n products(skus: $skus) {\n ...PRODUCT_FRAGMENT\n }\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { fetchGraphQl } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { GET_PRODUCT_DATA } from './graphql/getProductData.graphql';\n\nexport const getProductData = async (\n sku: string,\n options?: {\n preselectFirstOption?: boolean;\n optionsUIDs?: string[];\n },\n raw?: boolean\n): Promise<ProductModel | null> => {\n const { data } = await fetchGraphQl(GET_PRODUCT_DATA, {\n method: 'GET',\n variables: { skus: [sku] },\n });\n\n const product = data?.products?.[0];\n\n // If optionsUIDs are provided, override the optionsUIDs from the response\n if (options?.optionsUIDs) {\n product.optionUIDs = options.optionsUIDs;\n }\n\n if (!product) {\n return null;\n }\n return raw\n ? product\n : transformProductData(product, {\n preselectFirstOption: options?.preselectFirstOption,\n });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const REFINE_PRODUCT_QUERY = `\nquery REFINE_PRODUCT_QUERY(\n $optionIds: [String!]!\n $sku: String!\n) {\n # Refined Product\n refineProduct(\n optionIds: $optionIds \n sku: $sku\n ) {\n ...PRODUCT_FRAGMENT\n }\n\n # Parent Product\n products(skus: [$sku]) {\n ...PRODUCT_FRAGMENT\n }\n\n # %extendedPlaceholder%\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { fetchGraphQl, config } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { REFINE_PRODUCT_QUERY } from './graphql/RefineProductQuery.graphql';\n\nasync function getProductData(sku: string, optionUIDs: string[]): Promise<any> {\n const optionPairCombinations = getPairCombination(optionUIDs);\n const optionQueries = getProductOptionQuery(optionPairCombinations, sku);\n\n const mergedQueries = REFINE_PRODUCT_QUERY.replace(\n '# %extendedPlaceholder%',\n optionQueries\n );\n\n const { data } = await fetchGraphQl(mergedQueries, {\n method: 'GET',\n variables: { optionIds: optionUIDs, sku },\n });\n return data;\n}\n\nexport const getRefinedProduct = async (\n sku: string,\n optionUIDs: string[],\n anchorOptions?: string[],\n raw?: boolean\n): Promise<ProductModel | null> => {\n const data = await getProductData(sku, optionUIDs);\n if (!data) return null;\n\n let { products, refineProduct, ...refinedOptions } = data;\n\n const parent = products?.[0];\n\n const options = mergeRefinedOptions(\n Object.values(refinedOptions),\n parent.options,\n anchorOptions\n );\n\n // needed when anchor options exist\n if (anchorOptions?.length && refineProduct === null) {\n optionUIDs = updateSelections(options, optionUIDs, anchorOptions);\n const updatedRefinedData = await getProductData(sku, optionUIDs);\n refineProduct = updatedRefinedData?.refineProduct;\n }\n\n const response = {\n ...(refineProduct || parent),\n sku: parent.sku,\n name: parent.name,\n externalParentId: parent?.externalId,\n options,\n optionUIDs,\n variantSku:\n refineProduct?.__typename === 'SimpleProductView'\n ? refineProduct?.sku\n : undefined,\n };\n\n const refinedData = raw ? response : transformProductData(response);\n\n const fallback = config?.getConfig()?.models?.ProductDetails?.fallbackData;\n\n if (fallback) {\n return fallback(parent, refinedData!);\n }\n\n return refinedData;\n};\n\nfunction getPairCombination(arr: string[]): string[][] {\n if (arr.length < 2) {\n return [arr];\n }\n\n const result: string[][] = [];\n\n arr.forEach((item) => {\n const temp: string[] = [];\n\n arr.forEach((item2) => {\n if (item !== item2) {\n temp.push(item2);\n }\n });\n\n result.push(temp);\n });\n\n return result;\n}\n\nfunction getProductOptionQuery(optionUIDs: string[][], sku: string): string {\n return optionUIDs\n .map((ids: string[], i: number) => {\n return `\n ProductOption${i}: refineProduct(\n optionIds: [\n ${ids.map((id) => `\"${id}\"`).join(', ')}\n ]\n sku: \"${sku}\"\n ) {\n ... on ComplexProductView {\n options {\n ...PRODUCT_OPTION_FRAGMENT\n }\n }\n }\n `;\n })\n .join('');\n}\n\nfunction mergeRefinedOptions(\n options: {},\n parent: [] = [],\n anchorOptions?: string[]\n) {\n // flat _refined[].options[] to _refinedOptions[]\n const refinedOptions: any = Object.values(options)\n .filter((x) => !!x)\n .reduce((acc: any, curr: any) => {\n if (!curr.options) return [...acc];\n\n return [...acc, ...curr.options];\n }, []);\n\n // Create a map to store items by their id from original\n const map = new Map(parent.map((item: any) => [item.id, item]));\n\n // Iterate through refinedOptions and merge items\n refinedOptions.forEach((current: any) => {\n // anchor options should display all values, so no merge is performed\n if (anchorOptions?.includes(current.id)) {\n return;\n }\n\n map.set(current.id, current);\n });\n\n return [...map.values()];\n}\n\nfunction updateSelections(\n options: any[],\n optionsUIDs: string[],\n anchorOptions: string[]\n): string[] {\n const updatedOptionsUIDs: string[] = [];\n\n let optionValue: string;\n options.forEach((option: any) => {\n if (anchorOptions.includes(option.id)) {\n optionValue =\n option.values?.find((value: any) => optionsUIDs.includes(value?.id))\n ?.id || option.values[0]?.id;\n } else {\n optionValue = option.values[0]?.id; // TODO check if we should use default value instead\n }\n updatedOptionsUIDs.push(optionValue);\n });\n return updatedOptionsUIDs;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { getProductData, getRefinedProduct, config } from '@/pdp/api';\n\nexport type Options = {\n anchors?: string[];\n optionsUIDs?: string[];\n preselectFirstOption?: boolean;\n isBundle?: boolean;\n skipTransform?: boolean;\n};\n\nexport const fetchProductData = async (sku: string, options?: Options) => {\n // Get the default configuration values\n const { anchors: defaultAnchors, optionsUIDs: defaultOptionsUIDs } =\n config.getConfig();\n\n // Destructure the options object\n const {\n optionsUIDs = defaultOptionsUIDs,\n anchors = defaultAnchors,\n preselectFirstOption,\n isBundle,\n skipTransform,\n } = options ?? {};\n\n // ❗️ Warning ❗️\n // If we have default selections, but we cannot determine that the product is of type bundle, then the response is going to result in null objects and error(s).\n // Only the `products` object will be populated correctly, the `ProductOption${i}` and `refinedProduct` will be set as null.\n // This does not affect the UI, but the error message(s) can be detected by 3rd party tools that the client might be using.\n // This is accepted as a known behaviour, since a bundle product does not have variants.\n // However, if initialData is passed from the integration layer, then we can determine if the product is a bundle and set the isBundle flag accordingly.\n return !isBundle && optionsUIDs\n ? await getRefinedProduct(sku, optionsUIDs, anchors, skipTransform)\n : await getProductData(\n sku,\n {\n preselectFirstOption,\n optionsUIDs,\n },\n skipTransform\n );\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\nimport { ValuesModel } from '@/pdp/data/models';\nimport { getProductConfigurationValues } from '@/pdp/api';\n\nexport const setProductConfigurationValues = (\n callback: (prev: ValuesModel) => ValuesModel\n) => {\n const prev = getProductConfigurationValues();\n\n const next = callback(prev as ValuesModel);\n\n events.emit('pdp/values', { ...next });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\nimport { ValuesModel } from '@/pdp/data/models';\n\nexport const getProductConfigurationValues = (): ValuesModel | null => {\n return events._lastEvent['pdp/values']?.payload ?? null;\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\nimport { isProductConfigurationValid } from '@/pdp/api';\n\nexport const setProductConfigurationValid = (\n callback: (prev: boolean) => boolean\n) => {\n const prev = isProductConfigurationValid();\n\n const next = callback(prev as boolean);\n\n events.emit('pdp/valid', next);\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\n\nexport const isProductConfigurationValid = (): boolean | null => {\n return events._lastEvent['pdp/valid']?.payload ?? null;\n};\n"],"names":["setUrlParams","params","urlSearchParams","key","value","url","getUrlParams","getValidatedQuantityFromUrl","defaultQuantity","quantityParam","parsedQuantity","transformProduct","product","_b","_a","_d","_c","_f","_e","_h","_g","_j","_i","_l","_k","contexts","events","getAdobeDataLayer","setContext","name","data","adobeDataLayer","pushEvent","event","additionalContext","acdl","state","publishProductPageViewEvent","productItem","ProductType","ProductViewType","transformProductData","options","isBundle","optionUIDs","getOptionUIDs","productType","productData","transformImages","transformPrices","transformAttributes","transformOptions","merge","config","image","roles","label","id","title","required","multi","values","typename","type","mapBundleOptionValues","mapOptionValues","enabled","inStock","isDefault","defaultOptionUIDs","price","priceRange","getSimpleProductPrices","regularPrice","finalPrice","currency","getComplexProductPrices","finalMinimumPrice","finalMaximumPrice","getBundleProductPrice","maxSumRegular","bundlePrice","option","regularAmounts","amount","maxRegularAmount","visible","preselectFirstOption","defaultSelection","preselectedFirstOption","selection","initialize","Initializer","_config","initialData","optionsUIDs","initialQuantity","fetchProductData","defaultValues","setProductConfigurationValues","setProductConfigurationValid","sku","next","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","GET_PRODUCT_DATA","PRODUCT_FRAGMENT","getProductData","raw","REFINE_PRODUCT_QUERY","optionPairCombinations","getPairCombination","optionQueries","getProductOptionQuery","mergedQueries","getRefinedProduct","anchorOptions","products","refineProduct","refinedOptions","parent","mergeRefinedOptions","updateSelections","updatedRefinedData","response","refinedData","fallback","arr","result","item","temp","item2","ids","x","acc","curr","map","current","updatedOptionsUIDs","optionValue","defaultAnchors","defaultOptionsUIDs","anchors","skipTransform","callback","prev","getProductConfigurationValues","isProductConfigurationValid"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { FunctionComponent, VNode } from 'preact';
2
2
  import { HTMLAttributes, JSX } from 'preact/compat';
3
- import { ImageNodeRenderProps } from '../../../@adobe-commerce/elsie/src/components';
3
+ import { ImageNodeRenderProps } from '@dropins/tools/types/elsie/src/components';
4
4
 
5
5
  declare const supportedTypes: string[];
6
6
  type OptionValue = {
@@ -1,8 +1,15 @@
1
1
  import { HTMLAttributes } from 'preact/compat';
2
- import { Container } from '../../../@adobe-commerce/elsie/src/lib';
2
+ import { Container, SlotProps } from '@dropins/tools/types/elsie/src/lib';
3
3
  import { ProductModel } from '../../data/models';
4
4
 
5
+ type DefaultSlotContext = {
6
+ data: ProductModel | null;
7
+ };
5
8
  export interface ProductAttributesProps extends HTMLAttributes<HTMLDivElement> {
9
+ slots?: {
10
+ Attributes?: SlotProps<DefaultSlotContext>;
11
+ };
6
12
  }
7
13
  export declare const ProductAttributes: Container<ProductAttributesProps, ProductModel | null>;
14
+ export {};
8
15
  //# sourceMappingURL=ProductAttributes.d.ts.map
@@ -1,3 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{jsxs as a,jsx as i}from"@dropins/tools/preact-jsx-runtime.js";import{useState as n,useEffect as b}from"@dropins/tools/preact-compat.js";import{classes as h}from"@dropins/tools/lib.js";import{events as l}from"@dropins/tools/event-bus.js";import{i as P,t as S}from"../chunks/date.js";import{g as x}from"../chunks/getFetchedProductData.js";import{useText as L}from"@dropins/tools/i18n.js";import{c as j}from"../chunks/isProductConfigurationValid.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const I=({initialData:c=null,children:N,...r})=>{var s;const m=L("PDP.Product.Details.label").label,{defaultLocale:f="en-US"}=j.getConfig(),[u,p]=n(f),[o,d]=n(c);return b(()=>{const e=l.on("pdp/data",d),t=l.on("locale",p);return()=>{e==null||e.off(),t==null||t.off()}},[]),o?a("div",{...r,className:h(["pdp-attributes",r.className]),children:[m,i("ul",{children:(s=o==null?void 0:o.attributes)==null?void 0:s.map(({label:e,value:t},g)=>{const D=P(t)?S(t,u):t.toString();return a("li",{children:[e,": ",i("span",{dangerouslySetInnerHTML:{__html:D}})]},g)})})]}):null};I.getInitialData=x;export{I as ProductAttributes,I as default};
3
+ import{jsxs as c,jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import{useState as m,useMemo as h,useEffect as x}from"@dropins/tools/preact-compat.js";import{classes as P,Slot as A}from"@dropins/tools/lib.js";import{events as s}from"@dropins/tools/event-bus.js";import{i as L,t as j}from"../chunks/date.js";import{g as C}from"../chunks/getFetchedProductData.js";import{useText as I}from"@dropins/tools/i18n.js";import{c as M}from"../chunks/isProductConfigurationValid.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const N=({initialData:l=null,children:T,slots:e,...i})=>{var n;const u=I("PDP.Product.Details.label").label,{defaultLocale:f="en-US"}=M.getConfig(),[d,p]=m(f),[r,b]=m(l),g=h(()=>({data:r}),[r]);return x(()=>{const o=s.on("pdp/data",b),t=s.on("locale",p);return()=>{o==null||o.off(),t==null||t.off()}},[]),r?c("div",{...i,className:P(["pdp-attributes",i.className]),children:[u,e!=null&&e.Attributes?a(A,{name:"Attributes",slot:e==null?void 0:e.Attributes,context:{...g}}):a("ul",{children:(n=r==null?void 0:r.attributes)==null?void 0:n.map(({label:o,value:t},D)=>{const S=L(t)?j(t,d):t.toString();return c("li",{children:[o,": ",a("span",{dangerouslySetInnerHTML:{__html:S}})]},D)})})]}):null};N.getInitialData=C;export{N as ProductAttributes,N as default};
4
+ //# sourceMappingURL=ProductAttributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductAttributes.js","sources":["/@dropins/storefront-pdp/src/containers/ProductAttributes/ProductAttributes.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState, useMemo } from 'preact/compat';\nimport { classes, Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { isDateValid, toDateString } from '@/pdp/lib/date';\nimport { config, getFetchedProductData } from '@/pdp/api';\n\ntype DefaultSlotContext = {\n data: ProductModel | null;\n};\n\nexport interface ProductAttributesProps extends HTMLAttributes<HTMLDivElement> {\n slots?: {\n Attributes?: SlotProps<DefaultSlotContext>;\n };\n}\n\nexport const ProductAttributes: Container<\n ProductAttributesProps,\n ProductModel | null\n> = ({ initialData = null, children, slots, ...props }) => {\n const DetailsLabel = useText('PDP.Product.Details.label').label;\n const { defaultLocale = 'en-US' } = config.getConfig();\n\n const [locale, setLocale] = useState<string>(defaultLocale);\n\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const defaultSlotContext: DefaultSlotContext = useMemo(\n () => ({ data }),\n [data]\n );\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData);\n const localeEvent = events.on('locale', setLocale);\n\n return () => {\n dataEvent?.off();\n localeEvent?.off();\n };\n }, []);\n\n if (!data) return null;\n\n return (\n <div {...props} className={classes(['pdp-attributes', props.className])}>\n {DetailsLabel}\n {slots?.Attributes ? (\n <Slot\n name=\"Attributes\"\n slot={slots?.Attributes}\n context={{ ...defaultSlotContext }}\n />\n ) : (\n <ul>\n {data?.attributes?.map(({ label, value }, key) => {\n const __html = isDateValid(value)\n ? toDateString(value, locale)\n : value.toString();\n\n return (\n <li key={key}>\n {/* eslint-disable-next-line react/no-danger */}\n {label}: <span dangerouslySetInnerHTML={{ __html }} />\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n};\n\nProductAttributes.getInitialData = getFetchedProductData;\n"],"names":["ProductAttributes","initialData","children","slots","props","DetailsLabel","useText","defaultLocale","config","locale","setLocale","useState","data","setData","defaultSlotContext","useMemo","useEffect","dataEvent","events","localeEvent","jsxs","classes","jsx","Slot","_a","label","value","key","__html","isDateValid","toDateString","getFetchedProductData"],"mappings":"6hBAkCa,MAAAA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,SAAAC,EAAU,MAAAC,EAAO,GAAGC,KAAY,OACnD,MAAAC,EAAeC,EAAQ,2BAA2B,EAAE,MACpD,CAAE,cAAAC,EAAgB,SAAYC,EAAO,UAAU,EAE/C,CAACC,EAAQC,CAAS,EAAIC,EAAiBJ,CAAa,EAEpD,CAACK,EAAMC,CAAO,EAAIF,EAA8BV,CAAW,EAE3Da,EAAyCC,EAC7C,KAAO,CAAE,KAAAH,CAAK,GACd,CAACA,CAAI,CACP,EAYI,OAVJI,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYL,CAAO,EACzCM,EAAcD,EAAO,GAAG,SAAUR,CAAS,EAEjD,MAAO,IAAM,CACXO,GAAA,MAAAA,EAAW,MACXE,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,EAAE,EAEAP,EAGHQ,EAAC,MAAK,CAAA,GAAGhB,EAAO,UAAWiB,EAAQ,CAAC,iBAAkBjB,EAAM,SAAS,CAAC,EACnE,SAAA,CAAAC,EACAF,GAAA,MAAAA,EAAO,WACNmB,EAACC,EAAA,CACC,KAAK,aACL,KAAMpB,GAAA,YAAAA,EAAO,WACb,QAAS,CAAE,GAAGW,CAAmB,CAAA,CACnC,EAECQ,EAAA,KAAA,CACE,UAAME,EAAAZ,GAAA,YAAAA,EAAA,aAAA,YAAAY,EAAY,IAAI,CAAC,CAAE,MAAAC,EAAO,MAAAC,CAAM,EAAGC,IAAQ,CAC1C,MAAAC,EAASC,EAAYH,CAAK,EAC5BI,EAAaJ,EAAOjB,CAAM,EAC1BiB,EAAM,SAAS,EAEnB,SACG,KAEE,CAAA,SAAA,CAAAD,EAAM,KAAGH,EAAA,OAAA,CAAK,wBAAyB,CAAE,OAAAM,EAAU,CAAA,CAAA,CAAA,EAF7CD,CAGT,CAAA,EAGN,CAAA,CAAA,EAEJ,EA3BgB,IA6BpB,EAEA3B,EAAkB,eAAiB+B"}
@@ -1,5 +1,5 @@
1
1
  import { HTMLAttributes } from 'preact/compat';
2
- import { Container } from '../../../@adobe-commerce/elsie/src/lib';
2
+ import { Container } from '@dropins/tools/types/elsie/src/lib';
3
3
  import { ProductModel } from '../../data/models';
4
4
 
5
5
  export interface ProductDescriptionProps extends HTMLAttributes<HTMLDivElement> {
@@ -1,3 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
3
  import{jsx as n}from"@dropins/tools/preact-jsx-runtime.js";import{useState as i,useEffect as a}from"@dropins/tools/preact-compat.js";import{classes as c}from"@dropins/tools/lib.js";import{events as m}from"@dropins/tools/event-bus.js";import{g as l}from"../chunks/getFetchedProductData.js";const f=({initialData:o=null,children:p,...r})=>{const[t,s]=i(o);return a(()=>{const e=m.on("pdp/data",s);return()=>{e==null||e.off()}},[]),t?n("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.description)??""},...r,className:c(["pdp-description",r.className])}):null};f.getInitialData=l;export{f as ProductDescription,f as default};
4
+ //# sourceMappingURL=ProductDescription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductDescription.js","sources":["/@dropins/storefront-pdp/src/containers/ProductDescription/ProductDescription.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { getFetchedProductData } from '@/pdp/api';\n\nexport interface ProductDescriptionProps\n extends HTMLAttributes<HTMLDivElement> {}\n\nexport const ProductDescription: Container<\n ProductDescriptionProps,\n ProductModel | null\n> = ({ initialData = null, children, ...props }) => {\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData);\n\n return () => {\n dataEvent?.off();\n };\n }, []);\n\n if (!data) return null;\n\n return (\n <div\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: data?.description ?? '' }}\n {...props}\n className={classes(['pdp-description', props.className])}\n />\n );\n};\n\nProductDescription.getInitialData = getFetchedProductData;\n"],"names":["ProductDescription","initialData","children","props","data","setData","useState","useEffect","dataEvent","events","jsx","classes","getFetchedProductData"],"mappings":"iSAyBa,MAAAA,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,SAAAC,EAAU,GAAGC,KAAY,CAClD,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAA8BL,CAAW,EAU7D,OARJM,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYJ,CAAO,EAE/C,MAAO,IAAM,CACXG,GAAA,MAAAA,EAAW,KACb,CACF,EAAG,EAAE,EAEAJ,EAGHM,EAAC,MAAA,CAEC,wBAAyB,CAAE,QAAQN,GAAA,YAAAA,EAAM,cAAe,EAAG,EAC1D,GAAGD,EACJ,UAAWQ,EAAQ,CAAC,kBAAmBR,EAAM,SAAS,CAAC,CAAA,CACzD,EARgB,IAUpB,EAEAH,EAAmB,eAAiBY"}
@@ -1,9 +1,9 @@
1
1
  import { HTMLAttributes } from 'preact/compat';
2
- import { Container, SlotProps, SlotMethod, ResolveImageUrlOptions } from '../../../@adobe-commerce/elsie/src/lib';
3
- import { ButtonProps } from '../../../@adobe-commerce/elsie/src/components';
2
+ import { Container, SlotProps, SlotMethod, ResolveImageUrlOptions } from '@dropins/tools/types/elsie/src/lib';
3
+ import { ButtonProps } from '@dropins/tools/types/elsie/src/components';
4
4
  import { ProductModel } from '../../data/models';
5
5
 
6
- type IconType = keyof typeof import('@adobe-commerce/elsie/icons');
6
+ type IconType = keyof typeof import('@dropins/tools/types/elsie/src/icons');
7
7
  /** @deprecated This type is part of the deprecated ProductDetails component. */
8
8
  export type Values = {
9
9
  sku: string;
@@ -1,3 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as e,jsxs as V,Fragment as vt}from"@dropins/tools/preact-jsx-runtime.js";import{useState as z,Children as mt,useEffect as f,useCallback as g,useMemo as Ot}from"@dropins/tools/preact-compat.js";import{VComponent as m,classes as w,Slot as A,toLanguageTag as ut}from"@dropins/tools/lib.js";import{Incrementer as It,Image as bt,Button as At,Icon as dt,Breadcrumbs as lt}from"@dropins/tools/components.js";/* empty css */import{Z as st,C,O as Dt}from"../chunks/Zoom.js";import{useText as x}from"@dropins/tools/i18n.js";import{P as Pt}from"../chunks/PriceRange.js";import{S as wt}from"../chunks/Swatches.js";import"@dropins/tools/preact.js";import{c as St,n as Vt,h as ht,p as kt,o as yt,t as Ut}from"../chunks/isProductConfigurationValid.js";import{events as tt}from"@dropins/tools/event-bus.js";import{i as Bt,t as xt}from"../chunks/date.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const Lt=({title:o,breadcrumbs:N,galleryContent:S,infoContent:v,productContent:O,sku:I,outOfStock:k,shortDescription:L,description:r,attributes:et,images:c,options:i,price:u,specialPrice:K,className:G,children:it,quantity:J,actions:q,carouselConfig:n,zoomType:$="overlay",closeButton:nt=!0,...rt})=>{var T,Q,E,_,F,j,W,X,Y;const pt=x("PDP.Product.RegularPrice.label").label,U=x("PDP.Product.SpecialPrice.label").label,ct=x("PDP.Product.OutOfStock.label").label,B=x("PDP.Product.Image.label").label,[H,t]=z(null),s=c!=null&&c.length?c.map((D,y)=>{var Z;const M=((Z=o==null?void 0:o.props)==null?void 0:Z.children)&&(B==null?void 0:B.replace("{product}",o.props.children.toString()).replace("{key}",String(y+1)).replace("{total}",String(c.length)));return $==="zoom"?e(st,{closeButton:nt,children:e(m,{node:D,loading:y===0?"eager":"lazy",alt:M},y)}):e(m,{node:D,loading:y===0?"eager":"lazy",alt:M,onClick:()=>t(y)},y)}):e("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0}),P=(T=n==null?void 0:n.thumbnails)!=null&&T.length?n.thumbnails.map((D,y)=>{var M;return e(m,{node:D,loading:(n==null?void 0:n.thumbnailsLoadingMode)||"lazy",alt:((M=o==null?void 0:o.props)==null?void 0:M.children)&&(B==null?void 0:B.replace("{product}",o.props.children.toString()).replace("{key}",String(y+1)).replace("{total}",String(c.length)))},y)}):e("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0});return V("div",{...rt,className:w(["pdp-product",G]),children:[N&&e(m,{node:N,className:"pdp-product__breadcrumbs"}),V("div",{className:"pdp-product__column-container pdp-product__gallery-column",children:[e("div",{className:"pdp-product__column-body",children:(Q=n==null?void 0:n.controls)!=null&&Q.desktop?e(C,{className:"pdp-product__overlay__carousel",arrows:(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?n.controls.desktop:"dots",arrowsOnMainImage:n==null?void 0:n.arrowsOnMainImage,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,peak:((E=n==null?void 0:n.thumbnails)==null?void 0:E.length)>1&&((_=n==null?void 0:n.peak)==null?void 0:_.desktop)||!1,gap:(n==null?void 0:n.gap)||null,width:"100%",height:"100%",defaultIndex:H||0,thumbnails:P,children:s}):e(qt,{className:"pdp-product__images",gap:"small",children:s})}),S&&e(m,{node:S,className:"pdp-product__gallery-content"})]}),V("div",{className:"pdp-product__column-container pdp-product__content-column",children:[V("div",{className:"pdp-product__column-body",children:[V("div",{className:"pdp-product__header",children:[o&&e(m,{node:o,className:"pdp-product__title"}),I&&e(m,{node:I,className:"pdp-product__sku"})]}),V("div",{className:"pdp-product__prices",children:[K&&e(m,{node:K,className:w(["pdp-product__price-special","pdp-product__price"]),"aria-label":U,role:"text"}),u&&e(m,{node:u,className:w(["pdp-product__price-regular","pdp-product__price--grey"]),"aria-label":pt,role:"text"})]}),(F=n==null?void 0:n.controls)!=null&&F.mobile&&((j=n==null?void 0:n.controls)==null?void 0:j.mobile)==="thumbnailsRow"?e(C,{className:"pdp-product__images pdp-product__images--carousel pdp-product__images--carousel--thumbnails",width:"100%",height:"auto",arrows:(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?"thumbnailsRow":null,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,peak:((W=n==null?void 0:n.thumbnails)==null?void 0:W.length)>1&&((X=n==null?void 0:n.peak)==null?void 0:X.mobile)||!1,gap:(n==null?void 0:n.gap)||null,thumbnails:P,children:s}):e(C,{className:"pdp-product__images pdp-product__images--carousel",peak:((Y=n==null?void 0:n.peak)==null?void 0:Y.mobile)&&(c==null?void 0:c.length)>1,gap:(n==null?void 0:n.gap)||null,width:"100%",height:"auto",arrows:(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?"dots":null,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,children:s}),V("div",{className:w(["pdp-product__actions",["pdp-product__actions--out-of-stock",k]]),children:[k&&e("div",{className:"pdp-product__out-of-stock__text",children:ct}),i&&e(m,{node:i,className:w(["pdp-product__options"])}),J&&e("div",{className:"pdp-product__quantity",children:e(m,{node:J})}),q&&e(m,{node:q,className:w(["pdp-product__buttons"])})]}),L&&e(m,{node:L,className:w(["pdp-product__short_description"])}),r&&e(m,{node:r,className:w(["pdp-product__description"])}),et?e("div",{className:"pdp-product__attributes",children:et}):null]}),v&&e(m,{node:v,className:"pdp-product__info-content"})]}),O&&e(m,{node:O,className:"pdp-product__content"}),H===null?null:e(Dt,{className:"pdp-product__overlay",onClose:()=>t(null),centered:!0,children:e(C,{className:"pdp-product__overlay__carousel",arrows:(c==null?void 0:c.length)>1,width:"100%",height:"100%",defaultIndex:H||0,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?"dots":null,isZoomed:!0,children:s})})]})},qt=({children:o,gap:N=null,className:S,style:v,...O})=>{const I=mt.count(o);return e("div",{...O,className:w(["pdp-gallery-grid",S]),style:{"--gap":N?`var(--spacing-${N})`:"0px",...v},children:mt.map(o,(k,L)=>e("div",{className:"pdp-gallery-grid__item",children:e(m,{node:k,loading:L===0?"eager":"lazy"},k.props.src)},I+L))})},Mt=({sku:o,hideSku:N,hideQuantity:S,hideShortDescription:v,hideDescription:O,hideAttributes:I,hideURLParams:k,hideSelectedOptionValue:L,slots:r,children:et,initialData:c,carousel:i,optionsConfig:u,useACDL:K,onAddToCart:G,zoomType:it,closeButton:J=!0,disableDropdownPreselection:q,...n})=>{var Z,at,ot,_t;const $=x("PDP.Product.AddToCart.label").label,nt=x("PDP.Product.Incrementer.label").label,rt=x("PDP.Product.Details.label").label,pt=x("PDP.Swatches.ChooseOption.label").label,[U,ct]=z(St.getConfig().defaultLocale||"en-US"),[B,H]=z(),[t=null,s]=z(c),[P,T]=z(()=>{const p=Vt()||{};let d=1;const l=p.quantity;if(l){const a=parseInt(l,10);!isNaN(a)&&Number.isInteger(a)&&a>0&&(d=a)}const h={sku:o,quantity:d};return t!=null&&t.optionUIDs&&(h.optionsUIDs=t.optionUIDs),h}),[Q,E]=z(()=>{var p,d;return!(t!=null&&t.options&&((p=t==null?void 0:t.options)==null?void 0:p.length)>0&&((d=t==null?void 0:t.optionUIDs)==null?void 0:d.length)!==(t==null?void 0:t.options.length))}),_={data:t,values:P,valid:Q};function F(p){return p==null?void 0:p.some(d=>(d==null?void 0:d.typename)==="ProductViewOptionValueProduct")}f(()=>{const p=tt.on("pdp/data",l=>{l&&(s(l),T(h=>({...h,sku:l.sku,optionsUIDs:l.optionUIDs})))}),d=tt.on("pdp/setValues",l=>{T(h=>({...h,...l}))});return()=>{d==null||d.off(),p==null||p.off()}},[]),f(()=>{const p=tt.on("locale",d=>{d!==U&&(ct(d),ht(o,{preselectFirstOption:!q,anchors:u==null?void 0:u.anchorOptions}).then(s))});return()=>{p==null||p.off()}},[q,U,u==null?void 0:u.anchorOptions,o]),f(()=>{K&&c&&Object.keys(c).length>0&&kt(c)},[c]);const j=g(p=>{T(d=>({...d,...p}))},[]);f(()=>{tt.emit("pdp/values",P)},[JSON.stringify(P)]);const W=g(async p=>{var h,a;let d=Object.entries(p).filter(([b,R])=>R.label!==pt).map(([b,R])=>p[b].value).filter(b=>b!==void 0);!k&&(t!=null&&t.options)&&!F(t.options)&&yt({optionsUIDs:d.join(",")}),j({optionsUIDs:d}),E((d==null?void 0:d.length)===((h=t==null?void 0:t.options)==null?void 0:h.length));const l=await ht(o,{anchors:u==null?void 0:u.anchorOptions,isBundle:t==null?void 0:t.isBundle,optionsUIDs:d,preselectFirstOption:!q});s(l),(a=u==null?void 0:u.anchorOptions)!=null&&a.length&&X(l,d)},[o]),X=g((p,d)=>{var a;const l=(p==null?void 0:p.optionUIDs)??[];d.every(b=>l.includes(b))||(H(p==null?void 0:p.options),j({optionsUIDs:l}),E((l==null?void 0:l.length)===((a=p==null?void 0:p.options)==null?void 0:a.length)))},[o]),Y=g(p=>{Object.keys(p).length!==0&&E(!1)},[]),D=Ot(()=>{var p;return(p=t==null?void 0:t.attributes)==null?void 0:p.map(({label:d,value:l},h)=>{const a=Bt(l)?xt(l,U):l.toString();return V("li",{children:[d,": ",e("span",{dangerouslySetInnerHTML:{__html:a}})]},h)})},[t==null?void 0:t.attributes,U]),y=!S&&(t!=null&&t.inStock)?e(A,{name:"Quantity",slot:r==null?void 0:r.Quantity,context:{..._},children:e(It,{name:"quantity",defaultValue:P.quantity.toString(),value:P.quantity.toString(),min:1,"aria-label":nt,className:"pdp-product__quantity",onValue:p=>{const d=Number(p);j({quantity:d}),!k&&(t!=null&&t.options)&&(F(t.options)||yt({quantity:d}))}},"quantity")}):void 0,M=()=>{if(t!=null&&t.options)return e(A,{name:"Options",slot:r==null?void 0:r.Options,context:{..._},children:e(wt,{selectedUIDs:P.optionsUIDs,options:t.options,defaultOptions:P.optionsUIDs,selectionsToUpdate:B,hideSelectedValue:L,disablePreselections:q,onValues:W,onErrors:Y})})};return e("div",{...n,children:e(Lt,{title:e(A,{name:"Title",slot:r==null?void 0:r.Title,context:{..._},children:t==null?void 0:t.name}),sku:N?void 0:e(A,{name:"SKU",slot:r==null?void 0:r.SKU,context:{..._},children:t==null?void 0:t.sku}),options:M(),breadcrumbs:(r==null?void 0:r.Breadcrumbs)&&e(A,{name:"Breadcrumbs",slot:r==null?void 0:r.Breadcrumbs,context:{..._,setSeparator(p){this._registerMethod((...d)=>{const l=p(...d),h=l&&e(dt,{source:l});this._setProps(a=>({...a,separator:h,children:[e(lt,{separator:h,categories:a.categories})]}))})},appendLink(p){this._registerMethod((...d)=>{const{text:l,...h}=p(...d),a=e("a",{...h,children:l});this._setProps(b=>{const R=[...b.categories||[],a];return{...b,categories:R,children:[e(lt,{separator:b.separator,categories:R})]}})})},appendHTMLElement(p){this._registerMethod((...d)=>{const l=p(...d),h=this._htmlElementToVNode(l);this._setProps(a=>{const b=[...a.categories||[],h];return{...a,categories:b,children:[e(lt,{separator:a.separator,categories:b})]}})})}}}),quantity:y,actions:e(A,{name:"Actions",slot:r==null?void 0:r.Actions,context:{..._,appendButton(p){this._registerMethod((...d)=>{const l=p(...d);if(!l)return;const{text:h,icon:a,...b}=l,R=e(At,{type:"button",...b,icon:a&&e(dt,{source:a}),children:h});this._setProps(Nt=>({children:[...Nt.children||[],R]}))})}},children:!(r!=null&&r.Actions)&&e(At,{size:"medium",type:"submit",icon:e(dt,{source:"Cart"}),disabled:!(t!=null&&t.inStock)||!Q,"aria-label":$,onClick:()=>G==null?void 0:G(P),children:$})}),shortDescription:v?void 0:e(A,{name:"ShortDescription",slot:r==null?void 0:r.ShortDescription,context:{..._},children:e("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.shortDescription)??""}})}),description:O?void 0:e(A,{name:"Description",slot:r==null?void 0:r.Description,context:{..._},children:e("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.description)??""}})}),images:((Z=t==null?void 0:t.images)==null?void 0:Z.map(({label:p,url:d})=>{var l,h;return e(bt,{title:p,alt:p,src:d,width:((l=i==null?void 0:i.imageParams)==null?void 0:l.width)??960,height:((h=i==null?void 0:i.imageParams)==null?void 0:h.height)??1191,params:(i==null?void 0:i.imageParams)??{width:960}},d)}))??[],specialPrice:(at=t==null?void 0:t.prices)!=null&&at.visible?e(A,{name:"SpecialPrice",slot:r==null?void 0:r.SpecialPrice,context:{..._},children:e(Pt,{...t.prices.final,locale:ut(U)})}):void 0,price:(ot=t==null?void 0:t.prices)!=null&&ot.visible&&t.prices.regular&&t.prices.final.amount!==(t==null?void 0:t.prices.regular.amount)?e(A,{name:"RegularPrice",slot:r==null?void 0:r.RegularPrice,context:{..._},children:e(Pt,{...t.prices.regular,locale:ut(U)})}):void 0,zoomType:it,closeButton:J,carouselConfig:{...i,thumbnails:i&&Object.keys(i).length?((_t=t==null?void 0:t.images)==null?void 0:_t.map(({label:p,url:d})=>{var l,h;return e(bt,{title:p,alt:p,src:d,width:((l=i==null?void 0:i.thumbnailParams)==null?void 0:l.width)??200,height:((h=i==null?void 0:i.thumbnailParams)==null?void 0:h.height)??248,params:(i==null?void 0:i.thumbnailParams)??{width:200}},d)}))??[]:[]},outOfStock:!(t!=null&&t.inStock),attributes:I?void 0:e(A,{name:"Attributes",slot:r==null?void 0:r.Attributes,context:{..._},children:D!=null&&D.length?V(vt,{children:[rt,e("ul",{children:D})]}):null}),galleryContent:(r==null?void 0:r.GalleryContent)&&e(A,{name:"GalleryContent",slot:r.GalleryContent,context:{..._}}),infoContent:(r==null?void 0:r.InfoContent)&&e(A,{name:"InfoContent",slot:r.InfoContent,context:{..._}}),productContent:(r==null?void 0:r.Content)&&e(A,{name:"Content",slot:r.Content,context:{..._}})})})};Mt.getInitialData=async function({sku:o,disableDropdownPreselection:N=!1,optionsConfig:S}){var O,I;const v=(I=(O=St.getConfig().models)==null?void 0:O.ProductDetails)==null?void 0:I.initialData;return v?Ut(v):ht(o,{preselectFirstOption:!N,anchors:S==null?void 0:S.anchorOptions})};export{Mt as ProductDetails,Mt as default};
3
+ import{jsx as e,jsxs as V,Fragment as vt}from"@dropins/tools/preact-jsx-runtime.js";import{useState as z,Children as mt,useEffect as f,useCallback as g,useMemo as Ot}from"@dropins/tools/preact-compat.js";import{VComponent as m,classes as w,Slot as A,toLanguageTag as ut}from"@dropins/tools/lib.js";import{Incrementer as It,Image as bt,Button as At,Icon as dt,Breadcrumbs as lt}from"@dropins/tools/components.js";/* empty css */import{Z as Dt,C,O as st}from"../chunks/Zoom.js";import{useText as x}from"@dropins/tools/i18n.js";import{P as Pt}from"../chunks/PriceRange.js";import{S as wt}from"../chunks/Swatches.js";import"@dropins/tools/preact.js";import{c as St,n as Vt,h as ht,p as kt,o as yt,t as Ut}from"../chunks/isProductConfigurationValid.js";import{events as tt}from"@dropins/tools/event-bus.js";import{i as Bt,t as xt}from"../chunks/date.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const Lt=({title:a,breadcrumbs:N,galleryContent:S,infoContent:v,productContent:O,sku:I,outOfStock:k,shortDescription:L,description:r,attributes:et,images:c,options:h,price:u,specialPrice:K,className:G,children:it,quantity:J,actions:M,carouselConfig:n,zoomType:$="overlay",closeButton:nt=!0,...rt})=>{var T,Q,E,_,F,j,W,X,Y;const pt=x("PDP.Product.RegularPrice.label").label,U=x("PDP.Product.SpecialPrice.label").label,ct=x("PDP.Product.OutOfStock.label").label,B=x("PDP.Product.Image.label").label,[H,t]=z(null),D=c!=null&&c.length?c.map((s,y)=>{var Z;const q=((Z=a==null?void 0:a.props)==null?void 0:Z.children)&&(B==null?void 0:B.replace("{product}",a.props.children.toString()).replace("{key}",String(y+1)).replace("{total}",String(c.length)));return $==="zoom"?e(Dt,{closeButton:nt,children:e(m,{node:s,loading:y===0?"eager":"lazy",alt:q},y)}):e(m,{node:s,loading:y===0?"eager":"lazy",alt:q,onClick:()=>t(y)},y)}):e("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0}),P=(T=n==null?void 0:n.thumbnails)!=null&&T.length?n.thumbnails.map((s,y)=>{var q;return e(m,{node:s,loading:(n==null?void 0:n.thumbnailsLoadingMode)||"lazy",alt:((q=a==null?void 0:a.props)==null?void 0:q.children)&&(B==null?void 0:B.replace("{product}",a.props.children.toString()).replace("{key}",String(y+1)).replace("{total}",String(c.length)))},y)}):e("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product__images__placeholder","aria-hidden":!0});return V("div",{...rt,className:w(["pdp-product",G]),children:[N&&e(m,{node:N,className:"pdp-product__breadcrumbs"}),V("div",{className:"pdp-product__column-container pdp-product__gallery-column",children:[e("div",{className:"pdp-product__column-body",children:(Q=n==null?void 0:n.controls)!=null&&Q.desktop?e(C,{className:"pdp-product__overlay__carousel",arrows:(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?n.controls.desktop:"dots",arrowsOnMainImage:n==null?void 0:n.arrowsOnMainImage,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,peak:((E=n==null?void 0:n.thumbnails)==null?void 0:E.length)>1&&((_=n==null?void 0:n.peak)==null?void 0:_.desktop)||!1,gap:(n==null?void 0:n.gap)||null,width:"100%",height:"100%",defaultIndex:H||0,thumbnails:P,children:D}):e(Mt,{className:"pdp-product__images",gap:"small",children:D})}),S&&e(m,{node:S,className:"pdp-product__gallery-content"})]}),V("div",{className:"pdp-product__column-container pdp-product__content-column",children:[V("div",{className:"pdp-product__column-body",children:[V("div",{className:"pdp-product__header",children:[a&&e(m,{node:a,className:"pdp-product__title"}),I&&e(m,{node:I,className:"pdp-product__sku"})]}),V("div",{className:"pdp-product__prices",children:[K&&e(m,{node:K,className:w(["pdp-product__price-special","pdp-product__price"]),"aria-label":U,role:"text"}),u&&e(m,{node:u,className:w(["pdp-product__price-regular","pdp-product__price--grey"]),"aria-label":pt,role:"text"})]}),(F=n==null?void 0:n.controls)!=null&&F.mobile&&((j=n==null?void 0:n.controls)==null?void 0:j.mobile)==="thumbnailsRow"?e(C,{className:"pdp-product__images pdp-product__images--carousel pdp-product__images--carousel--thumbnails",width:"100%",height:"auto",arrows:(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?"thumbnailsRow":null,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,peak:((W=n==null?void 0:n.thumbnails)==null?void 0:W.length)>1&&((X=n==null?void 0:n.peak)==null?void 0:X.mobile)||!1,gap:(n==null?void 0:n.gap)||null,thumbnails:P,children:D}):e(C,{className:"pdp-product__images pdp-product__images--carousel",peak:((Y=n==null?void 0:n.peak)==null?void 0:Y.mobile)&&(c==null?void 0:c.length)>1,gap:(n==null?void 0:n.gap)||null,width:"100%",height:"auto",arrows:(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?"dots":null,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,children:D}),V("div",{className:w(["pdp-product__actions",["pdp-product__actions--out-of-stock",k]]),children:[k&&e("div",{className:"pdp-product__out-of-stock__text",children:ct}),h&&e(m,{node:h,className:w(["pdp-product__options"])}),J&&e("div",{className:"pdp-product__quantity",children:e(m,{node:J})}),M&&e(m,{node:M,className:w(["pdp-product__buttons"])})]}),L&&e(m,{node:L,className:w(["pdp-product__short_description"])}),r&&e(m,{node:r,className:w(["pdp-product__description"])}),et?e("div",{className:"pdp-product__attributes",children:et}):null]}),v&&e(m,{node:v,className:"pdp-product__info-content"})]}),O&&e(m,{node:O,className:"pdp-product__content"}),H===null?null:e(st,{className:"pdp-product__overlay",onClose:()=>t(null),centered:!0,children:e(C,{className:"pdp-product__overlay__carousel",arrows:(c==null?void 0:c.length)>1,width:"100%",height:"100%",defaultIndex:H||0,loop:(n==null?void 0:n.loopable)&&(c==null?void 0:c.length)>1,controls:(c==null?void 0:c.length)>1?"dots":null,isZoomed:!0,children:D})})]})},Mt=({children:a,gap:N=null,className:S,style:v,...O})=>{const I=mt.count(a);return e("div",{...O,className:w(["pdp-gallery-grid",S]),style:{"--gap":N?`var(--spacing-${N})`:"0px",...v},children:mt.map(a,(k,L)=>e("div",{className:"pdp-gallery-grid__item",children:e(m,{node:k,loading:L===0?"eager":"lazy"},k.props.src)},I+L))})},qt=({sku:a,hideSku:N,hideQuantity:S,hideShortDescription:v,hideDescription:O,hideAttributes:I,hideURLParams:k,hideSelectedOptionValue:L,slots:r,children:et,initialData:c,carousel:h,optionsConfig:u,useACDL:K,onAddToCart:G,zoomType:it,closeButton:J=!0,disableDropdownPreselection:M,...n})=>{var Z,at,ot,_t;const $=x("PDP.Product.AddToCart.label").label,nt=x("PDP.Product.Incrementer.label").label,rt=x("PDP.Product.Details.label").label,pt=x("PDP.Swatches.ChooseOption.label").label,[U,ct]=z(St.getConfig().defaultLocale||"en-US"),[B,H]=z(),[t=null,D]=z(c),[P,T]=z(()=>{const p=Vt(1),d={sku:a,quantity:p};return t!=null&&t.optionUIDs&&(d.optionsUIDs=t.optionUIDs),d}),[Q,E]=z(()=>{var p,d;return!(t!=null&&t.options&&((p=t==null?void 0:t.options)==null?void 0:p.length)>0&&((d=t==null?void 0:t.optionUIDs)==null?void 0:d.length)!==(t==null?void 0:t.options.length))}),_={data:t,values:P,valid:Q};function F(p){return p==null?void 0:p.some(d=>(d==null?void 0:d.typename)==="ProductViewOptionValueProduct")}f(()=>{const p=tt.on("pdp/data",l=>{l&&(D(l),T(i=>({...i,sku:l.sku,optionsUIDs:l.optionUIDs})))}),d=tt.on("pdp/setValues",l=>{T(i=>({...i,...l}))});return()=>{d==null||d.off(),p==null||p.off()}},[]),f(()=>{const p=tt.on("locale",d=>{d!==U&&(ct(d),ht(a,{preselectFirstOption:!M,anchors:u==null?void 0:u.anchorOptions}).then(D))});return()=>{p==null||p.off()}},[M,U,u==null?void 0:u.anchorOptions,a]),f(()=>{K&&c&&Object.keys(c).length>0&&kt(c)},[c]);const j=g(p=>{T(d=>({...d,...p}))},[]);f(()=>{tt.emit("pdp/values",P)},[JSON.stringify(P)]);const W=g(async p=>{var i,o;let d=Object.entries(p).filter(([b,R])=>R.label!==pt).map(([b,R])=>p[b].value).filter(b=>b!==void 0);!k&&(t!=null&&t.options)&&!F(t.options)&&yt({optionsUIDs:d.join(",")}),j({optionsUIDs:d}),E((d==null?void 0:d.length)===((i=t==null?void 0:t.options)==null?void 0:i.length));const l=await ht(a,{anchors:u==null?void 0:u.anchorOptions,isBundle:t==null?void 0:t.isBundle,optionsUIDs:d,preselectFirstOption:!M});D(l),(o=u==null?void 0:u.anchorOptions)!=null&&o.length&&X(l,d)},[a]),X=g((p,d)=>{var o;const l=(p==null?void 0:p.optionUIDs)??[];d.every(b=>l.includes(b))||(H(p==null?void 0:p.options),j({optionsUIDs:l}),E((l==null?void 0:l.length)===((o=p==null?void 0:p.options)==null?void 0:o.length)))},[a]),Y=g(p=>{Object.keys(p).length!==0&&E(!1)},[]),s=Ot(()=>{var p;return(p=t==null?void 0:t.attributes)==null?void 0:p.map(({label:d,value:l},i)=>{const o=Bt(l)?xt(l,U):l.toString();return V("li",{children:[d,": ",e("span",{dangerouslySetInnerHTML:{__html:o}})]},i)})},[t==null?void 0:t.attributes,U]),y=!S&&(t!=null&&t.inStock)?e(A,{name:"Quantity",slot:r==null?void 0:r.Quantity,context:{..._},children:e(It,{name:"quantity",defaultValue:P.quantity.toString(),value:P.quantity.toString(),min:1,"aria-label":nt,className:"pdp-product__quantity",onValue:p=>{const d=Number(p);j({quantity:d}),!k&&(t!=null&&t.options)&&(F(t.options)||yt({quantity:d}))}},"quantity")}):void 0,q=()=>{if(t!=null&&t.options)return e(A,{name:"Options",slot:r==null?void 0:r.Options,context:{..._},children:e(wt,{selectedUIDs:P.optionsUIDs,options:t.options,defaultOptions:P.optionsUIDs,selectionsToUpdate:B,hideSelectedValue:L,disablePreselections:M,onValues:W,onErrors:Y})})};return e("div",{...n,children:e(Lt,{title:e(A,{name:"Title",slot:r==null?void 0:r.Title,context:{..._},children:t==null?void 0:t.name}),sku:N?void 0:e(A,{name:"SKU",slot:r==null?void 0:r.SKU,context:{..._},children:t==null?void 0:t.sku}),options:q(),breadcrumbs:(r==null?void 0:r.Breadcrumbs)&&e(A,{name:"Breadcrumbs",slot:r==null?void 0:r.Breadcrumbs,context:{..._,setSeparator(p){this._registerMethod((...d)=>{const l=p(...d),i=l&&e(dt,{source:l});this._setProps(o=>({...o,separator:i,children:[e(lt,{separator:i,categories:o.categories})]}))})},appendLink(p){this._registerMethod((...d)=>{const{text:l,...i}=p(...d),o=e("a",{...i,children:l});this._setProps(b=>{const R=[...b.categories||[],o];return{...b,categories:R,children:[e(lt,{separator:b.separator,categories:R})]}})})},appendHTMLElement(p){this._registerMethod((...d)=>{const l=p(...d),i=this._htmlElementToVNode(l);this._setProps(o=>{const b=[...o.categories||[],i];return{...o,categories:b,children:[e(lt,{separator:o.separator,categories:b})]}})})}}}),quantity:y,actions:e(A,{name:"Actions",slot:r==null?void 0:r.Actions,context:{..._,appendButton(p){this._registerMethod((...d)=>{const l=p(...d);if(!l)return;const{text:i,icon:o,...b}=l,R=e(At,{type:"button",...b,icon:o&&e(dt,{source:o}),children:i});this._setProps(Nt=>({children:[...Nt.children||[],R]}))})}},children:!(r!=null&&r.Actions)&&e(At,{size:"medium",type:"submit",icon:e(dt,{source:"Cart"}),disabled:!(t!=null&&t.inStock)||!Q,"aria-label":$,onClick:()=>G==null?void 0:G(P),children:$})}),shortDescription:v?void 0:e(A,{name:"ShortDescription",slot:r==null?void 0:r.ShortDescription,context:{..._},children:e("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.shortDescription)??""}})}),description:O?void 0:e(A,{name:"Description",slot:r==null?void 0:r.Description,context:{..._},children:e("div",{dangerouslySetInnerHTML:{__html:(t==null?void 0:t.description)??""}})}),images:((Z=t==null?void 0:t.images)==null?void 0:Z.map(({label:p,url:d})=>{var l,i;return e(bt,{title:p,alt:p,src:d,width:((l=h==null?void 0:h.imageParams)==null?void 0:l.width)??960,height:((i=h==null?void 0:h.imageParams)==null?void 0:i.height)??1191,params:(h==null?void 0:h.imageParams)??{width:960}},d)}))??[],specialPrice:(at=t==null?void 0:t.prices)!=null&&at.visible?e(A,{name:"SpecialPrice",slot:r==null?void 0:r.SpecialPrice,context:{..._},children:e(Pt,{...t.prices.final,locale:ut(U)})}):void 0,price:(ot=t==null?void 0:t.prices)!=null&&ot.visible&&t.prices.regular&&t.prices.final.amount!==(t==null?void 0:t.prices.regular.amount)?e(A,{name:"RegularPrice",slot:r==null?void 0:r.RegularPrice,context:{..._},children:e(Pt,{...t.prices.regular,locale:ut(U)})}):void 0,zoomType:it,closeButton:J,carouselConfig:{...h,thumbnails:h&&Object.keys(h).length?((_t=t==null?void 0:t.images)==null?void 0:_t.map(({label:p,url:d})=>{var l,i;return e(bt,{title:p,alt:p,src:d,width:((l=h==null?void 0:h.thumbnailParams)==null?void 0:l.width)??200,height:((i=h==null?void 0:h.thumbnailParams)==null?void 0:i.height)??248,params:(h==null?void 0:h.thumbnailParams)??{width:200}},d)}))??[]:[]},outOfStock:!(t!=null&&t.inStock),attributes:I?void 0:e(A,{name:"Attributes",slot:r==null?void 0:r.Attributes,context:{..._},children:s!=null&&s.length?V(vt,{children:[rt,e("ul",{children:s})]}):null}),galleryContent:(r==null?void 0:r.GalleryContent)&&e(A,{name:"GalleryContent",slot:r.GalleryContent,context:{..._}}),infoContent:(r==null?void 0:r.InfoContent)&&e(A,{name:"InfoContent",slot:r.InfoContent,context:{..._}}),productContent:(r==null?void 0:r.Content)&&e(A,{name:"Content",slot:r.Content,context:{..._}})})})};qt.getInitialData=async function({sku:a,disableDropdownPreselection:N=!1,optionsConfig:S}){var O,I;const v=(I=(O=St.getConfig().models)==null?void 0:O.ProductDetails)==null?void 0:I.initialData;return v?Ut(v):ht(a,{preselectFirstOption:!N,anchors:S==null?void 0:S.anchorOptions})};export{qt as ProductDetails,qt as default};
4
+ //# sourceMappingURL=ProductDetails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductDetails.js","sources":["/@dropins/storefront-pdp/src/components/Product/Product.tsx","/@dropins/storefront-pdp/src/components/GalleryGrid/GalleryGrid.tsx","/@dropins/storefront-pdp/src/containers/ProductDetails/ProductDetails.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useState } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nimport { Carousel, GalleryGrid, Overlay, Zoom } from '@/pdp/components';\nimport '@/pdp/components/Product/Product.css';\n\nimport { CarouselConfig } from '@/pdp/containers';\n\ninterface ProductCarouselConfig extends CarouselConfig {\n thumbnails: VNode[];\n}\n\nexport interface ProductProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: VNode;\n breadcrumbs?: VNode;\n galleryContent?: VNode;\n infoContent?: VNode;\n productContent?: VNode;\n shortDescription?: VNode;\n description?: VNode;\n attributes?: VNode;\n images: VNode[];\n options?: VNode;\n sku?: VNode;\n price?: VNode;\n specialPrice?: VNode;\n outOfStock: boolean;\n actions?: VNode;\n quantity?: VNode;\n carouselConfig?: ProductCarouselConfig;\n zoomType?: 'zoom' | 'overlay';\n closeButton?: boolean;\n}\n\nexport const Product: FunctionComponent<ProductProps> = ({\n title,\n breadcrumbs,\n galleryContent,\n infoContent,\n productContent,\n sku,\n outOfStock,\n shortDescription,\n description,\n attributes,\n images,\n options,\n price,\n specialPrice,\n className,\n children,\n quantity,\n actions,\n carouselConfig,\n zoomType = 'overlay',\n closeButton = true,\n ...props\n}) => {\n // i18n\n const RegularPriceLabel = useText('PDP.Product.RegularPrice.label').label;\n const SpecialPriceLabel = useText('PDP.Product.SpecialPrice.label').label;\n const OutOfStockLabel = useText('PDP.Product.OutOfStock.label').label;\n const ImagesLabel = useText('PDP.Product.Image.label').label;\n\n const [zoom, setZoom] = useState<number | null>(null);\n\n const galleryImages = images?.length ? (\n images.map((image, key) => {\n const alt =\n title?.props?.children &&\n ImagesLabel?.replace('{product}', title.props.children.toString())\n .replace('{key}', String(key + 1))\n .replace('{total}', String(images.length));\n return zoomType === 'zoom' ? (\n <Zoom closeButton={closeButton}>\n <VComponent\n key={key}\n node={image}\n loading={key === 0 ? 'eager' : 'lazy'}\n alt={alt}\n />\n </Zoom>\n ) : (\n <VComponent\n key={key}\n node={image}\n loading={key === 0 ? 'eager' : 'lazy'}\n alt={alt}\n onClick={() => setZoom(key)}\n />\n );\n })\n ) : (\n <img\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product__images__placeholder\"\n aria-hidden\n />\n );\n\n const localThumbnailsImages = carouselConfig?.thumbnails?.length ? (\n carouselConfig.thumbnails.map((image, key) => (\n <VComponent\n key={key}\n node={image}\n loading={carouselConfig?.thumbnailsLoadingMode || 'lazy'}\n alt={\n title?.props?.children &&\n ImagesLabel?.replace('{product}', title.props.children.toString())\n .replace('{key}', String(key + 1))\n .replace('{total}', String(images.length))\n }\n />\n ))\n ) : (\n <img\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product__images__placeholder\"\n aria-hidden\n />\n );\n\n return (\n <div {...props} className={classes(['pdp-product', className])}>\n {breadcrumbs && (\n <VComponent node={breadcrumbs} className=\"pdp-product__breadcrumbs\" />\n )}\n <div className=\"pdp-product__column-container pdp-product__gallery-column\">\n <div className=\"pdp-product__column-body\">\n {carouselConfig?.controls?.desktop ? (\n <Carousel\n className=\"pdp-product__overlay__carousel\"\n arrows={images?.length > 1}\n controls={\n images?.length > 1 ? carouselConfig.controls.desktop : 'dots'\n }\n arrowsOnMainImage={carouselConfig?.arrowsOnMainImage}\n loop={carouselConfig?.loopable && images?.length > 1}\n peak={\n (carouselConfig?.thumbnails?.length > 1 &&\n carouselConfig?.peak?.desktop) ||\n false\n }\n gap={carouselConfig?.gap || null}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoom || 0}\n thumbnails={localThumbnailsImages}\n >\n {galleryImages}\n </Carousel>\n ) : (\n <GalleryGrid className=\"pdp-product__images\" gap=\"small\">\n {galleryImages}\n </GalleryGrid>\n )}\n </div>\n {galleryContent && (\n <VComponent\n node={galleryContent}\n className=\"pdp-product__gallery-content\"\n />\n )}\n </div>\n\n <div className=\"pdp-product__column-container pdp-product__content-column\">\n <div className=\"pdp-product__column-body\">\n <div className=\"pdp-product__header\">\n {title && (\n <VComponent node={title} className=\"pdp-product__title\" />\n )}\n\n {sku && <VComponent node={sku} className=\"pdp-product__sku\" />}\n </div>\n\n <div className=\"pdp-product__prices\">\n {specialPrice && (\n <VComponent\n node={specialPrice}\n className={classes([\n 'pdp-product__price-special',\n 'pdp-product__price',\n ])}\n aria-label={SpecialPriceLabel}\n role=\"text\"\n />\n )}\n {price && (\n <VComponent\n node={price}\n className={classes([\n 'pdp-product__price-regular',\n 'pdp-product__price--grey',\n ])}\n aria-label={RegularPriceLabel}\n role=\"text\"\n />\n )}\n </div>\n\n {/* Small Screen Gallery */}\n {carouselConfig?.controls?.mobile &&\n carouselConfig?.controls?.mobile === 'thumbnailsRow' ? (\n <Carousel\n className=\"pdp-product__images pdp-product__images--carousel pdp-product__images--carousel--thumbnails\"\n width=\"100%\"\n height=\"auto\"\n arrows={images?.length > 1}\n controls={images?.length > 1 ? 'thumbnailsRow' : null}\n loop={carouselConfig?.loopable && images?.length > 1}\n peak={\n (carouselConfig?.thumbnails?.length > 1 &&\n carouselConfig?.peak?.mobile) ||\n false\n }\n gap={carouselConfig?.gap || null}\n thumbnails={localThumbnailsImages}\n >\n {galleryImages}\n </Carousel>\n ) : (\n <Carousel\n className=\"pdp-product__images pdp-product__images--carousel\"\n peak={carouselConfig?.peak?.mobile && images?.length > 1}\n gap={carouselConfig?.gap || null}\n width=\"100%\"\n height=\"auto\"\n arrows={images?.length > 1}\n controls={images?.length > 1 ? 'dots' : null}\n loop={carouselConfig?.loopable && images?.length > 1}\n >\n {galleryImages}\n </Carousel>\n )}\n\n <div\n className={classes([\n 'pdp-product__actions',\n [`pdp-product__actions--out-of-stock`, outOfStock],\n ])}\n >\n {outOfStock && (\n <div className=\"pdp-product__out-of-stock__text\">\n {OutOfStockLabel}\n </div>\n )}\n\n {options && (\n <VComponent\n node={options}\n className={classes(['pdp-product__options'])}\n />\n )}\n\n {quantity && (\n <div className=\"pdp-product__quantity\">\n <VComponent node={quantity} />\n </div>\n )}\n\n {actions && (\n <VComponent\n node={actions}\n className={classes(['pdp-product__buttons'])}\n />\n )}\n </div>\n\n {shortDescription && (\n <VComponent\n node={shortDescription}\n className={classes(['pdp-product__short_description'])}\n />\n )}\n\n {description && (\n <VComponent\n node={description}\n className={classes(['pdp-product__description'])}\n />\n )}\n\n {attributes ? (\n <div className=\"pdp-product__attributes\">{attributes}</div>\n ) : null}\n </div>\n {infoContent && (\n <VComponent\n node={infoContent}\n className=\"pdp-product__info-content\"\n />\n )}\n </div>\n\n {productContent && (\n <VComponent node={productContent} className=\"pdp-product__content\" />\n )}\n\n {/* Zoom Overlay */}\n {zoom === null ? null : (\n <Overlay\n className=\"pdp-product__overlay\"\n onClose={() => setZoom(null)}\n centered\n >\n <Carousel\n className=\"pdp-product__overlay__carousel\"\n arrows={images?.length > 1}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoom || 0}\n loop={carouselConfig?.loopable && images?.length > 1}\n controls={images?.length > 1 ? 'dots' : null}\n isZoomed\n >\n {galleryImages}\n </Carousel>\n </Overlay>\n )}\n </div>\n );\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, Children } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/pdp/components/GalleryGrid/GalleryGrid.css';\n\nexport interface GalleryGridProps extends HTMLAttributes<HTMLDivElement> {\n children: VNode[] | VNode;\n gap?: 'small' | 'medium' | 'large' | null;\n style?: Record<string, string | number>;\n}\n\nexport const GalleryGrid: FunctionComponent<GalleryGridProps> = ({\n children,\n gap = null,\n className,\n style,\n ...props\n}) => {\n const count = Children.count(children);\n\n return (\n <div\n {...props}\n className={classes(['pdp-gallery-grid', className])}\n style={{\n '--gap': gap ? `var(--spacing-${gap})` : '0px',\n ...style,\n }}\n >\n {Children.map(\n children,\n (child: VNode<HTMLAttributes<HTMLElement>>, key) => (\n <div key={count + key} className=\"pdp-gallery-grid__item\">\n <VComponent\n key={child.props.src}\n node={child}\n loading={key === 0 ? 'eager' : 'lazy'}\n />\n </div>\n )\n )}\n </div>\n );\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport {\n HTMLAttributes,\n useEffect,\n useState,\n useCallback,\n useMemo,\n} from 'preact/compat';\n\nimport {\n Container,\n toLanguageTag,\n SlotProps,\n SlotMethod,\n Slot,\n ResolveImageUrlOptions,\n} from '@adobe-commerce/elsie/lib';\n\nimport {\n Button,\n Icon,\n ButtonProps,\n Image,\n Incrementer,\n Breadcrumbs,\n} from '@adobe-commerce/elsie/components';\nimport { Product, Swatches, PriceRange, Option } from '@/pdp/components';\nimport { config, fetchProductData } from '@/pdp/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Lang, useText } from '@adobe-commerce/elsie/i18n';\nimport { isDateValid, toDateString } from '@/pdp/lib/date';\nimport {\n setUrlParams,\n getValidatedQuantityFromUrl,\n} from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport { ProductModel, Option as ProductOption } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms/product-transform';\n\ntype IconType = keyof typeof import('@adobe-commerce/elsie/icons');\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\nexport type Values = {\n sku: string;\n quantity: number;\n optionsUIDs?: string[];\n};\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\ntype DefaultSlotContext = {\n data: ProductModel | null;\n values: Values;\n valid: boolean;\n};\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\nexport type CarouselConfig = {\n controls?: {\n desktop?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n mobile?: 'dots' | 'thumbnailsRow' | null;\n };\n arrowsOnMainImage?: boolean;\n loopable?: boolean;\n peak?: {\n desktop: boolean;\n mobile: boolean;\n };\n gap?: 'small' | 'medium' | 'large' | null;\n thumbnailsLoadingMode?: 'lazy' | 'eager';\n imageParams?: ResolveImageUrlOptions;\n thumbnailParams?: ResolveImageUrlOptions;\n};\n\n/** @deprecated This type is part of the deprecated ProductDetails component. */\nexport type OptionsConfig = {\n anchorOptions?: string[];\n};\n\n/** @deprecated This interface is part of the deprecated ProductDetails component. */\nexport interface ProductDetailsProps extends HTMLAttributes<HTMLDivElement> {\n sku: string;\n productData?: ProductModel;\n hideSku?: boolean;\n hideQuantity?: boolean;\n hideShortDescription?: boolean;\n hideDescription?: boolean;\n hideAttributes?: boolean;\n hideSelectedOptionValue?: boolean;\n hideURLParams?: boolean;\n slots?: {\n Title?: SlotProps<DefaultSlotContext>;\n\n SKU?: SlotProps<DefaultSlotContext>;\n\n RegularPrice?: SlotProps<DefaultSlotContext>;\n\n SpecialPrice?: SlotProps<DefaultSlotContext>;\n\n Options?: SlotProps<DefaultSlotContext>;\n\n Quantity?: SlotProps<DefaultSlotContext>;\n\n Actions?: SlotProps<\n DefaultSlotContext & {\n appendButton: SlotMethod<\n Omit<ButtonProps, 'icon'> & {\n text?: string;\n icon?: IconType;\n }\n >;\n }\n >;\n\n ShortDescription?: SlotProps<DefaultSlotContext>;\n\n Description?: SlotProps<DefaultSlotContext>;\n\n Attributes?: SlotProps<DefaultSlotContext>;\n\n Breadcrumbs?: SlotProps<\n DefaultSlotContext & {\n setSeparator: SlotMethod<IconType>;\n\n appendLink: SlotMethod<\n HTMLAttributes<HTMLAnchorElement> & { text?: string }\n >;\n\n appendHTMLElement: SlotMethod<HTMLElement>;\n }\n >;\n\n GalleryContent?: SlotProps<DefaultSlotContext>;\n\n InfoContent?: SlotProps<DefaultSlotContext>;\n\n Content?: SlotProps<DefaultSlotContext>;\n };\n carousel?: CarouselConfig;\n optionsConfig?: OptionsConfig;\n useACDL?: boolean;\n onAddToCart?: (values: Values) => void;\n zoomType?: 'zoom' | 'overlay';\n closeButton?: boolean;\n disableDropdownPreselection?: boolean;\n}\n\n/**\n * @deprecated This container has been deprecated and will be removed in a future release.\n * Please use the different composable containers to build your product details page.xs\n */\nexport const ProductDetails: Container<\n ProductDetailsProps,\n ProductModel | null\n> = ({\n sku,\n hideSku,\n hideQuantity,\n hideShortDescription,\n hideDescription,\n hideAttributes,\n hideURLParams,\n hideSelectedOptionValue,\n slots,\n children,\n initialData,\n carousel,\n optionsConfig,\n useACDL,\n onAddToCart,\n zoomType,\n closeButton = true,\n disableDropdownPreselection,\n ...props\n}) => {\n // i18n\n const AddToCartLabel = useText('PDP.Product.AddToCart.label').label;\n const IncrementerLabel = useText('PDP.Product.Incrementer.label').label;\n const DetailsLabel = useText('PDP.Product.Details.label').label;\n const ChooseOptionLabel = useText('PDP.Swatches.ChooseOption.label').label;\n\n // TODO: Investigate if the \"|| 'en-US' \" is really necessary\n const [locale, setLocale] = useState<Lang>(\n (config.getConfig().defaultLocale as Lang) || 'en-US'\n );\n\n const [selectionsToUpdate, setSelectionsToUpdate] = useState<Option[]>();\n\n const [data = null, setData] = useState(initialData);\n\n const [values, setValues] = useState<Values>(() => {\n const initialQuantity = getValidatedQuantityFromUrl(1); // Default quantity to 1\n\n const defaultValues: Values = {\n sku,\n quantity: initialQuantity,\n };\n\n if (data?.optionUIDs) {\n defaultValues.optionsUIDs = data.optionUIDs;\n }\n return defaultValues;\n });\n\n // the context is invalid for a configurable product that doesn't have all the options selected\n const [valid, setValid] = useState(() => {\n return !(\n data?.options &&\n data?.options?.length > 0 &&\n data?.optionUIDs?.length !== data?.options.length\n );\n });\n\n const defaultSlotContext: DefaultSlotContext = { data, values, valid };\n\n function hasProductViewOptionValueProduct(options: ProductOption[]) {\n return options?.some(\n (option) => option?.typename === 'ProductViewOptionValueProduct'\n );\n }\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', (payload) => {\n if (payload) {\n setData(payload);\n // Preserve the current quantity value when updating from pdp/data event\n setValues((prev: Values) => ({\n ...prev,\n sku: payload.sku,\n optionsUIDs: payload.optionUIDs,\n }));\n }\n });\n\n // @ts-ignore - Type error with event bus events\n const updateDataEvent = events.on(\n 'pdp/setValues',\n (payload: Partial<Values>) => {\n setValues((prev: Values) => ({ ...prev, ...payload }));\n }\n );\n\n return () => {\n updateDataEvent?.off();\n dataEvent?.off();\n };\n }, []);\n\n // Locale\n useEffect(() => {\n const localeEvent = events.on('locale', (payload: string) => {\n if (payload === locale) return;\n\n setLocale(payload as Lang);\n\n fetchProductData(sku, {\n preselectFirstOption: !disableDropdownPreselection,\n anchors: optionsConfig?.anchorOptions,\n }).then(setData);\n });\n return () => {\n localeEvent?.off();\n };\n }, [disableDropdownPreselection, locale, optionsConfig?.anchorOptions, sku]);\n\n useEffect(() => {\n if (useACDL && initialData && Object.keys(initialData).length > 0) {\n publishProductPageViewEvent(initialData);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialData]);\n\n // Callbacks\n const handleOnValues = useCallback((newValues: Partial<Values>) => {\n setValues((prev) => ({ ...prev, ...newValues }));\n }, []);\n\n useEffect(() => {\n events.emit('pdp/values', values);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(values)]);\n\n const handleOptionSelected = useCallback(\n async (selections: { [id: string]: { label: string; value: string } }) => {\n // options Selected\n let optionsUIDs = Object.entries(selections)\n .filter(([_, value]) => value.label !== ChooseOptionLabel) // eslint-disable-line no-unused-vars\n .map(([id, _]) => selections[id].value) // eslint-disable-line no-unused-vars\n .filter((element) => element !== undefined);\n\n // set optionUIDs to URL params\n // ?optionsUIDs=1,2,3\n // only set the URL params if the hideURLParams is not set to true and the product is not a bundle type\n if (\n !hideURLParams &&\n data?.options &&\n !hasProductViewOptionValueProduct(data.options)\n ) {\n setUrlParams({ optionsUIDs: optionsUIDs.join(',') });\n }\n\n // update state\n handleOnValues({ optionsUIDs });\n setValid(optionsUIDs?.length === data?.options?.length);\n\n // get refined product data and update state\n const next = await fetchProductData(sku, {\n anchors: optionsConfig?.anchorOptions,\n isBundle: data?.isBundle,\n optionsUIDs,\n preselectFirstOption: !disableDropdownPreselection,\n });\n\n setData(next);\n\n // special processing for anchor options (options that should not be refined when other options are selected)\n if (optionsConfig?.anchorOptions?.length) {\n processUpdates(next, optionsUIDs);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [sku]\n );\n\n const processUpdates = useCallback(\n (next: ProductModel | null, previousOptionsUIDs: string[]) => {\n const updatedOptionsUIDs = next?.optionUIDs ?? [];\n const haveSameValues = previousOptionsUIDs.every((item) =>\n updatedOptionsUIDs.includes(item)\n );\n if (!haveSameValues) {\n setSelectionsToUpdate(next?.options);\n handleOnValues({ optionsUIDs: updatedOptionsUIDs });\n setValid(updatedOptionsUIDs?.length === next?.options?.length);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [sku]\n );\n\n const handleOnErrors = useCallback((_errors: { [id: string]: string }) => {\n if (Object.keys(_errors).length !== 0) setValid(false);\n }, []);\n\n // Product Attributes\n const attributes = useMemo(() => {\n return data?.attributes?.map(({ label, value }, key: number) => {\n const __html = isDateValid(value)\n ? toDateString(value, locale)\n : value.toString();\n\n return (\n <li key={key}>\n {/* eslint-disable-next-line react/no-danger */}\n {label}: <span dangerouslySetInnerHTML={{ __html }} />\n </li>\n );\n });\n }, [data?.attributes, locale]);\n\n const quantity =\n !hideQuantity && data?.inStock ? (\n <Slot\n name=\"Quantity\"\n slot={slots?.Quantity}\n context={{ ...defaultSlotContext }}\n >\n <Incrementer\n key=\"quantity\"\n name=\"quantity\"\n defaultValue={values.quantity.toString()}\n value={values.quantity.toString()}\n min={1}\n aria-label={IncrementerLabel}\n className=\"pdp-product__quantity\"\n onValue={(quantity) => {\n const quantityValue = Number(quantity);\n handleOnValues({ quantity: quantityValue });\n\n // Add quantity to URL parameters if not set to hide\n if (!hideURLParams && data?.options) {\n // Only update URL if the product is not a bundle type\n if (!hasProductViewOptionValueProduct(data.options)) {\n setUrlParams({ quantity: quantityValue });\n }\n }\n }}\n />\n </Slot>\n ) : undefined;\n\n const renderOptions = () => {\n if (data?.options) {\n return (\n <Slot\n name=\"Options\"\n slot={slots?.Options}\n context={{ ...defaultSlotContext }}\n >\n <Swatches\n selectedUIDs={values.optionsUIDs}\n options={data.options}\n defaultOptions={values.optionsUIDs}\n selectionsToUpdate={selectionsToUpdate}\n hideSelectedValue={hideSelectedOptionValue}\n disablePreselections={disableDropdownPreselection}\n onValues={handleOptionSelected}\n onErrors={handleOnErrors}\n />\n </Slot>\n );\n }\n };\n\n return (\n <div {...props}>\n <Product\n title={\n <Slot\n name=\"Title\"\n slot={slots?.Title}\n context={{ ...defaultSlotContext }}\n >\n {data?.name}\n </Slot>\n }\n sku={\n !hideSku ? (\n <Slot\n name=\"SKU\"\n slot={slots?.SKU}\n context={{ ...defaultSlotContext }}\n >\n {data?.sku}\n </Slot>\n ) : undefined\n }\n options={renderOptions()}\n breadcrumbs={\n slots?.Breadcrumbs && (\n <Slot\n name=\"Breadcrumbs\"\n slot={slots?.Breadcrumbs}\n context={{\n ...defaultSlotContext,\n\n setSeparator(callback) {\n this._registerMethod((...attrs) => {\n const nextSeparator = callback(...attrs);\n\n const separator = nextSeparator && (\n <Icon source={nextSeparator} />\n );\n\n this._setProps((prev: any) => {\n return {\n ...prev,\n separator,\n children: [\n // eslint-disable-next-line react/jsx-key\n <Breadcrumbs\n separator={separator}\n categories={prev.categories}\n />,\n ],\n };\n });\n });\n },\n\n appendLink(callback) {\n this._registerMethod((...attrs) => {\n const { text, ...p } = callback(...attrs);\n\n const link = <a {...p}>{text}</a>;\n\n this._setProps((prev: any) => {\n const categories = [...(prev.categories || []), link];\n return {\n ...prev,\n categories,\n children: [\n // eslint-disable-next-line react/jsx-key\n <Breadcrumbs\n separator={prev.separator}\n categories={categories}\n />,\n ],\n };\n });\n });\n },\n\n appendHTMLElement(callback) {\n this._registerMethod((...attrs) => {\n const domElement = callback(...attrs);\n\n const vnode = this._htmlElementToVNode(domElement);\n\n this._setProps((prev: any) => {\n const categories = [...(prev.categories || []), vnode];\n\n return {\n ...prev,\n categories,\n children: [\n // eslint-disable-next-line react/jsx-key\n <Breadcrumbs\n separator={prev.separator}\n categories={categories}\n />,\n ],\n };\n });\n });\n },\n }}\n />\n )\n }\n quantity={quantity}\n actions={\n <Slot\n name=\"Actions\"\n slot={slots?.Actions}\n context={{\n ...defaultSlotContext,\n\n appendButton(callback) {\n this._registerMethod((...attrs) => {\n const _button = callback(...attrs);\n\n if (!_button) return;\n\n const { text, icon, ...buttonProps } = _button;\n\n const button = (\n <Button\n type=\"button\"\n {...buttonProps}\n icon={icon && <Icon source={icon} />}\n >\n {text}\n </Button>\n );\n\n this._setProps((prev: any) => ({\n children: [...(prev.children || []), button],\n }));\n });\n },\n }}\n >\n {\n // Default Add to Cart button if no slot is provided\n !slots?.Actions && (\n <Button\n size=\"medium\"\n type=\"submit\"\n icon={<Icon source=\"Cart\" />}\n disabled={!data?.inStock || !valid}\n aria-label={AddToCartLabel}\n onClick={() => {\n return onAddToCart?.(values);\n }}\n >\n {AddToCartLabel}\n </Button>\n )\n }\n </Slot>\n }\n shortDescription={\n !hideShortDescription ? (\n <Slot\n name=\"ShortDescription\"\n slot={slots?.ShortDescription}\n context={{ ...defaultSlotContext }}\n >\n <div\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: data?.shortDescription ?? '',\n }}\n />\n </Slot>\n ) : undefined\n }\n description={\n !hideDescription ? (\n <Slot\n name=\"Description\"\n slot={slots?.Description}\n context={{ ...defaultSlotContext }}\n >\n <div\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: data?.description ?? '' }}\n />\n </Slot>\n ) : undefined\n }\n images={\n data?.images?.map(({ label, url }) => (\n <Image\n key={url}\n title={label}\n alt={label}\n src={url}\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width={carousel?.imageParams?.width ?? 960}\n height={carousel?.imageParams?.height ?? 1191}\n params={carousel?.imageParams ?? { width: 960 }}\n />\n )) ?? []\n }\n specialPrice={\n data?.prices?.visible ? (\n <Slot\n name=\"SpecialPrice\"\n slot={slots?.SpecialPrice}\n context={{ ...defaultSlotContext }}\n >\n <PriceRange\n {...data.prices.final}\n locale={toLanguageTag(locale)}\n />\n </Slot>\n ) : undefined\n }\n price={\n data?.prices?.visible &&\n data.prices.regular &&\n data.prices.final.amount !== data?.prices.regular.amount ? (\n <Slot\n name=\"RegularPrice\"\n slot={slots?.RegularPrice}\n context={{ ...defaultSlotContext }}\n >\n <PriceRange\n {...data.prices.regular}\n locale={toLanguageTag(locale)}\n />\n </Slot>\n ) : undefined\n }\n zoomType={zoomType}\n closeButton={closeButton}\n carouselConfig={{\n ...carousel,\n thumbnails:\n carousel && Object.keys(carousel).length\n ? data?.images?.map(({ label, url }) => (\n <Image\n key={url}\n title={label}\n alt={label}\n src={url}\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width={carousel?.thumbnailParams?.width ?? 200}\n height={carousel?.thumbnailParams?.height ?? 248}\n params={carousel?.thumbnailParams ?? { width: 200 }}\n />\n )) ?? []\n : [],\n }}\n outOfStock={!data?.inStock}\n attributes={\n !hideAttributes ? (\n <Slot\n name=\"Attributes\"\n slot={slots?.Attributes}\n context={{ ...defaultSlotContext }}\n >\n {attributes?.length ? (\n <>\n {DetailsLabel}\n <ul>{attributes}</ul>\n </>\n ) : null}\n </Slot>\n ) : undefined\n }\n galleryContent={\n slots?.GalleryContent && (\n <Slot\n name=\"GalleryContent\"\n slot={slots.GalleryContent}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n infoContent={\n slots?.InfoContent && (\n <Slot\n name=\"InfoContent\"\n slot={slots.InfoContent}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n productContent={\n slots?.Content && (\n <Slot\n name=\"Content\"\n slot={slots.Content}\n context={{ ...defaultSlotContext }}\n />\n )\n }\n />\n </div>\n );\n};\n\n/** @deprecated This method is part of the deprecated ProductDetails component. */\nProductDetails.getInitialData = async function ({\n sku,\n disableDropdownPreselection = false,\n optionsConfig,\n}) {\n const initialData = config.getConfig().models?.ProductDetails?.initialData;\n\n return initialData\n ? transformProductData(initialData)\n : fetchProductData(sku, {\n preselectFirstOption: !disableDropdownPreselection,\n anchors: optionsConfig?.anchorOptions,\n });\n};\n"],"names":["Product","title","breadcrumbs","galleryContent","infoContent","productContent","sku","outOfStock","shortDescription","description","attributes","images","options","price","specialPrice","className","children","quantity","actions","carouselConfig","zoomType","closeButton","props","RegularPriceLabel","useText","SpecialPriceLabel","OutOfStockLabel","ImagesLabel","zoom","setZoom","useState","galleryImages","image","key","alt","_a","jsx","Zoom","VComponent","localThumbnailsImages","jsxs","classes","_b","Carousel","_c","_d","GalleryGrid","_e","_f","_g","_h","_i","Overlay","gap","style","count","Children","child","ProductDetails","hideSku","hideQuantity","hideShortDescription","hideDescription","hideAttributes","hideURLParams","hideSelectedOptionValue","slots","initialData","carousel","optionsConfig","useACDL","onAddToCart","disableDropdownPreselection","AddToCartLabel","IncrementerLabel","DetailsLabel","ChooseOptionLabel","locale","setLocale","config","selectionsToUpdate","setSelectionsToUpdate","data","setData","values","setValues","initialQuantity","getValidatedQuantityFromUrl","defaultValues","valid","setValid","defaultSlotContext","hasProductViewOptionValueProduct","option","useEffect","dataEvent","events","payload","prev","updateDataEvent","localeEvent","fetchProductData","publishProductPageViewEvent","handleOnValues","useCallback","newValues","handleOptionSelected","selections","optionsUIDs","_","value","id","element","setUrlParams","next","processUpdates","previousOptionsUIDs","updatedOptionsUIDs","item","handleOnErrors","_errors","useMemo","label","__html","isDateValid","toDateString","Slot","Incrementer","quantityValue","renderOptions","Swatches","callback","attrs","nextSeparator","separator","Icon","Breadcrumbs","text","p","link","categories","domElement","vnode","_button","icon","buttonProps","button","Button","url","Image","PriceRange","toLanguageTag","Fragment","transformProductData"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { HTMLAttributes } from 'preact/compat';
2
- import { Container, ResolveImageUrlOptions, SlotProps } from '../../../@adobe-commerce/elsie/src/lib';
3
- import { ImageProps } from '../../../@adobe-commerce/elsie/src/components';
2
+ import { Container, ResolveImageUrlOptions, SlotProps } from '@dropins/tools/types/elsie/src/lib';
3
+ import { ImageProps } from '@dropins/tools/types/elsie/src/components';
4
4
  import { ProductModel } from '../../data/models/product-model';
5
5
 
6
6
  type DefaultSlotContext = {
@@ -1,3 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
3
  import{jsx as A,jsxs as z}from"@dropins/tools/preact-jsx-runtime.js";import{useState as O,useEffect as J,useMemo as w}from"@dropins/tools/preact-compat.js";import{Slot as R}from"@dropins/tools/lib.js";import{Image as Z}from"@dropins/tools/components.js";import{events as K}from"@dropins/tools/event-bus.js";import{g as U}from"../chunks/getFetchedProductData.js";import{Z as V,C as j,O as W}from"../chunks/Zoom.js";/* empty css */import{useText as X}from"@dropins/tools/i18n.js";import"@dropins/tools/preact.js";const Y=({initialData:v=null,controls:G="dots",loop:I=!0,peak:k=!1,gap:H=null,arrows:N=!0,arrowsOnMainImage:Q=!1,zoom:h=!1,imageParams:t,thumbnailParams:o,children:$,slots:l,...F})=>{var x,y,T,_,S,D;const c=X("PDP.Product.Image.label").label,[e,q]=O(v),[f,C]=O(null);J(()=>{const n=K.on("pdp/data",q);return()=>{n==null||n.off()}},[]);const g=w(()=>({data:e}),[e]),B=w(()=>{var n;return((n=e==null?void 0:e.images)==null?void 0:n.map(({label:p,url:r},i)=>{const d=({...u})=>{var M;const E={title:p,src:r,alt:c==null?void 0:c.replace("{product}",p).replace("{key}",String(i+1)).replace("{total}",String((M=e==null?void 0:e.images)==null?void 0:M.length)),width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,params:t??{width:960},loading:i===0?"eager":"lazy",...u};return A(R,{name:"CarouselMainImage",slot:l==null?void 0:l.CarouselMainImage,context:{...g,defaultImageProps:E},children:A(Z,{...E})})};return h?A(V,{closeButton:typeof h=="object"?h.closeButton:!1,children:A(d,{})},r):A(d,{onClick:()=>C(i)},r)}))??A("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__images__placeholder",width:(t==null?void 0:t.width)??960,height:(t==null?void 0:t.height)??1191,"aria-hidden":!0},"pleaceholder")},[c,e==null?void 0:e.images,t,h,g,l==null?void 0:l.CarouselMainImage]),s=w(()=>{var n;return((n=e==null?void 0:e.images)==null?void 0:n.map(({label:p,url:r},i)=>{var u;const d={title:p,src:r,alt:c==null?void 0:c.replace("{product}",p).replace("{key}",String(i+1)).replace("{total}",String((u=e==null?void 0:e.images)==null?void 0:u.length)),width:(o==null?void 0:o.width)??200,height:(o==null?void 0:o.height)??248,params:o??{width:200},loading:"lazy"};return A(R,{name:"CarouselThumbnail",slotTag:"span",contentTag:"span",slot:l==null?void 0:l.CarouselThumbnail,context:{...g,defaultImageProps:d},children:A(Z,{...d})},r)}))??A("img",{src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",className:"pdp-product-gallery__thumbnail__placeholder",width:(o==null?void 0:o.width)??200,height:(o==null?void 0:o.height)??248,"aria-hidden":!0},"pleaceholder")},[c,e==null?void 0:e.images,o,g,l==null?void 0:l.CarouselThumbnail]);return e?z("div",{...F,children:[A(j,{arrows:!!((x=e==null?void 0:e.images)!=null&&x.length)&&N,arrowsOnMainImage:Q,controls:(y=e==null?void 0:e.images)!=null&&y.length?G:void 0,loop:I&&!!((T=e.images)!=null&&T.length),peak:!!((_=e==null?void 0:e.images)!=null&&_.length)&&k,gap:H,defaultIndex:f||0,thumbnails:s,children:B}),f===null?null:A(W,{onClose:()=>C(null),centered:!0,children:A(j,{arrows:!!((S=e==null?void 0:e.images)!=null&&S.length),width:"100%",height:"100%",defaultIndex:f,loop:I&&!!((D=e.images)!=null&&D.length),controls:"dots",isZoomed:!0,children:B})})]}):null};Y.getInitialData=U;export{Y as ProductGallery,Y as default};
4
+ //# sourceMappingURL=ProductGallery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductGallery.js","sources":["/@dropins/storefront-pdp/src/containers/ProductGallery/ProductGallery.tsx"],"sourcesContent":["import { HTMLAttributes, useEffect, useMemo, useState } from 'preact/compat';\nimport {\n Container,\n ResolveImageUrlOptions,\n Slot,\n SlotProps,\n} from '@adobe-commerce/elsie/lib';\n\nimport { Image, ImageProps } from '@adobe-commerce/elsie/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models/product-model';\nimport { getFetchedProductData } from '@/pdp/api';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Carousel, Overlay, Zoom } from '@/pdp/components';\n\ntype DefaultSlotContext = {\n data: ProductModel | null;\n};\n\nexport interface ProductGalleryProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'controls'> {\n controls?: 'thumbnailsRow' | 'thumbnailsColumn' | 'dots' | null;\n loop?: boolean;\n peak?: boolean;\n gap?: 'small' | 'medium' | 'large' | null;\n arrows?: boolean;\n arrowsOnMainImage?: boolean;\n imageParams?: ResolveImageUrlOptions;\n thumbnailParams?: ResolveImageUrlOptions;\n zoom?: { closeButton: boolean } | boolean;\n slots?: {\n CarouselThumbnail?: SlotProps<\n DefaultSlotContext & { defaultImageProps: ImageProps }\n >;\n CarouselMainImage?: SlotProps<\n DefaultSlotContext & { defaultImageProps: ImageProps }\n >;\n };\n}\n\nexport const ProductGallery: Container<\n ProductGalleryProps,\n ProductModel | null\n> = ({\n initialData = null,\n controls = 'dots',\n loop = true,\n peak = false,\n gap = null,\n arrows = true,\n arrowsOnMainImage = false,\n zoom = false,\n imageParams,\n thumbnailParams,\n children,\n slots,\n ...props\n}) => {\n const ImagesLabel = useText('PDP.Product.Image.label').label;\n\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n const [zoomTo, setZoomTo] = useState<number | null>(null);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData);\n return () => {\n dataEvent?.off();\n };\n }, []);\n\n const defaultSlotContext: DefaultSlotContext = useMemo(\n () => ({ data }),\n [data]\n );\n\n const images = useMemo(\n () =>\n data?.images?.map(({ label, url }, key) => {\n const Item = ({ ...itemProps }) => {\n const defaultProps = {\n title: label,\n src: url,\n alt: ImagesLabel?.replace('{product}', label)\n .replace('{key}', String(key + 1))\n .replace('{total}', String(data?.images?.length)),\n\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width: imageParams?.width ?? 960,\n height: imageParams?.height ?? 1191,\n params: imageParams ?? { width: 960 },\n loading: key === 0 ? 'eager' : 'lazy',\n ...itemProps,\n } as const;\n\n return (\n <Slot\n name=\"CarouselMainImage\"\n slot={slots?.CarouselMainImage}\n context={{\n ...defaultSlotContext,\n defaultImageProps: defaultProps,\n }}\n >\n <Image {...defaultProps} />\n </Slot>\n );\n };\n\n return zoom ? (\n <Zoom\n key={url}\n closeButton={typeof zoom === 'object' ? zoom.closeButton : false}\n >\n <Item />\n </Zoom>\n ) : (\n <Item key={url} onClick={() => setZoomTo(key)} />\n );\n }) ?? (\n <img\n key=\"pleaceholder\"\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product-gallery__images__placeholder\"\n width={imageParams?.width ?? 960}\n height={imageParams?.height ?? 1191}\n aria-hidden\n />\n ),\n [\n ImagesLabel,\n data?.images,\n imageParams,\n zoom,\n defaultSlotContext,\n slots?.CarouselMainImage,\n ]\n );\n\n const thumbnails = useMemo(() => {\n return (\n data?.images?.map(({ label, url }, key) => {\n const defaultProps = {\n title: label,\n src: url,\n alt: ImagesLabel?.replace('{product}', label)\n .replace('{key}', String(key + 1))\n .replace('{total}', String(data?.images?.length)),\n\n // TODO: change width/height for image aspect ratio\n // pending https://jira.corp.adobe.com/browse/DATA-5122\n width: thumbnailParams?.width ?? 200,\n height: thumbnailParams?.height ?? 248,\n params: thumbnailParams ?? { width: 200 },\n loading: 'lazy',\n } as const;\n\n return (\n <Slot\n key={url}\n name=\"CarouselThumbnail\"\n slotTag=\"span\"\n contentTag=\"span\"\n slot={slots?.CarouselThumbnail}\n context={{\n ...defaultSlotContext,\n defaultImageProps: defaultProps,\n }}\n >\n <Image {...defaultProps} />\n </Slot>\n );\n }) ?? (\n <img\n key=\"pleaceholder\"\n src=\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\n className=\"pdp-product-gallery__thumbnail__placeholder\"\n width={thumbnailParams?.width ?? 200}\n height={thumbnailParams?.height ?? 248}\n aria-hidden\n />\n )\n );\n }, [\n ImagesLabel,\n data?.images,\n thumbnailParams,\n defaultSlotContext,\n slots?.CarouselThumbnail,\n ]);\n\n if (!data) return null;\n\n return (\n <div {...props}>\n {/* Carousel */}\n <Carousel\n arrows={!!data?.images?.length && arrows}\n arrowsOnMainImage={arrowsOnMainImage}\n controls={data?.images?.length ? controls : undefined}\n loop={loop && !!data.images?.length}\n peak={!!data?.images?.length && peak}\n gap={gap}\n defaultIndex={zoomTo || 0}\n thumbnails={thumbnails}\n >\n {images}\n </Carousel>\n\n {/* Zoom Overlay */}\n {zoomTo === null ? null : (\n <Overlay onClose={() => setZoomTo(null)} centered>\n <Carousel\n arrows={!!data?.images?.length}\n width=\"100%\"\n height=\"100%\"\n defaultIndex={zoomTo}\n loop={loop && !!data.images?.length}\n controls=\"dots\"\n isZoomed\n >\n {images}\n </Carousel>\n </Overlay>\n )}\n </div>\n );\n};\n\nProductGallery.getInitialData = getFetchedProductData;\n"],"names":["ProductGallery","initialData","controls","loop","peak","gap","arrows","arrowsOnMainImage","zoom","imageParams","thumbnailParams","children","slots","props","ImagesLabel","useText","data","setData","useState","zoomTo","setZoomTo","useEffect","dataEvent","events","defaultSlotContext","useMemo","images","_a","label","url","key","Item","itemProps","defaultProps","jsx","Slot","Image","Zoom","thumbnails","jsxs","Carousel","_b","_c","_d","Overlay","_e","_f","getFetchedProductData"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { HTMLAttributes } from 'preact/compat';
2
- import { Container } from '../../../@adobe-commerce/elsie/src/lib';
2
+ import { Container } from '@dropins/tools/types/elsie/src/lib';
3
3
  import { ProductModel } from '../../data/models';
4
4
 
5
5
  export interface ProductHeaderProps extends HTMLAttributes<HTMLDivElement> {
@@ -1,3 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
3
  import{jsxs as c,jsx as e,Fragment as i}from"@dropins/tools/preact-jsx-runtime.js";import{useState as m,useEffect as p}from"@dropins/tools/preact-compat.js";import{classes as u,VComponent as l}from"@dropins/tools/lib.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/preact.js";import{events as f}from"@dropins/tools/event-bus.js";import{g as h}from"../chunks/getFetchedProductData.js";const g=({className:r,title:a,sku:n,hideSku:s=!1,children:t,...d})=>c("div",{...d,className:u(["pdp-header",r]),children:[e("div",{className:"pdp-header__title",children:e(l,{node:a})}),!s&&e("div",{className:"pdp-header__sku",children:e(l,{node:n})})]}),_=({initialData:r=null,hideSku:a=!1,children:n,...s})=>{const[t,d]=m(r);return p(()=>{const o=f.on("pdp/data",d);return()=>{o==null||o.off()}},[]),t?e(g,{...s,title:e(i,{children:t.name}),sku:e(i,{children:t.sku}),hideSku:a}):null};_.getInitialData=h;export{_ as ProductHeader,_ as default};
4
+ //# sourceMappingURL=ProductHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductHeader.js","sources":["/@dropins/storefront-pdp/src/components/Header/Header.tsx","/@dropins/storefront-pdp/src/containers/ProductHeader/ProductHeader.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport '@/pdp/components/Header/Header.css';\n\nexport interface HeaderProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: VNode;\n sku: VNode;\n hideSku?: boolean;\n}\n\nexport const Header: FunctionComponent<HeaderProps> = ({\n className,\n title,\n sku,\n hideSku = false,\n children,\n ...props\n}) => {\n return (\n <div {...props} className={classes(['pdp-header', className])}>\n <div className=\"pdp-header__title\">\n <VComponent node={title} />\n </div>\n {!hideSku && (\n <div className=\"pdp-header__sku\">\n <VComponent node={sku} />\n </div>\n )}\n </div>\n );\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { HTMLAttributes, useEffect, useState } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Header } from '@/pdp/components';\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models';\nimport { getFetchedProductData } from '@/pdp/api';\n\nexport interface ProductHeaderProps extends HTMLAttributes<HTMLDivElement> {\n hideSku?: boolean;\n}\n\nexport const ProductHeader: Container<\n ProductHeaderProps,\n ProductModel | null\n> = ({ initialData = null, hideSku = false, children, ...props }) => {\n const [data, setData] = useState<ProductModel | null>(initialData);\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData);\n\n return () => {\n dataEvent?.off();\n };\n }, []);\n\n if (!data) return null;\n\n return (\n <Header\n {...props}\n title={<>{data.name}</>}\n sku={<>{data.sku}</>}\n hideSku={hideSku}\n />\n );\n};\n\nProductHeader.getInitialData = getFetchedProductData;\n"],"names":["Header","className","title","sku","hideSku","children","props","jsxs","classes","jsx","VComponent","ProductHeader","initialData","data","setData","useState","useEffect","dataEvent","events","Fragment","getFetchedProductData"],"mappings":"0aA4BO,MAAMA,EAAyC,CAAC,CACrD,UAAAC,EACA,MAAAC,EACA,IAAAC,EACA,QAAAC,EAAU,GACV,SAAAC,EACA,GAAGC,CACL,IAEIC,EAAC,MAAK,CAAA,GAAGD,EAAO,UAAWE,EAAQ,CAAC,aAAcP,CAAS,CAAC,EAC1D,SAAA,CAAAQ,EAAC,OAAI,UAAU,oBACb,WAACC,EAAW,CAAA,KAAMR,EAAO,CAC3B,CAAA,EACC,CAACE,GACAK,EAAC,MAAI,CAAA,UAAU,kBACb,SAACA,EAAAC,EAAA,CAAW,KAAMP,CAAK,CAAA,CACzB,CAAA,CAAA,EAEJ,ECnBSQ,EAGT,CAAC,CAAE,YAAAC,EAAc,KAAM,QAAAR,EAAU,GAAO,SAAAC,EAAU,GAAGC,KAAY,CACnE,KAAM,CAACO,EAAMC,CAAO,EAAIC,EAA8BH,CAAW,EAU7D,OARJI,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYJ,CAAO,EAE/C,MAAO,IAAM,CACXG,GAAA,MAAAA,EAAW,KACb,CACF,EAAG,EAAE,EAEAJ,EAGHJ,EAACT,EAAA,CACE,GAAGM,EACJ,MAAUG,EAAAU,EAAA,CAAA,SAAAN,EAAK,KAAK,EACpB,IAAQJ,EAAAU,EAAA,CAAA,SAAAN,EAAK,IAAI,EACjB,QAAAT,CAAA,CACF,EARgB,IAUpB,EAEAO,EAAc,eAAiBS"}
@@ -1,7 +1,7 @@
1
1
  import { HTMLAttributes } from 'preact/compat';
2
- import { Container, SlotProps } from '../../../@adobe-commerce/elsie/src/lib';
2
+ import { Container, SlotProps } from '@dropins/tools/types/elsie/src/lib';
3
3
  import { ProductModel } from '../../data/models';
4
- import { ImageNodeRenderProps, ImageProps } from '../../../@adobe-commerce/elsie/src/components';
4
+ import { ImageNodeRenderProps, ImageProps } from '@dropins/tools/types/elsie/src/components';
5
5
 
6
6
  export interface ProductOptionsProps extends HTMLAttributes<HTMLDivElement> {
7
7
  hideSelectedValue?: boolean;
@@ -1,3 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
3
  import{jsx as g}from"@dropins/tools/preact-jsx-runtime.js";import{useState as d,useEffect as q,useCallback as k}from"@dropins/tools/preact-compat.js";import{Slot as j}from"@dropins/tools/lib.js";import{events as h}from"@dropins/tools/event-bus.js";import"@dropins/tools/components.js";/* empty css */import{S as z}from"../chunks/Swatches.js";import"@dropins/tools/preact.js";import{c as C,o as A,k as y,j as v,h as G,l as b,p as H}from"../chunks/isProductConfigurationValid.js";import{g as J}from"../chunks/getFetchedProductData.js";import"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const K=({initialData:r={data:null,optionsUIDs:[]},hideSelectedValue:l=!1,slots:o,onValues:p,onErrors:f,children:Q,...O})=>{var S;const[t,B]=d(r.data),[u,T]=d(r.optionsUIDs),[F,M]=d();q(()=>{const i=h.on("pdp/data",B),s=h.on("pdp/values",({optionsUIDs:a})=>{a&&T(a)});return()=>{i==null||i.off(),s==null||s.off()}},[]);const L=k(async i=>{var I,P,U,w;if(!(t!=null&&t.sku))return;const{persistURLParams:s,anchors:a,acdl:R}=C.getConfig()??{};let n=Object.keys(i).map(e=>i[e].value).filter(e=>e!==void 0);if(s&&!(t!=null&&t.isBundle)&&A({optionsUIDs:n.join(",")}),((P=(I=y())==null?void 0:I.optionsUIDs)==null?void 0:P.join("|"))!==(n==null?void 0:n.join("|"))){v(c=>({...c,optionsUIDs:n})),p==null||p(n);const e=await G(t.sku,{optionsUIDs:n??[],isBundle:t==null?void 0:t.isBundle,anchors:a});h.emit("pdp/data",e);let D=(n==null?void 0:n.length)===((U=e==null?void 0:e.options)==null?void 0:U.length);if(a!=null&&a.length){const c=(e==null?void 0:e.optionUIDs)??[];n.every(m=>c.includes(m))||(M(e==null?void 0:e.options),v(m=>({...m,optionsUIDs:c})),D=(c==null?void 0:c.length)===((w=e==null?void 0:e.options)==null?void 0:w.length))}b(()=>D),R&&e&&(e==null?void 0:e.variantSku)!==t.sku&&H(e)}},[t==null?void 0:t.isBundle,t==null?void 0:t.sku,p]),N=k(i=>{Object.keys(i).length!==0&&(b(()=>!1),f==null||f(i))},[f]);return!t||!t.options?null:g(j,{name:"Swatches",slot:o==null?void 0:o.Swatches,context:{data:t,optionsUIDs:u},children:g(z,{...O,options:t.options,selectedUIDs:u,defaultOptions:u,selectionsToUpdate:F,hideSelectedValue:l,disablePreselections:!((S=C.getConfig())!=null&&S.preselectFirstOption),onValues:L,onErrors:N,imageSwatchNode:o!=null&&o.SwatchImage?({imageSwatchContext:i,...s})=>g(j,{name:"SwatchImage",slot:o==null?void 0:o.SwatchImage,slotTag:"span",contentTag:"span",context:{data:t,optionsUIDs:u,defaultImageProps:s,imageSwatchContext:i}}):void 0})})};K.getInitialData=async function(){var o;const r=await J(),l=((o=y())==null?void 0:o.optionsUIDs)??[];return{data:r,optionsUIDs:l}};export{K as ProductOptions,K as default};
4
+ //# sourceMappingURL=ProductOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductOptions.js","sources":["/@dropins/storefront-pdp/src/containers/ProductOptions/ProductOptions.tsx"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { ProductModel } from '@/pdp/data/models';\nimport { events } from '@adobe-commerce/event-bus';\nimport { Swatches } from '@/pdp/components';\nimport {\n setProductConfigurationValues,\n getProductConfigurationValues,\n setProductConfigurationValid,\n fetchProductData,\n getFetchedProductData,\n config,\n} from '@/pdp/api';\nimport { setUrlParams } from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport {\n ImageNodeRenderProps,\n ImageProps,\n} from '@adobe-commerce/elsie/components';\n\nexport interface ProductOptionsProps extends HTMLAttributes<HTMLDivElement> {\n hideSelectedValue?: boolean;\n onValues?: (optionsUIDs: string[]) => void;\n onErrors?: (errors: { [id: string]: string }) => void;\n slots?: {\n Swatches?: SlotProps<{ data: ProductModel | null; optionsUIDs: string[] }>;\n SwatchImage?: SlotProps<{\n data: ProductModel | null;\n optionsUIDs: string[];\n imageSwatchContext: ImageNodeRenderProps['imageSwatchContext'];\n defaultImageProps: ImageProps;\n }>;\n };\n}\n\nexport const ProductOptions: Container<\n ProductOptionsProps,\n { data: ProductModel | null; optionsUIDs: string[] }\n> = ({\n initialData = { data: null, optionsUIDs: [] },\n hideSelectedValue = false,\n slots,\n onValues,\n onErrors,\n children,\n ...props\n}) => {\n const [data, setData] = useState<ProductModel | null>(initialData.data);\n\n const [current, setCurrent] = useState<string[]>(initialData.optionsUIDs);\n\n const [selectionsToUpdate, setSelectionsToUpdate] =\n useState<ProductModel['options']>();\n\n useEffect(() => {\n const dataEvent = events.on('pdp/data', setData);\n\n const valuesEvent = events.on('pdp/values', ({ optionsUIDs }) => {\n if (optionsUIDs) {\n setCurrent(optionsUIDs);\n }\n });\n\n return () => {\n dataEvent?.off();\n valuesEvent?.off();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleOptionSelected = useCallback(\n async (selections: { [id: string]: { label: string; value: string } }) => {\n if (!data?.sku) return;\n\n const { persistURLParams, anchors, acdl } = config.getConfig() ?? {};\n\n // options selected\n let optionsUIDs = Object.keys(selections)\n .map((id) => selections[id].value)\n .filter((element) => element !== undefined);\n\n // set optionUIDs to URL params\n // ?optionsUIDs=1,2,3\n // only set the URL params if the \"persistURLParams\" is set to true and the product is not a bundle type\n if (persistURLParams && !data?.isBundle) {\n setUrlParams({ optionsUIDs: optionsUIDs.join(',') });\n }\n\n // check if the options have changed\n if (\n getProductConfigurationValues()?.optionsUIDs?.join('|') !==\n optionsUIDs?.join('|')\n ) {\n // update values\n setProductConfigurationValues((prev) => ({ ...prev, optionsUIDs }));\n\n // pass the selected options to callback\n onValues?.(optionsUIDs);\n\n // refetch data\n const next = await fetchProductData(data.sku, {\n optionsUIDs: optionsUIDs ?? [],\n isBundle: data?.isBundle,\n anchors,\n });\n\n // emit the new data\n events.emit('pdp/data', next);\n\n let valid = optionsUIDs?.length === next?.options?.length;\n\n // special processing for anchor options (options that should not be refined when other options are selected)\n if (anchors?.length) {\n const updatedOptionsUIDs = next?.optionUIDs ?? [];\n\n const isMatching = optionsUIDs.every((item) =>\n updatedOptionsUIDs.includes(item)\n );\n\n if (!isMatching) {\n setSelectionsToUpdate(next?.options);\n setProductConfigurationValues((prev) => ({\n ...prev,\n optionsUIDs: updatedOptionsUIDs,\n }));\n\n valid = updatedOptionsUIDs?.length === next?.options?.length;\n }\n }\n\n // is the product valid\n setProductConfigurationValid(() => valid);\n\n // ACDL\n if (acdl && next && next?.variantSku !== data.sku) {\n publishProductPageViewEvent(next);\n }\n }\n },\n [data?.isBundle, data?.sku, onValues]\n );\n\n const handleErrors = useCallback(\n (errors: { [id: string]: string }) => {\n const hasErrors = Object.keys(errors).length !== 0;\n\n if (hasErrors) {\n setProductConfigurationValid(() => false);\n onErrors?.(errors);\n }\n },\n [onErrors]\n );\n\n if (!data) return null;\n\n // Only show if there are options in the data\n if (!data.options) return null;\n\n return (\n <Slot\n name=\"Swatches\"\n slot={slots?.Swatches}\n context={{ data, optionsUIDs: current }}\n >\n <Swatches\n {...props}\n options={data.options}\n selectedUIDs={current}\n defaultOptions={current}\n selectionsToUpdate={selectionsToUpdate}\n hideSelectedValue={hideSelectedValue}\n disablePreselections={!config.getConfig()?.preselectFirstOption}\n onValues={handleOptionSelected}\n onErrors={handleErrors}\n imageSwatchNode={\n slots?.SwatchImage\n ? ({ imageSwatchContext, ...imageProps }) => (\n <Slot\n name=\"SwatchImage\"\n slot={slots?.SwatchImage}\n slotTag=\"span\"\n contentTag=\"span\"\n context={{\n data,\n optionsUIDs: current,\n defaultImageProps: imageProps,\n imageSwatchContext,\n }}\n />\n )\n : undefined\n }\n />\n </Slot>\n );\n};\n\nProductOptions.getInitialData = async function () {\n const data = await getFetchedProductData();\n const optionsUIDs = getProductConfigurationValues()?.optionsUIDs ?? [];\n return { data, optionsUIDs };\n};\n"],"names":["ProductOptions","initialData","hideSelectedValue","slots","onValues","onErrors","children","props","data","setData","useState","current","setCurrent","selectionsToUpdate","setSelectionsToUpdate","useEffect","dataEvent","events","valuesEvent","optionsUIDs","handleOptionSelected","useCallback","selections","persistURLParams","anchors","acdl","config","id","element","setUrlParams","_b","_a","getProductConfigurationValues","setProductConfigurationValues","prev","next","fetchProductData","valid","_c","updatedOptionsUIDs","item","_d","setProductConfigurationValid","publishProductPageViewEvent","handleErrors","errors","jsx","Slot","Swatches","imageSwatchContext","imageProps","getFetchedProductData"],"mappings":"goBAwDO,MAAMA,EAGT,CAAC,CACH,YAAAC,EAAc,CAAE,KAAM,KAAM,YAAa,CAAA,CAAG,EAC5C,kBAAAC,EAAoB,GACpB,MAAAC,EACA,SAAAC,EACA,SAAAC,EACA,SAAAC,EACA,GAAGC,CACL,IAAM,OACJ,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAA8BT,EAAY,IAAI,EAEhE,CAACU,EAASC,CAAU,EAAIF,EAAmBT,EAAY,WAAW,EAElE,CAACY,EAAoBC,CAAqB,EAC9CJ,EAAkC,EAEpCK,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GAAG,WAAYR,CAAO,EAEzCS,EAAcD,EAAO,GAAG,aAAc,CAAC,CAAE,YAAAE,KAAkB,CAC3DA,GACFP,EAAWO,CAAW,CACxB,CACD,EAED,MAAO,IAAM,CACXH,GAAA,MAAAA,EAAW,MACXE,GAAA,MAAAA,EAAa,KACf,CAEF,EAAG,EAAE,EAEL,MAAME,EAAuBC,EAC3B,MAAOC,GAAmE,aACpE,GAAA,EAACd,GAAA,MAAAA,EAAM,KAAK,OAEV,KAAA,CAAE,iBAAAe,EAAkB,QAAAC,EAAS,KAAAC,GAASC,EAAO,UAAA,GAAe,CAAC,EAGnE,IAAIP,EAAc,OAAO,KAAKG,CAAU,EACrC,IAAKK,GAAOL,EAAWK,CAAE,EAAE,KAAK,EAChC,OAAQC,GAAYA,IAAY,MAAS,EAW1C,GANEL,GAAoB,EAACf,GAAA,MAAAA,EAAM,WAC7BqB,EAAa,CAAE,YAAaV,EAAY,KAAK,GAAG,EAAG,IAKnDW,GAAAC,EAAAC,EAAA,IAAA,YAAAD,EAAiC,cAAjC,YAAAD,EAA8C,KAAK,SACnDX,GAAA,YAAAA,EAAa,KAAK,MAClB,CAEAc,EAA+BC,IAAU,CAAE,GAAGA,EAAM,YAAAf,CAAc,EAAA,EAGlEf,GAAA,MAAAA,EAAWe,GAGX,MAAMgB,EAAO,MAAMC,EAAiB5B,EAAK,IAAK,CAC5C,YAAaW,GAAe,CAAC,EAC7B,SAAUX,GAAA,YAAAA,EAAM,SAChB,QAAAgB,CAAA,CACD,EAGMP,EAAA,KAAK,WAAYkB,CAAI,EAE5B,IAAIE,GAAQlB,GAAA,YAAAA,EAAa,YAAWmB,EAAAH,GAAA,YAAAA,EAAM,UAAN,YAAAG,EAAe,QAGnD,GAAId,GAAA,MAAAA,EAAS,OAAQ,CACb,MAAAe,GAAqBJ,GAAA,YAAAA,EAAM,aAAc,CAAC,EAE7BhB,EAAY,MAAOqB,GACpCD,EAAmB,SAASC,CAAI,CAClC,IAGE1B,EAAsBqB,GAAA,YAAAA,EAAM,OAAO,EACnCF,EAA+BC,IAAU,CACvC,GAAGA,EACH,YAAaK,CAAA,EACb,EAEMF,GAAAE,GAAA,YAAAA,EAAoB,YAAWE,EAAAN,GAAA,YAAAA,EAAM,UAAN,YAAAM,EAAe,QACxD,CAIFC,EAA6B,IAAML,CAAK,EAGpCZ,GAAQU,IAAQA,GAAA,YAAAA,EAAM,cAAe3B,EAAK,KAC5CmC,EAA4BR,CAAI,CAClC,CAEJ,EACA,CAAC3B,GAAA,YAAAA,EAAM,SAAUA,GAAA,YAAAA,EAAM,IAAKJ,CAAQ,CACtC,EAEMwC,EAAevB,EAClBwB,GAAqC,CAClB,OAAO,KAAKA,CAAM,EAAE,SAAW,IAG/CH,EAA6B,IAAM,EAAK,EACxCrC,GAAA,MAAAA,EAAWwC,GAEf,EACA,CAACxC,CAAQ,CACX,EAKI,MAHA,CAACG,GAGD,CAACA,EAAK,QAAgB,KAGxBsC,EAACC,EAAA,CACC,KAAK,WACL,KAAM5C,GAAA,YAAAA,EAAO,SACb,QAAS,CAAE,KAAAK,EAAM,YAAaG,CAAQ,EAEtC,SAAAmC,EAACE,EAAA,CACE,GAAGzC,EACJ,QAASC,EAAK,QACd,aAAcG,EACd,eAAgBA,EAChB,mBAAAE,EACA,kBAAAX,EACA,qBAAsB,GAAC6B,EAAAL,EAAO,UAAA,IAAP,MAAAK,EAAoB,sBAC3C,SAAUX,EACV,SAAUwB,EACV,gBACEzC,GAAA,MAAAA,EAAO,YACH,CAAC,CAAE,mBAAA8C,EAAoB,GAAGC,KACxBJ,EAACC,EAAA,CACC,KAAK,cACL,KAAM5C,GAAA,YAAAA,EAAO,YACb,QAAQ,OACR,WAAW,OACX,QAAS,CACP,KAAAK,EACA,YAAaG,EACb,kBAAmBuC,EACnB,mBAAAD,CAAA,CACF,CAAA,EAGJ,MAAA,CAAA,CAER,CACF,CAEJ,EAEAjD,EAAe,eAAiB,gBAAkB,OAC1C,MAAAQ,EAAO,MAAM2C,EAAsB,EACnChC,IAAcY,EAAAC,MAAA,YAAAD,EAAiC,cAAe,CAAC,EAC9D,MAAA,CAAE,KAAAvB,EAAM,YAAAW,CAAY,CAC7B"}