{"version":3,"file":"main.cjs","sources":["../src/features/DataAdapter/utils/types.ts","../src/features/swatches/utils/constants.ts","../src/features/swatches/lib/SwatchesServices.ts","../src/shared/utils/uniqueList.ts","../src/features/MultiProduct/model/API/routes.ts","../src/features/MultiProduct/model/API/api.ts","../src/features/swatches/model/thunks.ts","../src/shared/constants/selectedMaterials.ts","../src/shared/utils/storageService.ts","../src/features/swatches/model/swatchesSlice.ts","../src/features/Cart/model/cartSlice.ts","../src/features/MultiProduct/model/thunk.ts","../src/features/MultiProduct/model/multiProductCartSlice.ts","../src/app/store/rootReducer.ts","../src/app/store/storageMiddleware.ts","../src/app/store/store.ts","../src/features/swatches/model/selectors.ts","../src/shared/constants/constants.ts","../src/shared/ui/CartPrice/CartPrice.tsx","../src/shared/ui/CustomButton/CustomButton.tsx","../src/features/swatches/lib/AttributeHelper.ts","../src/shared/utils/cn.ts","../src/shared/ui/Dialog/Dialog.tsx","../src/features/swatches/ui/ImageGridZoom/ImageGridZoom.tsx","../src/app/assets/svg/CloseIconSVG.tsx","../src/features/swatches/ui/HexGridZoom/HexGridZoom.tsx","../src/shared/ui/MaterialItem/MaterialItem.tsx","../src/app/assets/svg/MinusIconSVG.tsx","../src/app/assets/svg/PlusIconSVG.tsx","../src/app/assets/svg/TrashIconSVG.tsx","../src/features/Cart/ui/Counter/Counter.tsx","../src/features/Cart/ui/CartListItem/CartListItem.tsx","../src/app/assets/svg/ArrowIconSVG.tsx","../src/shared/utils/scrollToTop.ts","../src/features/MultiProduct/ui/MultiProductCartHeader/MultiProductCartHeader.tsx","../src/features/swatches/utils/hooks/useCartCount.tsx","../src/features/MultiProduct/model/selectors.ts","../src/shared/ui/CustomModal/CustomModal.tsx","../src/shared/ui/SwatchLimitModal/SwatchLimitModal.tsx","../src/features/MultiProduct/ui/MultiProductItemCart/MultiProductItemCart.tsx","../src/app/assets/svg/SearchIconSVG.tsx","../node_modules/react-toastify/dist/index.mjs","../src/shared/utils/toast.ts","../src/features/swatches/model/types.ts","../node_modules/uuid/dist/stringify.js","../node_modules/uuid/dist/rng.js","../node_modules/uuid/dist/native.js","../node_modules/uuid/dist/v4.js","../src/features/DataAdapter/lib/DataAdapterServices.ts","../src/features/MultiProduct/ui/ProductListItem/ProductListItem.tsx","../src/features/MultiProduct/utils/constants.ts","../src/features/MultiProduct/lib/MultiProductCartServices.ts","../src/shared/ui/Label/Label.tsx","../src/app/assets/svg/ChevronSVGIcon.tsx","../src/shared/ui/Slider/Slider.tsx","../src/shared/ui/Markdown/MDWithAccordion.tsx","../src/shared/ui/PopoverTooltip/InfoIcon.tsx","../src/shared/ui/PopoverTooltip/PopoverTooltip.tsx","../src/shared/ui/SingleSelect/SingleSelect.tsx","../src/shared/ui/Loader/Loader.tsx","../src/shared/ui/Hint/Hint.tsx","../src/features/MultiProduct/ui/SwatchListItem/SwatchListItem.tsx","../src/features/MultiProduct/ui/SwatchesMultiProductList/SwatchesMultiProductList.tsx","../src/features/MultiProduct/ui/SwatchContentContainer/SwatchContentContainer.tsx","../src/features/MultiProduct/ui/ProductList/ProductList.tsx","../src/shared/ui/Checkbox/Checkbox.tsx","../src/shared/ui/MultiSelect/MultiSelect.tsx","../src/features/swatches/ui/ProductElement/index.tsx","../src/features/swatches/ui/Filters/MaterialsFilter.tsx","../src/features/swatches/ui/Filters/ColorsFilter.tsx","../src/features/swatches/ui/Filters/LooksFilter.tsx","../src/features/swatches/ui/Filters/index.tsx","../src/features/MultiProduct/ui/FiltersSelectedProductItem/FiltersSelectedProductItem.tsx","../node_modules/@tanstack/virtual-core/dist/esm/utils.js","../node_modules/@tanstack/virtual-core/dist/esm/index.js","../node_modules/@tanstack/react-virtual/dist/esm/index.js","../src/app/assets/svg/CheckMarkIconSVG.tsx","../src/shared/ui/MaterialListItem/MaterialListItem.tsx","../src/features/MultiProduct/ui/MaterialMultiProductList/MaterialMultiProductList.tsx","../src/features/MultiProduct/ui/SelectedProductItem/SelectedProductItem.tsx","../src/features/MultiProduct/ui/MultiProductWrapper/MultiProductWrapper.tsx","../src/shared/types/activeTab.ts","../src/shared/ui/CustomSidebar/CustomSidebar.tsx","../src/features/Cart/lib/CartCervices.ts","../src/features/swatches/ui/SwatchesList/SwatchesList.tsx","../src/features/swatches/ui/SwatchesListWrapper/SwatchesListWrapper.tsx","../src/features/swatches/ui/MaterialSingleProductList/MaterialSingleProductList.tsx","../src/features/swatches/ui/SwatchWrapper/SwatchWrapper.tsx","../src/features/Cart/ui/CartHeader/CartHeader.tsx","../src/features/Cart/ui/CartList/CartList.tsx","../src/features/Cart/ui/CartWrapper/CartWrapper.tsx","../src/features/swatches/ui/Swatches.tsx","../lib/store/rootReducer.ts","../lib/store/store.ts","../lib/store/LibraryProvider.tsx","../src/shared/utils/version.ts","../lib/components/SwatchesModule.tsx","../lib/store/withStore.tsx","../lib/main.ts"],"sourcesContent":["import type { AttributeValue } from '../../swatches/model/types';\n\nexport const EDataInputType = {\n  UI: 'UI',\n  FETCH_DATA_PRODUCT: 'FETCH_DATA_PRODUCT',\n  FETCH_DATA_ALL: 'FETCH_DATA_ALL',\n} as const;\n\nexport type EDataInputType =\n  (typeof EDataInputType)[keyof typeof EDataInputType];\n\nexport interface IMapUIData {\n  allMaterialValues: AttributeValue[];\n  productElementOptions: any[];\n}\n\nexport type TOnSelectMaterial<T> = (item: T) => void;\n","import type { TFilterName } from '../model/types';\nimport type { TValueKey } from './types';\n\nexport const FILTER_TO_VALUE_KEY: Record<TFilterName, TValueKey> = {\n  Finish: 'Material',\n  Color: 'Color',\n  Look: 'Look',\n};\n","import {\n  IAttributeAsset,\n  type AttributeValue,\n  type IMaterialSelectState,\n  type TFilterName,\n} from '../model/types';\nimport { FILTER_TO_VALUE_KEY } from '../utils/constants';\nimport type {\n  INonZeroSelectedFilters,\n  TAllValue,\n  TFilterGroup,\n  TFilterItem,\n} from '../utils/types';\n\nconst isEqual = (a: string, b: string) => a.toLowerCase() === b.toLowerCase();\n\nexport class SwatchesServices {\n  static getMaterialsValuesFromOptions(\n    options: IAttributeAsset[],\n  ): AttributeValue[] | undefined {\n    if (!options?.length) return;\n\n    return options\n      .reduce<AttributeValue[]>((acc, item) => {\n        const sourceValues =\n          Array.isArray(item.values) && item.values.length\n            ? item.values\n            : Array.isArray(item.valuesArray) && item.valuesArray.length\n              ? item.valuesArray\n              : undefined;\n\n        if (!sourceValues) return acc;\n\n        const parentName =\n          item.metadata?.Name ??\n          item.metadata?.Label ??\n          item.value ??\n          item.label ??\n          'without_name';\n\n        const valuesWithMeta = sourceValues.map((v) => ({\n          ...v,\n          parentName,\n        }));\n\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-expect-error\n        acc.push(...valuesWithMeta);\n\n        return acc;\n      }, [])\n      .sort((a, b) =>\n        (a.name?.toLowerCase() ?? '').localeCompare(\n          b.name?.toLowerCase() ?? '',\n        ),\n      );\n  }\n\n  static getUniqueByAssetId<T extends { assetId: string }>(array: T[]): T[] {\n    const seen = new Set<string>();\n    return array.filter((item) => {\n      if (seen.has(item.assetId)) return false;\n      seen.add(item.assetId);\n      return true;\n    });\n  }\n\n  static normalizeToArray(\n    input: string | string[] | null | undefined,\n    splitByComma = true,\n  ): string[] {\n    if (!input) return [];\n    if (Array.isArray(input)) return input.map((s) => s.trim()).filter(Boolean);\n    return (splitByComma ? input.split(',') : [input])\n      .map((s) => s.trim())\n      .filter(Boolean);\n  }\n\n  // Get all selected filters and their count\n  static mapFiltersFromValues(\n    allValues: TAllValue[],\n    selected: IMaterialSelectState,\n  ): TFilterGroup[] {\n    return (Object.keys(selected) as TFilterName[]).map((filterType) => {\n      const valueKey = FILTER_TO_VALUE_KEY[filterType];\n      const requested = selected[filterType];\n\n      const filters: TFilterItem[] = requested.map((filterKey) => {\n        let occurrences = 0;\n\n        for (const item of allValues) {\n          const entries = Array.isArray(item.values) ? item.values : [];\n          for (const entry of entries) {\n            const list = this.normalizeToArray(entry.metadata?.[valueKey]);\n            occurrences += list.filter((v) => isEqual(v, filterKey)).length;\n          }\n        }\n\n        return { filterKey, filterCount: occurrences };\n      });\n\n      return { filterType, filters };\n    });\n  }\n\n  // Get filters with a positive count\n  static getPositiveSelectedFilers(\n    mappedData: TFilterGroup[],\n  ): INonZeroSelectedFilters[] {\n    return mappedData\n      .map((group) => ({\n        filterName: group.filterType,\n        filterKeys: group.filters\n          .filter((f: TFilterItem) => f.filterCount !== 0)\n          .map((f: TFilterItem) => f.filterKey),\n      }))\n      .filter((group) => group.filterKeys.length > 0);\n  }\n}\n","export const uniqueList = (arr: string[]) => Array.from(new Set(arr));\n","export const SWATCHES_ROUTES = {\n  GET_PRODUCT_LIST: () => `products`,\n  GET_SELECTED_PRODUCT_INFORMATION: ({ assetId }: { assetId: string }) =>\n    `products?assetId[]=${assetId}`,\n  GET_PRODUCT_DETAILS: (assetId: string) => `products/${assetId}`,\n};\n","import { IFetchProductData } from '../../../../shared/types/fetchData';\nimport type {\n  IGetProductParameters,\n  IProductInformationResponse,\n  IProductListResponse,\n} from '../types';\nimport { SWATCHES_ROUTES } from './routes';\n\nconst { VITE_SWATH_CART_PRODUCTION_URL } = import.meta.env;\n\nexport const getProductListAPI = async (): Promise<IProductListResponse> => {\n  try {\n    const url = `${VITE_SWATH_CART_PRODUCTION_URL}/${SWATCHES_ROUTES.GET_PRODUCT_LIST()}?pageSize=500`;\n\n    const res = await fetch(url, {\n      method: 'GET',\n      headers: { 'Content-Type': 'application/json' },\n    });\n\n    if (!res.ok) {\n      throw new Error(`Request failed with status ${res.status}`);\n    }\n\n    const data = (await res.json()) as unknown;\n\n    if (Array.isArray(data)) {\n      throw new Error(\n        'API returned an array, expected IProductListResponse object',\n      );\n    }\n\n    return data as IProductListResponse;\n  } catch (error) {\n    console.error('❌ Fetch error:', error);\n    throw error;\n  }\n};\n\nexport const getSelectedProductAPI = async ({\n  assetId,\n}: IGetProductParameters): Promise<IFetchProductData> => {\n  try {\n    const url = `${VITE_SWATH_CART_PRODUCTION_URL}/${SWATCHES_ROUTES.GET_PRODUCT_DETAILS(assetId)}`;\n\n    const response = await fetch(url, {\n      method: 'GET',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n    });\n\n    if (!response.ok) {\n      throw new Error(`Request failed with status ${response.status}`);\n    }\n\n    const data = await response.json();\n\n    return data;\n  } catch (error) {\n    console.error('❌ Fetch error:', error);\n    throw error;\n  }\n};\n\nexport const getSelectedProductListInformationAPI = async ({\n  assetId,\n}: {\n  assetId: string;\n}): Promise<IProductInformationResponse> => {\n  try {\n    const url = `${VITE_SWATH_CART_PRODUCTION_URL}/${SWATCHES_ROUTES.GET_SELECTED_PRODUCT_INFORMATION({ assetId })}`;\n\n    const res = await fetch(url, {\n      method: 'GET',\n      headers: { 'Content-Type': 'application/json' },\n    });\n\n    if (!res.ok) {\n      throw new Error(`Request failed with status ${res.status}`);\n    }\n\n    const data = (await res.json()) as unknown;\n\n    if (Array.isArray(data)) {\n      throw new Error(\n        'API returned an array, expected IProductListResponse object',\n      );\n    }\n\n    return data as IProductInformationResponse;\n  } catch (error) {\n    console.error('❌ Fetch error:', error);\n    throw error;\n  }\n};\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport {\n  getSelectedProductAPI,\n  getSelectedProductListInformationAPI,\n} from '../../MultiProduct/model/API/api';\nimport type {\n  IGetProductParameters,\n  IProductInformationResponse,\n} from '../../MultiProduct/model/types';\nimport { IFetchProductData } from '../../../shared/types/fetchData';\n\nexport const getSelectedProductThunk = createAsyncThunk<\n  IFetchProductData | null,\n  IGetProductParameters,\n  { rejectValue: string }\n>('swatches/getSelectedProductThunk', async ({ assetId }) => {\n  try {\n    const response = await getSelectedProductAPI({ assetId });\n\n    return response;\n  } catch (e: any) {\n    console.error(e.message);\n    return null;\n  }\n});\n\nexport const getSelectedProductInformationThunk = createAsyncThunk<\n  IProductInformationResponse,\n  IGetProductParameters,\n  { rejectValue: string }\n>(\n  'swatches/getSelectedProductInformationThunk',\n  async ({ assetId }, { rejectWithValue }) => {\n    try {\n      const response = await getSelectedProductListInformationAPI({ assetId });\n\n      return response;\n    } catch (e: any) {\n      console.error(e?.message ?? e);\n      return rejectWithValue(e?.message ?? 'Unknown error');\n    }\n  },\n);\n","export const MAX_SLOTS = 5;\n","import type { AttributeValue } from '../../features/swatches/model/types';\nimport type { IProductCart } from '../../features/MultiProduct/model/types';\n\nconst STORAGE_KEYS = {\n  SELECTED_MATERIALS: 'swatchcart_selected_materials',\n  MULTI_PRODUCT_ITEMS: 'swatchcart_multi_product_items',\n  CURRENT_ASSET_ID: 'swatchcart_current_asset_id',\n} as const;\n\nconst STORAGE_EXPIRY_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface StoredData<T> {\n  data: T;\n  timestamp: number;\n}\n\n/**\n * Service for persisting and retrieving swatch selections from localStorage.\n * Data expires after 24 hours to prevent stale selections.\n */\nexport const StorageService = {\n  /**\n   * Stores selected materials (single product mode) to localStorage.\n   */\n  setSelectedMaterials(materials: AttributeValue[]): void {\n    try {\n      const storedData: StoredData<AttributeValue[]> = {\n        data: materials,\n        timestamp: Date.now(),\n      };\n      localStorage.setItem(\n        STORAGE_KEYS.SELECTED_MATERIALS,\n        JSON.stringify(storedData),\n      );\n    } catch (error) {\n      console.warn('Failed to persist selected materials:', error);\n    }\n  },\n\n  /**\n   * Retrieves selected materials from localStorage.\n   * Returns empty array if data is expired or invalid.\n   */\n  getSelectedMaterials(): AttributeValue[] {\n    try {\n      const raw = localStorage.getItem(STORAGE_KEYS.SELECTED_MATERIALS);\n      if (!raw) return [];\n\n      const stored: StoredData<AttributeValue[]> = JSON.parse(raw);\n      const isExpired = Date.now() - stored.timestamp > STORAGE_EXPIRY_MS;\n\n      if (isExpired) {\n        localStorage.removeItem(STORAGE_KEYS.SELECTED_MATERIALS);\n        return [];\n      }\n\n      return Array.isArray(stored.data) ? stored.data : [];\n    } catch (error) {\n      console.warn('Failed to retrieve selected materials:', error);\n      return [];\n    }\n  },\n\n  /**\n   * Clears selected materials from localStorage.\n   */\n  clearSelectedMaterials(): void {\n    try {\n      localStorage.removeItem(STORAGE_KEYS.SELECTED_MATERIALS);\n    } catch (error) {\n      console.warn('Failed to clear selected materials:', error);\n    }\n  },\n\n  /**\n   * Stores multi-product cart items to localStorage.\n   */\n  setMultiProductItems(items: IProductCart[]): void {\n    try {\n      const storedData: StoredData<IProductCart[]> = {\n        data: items,\n        timestamp: Date.now(),\n      };\n      localStorage.setItem(\n        STORAGE_KEYS.MULTI_PRODUCT_ITEMS,\n        JSON.stringify(storedData),\n      );\n    } catch (error) {\n      console.warn('Failed to persist multi-product items:', error);\n    }\n  },\n\n  /**\n   * Retrieves multi-product cart items from localStorage.\n   * Returns empty array if data is expired or invalid.\n   */\n  getMultiProductItems(): IProductCart[] {\n    try {\n      const raw = localStorage.getItem(STORAGE_KEYS.MULTI_PRODUCT_ITEMS);\n      if (!raw) return [];\n\n      const stored: StoredData<IProductCart[]> = JSON.parse(raw);\n      const isExpired = Date.now() - stored.timestamp > STORAGE_EXPIRY_MS;\n\n      if (isExpired) {\n        localStorage.removeItem(STORAGE_KEYS.MULTI_PRODUCT_ITEMS);\n        return [];\n      }\n\n      return Array.isArray(stored.data) ? stored.data : [];\n    } catch (error) {\n      console.warn('Failed to retrieve multi-product items:', error);\n      return [];\n    }\n  },\n\n  /**\n   * Clears multi-product cart items from localStorage.\n   */\n  clearMultiProductItems(): void {\n    try {\n      localStorage.removeItem(STORAGE_KEYS.MULTI_PRODUCT_ITEMS);\n    } catch (error) {\n      console.warn('Failed to clear multi-product items:', error);\n    }\n  },\n\n  /**\n   * Stores the current product assetId.\n   */\n  setCurrentAssetId(assetId: string): void {\n    try {\n      const prevAssetId = this.getCurrentAssetId();\n\n      if (prevAssetId && prevAssetId !== assetId) this.clearSelectedMaterials();\n\n      localStorage.setItem(STORAGE_KEYS.CURRENT_ASSET_ID, assetId);\n    } catch (error) {\n      console.warn('Failed to persist current assetId:', error);\n    }\n  },\n\n  /**\n   * Retrieves the stored product assetId.\n   */\n  getCurrentAssetId(): string | null {\n    try {\n      return localStorage.getItem(STORAGE_KEYS.CURRENT_ASSET_ID);\n    } catch (error) {\n      console.warn('Failed to retrieve current assetId:', error);\n      return null;\n    }\n  },\n\n  /**\n   * Clears all stored swatch selections.\n   */\n  clearAll(): void {\n    this.clearSelectedMaterials();\n    this.clearMultiProductItems();\n  },\n};\n","import { createSlice, type PayloadAction } from '@reduxjs/toolkit';\nimport type {\n  AttributeValue,\n  IAttributeAsset,\n  IMaterialSelectState,\n  // IProduct,\n  ISetFiltersPayload,\n  ISwatchesSlice,\n} from './types';\nimport { SwatchesServices } from '../lib/SwatchesServices';\nimport { uniqueList } from '../../../shared/utils/uniqueList';\nimport { type IMapUIData } from '../../DataAdapter/utils/types';\nimport { getSelectedProductThunk } from './thunks';\nimport { IProductListItem } from '../../MultiProduct/model/types';\nimport { MAX_SLOTS } from '../../../shared/constants/selectedMaterials';\nimport { StorageService } from '../../../shared/utils/storageService';\n\nconst persistedSelectedMaterials = StorageService.getSelectedMaterials();\n\nconst initialState: ISwatchesSlice = {\n  // isOpenSidebar: true,\n  listAttributes: [],\n  productElementOptions: [],\n  materialSelectState: { Finish: [], Color: [], Look: [] },\n  allMaterialsValues: [],\n  selectedMaterials: persistedSelectedMaterials,\n  selectedProduct: null,\n  isLoadingSelectedProduct: false,\n  isOpenMultiProductCart: false,\n};\n\nconst sum = (arr: AttributeValue[]) => arr.reduce((s, i) => s + i.count, 0);\n\nexport const swatchesSlice = createSlice({\n  name: 'swatches',\n  initialState,\n  reducers: {\n    setMaterialSelect(state, action: PayloadAction<ISetFiltersPayload>) {\n      const { filterName, values } = action.payload;\n\n      if (values.length === 0) {\n        state.materialSelectState[filterName] = [];\n        return;\n      }\n\n      state.materialSelectState[filterName] = uniqueList(values);\n    },\n    setPanelFilter(\n      state,\n      action: PayloadAction<{ attributes: IAttributeAsset[] }>,\n    ) {\n      const attributeList = action.payload.attributes;\n\n      if (attributeList.length) {\n        const filteredAttributeList =\n          SwatchesServices.getMaterialsValuesFromOptions(attributeList);\n        if (filteredAttributeList?.length) {\n          state.allMaterialsValues = filteredAttributeList;\n        }\n      }\n    },\n\n    clearMaterialFilter: (\n      state,\n      action: PayloadAction<keyof IMaterialSelectState>,\n    ) => {\n      state.materialSelectState[action.payload] = [];\n    },\n\n    clearAllMaterialFilters: (state) => {\n      state.materialSelectState = { Finish: [], Color: [], Look: [] };\n    },\n    setAllMaterialsOptions: (state, action: PayloadAction<IMapUIData>) => {\n      const { allMaterialValues, productElementOptions } = action.payload;\n      if (allMaterialValues?.length) {\n        state.allMaterialsValues = allMaterialValues;\n      }\n      if (productElementOptions?.length) {\n        state.productElementOptions = productElementOptions;\n      }\n    },\n    // setSelectedMaterial(\n    //   state,\n    //   action: PayloadAction<{\n    //     materialCount: number;\n    //     selectedMaterial: AttributeValue;\n    //     selectedMaterials: AttributeValue[];\n    //   }>,\n    // ) {\n    //   const { materialCount, selectedMaterial, selectedMaterials } =\n    //     action.payload;\n    //   if (!selectedMaterial) return;\n    //   console.log('setSelectedMaterial', {\n    //     materialCount,\n    //     selectedMaterial,\n    //     selectedMaterials,\n    //   });\n\n    //   const isSame = (i: AttributeValue) =>\n    //     i.metadata?.label === selectedMaterial.metadata?.label &&\n    //     i.parentName === selectedMaterial.parentName;\n\n    //   const exists = selectedMaterials?.some(isSame);\n    //   // debugger;\n    //   if (exists) {\n    //     state.selectedMaterials = selectedMaterials.filter((i) => !isSame(i));\n    //   } else if (materialCount < 5) {\n    //     state.selectedMaterials = [...selectedMaterials, selectedMaterial];\n    //   }\n    // },\n    setSelectedMaterial(\n      state,\n      action: PayloadAction<{ selectedMaterial: AttributeValue }>,\n    ) {\n      const { selectedMaterial } = action.payload;\n      if (!selectedMaterial) return;\n\n      const isSame = (i: AttributeValue) =>\n        i.metadata?.label === selectedMaterial.metadata?.label &&\n        i.parentName === selectedMaterial.parentName;\n\n      const exists = state.selectedMaterials.some(isSame);\n\n      if (exists) {\n        state.selectedMaterials = state.selectedMaterials.filter(\n          (i) => !isSame(i),\n        );\n        return;\n      }\n\n      if (state.selectedMaterials.length < 5) {\n        state.selectedMaterials.push(selectedMaterial);\n      }\n    },\n    resetSelectedMaterials(state) {\n      state.selectedMaterials = [];\n    },\n    setSelectedProduct(state, action: PayloadAction<IProductListItem>) {\n      state.selectedProduct = action.payload;\n      state.selectedMaterials = [];\n    },\n    deleteSelectedProduct(state) {\n      state.selectedProduct = null;\n    },\n    setIsOpenMultiProductCart(state, action: PayloadAction<boolean>) {\n      state.isOpenMultiProductCart = action.payload;\n    },\n    removeItem(\n      state,\n      action: PayloadAction<{ selectedMaterial: AttributeValue }>,\n    ) {\n      const { metadata, parentName } = action.payload.selectedMaterial;\n\n      state.selectedMaterials = state.selectedMaterials.filter(\n        (i) =>\n          !(\n            i.metadata?.label === metadata?.label && i.parentName === parentName\n          ),\n      );\n    },\n    increment(\n      state,\n      action: PayloadAction<{ selectedMaterial: AttributeValue }>,\n    ) {\n      const { metadata, parentName } = action.payload.selectedMaterial;\n\n      const item = state.selectedMaterials.find(\n        (i) =>\n          i.metadata?.label === metadata?.label && i.parentName === parentName,\n      );\n      if (!item) return;\n      if (sum(state.selectedMaterials) < MAX_SLOTS) {\n        item.count += 1;\n      }\n    },\n    decrement(\n      state,\n      action: PayloadAction<{ selectedMaterial: AttributeValue }>,\n    ) {\n      const { metadata, parentName } = action.payload.selectedMaterial;\n      const item = state.selectedMaterials.find(\n        (i) =>\n          i.metadata?.label === metadata?.label && i.parentName === parentName,\n      );\n      if (!item) return;\n      if (item.count > 1) item.count -= 1;\n    },\n    setCount(\n      state,\n      action: PayloadAction<{ selectedMaterial: AttributeValue; next: number }>,\n    ) {\n      const { metadata, parentName } = action.payload.selectedMaterial;\n      const { next } = action.payload;\n      const item = state.selectedMaterials.find(\n        (i) =>\n          i.metadata?.label === metadata?.label && i.parentName === parentName,\n      );\n      if (!item) return;\n\n      const clamped = Math.max(1, Math.floor(next));\n      const otherTotal = state.selectedMaterials\n        .filter(\n          (i) =>\n            !(\n              i.metadata?.label === metadata?.label &&\n              i.parentName === parentName\n            ),\n        )\n        .reduce((s, i) => s + i.count, 0);\n\n      const maxForThis = Math.max(1, MAX_SLOTS - otherTotal);\n      item.count = Math.min(clamped, maxForThis);\n    },\n    setCartMaterials(state, action: PayloadAction<AttributeValue[]>) {\n      state.selectedMaterials = action.payload;\n    },\n  },\n  extraReducers: (builder) => {\n    builder\n      .addCase(getSelectedProductThunk.pending, (state) => {\n        state.isLoadingSelectedProduct = true;\n      })\n      .addCase(getSelectedProductThunk.fulfilled, (state) => {\n        state.isLoadingSelectedProduct = false;\n      })\n      .addCase(getSelectedProductThunk.rejected, (state) => {\n        state.isLoadingSelectedProduct = false;\n      });\n  },\n});\n\nexport const swatchesReducer = swatchesSlice.reducer;\nexport const {\n  // setListAttributes,\n  setMaterialSelect,\n  setAllMaterialsOptions,\n  setPanelFilter,\n  setSelectedMaterial,\n  // toggleSidebar,\n  clearMaterialFilter,\n  clearAllMaterialFilters,\n  setSelectedProduct,\n  deleteSelectedProduct,\n  setIsOpenMultiProductCart,\n  resetSelectedMaterials,\n  removeItem,\n  increment,\n  decrement,\n  setCount,\n  setCartMaterials,\n} = swatchesSlice.actions;\n","import { createSlice, type PayloadAction } from '@reduxjs/toolkit';\n// import { MAX_SLOTS } from '../../../shared/constants/selectedMaterials';\nimport type { CartState, ICartItem } from './types';\n// import type { AttributeValue } from '../../swatches/model/types';\n\nconst initialState: CartState = { items: [] };\n\n// const sum = (arr: ICartItem[]) => arr.reduce((s, i) => s + i.count, 0);\n\nconst cartSlice = createSlice({\n  name: 'cart',\n  initialState,\n  reducers: {\n    setCartItems(state, action: PayloadAction<ICartItem[]>) {\n      state.items = action.payload;\n    },\n    clear(state) {\n      state.items = [];\n    },\n  },\n});\n\nexport const { setCartItems, clear } = cartSlice.actions;\n\nexport const cartReducer = cartSlice.reducer;\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport { getProductListAPI } from './API/api';\nimport { IProductListResponse } from './types';\n\nexport const getProductListThunk = createAsyncThunk<\n  IProductListResponse,\n  void,\n  { rejectValue: string }\n>('multiProducts/getProductListThunk', async (_, { rejectWithValue }) => {\n  try {\n    const response = await getProductListAPI();\n    return response;\n  } catch (e: any) {\n    console.error(e?.message ?? e);\n    return rejectWithValue(e?.message ?? 'Unknown error');\n  }\n});\n","import { createSlice, type PayloadAction } from '@reduxjs/toolkit';\nimport type {\n  IMultiProductState,\n  IMultiCartProductItem,\n  IProductCart,\n  IProductListResponse,\n} from './types';\nimport { getProductListThunk } from './thunk';\nimport { StorageService } from '../../../shared/utils/storageService';\nconst persistedMultiProductItems = StorageService.getMultiProductItems();\n\nconst initialState: IMultiProductState = {\n  items: persistedMultiProductItems,\n  productList: [],\n  isLoadingProductList: false,\n  selectedProduct: null,\n  activeMultiCartProduct: null,\n  totalCount: 0,\n};\n\n// function ensureProduct({\n//   state,\n//   assetId,\n//   productInformation,\n//   name,\n// }: {\n//   state: IMultiProductState;\n//   assetId: string;\n//   productInformation?: IProductListItem;\n//   name?: string;\n// }) {\n//   let bucket = state.items.find((p) => p.assetId === assetId);\n//   if (!bucket) {\n//     bucket = {\n//       assetId,\n//       name: name ?? '',\n//       items: [],\n//       productInformation: productInformation,\n//     };\n//     state.items.push(bucket);\n//   } else if (name && !bucket.name) {\n//     bucket.name = name;\n//   }\n//   return bucket;\n// }\n\ntype Key = {\n  assetId: string;\n  label: string;\n  parentName: string;\n};\n\nconst findProductIdx = (state: IMultiProductState, assetId: string) =>\n  state.items.findIndex((p) => p.assetId === assetId);\n\nconst findItemIdx = (\n  state: IMultiProductState,\n  productIdx: number,\n  label: string,\n  parentName: string,\n) =>\n  productIdx === -1\n    ? -1\n    : state.items[productIdx].items.findIndex(\n        (i) => i.metadata?.label === label && i.parentName === parentName,\n      );\n\nconst multiProductCartSlice = createSlice({\n  name: 'multiProduct',\n  initialState,\n  reducers: {\n    setCartForProduct(state, action: PayloadAction<IProductCart>) {\n      const { assetId } = action.payload;\n      const idx = state.items.findIndex((p) => p.assetId === assetId);\n      if (idx >= 0) state.items[idx] = action.payload;\n      else state.items.push(action.payload);\n    },\n    setActiveMultiCartProduct(\n      state,\n      action: PayloadAction<IProductCart | any>,\n    ) {\n      state.activeMultiCartProduct = action.payload;\n    },\n    setMultiCartItems(state, action: PayloadAction<IMultiCartProductItem[]>) {\n      state.items = action.payload;\n    },\n\n    incrementMultiProductItem(state, action: PayloadAction<Key>) {\n      const { assetId, label, parentName } = action.payload;\n      const pIdx = findProductIdx(state, assetId);\n      const iIdx = findItemIdx(state, pIdx, label, parentName);\n      if (iIdx !== -1) {\n        state.items[pIdx].items[iIdx].count += 1;\n      }\n    },\n\n    decrementMultiProductItem(state, action: PayloadAction<Key>) {\n      const { assetId, label, parentName } = action.payload;\n      const pIdx = findProductIdx(state, assetId);\n      const iIdx = findItemIdx(state, pIdx, label, parentName);\n      if (iIdx !== -1) {\n        const item = state.items[pIdx].items[iIdx];\n        if (item.count > 1) item.count -= 1; // clamp at 1\n      }\n    },\n\n    removeMultiProductItem(state, action: PayloadAction<Key>) {\n      const { assetId, label, parentName } = action.payload;\n      const pIdx = findProductIdx(state, assetId);\n      if (pIdx === -1) return;\n\n      const nextItems = state.items[pIdx].items.filter(\n        (i) => !(i.metadata?.label === label && i.parentName === parentName),\n      );\n\n      state.items[pIdx].items = nextItems;\n    },\n\n    clear(state) {\n      state.items = [];\n    },\n  },\n  extraReducers: (builder) => {\n    builder\n      .addCase(getProductListThunk.pending, (state) => {\n        state.isLoadingProductList = true;\n      })\n      .addCase(\n        getProductListThunk.fulfilled,\n        (state, action: PayloadAction<IProductListResponse>) => {\n          state.productList = action.payload.rows;\n          state.isLoadingProductList = false;\n        },\n      )\n      .addCase(getProductListThunk.rejected, (state) => {\n        state.isLoadingProductList = false;\n      });\n  },\n});\n\nexport const {\n  setCartForProduct,\n  setMultiCartItems,\n  incrementMultiProductItem,\n  decrementMultiProductItem,\n  removeMultiProductItem,\n  clear,\n  setActiveMultiCartProduct,\n} = multiProductCartSlice.actions;\n\nexport const multiProductCartReducer = multiProductCartSlice.reducer;\n","import { combineReducers } from '@reduxjs/toolkit';\nimport { swatchesReducer } from '../../features/swatches/model/swatchesSlice';\nimport { cartReducer } from '../../features/Cart/model/cartSlice';\nimport { multiProductCartReducer } from '../../features/MultiProduct/model/multiProductCartSlice';\n\nconst rootReducer = combineReducers({\n  swatches: swatchesReducer,\n  cart: cartReducer,\n  multiProductCart: multiProductCartReducer,\n});\n\nexport type RootState = ReturnType<typeof rootReducer>;\n\nexport default rootReducer;\n","import type { Middleware } from '@reduxjs/toolkit';\nimport { StorageService } from '../../shared/utils/storageService';\nimport type { RootState } from './rootReducer';\n\nconst SWATCHES_PERSIST_ACTIONS = new Set([\n  'swatches/setSelectedMaterial',\n  'swatches/removeItem',\n  'swatches/increment',\n  'swatches/decrement',\n  'swatches/setCount',\n  'swatches/resetSelectedMaterials',\n]);\n\nconst MULTI_PRODUCT_PERSIST_ACTIONS = new Set([\n  'multiProduct/setCartForProduct',\n  'multiProduct/setMultiCartItems',\n  'multiProduct/incrementMultiProductItem',\n  'multiProduct/decrementMultiProductItem',\n  'multiProduct/removeMultiProductItem',\n  'multiProduct/clear',\n]);\n\n/**\n * Redux middleware that persists swatch selections to localStorage\n * whenever relevant state changes occur.\n */\nexport const storageMiddleware: Middleware<object, RootState> =\n  (store) => (next) => (action) => {\n    const result = next(action);\n\n    const actionType = (action as { type?: string }).type;\n    if (!actionType) return result;\n\n    const state = store.getState();\n\n    // Persist single-product selected materials\n    if (SWATCHES_PERSIST_ACTIONS.has(actionType)) {\n      //console.log('[StorageMiddleware] Persisting selectedMaterials:', state.swatches.selectedMaterials);\n      StorageService.setSelectedMaterials(state.swatches.selectedMaterials);\n    }\n\n    // Persist multi-product cart items\n    if (MULTI_PRODUCT_PERSIST_ACTIONS.has(actionType)) {\n      // console.log(\n      //   '[StorageMiddleware] Persisting multiProductItems:',\n      //   state.multiProductCart.items,\n      // );\n      StorageService.setMultiProductItems(state.multiProductCart.items);\n    }\n\n    return result;\n  };\n","import { configureStore } from '@reduxjs/toolkit';\nimport { useDispatch, useSelector } from 'react-redux';\nimport rootReducer from './rootReducer';\nimport { storageMiddleware } from './storageMiddleware';\n\nconst { NODE_ENV } = import.meta.env;\n\nexport const store = configureStore({\n  reducer: rootReducer,\n  middleware: (getDefaultMiddleware) =>\n    getDefaultMiddleware({\n      thunk: true,\n      serializableCheck: {\n        ignoredActionPaths: ['meta.limitCb', 'payload.limitCb'],\n        ignoredPaths: [],\n      },\n    }).concat(storageMiddleware),\n  devTools: NODE_ENV !== 'production',\n});\n\nexport type RootState = ReturnType<typeof store.getState>;\nexport type AppDispatch = typeof store.dispatch;\n\nexport const useAppDispatch = useDispatch.withTypes<AppDispatch>();\nexport const useAppSelector = useSelector.withTypes<RootState>();\n\nexport default store;\n","import type { RootState } from '../../../app/store/store';\n\n// export const getIsOpenSidebar = (state: RootState) =>\n//   state.swatches.isOpenSidebar;\nexport const getListAttributes = (state: RootState) =>\n  state.swatches.listAttributes;\nexport const getAttributeByName =\n  (optionName: string) => (state: RootState) => {\n    const listAttributes = getListAttributes(state);\n\n    return listAttributes.find((attr) => attr.name === optionName);\n  };\nexport const getAllMaterialValues = (state: RootState) =>\n  state.swatches.allMaterialsValues;\nexport const getMaterialSelectStateFilters = (state: RootState) =>\n  state.swatches.materialSelectState;\nexport const getProductElementOptions = (state: RootState) =>\n  state.swatches.productElementOptions;\nexport const getSelectedMaterials = (state: RootState) =>\n  state.swatches.selectedMaterials;\n\n// AllProduct\nexport const getIsLoadingSelectedProduct = (state: RootState) =>\n  state.swatches.isLoadingSelectedProduct;\nexport const getIsOpenMultiCart = (state: RootState) =>\n  state.swatches.isOpenMultiProductCart;\nexport const getSelectedProduct = (state: RootState) =>\n  state.swatches.selectedProduct;\n// AllProduct\n","export const MATERIAL_PRICE = 6.5;\n","import { useMemo } from 'react';\nimport { ICartItem } from '../../../features/Cart/model/types';\nimport { MATERIAL_PRICE } from '../../constants/constants';\n\ninterface ICartPriceProps {\n  materials: ICartItem[];\n  containerStyles?: string;\n}\n\nexport const CartPrice = ({\n  materials,\n  containerStyles = 'flex flex-col gap-[8px] text-[12px]/snug p-[var(--sm-padding)] border-t border-solid border-[var(--border)] sm:gap-[12px] shadow-[0_-2px_10px_rgba(40,40,40,0.10)]',\n}: ICartPriceProps) => {\n  const COMMON_STYLES =\n    'flex flex-row text-[12px] justify-between items-center';\n\n  const totalPrice = useMemo(() => {\n    return (\n      materials.reduce((sum, item) => sum + (item.count ?? 0), 0) *\n      MATERIAL_PRICE\n    );\n  }, [materials]);\n\n  return (\n    <div className={containerStyles}>\n      <div className={COMMON_STYLES}>\n        <span>Subtotal</span>\n        <span>${totalPrice}</span>\n      </div>\n      <div className={`${COMMON_STYLES} text-[var(--main-accent-color)]`}>\n        <span>Savings</span>\n        <span>-${totalPrice}</span>\n      </div>\n      <div className={`${COMMON_STYLES} text-[14px] font-medium`}>\n        <span>Total</span>\n        <span>$0</span>\n      </div>\n    </div>\n  );\n};\n","import React from 'react';\n\ninterface CustomButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  children: React.ReactNode;\n}\n\nexport const CustomButton: React.FC<CustomButtonProps> = ({\n  children,\n  disabled,\n  ...rest\n}) => {\n  const baseStyles =\n    'w-full bg-[var(--main-accent-color)] text-white p-[1.25rem] hover:bg-secondary transition-all duration-200 rounded-full font-bold transition-colors duration-300';\n  const activeStyles = 'cursor-pointer hover:opacity-90';\n  const disableStyles =\n    'bg-gray-400 text-gray-200 cursor-not-allowed opacity-70';\n\n  return (\n    <button\n      className={`${baseStyles} ${disabled ? disableStyles : activeStyles}`}\n      {...rest}\n    >\n      {children}\n    </button>\n  );\n};\n","export class AttributeHelper {\n  static getImage(value: any) {\n    const Image = value?.metadata?.Image || value?.metadata?.image;\n    if (!Image) return undefined;\n\n    const url = `https://preview.threekit.com${Image}`;\n\n    return url;\n  }\n\n  static getValueLabel(attribute: any) {\n    return (\n      attribute?.metadata?.label ||\n      attribute?.metadata?.Label ||\n      attribute?.name ||\n      'Unnamed'\n    );\n  }\n\n  static getZoomIconColor(value: any) {\n    return (\n      value?.metadata?.zoomIconColor || value?.metadata?.zoomIconColor || null\n    );\n  }\n\n  static getHexColor(value: any) {\n    return value?.metadata?.hex || value?.metadata?.Hex || null;\n  }\n\n  static getAttributeLabel(attribute: any) {\n    return (\n      attribute?.metadata?.label ||\n      attribute?.metadata?.Label ||\n      attribute?.name ||\n      'Unnamed'\n    );\n  }\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Overlay\n    ref={ref}\n    className={cn(\n      'fixed inset-0 z-10000 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n      className,\n    )}\n    {...props}\n    onClick={(e) => e.stopPropagation()}\n  />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n  <DialogPortal container={document.querySelector('.root-app')}>\n    <DialogOverlay />\n    <DialogPrimitive.Content\n      ref={ref}\n      className={cn(\n        'z-10001 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] w-full max-w-[calc(100%-2rem)] max-h-[80vh] translate-x-[-50%] translate-y-[-50%] duration-200 overflow-y-auto',\n        className,\n      )}\n      {...props}\n    >\n      {children}\n      <DialogPrimitive.Close className='absolute right-4 top-4 cursor-pointer rounded-full bg-gray-200 transition-background hover:bg-gray-300 disabled:pointer-events-none duration-200 p-2'>\n        <X className='h-8 w-8' />\n        <span className='sr-only'>Close</span>\n      </DialogPrimitive.Close>\n    </DialogPrimitive.Content>\n  </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn('flex flex-col space-y-1.5 text-left', className)}\n    {...props}\n  />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nconst DialogFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n      className,\n    )}\n    {...props}\n  />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Title\n    ref={ref}\n    className={cn(\n      'text-[30px] font-semibold leading-none tracking-tight',\n      className,\n    )}\n    {...props}\n  />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Description\n    ref={ref}\n    className={cn('text-muted-foreground', className)}\n    {...props}\n  />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n  Dialog,\n  DialogPortal,\n  DialogOverlay,\n  DialogTrigger,\n  DialogClose,\n  DialogContent,\n  DialogHeader,\n  DialogFooter,\n  DialogTitle,\n  DialogDescription,\n};\n","import { useState } from 'react';\n// import { Maximize2 } from 'lucide-react';\nimport { AttributeHelper } from '../../lib/AttributeHelper';\n// import { DarkWhiteIconSVG } from '../../../../app/assets/svg/DarkWhiteIconSVG';\n// import { WhiteWhiteIconSVG } from '../../../../app/assets/svg/WhiteWhiteIconSVG';\nimport {\n  Dialog,\n  DialogContent,\n  DialogHeader,\n  DialogTitle,\n} from '../../../../shared/ui/Dialog/Dialog';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const ImageGridZoom = ({ item }: { item: any }) => {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  const [zoomSrc, _] = useState<string | undefined>('');\n  const [open, setOpen] = useState(false);\n\n  const imageUrl = AttributeHelper.getImage(item);\n  const valueLabel = AttributeHelper.getValueLabel(item);\n  // const zoomIconColor = AttributeHelper.getZoomIconColor(item);\n\n  // const getZoomIcon = (zoomIconColor: string) => {\n  //   if (!zoomIconColor)\n  //     return <Maximize2 className='w-[20px] h-5 sm:w-6 sm:h-6 shrink-0' />;\n\n  //   if (zoomIconColor === 'Dark Grey') {\n  //     return <DarkWhiteIconSVG className='w-[20px] h-5 sm:w-6 sm:h-6' />;\n  //   }\n  //   if (zoomIconColor === 'White') {\n  //     return <WhiteWhiteIconSVG className='w-[20px] h-5 sm:w-6 sm:h-6' />;\n  //   }\n  // };\n\n  return (\n    <>\n      <div className='group relative w-full h-full! aspect-video overflow-hidden shadow-sm group cursor-pointer rounded-sm'>\n        {imageUrl && (\n          <img\n            src={imageUrl}\n            alt={valueLabel}\n            className='w-full h-full! object-cover'\n            loading='lazy'\n          />\n        )}\n\n        {/* <div\n          className='sm:opacity-0 sm:group-hover:opacity-100 sm:pointer-events-none sm:group-hover:pointer-events-auto absolute top-2 right-2 p-[0.4rem] sm:p-2 rounded-full transition'\n          onClick={(e) => {\n            e.stopPropagation();\n            setZoomSrc(imageUrl);\n            setOpen(true);\n          }}\n          role='button'\n          tabIndex={0}\n        >\n          {getZoomIcon(zoomIconColor)}\n        </div> */}\n      </div>\n\n      <Dialog\n        open={!!open}\n        onOpenChange={() => {\n          setOpen(false);\n        }}\n      >\n        <DialogContent\n          className='sm:max-w-5xl'\n          onClick={(e) => e.stopPropagation()}\n        >\n          <DialogHeader>\n            <DialogTitle className='sr-only'>Image Zoom</DialogTitle>\n          </DialogHeader>\n          <img src={zoomSrc} alt='Zoomed' className='w-full h-auto' />\n          {valueLabel && (\n            <span className='text-white mt-2 block'>\n              {(item?.metadata?.Finish || item?.metadata?.Material) &&\n                `${item.metadata?.Finish || item.metadata?.Material} | `}\n              {valueLabel}\n            </span>\n          )}\n        </DialogContent>\n      </Dialog>\n    </>\n  );\n};\n","import { type FC } from 'react';\nimport type { SvgIconProps } from '../../../shared/types/svg';\n\nexport const CloseIconSVG: FC<SvgIconProps> = (props) => {\n  return (\n    <svg\n      width='12'\n      height='12'\n      viewBox='0 0 12 12'\n      fill='none'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path\n        d='M11 1L1 11M1 1L11 11'\n        stroke='current'\n        strokeWidth='1.5'\n        strokeLinecap='round'\n        strokeLinejoin='round'\n      />\n    </svg>\n  );\n};\n","import { useState } from 'react';\n// import { Maximize2 } from 'lucide-react';\nimport { AttributeHelper } from '../../lib/AttributeHelper';\n// import { DarkWhiteIconSVG } from '../../../../app/assets/svg/DarkWhiteIconSVG';\n// import { WhiteWhiteIconSVG } from '../../../../app/assets/svg/WhiteWhiteIconSVG';\nimport {\n  Dialog,\n  DialogContent,\n  DialogHeader,\n  DialogTitle,\n} from '../../../../shared/ui/Dialog/Dialog';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const HexGridZoom = ({ item }: { item: any }) => {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  const [zoomSrc, _] = useState(null);\n  const [open, setOpen] = useState(false);\n\n  const defaultHex = `#f2f1f1`;\n\n  const hexColor = AttributeHelper.getHexColor(item);\n  // const zoomIconColor = AttributeHelper.getZoomIconColor(item);\n\n  // const getZoomIcon = (zoomIconColor: string) => {\n  //   if (!zoomIconColor)\n  //     return <Maximize2 className='w-[20px] h-5 sm:w-6 sm:h-6 shrink-0' />;\n\n  //   if (zoomIconColor === 'Dark Grey') {\n  //     return <DarkWhiteIconSVG />;\n  //   }\n  //   if (zoomIconColor === 'White') {\n  //     return <WhiteWhiteIconSVG />;\n  //   }\n  // };\n\n  return (\n    <>\n      <div\n        className='group relative w-full h-full! aspect-video overflow-hidden shadow-sm group cursor-pointer rounded-sm'\n        style={{ backgroundColor: hexColor || defaultHex }}\n      >\n        {/* <div\n          className='sm:opacity-0 sm:group-hover:opacity-100 sm:pointer-events-none sm:group-hover:pointer-events-auto absolute top-2 right-2 p-[0.4rem] sm:p-2   rounded-full   transition'\n          onClick={(e) => {\n            e.stopPropagation();\n            setZoomSrc(hexColor || defaultHex);\n            setOpen(true);\n          }}\n          role='button'\n          tabIndex={0}\n        >\n          {getZoomIcon(zoomIconColor)}\n        </div> */}\n      </div>\n\n      <Dialog\n        open={!!open}\n        onOpenChange={() => {\n          setOpen(false);\n        }}\n      >\n        <DialogContent\n          className='sm:max-w-5xl'\n          onClick={(e) => e.stopPropagation()}\n        >\n          <DialogHeader>\n            <DialogTitle className='sr-only'>Hex Color</DialogTitle>\n          </DialogHeader>\n          <div\n            className='w-full aspect-video rounded'\n            style={{ backgroundColor: zoomSrc ? zoomSrc : 'transparent' }}\n          ></div>\n          {hexColor && (\n            <span className='text-white mt-2 block'>\n              {' '}\n              {(item?.metadata?.Material || item?.metadata?.Material) &&\n                `${item.metadata?.Material} | `}\n              {AttributeHelper.getAttributeLabel(item)}\n            </span>\n          )}\n        </DialogContent>\n      </Dialog>\n    </>\n  );\n};\n","import { AttributeHelper } from '../../../features/swatches/lib/AttributeHelper';\nimport { ImageGridZoom } from '../../../features/swatches/ui/ImageGridZoom/ImageGridZoom';\nimport { CloseIconSVG } from '../../../app/assets/svg/CloseIconSVG';\nimport { HexGridZoom } from '../../../features/swatches/ui/HexGridZoom/HexGridZoom';\nimport type { AttributeValue } from '../../../features/swatches/model/types';\n\nexport interface IMaterialItemProps {\n  val: AttributeValue;\n  className?: string;\n  isShowDeleteIcon?: boolean;\n  handleSelect?: (arg: AttributeValue) => void;\n}\n\nconst DEFAULT_STYLES =\n  'w-[64px] h-[64px] bg-[var(--sidebar-b)] border border-solid border-[var(--border)] rounded-sm aspect-square overflow-hidden transition';\n\nexport const MaterialItem = ({\n  val,\n  className,\n  isShowDeleteIcon = false,\n  handleSelect,\n}: IMaterialItemProps) => {\n  return (\n    <button\n      key={val.assetId}\n      onClick={() => {\n        if (handleSelect) {\n          handleSelect(val);\n        }\n      }}\n      className={`relative ${className ? className : DEFAULT_STYLES}`}\n      aria-label={`Selected swatch ${val.name ?? val.assetId}`}\n      title='Click to remove'\n    >\n      {AttributeHelper.getImage(val) ? (\n        <ImageGridZoom item={val} />\n      ) : (\n        <HexGridZoom item={val} />\n      )}\n\n      {isShowDeleteIcon ? (\n        <div\n          className='absolute top-0 right-0 m-2 w-[16px] h-[16px] flex flex-row justify-center items-center\n          bg-[var(--background-grey)] rounded-2xl border-none pointer-events-none'\n        >\n          <CloseIconSVG className='w-[8px] h-2 stroke-[var(--svg-dark)]' />\n        </div>\n      ) : null}\n    </button>\n  );\n};\n","import type { FC } from 'react';\nimport type { SvgIconProps } from '../../../shared/types/svg';\n\nexport const MinusIconSVG: FC<SvgIconProps> = (props) => {\n  return (\n    <svg\n      width='12'\n      height='12'\n      viewBox='0 0 12 12'\n      fill='none'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path\n        d='M2.5 6H9.5'\n        stroke='current'\n        strokeLinecap='round'\n        strokeLinejoin='round'\n      />\n    </svg>\n  );\n};\n","import type { FC } from 'react';\nimport type { SvgIconProps } from '../../../shared/types/svg';\n\nexport const PlusIconSVG: FC<SvgIconProps> = (props) => {\n  return (\n    <svg\n      width='12'\n      height='12'\n      viewBox='0 0 12 12'\n      fill='none'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path\n        d='M2.5 6H9.5M6 2.5V9.5'\n        stroke='current'\n        strokeLinecap='round'\n        strokeLinejoin='round'\n      />\n    </svg>\n  );\n};\n","import type { FC } from 'react';\nimport type { SvgIconProps } from '../../../shared/types/svg';\n\nexport const TrashIconSVG: FC<SvgIconProps> = (props) => {\n  return (\n    <svg\n      width='12'\n      height='12'\n      viewBox='0 0 12 12'\n      fill='none'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path\n        d='M5 5.5V8.5M7 5.5V8.5M9.5 3V10C9.5 10.2652 9.39464 10.5196 9.20711 10.7071C9.01957 10.8946 8.76522 11 8.5 11H3.5C3.23478 11 2.98043 10.8946 2.79289 10.7071C2.60536 10.5196 2.5 10.2652 2.5 10V3M1.5 3H10.5M4 3V2C4 1.73478 4.10536 1.48043 4.29289 1.29289C4.48043 1.10536 4.73478 1 5 1H7C7.26522 1 7.51957 1.10536 7.70711 1.29289C7.89464 1.48043 8 1.73478 8 2V3'\n        stroke='current'\n        strokeLinecap='round'\n        strokeLinejoin='round'\n      />\n    </svg>\n  );\n};\n","import { MinusIconSVG } from '../../../../app/assets/svg/MinusIconSVG';\nimport { PlusIconSVG } from '../../../../app/assets/svg/PlusIconSVG';\nimport { TrashIconSVG } from '../../../../app/assets/svg/TrashIconSVG';\n\ninterface ICounterProps {\n  value: number;\n  canIncrement: boolean;\n  onIncrement: () => void;\n  onDecrement: () => void;\n  onDelete: () => void;\n}\n\nexport const Counter = ({\n  value,\n  canIncrement,\n  onIncrement,\n  onDecrement,\n  onDelete,\n}: ICounterProps) => {\n  const showTrash = value <= 1;\n  return (\n    <div className='flex flex-row items-center gap-[8px] text-[14px]'>\n      {showTrash ? (\n        <button\n          aria-label='Remove item'\n          onClick={onDelete}\n          className='[&_svg_path]:stroke-[var(--main-accent-color)] cursor-pointer'\n        >\n          <TrashIconSVG />\n        </button>\n      ) : (\n        <button\n          aria-label='Decrease'\n          onClick={onDecrement}\n          className='[&_svg_path]:stroke-[var(--svg-dark)] cursor-pointer'\n        >\n          <MinusIconSVG />\n        </button>\n      )}\n      <span className='min-w-[16px] text-center select-none'>{value}</span>\n      <button\n        aria-label='Increase'\n        onClick={onIncrement}\n        disabled={!canIncrement}\n        className='[&_svg_path]:stroke-[var(--svg-dark)] disabled:opacity-40 cursor-pointer'\n      >\n        <PlusIconSVG />\n      </button>\n    </div>\n  );\n};\n","import { MATERIAL_PRICE } from '../../../../shared/constants/constants';\nimport { MaterialItem } from '../../../../shared/ui/MaterialItem/MaterialItem';\nimport type { ICartItem } from '../../model/types';\nimport { Counter } from '../Counter/Counter';\n\ninterface ICartListItemProps {\n  item: ICartItem;\n  canInc: boolean;\n  onDelete: () => void;\n  onIncrement: () => void;\n  onDecrement: () => void;\n}\n\nexport const CartListItem = ({\n  item,\n  canInc,\n  onDelete,\n  onIncrement,\n  onDecrement,\n}: ICartListItemProps) => {\n  return (\n    <li\n      key={item.assetId}\n      className='\n        border-b border-[var(--border)]\n        px-[var(--sm-padding)] p-[var(--sm-padding)]\n        last:border-b-0'\n    >\n      <div className='relative flex flex-row gap-[16px]'>\n        <div>\n          <MaterialItem val={item} />\n        </div>\n        <div className='flex flex-col justify-between'>\n          <div className='flex flex-col'>\n            <span className='mb-[4px] font-semibold text-[12px]'>\n              {item.metadata?.label}\n            </span>\n            <span className='mb-[4px] font-bold text-[12px]'>\n              {item.parentName}\n            </span>\n          </div>\n          <Counter\n            value={item.count}\n            canIncrement={canInc}\n            onIncrement={onIncrement}\n            onDecrement={onDecrement}\n            onDelete={onDelete}\n          />\n        </div>\n        <div className=' absolute text-[12px] top-0 right-0 font-medium'>\n          ${item.count * MATERIAL_PRICE}\n        </div>\n      </div>\n    </li>\n  );\n};\n","import type { FC } from 'react';\nimport type { SvgIconProps } from '../../../shared/types/svg';\n\nexport const ArrowIconSVG: FC<SvgIconProps> = (props) => {\n  return (\n    <svg\n      width='20'\n      height='20'\n      viewBox='0 0 20 20'\n      fill='none'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path\n        d='M9.99984 15.8333L4.1665 9.99996M4.1665 9.99996L9.99984 4.16663M4.1665 9.99996H15.8332'\n        stroke='current'\n        strokeWidth='1.5'\n        strokeLinecap='round'\n        strokeLinejoin='round'\n      />\n    </svg>\n  );\n};\n","/**\n * Scrolls to the top of the #root element with smooth behavior\n */\nexport const scrollToTop = () => {\n  const rootContainer = document.getElementById('root');\n  if (rootContainer) {\n    rootContainer.scrollIntoView({\n      behavior: 'smooth',\n      block: 'start',\n    });\n  }\n};\n","import { ArrowIconSVG } from '../../../../app/assets/svg/ArrowIconSVG';\nimport { useAppDispatch } from '../../../../app/store/store';\nimport { scrollToTop } from '../../../../shared/utils/scrollToTop';\nimport { setIsOpenMultiProductCart } from '../../../swatches/model/swatchesSlice';\nimport { MAX_SLOTS } from '../../../../shared/constants/selectedMaterials';\n\ninterface IMultiProductCartHeaderProps {\n  totalCount: number;\n}\n\nexport const MultiProductCartHeader = ({\n  totalCount,\n}: IMultiProductCartHeaderProps) => {\n  const dispatch = useAppDispatch();\n\n  const handleGoBack = () => {\n    dispatch(setIsOpenMultiProductCart(false));\n    scrollToTop();\n  };\n  return (\n    <header className='flex flex-row p-[var(--sm-padding)] justify-between items-center border-b border-solid border-[var(--border)]'>\n      <div className='flex items-center flex-row  gap-[4px]'>\n        <div className='flex flex-row items-center gap-[8px]'>\n          <button\n            className='[&_svg_path]:stroke-[var(--main-accent-color)] cursor-pointer'\n            onClick={handleGoBack}\n          >\n            <ArrowIconSVG />\n          </button>\n          <h2 className='m-0! text-[16px] leading-[1.6] font-medium '>\n            Your cart\n          </h2>\n        </div>\n        {totalCount >= MAX_SLOTS ? (\n          <>\n            <span className='text-[var(--main-accent-color)] hidden! text-[12px] sm:block!'>\n              ({MAX_SLOTS}) You reached maximum amount of swatches\n            </span>\n            <span className='text-[var(--main-accent-color)] block! sm:hidden!'>\n              ({MAX_SLOTS}) Max\n            </span>\n          </>\n        ) : null}\n      </div>\n    </header>\n  );\n};\n","import { useMemo } from 'react';\n\ntype WithCount = {\n  /**\n   * Numeric count value.\n   * Can be `null` when the item is not counted.\n   */\n  count: number | null;\n};\n\n/**\n * Calculates the total count of items.\n *\n * Sums the `count` property of all provided items and\n * memoizes the result to prevent unnecessary recalculations.\n *\n * @param items - Array of items containing a `count` field\n * @returns Total count of all items\n */\nexport function useCartCount<T extends WithCount>(items: T[]): number {\n  return useMemo(() => {\n    return items.reduce((sum, item) => sum + (item.count ?? 0), 0);\n  }, [items]);\n}\n","import { createSelector } from '@reduxjs/toolkit';\nimport type { RootState } from '../../../app/store/rootReducer';\nimport type { ICartItem, IProductCart } from './types';\nconst selectMultiProductCart = (state: RootState) =>\n  state.multiProductCart as { items: IProductCart[] };\n\nexport const getMultiCartItems = (state: RootState) =>\n  state.multiProductCart.items;\n\nexport const getMultiSelectedMaterials = (assetId: string) =>\n  createSelector(selectMultiProductCart, (cart): ICartItem[] => {\n    const bucket = cart.items.find((p) => p.assetId === assetId);\n    return bucket?.items ?? [];\n  });\n\nexport const getActiveMultiCartProduct = (state: RootState) =>\n  state.multiProductCart.activeMultiCartProduct;\n\nexport const getProductLIst = (state: RootState) =>\n  state.multiProductCart.productList;\nexport const getIsLoadingProductList = (state: RootState) =>\n  state.multiProductCart.isLoadingProductList;\nexport const getSelectedProduct = (state: RootState) =>\n  state.multiProductCart.selectedProduct;\n","import { useEffect, useRef, type FC } from 'react';\nimport ReactDOM from 'react-dom';\nimport { CloseIconSVG } from '../../../app/assets/svg/CloseIconSVG';\n\ninterface ModalProps {\n  isOpen: boolean;\n  onClose: () => void;\n  title?: string;\n  width?: number | string;\n  height?: number | string;\n  children: React.ReactNode;\n}\n\nexport const CustomModal: FC<ModalProps> = ({\n  isOpen,\n  onClose,\n  title = 'Message',\n  width,\n  height,\n  children,\n}) => {\n  const modalRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    const handleClickOutside = (e: MouseEvent) => {\n      if (modalRef.current && !modalRef.current.contains(e.target as Node)) {\n        onClose();\n      }\n    };\n\n    if (isOpen) {\n      document.addEventListener('mousedown', handleClickOutside);\n    }\n\n    return () => {\n      document.removeEventListener('mousedown', handleClickOutside);\n    };\n  }, [isOpen, onClose]);\n\n  if (!isOpen) return null;\n\n  return ReactDOM.createPortal(\n    <div className='fixed inset-0 z-99999999999999 flex flex-row items-center justify-center bg-black/40 p-4'>\n      <div\n        ref={modalRef}\n        className='\n          bg-white rounded-2xl shadow-xl flex flex-col overflow-hidden\n          max-w-[90vw] max-h-[90vh]\n        '\n        style={{\n          width: width || 'auto',\n          height: height || 'auto',\n        }}\n      >\n        <div className='flex flex-row items-center justify-between p-[var(--sm-padding)] border-b border-[var(--border)]'>\n          <span className='text-[16px] font-semibold text-[var(--text)]'>\n            {title}\n          </span>\n\n          <button\n            onClick={onClose}\n            className='flex flex-row justify-center items-center p-1 rounded-full bg-[var(--border)] hover:bg-gray-100 transition [&_svg_path]:stroke-[var(--svg-dark)] w-[30px] h-[30px]'\n          >\n            <CloseIconSVG\n              className='text-[var(--text)] '\n              width={10}\n              hanging={10}\n            />\n          </button>\n        </div>\n\n        <div className='flex flex-col gap-[12px] text-[var(--text-muted)]'>\n          {children}\n        </div>\n      </div>\n    </div>,\n    document.querySelector('#root-container')!,\n  );\n};\n","import { CustomModal } from '../CustomModal/CustomModal';\n\ninterface ISwatchLimitModalProps {\n  isOpen: boolean;\n  header?: string;\n  body: string;\n  onClose: () => void;\n}\n\nexport const SwatchLimitModal = ({\n  isOpen,\n  header,\n  body,\n  onClose,\n}: ISwatchLimitModalProps) => {\n  return (\n    <CustomModal\n      isOpen={isOpen}\n      onClose={onClose}\n      width={320}\n      title='Swatch Limit'\n    >\n      <div>\n        <div className='text-[14px] font-medium p-[var(--sm-padding)] border-b border-[var(--border)] leading-[20px]'>\n          {header ? <p className='mb-4'>{header}</p> : null}\n\n          <span>{body}</span>\n        </div>\n        <div className='p-[var(--sm-padding)] w-full'>\n          <button\n            className='\n        w-full block py-3 rounded-full\n        bg-[var(--main-accent-color)] text-white font-bold capitalize\n          '\n            onClick={onClose}\n          >\n            OK\n          </button>\n        </div>\n      </div>\n    </CustomModal>\n  );\n};\n","import { useAppDispatch, useAppSelector } from '../../../../app/store/store';\nimport { setSelectedMaterial } from '../../../swatches/model/swatchesSlice';\nimport { CartPrice } from '../../../../shared/ui/CartPrice/CartPrice';\nimport { CustomButton } from '../../../../shared/ui/CustomButton/CustomButton';\nimport { MAX_SLOTS } from '../../../../shared/constants/selectedMaterials';\n\nimport { Fragment, useMemo, useState } from 'react';\nimport type { IMultiProductCartHandleProps } from '../../model/types';\nimport {\n  decrementMultiProductItem,\n  incrementMultiProductItem,\n  removeMultiProductItem,\n} from '../../model/multiProductCartSlice';\nimport { CartListItem } from '../../../Cart/ui/CartListItem/CartListItem';\nimport { MultiProductCartHeader } from '../MultiProductCartHeader/MultiProductCartHeader';\n// import { getSelectedMaterials } from '../../../swatches/model/selectors';\nimport { useCartCount } from '../../../swatches/utils/hooks/useCartCount';\nimport { getMultiCartItems } from '../../model/selectors';\nimport { SwatchLimitModal } from '../../../../shared/ui/SwatchLimitModal/SwatchLimitModal';\n\n/**\n * Props for {@link MultiProductItemCart}.\n */\ninterface IMultiProductItemCartProps {\n  /**\n   * Optional callback fired when user proceeds to shipping.\n   * Receives the current selected products payload.\n   */\n  onSendData?: (data: unknown) => void;\n}\n\n/**\n * Renders a multi-product cart with grouped items, quantity controls, and totals.\n *\n * Features:\n * - grouped rendering by product\n * - increment/decrement/delete actions for cart items\n * - synchronizes deletion with the swatches selected materials state\n * - shows totals and a \"Go to shipping\" action\n *\n * @component\n *\n * @param props - {@link IMultiProductItemCartProps}\n */\n\nexport const MultiProductItemCart = ({\n  onSendData,\n}: IMultiProductItemCartProps) => {\n  const dispatch = useAppDispatch();\n  const selectedProducts = useAppSelector(getMultiCartItems);\n  // const selectedMaterials = useAppSelector(getSelectedMaterials);\n  const [isShowLimitMessage, setIsShowLimitMessage] = useState(false);\n\n  /**\n   * Flattens product groups into a single items list used for totals and pricing.\n   */\n  const allItems = useMemo(() => {\n    return selectedProducts.flatMap((p) => p.items);\n  }, [selectedProducts]);\n\n  /**\n   * Removes an item from the multi-product cart and updates swatches selection state.\n   *\n   * @param params - Cart action payload containing the item and product asset id\n   */\n  const handleDelete = ({ item, assetId }: IMultiProductCartHandleProps) => {\n    const { parentName, metadata } = item;\n    const label = metadata?.label;\n\n    if (assetId && label && parentName) {\n      dispatch(removeMultiProductItem({ assetId, label, parentName }));\n\n      dispatch(\n        setSelectedMaterial({\n          selectedMaterial: item,\n          // materialCount: 1,\n          // selectedMaterials,\n        }),\n      );\n    }\n  };\n\n  /**\n   * Increments an item count in the multi-product cart.\n   *\n   * @param params - Cart action payload containing the item and product asset id\n   */\n  const handleIncrement = ({ item, assetId }: IMultiProductCartHandleProps) => {\n    const { parentName, metadata } = item;\n    const label = metadata?.label;\n\n    if (item.count + 1 === 3) {\n      setIsShowLimitMessage(true);\n    } else {\n      if (assetId && label && parentName) {\n        dispatch(incrementMultiProductItem({ assetId, label, parentName }));\n      }\n    }\n  };\n\n  /**\n   * Decrements an item count in the multi-product cart.\n   *\n   * @param params - Cart action payload containing the item and product asset id\n   */\n  const handleDecrement = ({ item, assetId }: IMultiProductCartHandleProps) => {\n    const { parentName, metadata } = item;\n    const label = metadata?.label;\n\n    if (assetId && label && parentName) {\n      dispatch(decrementMultiProductItem({ assetId, label, parentName }));\n    }\n  };\n\n  const totalCount = useCartCount(allItems);\n\n  return (\n    <>\n      <div className='flex flex-col h-full'>\n        <MultiProductCartHeader totalCount={totalCount} />\n\n        <div className='flex flex-col h-full min-h-0'>\n          <ul className='flex flex-col flex-1 min-h-0 overflow-y-auto'>\n            {selectedProducts.map((product) => {\n              const { items, name, assetId } = product;\n\n              if (!items.length) return null;\n\n              return (\n                <Fragment key={product.assetId}>\n                  <div\n                    className=' p-[var(--sm-padding)] border-y border-[var(--border)]\n                    sm:px-[var(--sm-padding)] text-[14px] font-medium'\n                  >\n                    {name}\n                  </div>\n\n                  <ul>\n                    {items?.map((item) => (\n                      <CartListItem\n                        key={`${item.id}/${product.assetId}`}\n                        item={item}\n                        canInc={totalCount < MAX_SLOTS}\n                        onDelete={() => {\n                          if (!assetId) return;\n                          handleDelete({ item, assetId });\n                        }}\n                        onIncrement={() => {\n                          if (!assetId) return;\n                          handleIncrement({ item, assetId });\n                        }}\n                        onDecrement={() => {\n                          if (!assetId) return;\n                          handleDecrement({ item, assetId });\n                        }}\n                      />\n                    ))}\n                  </ul>\n                </Fragment>\n              );\n            })}\n          </ul>\n\n          <div\n            className='flex flex-col \n          sm:flex-row sm:w-full sm:justify-between sm:items-center\n          sm:border-t sm:border-[var(--border)] shadow-[0_-2px_10px_rgba(40,40,40,0.10)]\n        '\n            id='swatch-content-container' // uncomment this code for a multi product cart page if it needs\n          >\n            <div className='sm:w-[50%] sm:border-r sm:border-solid sm:border-[var(--border)]'>\n              <CartPrice\n                materials={allItems}\n                containerStyles='flex flex-col gap-[8px] text-[12px]/snug p-[var(--sm-padding)] border-t border-solid border-[var(--border)]  sm:gap-[12px] sm:border-none s'\n              />\n            </div>\n\n            <div className='p-[var(--sm-padding)] border-t border-solid border-[var(--border)] shrink-0 sm:w-[50%] sm:border-none sm:flex flex-row sm:justify-end sm:items-end sm:h-full'>\n              <div className='sm:w-[50%] text-[14px]'>\n                <CustomButton\n                  onClick={() =>\n                    onSendData &&\n                    onSendData(\n                      selectedProducts.filter(\n                        (product) => product.items.length,\n                      ),\n                    )\n                  }\n                  disabled={allItems.length > MAX_SLOTS + 1}\n                >\n                  GO TO SHIPPING\n                </CustomButton>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <SwatchLimitModal\n        body='A maximum of two swatches per material may be ordered.'\n        isOpen={isShowLimitMessage}\n        onClose={() => setIsShowLimitMessage(false)}\n      />\n    </>\n  );\n};\n","import type { FC } from 'react';\nimport type { SvgIconProps } from '../../../shared/types/svg';\n\nexport const SearchIconSVG: FC<SvgIconProps> = (props) => {\n  return (\n    <svg\n      width='20'\n      height='20'\n      viewBox='0 0 20 20'\n      fill='none'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path\n        d='M17.5 17.5L13.8833 13.8834'\n        stroke='current'\n        strokeWidth='2'\n        strokeLinecap='round'\n        strokeLinejoin='round'\n      />\n      <path\n        d='M9.16667 15.8333C12.8486 15.8333 15.8333 12.8486 15.8333 9.16667C15.8333 5.48477 12.8486 2.5 9.16667 2.5C5.48477 2.5 2.5 5.48477 2.5 9.16667C2.5 12.8486 5.48477 15.8333 9.16667 15.8333Z'\n        stroke='current'\n        strokeWidth='1.5'\n        strokeLinecap='round'\n        strokeLinejoin='round'\n      />\n    </svg>\n  );\n};\n","\"use client\";\nfunction Mt(t){if(!t||typeof document==\"undefined\")return;let o=document.head||document.getElementsByTagName(\"head\")[0],e=document.createElement(\"style\");e.type=\"text/css\",o.firstChild?o.insertBefore(e,o.firstChild):o.appendChild(e),e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}Mt(`:root{--toastify-color-light: #fff;--toastify-color-dark: #121212;--toastify-color-info: #3498db;--toastify-color-success: #07bc0c;--toastify-color-warning: #f1c40f;--toastify-color-error: hsl(6, 78%, 57%);--toastify-color-transparent: rgba(255, 255, 255, .7);--toastify-icon-color-info: var(--toastify-color-info);--toastify-icon-color-success: var(--toastify-color-success);--toastify-icon-color-warning: var(--toastify-color-warning);--toastify-icon-color-error: var(--toastify-color-error);--toastify-container-width: fit-content;--toastify-toast-width: 320px;--toastify-toast-offset: 16px;--toastify-toast-top: max(var(--toastify-toast-offset), env(safe-area-inset-top));--toastify-toast-right: max(var(--toastify-toast-offset), env(safe-area-inset-right));--toastify-toast-left: max(var(--toastify-toast-offset), env(safe-area-inset-left));--toastify-toast-bottom: max(var(--toastify-toast-offset), env(safe-area-inset-bottom));--toastify-toast-background: #fff;--toastify-toast-padding: 14px;--toastify-toast-min-height: 64px;--toastify-toast-max-height: 800px;--toastify-toast-bd-radius: 6px;--toastify-toast-shadow: 0px 4px 12px rgba(0, 0, 0, .1);--toastify-font-family: sans-serif;--toastify-z-index: 9999;--toastify-text-color-light: #757575;--toastify-text-color-dark: #fff;--toastify-text-color-info: #fff;--toastify-text-color-success: #fff;--toastify-text-color-warning: #fff;--toastify-text-color-error: #fff;--toastify-spinner-color: #616161;--toastify-spinner-color-empty-area: #e0e0e0;--toastify-color-progress-light: linear-gradient(to right, #4cd964, #5ac8fa, #007aff, #34aadc, #5856d6, #ff2d55);--toastify-color-progress-dark: #bb86fc;--toastify-color-progress-info: var(--toastify-color-info);--toastify-color-progress-success: var(--toastify-color-success);--toastify-color-progress-warning: var(--toastify-color-warning);--toastify-color-progress-error: var(--toastify-color-error);--toastify-color-progress-bgo: .2}.Toastify__toast-container{z-index:var(--toastify-z-index);-webkit-transform:translate3d(0,0,var(--toastify-z-index));position:fixed;width:var(--toastify-container-width);box-sizing:border-box;color:#fff;display:flex;flex-direction:column}.Toastify__toast-container--top-left{top:var(--toastify-toast-top);left:var(--toastify-toast-left)}.Toastify__toast-container--top-center{top:var(--toastify-toast-top);left:50%;transform:translate(-50%);align-items:center}.Toastify__toast-container--top-right{top:var(--toastify-toast-top);right:var(--toastify-toast-right);align-items:end}.Toastify__toast-container--bottom-left{bottom:var(--toastify-toast-bottom);left:var(--toastify-toast-left)}.Toastify__toast-container--bottom-center{bottom:var(--toastify-toast-bottom);left:50%;transform:translate(-50%);align-items:center}.Toastify__toast-container--bottom-right{bottom:var(--toastify-toast-bottom);right:var(--toastify-toast-right);align-items:end}.Toastify__toast{--y: 0;position:relative;touch-action:none;width:var(--toastify-toast-width);min-height:var(--toastify-toast-min-height);box-sizing:border-box;margin-bottom:1rem;padding:var(--toastify-toast-padding);border-radius:var(--toastify-toast-bd-radius);box-shadow:var(--toastify-toast-shadow);max-height:var(--toastify-toast-max-height);font-family:var(--toastify-font-family);z-index:0;display:flex;flex:1 auto;align-items:center;word-break:break-word}@media only screen and (max-width: 480px){.Toastify__toast-container{width:100vw;left:env(safe-area-inset-left);margin:0}.Toastify__toast-container--top-left,.Toastify__toast-container--top-center,.Toastify__toast-container--top-right{top:env(safe-area-inset-top);transform:translate(0)}.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-right{bottom:env(safe-area-inset-bottom);transform:translate(0)}.Toastify__toast-container--rtl{right:env(safe-area-inset-right);left:initial}.Toastify__toast{--toastify-toast-width: 100%;margin-bottom:0;border-radius:0}}.Toastify__toast-container[data-stacked=true]{width:var(--toastify-toast-width)}.Toastify__toast--stacked{position:absolute;width:100%;transform:translate3d(0,var(--y),0) scale(var(--s));transition:transform .3s}.Toastify__toast--stacked[data-collapsed] .Toastify__toast-body,.Toastify__toast--stacked[data-collapsed] .Toastify__close-button{transition:opacity .1s}.Toastify__toast--stacked[data-collapsed=false]{overflow:visible}.Toastify__toast--stacked[data-collapsed=true]:not(:last-child)>*{opacity:0}.Toastify__toast--stacked:after{content:\"\";position:absolute;left:0;right:0;height:calc(var(--g) * 1px);bottom:100%}.Toastify__toast--stacked[data-pos=top]{top:0}.Toastify__toast--stacked[data-pos=bot]{bottom:0}.Toastify__toast--stacked[data-pos=bot].Toastify__toast--stacked:before{transform-origin:top}.Toastify__toast--stacked[data-pos=top].Toastify__toast--stacked:before{transform-origin:bottom}.Toastify__toast--stacked:before{content:\"\";position:absolute;left:0;right:0;bottom:0;height:100%;transform:scaleY(3);z-index:-1}.Toastify__toast--rtl{direction:rtl}.Toastify__toast--close-on-click{cursor:pointer}.Toastify__toast-icon{margin-inline-end:10px;width:22px;flex-shrink:0;display:flex}.Toastify--animate{animation-fill-mode:both;animation-duration:.5s}.Toastify--animate-icon{animation-fill-mode:both;animation-duration:.3s}.Toastify__toast-theme--dark{background:var(--toastify-color-dark);color:var(--toastify-text-color-dark)}.Toastify__toast-theme--light,.Toastify__toast-theme--colored.Toastify__toast--default{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{color:var(--toastify-text-color-info);background:var(--toastify-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{color:var(--toastify-text-color-success);background:var(--toastify-color-success)}.Toastify__toast-theme--colored.Toastify__toast--warning{color:var(--toastify-text-color-warning);background:var(--toastify-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{color:var(--toastify-text-color-error);background:var(--toastify-color-error)}.Toastify__progress-bar-theme--light{background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error{background:var(--toastify-color-transparent)}.Toastify__close-button{color:#fff;position:absolute;top:6px;right:6px;background:transparent;outline:none;border:none;padding:0;cursor:pointer;opacity:.7;transition:.3s ease;z-index:1}.Toastify__toast--rtl .Toastify__close-button{left:6px;right:unset}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentColor;height:16px;width:14px}.Toastify__close-button:hover,.Toastify__close-button:focus{opacity:1}@keyframes Toastify__trackProgress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.Toastify__progress-bar{position:absolute;bottom:0;left:0;width:100%;height:100%;z-index:1;opacity:.7;transform-origin:left}.Toastify__progress-bar--animated{animation:Toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:transform .2s}.Toastify__progress-bar--rtl{right:0;left:initial;transform-origin:right;border-bottom-left-radius:initial}.Toastify__progress-bar--wrp{position:absolute;overflow:hidden;bottom:0;left:0;width:100%;height:5px;border-bottom-left-radius:var(--toastify-toast-bd-radius);border-bottom-right-radius:var(--toastify-toast-bd-radius)}.Toastify__progress-bar--wrp[data-hidden=true]{opacity:0}.Toastify__progress-bar--bg{opacity:var(--toastify-color-progress-bgo);width:100%;height:100%}.Toastify__spinner{width:20px;height:20px;box-sizing:border-box;border:2px solid;border-radius:100%;border-color:var(--toastify-spinner-color-empty-area);border-right-color:var(--toastify-spinner-color);animation:Toastify__spin .65s linear infinite}@keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutRight{20%{opacity:1;transform:translate3d(-20px,var(--y),0)}to{opacity:0;transform:translate3d(2000px,var(--y),0)}}@keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutLeft{20%{opacity:1;transform:translate3d(20px,var(--y),0)}to{opacity:0;transform:translate3d(-2000px,var(--y),0)}}@keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}@keyframes Toastify__bounceOutUp{20%{transform:translate3d(0,calc(var(--y) - 10px),0)}40%,45%{opacity:1;transform:translate3d(0,calc(var(--y) + 20px),0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}@keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}@keyframes Toastify__bounceOutDown{20%{transform:translate3d(0,calc(var(--y) - 10px),0)}40%,45%{opacity:1;transform:translate3d(0,calc(var(--y) + 20px),0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--top-left,.Toastify__bounce-enter--bottom-left{animation-name:Toastify__bounceInLeft}.Toastify__bounce-enter--top-right,.Toastify__bounce-enter--bottom-right{animation-name:Toastify__bounceInRight}.Toastify__bounce-enter--top-center{animation-name:Toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{animation-name:Toastify__bounceInUp}.Toastify__bounce-exit--top-left,.Toastify__bounce-exit--bottom-left{animation-name:Toastify__bounceOutLeft}.Toastify__bounce-exit--top-right,.Toastify__bounce-exit--bottom-right{animation-name:Toastify__bounceOutRight}.Toastify__bounce-exit--top-center{animation-name:Toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{animation-name:Toastify__bounceOutDown}@keyframes Toastify__zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;transform:translate3d(0,var(--y),0) scale3d(.3,.3,.3)}to{opacity:0}}.Toastify__zoom-enter{animation-name:Toastify__zoomIn}.Toastify__zoom-exit{animation-name:Toastify__zoomOut}@keyframes Toastify__flipIn{0%{transform:perspective(400px) rotateX(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}@keyframes Toastify__flipOut{0%{transform:translate3d(0,var(--y),0) perspective(400px)}30%{transform:translate3d(0,var(--y),0) perspective(400px) rotateX(-20deg);opacity:1}to{transform:translate3d(0,var(--y),0) perspective(400px) rotateX(90deg);opacity:0}}.Toastify__flip-enter{animation-name:Toastify__flipIn}.Toastify__flip-exit{animation-name:Toastify__flipOut}@keyframes Toastify__slideInRight{0%{transform:translate3d(110%,0,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInLeft{0%{transform:translate3d(-110%,0,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInUp{0%{transform:translate3d(0,110%,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInDown{0%{transform:translate3d(0,-110%,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideOutRight{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(110%,var(--y),0)}}@keyframes Toastify__slideOutLeft{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(-110%,var(--y),0)}}@keyframes Toastify__slideOutDown{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(0,500px,0)}}@keyframes Toastify__slideOutUp{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(0,-500px,0)}}.Toastify__slide-enter--top-left,.Toastify__slide-enter--bottom-left{animation-name:Toastify__slideInLeft}.Toastify__slide-enter--top-right,.Toastify__slide-enter--bottom-right{animation-name:Toastify__slideInRight}.Toastify__slide-enter--top-center{animation-name:Toastify__slideInDown}.Toastify__slide-enter--bottom-center{animation-name:Toastify__slideInUp}.Toastify__slide-exit--top-left,.Toastify__slide-exit--bottom-left{animation-name:Toastify__slideOutLeft;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--top-right,.Toastify__slide-exit--bottom-right{animation-name:Toastify__slideOutRight;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--top-center{animation-name:Toastify__slideOutUp;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--bottom-center{animation-name:Toastify__slideOutDown;animation-timing-function:ease-in;animation-duration:.3s}@keyframes Toastify__spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n`);import{isValidElement as $t}from\"react\";var L=t=>typeof t==\"number\"&&!isNaN(t),N=t=>typeof t==\"string\",P=t=>typeof t==\"function\",mt=t=>N(t)||L(t),B=t=>N(t)||P(t)?t:null,pt=(t,o)=>t===!1||L(t)&&t>0?t:o,z=t=>$t(t)||N(t)||P(t)||L(t);import ut,{useEffect as Rt,useLayoutEffect as Bt,useRef as zt}from\"react\";function Z(t,o,e=300){let{scrollHeight:r,style:s}=t;requestAnimationFrame(()=>{s.minHeight=\"initial\",s.height=r+\"px\",s.transition=`all ${e}ms`,requestAnimationFrame(()=>{s.height=\"0\",s.padding=\"0\",s.margin=\"0\",setTimeout(o,e)})})}function $({enter:t,exit:o,appendPosition:e=!1,collapse:r=!0,collapseDuration:s=300}){return function({children:a,position:d,preventExitTransition:c,done:T,nodeRef:g,isIn:v,playToast:x}){let C=e?`${t}--${d}`:t,S=e?`${o}--${d}`:o,E=zt(0);return Bt(()=>{let f=g.current,p=C.split(\" \"),b=n=>{n.target===g.current&&(x(),f.removeEventListener(\"animationend\",b),f.removeEventListener(\"animationcancel\",b),E.current===0&&n.type!==\"animationcancel\"&&f.classList.remove(...p))};(()=>{f.classList.add(...p),f.addEventListener(\"animationend\",b),f.addEventListener(\"animationcancel\",b)})()},[]),Rt(()=>{let f=g.current,p=()=>{f.removeEventListener(\"animationend\",p),r?Z(f,T,s):T()};v||(c?p():(()=>{E.current=1,f.className+=` ${S}`,f.addEventListener(\"animationend\",p)})())},[v]),ut.createElement(ut.Fragment,null,a)}}import{cloneElement as Ft,isValidElement as Ut}from\"react\";function J(t,o){return{content:tt(t.content,t.props),containerId:t.props.containerId,id:t.props.toastId,theme:t.props.theme,type:t.props.type,data:t.props.data||{},isLoading:t.props.isLoading,icon:t.props.icon,reason:t.removalReason,status:o}}function tt(t,o,e=!1){return Ut(t)&&!N(t.type)?Ft(t,{closeToast:o.closeToast,toastProps:o,data:o.data,isPaused:e}):P(t)?t({closeToast:o.closeToast,toastProps:o,data:o.data,isPaused:e}):t}import ot from\"react\";function yt({closeToast:t,theme:o,ariaLabel:e=\"close\"}){return ot.createElement(\"button\",{className:`Toastify__close-button Toastify__close-button--${o}`,type:\"button\",onClick:r=>{r.stopPropagation(),t(!0)},\"aria-label\":e},ot.createElement(\"svg\",{\"aria-hidden\":\"true\",viewBox:\"0 0 14 16\"},ot.createElement(\"path\",{fillRule:\"evenodd\",d:\"M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z\"})))}import et from\"react\";import Tt from\"clsx\";function gt({delay:t,isRunning:o,closeToast:e,type:r=\"default\",hide:s,className:l,controlledProgress:a,progress:d,rtl:c,isIn:T,theme:g}){let v=s||a&&d===0,x={animationDuration:`${t}ms`,animationPlayState:o?\"running\":\"paused\"};a&&(x.transform=`scaleX(${d})`);let C=Tt(\"Toastify__progress-bar\",a?\"Toastify__progress-bar--controlled\":\"Toastify__progress-bar--animated\",`Toastify__progress-bar-theme--${g}`,`Toastify__progress-bar--${r}`,{[\"Toastify__progress-bar--rtl\"]:c}),S=P(l)?l({rtl:c,type:r,defaultClassName:C}):Tt(C,l),E={[a&&d>=1?\"onTransitionEnd\":\"onAnimationEnd\"]:a&&d<1?null:()=>{T&&e()}};return et.createElement(\"div\",{className:\"Toastify__progress-bar--wrp\",\"data-hidden\":v},et.createElement(\"div\",{className:`Toastify__progress-bar--bg Toastify__progress-bar-theme--${g} Toastify__progress-bar--${r}`}),et.createElement(\"div\",{role:\"progressbar\",\"aria-hidden\":v?\"true\":\"false\",\"aria-label\":\"notification timer\",className:S,style:x,...E}))}import Dt from\"clsx\";import ct,{useEffect as yo,useRef as To,useState as go}from\"react\";var Xt=1,at=()=>`${Xt++}`;function _t(t,o,e){let r=1,s=0,l=[],a=[],d=o,c=new Map,T=new Set,g=i=>(T.add(i),()=>T.delete(i)),v=()=>{a=Array.from(c.values()),T.forEach(i=>i())},x=({containerId:i,toastId:n,updateId:u})=>{let h=i?i!==t:t!==1,m=c.has(n)&&u==null;return h||m},C=(i,n)=>{c.forEach(u=>{var h;(n==null||n===u.props.toastId)&&((h=u.toggle)==null||h.call(u,i))})},S=i=>{var n,u;(u=(n=i.props)==null?void 0:n.onClose)==null||u.call(n,i.removalReason),i.isActive=!1},E=i=>{if(i==null)c.forEach(S);else{let n=c.get(i);n&&S(n)}v()},f=()=>{s-=l.length,l=[]},p=i=>{var m,_;let{toastId:n,updateId:u}=i.props,h=u==null;i.staleId&&c.delete(i.staleId),i.isActive=!0,c.set(n,i),v(),e(J(i,h?\"added\":\"updated\")),h&&((_=(m=i.props).onOpen)==null||_.call(m))};return{id:t,props:d,observe:g,toggle:C,removeToast:E,toasts:c,clearQueue:f,buildToast:(i,n)=>{if(x(n))return;let{toastId:u,updateId:h,data:m,staleId:_,delay:k}=n,M=h==null;M&&s++;let A={...d,style:d.toastStyle,key:r++,...Object.fromEntries(Object.entries(n).filter(([D,Y])=>Y!=null)),toastId:u,updateId:h,data:m,isIn:!1,className:B(n.className||d.toastClassName),progressClassName:B(n.progressClassName||d.progressClassName),autoClose:n.isLoading?!1:pt(n.autoClose,d.autoClose),closeToast(D){c.get(u).removalReason=D,E(u)},deleteToast(){let D=c.get(u);if(D!=null){if(e(J(D,\"removed\")),c.delete(u),s--,s<0&&(s=0),l.length>0){p(l.shift());return}v()}}};A.closeButton=d.closeButton,n.closeButton===!1||z(n.closeButton)?A.closeButton=n.closeButton:n.closeButton===!0&&(A.closeButton=z(d.closeButton)?d.closeButton:!0);let R={content:i,props:A,staleId:_};d.limit&&d.limit>0&&s>d.limit&&M?l.push(R):L(k)?setTimeout(()=>{p(R)},k):p(R)},setProps(i){d=i},setToggle:(i,n)=>{let u=c.get(i);u&&(u.toggle=n)},isToastActive:i=>{var n;return(n=c.get(i))==null?void 0:n.isActive},getSnapshot:()=>a}}var I=new Map,F=[],st=new Set,Vt=t=>st.forEach(o=>o(t)),bt=()=>I.size>0;function Qt(){F.forEach(t=>nt(t.content,t.options)),F=[]}var vt=(t,{containerId:o})=>{var e;return(e=I.get(o||1))==null?void 0:e.toasts.get(t)};function X(t,o){var r;if(o)return!!((r=I.get(o))!=null&&r.isToastActive(t));let e=!1;return I.forEach(s=>{s.isToastActive(t)&&(e=!0)}),e}function ht(t){if(!bt()){F=F.filter(o=>t!=null&&o.options.toastId!==t);return}if(t==null||mt(t))I.forEach(o=>{o.removeToast(t)});else if(t&&(\"containerId\"in t||\"id\"in t)){let o=I.get(t.containerId);o?o.removeToast(t.id):I.forEach(e=>{e.removeToast(t.id)})}}var Ct=(t={})=>{I.forEach(o=>{o.props.limit&&(!t.containerId||o.id===t.containerId)&&o.clearQueue()})};function nt(t,o){z(t)&&(bt()||F.push({content:t,options:o}),I.forEach(e=>{e.buildToast(t,o)}))}function xt(t){var o;(o=I.get(t.containerId||1))==null||o.setToggle(t.id,t.fn)}function rt(t,o){I.forEach(e=>{(o==null||!(o!=null&&o.containerId)||(o==null?void 0:o.containerId)===e.id)&&e.toggle(t,o==null?void 0:o.id)})}function Et(t){let o=t.containerId||1;return{subscribe(e){let r=_t(o,t,Vt);I.set(o,r);let s=r.observe(e);return Qt(),()=>{s(),I.delete(o)}},setProps(e){var r;(r=I.get(o))==null||r.setProps(e)},getSnapshot(){var e;return(e=I.get(o))==null?void 0:e.getSnapshot()}}}function Pt(t){return st.add(t),()=>{st.delete(t)}}function Wt(t){return t&&(N(t.toastId)||L(t.toastId))?t.toastId:at()}function U(t,o){return nt(t,o),o.toastId}function V(t,o){return{...o,type:o&&o.type||t,toastId:Wt(o)}}function Q(t){return(o,e)=>U(o,V(t,e))}function y(t,o){return U(t,V(\"default\",o))}y.loading=(t,o)=>U(t,V(\"default\",{isLoading:!0,autoClose:!1,closeOnClick:!1,closeButton:!1,draggable:!1,...o}));function Gt(t,{pending:o,error:e,success:r},s){let l;o&&(l=N(o)?y.loading(o,s):y.loading(o.render,{...s,...o}));let a={isLoading:null,autoClose:null,closeOnClick:null,closeButton:null,draggable:null},d=(T,g,v)=>{if(g==null){y.dismiss(l);return}let x={type:T,...a,...s,data:v},C=N(g)?{render:g}:g;return l?y.update(l,{...x,...C}):y(C.render,{...x,...C}),v},c=P(t)?t():t;return c.then(T=>d(\"success\",r,T)).catch(T=>d(\"error\",e,T)),c}y.promise=Gt;y.success=Q(\"success\");y.info=Q(\"info\");y.error=Q(\"error\");y.warning=Q(\"warning\");y.warn=y.warning;y.dark=(t,o)=>U(t,V(\"default\",{theme:\"dark\",...o}));function qt(t){ht(t)}y.dismiss=qt;y.clearWaitingQueue=Ct;y.isActive=X;y.update=(t,o={})=>{let e=vt(t,o);if(e){let{props:r,content:s}=e,l={delay:100,...r,...o,toastId:o.toastId||t,updateId:at()};l.toastId!==t&&(l.staleId=t);let a=l.render||s;delete l.render,U(a,l)}};y.done=t=>{y.update(t,{progress:1})};y.onChange=Pt;y.play=t=>rt(!0,t);y.pause=t=>rt(!1,t);import{useRef as Kt,useSyncExternalStore as Yt}from\"react\";function It(t){var a;let{subscribe:o,getSnapshot:e,setProps:r}=Kt(Et(t)).current;r(t);let s=(a=Yt(o,e,e))==null?void 0:a.slice();function l(d){if(!s)return[];let c=new Map;return t.newestOnTop&&s.reverse(),s.forEach(T=>{let{position:g}=T.props;c.has(g)||c.set(g,[]),c.get(g).push(T)}),Array.from(c,T=>d(T[0],T[1]))}return{getToastToRender:l,isToastActive:X,count:s==null?void 0:s.length}}import{useEffect as Zt,useRef as St,useState as kt}from\"react\";function At(t){let[o,e]=kt(!1),[r,s]=kt(!1),l=St(null),a=St({start:0,delta:0,removalDistance:0,canCloseOnClick:!0,canDrag:!1,didMove:!1}).current,{autoClose:d,pauseOnHover:c,closeToast:T,onClick:g,closeOnClick:v}=t;xt({id:t.toastId,containerId:t.containerId,fn:e}),Zt(()=>{if(t.pauseOnFocusLoss)return x(),()=>{C()}},[t.pauseOnFocusLoss]);function x(){document.hasFocus()||p(),window.addEventListener(\"focus\",f),window.addEventListener(\"blur\",p)}function C(){window.removeEventListener(\"focus\",f),window.removeEventListener(\"blur\",p)}function S(m){if(t.draggable===!0||t.draggable===m.pointerType){b();let _=l.current;a.canCloseOnClick=!0,a.canDrag=!0,_.style.transition=\"none\",t.draggableDirection===\"x\"?(a.start=m.clientX,a.removalDistance=_.offsetWidth*(t.draggablePercent/100)):(a.start=m.clientY,a.removalDistance=_.offsetHeight*(t.draggablePercent===80?t.draggablePercent*1.5:t.draggablePercent)/100)}}function E(m){let{top:_,bottom:k,left:M,right:A}=l.current.getBoundingClientRect();m.nativeEvent.type!==\"touchend\"&&t.pauseOnHover&&m.clientX>=M&&m.clientX<=A&&m.clientY>=_&&m.clientY<=k?p():f()}function f(){e(!0)}function p(){e(!1)}function b(){a.didMove=!1,document.addEventListener(\"pointermove\",n),document.addEventListener(\"pointerup\",u)}function i(){document.removeEventListener(\"pointermove\",n),document.removeEventListener(\"pointerup\",u)}function n(m){let _=l.current;if(a.canDrag&&_){a.didMove=!0,o&&p(),t.draggableDirection===\"x\"?a.delta=m.clientX-a.start:a.delta=m.clientY-a.start,a.start!==m.clientX&&(a.canCloseOnClick=!1);let k=t.draggableDirection===\"x\"?`${a.delta}px, var(--y)`:`0, calc(${a.delta}px + var(--y))`;_.style.transform=`translate3d(${k},0)`,_.style.opacity=`${1-Math.abs(a.delta/a.removalDistance)}`}}function u(){i();let m=l.current;if(a.canDrag&&a.didMove&&m){if(a.canDrag=!1,Math.abs(a.delta)>a.removalDistance){s(!0),t.closeToast(!0),t.collapseAll();return}m.style.transition=\"transform 0.2s, opacity 0.2s\",m.style.removeProperty(\"transform\"),m.style.removeProperty(\"opacity\")}}let h={onPointerDown:S,onPointerUp:E};return d&&c&&(h.onMouseEnter=p,t.stacked||(h.onMouseLeave=f)),v&&(h.onClick=m=>{g&&g(m),a.canCloseOnClick&&T(!0)}),{playToast:f,pauseToast:p,isRunning:o,preventExitTransition:r,toastRef:l,eventHandlers:h}}import{useEffect as Jt,useLayoutEffect as to}from\"react\";var Ot=typeof window!=\"undefined\"?to:Jt;import it from\"clsx\";import q,{cloneElement as co,isValidElement as fo}from\"react\";import O,{cloneElement as oo,isValidElement as eo}from\"react\";var G=({theme:t,type:o,isLoading:e,...r})=>O.createElement(\"svg\",{viewBox:\"0 0 24 24\",width:\"100%\",height:\"100%\",fill:t===\"colored\"?\"currentColor\":`var(--toastify-icon-color-${o})`,...r});function ao(t){return O.createElement(G,{...t},O.createElement(\"path\",{d:\"M23.32 17.191L15.438 2.184C14.728.833 13.416 0 11.996 0c-1.42 0-2.733.833-3.443 2.184L.533 17.448a4.744 4.744 0 000 4.368C1.243 23.167 2.555 24 3.975 24h16.05C22.22 24 24 22.044 24 19.632c0-.904-.251-1.746-.68-2.44zm-9.622 1.46c0 1.033-.724 1.823-1.698 1.823s-1.698-.79-1.698-1.822v-.043c0-1.028.724-1.822 1.698-1.822s1.698.79 1.698 1.822v.043zm.039-12.285l-.84 8.06c-.057.581-.408.943-.897.943-.49 0-.84-.367-.896-.942l-.84-8.065c-.057-.624.25-1.095.779-1.095h1.91c.528.005.84.476.784 1.1z\"}))}function so(t){return O.createElement(G,{...t},O.createElement(\"path\",{d:\"M12 0a12 12 0 1012 12A12.013 12.013 0 0012 0zm.25 5a1.5 1.5 0 11-1.5 1.5 1.5 1.5 0 011.5-1.5zm2.25 13.5h-4a1 1 0 010-2h.75a.25.25 0 00.25-.25v-4.5a.25.25 0 00-.25-.25h-.75a1 1 0 010-2h1a2 2 0 012 2v4.75a.25.25 0 00.25.25h.75a1 1 0 110 2z\"}))}function no(t){return O.createElement(G,{...t},O.createElement(\"path\",{d:\"M12 0a12 12 0 1012 12A12.014 12.014 0 0012 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 01-1.43.188l-4.888-3.908a1 1 0 111.25-1.562l4.076 3.261 6.227-8.451a1 1 0 111.61 1.183z\"}))}function ro(t){return O.createElement(G,{...t},O.createElement(\"path\",{d:\"M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z\"}))}function io(){return O.createElement(\"div\",{className:\"Toastify__spinner\"})}var W={info:so,warning:ao,success:no,error:ro,spinner:io},lo=t=>t in W;function Nt({theme:t,type:o,isLoading:e,icon:r}){let s=null,l={theme:t,type:o};return r===!1||(P(r)?s=r({...l,isLoading:e}):eo(r)?s=oo(r,l):e?s=W.spinner():lo(o)&&(s=W[o](l))),s}var wt=t=>{let{isRunning:o,preventExitTransition:e,toastRef:r,eventHandlers:s,playToast:l}=At(t),{closeButton:a,children:d,autoClose:c,onClick:T,type:g,hideProgressBar:v,closeToast:x,transition:C,position:S,className:E,style:f,progressClassName:p,updateId:b,role:i,progress:n,rtl:u,toastId:h,deleteToast:m,isIn:_,isLoading:k,closeOnClick:M,theme:A,ariaLabel:R}=t,D=it(\"Toastify__toast\",`Toastify__toast-theme--${A}`,`Toastify__toast--${g}`,{[\"Toastify__toast--rtl\"]:u},{[\"Toastify__toast--close-on-click\"]:M}),Y=P(E)?E({rtl:u,position:S,type:g,defaultClassName:D}):it(D,E),ft=Nt(t),dt=!!n||!c,j={closeToast:x,type:g,theme:A},H=null;return a===!1||(P(a)?H=a(j):fo(a)?H=co(a,j):H=yt(j)),q.createElement(C,{isIn:_,done:m,position:S,preventExitTransition:e,nodeRef:r,playToast:l},q.createElement(\"div\",{id:h,tabIndex:0,onClick:T,\"data-in\":_,className:Y,...s,style:f,ref:r,..._&&{role:i,\"aria-label\":R}},ft!=null&&q.createElement(\"div\",{className:it(\"Toastify__toast-icon\",{[\"Toastify--animate-icon Toastify__zoom-enter\"]:!k})},ft),tt(d,t,!o),H,!t.customProgressBar&&q.createElement(gt,{...b&&!dt?{key:`p-${b}`}:{},rtl:u,theme:A,delay:c,isRunning:o,isIn:_,closeToast:x,hide:v,type:g,className:p,controlledProgress:dt,progress:n||0})))};var K=(t,o=!1)=>({enter:`Toastify--animate Toastify__${t}-enter`,exit:`Toastify--animate Toastify__${t}-exit`,appendPosition:o}),lt=$(K(\"bounce\",!0)),mo=$(K(\"slide\",!0)),po=$(K(\"zoom\")),uo=$(K(\"flip\"));var _o={position:\"top-right\",transition:lt,autoClose:5e3,closeButton:!0,pauseOnHover:!0,pauseOnFocusLoss:!0,draggable:\"touch\",draggablePercent:80,draggableDirection:\"x\",role:\"alert\",theme:\"light\",\"aria-label\":\"Notifications Alt+T\",hotKeys:t=>t.altKey&&t.code===\"KeyT\"};function Lt(t){let o={..._o,...t},e=t.stacked,[r,s]=go(!0),l=To(null),{getToastToRender:a,isToastActive:d,count:c}=It(o),{className:T,style:g,rtl:v,containerId:x,hotKeys:C}=o;function S(f){let p=Dt(\"Toastify__toast-container\",`Toastify__toast-container--${f}`,{[\"Toastify__toast-container--rtl\"]:v});return P(T)?T({position:f,rtl:v,defaultClassName:p}):Dt(p,B(T))}function E(){e&&(s(!0),y.play())}return Ot(()=>{var f;if(e){let p=l.current.querySelectorAll('[data-in=\"true\"]'),b=12,i=(f=o.position)==null?void 0:f.includes(\"top\"),n=0,u=0;Array.from(p).reverse().forEach((h,m)=>{let _=h;_.classList.add(\"Toastify__toast--stacked\"),m>0&&(_.dataset.collapsed=`${r}`),_.dataset.pos||(_.dataset.pos=i?\"top\":\"bot\");let k=n*(r?.2:1)+(r?0:b*m);_.style.setProperty(\"--y\",`${i?k:k*-1}px`),_.style.setProperty(\"--g\",`${b}`),_.style.setProperty(\"--s\",`${1-(r?u:0)}`),n+=_.offsetHeight,u+=.025})}},[r,c,e]),yo(()=>{function f(p){var i;let b=l.current;C(p)&&((i=b.querySelector('[tabIndex=\"0\"]'))==null||i.focus(),s(!1),y.pause()),p.key===\"Escape\"&&(document.activeElement===b||b!=null&&b.contains(document.activeElement))&&(s(!0),y.play())}return document.addEventListener(\"keydown\",f),()=>{document.removeEventListener(\"keydown\",f)}},[C]),ct.createElement(\"section\",{ref:l,className:\"Toastify\",id:x,onMouseEnter:()=>{e&&(s(!1),y.pause())},onMouseLeave:E,\"aria-live\":\"polite\",\"aria-atomic\":\"false\",\"aria-relevant\":\"additions text\",\"aria-label\":o[\"aria-label\"]},a((f,p)=>{let b=p.length?{...g}:{...g,pointerEvents:\"none\"};return ct.createElement(\"div\",{tabIndex:-1,className:S(f),\"data-stacked\":e,style:b,key:`c-${f}`},p.map(({content:i,props:n})=>ct.createElement(wt,{...n,stacked:e,collapseAll:E,isIn:d(n.toastId,n.containerId),key:`t-${n.key}`},i)))}))}export{lt as Bounce,uo as Flip,W as Icons,mo as Slide,Lt as ToastContainer,po as Zoom,Z as collapseToast,$ as cssTransition,y as toast};\n//# sourceMappingURL=index.mjs.map","import { toast, ToastOptions } from 'react-toastify';\n\nconst BASE_MULTI_OPTIONS: ToastOptions = {\n  containerId: 'swatch-multi-module',\n};\n\nexport const showSuccessToast = (message: string) =>\n  toast.success(message, BASE_MULTI_OPTIONS);\n\nexport const showErrorToast = (message: string) =>\n  toast.error(message, BASE_MULTI_OPTIONS);\n\nexport const showInfoToast = (message: string) =>\n  toast.info(message, BASE_MULTI_OPTIONS);\n","import { IProductListItem } from '../../MultiProduct/model/types';\n\nexport interface IProduct {\n  attributes: AttributeValue[] | any[];\n  name: string;\n  productId: number;\n  categories: string[];\n}\n\nexport interface ISwatchesSlice {\n  // isOpenSidebar: boolean;\n  listAttributes: IAttributeAsset[];\n  productElementOptions: any[];\n  materialSelectState: IMaterialSelectState;\n  allMaterialsValues: AttributeValue[];\n  selectedMaterials: AttributeValue[];\n  // productList: IProduct[];\n  selectedProduct: IProductListItem | null;\n  isLoadingSelectedProduct: boolean;\n  isOpenMultiProductCart: boolean;\n}\n\nexport interface IMaterialSelectState {\n  Finish: string[];\n  Color: string[];\n  Look: string[];\n}\nexport type TFilterName = keyof IMaterialSelectState;\n\nexport interface ISetFiltersPayload {\n  filterName: keyof IMaterialSelectState;\n  values: string[];\n}\n\nexport interface IAttributeAsset {\n  assetType: string;\n  blacklist: unknown[];\n  defaultValue: { assetId: string; type: string }[];\n  disabledValues: unknown[];\n  enabled: boolean;\n  global: {\n    defaultValue: { assetId: string; type: string };\n    id: string;\n    metadata: unknown[];\n    name: string;\n    type: string;\n  };\n  hiddenValues: unknown[];\n  id: string;\n  label: string;\n  metadata: {\n    [key: string]: string;\n  };\n  name: string;\n  type: string;\n  value: {\n    assetId: string;\n    configuration: unknown;\n    metadata: { [key: string]: string };\n    name: string;\n    tags: string[];\n    type: string;\n  };\n  values: IAttributeAssetValues[];\n  visible: boolean;\n\n  // fetchProduct values\n  valuesArray?: IMaterialMetadata[];\n  option?: string;\n}\n\nexport interface IAttributeAssetValues {\n  assetId: string;\n  enabled: boolean;\n  fileSize: number;\n  handleSelect: () => unknown;\n  label: string;\n  metadata: {\n    [key: string]: string;\n  };\n  name: string;\n  selected: boolean;\n  tagids: string[];\n  tags: string[];\n  type: string;\n  visible: boolean;\n}\n\nexport interface IValueItem {\n  value: string;\n  label: string;\n  additionalFilter?: string;\n}\n\nexport interface IOption {\n  option: string;\n  label: string;\n  optionName: string;\n  order: string;\n  type: string;\n  typeComponent: string;\n  values?: Record<string, string>;\n  valuesArray?: IValueItem[];\n}\n\nexport interface IGroup {\n  groupName: string;\n  order: string;\n  type: string;\n  options: IOption[];\n}\n\nexport interface ISection {\n  section: string;\n  sort: string;\n  groups: IGroup[];\n  enabledCTA: boolean;\n}\n\nexport const ETypeComponent = {\n  MATERIAL: 'material',\n  FILTRATION: 'filtration',\n  LIST: 'list',\n  IMAGE: 'image',\n  COMBINED: 'combined',\n} as const;\n\nexport type ETypeComponent =\n  (typeof ETypeComponent)[keyof typeof ETypeComponent];\n\nexport interface AttributeValue {\n  count: number;\n  assetId?: string;\n  name?: string;\n  tags?: string[];\n  metadata?: IMaterialMetadata;\n  parentName: string;\n  fileSize?: number;\n  tagids?: string[];\n  type?: 'item' | string;\n  label: string;\n  visible?: boolean;\n  enabled?: boolean;\n  // fetch properties\n  option?: string;\n  optionName?: string;\n  valuesArray?: IMaterialMetadata[];\n  value?: string;\n  id: string;\n}\n\nexport interface IMaterialMetadata {\n  Look?: string;\n  Color?: string;\n  image?: string;\n  label?: string;\n  value?: string;\n  Material?: string;\n  zoomIconColor?: string;\n  [key: string]: string | undefined;\n}\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n    byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n    return (byteToHex[arr[offset + 0]] +\n        byteToHex[arr[offset + 1]] +\n        byteToHex[arr[offset + 2]] +\n        byteToHex[arr[offset + 3]] +\n        '-' +\n        byteToHex[arr[offset + 4]] +\n        byteToHex[arr[offset + 5]] +\n        '-' +\n        byteToHex[arr[offset + 6]] +\n        byteToHex[arr[offset + 7]] +\n        '-' +\n        byteToHex[arr[offset + 8]] +\n        byteToHex[arr[offset + 9]] +\n        '-' +\n        byteToHex[arr[offset + 10]] +\n        byteToHex[arr[offset + 11]] +\n        byteToHex[arr[offset + 12]] +\n        byteToHex[arr[offset + 13]] +\n        byteToHex[arr[offset + 14]] +\n        byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n    const uuid = unsafeStringify(arr, offset);\n    if (!validate(uuid)) {\n        throw TypeError('Stringified UUID is invalid');\n    }\n    return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n    if (!getRandomValues) {\n        if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n            throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n        }\n        getRandomValues = crypto.getRandomValues.bind(crypto);\n    }\n    return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction _v4(options, buf, offset) {\n    options = options || {};\n    const rnds = options.random ?? options.rng?.() ?? rng();\n    if (rnds.length < 16) {\n        throw new Error('Random bytes length must be >= 16');\n    }\n    rnds[6] = (rnds[6] & 0x0f) | 0x40;\n    rnds[8] = (rnds[8] & 0x3f) | 0x80;\n    if (buf) {\n        offset = offset || 0;\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n        for (let i = 0; i < 16; ++i) {\n            buf[offset + i] = rnds[i];\n        }\n        return buf;\n    }\n    return unsafeStringify(rnds);\n}\nfunction v4(options, buf, offset) {\n    if (native.randomUUID && !buf && !options) {\n        return native.randomUUID();\n    }\n    return _v4(options, buf, offset);\n}\nexport default v4;\n","import { IFetchProductData } from '../../../shared/types/fetchData';\nimport { IProductListItem } from '../../MultiProduct/model/types';\nimport { SwatchesServices } from '../../swatches/lib/SwatchesServices';\nimport {\n  ETypeComponent,\n  type IAttributeAsset,\n  type ISection,\n} from '../../swatches/model/types';\nimport { EDataInputType, type IMapUIData } from '../utils/types';\nimport { v4 as uuidv4 } from 'uuid';\n\nconst GROUPING_KEY = 'UIGrouping';\n\nexport class DataAdapterServices {\n  static getTransformedData({\n    dataType,\n    data,\n    selectedProduct,\n  }: {\n    dataType: EDataInputType;\n    data: IFetchProductData | any;\n    selectedProduct?: IProductListItem;\n  }) {\n    switch (dataType) {\n      case EDataInputType.UI:\n        return this.getMapUIData(data);\n      // case EDataInputType.DATA_INPUT:\n      //   return console.log(EDataInputType.DATA_INPUT);\n      // case EDataInputType.DATA_ALL_PRODUCT:\n      //   return console.log(EDataInputType.DATA_ALL_PRODUCT);\n      case EDataInputType.FETCH_DATA_PRODUCT:\n        return this.getTransformedFetchProductData({ data, selectedProduct });\n      default:\n        throw new Error('Unsupported format');\n    }\n  }\n\n  // EDataInputType.UI DATA\n  static getGroupingValue(attributes: any[]) {\n    if (!attributes) return;\n\n    return attributes.find((item) => item.name === GROUPING_KEY);\n  }\n\n  static getAllMaterialValuesKeys(\n    attributes: ISection[],\n  ): string[] | undefined {\n    if (!attributes) return;\n\n    return attributes.flatMap((section) =>\n      section.groups\n        .flatMap((group) =>\n          group.options.filter(\n            (opt) => opt.typeComponent === ETypeComponent.MATERIAL,\n          ),\n        )\n        .map((item) => item.optionName),\n    );\n  }\n\n  static getAllMaterialOptions(\n    attributes: IAttributeAsset[],\n  ): IMapUIData | undefined {\n    const groupingValues = JSON.parse(this.getGroupingValue(attributes).value);\n\n    if (groupingValues) {\n      const materialKeys = this.getAllMaterialValuesKeys(groupingValues);\n      if (materialKeys?.length) {\n        const productElementOptions = attributes.filter((item) =>\n          materialKeys.includes(item.name),\n        );\n        if (productElementOptions?.length) {\n          const allMaterialValues =\n            SwatchesServices.getMaterialsValuesFromOptions(\n              productElementOptions,\n            );\n\n          if (allMaterialValues?.length) {\n            return { allMaterialValues, productElementOptions };\n          }\n        }\n      }\n    }\n  }\n\n  static getMapUIData(data: IAttributeAsset[]): IMapUIData | undefined {\n    return this.getAllMaterialOptions(data);\n  }\n\n  // groupName solution\n  static getTransformedFetchProductData({\n    data,\n    selectedProduct,\n  }: {\n    data: IFetchProductData;\n    selectedProduct?: IProductListItem;\n  }): any {\n    const { materials = [], structure = [] } = data;\n\n    // optionName -> groupName (only MATERIAL)\n    const optionToGroup = new Map<string, string>();\n    const optionToSection = new Map<string, string>();\n    for (const section of structure) {\n      for (const group of section.groups ?? []) {\n        for (const opt of group.options ?? []) {\n          if (\n            opt?.typeComponent === ETypeComponent.MATERIAL &&\n            opt?.optionName\n          ) {\n            optionToGroup.set(opt.optionName, group.groupName);\n            // added section name without \"Select \" prefix if exists\n            optionToSection.set(\n              opt.optionName,\n              section.section.replace(/^Select\\s+/i, '').trim(),\n            );\n          }\n        }\n      }\n    }\n\n    const materialsValues = materials.filter(\n      (m) => m.optionName && optionToGroup.has(m.optionName!),\n    );\n\n    const materialsWithGroup = materialsValues.map((m) => ({\n      ...m,\n      groupName: m.optionName ? optionToGroup.get(m.optionName) : undefined,\n      sectionName: m.optionName ? optionToSection.get(m.optionName) : undefined,\n    }));\n\n    // flatten children; inject parentName + groupName\n    const allMaterialValues = materialsWithGroup.flatMap((item) => {\n      const { label, groupName, sectionName, optionName } = item;\n\n      const parentName =\n        (label.toLocaleLowerCase() === 'color'\n          ? (sectionName ?? groupName)\n          : label) || 'without_name';\n\n      return (item.valuesArray ?? []).map((v) => ({\n        ...v,\n        parentName,\n        optionName: optionName,\n        productInformation: selectedProduct || \"Product wasn't found\",\n        id: uuidv4(),\n      }));\n    });\n\n    const productElementOptions = materialsWithGroup.map(\n      ({ label, groupName, sectionName, optionName, valuesArray }) => {\n        const normalizedLabel =\n          label?.toLowerCase() === 'color'\n            ? (sectionName ?? groupName ?? label)\n            : label;\n\n        return {\n          id: uuidv4(),\n          value: normalizedLabel!,\n          label: normalizedLabel!,\n          valuesArray: valuesArray?.length\n            ? valuesArray.map((item) => ({\n                ...item,\n                optionName,\n                id: uuidv4(),\n              }))\n            : [],\n        };\n      },\n    );\n\n    return {\n      allMaterialValues,\n      productElementOptions,\n    };\n  }\n}\n","import { useAppDispatch } from '../../../../app/store/store';\nimport { scrollToTop } from '../../../../shared/utils/scrollToTop';\nimport { showErrorToast } from '../../../../shared/utils/toast';\nimport { DataAdapterServices } from '../../../DataAdapter/lib/DataAdapterServices';\nimport { EDataInputType } from '../../../DataAdapter/utils/types';\nimport {\n  setAllMaterialsOptions,\n  setSelectedProduct,\n} from '../../../swatches/model/swatchesSlice';\nimport { getSelectedProductThunk } from '../../../swatches/model/thunks';\nimport { IProductListItem } from '../../model/types';\n// import productThumbnail from '../../../../app/assets/images/product_thumb.png';\n\ninterface IProductListItemProps {\n  productListItem: IProductListItem;\n}\n\nexport const ProductListItem = ({ productListItem }: IProductListItemProps) => {\n  const dispatch = useAppDispatch();\n\n  const { name, img } = productListItem;\n\n  const imageURL = img\n    ? `https://admin-fts.threekit.com${img}`\n    : 'https://clownfish-app-cvxrz.ondigitalocean.app/assets/product_thumb-Bn1S8z9K.png';\n\n  const handleSetSelectedItem = async () => {\n    const { assetId, name } = productListItem;\n\n    if (assetId && name) {\n      const productData = await dispatch(\n        getSelectedProductThunk({ assetId }),\n      ).unwrap();\n      if (productData) {\n        dispatch(setSelectedProduct(productListItem));\n        const fetchProductData = DataAdapterServices.getTransformedData({\n          dataType: EDataInputType.FETCH_DATA_PRODUCT,\n          data: productData,\n        });\n        dispatch(setAllMaterialsOptions(fetchProductData));\n        scrollToTop();\n      } else {\n        showErrorToast('Failed to load product');\n      }\n    }\n  };\n\n  return (\n    <li\n      className='min-w-0 cursor-pointer text-[12px]'\n      tabIndex={0}\n      onClick={handleSetSelectedItem}\n    >\n      <div className='mb-[12px] w-full aspect-square relative overflow-hidden rounded-sm'>\n        <img\n          src={\n            imageURL ||\n            'https://hastings-questionnaie-storage.fra1.digitaloceanspaces.com/static/Image%20(8)%20(1).png'\n          }\n          alt='product-list-item'\n          className='absolute inset-0 w-full h-full! object-cover'\n        />\n      </div>\n      {name}\n    </li>\n  );\n};\n","export const MOCK_ALL_CATEGORY_SLIDER_ITEM = {\n  name: 'All',\n  value: '',\n  productId: 0,\n  items: [],\n};\n","import { AttributeValue } from '../../swatches/model/types';\nimport type { ICartItem, IProductListItem, ISliderItem } from '../model/types';\nimport { MOCK_ALL_CATEGORY_SLIDER_ITEM } from '../utils/constants';\n\nexport class MultiProductCartService {\n  static getCartTotalCount({ cartItems }: { cartItems: ICartItem[] }) {\n    return cartItems.reduce((sum, item) => sum + item.count, 0);\n  }\n\n  // static getUniqueCategories(productList: IProductListItem[]): ISliderItem[] {\n  //   const uniqueCollections = [\n  //     ...new Set(productList.map((p) => p.collection)),\n  //   ];\n\n  //   const preparedData = uniqueCollections.map((collection, index) => ({\n  //     name: collection,\n  //     value: collection,\n  //     productId: index + 1,\n  //     items: [],\n  //   }));\n\n  //   return [...preparedData, MOCK_ALL_CATEGORY_SLIDER_ITEM].sort(\n  //     (a, b) => a.productId - b.productId,\n  //   );\n  // }\n  static getUniqueCategories(productList: IProductListItem[]): ISliderItem[] {\n    // desired visual order\n    const ORDER: string[] = [\n      'All',\n      'Vanities',\n      'Storage & Shelving',\n      'Countertops',\n      'Basins',\n      'Vessels',\n      'Pedestals & Consoles',\n      'Tubs',\n      'Mirrors',\n      'Toilets',\n      'Bathroom Accessories',\n    ];\n\n    const uniqueCollections = Array.from(\n      new Set(productList.map((p) => p.collection).filter(Boolean)),\n    );\n\n    const preparedData: ISliderItem[] = uniqueCollections.map((collection) => ({\n      name: collection,\n      value: collection,\n      productId: 0,\n      items: [],\n    }));\n\n    const withAll: ISliderItem[] = [\n      MOCK_ALL_CATEGORY_SLIDER_ITEM,\n      ...preparedData,\n    ];\n\n    const sorted = withAll.sort((a, b) => {\n      const idxA = ORDER.indexOf(a.name);\n      const idxB = ORDER.indexOf(b.name);\n\n      const safeA = idxA === -1 ? Number.MAX_SAFE_INTEGER : idxA;\n      const safeB = idxB === -1 ? Number.MAX_SAFE_INTEGER : idxB;\n\n      if (safeA !== safeB) return safeA - safeB;\n\n      return a.name.localeCompare(b.name);\n    });\n\n    return sorted.map((item, index) => ({\n      ...item,\n      productId: index,\n    }));\n  }\n\n  static getCartPreparedOption(\n    selectedMaterials: AttributeValue[],\n    cartData: {\n      productId: number;\n      name: string;\n      items: ICartItem[];\n    }[],\n  ): ICartItem[] {\n    if (!selectedMaterials?.length) return [];\n\n    const allCartItems = cartData.flatMap((cart) => cart.items || []);\n\n    return selectedMaterials.map((item) => {\n      const existing = allCartItems.find(\n        (cartItem) =>\n          cartItem.parentName === item.parentName &&\n          cartItem.metadata?.label === item.metadata?.label,\n      );\n\n      return {\n        ...item,\n        count: existing ? existing.count : 1,\n      };\n    });\n  }\n}\n","import React from 'react';\n\ninterface ILabelProps {\n  text: string;\n  isActive?: boolean;\n  onClick?: () => void;\n}\n\nexport const Label = ({ text, isActive = false, onClick }: ILabelProps) => {\n  const handleLabelClick = () => {\n    if (onClick) onClick();\n  };\n\n  const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n    if (e.key === 'Enter' || e.key === ' ') {\n      e.preventDefault();\n      handleLabelClick();\n    }\n  };\n\n  return (\n    <div\n      role='button'\n      tabIndex={0}\n      onClick={handleLabelClick}\n      onKeyDown={handleKeyDown}\n      className={`\n        flex flex-row justify-center items-center max-w-max px-4 py-2 capitalize rounded-full\n        font-medium text-[14px] cursor-pointer transition-all duration-[400ms] ease-in-out\n        outline-none focus:ring-2 focus:ring-[var(--main-accent-color)] focus:ring-offset-2\n        ${\n          isActive\n            ? 'bg-[var(--main-accent-color)] text-white hover:brightness-90'\n            : 'bg-[var(--label-bg)] hover:brightness-95'\n        }\n      `}\n    >\n      {text}\n    </div>\n  );\n};\n","import type { FC } from 'react';\nimport type { SvgIconProps } from '../../../shared/types/svg';\n\nexport const ChevronSVGIcon: FC<SvgIconProps> = (props) => {\n  return (\n    <svg\n      width='7'\n      height='12'\n      viewBox='0 0 7 12'\n      fill='none'\n      xmlns='http://www.w3.org/2000/svg'\n      stroke='currentColor'\n      {...props}\n    >\n      <path\n        d='M5.75 0.75L0.75 5.75L5.75 10.75'\n        stroke='current'\n        strokeWidth='1.5'\n        strokeLinecap='round'\n        strokeLinejoin='round'\n      />\n    </svg>\n  );\n};\n","import React, {\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useRef,\n  useState,\n} from 'react';\nimport { Label } from '../Label/Label';\nimport type {\n  IProductCart,\n  ISliderItem,\n} from '../../../features/MultiProduct/model/types';\nimport { ChevronSVGIcon } from '../../../app/assets/svg/ChevronSVGIcon';\n\ninterface ISliderProps {\n  items: ISliderItem[] | IProductCart[];\n  activeId?: ISliderItem['productId'] | IProductCart['productId'];\n  onSelect: (item: ISliderItem | IProductCart) => void;\n  className?: string;\n  stepRatio?: number;\n}\n\nexport const Slider: React.FC<ISliderProps> = ({\n  items,\n  activeId,\n  onSelect,\n  className = '',\n  stepRatio = 0.8,\n}) => {\n  const scrollerRef = useRef<HTMLDivElement | null>(null);\n  const contentRef = useRef<HTMLDivElement | null>(null);\n  const rafRef = useRef<number | null>(null);\n\n  const [canLeft, setCanLeft] = useState(false);\n  const [canRight, setCanRight] = useState(false);\n\n  const updateEdges = useCallback(() => {\n    const el = scrollerRef.current;\n    if (!el) return;\n\n    const remaining = el.scrollWidth - el.clientWidth - el.scrollLeft;\n    const EPS = 0.5;\n\n    setCanLeft(el.scrollLeft > EPS);\n    setCanRight(remaining > EPS);\n  }, []);\n\n  useLayoutEffect(() => {\n    rafRef.current = requestAnimationFrame(updateEdges);\n    return () => {\n      if (rafRef.current) cancelAnimationFrame(rafRef.current);\n    };\n  }, [items.length, updateEdges]);\n\n  useEffect(() => {\n    const el = scrollerRef.current;\n    const content = contentRef.current;\n    if (!el || !content) return;\n\n    updateEdges();\n\n    const roScroller = new ResizeObserver(() => updateEdges());\n    const roContent = new ResizeObserver(() => updateEdges());\n    roScroller.observe(el);\n    roContent.observe(content);\n\n    const onScroll = () => updateEdges();\n    el.addEventListener('scroll', onScroll, { passive: true });\n\n    if ('fonts' in document) {\n      document.fonts?.ready?.then(() => updateEdges());\n    }\n\n    return () => {\n      roScroller.disconnect();\n      roContent.disconnect();\n      el.removeEventListener('scroll', onScroll);\n    };\n  }, [updateEdges]);\n\n  const scrollByStep = (dir: 'left' | 'right') => {\n    const el = scrollerRef.current;\n    if (!el) return;\n    const delta = el.clientWidth * stepRatio * (dir === 'left' ? -1 : 1);\n    el.scrollBy({ left: delta, behavior: 'smooth' });\n  };\n\n  return (\n    <div\n      className={`flex! flex-row! items-center! gap-[8px]! lg:w-[50%]! xl:max-w-[68%]! xl:w-full! ${className}`}\n      role='region'\n      aria-label='Category slider'\n    >\n      <button\n        type='button'\n        aria-label='Scroll left'\n        disabled={!canLeft}\n        onClick={() => scrollByStep('left')}\n        className={`flex-shrink-0 h-8 w-8 rounded-full flex flex-row items-center justify-center shadow\n          ${canLeft ? 'bg-black text-white hover:brightness-110' : 'bg-gray-200 text-gray-500 opacity-60 cursor-not-allowed'}`}\n      >\n        <ChevronSVGIcon className='w-[16px] h-4 rotate-360' />{' '}\n      </button>\n\n      <div\n        ref={scrollerRef}\n        className='no-scrollbar flex-1 overflow-hidden scroll-smooth'\n        style={{\n          WebkitOverflowScrolling: 'touch',\n          // paddingLeft: '0.5rem',\n          // paddingRight: '0.5rem',\n        }}\n      >\n        <div\n          ref={contentRef}\n          className='flex flex-row gap-[12px] sm:gap-[16px] py-2 px-3'\n        >\n          {items.map((it) => {\n            const id = it.productId;\n            const isActive = activeId === id;\n            return (\n              <div key={id} className='shrink-0'>\n                <Label\n                  text={it.name}\n                  isActive={isActive}\n                  onClick={() => onSelect(it)}\n                />\n              </div>\n            );\n          })}\n        </div>\n      </div>\n\n      <button\n        type='button'\n        aria-label='Scroll right'\n        disabled={!canRight}\n        onClick={() => scrollByStep('right')}\n        className={`flex-shrink-0 h-8 w-8 rounded-full flex flex-row items-center justify-center shadow\n          ${canRight ? 'bg-black text-white hover:brightness-110' : 'bg-gray-200 text-gray-400 opacity-60 cursor-not-allowed'}`}\n      >\n        <ChevronSVGIcon className='w-[16px] h-4 rotate-180' />{' '}\n      </button>\n    </div>\n  );\n};\n","import ReactMarkdown from 'react-markdown';\nimport rehypeRaw from 'rehype-raw';\nimport styles from './MDWithAccordion.module.scss';\n\n/**\n * Converts markers ~H~~...~~ ~M~~...~~ into <details><summary>…</summary>…</details>\n */\nfunction toAccordions(src: string, { openFirst = false } = {}) {\n  if (!src) return '';\n\n  const ACCORDION_RE = /~H~~([\\s\\S]*?)~~\\s*~M~~([\\s\\S]*?)~~/g;\n  let idx = 0;\n\n  return src.replace(ACCORDION_RE, (_: any, head: any, body: any) => {\n    const openAttr = openFirst && idx === 0 ? ' open' : '';\n    idx += 1;\n    return `\n<details class=\"${styles.mdAccordion}\"${openAttr}>\n<summary>${String(head).trim()}</summary>\n<div class=\"p-4\">\n${String(body).trim()}\n</div>\n</details>`;\n  });\n}\n\n/**\n * Markdown renderer with accordion support\n */\n\ninterface IMDWithAccordion {\n  children: React.ReactNode;\n  className?: string;\n  openFirst?: boolean;\n}\n\nexport default function MDWithAccordion({\n  children,\n  className = '',\n  openFirst = false,\n}: IMDWithAccordion) {\n  const src = typeof children === 'string' ? children : '';\n  const preprocessed = toAccordions(src, { openFirst });\n\n  return (\n    <div\n      className={['prose', styles.prose, className].filter(Boolean).join(' ')}\n    >\n      <ReactMarkdown rehypePlugins={[rehypeRaw]}>{preprocessed}</ReactMarkdown>\n    </div>\n  );\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function InfoIcon(props: any) {\n  return (\n    <svg\n      width='12'\n      height='12'\n      viewBox='0 0 12 12'\n      fill='none'\n      xmlns='http://www.w3.org/2000/svg'\n      aria-hidden\n      className='size-5'\n      {...props}\n    >\n      <rect\n        x='0.666667'\n        y='0.666667'\n        width='10.6667'\n        height='10.6667'\n        rx='5.33333'\n        stroke='#B1B1B1'\n        strokeWidth='1.33333'\n      />\n      <circle cx='6.00065' cy='3.33268' r='0.666667' fill='#B1B1B1' />\n      <rect x='5.33398' y='5.33398' width='1.33333' height='4' fill='#B1B1B1' />\n    </svg>\n  );\n}\n","import {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from '@radix-ui/react-popover';\nimport MDWithAccordion from '../Markdown/MDWithAccordion';\nimport InfoIcon from './InfoIcon';\nimport s from './PopoverTooltip.module.scss';\n\n/**\n * PopoverTooltip — popover with Markdown + accordions.\n * @param {string} tooltipData — raw markdown with ~H~~ ~M~~ markers\n * @param {boolean} openFirst — whether to open the first accordion\n * @param {React.ReactNode} trigger — custom trigger (optional)\n */\nexport const PopoverTooltip = ({\n  tooltipData,\n  openFirst = false,\n  trigger,\n}: {\n  tooltipData: string;\n  openFirst?: boolean;\n  trigger?: React.ReactNode;\n}) => {\n  if (!tooltipData?.trim()) return null;\n\n  const handleClick = (event: any) => {\n    event.stopPropagation();\n  };\n\n  return (\n    <Popover>\n      <PopoverTrigger asChild>\n        {trigger ?? (\n          <button\n            className={s.iconBtn}\n            aria-label='Open tooltip'\n            onClick={handleClick}\n          >\n            <InfoIcon className={s.iconSvg} />\n          </button>\n        )}\n      </PopoverTrigger>\n\n      <PopoverContent\n        className='bg-[#000] text-white text-[17.6px] leading-[1.45] w-auto max-w-[300px]'\n        side='top'\n      >\n        <MDWithAccordion openFirst={openFirst}>{tooltipData}</MDWithAccordion>\n      </PopoverContent>\n    </Popover>\n  );\n};\n","import * as React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { ChevronDownIcon, CheckIcon, XIcon } from 'lucide-react';\nimport { PopoverTooltip } from '../PopoverTooltip/PopoverTooltip';\nimport { cn } from '../../utils/cn';\nimport { ISingleSelectOption } from '../../../features/MultiProduct/model/types';\n\ninterface SingleSelectProps {\n  values: ISingleSelectOption[];\n  value: string | null;\n  onValueChange: (value: string | null) => void;\n  placeholder?: string;\n  title?: string;\n  className?: string;\n  dropdownWidth?: string;\n  align?: 'start' | 'center' | 'end';\n  showClear?: boolean;\n  getTooltipByMaterialAndSection?: (material: string, section: string) => any;\n  sectionName?: string;\n}\n\nconst SingleSelect = React.forwardRef<\n  React.ElementRef<typeof PopoverPrimitive.Trigger>,\n  SingleSelectProps\n>(\n  (\n    {\n      values: options,\n      value,\n      onValueChange,\n      placeholder = 'Sort by',\n      title,\n      className,\n      dropdownWidth,\n      align = 'start',\n      showClear = false,\n      getTooltipByMaterialAndSection,\n      sectionName,\n    },\n    ref,\n  ) => {\n    const [isOpen, setIsOpen] = React.useState(false);\n    const popoverContentRef = React.useRef<HTMLDivElement>(null);\n\n    React.useEffect(() => {\n      if (!isOpen) return;\n\n      const handleScroll = (event: Event) => {\n        const target = event.target as Element;\n        const el = popoverContentRef.current;\n        if (el && (el.contains(target) || target === el)) return;\n        setIsOpen(false);\n      };\n      const handleEscape = (e: KeyboardEvent) =>\n        e.key === 'Escape' && setIsOpen(false);\n\n      window.addEventListener('scroll', handleScroll, true);\n      window.addEventListener('resize', handleScroll);\n      document.addEventListener('keydown', handleEscape);\n      return () => {\n        window.removeEventListener('scroll', handleScroll, true);\n        window.removeEventListener('resize', handleScroll);\n        document.removeEventListener('keydown', handleEscape);\n      };\n    }, [isOpen]);\n\n    const selected = value ? options.find((o) => o.value === value) : undefined;\n\n    const handleSelect = (v: string) => {\n      onValueChange(v);\n      setIsOpen(false);\n    };\n\n    const handleClear = () => onValueChange(null);\n\n    return (\n      <PopoverPrimitive.Root open={isOpen} onOpenChange={setIsOpen}>\n        <PopoverPrimitive.Trigger\n          ref={ref}\n          aria-haspopup='listbox'\n          aria-expanded={isOpen}\n          className={cn(\n            'inline-flex flex-row items-center justify-between gap-[8px] rounded-full bg-[var(--label-bg, #f5f5f5)] ' +\n              'px-[8px] py-[8px] text-[12px] font-medium h-[36px] text-black' +\n              'border border-transparent hover:bg-gray-100 ' +\n              'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--main-accent-color)]' +\n              'sm:w-[102px]',\n            className,\n          )}\n        >\n          <span\n            className={cn(\n              !selected && 'text-[12px]  text-gray-700 ms:text-[14px]',\n            )}\n          >\n            {selected?.label ?? placeholder}\n          </span>\n          <ChevronDownIcon\n            className={cn(\n              'h-4 w-[16px] transition-transform',\n              isOpen && 'rotate-180',\n            )}\n          />\n        </PopoverPrimitive.Trigger>\n\n        <PopoverPrimitive.Content\n          ref={popoverContentRef}\n          align={align}\n          sideOffset={6}\n          className={cn(\n            // rounded “card” with header\n            'bg-white border border-gray-200 rounded-xl shadow-lg z-50 ' +\n              'max-h-80 overflow-y-auto p-0',\n            dropdownWidth\n              ? dropdownWidth\n              : 'w-[var(--radix-popover-trigger-width)]',\n          )}\n          style={{\n            WebkitOverflowScrolling: 'touch',\n            overscrollBehavior: 'contain',\n          }}\n          onTouchStart={(e) => e.stopPropagation()}\n          onTouchMove={(e) => e.stopPropagation()}\n          onWheel={(e) => e.stopPropagation()}\n        >\n          {(title ?? placeholder) && (\n            <div className='px-4 pt-3 pb-2 text-[16px] font-regular'>\n              {title ?? placeholder}\n            </div>\n          )}\n\n          {showClear && value !== null && (\n            <div className='px-4 py-2 border-b'>\n              <button\n                onClick={handleClear}\n                className='inline-flex flex-row items-center gap-[4px] text-[15.2px] text-black hover:text-[var(--main-accent-color)] transition-colors'\n              >\n                <XIcon className='h-3.5 w-[12px].5' />\n                Clear\n              </button>\n            </div>\n          )}\n\n          <div\n            role='listbox'\n            aria-activedescendant={\n              selected ? `option-${selected.value}` : undefined\n            }\n            className='py-1'\n          >\n            {options.map((opt) => {\n              const isSelected = value === opt.value;\n              return (\n                <div\n                  id={`option-${opt.value}`}\n                  key={opt.value}\n                  role='option'\n                  aria-selected={isSelected}\n                  tabIndex={0}\n                  className={cn(\n                    'flex flex-row items-start justify-between gap-[8px] px-4 py-2 cursor-pointer',\n                    'hover:bg-gray-50 focus:bg-gray-50 focus:outline-none',\n                  )}\n                  onClick={() => handleSelect(opt.value)}\n                  onKeyDown={(e) => {\n                    if (e.key === 'Enter' || e.key === ' ') {\n                      e.preventDefault();\n                      handleSelect(opt.value);\n                    }\n                  }}\n                >\n                  <div className='flex flex-row items-center gap-[8px]'>\n                    <span className='text-[16.8px]'>{opt.label}</span>\n                    {(() => {\n                      if (!getTooltipByMaterialAndSection || !sectionName)\n                        return null;\n                      const tooltipData = getTooltipByMaterialAndSection(\n                        opt.value,\n                        sectionName,\n                      );\n                      return tooltipData?.Description ? (\n                        <PopoverTooltip tooltipData={tooltipData.Description} />\n                      ) : null;\n                    })()}\n                  </div>\n\n                  {isSelected ? <CheckIcon className='h-4 w-[16px]' /> : null}\n                </div>\n              );\n            })}\n          </div>\n        </PopoverPrimitive.Content>\n      </PopoverPrimitive.Root>\n    );\n  },\n);\n\nSingleSelect.displayName = 'SingleSelect';\n\nexport { SingleSelect };\nexport type { SingleSelectProps };\n","import React from 'react';\n\ninterface ILoaderProps {\n  size?: number | string;\n  trackClassName?: string;\n  accentClassName?: string;\n  className?: string;\n  isOverlay?: boolean; // <-- NEW\n}\n\nexport const Loader: React.FC<ILoaderProps> = ({\n  size = 80,\n  trackClassName = 'text-white',\n  accentClassName = 'text-amber-700',\n  className = '',\n  isOverlay = true,\n}) => {\n  return (\n    <div\n      className={\n        isOverlay\n          ? 'absolute inset-0 flex flex-row items-center justify-center backdrop-blur bg-black/30 z-150'\n          : 'inline-flex flex-row items-center justify-center'\n      }\n    >\n      <span\n        role='status'\n        aria-label='Loading'\n        className={className + ' absolute top-[20rem]'}\n        style={{ width: size, height: size }}\n      >\n        <svg\n          viewBox='0 0 80 80'\n          className='animate-spin'\n          width='100%'\n          height='100%'\n          xmlns='http://www.w3.org/2000/svg'\n        >\n          <path\n            d='M40.0003 6.66675V20.0001M54.0003 26.0001L63.667 16.3334M60.0003 40.0001H73.3337M54.0003 54.0001L63.667 63.6667M40.0003 60.0001V73.3334M16.3337 63.6667L26.0003 54.0001M6.66699 40.0001H20.0003M16.3337 16.3334L26.0003 26.0001'\n            stroke='currentColor'\n            className={trackClassName}\n            strokeWidth={4}\n            strokeLinecap='round'\n            strokeLinejoin='round'\n          />\n\n          <path\n            d='M54 25.9999L63.6667 16.3333'\n            stroke='currentColor'\n            className={accentClassName}\n            strokeWidth={4}\n            strokeLinecap='round'\n            strokeLinejoin='round'\n          />\n        </svg>\n\n        <span className='sr-only'>Loading…</span>\n      </span>\n    </div>\n  );\n};\n","import React, {\n  ReactNode,\n  useEffect,\n  useLayoutEffect,\n  useRef,\n  useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\ntype HintProps = {\n  open: boolean;\n  target: HTMLElement | null;\n  children: ReactNode;\n  offset?: number;\n  maxWidthPx?: number;\n  forceOverflowVisible?: boolean;\n};\n\n/**\n * Hint (Tooltip-like) component displayed in a portal above all UI layers.\n *\n * The component positions itself near the target element, supports dynamic\n * repositioning on scroll/resize, and ensures the target element can\n * overflow visibly when required. Includes an arrow that automatically aligns\n * with the target.\n *\n * The tooltip uses `useLayoutEffect` to measure its size before final placement\n * to avoid flickering or incorrect positioning.\n *\n * @component\n *\n * @param {boolean} open\n *  Controls visibility of the hint. When `false`, nothing is rendered.\n *\n * @param {HTMLElement | null} target\n *  The DOM element to which the hint is anchored. Required when open.\n *\n * @param {ReactNode} children\n *  The content of the hint bubble.\n *\n * @param {number} [offset=12]\n *  Vertical distance between the bubble and the target element.\n *\n * @param {number} [maxWidthPx=420]\n *  Maximum width of the bubble in pixels before wrapping text.\n *  The component also ensures the bubble fits inside the viewport.\n *\n * @param {boolean} [forceOverflowVisible=true]\n *  When `true`, temporarily forces the target element's overflow to be `visible`\n *  so that the hint can appear outside its bounds, improving usability inside\n *  clipped containers.\n *\n * @description\n * - On mount, optionally modifies the target element's `position` and `overflow`\n *   styles to allow the bubble to display outside its bounding box.\n * - Uses a combination of `useEffect`, `useLayoutEffect`, `ResizeObserver`, and\n *   scroll/resize listeners to recalculate position whenever layout changes.\n * - The bubble is rendered via `createPortal` into `document.body`\n *   to escape stacking contexts.\n *\n * @example\n * ```tsx\n * <Hint open={isHovered} target={ref.current}>\n *   Some details about this item\n * </Hint>\n * ```\n */\n\nexport const Hint: React.FC<HintProps> = ({\n  open,\n  target,\n  children,\n  offset = 12,\n  maxWidthPx = 420,\n  forceOverflowVisible = true,\n}) => {\n  const bubbleRef = useRef<HTMLDivElement | null>(null);\n  const [pos, setPos] = useState<{\n    top: number;\n    left: number;\n    arrowLeft: number;\n  }>({\n    top: 0,\n    left: 0,\n    arrowLeft: 16,\n  });\n\n  useEffect(() => {\n    if (!open || !target || !forceOverflowVisible) return;\n    const originalPosition = target.style.position;\n    const computedPos = getComputedStyle(target).position;\n    if (computedPos === 'static') target.style.position = 'relative';\n    const originalOverflow = target.style.overflow;\n    target.style.overflow = 'visible';\n    return () => {\n      target.style.position = originalPosition;\n      target.style.overflow = originalOverflow;\n    };\n  }, [open, target, forceOverflowVisible]);\n\n  useLayoutEffect(() => {\n    if (!open || !target) return;\n\n    const arrow = 10;\n    const vpPad = 8;\n\n    const measureAndPlace = () => {\n      const el = bubbleRef.current;\n      if (!el) return;\n\n      const prev = {\n        vis: el.style.visibility,\n        top: el.style.top,\n        left: el.style.left,\n        maxW: el.style.maxWidth,\n        transform: el.style.transform,\n      };\n      el.style.visibility = 'hidden';\n      el.style.top = '0px';\n      el.style.left = '0px';\n      el.style.transform = 'none';\n      el.style.maxWidth = `min(${maxWidthPx}px, calc(100vw - ${vpPad * 2}px))`;\n\n      const bRect = el.getBoundingClientRect();\n      const bw = bRect.width;\n      const bh = bRect.height;\n      const tRect = target.getBoundingClientRect();\n\n      const desiredLeft = tRect.left;\n      const left = Math.max(\n        vpPad,\n        Math.min(desiredLeft, window.innerWidth - vpPad - bw),\n      );\n\n      const top = Math.max(vpPad, tRect.top - (bh + offset + arrow));\n\n      const desiredArrowLeft = desiredLeft - left + 16;\n      const arrowLeft = Math.max(8, Math.min(desiredArrowLeft, bw - 8));\n\n      el.style.visibility = prev.vis;\n      el.style.top = prev.top;\n      el.style.left = prev.left;\n      el.style.maxWidth = prev.maxW;\n      el.style.transform = prev.transform;\n\n      setPos({ top, left, arrowLeft });\n    };\n\n    // initial + reactive\n    measureAndPlace();\n    const onScroll = () => measureAndPlace();\n    const onResize = () => measureAndPlace();\n    window.addEventListener('scroll', onScroll, { passive: true });\n    window.addEventListener('resize', onResize);\n    const ro = new ResizeObserver(() => measureAndPlace());\n    ro.observe(target);\n\n    return () => {\n      window.removeEventListener('scroll', onScroll);\n      window.removeEventListener('resize', onResize);\n      ro.disconnect();\n    };\n  }, [open, target, offset, maxWidthPx]);\n\n  if (!open || !target) return null;\n\n  return createPortal(\n    <div className='fixed inset-0 z-[9999999999] pointer-events-none'>\n      <div\n        ref={bubbleRef}\n        role='tooltip'\n        className='\n          absolute\n          rounded-2xl\n          text-white text-[14px] leading-6 font-medium\n          pointer-events-auto\n        '\n        style={{\n          top: pos.top,\n          left: pos.left,\n          maxWidth: `min(${maxWidthPx}px, calc(100vw - 16px))`,\n          backgroundColor: 'rgba(40,40,40,0.8)',\n        }}\n      >\n        <div className='px-4 py-3'>{children}</div>\n\n        <span\n          className='\n            absolute -bottom-[10px] h-0 w-0\n            border-l-[10px] border-l-transparent\n            border-r-[10px] border-r-transparent\n            border-t-[10px]\n          '\n          style={{\n            left: pos.arrowLeft,\n            borderTopColor: 'rgba(40,40,40,0.8)',\n          }}\n        />\n      </div>\n    </div>,\n    document.querySelector('#root-container')!,\n  );\n};\n","import React, { useState } from 'react';\nimport { Hint } from '../../../../shared/ui/Hint/Hint';\nimport { HexGridZoom } from '../../../swatches/ui/HexGridZoom/HexGridZoom';\nimport { ImageGridZoom } from '../../../swatches/ui/ImageGridZoom/ImageGridZoom';\nimport { CloseIconSVG } from '../../../../app/assets/svg/CloseIconSVG';\nimport { AttributeHelper } from '../../../swatches/lib/AttributeHelper';\nimport { ISwatchSelectedMaterial } from '../../model/types';\n\ninterface ISwatchesListItemProps {\n  val: ISwatchSelectedMaterial;\n  onDelete: (arg: ISwatchSelectedMaterial) => void;\n}\n\n/**\n * Renders a selected swatch item inside the list of chosen materials.\n *\n * The component shows the material preview (image or HEX grid), displays a\n * delete button, and on hover opens a `Hint` tooltip with detailed material\n * information (material name, parent category, product name).\n *\n * Hover logic:\n * - When the user hovers over the swatch, it captures the hovered element,\n *   prepares the tooltip text, and opens the `Hint` component.\n * - The tooltip closes when the mouse leaves the item.\n *\n * Delete logic:\n * - Clicking the close icon triggers `onDelete` with the full swatch object.\n * - The click event is stopped from bubbling so that it does not interfere\n *   with parent click handlers.\n *\n * Accessibility:\n * - The swatch container is focusable (`tabIndex={0}`) for keyboard navigation.\n * - Enter/Space keys are prevented to avoid unintended actions.\n * - ARIA label describes the content for screen readers.\n *\n * @component\n *\n * @param {ISwatchSelectedMaterial} val\n *  The selected material object containing metadata, image/hex info,\n *  and product/category names.\n *\n * @param {(arg: ISwatchSelectedMaterial) => void} onDelete\n *  Callback triggered when the user removes the swatch from the list.\n *\n * @returns {JSX.Element}\n */\n\nconst SwatchListItem: React.FC<ISwatchesListItemProps> = ({\n  val,\n  onDelete,\n}) => {\n  const [hoveredEl, setHoveredEl] = useState<HTMLElement | null>(null);\n  const [isOpen, setIsOpen] = useState(false);\n  const [text, setText] = useState({\n    materialName: '',\n    parentName: '',\n    productName: '',\n  });\n  const meta = val.metadata;\n\n  const handleDeleteClick = (e: React.MouseEvent<HTMLDivElement>) => {\n    e.stopPropagation();\n    onDelete(val);\n  };\n\n  return (\n    <>\n      <div\n        tabIndex={0}\n        onKeyDown={(e) => {\n          if (e.key === 'Enter' || e.key === ' ') {\n            e.preventDefault();\n          }\n        }}\n        className='\n          bg-[var(--background-grey)] relative w-[40px] h-[40px] border border-solid border-[var(--border)]\n          rounded-md aspect-square overflow-hidden transition sm:w-[62px] sm:h-[62px]\n          select-none\n        '\n        aria-label={`Selected swatch ${val.name ?? val.assetId}`}\n        title='Click to remove'\n        onMouseEnter={(e) => {\n          setHoveredEl(e.currentTarget);\n          setText({\n            materialName: meta?.label || val?.name || 'empty_materialName',\n            parentName: val.parentName,\n            productName: val.productName || 'empty_product_name',\n          });\n          setIsOpen(true);\n        }}\n        onMouseLeave={() => setIsOpen(false)}\n      >\n        {AttributeHelper.getImage(val) ? (\n          <ImageGridZoom item={val} />\n        ) : (\n          <HexGridZoom item={val} />\n        )}\n\n        <div\n          className='absolute top-0 right-0 m-[2px] w-[12px] h-[12px] flex flex-row justify-center items-center text-white\n        bg-[var(--main-accent-color)] rounded-2xl border-none z-[99] sm:w-[16px] sm:h-[16px]'\n        >\n          {val.count}\n        </div>\n        <div\n          onClick={handleDeleteClick}\n          className='\n          absolute inset-0 m-auto\n          w-[12px] h-[12px]\n          flex items-center justify-center\n          bg-[var(--background-grey)]\n          rounded-full\n          z-[100] cursor-pointer\n          sm:w-[32px] sm:h-[32px]\n        '\n        >\n          <CloseIconSVG className='w-[8px] h-[8px] stroke-[var(--svg-dark)]' />\n        </div>\n      </div>\n\n      <Hint open={isOpen} target={hoveredEl} offset={8}>\n        <>\n          {text.materialName} | {text.parentName}\n        </>\n      </Hint>\n    </>\n  );\n};\n\nexport default SwatchListItem;\n","import React from 'react';\nimport { useAppDispatch, useAppSelector } from '../../../../app/store/store';\nimport { MAX_SLOTS } from '../../../../shared/constants/selectedMaterials';\nimport { AttributeValue } from '../../../swatches/model/types';\nimport {\n  IMultiCartProductItem,\n  ISwatchSelectedMaterial,\n} from '../../model/types';\nimport { setMultiCartItems } from '../../model/multiProductCartSlice';\nimport { getMultiCartItems } from '../../model/selectors';\nimport SwatchListItem from '../SwatchListItem/SwatchListItem';\nimport { useCartCount } from '../../../swatches/utils/hooks/useCartCount';\n\n/**\n * Simple placeholder tile used to visually represent free swatch slots.\n *\n * Renders an empty bordered square tile to fill up to `MAX_SLOTS`\n * when there are fewer selected swatches.\n */\nconst MockTile: React.FC = () => (\n  <div\n    className={[\n      'relative w-[40px] h-[40px] rounded-md aspect-square overflow-hidden',\n      'border border-solid border-[var(--border)] bg-[var(--sidebar-b)] sm:w-[62px] sm:h-[62px] lg:w-[64px] lg:h-[64px]',\n    ].join(' ')}\n    aria-hidden\n  />\n);\n\ninterface ISwatchesListProps {\n  /**\n   * Optional wrapper classes for the outer container\n   * (padding, border, etc. – Tailwind / className string).\n   */\n  containerStyles?: string;\n\n  /**\n   * List of currently selected swatch materials across products.\n   * Used to render the visual list and compute remaining free slots.\n   */\n  selectedMaterials: ISwatchSelectedMaterial[];\n}\n\n/**\n * Renders the \"Swatches list\" section for the multi-product cart.\n *\n * Features:\n * - Displays all selected swatches as tiles using `SwatchListItem`.\n * - Allows removing a swatch across all products via `onDelete`.\n * - Shows the current count and the `MAX_SLOTS` limit (with \"Free\" label).\n * - Fills remaining slots with placeholder tiles (`MockTile`) for a\n *   consistent grid layout.\n *\n * Removal logic:\n * - When the user deletes a swatch, finds which product currently owns it,\n *   removes that swatch from that product, and updates the multi-cart store.\n */\nexport const SwatchesMultiProductList = ({\n  selectedMaterials,\n  containerStyles = 'p-[var(--padding)] border-t border-solid border-[var(--border)] shrink-0 sm:p-[var(--sm-padding)]',\n}: ISwatchesListProps) => {\n  const dispatch = useAppDispatch();\n  const selectedProducts = useAppSelector(getMultiCartItems);\n\n  /**\n   * Handles deleting a swatch from whichever product currently contains it.\n   *\n   * Steps:\n   * 1. If there is no `selectedProduct`, exit early.\n   * 2. Build a matcher (`isSame`) based on `metadata.label` and `parentName`.\n   * 3. Find the product that owns this swatch (`productWithItem`).\n   * 4. Filter that product's items to remove the matching swatch.\n   * 5. Dispatch updated product data to the multi-cart store and\n   *    set it as the active multi-cart product.\n   *\n   * @param item Swatch to remove from the multi-cart.\n   */\n  const handleSelect = (item: ISwatchSelectedMaterial) => {\n    if (!selectedProducts.length) return;\n\n    const targetAssetId = item.productInformation?.assetId;\n\n    /**\n     * Identifies the same swatch inside product.items\n     */\n    const isSameSwatch = (i: AttributeValue) =>\n      i.parentName === item.parentName &&\n      i.metadata?.label === item.metadata?.label;\n\n    const nextSelectedProducts = selectedProducts\n      .map((product) => {\n        // Only update the product that owns this swatch\n        if (product.assetId !== targetAssetId) return product;\n\n        const nextItems = product.items.filter((i) => !isSameSwatch(i));\n\n        return { ...product, items: nextItems };\n      })\n      // Remove products that have no items left\n      .filter((product) => product.items.length > 0) as IMultiCartProductItem[];\n\n    dispatch(setMultiCartItems(nextSelectedProducts));\n  };\n\n  // Number of placeholder tiles to render so the total count always matches MAX_SLOTS\n  const mockCount = Math.max(0, MAX_SLOTS - selectedMaterials.length);\n  const cartCount = useCartCount(selectedMaterials);\n\n  return (\n    <div className={containerStyles}>\n      <div className='flex flex-row justify-between items-center mb-[12px]'>\n        <div className='relative'>\n          <div className='text-[12px]'>Swatches list</div>\n          <span className='absolute top-0 right-[-20px] font-medium text-[var(--main-accent-color)] text-[8px] leading-none'>\n            Free\n          </span>\n        </div>\n        <div className='text-[12px]'>\n          {cartCount}/{MAX_SLOTS} Selected\n        </div>\n      </div>\n\n      <div className='flex flex-row flex-wrap gap-[8px]'>\n        {selectedMaterials.map((val, index) => {\n          const meta = val.metadata;\n          return (\n            <SwatchListItem\n              key={`${meta?.label || index}/${val.parentName}`}\n              val={val}\n              onDelete={handleSelect}\n            />\n          );\n        })}\n        {Array.from({ length: mockCount }).map((_, i) => (\n          <MockTile key={`mock-${i}`} />\n        ))}\n      </div>\n    </div>\n  );\n};\n","import { useMemo } from 'react';\nimport { useAppDispatch, useAppSelector } from '../../../../app/store/store';\nimport { CustomButton } from '../../../../shared/ui/CustomButton/CustomButton';\nimport { scrollToTop } from '../../../../shared/utils/scrollToTop';\nimport { setIsOpenMultiProductCart } from '../../../swatches/model/swatchesSlice';\nimport { getMultiCartItems } from '../../model/selectors';\nimport { SwatchesMultiProductList } from '../SwatchesMultiProductList/SwatchesMultiProductList';\nimport { ISwatchSelectedMaterial } from '../../model/types';\n\n/**\n * Container component responsible for:\n * - Displaying a combined list of swatches from all selected products\n * - Showing a preview section and an action button\n * - Handling the opening of the Multi-Product Cart modal\n *\n * It collects materials from all products, normalizes them with additional\n * context (product name), and renders them in a structured two-column layout.\n *\n * Also includes the \"Add Swatches to Cart\" button which opens the cart modal\n * only when there are selected items.\n *\n * @component\n */\nexport const SwatchContentContainer = () => {\n  const dispatch = useAppDispatch();\n  const selectedProducts = useAppSelector(getMultiCartItems);\n\n  /**\n   * Memoized list of all selected materials across all selected products.\n   *\n   * For each product, its `items` are extracted and extended with the\n   * `productName` property so the UI knows which product each swatch belongs to.\n   *\n   * This recomputes only when `selectedProducts` changes.\n   *\n   * @constant\n   * @type {ISwatchSelectedMaterial[]}\n   */\n  const allItems: ISwatchSelectedMaterial[] = useMemo(() => {\n    return selectedProducts.flatMap((p) =>\n      p.items.map((item) => ({\n        ...item,\n        productName: p.name,\n      })),\n    );\n  }, [selectedProducts]);\n\n  /**\n   * Opens the Multi-Product Cart modal if there are selected swatches.\n   *\n   * Checks whether `allItems` contains items.\n   * If so, dispatches an action that opens the modal UI.\n   *\n   * @function handleOpenMultiCart\n   * @returns {void}\n   */\n  const handleOpenMultiCart = (): void => {\n    if (allItems.length) {\n      dispatch(setIsOpenMultiProductCart(true));\n      scrollToTop();\n    }\n  };\n\n  return (\n    <div\n      className='flex flex-col border-t border-[var(--border)] shrink-0 shadow-[0_-2px_10px_rgba(40,40,40,0.10)]\n      sm:flex-row\n    '\n      id='swatch-content-container'\n    >\n      <SwatchesMultiProductList\n        selectedMaterials={allItems}\n        containerStyles='flex flex-col p-[var(--sm-padding)] shrink-0 sm:w-[50%] sm:border-r sm:border-[var(--border)]'\n      />\n\n      <div className='flex flex-row w-full p-[var(--sm-padding)] border-t border-[var(--border)] sm:border-none lg:w-[50%] sm:justify-center sm:items-center lg:justify-end lg:items-end'>\n        <div className='w-full lg:w-[50%] text-[14px]'>\n          <CustomButton onClick={handleOpenMultiCart}>\n            ADD SWATCHES TO CART\n          </CustomButton>\n        </div>\n      </div>\n    </div>\n  );\n};\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { SearchIconSVG } from '../../../../app/assets/svg/SearchIconSVG';\nimport { useAppDispatch, useAppSelector } from '../../../../app/store/store';\nimport { ProductListItem } from '../ProductListItem/ProductListItem';\nimport { MultiProductCartService } from '../../lib/MultiProductCartServices';\nimport { Slider } from '../../../../shared/ui/Slider/Slider';\nimport type {\n  IProductCart,\n  ISingleSelectOption,\n  ISliderItem,\n} from '../../model/types';\nimport { MOCK_ALL_CATEGORY_SLIDER_ITEM } from '../../utils/constants';\nimport { SingleSelect } from '../../../../shared/ui/SingleSelect/SingleSelect';\nimport { getProductListThunk } from '../../model/thunk';\nimport {\n  getIsLoadingProductList,\n  getMultiCartItems,\n  getProductLIst,\n} from '../../model/selectors';\nimport { Loader } from '../../../../shared/ui/Loader/Loader';\nimport { getIsLoadingSelectedProduct } from '../../../swatches/model/selectors';\nimport { SwatchContentContainer } from '../SwatchContentContainer/SwatchContentContainer';\nimport clsx from 'clsx';\n\n/**\n * Sorting options for the product list.\n */\nconst SORT_OPTIONS: ISingleSelectOption[] = [\n  { label: 'Clear All', value: '' },\n  { label: 'A-Z', value: 'asc' },\n  { label: 'Z-A', value: 'dsc' },\n];\n\n/**\n * Renders the product list with category filtering, search, and sorting.\n *\n * Features:\n * - fetches the product list on mount\n * - builds unique categories for the slider\n * - supports debounced text search\n * - supports A–Z and Z–A sorting\n * - hides the header image while the user scrolls down\n * - shows swatch cart content when products are selected\n *\n * @component\n */\nexport const ProductList = () => {\n  const dispatch = useAppDispatch();\n  const scrollRef = useRef<HTMLDivElement | null>(null);\n\n  const isLoadingProductList = useAppSelector(getIsLoadingProductList);\n  const isLoadingProduct = useAppSelector(getIsLoadingSelectedProduct);\n  const productList = useAppSelector(getProductLIst);\n  const selectedProducts = useAppSelector(getMultiCartItems);\n\n  const [activeCategory, setActiveCategory] = useState<\n    ISliderItem | IProductCart\n  >(MOCK_ALL_CATEGORY_SLIDER_ITEM);\n  const [search, setSearch] = useState('');\n  const [debouncedSearch, setDebouncedSearch] = useState('');\n  const [sortValue, setSortValue] = useState<string | null>(null);\n  const [isScrolling, setIsScrolling] = useState(false);\n\n  useEffect(() => {\n    const el = scrollRef.current;\n    if (!el) return;\n\n    const handleScroll = () => {\n      const top = el.scrollTop;\n\n      if (!isScrolling && top > 0) {\n        setIsScrolling(true);\n      }\n\n      if (top === 0 && isScrolling) {\n        setIsScrolling(false);\n      }\n    };\n\n    el.addEventListener('scroll', handleScroll);\n    return () => el.removeEventListener('scroll', handleScroll);\n  }, [isScrolling]);\n\n  useEffect(() => {\n    const id = setTimeout(() => {\n      setDebouncedSearch(search.trim().toLowerCase());\n    }, 300);\n\n    return () => clearTimeout(id);\n  }, [search]);\n\n  useEffect(() => {\n    dispatch(getProductListThunk());\n  }, [dispatch]);\n\n  /**\n   * Calculates the total number of selected materials\n   * across all products in the cart.\n   *\n   * @returns {number} Total count of all items.\n   */\n  const totalItemsLength = useMemo(() => {\n    return selectedProducts.reduce(\n      (sum, product) => sum + (product.items?.length ?? 0),\n      0,\n    );\n  }, [selectedProducts]);\n\n  /**\n   * Unique category list used by the category slider.\n   */\n  const uniqueCategories: ISliderItem[] = useMemo(() => {\n    return MultiProductCartService.getUniqueCategories(productList);\n  }, [productList]);\n\n  /**\n   * Normalizes string values for case-insensitive filtering.\n   *\n   * @param s - Input string\n   * @returns Normalized string\n   */\n  const norm = (s: string): string => s.toLowerCase();\n\n  /**\n   * Collator for locale-aware, case-insensitive name sorting.\n   */\n  const collator = useMemo(\n    () => new Intl.Collator(undefined, { sensitivity: 'base', numeric: false }),\n    [],\n  );\n\n  /**\n   * Product list after applying active category filter, debounced search, and sorting.\n   */\n  const filteredProductList = useMemo(() => {\n    let list = productList;\n\n    if (activeCategory?.value) {\n      const target = norm(activeCategory.value);\n      list = list.filter(\n        (product) => norm(product.collection ?? '') === target,\n      );\n    }\n\n    if (debouncedSearch) {\n      list = list.filter((product) =>\n        norm(product.name).includes(debouncedSearch),\n      );\n    }\n\n    if (sortValue === 'asc') {\n      list = [...list].sort((a, b) => collator.compare(a.name, b.name));\n    } else if (sortValue === 'dsc') {\n      list = [...list].sort((a, b) => collator.compare(b.name, a.name));\n    } else {\n      list = [...list];\n    }\n\n    return list;\n  }, [productList, activeCategory, debouncedSearch, sortValue, collator]);\n\n  return (\n    <div className='relative flex flex-col h-full min-h-0 w-full'>\n      <div className='flex-shrink-0'>\n        <div\n          className={clsx(\n            'overflow-hidden transform-gpu transition-[max-height,opacity,transform] duration-500 ease-in-out',\n            isScrolling\n              ? 'max-h-0 opacity-0 -translate-y-4 pointer-events-none'\n              : 'max-h-[200px] opacity-100 translate-y-0',\n          )}\n        >\n          <div className='h-[200px]'>\n            <img\n              src={\n                'https://hastings-questionnaie-storage.fra1.digitaloceanspaces.com/static/pic%20big%201%20(1).jpg'\n              }\n              className='object-cover w-full h-full'\n            />\n          </div>\n        </div>\n\n        <header className='flex flex-col border-b border-[var(--border)] lg:flex-row lg:justify-between'>\n          <h1 className='m-0! p-[var(--sm-padding)] text-[16px] font-medium'>\n            Swatch Store\n          </h1>\n\n          <div className='flex flex-row justify-center items-center border-t border-[var(--border)] p-[var(--sm-padding)] text-[12px] font-medium leading-[24px] lg:border-none'>\n            <span>\n              Choose 5 free swatches to curate your perfect design. Plus get{' '}\n              <a\n                href='https://www.hastingsbathcollection.com/contact/design-strategist'\n                className='text-[var(--main-accent-color)] underline'\n              >\n                free design advice\n              </a>{' '}\n              from our experts\n            </span>\n          </div>\n        </header>\n      </div>\n\n      <div className='flex flex-col flex-1 min-h-0'>\n        {(isLoadingProductList || isLoadingProduct) && <Loader />}\n\n        <div className='flex flex-row w-full items-center justify-between gap-[16px] border-b border-[var(--border)] p-[var(--sm-padding)]'>\n          <div className='flex flex-row h-[36px] w-full items-center justify-between gap-[16px] shrink-0 lg:max-w-[382px]'>\n            <div className='relative h-[36px] flex-1 min-w-0 lg:max-w-[240px]'>\n              <input\n                type='text'\n                placeholder='Search'\n                value={search}\n                onChange={(e) => setSearch(e.target.value)}\n                className='\n                  h-full w-full rounded-2xl border border-[var(--border)] bg-[var(--background)]\n                  px-4 pr-8 text-[14px] text-black placeholder-[var(--text-muted)]\n                  transition focus:border-[var(--main-accent-color)] focus:outline-none\n                '\n              />\n              <div\n                className='\n                  pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 sm:right-4\n                  [&_svg_path]:stroke-[var(--svg-dark)]\n                '\n              >\n                <SearchIconSVG width={20} height={20} />\n              </div>\n            </div>\n\n            <SingleSelect\n              title='Sort by'\n              placeholder='Sort by'\n              values={SORT_OPTIONS}\n              value={sortValue}\n              onValueChange={setSortValue}\n              className='shrink-0 w-[90px] xxs:w-[100px] bg-[var(--label-bg)] sm:py-8px sm:px-16px sm:w-[102px]'\n              dropdownWidth='w-64'\n            />\n          </div>\n\n          <Slider\n            items={uniqueCategories}\n            activeId={activeCategory.productId}\n            onSelect={(item) => setActiveCategory(item)}\n            className='hidden! lg:flex! lg:visible! flex-row! shrink-0! overflow-x-auto!'\n          />\n        </div>\n\n        <Slider\n          items={uniqueCategories}\n          activeId={activeCategory.productId}\n          onSelect={(item) => setActiveCategory(item)}\n          className='h-[64px]! p-[var(--sm-padding)]! border-b! border-[var(--border)]! lg:hidden!'\n        />\n\n        <div\n          ref={scrollRef}\n          // className='flex-1 min-h-0 overflow-y-auto overscroll-contain p-[var(--sm-padding)]' // old scroll\n          className='flex-1 min-h-0 p-[var(--sm-padding)]' // new scroll\n        >\n          <div className='mb-4'>Select Product</div>\n\n          {filteredProductList.length ? (\n            <ul\n              // className={`grid grid-cols-2 gap-[16px] sm:grid-cols-4 ${totalItemsLength && 'sm:pb-[130px]'} lg:grid-cols-6 xl:grid-cols-8 2xl:grid-cols-9`}\n              className={`grid grid-cols-2 gap-[16px] sm:grid-cols-4 lg:grid-cols-6 xl:grid-cols-8 2xl:grid-cols-9`}\n            >\n              {filteredProductList.map((productListItem: any) => (\n                <ProductListItem\n                  key={productListItem.name}\n                  productListItem={productListItem}\n                />\n              ))}\n            </ul>\n          ) : (\n            <div className='flex flex-row h-full items-center justify-center'>\n              No products were found\n            </div>\n          )}\n        </div>\n\n        {totalItemsLength ? <SwatchContentContainer /> : null}\n      </div>\n    </div>\n  );\n};\n","'use client';\n\nimport * as React from 'react';\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox';\nimport { CheckIcon } from 'lucide-react';\nimport { cn } from '../../utils/cn';\n\nfunction Checkbox({\n  className,\n  ...props\n}: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n  return (\n    <CheckboxPrimitive.Root\n      data-slot='checkbox'\n      className={cn(\n        `\n        bg-white peer border-input dark:bg-input/30\n        data-[state=checked]:bg-transparent\n        data-[state=checked]:text-black\n        focus-visible:border-ring focus-visible:ring-ring/50\n        aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40\n        aria-invalid:border-destructive\n        size-4 shrink-0 rounded-[4px] border shadow-xs\n        transition-shadow outline-none focus-visible:ring-[3px]\n        disabled:cursor-not-allowed disabled:opacity-50\n      `,\n        className,\n      )}\n      {...props}\n    >\n      <CheckboxPrimitive.Indicator\n        data-slot='checkbox-indicator'\n        className='flex flex-row items-center justify-center text-current transition-none'\n      >\n        <CheckIcon className='size-3' />\n      </CheckboxPrimitive.Indicator>\n    </CheckboxPrimitive.Root>\n  );\n}\n\nexport { Checkbox };\n","import * as React from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { ChevronDownIcon, XIcon } from 'lucide-react';\nimport { PopoverTooltip } from '../PopoverTooltip/PopoverTooltip';\nimport { cn } from '../../utils/cn';\nimport { Checkbox } from '../Checkbox/Checkbox';\n\nexport interface IMultiSelectOption {\n  value: string;\n  label: string;\n  count?: number;\n}\n\ninterface MultiSelectProps {\n  options: IMultiSelectOption[];\n  values: string[];\n  onValueChange: (values: string[]) => void;\n  placeholder?: string;\n  className?: string;\n  dropdownWidth?: string;\n  align?: 'start' | 'center' | 'end';\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  getTooltipByMaterialAndSection?: (material: string, section: string) => any;\n  sectionName?: string;\n}\n\nconst MultiSelect = React.forwardRef<\n  React.ElementRef<typeof PopoverPrimitive.Trigger>,\n  MultiSelectProps\n>(\n  (\n    {\n      options,\n      values,\n      onValueChange,\n      placeholder = 'Select options...',\n      className = 'w-full min-w-[80px] 2xs:min-w-[100px] xs:min-w-[110px]  sm:max-w-[auto] sm:min-w-[130px] lg:min-w-[160px]',\n      dropdownWidth,\n      align = 'start',\n      getTooltipByMaterialAndSection,\n      sectionName,\n    },\n    ref,\n  ) => {\n    const [isOpen, setIsOpen] = React.useState(false);\n    const popoverContentRef = React.useRef<HTMLDivElement>(null);\n\n    // Close popover on scroll (but not when scrolling inside the popover)\n    React.useEffect(() => {\n      if (!isOpen) return;\n\n      const handleScroll = (event: Event) => {\n        // Check if the scroll event is happening inside the popover content\n        const target = event.target as Element;\n        const popoverContent = popoverContentRef.current;\n\n        // If the scroll is happening inside the popover content, don't close\n        if (\n          popoverContent &&\n          (popoverContent.contains(target) || target === popoverContent)\n        ) {\n          return;\n        }\n\n        setIsOpen(false);\n      };\n\n      const handleEscape = (event: KeyboardEvent) => {\n        if (event.key === 'Escape') {\n          setIsOpen(false);\n        }\n      };\n\n      // Add scroll listeners to window and all scrollable parents\n      window.addEventListener('scroll', handleScroll, true);\n      window.addEventListener('resize', handleScroll);\n      document.addEventListener('keydown', handleEscape);\n\n      return () => {\n        window.removeEventListener('scroll', handleScroll, true);\n        window.removeEventListener('resize', handleScroll);\n        document.removeEventListener('keydown', handleEscape);\n      };\n    }, [isOpen]);\n\n    const handleSelectOption = (optionValue: string, checked: boolean) => {\n      if (checked) {\n        onValueChange([...values, optionValue]);\n      } else {\n        onValueChange(values.filter((value) => value !== optionValue));\n      }\n    };\n\n    const handleClearAll = () => {\n      onValueChange([]);\n    };\n\n    const selectedCount = values.length;\n    const displayContent =\n      selectedCount === 0 ? (\n        placeholder\n      ) : selectedCount === 1 ? (\n        options.find((opt) => opt.value === values[0])?.label ||\n        `${placeholder} selected`\n      ) : (\n        <div className='flex flex-row items-center w-full'>\n          <span className='truncate mr-1'>{placeholder}</span>\n\n          <span\n            className='\n              flex-none flex flex-row justify-center items-center\n              w-[20px] h-[20px] rounded-full\n              bg-[var(--main-accent-color)] text-white\n              text-[16px] leading-none\n              select-none pointer-events-none\n              overflow-hidden\n            '\n          >\n            {selectedCount}\n          </span>\n        </div>\n      );\n\n    if (!options.length) return;\n\n    return (\n      <PopoverPrimitive.Root open={isOpen} onOpenChange={setIsOpen}>\n        <PopoverPrimitive.Trigger\n          ref={ref}\n          className={cn(\n            'flex flex-row items-center justify-between rounded-full border border-[var(--main-accent-color)] px-2 sm:px-4 py-2 bg-white cursor-pointer hover:bg-gray-50 data-[state=open]:border-primary hover:border-primary focus:border-primary  min-h-9',\n            className,\n          )}\n        >\n          <div className='w-full text-[12px] truncate text-left leading-[20px] sm:text-[14px]'>\n            {displayContent}\n          </div>\n          <ChevronDownIcon\n            className={cn(\n              'h-4 w-[16px] transition-transform',\n              isOpen && 'rotate-180',\n            )}\n          />\n        </PopoverPrimitive.Trigger>\n\n        <PopoverPrimitive.Content\n          ref={popoverContentRef}\n          className={cn(\n            'bg-white border rounded-lg shadow-lg z-50 max-h-75 text-[14px] overflow-y-auto overscroll-behavior-y-contain touch-pan-y p-2',\n            dropdownWidth\n              ? dropdownWidth\n              : 'w-[var(--radix-popover-trigger-width)]',\n          )}\n          align={align}\n          sideOffset={4}\n          style={{\n            WebkitOverflowScrolling: 'touch',\n            overscrollBehavior: 'contain',\n          }}\n          onTouchStart={(e) => {\n            e.stopPropagation();\n          }}\n          onTouchMove={(e) => {\n            e.stopPropagation();\n          }}\n          onWheel={(e) => {\n            e.stopPropagation();\n          }}\n        >\n          {selectedCount > 0 && (\n            <div className='flex flex-row gap-[8px] items-center justify-between px-2 py-1 mb-2 border-b'>\n              <button\n                onClick={handleClearAll}\n                className='text-[14px] text-black hover:text-primary transition-color cursor-pointer duration-200 flex flex-row items-center gap-[4px]'\n              >\n                <XIcon className='h-3 w-[12px]' />\n                Clear all\n              </button>\n            </div>\n          )}\n\n          <div className='flex flex-col gap-[4px]'>\n            {options.map((option) => {\n              const isChecked = values.includes(option.value);\n              return (\n                <div\n                  key={option.value}\n                  className='flex flex-row items-start gap-[8px] px-2 py-1 hover:bg-gray-50 rounded transition-background duration-300 cursor-pointer'\n                  onClick={() => handleSelectOption(option.value, !isChecked)}\n                >\n                  <Checkbox\n                    checked={isChecked}\n                    className='size-6'\n                    onCheckedChange={(checked: boolean) =>\n                      handleSelectOption(option.value, checked as boolean)\n                    }\n                  />\n                  <div className='flex-1 flex flex-row items-center justify-between'>\n                    <div className='flex flex-row items-center gap-[8px]'>\n                      <span className='text-[14px]'>{option.label}</span>\n                      {(() => {\n                        if (!getTooltipByMaterialAndSection || !sectionName)\n                          return null;\n\n                        const tooltipData = getTooltipByMaterialAndSection(\n                          option.value,\n                          sectionName,\n                        );\n                        return tooltipData && tooltipData.Description ? (\n                          <PopoverTooltip\n                            tooltipData={tooltipData?.Description}\n                          />\n                        ) : null;\n                      })()}\n                    </div>\n                    {option.count !== undefined && (\n                      <span className='text-[14px] text-gray-800 bg-gray-100 px-2 py-0.5 ml-2 rounded-full whitespace-nowrap'>\n                        {option.count}\n                      </span>\n                    )}\n                  </div>\n                </div>\n              );\n            })}\n          </div>\n        </PopoverPrimitive.Content>\n      </PopoverPrimitive.Root>\n    );\n  },\n);\n\nMultiSelect.displayName = 'MultiSelect';\n\nexport { MultiSelect };\nexport type { MultiSelectProps };\n","import { useEffect, useState } from 'react';\nimport { useAppDispatch, useAppSelector } from '../../../../app/store/store';\nimport {\n  MultiSelect,\n  type IMultiSelectOption,\n} from '../../../../shared/ui/MultiSelect/MultiSelect';\nimport {\n  getMaterialSelectStateFilters,\n  getProductElementOptions,\n} from '../../model/selectors';\nimport { uniqueList } from '../../../../shared/utils/uniqueList';\nimport { setMaterialSelect, setPanelFilter } from '../../model/swatchesSlice';\nimport { SwatchesServices } from '../../lib/SwatchesServices';\n\n/**\n * Props for {@link ProductElement}.\n */\ninterface IProductElementProps {\n  /**\n   * ClassName string applied to the outer container.\n   */\n  containerStyles: string;\n\n  /**\n   * ClassName string applied to the {@link MultiSelect} component.\n   */\n  selectStyles: string;\n}\n\n/**\n * Renders a product element filter based on a multi-select control.\n *\n * Builds selectable options from `allProductElementOptions` and\n * applies filtering logic that:\n * - updates selected product element values\n * - remaps and prunes related filters based on available counts\n * - updates the panel attributes list according to selection\n *\n * @component\n *\n * @param props - {@link IProductElementProps}\n */\nexport const ProductElement = ({\n  containerStyles,\n  selectStyles,\n}: IProductElementProps) => {\n  const dispatch = useAppDispatch();\n  const allProductElementOptions = useAppSelector(getProductElementOptions);\n  const filters = useAppSelector(getMaterialSelectStateFilters);\n\n  const [productOptions, setProductOptions] = useState<IMultiSelectOption[]>(\n    [],\n  );\n  const [productValues, setProductValues] = useState<string[]>([]);\n\n  useEffect(() => {\n    if (!allProductElementOptions?.length) return;\n\n    const formatProductData = allProductElementOptions.map((item) => {\n      if (item.metadata) {\n        const { Name, Label } = item.metadata || {};\n        return { value: Name, label: Label, id: Name };\n      }\n\n      const { label, value } = item || {};\n      return { value, label, id: value };\n    });\n\n    setProductOptions(formatProductData);\n  }, [allProductElementOptions]);\n\n  /**\n   * Handles changes to the product element filter selection.\n   *\n   * Updates the selected values, filters available attributes for the panel,\n   * and recalculates related filter options to keep only valid selections.\n   *\n   * @param _ - Filter name (currently unused)\n   * @param values - Selected values from the multi-select\n   */\n  const handleFilterChange = (_: string, values: string[]) => {\n    if (values.length) {\n      const uniqueListValue = uniqueList(values);\n\n      if (uniqueListValue.length) {\n        const filteredMaterialByProduct = allProductElementOptions.filter(\n          (item) => {\n            if (item.metadata) {\n              return uniqueListValue.includes(item.metadata?.Label);\n            }\n            return uniqueListValue.includes(item.value);\n          },\n        );\n\n        setProductValues(uniqueListValue);\n\n        const mappedData = SwatchesServices.mapFiltersFromValues(\n          filteredMaterialByProduct,\n          filters,\n        );\n\n        const nonZeroCountList =\n          SwatchesServices.getPositiveSelectedFilers(mappedData);\n\n        if (nonZeroCountList.length) {\n          nonZeroCountList.forEach((listItem) => {\n            const { filterName, filterKeys } = listItem;\n            const itemsWithoutZeroCount = { filterName, values: filterKeys };\n\n            dispatch(setMaterialSelect(itemsWithoutZeroCount));\n          });\n        }\n\n        dispatch(setPanelFilter({ attributes: filteredMaterialByProduct }));\n      } else {\n        dispatch(setPanelFilter({ attributes: allProductElementOptions }));\n      }\n    } else {\n      setProductValues([]);\n      dispatch(setPanelFilter({ attributes: allProductElementOptions }));\n    }\n  };\n\n  return (\n    <div className={containerStyles}>\n      <span className='text-[14px]'>Product element</span>\n\n      <MultiSelect\n        options={productOptions}\n        values={productValues}\n        onValueChange={(values) => handleFilterChange('PanelElement', values)}\n        placeholder='All product elements'\n        className={selectStyles}\n        dropdownWidth='w-80'\n      />\n    </div>\n  );\n};\n","import { useEffect, useState } from 'react';\nimport { useAppDispatch, useAppSelector } from '../../../../app/store/store';\nimport { MultiSelect } from '../../../../shared/ui/MultiSelect/MultiSelect';\nimport {\n  getAllMaterialValues,\n  getMaterialSelectStateFilters,\n} from '../../model/selectors';\nimport { setMaterialSelect } from '../../model/swatchesSlice';\nimport type { IMaterialSelectState } from '../../model/types';\n\nexport const MaterialsFilter = () => {\n  const dispatch = useAppDispatch();\n  const filters = useAppSelector(getMaterialSelectStateFilters);\n  const allMaterialsValues = useAppSelector(getAllMaterialValues);\n  const [materialOptions, setMaterialOptions] = useState<any[]>([]);\n\n  useEffect(() => {\n    if (allMaterialsValues?.length) {\n      const finishOptions = [\n        ...new Set(\n          allMaterialsValues.map(\n            (i) => i.metadata?.Finish || i.metadata?.Material,\n          ),\n        ),\n      ]\n        .filter(Boolean)\n        .map((finish) => {\n          const count = allMaterialsValues.filter(\n            (item) =>\n              item.metadata?.Finish === finish ||\n              item.metadata?.Material === finish,\n          ).length;\n          return {\n            value: finish,\n            label: finish,\n            count: count,\n          };\n        });\n\n      if (finishOptions?.length) {\n        setMaterialOptions(finishOptions);\n      }\n    }\n  }, [allMaterialsValues]);\n\n  const handleFilterChange = (\n    filterType: keyof IMaterialSelectState,\n    values: string[],\n  ) => {\n    dispatch(setMaterialSelect({ filterName: filterType, values }));\n  };\n\n  return (\n    <MultiSelect\n      options={materialOptions}\n      values={filters.Finish}\n      onValueChange={(values) => handleFilterChange('Finish', values)}\n      placeholder='Material'\n      dropdownWidth='w-80'\n    />\n  );\n};\n","import { useEffect, useState } from 'react';\nimport { useAppDispatch, useAppSelector } from '../../../../app/store/store';\nimport {\n  MultiSelect,\n  type IMultiSelectOption,\n} from '../../../../shared/ui/MultiSelect/MultiSelect';\nimport {\n  getAllMaterialValues,\n  getMaterialSelectStateFilters,\n} from '../../model/selectors';\nimport { setMaterialSelect } from '../../model/swatchesSlice';\nimport type { IMaterialSelectState } from '../../model/types';\n\nexport const ColorsFilter = () => {\n  const dispatch = useAppDispatch();\n  const filters = useAppSelector(getMaterialSelectStateFilters);\n  const allMaterialsValues = useAppSelector(getAllMaterialValues);\n  const [colorOptions, setColorOptions] = useState<IMultiSelectOption[]>([]);\n\n  useEffect(() => {\n    if (allMaterialsValues?.length) {\n      const colorOptions = [\n        ...new Set(\n          allMaterialsValues\n            .map((value) => value?.metadata?.Color)\n            .filter(Boolean)\n            .map((c: any) => c.split(',').map((s: string) => s.trim()))\n            .flat(),\n        ),\n      ].map((color) => {\n        const count = allMaterialsValues.filter(\n          (item) =>\n            item.metadata?.Color &&\n            item.metadata?.Color.split(',')\n              .map((s: string) => s.trim())\n              .includes(color),\n        ).length;\n\n        return {\n          value: color,\n          label: color,\n          count: count,\n        };\n      });\n\n      if (colorOptions?.length) {\n        setColorOptions(colorOptions);\n      }\n    }\n  }, [allMaterialsValues]);\n\n  const handleFilterChange = (\n    filterType: keyof IMaterialSelectState,\n    values: string[],\n  ) => {\n    dispatch(setMaterialSelect({ filterName: filterType, values }));\n  };\n\n  return (\n    <MultiSelect\n      options={colorOptions}\n      values={filters.Color}\n      onValueChange={(values) => handleFilterChange('Color', values)}\n      placeholder='Color'\n      dropdownWidth='w-80'\n    />\n  );\n};\n","import { useEffect, useState } from 'react';\nimport { useAppDispatch, useAppSelector } from '../../../../app/store/store';\nimport {\n  MultiSelect,\n  type IMultiSelectOption,\n} from '../../../../shared/ui/MultiSelect/MultiSelect';\nimport {\n  getAllMaterialValues,\n  getMaterialSelectStateFilters,\n} from '../../model/selectors';\nimport { setMaterialSelect } from '../../model/swatchesSlice';\nimport type { IMaterialSelectState } from '../../model/types';\n\nexport const LooksFilter = () => {\n  const dispatch = useAppDispatch();\n  const filters = useAppSelector(getMaterialSelectStateFilters);\n  const allMaterialsValues = useAppSelector(getAllMaterialValues);\n  const [lookOptions, setLookOptions] = useState<IMultiSelectOption[]>([]);\n\n  useEffect(() => {\n    if (allMaterialsValues?.length) {\n      const lookOptions = [\n        ...new Set(\n          allMaterialsValues\n            .map((value) => value?.metadata?.Look)\n            .filter(Boolean)\n            .map((c: any) => c.split(',').map((s: string) => s.trim()))\n            .flat(),\n        ),\n      ].map((look) => {\n        const count = allMaterialsValues.filter(\n          (item) =>\n            item.metadata?.Look &&\n            item.metadata?.Look.split(',')\n              .map((s: string) => s.trim())\n              .includes(look),\n        ).length;\n\n        return {\n          value: look,\n          label: look,\n          count: count,\n        };\n      });\n\n      if (lookOptions?.length) {\n        setLookOptions(lookOptions);\n      }\n    }\n  }, [allMaterialsValues]);\n\n  const handleFilterChange = (\n    filterType: keyof IMaterialSelectState,\n    values: string[],\n  ) => {\n    dispatch(setMaterialSelect({ filterName: filterType, values }));\n  };\n\n  return (\n    <MultiSelect\n      options={lookOptions}\n      values={filters.Look}\n      onValueChange={(values) => handleFilterChange('Look', values)}\n      placeholder='Look'\n      dropdownWidth='w-80'\n    />\n  );\n};\n","import { MaterialsFilter } from './MaterialsFilter';\nimport { ColorsFilter } from './ColorsFilter';\nimport { LooksFilter } from './LooksFilter';\n\nexport const Filters = () => {\n  return (\n    <div className='flex flex-row items-center gap-[16px] p-[var(--sm-padding)]'>\n      <MaterialsFilter />\n      <ColorsFilter />\n      <LooksFilter />\n    </div>\n  );\n};\n","import { ProductElement } from '../../../swatches/ui/ProductElement';\nimport { Filters } from '../../../swatches/ui/Filters';\n\nexport const FiltersSelectedProductItem = () => {\n  return (\n    <div\n      className='flex flex-col justify-between border-b border-[var(--border)]\n      sm:flex-row\n    '\n    >\n      <ProductElement\n        containerStyles='flex flex-row justify-between items-center gap-[8px] p-[var(--sm-padding)] w-full text-[12px]\n        border-b border-[var(--border)]\n        sm:max-w-[360px] sm:text-[14px] sm:border-none\n        '\n        selectStyles='min-w-[auto] max-w-[154px] sm:max-w-[auto] sm:min-w-[180px] font-normal'\n      />\n      <Filters />\n    </div>\n  );\n};\n","function memo(getDeps, fn, opts) {\n  let deps = opts.initialDeps ?? [];\n  let result;\n  function memoizedFunction() {\n    var _a, _b, _c, _d;\n    let depTime;\n    if (opts.key && ((_a = opts.debug) == null ? void 0 : _a.call(opts))) depTime = Date.now();\n    const newDeps = getDeps();\n    const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);\n    if (!depsChanged) {\n      return result;\n    }\n    deps = newDeps;\n    let resultTime;\n    if (opts.key && ((_b = opts.debug) == null ? void 0 : _b.call(opts))) resultTime = Date.now();\n    result = fn(...newDeps);\n    if (opts.key && ((_c = opts.debug) == null ? void 0 : _c.call(opts))) {\n      const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n      const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n      const resultFpsPercentage = resultEndTime / 16;\n      const pad = (str, num) => {\n        str = String(str);\n        while (str.length < num) {\n          str = \" \" + str;\n        }\n        return str;\n      };\n      console.info(\n        `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n        `\n            font-size: .6rem;\n            font-weight: bold;\n            color: hsl(${Math.max(\n          0,\n          Math.min(120 - 120 * resultFpsPercentage, 120)\n        )}deg 100% 31%);`,\n        opts == null ? void 0 : opts.key\n      );\n    }\n    (_d = opts == null ? void 0 : opts.onChange) == null ? void 0 : _d.call(opts, result);\n    return result;\n  }\n  memoizedFunction.updateDeps = (newDeps) => {\n    deps = newDeps;\n  };\n  return memoizedFunction;\n}\nfunction notUndefined(value, msg) {\n  if (value === void 0) {\n    throw new Error(`Unexpected undefined${msg ? `: ${msg}` : \"\"}`);\n  } else {\n    return value;\n  }\n}\nconst approxEqual = (a, b) => Math.abs(a - b) < 1.01;\nconst debounce = (targetWindow, fn, ms) => {\n  let timeoutId;\n  return function(...args) {\n    targetWindow.clearTimeout(timeoutId);\n    timeoutId = targetWindow.setTimeout(() => fn.apply(this, args), ms);\n  };\n};\nexport {\n  approxEqual,\n  debounce,\n  memo,\n  notUndefined\n};\n//# sourceMappingURL=utils.js.map\n","import { debounce, memo, notUndefined, approxEqual } from \"./utils.js\";\nconst getRect = (element) => {\n  const { offsetWidth, offsetHeight } = element;\n  return { width: offsetWidth, height: offsetHeight };\n};\nconst defaultKeyExtractor = (index) => index;\nconst defaultRangeExtractor = (range) => {\n  const start = Math.max(range.startIndex - range.overscan, 0);\n  const end = Math.min(range.endIndex + range.overscan, range.count - 1);\n  const arr = [];\n  for (let i = start; i <= end; i++) {\n    arr.push(i);\n  }\n  return arr;\n};\nconst observeElementRect = (instance, cb) => {\n  const element = instance.scrollElement;\n  if (!element) {\n    return;\n  }\n  const targetWindow = instance.targetWindow;\n  if (!targetWindow) {\n    return;\n  }\n  const handler = (rect) => {\n    const { width, height } = rect;\n    cb({ width: Math.round(width), height: Math.round(height) });\n  };\n  handler(getRect(element));\n  if (!targetWindow.ResizeObserver) {\n    return () => {\n    };\n  }\n  const observer = new targetWindow.ResizeObserver((entries) => {\n    const run = () => {\n      const entry = entries[0];\n      if (entry == null ? void 0 : entry.borderBoxSize) {\n        const box = entry.borderBoxSize[0];\n        if (box) {\n          handler({ width: box.inlineSize, height: box.blockSize });\n          return;\n        }\n      }\n      handler(getRect(element));\n    };\n    instance.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n  });\n  observer.observe(element, { box: \"border-box\" });\n  return () => {\n    observer.unobserve(element);\n  };\n};\nconst addEventListenerOptions = {\n  passive: true\n};\nconst observeWindowRect = (instance, cb) => {\n  const element = instance.scrollElement;\n  if (!element) {\n    return;\n  }\n  const handler = () => {\n    cb({ width: element.innerWidth, height: element.innerHeight });\n  };\n  handler();\n  element.addEventListener(\"resize\", handler, addEventListenerOptions);\n  return () => {\n    element.removeEventListener(\"resize\", handler);\n  };\n};\nconst supportsScrollend = typeof window == \"undefined\" ? true : \"onscrollend\" in window;\nconst observeElementOffset = (instance, cb) => {\n  const element = instance.scrollElement;\n  if (!element) {\n    return;\n  }\n  const targetWindow = instance.targetWindow;\n  if (!targetWindow) {\n    return;\n  }\n  let offset = 0;\n  const fallback = instance.options.useScrollendEvent && supportsScrollend ? () => void 0 : debounce(\n    targetWindow,\n    () => {\n      cb(offset, false);\n    },\n    instance.options.isScrollingResetDelay\n  );\n  const createHandler = (isScrolling) => () => {\n    const { horizontal, isRtl } = instance.options;\n    offset = horizontal ? element[\"scrollLeft\"] * (isRtl && -1 || 1) : element[\"scrollTop\"];\n    fallback();\n    cb(offset, isScrolling);\n  };\n  const handler = createHandler(true);\n  const endHandler = createHandler(false);\n  endHandler();\n  element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n  const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n  if (registerScrollendEvent) {\n    element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n  }\n  return () => {\n    element.removeEventListener(\"scroll\", handler);\n    if (registerScrollendEvent) {\n      element.removeEventListener(\"scrollend\", endHandler);\n    }\n  };\n};\nconst observeWindowOffset = (instance, cb) => {\n  const element = instance.scrollElement;\n  if (!element) {\n    return;\n  }\n  const targetWindow = instance.targetWindow;\n  if (!targetWindow) {\n    return;\n  }\n  let offset = 0;\n  const fallback = instance.options.useScrollendEvent && supportsScrollend ? () => void 0 : debounce(\n    targetWindow,\n    () => {\n      cb(offset, false);\n    },\n    instance.options.isScrollingResetDelay\n  );\n  const createHandler = (isScrolling) => () => {\n    offset = element[instance.options.horizontal ? \"scrollX\" : \"scrollY\"];\n    fallback();\n    cb(offset, isScrolling);\n  };\n  const handler = createHandler(true);\n  const endHandler = createHandler(false);\n  endHandler();\n  element.addEventListener(\"scroll\", handler, addEventListenerOptions);\n  const registerScrollendEvent = instance.options.useScrollendEvent && supportsScrollend;\n  if (registerScrollendEvent) {\n    element.addEventListener(\"scrollend\", endHandler, addEventListenerOptions);\n  }\n  return () => {\n    element.removeEventListener(\"scroll\", handler);\n    if (registerScrollendEvent) {\n      element.removeEventListener(\"scrollend\", endHandler);\n    }\n  };\n};\nconst measureElement = (element, entry, instance) => {\n  if (entry == null ? void 0 : entry.borderBoxSize) {\n    const box = entry.borderBoxSize[0];\n    if (box) {\n      const size = Math.round(\n        box[instance.options.horizontal ? \"inlineSize\" : \"blockSize\"]\n      );\n      return size;\n    }\n  }\n  return element[instance.options.horizontal ? \"offsetWidth\" : \"offsetHeight\"];\n};\nconst windowScroll = (offset, {\n  adjustments = 0,\n  behavior\n}, instance) => {\n  var _a, _b;\n  const toOffset = offset + adjustments;\n  (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n    [instance.options.horizontal ? \"left\" : \"top\"]: toOffset,\n    behavior\n  });\n};\nconst elementScroll = (offset, {\n  adjustments = 0,\n  behavior\n}, instance) => {\n  var _a, _b;\n  const toOffset = offset + adjustments;\n  (_b = (_a = instance.scrollElement) == null ? void 0 : _a.scrollTo) == null ? void 0 : _b.call(_a, {\n    [instance.options.horizontal ? \"left\" : \"top\"]: toOffset,\n    behavior\n  });\n};\nclass Virtualizer {\n  constructor(opts) {\n    this.unsubs = [];\n    this.scrollElement = null;\n    this.targetWindow = null;\n    this.isScrolling = false;\n    this.measurementsCache = [];\n    this.itemSizeCache = /* @__PURE__ */ new Map();\n    this.pendingMeasuredCacheIndexes = [];\n    this.scrollRect = null;\n    this.scrollOffset = null;\n    this.scrollDirection = null;\n    this.scrollAdjustments = 0;\n    this.elementsCache = /* @__PURE__ */ new Map();\n    this.observer = /* @__PURE__ */ (() => {\n      let _ro = null;\n      const get = () => {\n        if (_ro) {\n          return _ro;\n        }\n        if (!this.targetWindow || !this.targetWindow.ResizeObserver) {\n          return null;\n        }\n        return _ro = new this.targetWindow.ResizeObserver((entries) => {\n          entries.forEach((entry) => {\n            const run = () => {\n              this._measureElement(entry.target, entry);\n            };\n            this.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(run) : run();\n          });\n        });\n      };\n      return {\n        disconnect: () => {\n          var _a;\n          (_a = get()) == null ? void 0 : _a.disconnect();\n          _ro = null;\n        },\n        observe: (target) => {\n          var _a;\n          return (_a = get()) == null ? void 0 : _a.observe(target, { box: \"border-box\" });\n        },\n        unobserve: (target) => {\n          var _a;\n          return (_a = get()) == null ? void 0 : _a.unobserve(target);\n        }\n      };\n    })();\n    this.range = null;\n    this.setOptions = (opts2) => {\n      Object.entries(opts2).forEach(([key, value]) => {\n        if (typeof value === \"undefined\") delete opts2[key];\n      });\n      this.options = {\n        debug: false,\n        initialOffset: 0,\n        overscan: 1,\n        paddingStart: 0,\n        paddingEnd: 0,\n        scrollPaddingStart: 0,\n        scrollPaddingEnd: 0,\n        horizontal: false,\n        getItemKey: defaultKeyExtractor,\n        rangeExtractor: defaultRangeExtractor,\n        onChange: () => {\n        },\n        measureElement,\n        initialRect: { width: 0, height: 0 },\n        scrollMargin: 0,\n        gap: 0,\n        indexAttribute: \"data-index\",\n        initialMeasurementsCache: [],\n        lanes: 1,\n        isScrollingResetDelay: 150,\n        enabled: true,\n        isRtl: false,\n        useScrollendEvent: false,\n        useAnimationFrameWithResizeObserver: false,\n        ...opts2\n      };\n    };\n    this.notify = (sync) => {\n      var _a, _b;\n      (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);\n    };\n    this.maybeNotify = memo(\n      () => {\n        this.calculateRange();\n        return [\n          this.isScrolling,\n          this.range ? this.range.startIndex : null,\n          this.range ? this.range.endIndex : null\n        ];\n      },\n      (isScrolling) => {\n        this.notify(isScrolling);\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"maybeNotify\",\n        debug: () => this.options.debug,\n        initialDeps: [\n          this.isScrolling,\n          this.range ? this.range.startIndex : null,\n          this.range ? this.range.endIndex : null\n        ]\n      }\n    );\n    this.cleanup = () => {\n      this.unsubs.filter(Boolean).forEach((d) => d());\n      this.unsubs = [];\n      this.observer.disconnect();\n      this.scrollElement = null;\n      this.targetWindow = null;\n    };\n    this._didMount = () => {\n      return () => {\n        this.cleanup();\n      };\n    };\n    this._willUpdate = () => {\n      var _a;\n      const scrollElement = this.options.enabled ? this.options.getScrollElement() : null;\n      if (this.scrollElement !== scrollElement) {\n        this.cleanup();\n        if (!scrollElement) {\n          this.maybeNotify();\n          return;\n        }\n        this.scrollElement = scrollElement;\n        if (this.scrollElement && \"ownerDocument\" in this.scrollElement) {\n          this.targetWindow = this.scrollElement.ownerDocument.defaultView;\n        } else {\n          this.targetWindow = ((_a = this.scrollElement) == null ? void 0 : _a.window) ?? null;\n        }\n        this.elementsCache.forEach((cached) => {\n          this.observer.observe(cached);\n        });\n        this._scrollToOffset(this.getScrollOffset(), {\n          adjustments: void 0,\n          behavior: void 0\n        });\n        this.unsubs.push(\n          this.options.observeElementRect(this, (rect) => {\n            this.scrollRect = rect;\n            this.maybeNotify();\n          })\n        );\n        this.unsubs.push(\n          this.options.observeElementOffset(this, (offset, isScrolling) => {\n            this.scrollAdjustments = 0;\n            this.scrollDirection = isScrolling ? this.getScrollOffset() < offset ? \"forward\" : \"backward\" : null;\n            this.scrollOffset = offset;\n            this.isScrolling = isScrolling;\n            this.maybeNotify();\n          })\n        );\n      }\n    };\n    this.getSize = () => {\n      if (!this.options.enabled) {\n        this.scrollRect = null;\n        return 0;\n      }\n      this.scrollRect = this.scrollRect ?? this.options.initialRect;\n      return this.scrollRect[this.options.horizontal ? \"width\" : \"height\"];\n    };\n    this.getScrollOffset = () => {\n      if (!this.options.enabled) {\n        this.scrollOffset = null;\n        return 0;\n      }\n      this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset === \"function\" ? this.options.initialOffset() : this.options.initialOffset);\n      return this.scrollOffset;\n    };\n    this.getFurthestMeasurement = (measurements, index) => {\n      const furthestMeasurementsFound = /* @__PURE__ */ new Map();\n      const furthestMeasurements = /* @__PURE__ */ new Map();\n      for (let m = index - 1; m >= 0; m--) {\n        const measurement = measurements[m];\n        if (furthestMeasurementsFound.has(measurement.lane)) {\n          continue;\n        }\n        const previousFurthestMeasurement = furthestMeasurements.get(\n          measurement.lane\n        );\n        if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) {\n          furthestMeasurements.set(measurement.lane, measurement);\n        } else if (measurement.end < previousFurthestMeasurement.end) {\n          furthestMeasurementsFound.set(measurement.lane, true);\n        }\n        if (furthestMeasurementsFound.size === this.options.lanes) {\n          break;\n        }\n      }\n      return furthestMeasurements.size === this.options.lanes ? Array.from(furthestMeasurements.values()).sort((a, b) => {\n        if (a.end === b.end) {\n          return a.index - b.index;\n        }\n        return a.end - b.end;\n      })[0] : void 0;\n    };\n    this.getMeasurementOptions = memo(\n      () => [\n        this.options.count,\n        this.options.paddingStart,\n        this.options.scrollMargin,\n        this.options.getItemKey,\n        this.options.enabled\n      ],\n      (count, paddingStart, scrollMargin, getItemKey, enabled) => {\n        this.pendingMeasuredCacheIndexes = [];\n        return {\n          count,\n          paddingStart,\n          scrollMargin,\n          getItemKey,\n          enabled\n        };\n      },\n      {\n        key: false\n      }\n    );\n    this.getMeasurements = memo(\n      () => [this.getMeasurementOptions(), this.itemSizeCache],\n      ({ count, paddingStart, scrollMargin, getItemKey, enabled }, itemSizeCache) => {\n        if (!enabled) {\n          this.measurementsCache = [];\n          this.itemSizeCache.clear();\n          return [];\n        }\n        if (this.measurementsCache.length === 0) {\n          this.measurementsCache = this.options.initialMeasurementsCache;\n          this.measurementsCache.forEach((item) => {\n            this.itemSizeCache.set(item.key, item.size);\n          });\n        }\n        const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;\n        this.pendingMeasuredCacheIndexes = [];\n        const measurements = this.measurementsCache.slice(0, min);\n        for (let i = min; i < count; i++) {\n          const key = getItemKey(i);\n          const furthestMeasurement = this.options.lanes === 1 ? measurements[i - 1] : this.getFurthestMeasurement(measurements, i);\n          const start = furthestMeasurement ? furthestMeasurement.end + this.options.gap : paddingStart + scrollMargin;\n          const measuredSize = itemSizeCache.get(key);\n          const size = typeof measuredSize === \"number\" ? measuredSize : this.options.estimateSize(i);\n          const end = start + size;\n          const lane = furthestMeasurement ? furthestMeasurement.lane : i % this.options.lanes;\n          measurements[i] = {\n            index: i,\n            start,\n            size,\n            end,\n            key,\n            lane\n          };\n        }\n        this.measurementsCache = measurements;\n        return measurements;\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"getMeasurements\",\n        debug: () => this.options.debug\n      }\n    );\n    this.calculateRange = memo(\n      () => [\n        this.getMeasurements(),\n        this.getSize(),\n        this.getScrollOffset(),\n        this.options.lanes\n      ],\n      (measurements, outerSize, scrollOffset, lanes) => {\n        return this.range = measurements.length > 0 && outerSize > 0 ? calculateRange({\n          measurements,\n          outerSize,\n          scrollOffset,\n          lanes\n        }) : null;\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"calculateRange\",\n        debug: () => this.options.debug\n      }\n    );\n    this.getVirtualIndexes = memo(\n      () => {\n        let startIndex = null;\n        let endIndex = null;\n        const range = this.calculateRange();\n        if (range) {\n          startIndex = range.startIndex;\n          endIndex = range.endIndex;\n        }\n        this.maybeNotify.updateDeps([this.isScrolling, startIndex, endIndex]);\n        return [\n          this.options.rangeExtractor,\n          this.options.overscan,\n          this.options.count,\n          startIndex,\n          endIndex\n        ];\n      },\n      (rangeExtractor, overscan, count, startIndex, endIndex) => {\n        return startIndex === null || endIndex === null ? [] : rangeExtractor({\n          startIndex,\n          endIndex,\n          overscan,\n          count\n        });\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"getVirtualIndexes\",\n        debug: () => this.options.debug\n      }\n    );\n    this.indexFromElement = (node) => {\n      const attributeName = this.options.indexAttribute;\n      const indexStr = node.getAttribute(attributeName);\n      if (!indexStr) {\n        console.warn(\n          `Missing attribute name '${attributeName}={index}' on measured element.`\n        );\n        return -1;\n      }\n      return parseInt(indexStr, 10);\n    };\n    this._measureElement = (node, entry) => {\n      const index = this.indexFromElement(node);\n      const item = this.measurementsCache[index];\n      if (!item) {\n        return;\n      }\n      const key = item.key;\n      const prevNode = this.elementsCache.get(key);\n      if (prevNode !== node) {\n        if (prevNode) {\n          this.observer.unobserve(prevNode);\n        }\n        this.observer.observe(node);\n        this.elementsCache.set(key, node);\n      }\n      if (node.isConnected) {\n        this.resizeItem(index, this.options.measureElement(node, entry, this));\n      }\n    };\n    this.resizeItem = (index, size) => {\n      const item = this.measurementsCache[index];\n      if (!item) {\n        return;\n      }\n      const itemSize = this.itemSizeCache.get(item.key) ?? item.size;\n      const delta = size - itemSize;\n      if (delta !== 0) {\n        if (this.shouldAdjustScrollPositionOnItemSizeChange !== void 0 ? this.shouldAdjustScrollPositionOnItemSizeChange(item, delta, this) : item.start < this.getScrollOffset() + this.scrollAdjustments) {\n          if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n            console.info(\"correction\", delta);\n          }\n          this._scrollToOffset(this.getScrollOffset(), {\n            adjustments: this.scrollAdjustments += delta,\n            behavior: void 0\n          });\n        }\n        this.pendingMeasuredCacheIndexes.push(item.index);\n        this.itemSizeCache = new Map(this.itemSizeCache.set(item.key, size));\n        this.notify(false);\n      }\n    };\n    this.measureElement = (node) => {\n      if (!node) {\n        this.elementsCache.forEach((cached, key) => {\n          if (!cached.isConnected) {\n            this.observer.unobserve(cached);\n            this.elementsCache.delete(key);\n          }\n        });\n        return;\n      }\n      this._measureElement(node, void 0);\n    };\n    this.getVirtualItems = memo(\n      () => [this.getVirtualIndexes(), this.getMeasurements()],\n      (indexes, measurements) => {\n        const virtualItems = [];\n        for (let k = 0, len = indexes.length; k < len; k++) {\n          const i = indexes[k];\n          const measurement = measurements[i];\n          virtualItems.push(measurement);\n        }\n        return virtualItems;\n      },\n      {\n        key: process.env.NODE_ENV !== \"production\" && \"getVirtualItems\",\n        debug: () => this.options.debug\n      }\n    );\n    this.getVirtualItemForOffset = (offset) => {\n      const measurements = this.getMeasurements();\n      if (measurements.length === 0) {\n        return void 0;\n      }\n      return notUndefined(\n        measurements[findNearestBinarySearch(\n          0,\n          measurements.length - 1,\n          (index) => notUndefined(measurements[index]).start,\n          offset\n        )]\n      );\n    };\n    this.getOffsetForAlignment = (toOffset, align, itemSize = 0) => {\n      const size = this.getSize();\n      const scrollOffset = this.getScrollOffset();\n      if (align === \"auto\") {\n        align = toOffset >= scrollOffset + size ? \"end\" : \"start\";\n      }\n      if (align === \"center\") {\n        toOffset += (itemSize - size) / 2;\n      } else if (align === \"end\") {\n        toOffset -= size;\n      }\n      const maxOffset = this.getTotalSize() + this.options.scrollMargin - size;\n      return Math.max(Math.min(maxOffset, toOffset), 0);\n    };\n    this.getOffsetForIndex = (index, align = \"auto\") => {\n      index = Math.max(0, Math.min(index, this.options.count - 1));\n      const item = this.measurementsCache[index];\n      if (!item) {\n        return void 0;\n      }\n      const size = this.getSize();\n      const scrollOffset = this.getScrollOffset();\n      if (align === \"auto\") {\n        if (item.end >= scrollOffset + size - this.options.scrollPaddingEnd) {\n          align = \"end\";\n        } else if (item.start <= scrollOffset + this.options.scrollPaddingStart) {\n          align = \"start\";\n        } else {\n          return [scrollOffset, align];\n        }\n      }\n      const toOffset = align === \"end\" ? item.end + this.options.scrollPaddingEnd : item.start - this.options.scrollPaddingStart;\n      return [\n        this.getOffsetForAlignment(toOffset, align, item.size),\n        align\n      ];\n    };\n    this.isDynamicMode = () => this.elementsCache.size > 0;\n    this.scrollToOffset = (toOffset, { align = \"start\", behavior } = {}) => {\n      if (behavior === \"smooth\" && this.isDynamicMode()) {\n        console.warn(\n          \"The `smooth` scroll behavior is not fully supported with dynamic size.\"\n        );\n      }\n      this._scrollToOffset(this.getOffsetForAlignment(toOffset, align), {\n        adjustments: void 0,\n        behavior\n      });\n    };\n    this.scrollToIndex = (index, { align: initialAlign = \"auto\", behavior } = {}) => {\n      if (behavior === \"smooth\" && this.isDynamicMode()) {\n        console.warn(\n          \"The `smooth` scroll behavior is not fully supported with dynamic size.\"\n        );\n      }\n      index = Math.max(0, Math.min(index, this.options.count - 1));\n      let attempts = 0;\n      const maxAttempts = 10;\n      const tryScroll = (currentAlign) => {\n        if (!this.targetWindow) return;\n        const offsetInfo = this.getOffsetForIndex(index, currentAlign);\n        if (!offsetInfo) {\n          console.warn(\"Failed to get offset for index:\", index);\n          return;\n        }\n        const [offset, align] = offsetInfo;\n        this._scrollToOffset(offset, { adjustments: void 0, behavior });\n        this.targetWindow.requestAnimationFrame(() => {\n          const currentOffset = this.getScrollOffset();\n          const afterInfo = this.getOffsetForIndex(index, align);\n          if (!afterInfo) {\n            console.warn(\"Failed to get offset for index:\", index);\n            return;\n          }\n          if (!approxEqual(afterInfo[0], currentOffset)) {\n            scheduleRetry(align);\n          }\n        });\n      };\n      const scheduleRetry = (align) => {\n        if (!this.targetWindow) return;\n        attempts++;\n        if (attempts < maxAttempts) {\n          if (process.env.NODE_ENV !== \"production\" && this.options.debug) {\n            console.info(\"Schedule retry\", attempts, maxAttempts);\n          }\n          this.targetWindow.requestAnimationFrame(() => tryScroll(align));\n        } else {\n          console.warn(\n            `Failed to scroll to index ${index} after ${maxAttempts} attempts.`\n          );\n        }\n      };\n      tryScroll(initialAlign);\n    };\n    this.scrollBy = (delta, { behavior } = {}) => {\n      if (behavior === \"smooth\" && this.isDynamicMode()) {\n        console.warn(\n          \"The `smooth` scroll behavior is not fully supported with dynamic size.\"\n        );\n      }\n      this._scrollToOffset(this.getScrollOffset() + delta, {\n        adjustments: void 0,\n        behavior\n      });\n    };\n    this.getTotalSize = () => {\n      var _a;\n      const measurements = this.getMeasurements();\n      let end;\n      if (measurements.length === 0) {\n        end = this.options.paddingStart;\n      } else if (this.options.lanes === 1) {\n        end = ((_a = measurements[measurements.length - 1]) == null ? void 0 : _a.end) ?? 0;\n      } else {\n        const endByLane = Array(this.options.lanes).fill(null);\n        let endIndex = measurements.length - 1;\n        while (endIndex >= 0 && endByLane.some((val) => val === null)) {\n          const item = measurements[endIndex];\n          if (endByLane[item.lane] === null) {\n            endByLane[item.lane] = item.end;\n          }\n          endIndex--;\n        }\n        end = Math.max(...endByLane.filter((val) => val !== null));\n      }\n      return Math.max(\n        end - this.options.scrollMargin + this.options.paddingEnd,\n        0\n      );\n    };\n    this._scrollToOffset = (offset, {\n      adjustments,\n      behavior\n    }) => {\n      this.options.scrollToFn(offset, { behavior, adjustments }, this);\n    };\n    this.measure = () => {\n      this.itemSizeCache = /* @__PURE__ */ new Map();\n      this.notify(false);\n    };\n    this.setOptions(opts);\n  }\n}\nconst findNearestBinarySearch = (low, high, getCurrentValue, value) => {\n  while (low <= high) {\n    const middle = (low + high) / 2 | 0;\n    const currentValue = getCurrentValue(middle);\n    if (currentValue < value) {\n      low = middle + 1;\n    } else if (currentValue > value) {\n      high = middle - 1;\n    } else {\n      return middle;\n    }\n  }\n  if (low > 0) {\n    return low - 1;\n  } else {\n    return 0;\n  }\n};\nfunction calculateRange({\n  measurements,\n  outerSize,\n  scrollOffset,\n  lanes\n}) {\n  const lastIndex = measurements.length - 1;\n  const getOffset = (index) => measurements[index].start;\n  if (measurements.length <= lanes) {\n    return {\n      startIndex: 0,\n      endIndex: lastIndex\n    };\n  }\n  let startIndex = findNearestBinarySearch(\n    0,\n    lastIndex,\n    getOffset,\n    scrollOffset\n  );\n  let endIndex = startIndex;\n  if (lanes === 1) {\n    while (endIndex < lastIndex && measurements[endIndex].end < scrollOffset + outerSize) {\n      endIndex++;\n    }\n  } else if (lanes > 1) {\n    const endPerLane = Array(lanes).fill(0);\n    while (endIndex < lastIndex && endPerLane.some((pos) => pos < scrollOffset + outerSize)) {\n      const item = measurements[endIndex];\n      endPerLane[item.lane] = item.end;\n      endIndex++;\n    }\n    const startPerLane = Array(lanes).fill(scrollOffset + outerSize);\n    while (startIndex >= 0 && startPerLane.some((pos) => pos >= scrollOffset)) {\n      const item = measurements[startIndex];\n      startPerLane[item.lane] = item.start;\n      startIndex--;\n    }\n    startIndex = Math.max(0, startIndex - startIndex % lanes);\n    endIndex = Math.min(lastIndex, endIndex + (lanes - 1 - endIndex % lanes));\n  }\n  return { startIndex, endIndex };\n}\nexport {\n  Virtualizer,\n  approxEqual,\n  debounce,\n  defaultKeyExtractor,\n  defaultRangeExtractor,\n  elementScroll,\n  measureElement,\n  memo,\n  notUndefined,\n  observeElementOffset,\n  observeElementRect,\n  observeWindowOffset,\n  observeWindowRect,\n  windowScroll\n};\n//# sourceMappingURL=index.js.map\n","import * as React from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { Virtualizer, elementScroll, observeElementOffset, observeElementRect, windowScroll, observeWindowOffset, observeWindowRect } from \"@tanstack/virtual-core\";\nexport * from \"@tanstack/virtual-core\";\nconst useIsomorphicLayoutEffect = typeof document !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\nfunction useVirtualizerBase(options) {\n  const rerender = React.useReducer(() => ({}), {})[1];\n  const resolvedOptions = {\n    ...options,\n    onChange: (instance2, sync) => {\n      var _a;\n      if (sync) {\n        flushSync(rerender);\n      } else {\n        rerender();\n      }\n      (_a = options.onChange) == null ? void 0 : _a.call(options, instance2, sync);\n    }\n  };\n  const [instance] = React.useState(\n    () => new Virtualizer(resolvedOptions)\n  );\n  instance.setOptions(resolvedOptions);\n  useIsomorphicLayoutEffect(() => {\n    return instance._didMount();\n  }, []);\n  useIsomorphicLayoutEffect(() => {\n    return instance._willUpdate();\n  });\n  return instance;\n}\nfunction useVirtualizer(options) {\n  return useVirtualizerBase({\n    observeElementRect,\n    observeElementOffset,\n    scrollToFn: elementScroll,\n    ...options\n  });\n}\nfunction useWindowVirtualizer(options) {\n  return useVirtualizerBase({\n    getScrollElement: () => typeof document !== \"undefined\" ? window : null,\n    observeElementRect: observeWindowRect,\n    observeElementOffset: observeWindowOffset,\n    scrollToFn: windowScroll,\n    initialOffset: () => typeof document !== \"undefined\" ? window.scrollY : 0,\n    ...options\n  });\n}\nexport {\n  useVirtualizer,\n  useWindowVirtualizer\n};\n//# sourceMappingURL=index.js.map\n","import type { FC } from 'react';\nimport type { SvgIconProps } from '../../../shared/types/svg';\n\nexport const CheckMarkIconSVG: FC<SvgIconProps> = (props) => {\n  return (\n    <svg\n      width='16'\n      height='11'\n      viewBox='0 0 16 11'\n      fill='none'\n      xmlns='http://www.w3.org/2000/svg'\n      {...props}\n    >\n      <path\n        d='M14.6668 1L5.50016 10.1667L1.3335 6'\n        stroke='white'\n        strokeWidth='1.5'\n        strokeLinecap='round'\n        strokeLinejoin='round'\n      />\n    </svg>\n  );\n};\n","import { AttributeHelper } from '../../../features/swatches/lib/AttributeHelper';\nimport { ImageGridZoom } from '../../../features/swatches/ui/ImageGridZoom/ImageGridZoom';\nimport { HexGridZoom } from '../../../features/swatches/ui/HexGridZoom/HexGridZoom';\nimport type { AttributeValue } from '../../../features/swatches/model/types';\nimport { CheckMarkIconSVG } from '../../../app/assets/svg/CheckMarkIconSVG';\n\ninterface IMaterialListItemProps {\n  val: AttributeValue;\n  isSelected: boolean;\n  onClick: (item: AttributeValue) => void;\n}\n\nexport const MaterialListItem = ({\n  val,\n  isSelected,\n  onClick,\n}: IMaterialListItemProps) => {\n  const handleSelect = (item: AttributeValue) => {\n    onClick(item);\n  };\n\n  return (\n    <div className='flex flex-col gap-[8px]'>\n      <button\n        key={val.assetId}\n        onClick={() => handleSelect(val)}\n        className={`\n        relative w-full aspect-square overflow-hidden rounded\n        border transition\n        ${isSelected ? 'border-amber-700' : 'border-transparent'}\n      `}\n      >\n        <div className='absolute inset-0'>\n          {AttributeHelper.getImage(val) ? (\n            <ImageGridZoom item={val} />\n          ) : (\n            <HexGridZoom item={val} />\n          )}\n        </div>\n\n        <div\n          className={`\n          absolute top-0 right-0 m-2 h-[30px] w-[30px]\n          flex flex-row items-center justify-center rounded-2xl border-none\n          bg-[var(--background-grey)] pointer-events-none\n          ${isSelected ? 'bg-[var(--main-accent-color)]' : ''}\n        `}\n        >\n          <CheckMarkIconSVG />\n        </div>\n      </button>\n\n      <div className='mb-[12px] flex flex-col'>\n        <span className='mb-[4px] text-[14px] font-semibold leading-[16px]'>\n          {val.label || val.metadata?.label}{' '}\n        </span>\n        <span className='text-[12px] font-medium leading-[14px]'>\n          {val.parentName}{' '}\n        </span>\n      </div>\n    </div>\n  );\n};\n","import React, {\n  useCallback,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { useWindowVirtualizer } from '@tanstack/react-virtual';\nimport { useAppDispatch, useAppSelector } from '../../../../app/store/store';\nimport {\n  getAllMaterialValues,\n  getMaterialSelectStateFilters,\n  getSelectedProduct,\n} from '../../../swatches/model/selectors';\nimport { AttributeValue } from '../../../swatches/model/types';\nimport {\n  setActiveMultiCartProduct,\n  setMultiCartItems,\n} from '../../model/multiProductCartSlice';\nimport { IMultiCartProductItem, IProductListItem } from '../../model/types';\nimport { getMultiCartItems } from '../../model/selectors';\nimport { MaterialListItem as MaterialListItemBase } from '../../../../shared/ui/MaterialListItem/MaterialListItem';\nimport { SwatchLimitModal } from '../../../../shared/ui/SwatchLimitModal/SwatchLimitModal';\n\ninterface IMaterialListProps {\n  containerStyles?: string;\n  gridStyles?: string;\n  minCardWidth?: number;\n  gapPx?: number;\n  maxColumns?: number;\n  fallbackColumns?: number;\n  bottomPadPx?: number;\n}\n\nconst MaterialListItem = React.memo(MaterialListItemBase);\n\nconst toMaterialKey = (v: AttributeValue) =>\n  `${v.metadata?.label ?? ''}||${v.parentName ?? ''}`;\n\nconst toReactKey = (v: AttributeValue, index: number) =>\n  (v as any).id ??\n  `${v.metadata?.label ?? 'no-label'}|${v.parentName ?? 'no-parent'}|${v.metadata?.value ?? ''}|${index}`;\n\nexport const MaterialMultiProductList = ({\n  containerStyles = 'flex-1 min-h-0 p-[var(--sm-padding)]',\n  gridStyles = '',\n\n  minCardWidth = 180,\n  gapPx = 16,\n  maxColumns = 12,\n  fallbackColumns = 2,\n\n  bottomPadPx = 140,\n}: IMaterialListProps) => {\n  const dispatch = useAppDispatch();\n  const hostRef = useRef<HTMLDivElement | null>(null);\n\n  const allMaterialsValues = useAppSelector(getAllMaterialValues);\n  const filters = useAppSelector(getMaterialSelectStateFilters);\n  const selectedProduct = useAppSelector(getSelectedProduct);\n  const selectedProducts = useAppSelector(getMultiCartItems);\n\n  const [isShowSwatchLimit, setIsShowSwatchLImit] = useState(false);\n  const [cols, setCols] = useState<number>(fallbackColumns);\n  const [containerWidth, setContainerWidth] = useState(0);\n\n  useLayoutEffect(() => {\n    const el = hostRef.current;\n    if (!el || typeof ResizeObserver === 'undefined') return;\n\n    const ro = new ResizeObserver(() => {\n      const rect = el.getBoundingClientRect();\n      const width = rect.width;\n\n      setContainerWidth(width);\n\n      const raw = Math.max(\n        1,\n        Math.floor((width + gapPx) / (minCardWidth + gapPx)),\n      );\n      setCols(Math.min(maxColumns, raw));\n    });\n\n    ro.observe(el);\n    return () => ro.disconnect();\n  }, [gapPx, minCardWidth, maxColumns]);\n\n  useLayoutEffect(() => {\n    const el = hostRef.current;\n    if (!el || typeof ResizeObserver === 'undefined') return;\n\n    const ro = new ResizeObserver(() => {\n      const width = el.getBoundingClientRect().width;\n      const raw = Math.max(\n        1,\n        Math.floor((width + gapPx) / (minCardWidth + gapPx)),\n      );\n      setCols(Math.min(maxColumns, raw));\n    });\n\n    ro.observe(el);\n    return () => ro.disconnect();\n  }, [gapPx, minCardWidth, maxColumns]);\n\n  const estimateRowHeight = useMemo(() => {\n    if (containerWidth < 340) return 340 + gapPx;\n    if (containerWidth < 375) return 370 + gapPx;\n    if (containerWidth < 400) return 220 + gapPx;\n    if (containerWidth < 500) return 260 + gapPx;\n    if (containerWidth < 640) return 300 + gapPx;\n    if (containerWidth < 700) return 256 + gapPx;\n    if (containerWidth < 1024) return 224 + gapPx;\n    return 260 + gapPx;\n  }, [containerWidth, gapPx]);\n\n  const allItems = useMemo(\n    () => selectedProducts.flatMap((p) => p.items),\n    [selectedProducts],\n  );\n\n  const selectedKeySet = useMemo(() => {\n    const set = new Set<string>();\n    for (const it of allItems) set.add(toMaterialKey(it));\n    return set;\n  }, [allItems]);\n\n  const cartCount = useMemo(() => {\n    let sum = 0;\n    for (const p of selectedProducts)\n      for (const it of p.items) sum += it.count ?? 0;\n    return sum;\n  }, [selectedProducts]);\n\n  const filteredItems = useMemo(() => {\n    return allMaterialsValues.filter((item) => {\n      const finishOk =\n        filters.Finish.length === 0 ||\n        filters.Finish.some(\n          (finish) =>\n            item.metadata?.Finish === finish ||\n            item.metadata?.Material === finish,\n        );\n\n      const colorOk =\n        filters.Color.length === 0 ||\n        (item.metadata?.Color &&\n          filters.Color.some((selectedColor) =>\n            item.metadata?.Color?.split(',')\n              .map((s: string) => s.trim())\n              .includes(selectedColor),\n          ));\n\n      const looks = item.metadata?.Look;\n      const lookOk =\n        !filters.Look ||\n        filters.Look.length === 0 ||\n        filters.Look.some(\n          (selectedLook) => looks && looks.includes(selectedLook),\n        );\n\n      return finishOk && colorOk && lookOk;\n    });\n  }, [filters, allMaterialsValues]);\n\n  const rowCount = useMemo(\n    () => Math.ceil(filteredItems.length / cols),\n    [filteredItems.length, cols],\n  );\n\n  const rowVirtualizer = useWindowVirtualizer({\n    count: rowCount,\n    estimateSize: () => estimateRowHeight,\n    overscan: 8,\n    measureElement: (el) => el.getBoundingClientRect().height,\n  });\n\n  const virtualRows = rowVirtualizer.getVirtualItems();\n  const totalSize = rowVirtualizer.getTotalSize();\n\n  const isSameMaterial = (a: AttributeValue, b: AttributeValue) =>\n    a.metadata?.label === b.metadata?.label && a.parentName === b.parentName;\n\n  const handleSelect = useCallback(\n    (item: AttributeValue) => {\n      if (!selectedProduct) return;\n\n      const key = toMaterialKey(item);\n      const existsInCart = selectedKeySet.has(key);\n\n      if (existsInCart) {\n        const nextSelectedProducts: IMultiCartProductItem[] = [];\n        for (const p of selectedProducts) {\n          const nextItems = p.items.filter((i) => !isSameMaterial(i, item));\n          if (nextItems.length > 0)\n            nextSelectedProducts.push({ ...p, items: nextItems });\n        }\n\n        dispatch(setMultiCartItems(nextSelectedProducts));\n\n        const nextActive =\n          nextSelectedProducts.find(\n            (p) => p.assetId === selectedProduct.assetId,\n          ) ??\n          nextSelectedProducts[0] ??\n          null;\n\n        if (nextActive) dispatch(setActiveMultiCartProduct(nextActive));\n        return;\n      }\n\n      if (cartCount >= 5) {\n        setIsShowSwatchLImit(true);\n        return;\n      }\n\n      const newMaterial: AttributeValue & {\n        count: number;\n        productInformation: IProductListItem;\n      } = { ...item, productInformation: selectedProduct, count: 1 };\n\n      const nextSelectedProducts: IMultiCartProductItem[] = [];\n      let inserted = false;\n\n      for (const p of selectedProducts) {\n        if (p.assetId !== selectedProduct.assetId) {\n          nextSelectedProducts.push(p);\n          continue;\n        }\n        nextSelectedProducts.push({ ...p, items: [...p.items, newMaterial] });\n        inserted = true;\n      }\n\n      if (!inserted) {\n        nextSelectedProducts.push({\n          assetId: selectedProduct.assetId,\n          name: selectedProduct.name,\n          productInformation: selectedProduct,\n          items: [newMaterial],\n        });\n      }\n\n      dispatch(setMultiCartItems(nextSelectedProducts));\n\n      const nextActive =\n        nextSelectedProducts.find(\n          (p) => p.assetId === selectedProduct.assetId,\n        ) ?? nextSelectedProducts[0];\n\n      dispatch(setActiveMultiCartProduct(nextActive));\n    },\n    [dispatch, selectedProduct, selectedProducts, cartCount, selectedKeySet],\n  );\n\n  const gridStyle = useMemo<React.CSSProperties>(\n    () => ({\n      display: 'grid',\n      gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`,\n      gap: `${gapPx}px`,\n    }),\n    [cols, gapPx],\n  );\n  console.log('virtualRows', virtualRows);\n\n  return (\n    <div ref={hostRef} className={containerStyles}>\n      <SwatchLimitModal\n        header=\"You've reached your maximum number of swatches!\"\n        body=\"If you'd like to add another swatch please remove an existing swatch from your cart\"\n        isOpen={isShowSwatchLimit}\n        onClose={() => setIsShowSwatchLImit(false)}\n      />\n\n      <div style={{ height: totalSize + bottomPadPx, position: 'relative' }}>\n        {virtualRows.map((vr) => {\n          const rowIndex = vr.index;\n          const start = rowIndex * cols;\n          const end = Math.min(start + cols, filteredItems.length);\n          const rowItems = filteredItems.slice(start, end);\n          return (\n            <div\n              key={vr.key}\n              style={{\n                position: 'absolute',\n                top: 0,\n                left: 0,\n                width: '100%',\n                transform: `translateY(${vr.start}px)`,\n              }}\n            >\n              <div className={gridStyles} style={gridStyle}>\n                {rowItems.map((val, idx) => (\n                  <MaterialListItem\n                    key={toReactKey(val, start + idx)}\n                    val={val}\n                    isSelected={selectedKeySet.has(toMaterialKey(val))}\n                    onClick={handleSelect}\n                  />\n                ))}\n              </div>\n            </div>\n          );\n        })}\n      </div>\n    </div>\n  );\n};\n","import { useEffect } from 'react';\nimport { ArrowIconSVG } from '../../../../app/assets/svg/ArrowIconSVG';\n// import { CloseIconSVG } from '../../../../app/assets/svg/CloseIconSVG';\nimport { useAppDispatch, useAppSelector } from '../../../../app/store/store';\nimport { getSelectedProduct } from '../../../swatches/model/selectors';\nimport { scrollToTop } from '../../../../shared/utils/scrollToTop';\nimport {\n  clearAllMaterialFilters,\n  deleteSelectedProduct,\n} from '../../../swatches/model/swatchesSlice';\nimport { FiltersSelectedProductItem } from '../FiltersSelectedProductItem/FiltersSelectedProductItem';\nimport { MaterialMultiProductList } from '../MaterialMultiProductList/MaterialMultiProductList';\nimport { SwatchContentContainer } from '../SwatchContentContainer/SwatchContentContainer';\n\n// interface ISelectedProductItemProps {\n//   onSidebarToggle?: () => void;\n// }\n\nexport const SelectedProductItem = () => {\n  const dispatch = useAppDispatch();\n  const selectedProduct = useAppSelector(getSelectedProduct);\n\n  useEffect(() => {\n    return () => {\n      dispatch(clearAllMaterialFilters());\n    };\n  }, []);\n\n  const handleGoBack = () => {\n    dispatch(deleteSelectedProduct());\n    scrollToTop();\n  };\n\n  return (\n    <div className='flex flex-col h-full '>\n      <header className='flex flex-row shrink-0 items-center justify-between border-b border-[var(--border)] p-[var(--sm-padding)]'>\n        <div className='flex flex-row items-center gap-[8px]'>\n          <button\n            className='[&_svg_path]:stroke-[var(--main-accent-color)] cursor-pointer'\n            onClick={handleGoBack}\n          >\n            <ArrowIconSVG />\n          </button>\n          <h2 className='m-0! text-[16px] font-medium leading-[1.6]'>\n            {selectedProduct?.name}\n          </h2>\n        </div>\n      </header>\n      <div className='flex flex-col min-h-0 flex-1 '>\n        <div className='shrink-0'>\n          <FiltersSelectedProductItem />\n        </div>\n\n        <MaterialMultiProductList\n          containerStyles='flex-1 min-h-0 p-[var(--sm-padding)]'\n          gridStyles='w-full grid grid-cols-2 gap-[16px] sm:grid-cols-4 lg:grid-cols-5 xl:grid-cols-7 xl:pb-[130px] 2xl:grid-cols-9'\n          maxColumns={9}\n        />\n\n        <SwatchContentContainer />\n      </div>\n    </div>\n  );\n};\n","import { useAppSelector } from '../../../../app/store/store';\nimport {\n  getIsOpenMultiCart,\n  getSelectedProduct,\n} from '../../../swatches/model/selectors';\nimport { MultiProductItemCart } from '../MultiProductItemCart/MultiProductItemCart';\nimport { ProductList } from '../ProductList/ProductList';\nimport { SelectedProductItem } from '../SelectedProductItem/SelectedProductItem';\nimport { ToastContainer, Bounce } from 'react-toastify';\n\ninterface IMultiProductWrapperProps {\n  onSendData: (data: unknown) => void;\n  onToggleSidebar?: () => void;\n}\n\nexport const MultiProductWrapper = ({\n  onSendData,\n}: IMultiProductWrapperProps) => {\n  const isOpenMultiProductCart = useAppSelector(getIsOpenMultiCart);\n  const selectedProduct = useAppSelector(getSelectedProduct);\n\n  return (\n    <div className='relative h-full min-h-0 w-full'>\n      <ToastContainer\n        containerId='swatch-multi-module'\n        position='top-center'\n        autoClose={4000}\n        hideProgressBar\n        closeOnClick\n        pauseOnHover\n        draggable={false}\n        theme='dark'\n        transition={Bounce}\n        style={{\n          zIndex: 999999999999999,\n          position: 'absolute',\n        }}\n      />\n      {isOpenMultiProductCart ? (\n        <MultiProductItemCart\n          onSendData={onSendData}\n          // onToggleSidebar={onToggleSidebar}\n        />\n      ) : selectedProduct ? (\n        <SelectedProductItem />\n      ) : (\n        <ProductList />\n      )}\n    </div>\n  );\n};\n","export const EActiveTab = {\n  SWATCH: 'swatch',\n  CART: 'cart',\n} as const;\n\nexport type EActiveTab = (typeof EActiveTab)[keyof typeof EActiveTab];\n","import React, { useEffect, useLayoutEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport clsx from 'clsx';\nimport s from './CustomSidebar.module.scss';\nimport { cn } from '../../utils/cn';\n\ntype SidebarProps = {\n  isOpen?: boolean;\n  setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  children: React.ReactNode;\n};\n\nconst CustomSidebar: React.FC<SidebarProps> = ({\n  children,\n  isOpen,\n  setIsOpen,\n}) => {\n  const panelRef = useRef<HTMLDivElement | null>(null);\n  const lastActiveRef = useRef<HTMLElement | null>(null);\n  const closeSidebar = () => setIsOpen(false);\n\n  useLayoutEffect(() => {\n    if (isOpen && typeof document !== 'undefined') {\n      lastActiveRef.current = document.activeElement as HTMLElement | null;\n    }\n  }, [isOpen]);\n\n  useEffect(() => {\n    if (isOpen) {\n      panelRef.current?.focus();\n    } else {\n      lastActiveRef.current?.focus?.();\n    }\n  }, [isOpen]);\n\n  useEffect(() => {\n    if (!isOpen) return;\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') closeSidebar();\n    };\n    window.addEventListener('keydown', onKey);\n    return () => window.removeEventListener('keydown', onKey);\n  }, [isOpen]);\n\n  useEffect(() => {\n    if (!isOpen) return;\n    const html = document.documentElement;\n    const body = document.body;\n    const prevHtml = html.style.overflow;\n    const prevBody = body.style.overflow;\n    html.style.overflow = 'hidden';\n    body.style.overflow = 'hidden';\n    return () => {\n      html.style.overflow = prevHtml;\n      body.style.overflow = prevBody;\n    };\n  }, [isOpen]);\n\n  if (!isOpen) return null;\n\n  return createPortal(\n    <div\n      className={clsx(s.overlay)}\n      onMouseDown={closeSidebar}\n      onTouchStart={closeSidebar}\n    >\n      <div\n        ref={panelRef}\n        tabIndex={-1}\n        className={cn(\n          s.panel,\n          s.right,\n          isOpen ? s.enter : s.exit,\n          'bg-[var(--sidebar-bg)]',\n        )}\n        onMouseDown={(e) => e.stopPropagation()}\n        onTouchStart={(e) => e.stopPropagation()}\n      >\n        {children}\n      </div>\n    </div>,\n    document.querySelector('#root-container')!,\n  );\n};\n\nexport default CustomSidebar;\n","import type { AttributeValue } from '../../swatches/model/types';\nimport type { ICartItem } from '../model/types';\n\nexport class CartCervices {\n  static getCartPreparedOption(\n    selectedMaterials: AttributeValue[],\n  ): ICartItem[] {\n    if (!selectedMaterials?.length) return [];\n    return selectedMaterials.map((item) => ({ ...item, count: 1 }));\n  }\n}\n","import React from 'react';\nimport { useAppDispatch } from '../../../../app/store/store';\nimport type { AttributeValue } from '../../model/types';\nimport { setSelectedMaterial } from '../../model/swatchesSlice';\nimport { MAX_SLOTS } from '../../../../shared/constants/selectedMaterials';\nimport SwatchListItem from '../../../MultiProduct/ui/SwatchListItem/SwatchListItem';\nimport { useCartCount } from '../../utils/hooks/useCartCount';\n\n/**\n * Renders a placeholder tile for an empty swatch slot.\n *\n * Used to visually fill remaining available slots up to {@link MAX_SLOTS}.\n *\n * @component\n */\nconst MockTile: React.FC = () => (\n  <div\n    className={[\n      'relative w-[40px] h-[40px] rounded-md aspect-square overflow-hidden',\n      'border border-solid border-[var(--border)] bg-[var(--sidebar-b)] sm:w-[64px] sm:h-[64px]',\n    ].join(' ')}\n    aria-hidden\n  />\n);\n\n/**\n * Props for {@link SwatchesList}.\n */\ninterface ISwatchesListProps {\n  /**\n   * Optional className string applied to the outer container.\n   */\n  containerStyles?: string;\n\n  /**\n   * Currently selected swatch materials.\n   */\n  selectedMaterials: AttributeValue[];\n}\n\n/**\n * Renders the swatches list with selected materials and remaining empty slots.\n *\n * Displays:\n * - header with selected count\n * - selected swatches as list items\n * - placeholder tiles for unused slots up to {@link MAX_SLOTS}\n *\n * @component\n *\n * @param props - {@link ISwatchesListProps}\n */\nexport const SwatchesList = ({\n  selectedMaterials,\n  containerStyles = 'p-[var(--sm-padding)] border-t border-solid border-[var(--border)] shrink-0 shadow-[0_-2px_10px_rgba(40,40,40,0.10)]',\n}: ISwatchesListProps) => {\n  const dispatch = useAppDispatch();\n  const cartCount = useCartCount(selectedMaterials);\n  const mockCount = Math.max(0, MAX_SLOTS - selectedMaterials.length);\n\n  /**\n   * Selects a material and updates the swatches state.\n   *\n   * @param item - Material value to set as selected\n   */\n  const handleSelect = (item: AttributeValue) => {\n    dispatch(\n      setSelectedMaterial({\n        selectedMaterial: item,\n        // materialCount: cartCount,\n        // selectedMaterials,\n      }),\n    );\n  };\n\n  return (\n    <div className={containerStyles}>\n      <div className='flex flex-row justify-between items-center mb-[12px]'>\n        <div className='relative'>\n          <div className='text-[12px]'>Swatches list</div>\n          <span className='absolute top-0 right-[-20px] font-medium text-[var(--main-accent-color)] text-[8px] leading-none'>\n            Free\n          </span>\n        </div>\n        <div className='text-[12px]'>\n          {cartCount}/{MAX_SLOTS} Selected\n        </div>\n      </div>\n\n      <div className='flex flex-row flex-wrap gap-[8px]'>\n        {selectedMaterials.map((val, index) => {\n          const meta = val.metadata;\n          return (\n            <SwatchListItem\n              key={`${meta?.label || index}/${val.parentName}`}\n              val={val}\n              onDelete={handleSelect}\n            />\n          );\n        })}\n\n        {Array.from({ length: mockCount }).map((_, i) => (\n          <MockTile key={`mock-${i}`} />\n        ))}\n      </div>\n    </div>\n  );\n};\n","import { SwatchesList } from '../SwatchesList/SwatchesList';\nimport { useAppSelector } from '../../../../app/store/store';\nimport { getSelectedMaterials } from '../../model/selectors';\n\nexport const SwatchesSingleProductListWrapper = () => {\n  const selectedMaterials = useAppSelector(getSelectedMaterials) ?? [];\n\n  return <SwatchesList selectedMaterials={selectedMaterials} />;\n};\n","import { useMemo, useRef, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useVirtualizer } from '@tanstack/react-virtual';\n\nimport { useAppSelector } from '../../../../app/store/store';\nimport {\n  getAllMaterialValues,\n  getMaterialSelectStateFilters,\n  getSelectedMaterials,\n} from '../../model/selectors';\nimport { MaterialListItem } from '../../../../shared/ui/MaterialListItem/MaterialListItem';\nimport { AttributeValue } from '../../model/types';\nimport { setSelectedMaterial } from '../../model/swatchesSlice';\nimport { SwatchLimitModal } from '../../../../shared/ui/SwatchLimitModal/SwatchLimitModal';\nimport { TOnSelectMaterial } from '../../../DataAdapter/utils/types';\n\n/**\n * Props for {@link MaterialSingleProductList}.\n */\ninterface IMaterialListProps {\n  /** Custom container styles */\n  containerStyles?: string;\n\n  /** Grid styles for the materials layout */\n  gridStyles?: string;\n\n  /** Number of columns on desktop screens (>= 640px) */\n  desktopColumnsCount?: number;\n\n  /**\n   * Optional callback fired when a material is selected.\n   */\n  onSelectMaterial?: TOnSelectMaterial<AttributeValue>;\n}\n\n/**\n * Builds a stable unique key for a material item.\n *\n * @param v - Material item\n * @returns Stable key string for React rendering\n */\nconst getMaterialKey = (v: AttributeValue): string => {\n  const valueKey = v.metadata?.value ?? v.value ?? v.label;\n  return `${v.parentName}__${v.optionName ?? ''}__${valueKey}`;\n};\n\n/**\n * Virtualized grid list of materials for a single product.\n *\n * - Filters by Finish / Color / Look\n * - Uses row-based virtualization for performance\n * - Uses fixed row height for stable virtualization (prevents huge bottom padding)\n * - Adds exact 20px bottom padding\n */\nexport const MaterialSingleProductList = ({\n  containerStyles = 'flex-1 min-h-0 overflow-y-auto p-[var(--sm-padding)]',\n  gridStyles = 'grid gap-[var(--sm-padding)]',\n  desktopColumnsCount = 3,\n  onSelectMaterial,\n}: IMaterialListProps) => {\n  const dispatch = useDispatch();\n\n  /** Scroll container reference for virtualization */\n  const scrollRef = useRef<HTMLDivElement | null>(null);\n\n  /** All available materials */\n  const allMaterialsValues = useAppSelector(getAllMaterialValues);\n\n  /** Selected materials */\n  const selectedMaterials = useAppSelector(getSelectedMaterials);\n\n  /** Active filters */\n  const filters = useAppSelector(getMaterialSelectStateFilters);\n\n  /** Controls visibility of swatch limit modal */\n  const [isShowLimitMessage, setIsShowLimitMessage] = useState(false);\n\n  /**\n   * Counts total number of selected swatches in the cart.\n   */\n  const cartCount = useMemo(() => {\n    return selectedMaterials.reduce((sum, item) => sum + (item.count ?? 0), 0);\n  }, [selectedMaterials]);\n\n  /**\n   * Filters materials according to Finish / Color / Look filters.\n   */\n  const filteredItems = useMemo(() => {\n    return allMaterialsValues.filter((item) => {\n      const finishOk =\n        filters.Finish.length === 0 ||\n        filters.Finish.some(\n          (finish) =>\n            item.metadata?.Finish === finish ||\n            item.metadata?.Material === finish,\n        );\n\n      const colorOk =\n        filters.Color.length === 0 ||\n        (item.metadata?.Color &&\n          filters.Color.some((selectedColor) =>\n            item.metadata?.Color?.split(',')\n              .map((s: string) => s.trim())\n              .includes(selectedColor),\n          ));\n\n      const looks = item.metadata?.Look;\n\n      const lookOk =\n        !filters.Look ||\n        filters.Look.length === 0 ||\n        filters.Look.some(\n          (selectedLook) => looks && looks.includes(selectedLook),\n        );\n\n      return finishOk && colorOk && lookOk;\n    });\n  }, [filters, allMaterialsValues]);\n\n  /**\n   * Determines if screen is >= 640px.\n   *\n   * Note: This is evaluated on render. If you need to react to resize,\n   * convert this to state with a resize/matchMedia listener.\n   */\n  const smUp =\n    typeof window !== 'undefined'\n      ? window.matchMedia('(min-width: 640px)').matches\n      : false;\n\n  /** Number of columns per row */\n  const cols = smUp ? desktopColumnsCount : 1;\n\n  /** Number of virtualized rows */\n  const rowCount = Math.ceil(filteredItems.length / cols);\n\n  /**\n   * Fixed row height (prevents wrong measurements causing huge bottom whitespace).\n   * Tune these values to match your card height + row gap.\n   */\n  const ROW_HEIGHT = smUp ? 240 : 190;\n\n  /**\n   * Row-based virtualizer.\n   * Each virtual item represents one row.\n   */\n  const rowVirtualizer = useVirtualizer({\n    count: rowCount,\n    getScrollElement: () => scrollRef.current,\n    estimateSize: () => ROW_HEIGHT,\n    overscan: 8,\n  });\n\n  /**\n   * Handles material selection.\n   *\n   * @param item - Selected material\n   */\n  const handleSelect = (item: AttributeValue) => {\n    const itemValue = item.metadata?.value ?? item.value ?? item.label;\n\n    const isSelected = selectedMaterials.some((material) => {\n      const matValue =\n        material.metadata?.value ?? material.value ?? material.label;\n\n      return matValue === itemValue && material.parentName === item.parentName;\n    });\n\n    if (cartCount + 1 > 5 && !isSelected) {\n      setIsShowLimitMessage(true);\n      return;\n    }\n\n    if (onSelectMaterial && !isSelected) {\n      onSelectMaterial(item);\n    }\n\n    dispatch(\n      setSelectedMaterial({\n        selectedMaterial: { ...item, count: 1 },\n      }),\n    );\n  };\n\n  const virtualRows = rowVirtualizer.getVirtualItems();\n  const totalSize = rowVirtualizer.getTotalSize();\n\n  return (\n    <div ref={scrollRef} className={containerStyles}>\n      <SwatchLimitModal\n        header=\"You've reached your maximum number of swatches!\"\n        body=\"If you'd like to add another swatch please remove an existing swatch from your cart\"\n        isOpen={isShowLimitMessage}\n        onClose={() => setIsShowLimitMessage(false)}\n      />\n\n      {/* Virtual content wrapper: fixed height + exact 20px bottom padding */}\n      <div\n        style={{\n          height: totalSize + 20,\n          position: 'relative',\n          paddingBottom: 20,\n        }}\n      >\n        {virtualRows.map((virtualRow) => {\n          const rowIndex = virtualRow.index;\n          const startIndex = rowIndex * cols;\n\n          const rowItems = filteredItems.slice(startIndex, startIndex + cols);\n\n          return (\n            <div\n              key={virtualRow.key}\n              style={{\n                position: 'absolute',\n                top: 0,\n                left: 0,\n                width: '100%',\n                transform: `translateY(${virtualRow.start}px)`,\n              }}\n            >\n              {/* Grid inside each row */}\n              <div\n                className={gridStyles}\n                style={{\n                  gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))`,\n                }}\n              >\n                {rowItems.map((val) => {\n                  const key = getMaterialKey(val);\n\n                  const value = val.metadata?.value ?? val.value ?? val.label;\n                  const isSelected = selectedMaterials.some((elem) => {\n                    const elemValue =\n                      elem.metadata?.value ?? elem.value ?? elem.label;\n\n                    return (\n                      elemValue === value && elem.parentName === val.parentName\n                    );\n                  });\n\n                  return (\n                    <MaterialListItem\n                      key={key}\n                      val={val}\n                      isSelected={isSelected}\n                      onClick={handleSelect}\n                    />\n                  );\n                })}\n              </div>\n            </div>\n          );\n        })}\n      </div>\n    </div>\n  );\n};\n","import { ProductElement } from '../ProductElement';\nimport { Filters } from '../Filters';\nimport { EActiveTab } from '../../../../shared/types/activeTab';\nimport { CloseIconSVG } from '../../../../app/assets/svg/CloseIconSVG';\nimport CustomSidebar from '../../../../shared/ui/CustomSidebar/CustomSidebar';\nimport { useAppDispatch, useAppSelector } from '../../../../app/store/store';\nimport {\n  getIsLoadingSelectedProduct,\n  getSelectedMaterials,\n} from '../../model/selectors';\nimport { CartCervices } from '../../../Cart/lib/CartCervices';\nimport { setCartItems } from '../../../Cart/model/cartSlice';\nimport { SwatchesSingleProductListWrapper } from '../SwatchesListWrapper/SwatchesListWrapper';\nimport { MaterialSingleProductList } from '../MaterialSingleProductList/MaterialSingleProductList';\nimport { Loader } from '../../../../shared/ui/Loader/Loader';\nimport { AttributeValue } from '../../model/types';\nimport { TOnSelectMaterial } from '../../../DataAdapter/utils/types';\n\ninterface ISidebarWrapperProps {\n  isOpen: boolean;\n  onSetActiveTab: (activeTab: EActiveTab) => void;\n  onToggleSidebar: () => void;\n  onSelectMaterial?: TOnSelectMaterial<AttributeValue>;\n}\n\nexport const SwatchWrapper = ({\n  isOpen,\n  onToggleSidebar,\n  onSetActiveTab,\n  onSelectMaterial,\n}: ISidebarWrapperProps) => {\n  const dispatch = useAppDispatch();\n  const selectedMaterials = useAppSelector(getSelectedMaterials) ?? [];\n  const isLoading = useAppSelector(getIsLoadingSelectedProduct);\n  // const isLoading = true;\n\n  const handleOpenCart = () => {\n    const cartData = CartCervices.getCartPreparedOption(selectedMaterials);\n\n    if (cartData) {\n      dispatch(setCartItems(cartData));\n    }\n    onSetActiveTab(EActiveTab.CART);\n  };\n\n  return (\n    <CustomSidebar isOpen={isOpen} setIsOpen={onToggleSidebar}>\n      <header className='flex flex-row p-[var(--sm-padding)] justify-between items-center border-b border-solid border-[var(--border)]'>\n        <h2 className='m-0! text-[16px] leading-[1.6] font-medium'>\n          Order free swatches\n        </h2>\n        <button\n          className='flex flex-row justify-center items-center w-[30px] h-[30px] bg-[var(--background-grey)]\n              border-none cursor-pointer rounded-full\n              [&_svg_path]:stroke-[var(--svg-dark)]'\n          onClick={onToggleSidebar}\n        >\n          <CloseIconSVG width={10} height={10} />\n        </button>\n      </header>\n      <div className='flex flex-col h-full min-h-0 relative'>\n        {isLoading && <Loader />}\n\n        <ProductElement\n          containerStyles='flex flex-row justify-between items-center shrink-0 p-[var(--sm-padding)] border-b border-solid border-[var(--border)]'\n          selectStyles='min-w-[auto] max-w-[154px] sm:max-w-[auto] sm:min-w-[250px]'\n        />\n        <div className='w-full border-b border-b-border'>\n          <Filters />\n        </div>\n        <MaterialSingleProductList onSelectMaterial={onSelectMaterial} />\n        <SwatchesSingleProductListWrapper />\n\n        <div className='p-[var(--sm-padding)] border-t border-solid border-[var(--border)] shrink-0'>\n          <button\n            className='w-full bg-[var(--main-accent-color)] p-[1.25rem] hover:bg-secondary transition-all duration-200 text-white rounded-full font-bold cursor-pointer text-[14px]'\n            onClick={handleOpenCart}\n          >\n            ADD SWATCHES TO CART\n          </button>\n        </div>\n      </div>\n    </CustomSidebar>\n  );\n};\n","import { MAX_SLOTS } from '../../../../shared/constants/selectedMaterials';\nimport { useAppSelector } from '../../../../app/store/store';\nimport { EActiveTab } from '../../../../shared/types/activeTab';\nimport { CloseIconSVG } from '../../../../app/assets/svg/CloseIconSVG';\nimport { ArrowIconSVG } from '../../../../app/assets/svg/ArrowIconSVG';\nimport { getSelectedMaterials } from '../../../swatches/model/selectors';\nimport { useCartCount } from '../../../swatches/utils/hooks/useCartCount';\n\n/**\n * Props for {@link CartHeader}.\n */\ninterface ICartHeaderProps {\n  /**\n   * Optional callback for switching the active tab (e.g. back to swatches).\n   *\n   * @param arg - Active tab value\n   */\n  onSetActiveTab?: (arg: EActiveTab) => void;\n\n  /**\n   * Callback for closing or toggling the sidebar.\n   */\n  onToggleSidebar: () => void;\n}\n\n/**\n * Renders the cart header with navigation, count limit messaging, and close action.\n *\n * Displays:\n * - back navigation button (optional tab switch)\n * - cart title\n * - max swatches warning when {@link MAX_SLOTS} is reached\n * - close button to toggle the sidebar\n *\n * @component\n *\n * @param props - {@link ICartHeaderProps}\n */\nexport const CartHeader = ({\n  onSetActiveTab,\n  onToggleSidebar,\n}: ICartHeaderProps) => {\n  const selectedMaterials = useAppSelector(getSelectedMaterials);\n\n  /**\n   * Total number of swatches currently in the cart.\n   */\n  const totalCount = useCartCount(selectedMaterials);\n\n  return (\n    <header className='flex flex-row MaterialMultiProductList justify-between items-center border-b border-solid border-[var(--border)] p-[var(--sm-padding)]'>\n      <div className='flex flex-row items-center gap-[4px]'>\n        <div className='flex flex-row items-center gap-[8px]'>\n          <button\n            className='[&_svg_path]:stroke-[var(--main-accent-color)] cursor-pointer'\n            onClick={() => onSetActiveTab?.(EActiveTab.SWATCH)}\n          >\n            <ArrowIconSVG />\n          </button>\n\n          <h2 className='m-0! text-[16px] leading-[1.6] font-medium '>\n            Your cart\n          </h2>\n        </div>\n\n        {totalCount >= MAX_SLOTS ? (\n          <>\n            <span className='text-[var(--main-accent-color)] hidden! text-[12px] sm:block!'>\n              ({MAX_SLOTS}) You reached maximum amount of swatches\n            </span>\n            <span className='text-[var(--main-accent-color)] block! sm:hidden!'>\n              ({MAX_SLOTS}) Max\n            </span>\n          </>\n        ) : null}\n      </div>\n\n      <button\n        className='flex flex-row justify-center items-center w-[30px] h-[30px] bg-[var(--background-grey)]\n            border-none cursor-pointer rounded-full\n            [&_svg_path]:stroke-[var(--svg-dark)]'\n        onClick={onToggleSidebar}\n      >\n        <CloseIconSVG width={10} height={10} />\n      </button>\n    </header>\n  );\n};\n","import { useState } from 'react';\nimport { useAppDispatch, useAppSelector } from '../../../../app/store/store';\nimport { MAX_SLOTS } from '../../../../shared/constants/selectedMaterials';\nimport { SwatchLimitModal } from '../../../../shared/ui/SwatchLimitModal/SwatchLimitModal';\nimport { getSelectedMaterials } from '../../../swatches/model/selectors';\nimport {\n  decrement,\n  increment,\n  removeItem,\n} from '../../../swatches/model/swatchesSlice';\nimport { useCartCount } from '../../../swatches/utils/hooks/useCartCount';\nimport type { ICartItem } from '../../model/types';\nimport { CartListItem } from '../CartListItem/CartListItem';\n\nexport const CartList = () => {\n  const dispatch = useAppDispatch();\n  const selectedMaterials = useAppSelector(getSelectedMaterials) ?? [];\n  const totalCount = useCartCount(selectedMaterials);\n\n  const [isShowLimitMessage, setIsShowLimitMessage] = useState(false);\n\n  const handleDelete = (item: ICartItem) => {\n    dispatch(removeItem({ selectedMaterial: item }));\n  };\n\n  const handleIncrement = (item: ICartItem) => {\n    if (item.count + 1 === 3) {\n      setIsShowLimitMessage(true);\n    } else {\n      dispatch(increment({ selectedMaterial: item }));\n    }\n  };\n\n  const handleDecrement = (item: ICartItem) => {\n    dispatch(decrement({ selectedMaterial: item }));\n  };\n\n  return (\n    <>\n      <ul className='flex flex-col flex-1 min-h-0 overflow-y-auto'>\n        {selectedMaterials?.map((item) => {\n          return (\n            <CartListItem\n              key={`${item.label}/${item.parentName}`}\n              item={item}\n              canInc={totalCount < MAX_SLOTS}\n              onDelete={() => handleDelete(item)}\n              onIncrement={() => handleIncrement(item)}\n              onDecrement={() => handleDecrement(item)}\n            />\n          );\n        })}\n      </ul>\n      <SwatchLimitModal\n        body='A maximum of two swatches per material may be ordered.'\n        isOpen={isShowLimitMessage}\n        onClose={() => setIsShowLimitMessage(false)}\n      />\n    </>\n  );\n};\n","import { EActiveTab } from '../../../../shared/types/activeTab';\nimport CustomSidebar from '../../../../shared/ui/CustomSidebar/CustomSidebar';\nimport { useAppSelector } from '../../../../app/store/store';\nimport { CartHeader } from '../CartHeader/CartHeader';\nimport { CartPrice } from '../../../../shared/ui/CartPrice/CartPrice';\nimport { CartList } from '../CartList/CartList';\nimport { getSelectedMaterials } from '../../../swatches/model/selectors';\n\ninterface ICartWrapperProps {\n  isOpen: boolean;\n  onSetActiveTab: (activeTab: EActiveTab) => void;\n  onToggleSidebar: () => void;\n  onSendData: (data: any[]) => void;\n}\n\nexport const CartWrapper = ({\n  isOpen,\n  onToggleSidebar,\n  onSetActiveTab,\n  onSendData,\n}: ICartWrapperProps) => {\n  const selectedMaterials = useAppSelector(getSelectedMaterials) ?? [];\n\n  return (\n    <CustomSidebar isOpen={isOpen} setIsOpen={onToggleSidebar}>\n      <CartHeader\n        onSetActiveTab={onSetActiveTab}\n        onToggleSidebar={onToggleSidebar}\n      />\n      <div className='flex flex-col h-full min-h-0'>\n        <CartList />\n        <CartPrice materials={selectedMaterials} />\n        <div className='p-[var(--sm-padding)] border-t border-solid border-[var(--border)] shrink-0'>\n          <button\n            className='w-full bg-[var(--main-accent-color)] p-[1.25rem] hover:bg-secondary transition-all duration-200 text-white text-[14px] rounded-full font-bold cursor-pointer'\n            onClick={() => onSendData(selectedMaterials)}\n          >\n            GO TO SHIPPING\n          </button>\n        </div>\n      </div>\n    </CustomSidebar>\n  );\n};\n","import { useState } from 'react';\nimport { SwatchWrapper } from './SwatchWrapper/SwatchWrapper';\nimport { CartWrapper } from '../../Cart/ui/CartWrapper/CartWrapper';\nimport { EActiveTab } from '../../../shared/types/activeTab';\nimport { ISwatchesModuleProps } from '../../../../lib/main';\n\nexport const Swatches = ({\n  isOpen,\n  onToggleSidebar,\n  onSendData,\n  onSelectMaterial,\n}: ISwatchesModuleProps) => {\n  const [activeTab, setActiveTab] = useState<EActiveTab>(EActiveTab.SWATCH);\n\n  const handleSetActiveTab = (activeTab: EActiveTab) => {\n    setActiveTab(activeTab);\n  };\n\n  return (\n    <>\n      {activeTab === EActiveTab.SWATCH ? (\n        <SwatchWrapper\n          isOpen={isOpen}\n          onToggleSidebar={onToggleSidebar}\n          onSetActiveTab={handleSetActiveTab}\n          onSelectMaterial={onSelectMaterial}\n        />\n      ) : (\n        <CartWrapper\n          isOpen={isOpen}\n          onToggleSidebar={onToggleSidebar}\n          onSetActiveTab={handleSetActiveTab}\n          onSendData={onSendData}\n        />\n      )}\n    </>\n  );\n};\n","import { combineReducers } from '@reduxjs/toolkit';\nimport { swatchesReducer } from '../../src/features/swatches/model/swatchesSlice';\nimport { cartReducer } from '../../src/features/Cart/model/cartSlice';\nimport { multiProductCartReducer } from '../../src/features/MultiProduct/model/multiProductCartSlice';\n\nconst rootReducer = combineReducers({\n  swatches: swatchesReducer,\n  cart: cartReducer,\n  multiProductCart: multiProductCartReducer,\n});\n\nexport type RootState = ReturnType<typeof rootReducer>;\nexport default rootReducer;\n","import { configureStore } from '@reduxjs/toolkit';\nimport { useDispatch, useSelector } from 'react-redux';\nimport rootReducer from './rootReducer';\nimport { storageMiddleware } from '../../src/app/store/storageMiddleware';\n\nlet _store: ReturnType<typeof createLibStore> | null = null;\n\nfunction createLibStore() {\n  return configureStore({\n    reducer: rootReducer,\n    devTools: import.meta.env.DEV,\n    middleware: (gdm) => gdm({ thunk: true }).concat(storageMiddleware),\n  });\n}\n\nexport const getStore = () => {\n  if (!_store) _store = createLibStore();\n  return _store;\n};\n\n// Force store recreation on hot reload\nif (import.meta.hot) {\n  import.meta.hot.accept(() => {\n    _store = null;\n  });\n}\n\ntype AppStore = ReturnType<typeof getStore>;\nexport type AppDispatch = AppStore['dispatch'];\nexport type RootState = ReturnType<AppStore['getState']>;\n\nexport const useAppDispatch = useDispatch.withTypes<AppDispatch>();\nexport const useAppSelector = useSelector.withTypes<RootState>();\n","import React from 'react';\nimport { Provider } from 'react-redux';\nimport { getStore } from './store';\n\nexport function LibraryProvider({ children }: { children: React.ReactNode }) {\n  return <Provider store={getStore()}>{children}</Provider>;\n}\n","declare const __APP_VERSION__: string;\nexport const APP_VERSION = __APP_VERSION__;\n","import {\n  EDataInputType,\n  TOnSelectMaterial,\n} from '../../src/features/DataAdapter/utils/types';\nimport { MultiProductWrapper } from '../../src/features/MultiProduct/ui/MultiProductWrapper/MultiProductWrapper';\nimport {\n  AttributeValue,\n  IAttributeAsset,\n} from '../../src/features/swatches/model/types';\nimport { Swatches } from '../../src/features/swatches/ui/Swatches';\nimport { LibraryProvider } from '../store/LibraryProvider';\nimport '../assets/styles/index.css';\nimport { useAppDispatch, useAppSelector } from '../store/store';\nimport { useEffect, useRef } from 'react';\nimport { DataAdapterServices } from '../../src/features/DataAdapter/lib/DataAdapterServices';\nimport {\n  setAllMaterialsOptions,\n  setSelectedMaterial,\n  resetSelectedMaterials,\n} from '../../src/features/swatches/model/swatchesSlice';\nimport { StorageService } from '../../src/shared/utils/storageService';\nimport {\n  getSelectedProductInformationThunk,\n  getSelectedProductThunk,\n} from '../../src/features/swatches/model/thunks';\nimport { getProductListThunk } from '../../src/features/MultiProduct/model/thunk';\nimport { APP_VERSION } from '../../src/shared/utils/version';\nimport { getSelectedMaterials } from '../../src/features/swatches/model/selectors';\n\nexport interface ISwatchesModuleProps {\n  isOpen: boolean;\n  uiDataType: EDataInputType;\n  assetId?: string;\n  data?: IAttributeAsset[] | any[];\n  configurationData?: any[];\n  onToggleSidebar: () => void;\n  onSendData: (data: unknown) => void;\n  onSelectMaterial?: TOnSelectMaterial<AttributeValue>;\n}\n\nexport const SwatchModule = ({\n  isOpen,\n  uiDataType,\n  data,\n  assetId,\n  configurationData,\n  onToggleSidebar,\n  onSendData,\n  onSelectMaterial,\n}: ISwatchesModuleProps) => {\n  const SINGLE_PRODUCT_DATA: ReadonlyArray<EDataInputType> = [\n    EDataInputType.UI,\n    EDataInputType.FETCH_DATA_PRODUCT,\n  ];\n  const dispatch = useAppDispatch();\n  const selectedMaterials = useAppSelector(getSelectedMaterials);\n  const isSingleProduct = SINGLE_PRODUCT_DATA.includes(uiDataType);\n  const prevAssetIdRef = useRef<string | null>(null);\n  // const cartCount = useMemo(() => {\n  //   return selectedMaterials.reduce((sum, item) => sum + (item.count ?? 0), 0);\n  // }, [selectedMaterials]);\n  // Clear selectedMaterials when switching to a different product (assetId)\n  useEffect(() => {\n    if (assetId && isSingleProduct) {\n      const prevAssetId =\n        StorageService.getCurrentAssetId?.() ?? prevAssetIdRef.current;\n\n      if (!!prevAssetId && prevAssetId !== assetId) {\n        dispatch(resetSelectedMaterials());\n        StorageService.clearSelectedMaterials();\n      }\n      prevAssetIdRef.current = assetId;\n      StorageService.setCurrentAssetId(assetId);\n    }\n  }, [assetId, isSingleProduct, dispatch]);\n\n  useEffect(() => {\n    let filteredConfigData: AttributeValue[];\n    if (isOpen) {\n      // if (!data && uiDataType === EDataInputType.UI) {\n      //   throw new Error(`SwatchCart-module: Attributes are important`);\n      // } else {\n      if (uiDataType === EDataInputType.UI) {\n        if (!data)\n          throw new Error(`SwatchCart-module: Attributes are important`);\n\n        const uiData = DataAdapterServices.getTransformedData({\n          dataType: EDataInputType.UI,\n          data,\n        });\n\n        if (uiData) {\n          dispatch(setAllMaterialsOptions(uiData));\n        }\n      } else if (uiDataType === EDataInputType.FETCH_DATA_PRODUCT && assetId) {\n        const fetchProductDetails = async () => {\n          try {\n            const productData = await dispatch(\n              getSelectedProductThunk({ assetId }),\n            ).unwrap();\n            const selectedProduct = await dispatch(\n              getSelectedProductInformationThunk({ assetId }),\n            ).unwrap();\n            if (!selectedProduct || !productData) return;\n\n            const fetchProductData = DataAdapterServices.getTransformedData({\n              dataType: EDataInputType.FETCH_DATA_PRODUCT,\n              data: productData,\n              selectedProduct: selectedProduct.rows[0],\n            });\n\n            dispatch(setAllMaterialsOptions(fetchProductData));\n\n            // This block sets selected data from the scene to single swatch module\n            if (configurationData?.length) {\n              // Find all material keys\n              const materialsKeys = productData.materials.map(\n                (item) => item.optionName,\n              );\n\n              // Transform selected data according to the swatch module cart data.\n              filteredConfigData = configurationData\n                ?.filter((item) => materialsKeys.includes(item.name))\n                .map((option) => ({\n                  ...option,\n                  label: option.valueMetadata.label,\n                  value: option.valueMetadata.value,\n                  metadata: option.valueMetadata,\n                  optionName: option.name,\n                  parentName: option.metadata.Name,\n                  productInformation: selectedProduct.rows[0],\n                  count: 1,\n                }));\n\n              // Set data to the store\n              filteredConfigData?.forEach((item) => {\n                console.log(item);\n                const isExist = (i: any) =>\n                  i.metadata?.label === item.metadata?.label &&\n                  i.parentName === item.parentName;\n                // console.log(`item ${item} - index ${index}`);\n\n                const exists = selectedMaterials.some(isExist);\n                if (exists) return;\n                dispatch(\n                  setSelectedMaterial({\n                    selectedMaterial: { ...item, count: 1 },\n                  }),\n                );\n              });\n            }\n          } catch (error) {\n            console.error('Failed to load product', error);\n          }\n        };\n        fetchProductDetails();\n      } else if (uiDataType === EDataInputType.FETCH_DATA_ALL) {\n        const fetchProductDetails = async () => {\n          try {\n            dispatch(getProductListThunk()).unwrap();\n          } catch (error) {\n            console.error('Failed to load product', error);\n          }\n        };\n        fetchProductDetails();\n      }\n    }\n\n    return () => {\n      // Reset pre-configured store data\n      console.log('configurationData filteredConfigData', filteredConfigData);\n      filteredConfigData?.forEach((item) => {\n        dispatch(\n          setSelectedMaterial({\n            selectedMaterial: { ...item, count: 1 },\n          }),\n        );\n      });\n    };\n  }, [uiDataType, data, assetId, isOpen]);\n\n  console.log('✅ CURRENT VERSION OF THE SWATCHES MODULE IS: ', APP_VERSION);\n\n  return (\n    <div\n      id='root-container'\n      // className={`${isOpen ? 'flex' : 'hidden'} relative flex-col h-full min-h-0 w-full`}\n      className={`${isOpen ? 'flex' : 'hidden'} relative flex-col h-[100dvh] min-h-0 w-full`}\n    >\n      <LibraryProvider>\n        {isOpen ? (\n          <>\n            {!isSingleProduct ? (\n              <MultiProductWrapper\n                onSendData={onSendData}\n                onToggleSidebar={onToggleSidebar}\n              />\n            ) : null}\n\n            {isSingleProduct ? (\n              <Swatches\n                isOpen={isOpen}\n                uiDataType={uiDataType}\n                data={data as any[]}\n                assetId={assetId}\n                onToggleSidebar={onToggleSidebar}\n                onSendData={onSendData}\n                onSelectMaterial={onSelectMaterial}\n              />\n            ) : null}\n          </>\n        ) : null}\n      </LibraryProvider>\n    </div>\n  );\n};\n","// withStore.tsx\nimport React from 'react';\nimport { LibraryProvider } from './LibraryProvider';\n\nexport function withStore<T extends React.ComponentType<any>>(Comp: T) {\n  type P = React.ComponentProps<T>;\n\n  const Wrapped: React.FC<P> = (props) => (\n    <LibraryProvider>\n      <Comp {...(props as P)} />\n    </LibraryProvider>\n  );\n\n  Wrapped.displayName = `withStore(${Comp.displayName || Comp.name || 'Component'})`;\n  return Wrapped;\n}\n","import React from 'react';\nimport * as ReactDOMClient from 'react-dom/client';\nimport './assets/styles/index.css';\nimport { SwatchModule as BaseSwatchModule } from './components/SwatchesModule';\nimport { withStore } from './store/withStore';\nexport type { ISwatchesModuleProps } from './components/SwatchesModule'; // <-- important\nimport { EDataInputType as BaseModuleTypes } from '../src/features/DataAdapter/utils/types';\n\nexport const SwatchModule = withStore(BaseSwatchModule);\nexport const EDataInputType = BaseModuleTypes;\n// Tiny helper so CDN users don't import React\nexport function mountSwatchModule(\n  el: HTMLElement,\n  props: React.ComponentProps<typeof SwatchModule>,\n) {\n  const root = ReactDOMClient.createRoot(el);\n  root.render(React.createElement(SwatchModule, props));\n  return () => root.unmount();\n}\n"],"names":["EDataInputType","FILTER_TO_VALUE_KEY","isEqual","a","b","SwatchesServices","options","acc","item","sourceValues","parentName","valuesWithMeta","v","array","seen","input","splitByComma","s","allValues","selected","filterType","valueKey","filters","filterKey","occurrences","entries","entry","list","mappedData","group","f","uniqueList","arr","SWATCHES_ROUTES","assetId","VITE_SWATH_CART_PRODUCTION_URL","__vite_import_meta_env__","getProductListAPI","url","res","data","error","getSelectedProductAPI","response","getSelectedProductListInformationAPI","getSelectedProductThunk","createAsyncThunk","e","getSelectedProductInformationThunk","rejectWithValue","MAX_SLOTS","STORAGE_KEYS","STORAGE_EXPIRY_MS","StorageService","materials","storedData","raw","stored","items","prevAssetId","persistedSelectedMaterials","initialState","sum","i","swatchesSlice","createSlice","state","action","filterName","values","attributeList","filteredAttributeList","allMaterialValues","productElementOptions","selectedMaterial","isSame","metadata","next","clamped","otherTotal","maxForThis","builder","swatchesReducer","setMaterialSelect","setAllMaterialsOptions","setPanelFilter","setSelectedMaterial","clearMaterialFilter","clearAllMaterialFilters","setSelectedProduct","deleteSelectedProduct","setIsOpenMultiProductCart","resetSelectedMaterials","removeItem","increment","decrement","setCount","setCartMaterials","cartSlice","setCartItems","clear","cartReducer","getProductListThunk","_","persistedMultiProductItems","findProductIdx","p","findItemIdx","productIdx","label","multiProductCartSlice","idx","pIdx","iIdx","nextItems","setCartForProduct","setMultiCartItems","incrementMultiProductItem","decrementMultiProductItem","removeMultiProductItem","setActiveMultiCartProduct","multiProductCartReducer","rootReducer","combineReducers","SWATCHES_PERSIST_ACTIONS","MULTI_PRODUCT_PERSIST_ACTIONS","storageMiddleware","store","result","actionType","NODE_ENV","configureStore","getDefaultMiddleware","useAppDispatch","useDispatch","useAppSelector","useSelector","getAllMaterialValues","getMaterialSelectStateFilters","getProductElementOptions","getSelectedMaterials","getIsLoadingSelectedProduct","getIsOpenMultiCart","getSelectedProduct","MATERIAL_PRICE","CartPrice","containerStyles","COMMON_STYLES","totalPrice","useMemo","jsxs","jsx","CustomButton","children","disabled","rest","AttributeHelper","value","Image","attribute","cn","inputs","twMerge","clsx","Dialog","DialogPrimitive","DialogPortal","DialogOverlay","React","className","props","ref","DialogContent","X","DialogHeader","DialogTitle","DialogDescription","ImageGridZoom","zoomSrc","useState","open","setOpen","imageUrl","valueLabel","Fragment","CloseIconSVG","HexGridZoom","defaultHex","hexColor","DEFAULT_STYLES","MaterialItem","val","isShowDeleteIcon","handleSelect","MinusIconSVG","PlusIconSVG","TrashIconSVG","Counter","canIncrement","onIncrement","onDecrement","onDelete","showTrash","CartListItem","canInc","ArrowIconSVG","scrollToTop","rootContainer","MultiProductCartHeader","totalCount","dispatch","handleGoBack","useCartCount","getMultiCartItems","getProductLIst","getIsLoadingProductList","CustomModal","isOpen","onClose","title","width","height","modalRef","useRef","useEffect","handleClickOutside","ReactDOM","SwatchLimitModal","header","body","MultiProductItemCart","onSendData","selectedProducts","isShowLimitMessage","setIsShowLimitMessage","allItems","handleDelete","handleIncrement","handleDecrement","product","name","SearchIconSVG","Mt","t","o","L","N","P","mt","B","pt","z","$t","Z","$","d","c","T","g","x","C","S","E","zt","Bt","n","Rt","ut","J","tt","Ut","Ft","yt","ot","gt","l","Tt","et","Xt","at","_t","u","h","m","k","M","A","D","Y","I","F","st","Vt","bt","Qt","nt","vt","r","ht","Ct","xt","rt","Et","Pt","Wt","U","V","Q","y","Gt","qt","It","Kt","Yt","At","kt","St","Zt","Ot","to","Jt","G","O","ao","so","no","ro","io","W","lo","Nt","eo","oo","wt","R","it","ft","dt","j","H","fo","co","q","K","lt","_o","Lt","go","To","Dt","yo","ct","BASE_MULTI_OPTIONS","showErrorToast","message","toast","ETypeComponent","byteToHex","unsafeStringify","offset","getRandomValues","rnds8","rng","randomUUID","native","_v4","buf","rnds","v4","GROUPING_KEY","DataAdapterServices","dataType","selectedProduct","attributes","section","opt","groupingValues","materialKeys","structure","optionToGroup","optionToSection","materialsWithGroup","groupName","sectionName","optionName","uuidv4","valuesArray","normalizedLabel","ProductListItem","productListItem","img","imageURL","handleSetSelectedItem","productData","fetchProductData","MOCK_ALL_CATEGORY_SLIDER_ITEM","MultiProductCartService","cartItems","productList","ORDER","preparedData","collection","idxA","idxB","safeA","safeB","index","selectedMaterials","cartData","allCartItems","cart","existing","cartItem","Label","text","isActive","onClick","handleLabelClick","handleKeyDown","ChevronSVGIcon","Slider","activeId","onSelect","stepRatio","scrollerRef","contentRef","rafRef","canLeft","setCanLeft","canRight","setCanRight","updateEdges","useCallback","el","remaining","EPS","useLayoutEffect","content","roScroller","roContent","onScroll","scrollByStep","dir","delta","id","toAccordions","src","openFirst","ACCORDION_RE","head","openAttr","styles","MDWithAccordion","preprocessed","ReactMarkdown","rehypeRaw","InfoIcon","PopoverTooltip","tooltipData","trigger","handleClick","event","Popover","PopoverTrigger","PopoverContent","SingleSelect","onValueChange","placeholder","dropdownWidth","align","showClear","getTooltipByMaterialAndSection","setIsOpen","popoverContentRef","handleScroll","target","handleEscape","handleClear","PopoverPrimitive","ChevronDownIcon","XIcon","isSelected","CheckIcon","Loader","size","trackClassName","accentClassName","isOverlay","Hint","maxWidthPx","forceOverflowVisible","bubbleRef","pos","setPos","originalPosition","originalOverflow","arrow","vpPad","measureAndPlace","prev","bRect","bw","bh","tRect","desiredLeft","left","top","desiredArrowLeft","arrowLeft","onResize","createPortal","SwatchListItem","hoveredEl","setHoveredEl","setText","meta","handleDeleteClick","MockTile","SwatchesMultiProductList","targetAssetId","isSameSwatch","nextSelectedProducts","mockCount","cartCount","SwatchContentContainer","handleOpenMultiCart","SORT_OPTIONS","ProductList","scrollRef","isLoadingProductList","isLoadingProduct","activeCategory","setActiveCategory","search","setSearch","debouncedSearch","setDebouncedSearch","sortValue","setSortValue","isScrolling","setIsScrolling","totalItemsLength","uniqueCategories","norm","collator","filteredProductList","Checkbox","CheckboxPrimitive","MultiSelect","popoverContent","handleSelectOption","optionValue","checked","handleClearAll","selectedCount","displayContent","option","isChecked","ProductElement","selectStyles","allProductElementOptions","productOptions","setProductOptions","productValues","setProductValues","formatProductData","Name","handleFilterChange","uniqueListValue","filteredMaterialByProduct","nonZeroCountList","listItem","filterKeys","MaterialsFilter","allMaterialsValues","materialOptions","setMaterialOptions","finishOptions","finish","count","ColorsFilter","colorOptions","setColorOptions","color","LooksFilter","lookOptions","setLookOptions","look","Filters","FiltersSelectedProductItem","memo","getDeps","fn","opts","deps","memoizedFunction","_a","_b","_c","_d","depTime","newDeps","dep","resultTime","depEndTime","resultEndTime","resultFpsPercentage","pad","str","num","notUndefined","msg","approxEqual","debounce","targetWindow","ms","timeoutId","args","getRect","element","offsetWidth","offsetHeight","defaultKeyExtractor","defaultRangeExtractor","range","start","end","observeElementRect","instance","cb","handler","rect","observer","run","box","addEventListenerOptions","observeWindowRect","supportsScrollend","observeElementOffset","fallback","createHandler","horizontal","isRtl","endHandler","registerScrollendEvent","observeWindowOffset","measureElement","windowScroll","adjustments","behavior","toOffset","elementScroll","Virtualizer","_ro","get","opts2","key","sync","scrollElement","cached","measurements","furthestMeasurementsFound","furthestMeasurements","measurement","previousFurthestMeasurement","paddingStart","scrollMargin","getItemKey","enabled","itemSizeCache","min","furthestMeasurement","measuredSize","lane","outerSize","scrollOffset","lanes","calculateRange","startIndex","endIndex","rangeExtractor","overscan","node","attributeName","indexStr","prevNode","itemSize","indexes","virtualItems","len","findNearestBinarySearch","maxOffset","initialAlign","attempts","maxAttempts","tryScroll","currentAlign","offsetInfo","currentOffset","afterInfo","scheduleRetry","endByLane","low","high","getCurrentValue","middle","currentValue","lastIndex","getOffset","endPerLane","startPerLane","useIsomorphicLayoutEffect","useVirtualizerBase","rerender","resolvedOptions","instance2","flushSync","useVirtualizer","useWindowVirtualizer","CheckMarkIconSVG","MaterialListItem","MaterialListItemBase","toMaterialKey","toReactKey","MaterialMultiProductList","gridStyles","minCardWidth","gapPx","maxColumns","fallbackColumns","bottomPadPx","hostRef","isShowSwatchLimit","setIsShowSwatchLImit","cols","setCols","containerWidth","setContainerWidth","estimateRowHeight","selectedKeySet","set","filteredItems","finishOk","colorOk","selectedColor","looks","lookOk","selectedLook","rowCount","rowVirtualizer","virtualRows","totalSize","isSameMaterial","nextActive","newMaterial","inserted","gridStyle","vr","rowItems","SelectedProductItem","MultiProductWrapper","isOpenMultiProductCart","ToastContainer","Bounce","EActiveTab","CustomSidebar","panelRef","lastActiveRef","closeSidebar","onKey","html","prevHtml","prevBody","CartCervices","SwatchesList","SwatchesSingleProductListWrapper","getMaterialKey","MaterialSingleProductList","desktopColumnsCount","onSelectMaterial","smUp","ROW_HEIGHT","itemValue","material","virtualRow","elem","SwatchWrapper","onToggleSidebar","onSetActiveTab","isLoading","handleOpenCart","CartHeader","CartList","CartWrapper","Swatches","activeTab","setActiveTab","handleSetActiveTab","_store","createLibStore","gdm","getStore","LibraryProvider","Provider","APP_VERSION","SwatchModule","uiDataType","configurationData","SINGLE_PRODUCT_DATA","isSingleProduct","prevAssetIdRef","filteredConfigData","uiData","materialsKeys","isExist","withStore","Comp","Wrapped","BaseSwatchModule","BaseModuleTypes","mountSwatchModule","root","ReactDOMClient"],"mappings":"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","x_google_ignoreList":[41,44,45,46,47,73,74,75]}