{"version":3,"file":"ProductsModule.evwEQvpr.mjs","names":["createContext","useContext","useMemo","containerStyle","useRef","useMemo"],"sources":["https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsElementProvider/ProductsElementProvider.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsModule.constants.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsModule.types.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsElementProvider/ProductsElementProvider.hooks.js","https:/asset.29cm.co.kr/contents/framer/types/models/sort.js","https:/asset.29cm.co.kr/contents/framer/apis/best/BestApiService.js","https:/asset.29cm.co.kr/contents/framer/apis/display-bff/DisplayBffApiService.js","https:/asset.29cm.co.kr/contents/framer/apis/display-bff/DisplayBffApiService.types.js","https:/asset.29cm.co.kr/contents/framer/apis/recommend/RecommendApiService.js","https:/asset.29cm.co.kr/contents/framer/components/modules/mock.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsModule.hooks.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsElement/ProductsElement.hooks.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsElement/PaginationElement/ExpandButtonElement/ExpandButtonElement.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsElement/PaginationElement/VerticalPaginationElement/VerticalPaginationElement.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsElement/PaginationElement/PaginationElement.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsElement/ProductsElement.utils.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsElement/ProductsElement.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/LinkedProductsModule/LinkedProductsModule.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsModule.controls.js","https:/asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsModule.js","https:/framerusercontent.com/modules/m3WciOarwtFjChbrrQMz/UgKfY5LLfEJhNhGuri0i/ProductsModule.js"],"sourcesContent":["import { jsx } from \"react/jsx-runtime\";\nimport { createContext } from \"react\";\nimport \"../../../systems/Countdown/Countdown.js\";\nimport \"react-dom\";\nimport \"../../../systems/Dialog/Dialog.module.css.js\";\nimport \"framer-motion\";\nimport \"../../../systems/Expandable/Expandable.js\";\nimport \"../../../systems/FixedScrollProgressBar/FixedScrollProgressBar.js\";\nimport \"../../../../hooks/stores/content/content.store.js\";\nimport \"../../../../hooks/stores/dialog/dialog.store.js\";\nimport \"../../../../hooks/stores/global-layout/global-layout.store.js\";\nimport \"../../../../hooks/stores/toast/toast.store.js\";\nimport \"../../../../node_modules/@firebase/analytics/dist/esm/index.esm2017.js\";\nimport \"../../../../node_modules/firebase/app/dist/esm/index.esm.js\";\nimport \"../../../../node_modules/swr/core/dist/index.js\";\nimport \"../../../../apis/user-segment/CategoryFirstOrderApiService.js\";\nimport \"../../../../config/index.js\";\nimport \"../../../../node_modules/js-cookie/dist/js.cookie.js\";\nimport \"../../../../apis/highlight-products/HighlightProductsApiService.js\";\nimport \"../../../../apis/brand-mix/BrandMixApiService.js\";\nimport \"../../../../apis/one-brand-days/OneBrandDaysApiService.js\";\nimport \"../../../../apis/taste-sharing/TasteSharingApiService.js\";\nimport \"../../../../apis/user/UserApiService.js\";\nimport \"../../../../apis/preuser/PreuserApiService.js\";\nimport \"../../../../node_modules/vite-plugin-node-polyfills/shims/buffer/dist/index.js\";\nimport \"framer\";\nimport \"../../../../node_modules/@29cm/snowplow/dist/esm/core/snowplow.js\";\nimport \"../../../../node_modules/swr/mutation/dist/index.js\";\nimport \"../../../@shared/providers/ThemeProvider/ThemeProvider.js\";\nimport \"../../../@shared/providers/BreakpointProvider/BreakpointProvider.js\";\nimport \"../../../../hooks/stores/bottom-sheet/bottom-sheet.store.js\";\nimport \"../../../../containers/DialogContainer/DialogContainer.emitter.js\";\nimport \"../../../../hooks/useFeatureFlag.js\";\nimport \"../../../../utils/redirectLogin.js\";\nimport \"../../../../utils/event-properties/source.js\";\nimport \"../../../systems/ShareButtonWithReferralEvent/ShareButtonWithReferralEvent.js\";\nimport \"../../../../constants/snowplow/snowplowSchema.js\";\nimport { PRODUCTS_PER_REQUEST } from \"../../../systems/Products/Products.js\";\nimport \"../../../systems/ResponsiveSplitView/ResponsiveSplitView.js\";\nimport \"../../../systems/ResponsiveSplitViewOverlayButton/ResponsiveSplitViewOverlayButton.js\";\nimport \"../../../systems/RollingNumber/RollingNumber.js\";\nimport \"../../../systems/TabBar/TabBar.js\";\nimport \"../../../systems/TimeProgressBar/TimeProgressBar.js\";\nimport \"../../../systems/ViewportContainer/ViewportContainer.js\";\nimport \"../../../systems/TabBarV2/TabBarV2.js\";\nimport \"../../../systems/TabBarV3/TabBarV3.js\";\nimport \"../../../systems/TabBarV4/TabBarV4.js\";\nconst ProductsElementContext = createContext({\n  query: void 0,\n  size: PRODUCTS_PER_REQUEST\n});\nconst ProductsElementProvider = ({\n  children,\n  query,\n  size\n}) => {\n  return /* @__PURE__ */ jsx(ProductsElementContext.Provider, { value: {\n    query,\n    size\n  }, children });\n};\nexport {\n  ProductsElementContext,\n  ProductsElementProvider\n};\n","const PRODUCTS_PER_REQUEST = 30;\nexport {\n  PRODUCTS_PER_REQUEST\n};\n","var ScrollDirection = /* @__PURE__ */ ((ScrollDirection2) => {\n  ScrollDirection2[\"Vertical\"] = \"vertical\";\n  ScrollDirection2[\"Horizontal\"] = \"horizontal\";\n  return ScrollDirection2;\n})(ScrollDirection || {});\nvar ProductsModuleInputType = /* @__PURE__ */ ((ProductsModuleInputType2) => {\n  ProductsModuleInputType2[ProductsModuleInputType2[\"Linked\"] = 0] = \"Linked\";\n  ProductsModuleInputType2[ProductsModuleInputType2[\"Manual\"] = 1] = \"Manual\";\n  ProductsModuleInputType2[ProductsModuleInputType2[\"Preuser\"] = 2] = \"Preuser\";\n  return ProductsModuleInputType2;\n})(ProductsModuleInputType || {});\nvar PaginationType = /* @__PURE__ */ ((PaginationType2) => {\n  PaginationType2[PaginationType2[\"Default\"] = 0] = \"Default\";\n  PaginationType2[PaginationType2[\"ExpandButton\"] = 1] = \"ExpandButton\";\n  PaginationType2[PaginationType2[\"None\"] = 2] = \"None\";\n  return PaginationType2;\n})(PaginationType || {});\nexport {\n  PaginationType,\n  ProductsModuleInputType,\n  ScrollDirection\n};\n","import { useContext } from \"react\";\nimport { ProductsElementContext } from \"./ProductsElementProvider.js\";\nconst useProductsElementContext = () => {\n  return useContext(ProductsElementContext);\n};\nexport {\n  useProductsElementContext\n};\n","var SortType = /* @__PURE__ */ ((SortType2) => {\n  SortType2[\"FEATURED\"] = \"FEATURED\";\n  SortType2[\"BEST\"] = \"BEST\";\n  SortType2[\"NEW\"] = \"NEW\";\n  SortType2[\"REVIEW_DESC\"] = \"REVIEW_DESC\";\n  SortType2[\"PRICE_DESC\"] = \"PRICE_DESC\";\n  SortType2[\"PRICE_ASC\"] = \"PRICE_ASC\";\n  SortType2[\"DISCOUNT_DESC\"] = \"DISCOUNT_DESC\";\n  SortType2[\"LIKE_DESC\"] = \"LIKE_DESC\";\n  SortType2[\"ORDER_DESC\"] = \"ORDER_DESC\";\n  return SortType2;\n})(SortType || {});\nexport {\n  SortType\n};\n","import { APIService } from \"../APIService.js\";\nimport { throwFailError } from \"../@middlewares/throwFailError.js\";\nimport { env } from \"../../config/index.js\";\nclass BestApiService extends APIService {\n  constructor() {\n    super();\n    this.setBaseUrl(env.api.search);\n    this.setMiddleware(throwFailError);\n  }\n  async getRankedProducts(payload) {\n    return this.post(`/api/v5/best`, payload).then((data) => ({\n      products: formatBestProducts(data.data.products),\n      totalCount: data.data.totalCount\n    }));\n  }\n  async getPLPFacetGroup(payload) {\n    return this.post(`/api/v5/plp/facet-group`, payload);\n  }\n}\nconst bestApi = new BestApiService();\nconst formatBestProducts = (products) => products.map((product) => {\n  var _a;\n  return {\n    ...product,\n    frontBrand: {\n      frontBrandId: product.frontBrandNo,\n      nameKor: product.frontBrandNameKor,\n      nameEng: product.frontBrandNameEng\n    },\n    productId: product.itemNo,\n    productName: product.itemName,\n    isCoupon: product.saleInfoV2.isCoupon,\n    heartOn: true,\n    frontCategories: (_a = product.frontCategoryInfo) == null ? void 0 : _a.map((category) => ({\n      largeCategoryCode: category.categoryLargeCode,\n      largeCategoryName: category.categoryLargeName,\n      mediumCategoryCode: category.categoryMediumCode,\n      mediumCategoryName: category.categoryMediumName,\n      smallCategoryCode: category.categorySmallCode,\n      smallCategoryName: category.categorySmallName\n    }))\n  };\n});\nexport {\n  bestApi\n};\n","import { throwFailError } from \"../@middlewares/throwFailError.js\";\nimport { APIService } from \"../APIService.js\";\nimport { env } from \"../../config/index.js\";\nclass DisplayBffApiService extends APIService {\n  constructor() {\n    super();\n    this.setBaseUrl(env.api.displayBff);\n    this.setMiddleware(throwFailError);\n  }\n  async getFacetGroup(payload) {\n    return this.post(`/api/v1/listing/facet-group`, {\n      keyword: payload.keyword,\n      pageType: payload.pageType ?? \"CONTENT_COLLECTION_RECOMMEND\",\n      facets: payload.facets\n    }, {\n      credentials: \"include\"\n    });\n  }\n  async getListingItems(payload) {\n    return this.post(`/api/v1/listing/items`, payload);\n  }\n  async getItems(payload) {\n    return this.post(`/api/v1/framer/listing/promoted-items`, payload, {\n      credentials: \"include\"\n    });\n  }\n}\nconst displayBffApi = new DisplayBffApiService();\nexport {\n  displayBffApi\n};\n","var DisplayBffSortType = /* @__PURE__ */ ((DisplayBffSortType2) => {\n  DisplayBffSortType2[\"Recommended\"] = \"RECOMMENDED\";\n  DisplayBffSortType2[\"Newest\"] = \"NEWEST\";\n  DisplayBffSortType2[\"MostReviewed\"] = \"MOST_REVIEWED\";\n  DisplayBffSortType2[\"LowestPrice\"] = \"LOWEST_PRICE\";\n  DisplayBffSortType2[\"HighestPrice\"] = \"HIGHEST_PRICE\";\n  DisplayBffSortType2[\"HighestDiscount\"] = \"HIGHEST_DISCOUNT\";\n  DisplayBffSortType2[\"MostLiked\"] = \"MOST_LIKED\";\n  DisplayBffSortType2[\"MostSold\"] = \"MOST_SOLD\";\n  DisplayBffSortType2[\"MostReserved\"] = \"MOST_RESERVED\";\n  DisplayBffSortType2[\"UpcomingPerformance\"] = \"UPCOMING_PERFORMANCE\";\n  return DisplayBffSortType2;\n})(DisplayBffSortType || {});\nexport {\n  DisplayBffSortType\n};\n","import { APIService } from \"../APIService.js\";\nimport { throwFailError } from \"../@middlewares/throwFailError.js\";\nimport { env } from \"../../config/index.js\";\nclass RecommendApiService extends APIService {\n  constructor() {\n    super();\n    this.setBaseUrl(env.api.content);\n    this.setMiddleware(throwFailError);\n  }\n  async getPersonalizedProducts(productGroupId, limit) {\n    return this.get(`/api/v4/framers/proxy/content-api/api/v4/product-groups/${productGroupId}/for-you-products`, {\n      limit\n    }, {\n      credentials: \"include\"\n    }).then((data) => ({\n      ...data,\n      data: {\n        ...data.data,\n        productList: formatProducts(data.data.productList)\n      }\n    }));\n  }\n  /**\n   * @param query.tagIds 콤마 구분 기획전 태그 ID (예: `\"3515,3516\"`)\n   * @param query.categoryCodes 콤마 구분 전시 대카 코드 (예: `\"268100100,268200100\"`). 빈 문자열이면 전체\n   */\n  async getRecommendedProductsByTagId(query) {\n    return this.get(\"/api/v4/framers/proxy/content-api/api/v5/recommendation/personalize/products\", {\n      limit: query.limit,\n      tagIds: query.tagIds,\n      // content-api OpenAPI: categoryCodes integer[] → 쿼리는 콤마 구분 문자열\n      categoryCodes: query.categoryCodes ?? \"\"\n    }, {\n      credentials: \"include\"\n    }).then((data) => ({\n      ...data,\n      data: {\n        ...data.data,\n        products: formatCollectionProduct2Product(data.data.products)\n      }\n    }));\n  }\n}\nconst recommendApi = new RecommendApiService();\nconst formatCollectionProduct2Product = (products) => products.map((product) => {\n  var _a;\n  return {\n    frontBrand: {\n      frontBrandId: product.frontBrand.id,\n      nameKor: product.frontBrand.nameKor,\n      nameEng: product.frontBrand.nameEng\n    },\n    productId: product.productId,\n    productName: product.productName,\n    subjectDescriptions: product.subjectDescriptions,\n    imageUrl: product.imageUrl,\n    consumerPrice: product.consumerPrice,\n    lastSalePrice: product.lastSalePrice,\n    lastSalePercent: product.lastSalePercent,\n    heartCount: product.heartCount,\n    heartOn: product.heartOn,\n    reviewCount: product.reviewCount,\n    reviewAveragePoint: product.reviewAveragePoint,\n    isCoupon: product.saleInfo.coupon,\n    isFreeShipping: product.freeShipping,\n    isNew: product.newProperty,\n    isSoldOut: product.soldOut,\n    frontCategories: (_a = product.frontCategories) == null ? void 0 : _a.map((category) => ({\n      largeCategoryCode: category.largeCode ?? 0,\n      largeCategoryName: category.largeName ?? \"\",\n      mediumCategoryCode: category.mediumCode ?? 0,\n      mediumCategoryName: category.mediumName ?? \"\",\n      smallCategoryCode: category.smallCode ?? 0,\n      smallCategoryName: category.smallName ?? \"\"\n    }))\n  };\n});\nconst formatProducts = (products) => products.map((product) => ({\n  frontBrand: {\n    frontBrandId: product.frontBrandId,\n    nameKor: product.frontBrandNameKor,\n    nameEng: product.frontBrandNameEng\n  },\n  productId: product.productId,\n  productName: product.productName,\n  subjectDescriptions: product.subjectDescriptions,\n  imageUrl: product.imageUrl,\n  consumerPrice: product.consumerPrice,\n  lastSalePrice: product.lastSalePrice,\n  lastSalePercent: product.lastSalePercent,\n  heartCount: product.heartCount,\n  heartOn: product.heartOn,\n  reviewCount: product.reviewCount,\n  reviewAveragePoint: product.reviewAveragePoint,\n  isCoupon: product.searchSale.coupon,\n  isFreeShipping: product.freeShipping,\n  isNew: product.newProperty,\n  isSoldOut: product.soldOut,\n  frontCategoryInfo: product.searchFrontCategoryList\n}));\nexport {\n  formatCollectionProduct2Product,\n  recommendApi\n};\n","const MOCK_PRODUCTS = [{\n  consumerPrice: 155e3,\n  imageUrl: \"/item/202502/11efe8378fbdcae28f0ab7d30031e3c9.jpg\",\n  heartCount: 2789,\n  reviewCount: 118,\n  lastSalePercent: 15,\n  lastSalePrice: 132525,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [\"[25SS]\"],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 1942207,\n  productName: \"보레알리스 2 NM2DR04A_BLK\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 269100100,\n    largeCategoryName: \"여성가방\",\n    mediumCategoryCode: 269106100,\n    mediumCategoryName: \"백팩\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 273100100,\n    largeCategoryName: \"남성가방\",\n    mediumCategoryCode: 273104100,\n    mediumCategoryName: \"백팩\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 273100100,\n    largeCategoryName: \"남성가방\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 269100100,\n    largeCategoryName: \"여성가방\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 169e3,\n  imageUrl: \"/item/202411/11efa7ab6d5d1ecf9316592337ae1aca.jpg\",\n  heartCount: 22,\n  reviewCount: 0,\n  lastSalePercent: 44,\n  lastSalePrice: 94640,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 0,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2389405,\n  productName: \"듀얼 백팩 NM2DQ06K_LBE\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 273100100,\n    largeCategoryName: \"남성가방\",\n    mediumCategoryCode: 273104100,\n    mediumCategoryName: \"백팩\",\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 159e3,\n  imageUrl: \"/item/202411/11efa7a8eb30739b9d18ef45b4791ed5.jpg\",\n  heartCount: 3926,\n  reviewCount: 476,\n  lastSalePercent: 10,\n  lastSalePrice: 143100,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 4.9,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 1634106,\n  productName: \"빅 샷 NM2DQ50A_BLK\",\n  isCoupon: false,\n  frontCategories: [{\n    largeCategoryCode: 273100100,\n    largeCategoryName: \"남성가방\",\n    mediumCategoryCode: 273104100,\n    mediumCategoryName: \"백팩\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 273100100,\n    largeCategoryName: \"남성가방\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 368e3,\n  imageUrl: \"/item/202501/11efc9657db7ebf58521852ca60f84fe.jpg\",\n  heartCount: 3710,\n  reviewCount: 200,\n  lastSalePercent: 0,\n  lastSalePrice: 368e3,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [\"[25SS]\"],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2714814,\n  productName: \"여성 노벨티 눕시 RDS 다운 자켓 NJ1DR80J_BLK\",\n  isCoupon: false,\n  frontCategories: [{\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 268102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 268102117,\n    smallCategoryName: \"숏패딩\"\n  }, {\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 268102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 149e3,\n  imageUrl: \"/item/202502/11efe1c52098184b8521d58f5330e571.jpg\",\n  heartCount: 169,\n  reviewCount: 2,\n  lastSalePercent: 15,\n  lastSalePrice: 127395,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2715548,\n  productName: \"보레알리스 2 NM2DQ52E_JBK\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 273100100,\n    largeCategoryName: \"남성가방\",\n    mediumCategoryCode: 273104100,\n    mediumCategoryName: \"백팩\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 273100100,\n    largeCategoryName: \"남성가방\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 109e3,\n  imageUrl: \"/item/202411/11efa7a909f8dae393166bd9acde4a3d.jpg\",\n  heartCount: 5482,\n  reviewCount: 403,\n  lastSalePercent: 15,\n  lastSalePrice: 93195,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 1744341,\n  productName: \"미니샷 NM2DQ53A_BLK\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 273100100,\n    largeCategoryName: \"남성가방\",\n    mediumCategoryCode: 273104100,\n    mediumCategoryName: \"백팩\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 273100100,\n    largeCategoryName: \"남성가방\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 398e3,\n  imageUrl: \"/item/202502/11efe1c50372b3098521eff5f021c0b7.jpg\",\n  heartCount: 4450,\n  reviewCount: 500,\n  lastSalePercent: 0,\n  lastSalePrice: 398e3,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2158524,\n  productName: \"노벨티 눕시 RDS 다운 자켓 NJ1DQ51J_BLK\",\n  isCoupon: false,\n  frontCategories: [{\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 272102104,\n    smallCategoryName: \"숏패딩\"\n  }, {\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 268116100,\n    mediumCategoryName: \"EXCLUSIVE\",\n    smallCategoryCode: 268116103,\n    smallCategoryName: \"아우터\"\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272111100,\n    mediumCategoryName: \"EXCLUSIVE\",\n    smallCategoryCode: 272111103,\n    smallCategoryName: \"아우터\"\n  }, {\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 268116100,\n    mediumCategoryName: \"EXCLUSIVE\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272111100,\n    mediumCategoryName: \"EXCLUSIVE\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 199e3,\n  imageUrl: \"/item/202502/11efe9a806bbc08c8f0af1b717708006.jpg\",\n  heartCount: 1893,\n  reviewCount: 94,\n  lastSalePercent: 5,\n  lastSalePrice: 189050,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [\"[25SS]\"],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2326012,\n  productName: \"눕시 온볼 베스트 NV3NR50A_BLK\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 272102106,\n    smallCategoryName: \"베스트\"\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 269e3,\n  imageUrl: \"/item/202412/11efb924aca3ec8ead1bbdf9e249e357.jpg\",\n  heartCount: 172,\n  reviewCount: 20,\n  lastSalePercent: 0,\n  lastSalePrice: 269e3,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2987892,\n  productName: \"남성 1996 에코 눕시 베스트 NV1DQ55A_BLK\",\n  isCoupon: false,\n  frontCategories: [{\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 268102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 268102117,\n    smallCategoryName: \"숏패딩\"\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 272102104,\n    smallCategoryName: \"숏패딩\"\n  }]\n}, {\n  consumerPrice: 398e3,\n  imageUrl: \"/item/202501/11efd3c8584dfacb85218560bb0f3ad4.jpg\",\n  heartCount: 4982,\n  reviewCount: 369,\n  lastSalePercent: 0,\n  lastSalePrice: 398e3,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [\"[25SS]\"],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2276799,\n  productName: \"노벨티 눕시 다운 자켓 (RDS) NJ1DR50K_RBK\",\n  isCoupon: false,\n  frontCategories: [{\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 272102104,\n    smallCategoryName: \"숏패딩\"\n  }, {\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 268102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 268102117,\n    smallCategoryName: \"숏패딩\"\n  }, {\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 268116100,\n    mediumCategoryName: \"EXCLUSIVE\",\n    smallCategoryCode: 268116103,\n    smallCategoryName: \"아우터\"\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272111100,\n    mediumCategoryName: \"EXCLUSIVE\",\n    smallCategoryCode: 272111103,\n    smallCategoryName: \"아우터\"\n  }, {\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 268116100,\n    mediumCategoryName: \"EXCLUSIVE\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272111100,\n    mediumCategoryName: \"EXCLUSIVE\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 268102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 178e3,\n  imageUrl: \"/item/202411/11efa7d791842b119d18ff2e784a1000.jpg\",\n  heartCount: 216,\n  reviewCount: 3,\n  lastSalePercent: 34,\n  lastSalePrice: 118370,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2885368,\n  productName: \"밴든 자켓 NJ3BQ53K_GRY\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 272102129,\n    smallCategoryName: \"바람막이\"\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 178e3,\n  imageUrl: \"/item/202411/11efa7d93984c9559d1821d6fcb2b98b.jpg\",\n  heartCount: 274,\n  reviewCount: 2,\n  lastSalePercent: 34,\n  lastSalePrice: 118370,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2901769,\n  productName: \"밴든 자켓 NJ3BQ53L_BBR\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 272102104,\n    smallCategoryName: \"숏패딩\"\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 165e3,\n  imageUrl: \"/item/202411/11efa7ba136c129b9d18835acf182eb2.jpg\",\n  heartCount: 378,\n  reviewCount: 12,\n  lastSalePercent: 36,\n  lastSalePrice: 105600,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2652594,\n  productName: \"어센드 엘티 25 NM2SQ11A_BLK\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 273100100,\n    largeCategoryName: \"남성가방\",\n    mediumCategoryCode: 273104100,\n    mediumCategoryName: \"백팩\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 273100100,\n    largeCategoryName: \"남성가방\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 179e3,\n  imageUrl: \"/item/202412/11efc64ed7874620ad1be9f7ff63eea8.jpg\",\n  heartCount: 98,\n  reviewCount: 7,\n  lastSalePercent: 15,\n  lastSalePrice: 153045,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [\"[25SS]\"],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 3005503,\n  productName: \"슈퍼팩 투 NM2DR01J_BLK\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 269100100,\n    largeCategoryName: \"여성가방\",\n    mediumCategoryCode: 269106100,\n    mediumCategoryName: \"백팩\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 273100100,\n    largeCategoryName: \"남성가방\",\n    mediumCategoryCode: 273104100,\n    mediumCategoryName: \"백팩\",\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 149e3,\n  imageUrl: \"/item/202411/11efa7e13b9316619316a5c4947fa678.jpg\",\n  heartCount: 774,\n  reviewCount: 35,\n  lastSalePercent: 41,\n  lastSalePrice: 88655,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2949339,\n  productName: \"여성 스트링 EX 부띠 NS99Q57J_RBK\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 270100100,\n    largeCategoryName: \"여성신발\",\n    mediumCategoryCode: 270103100,\n    mediumCategoryName: \"부츠\",\n    smallCategoryCode: 270103101,\n    smallCategoryName: \"앵클 부츠\"\n  }]\n}, {\n  consumerPrice: 269e3,\n  imageUrl: \"/item/202411/11efad615d9f79558521b5ff60f4e8a3.jpg\",\n  heartCount: 640,\n  reviewCount: 6,\n  lastSalePercent: 44,\n  lastSalePrice: 151050,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2923736,\n  productName: \"여성 써밋 히트라인 자켓 NJ3NQ82A_BLK\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 268102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 268102118,\n    smallCategoryName: \"경량패딩\"\n  }]\n}, {\n  consumerPrice: 178e3,\n  imageUrl: \"/item/202411/11efa7d9f79a488d9316d7182d8c60f0.jpg\",\n  heartCount: 905,\n  reviewCount: 7,\n  lastSalePercent: 24,\n  lastSalePrice: 135280,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 4.5,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2906821,\n  productName: \"여성 에센셜 라이트 브이모션 자켓 NJ3NQ80J_CRE\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 268102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 268102118,\n    smallCategoryName: \"경량패딩\"\n  }]\n}, {\n  consumerPrice: 418e3,\n  imageUrl: \"/item/202411/11efad4449d5bb7f8521a9c74e484920.jpg\",\n  heartCount: 971,\n  reviewCount: 28,\n  lastSalePercent: 15,\n  lastSalePrice: 357390,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2969341,\n  productName: \"여성 노벨티 눕시 미드 다운 자켓 (RDS) NJ1DQ94J_BLK\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 268100100,\n    largeCategoryName: \"여성의류\",\n    mediumCategoryCode: 268102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 268102117,\n    smallCategoryName: \"숏패딩\"\n  }]\n}, {\n  consumerPrice: 89e3,\n  imageUrl: \"/item/202411/11efa7abf5e841e39d18072019049ade.jpg\",\n  heartCount: 3355,\n  reviewCount: 175,\n  lastSalePercent: 15,\n  lastSalePrice: 76095,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2417483,\n  productName: \"보레알리스 미니 팩 NM2DQ55A_BLK\",\n  isCoupon: true,\n  frontCategories: [{\n    largeCategoryCode: 269100100,\n    largeCategoryName: \"여성가방\",\n    mediumCategoryCode: 269106100,\n    mediumCategoryName: \"백팩\",\n    smallCategoryCode: 100100100\n  }, {\n    largeCategoryCode: 269100100,\n    largeCategoryName: \"여성가방\",\n    mediumCategoryCode: 100100100,\n    smallCategoryCode: 100100100\n  }]\n}, {\n  consumerPrice: 399e3,\n  imageUrl: \"/item/202411/11efa5991c716fa3afbc4f7994967cf8.jpg\",\n  heartCount: 807,\n  reviewCount: 30,\n  lastSalePercent: 30,\n  lastSalePrice: 279300,\n  isSoldOut: false,\n  isFreeShipping: true,\n  isNew: false,\n  reviewAveragePoint: 5,\n  heartOn: true,\n  subjectDescriptions: [\"[29CM 단독]\"],\n  frontBrand: {\n    frontBrandId: 7789,\n    nameKor: \"노스페이스\",\n    nameEng: \"THE NORTH FACE\"\n  },\n  productId: 2916253,\n  productName: \"써밋 마테호른 RDS 다운 자켓 NJ1DQ90A_RBK\",\n  isCoupon: false,\n  frontCategories: [{\n    largeCategoryCode: 272100100,\n    largeCategoryName: \"남성의류\",\n    mediumCategoryCode: 272102100,\n    mediumCategoryName: \"아우터\",\n    smallCategoryCode: 272102104,\n    smallCategoryName: \"숏패딩\"\n  }]\n}];\nconst createMockProductList = (productIdList) => productIdList.map((productId, index) => ({\n  ...MOCK_PRODUCTS[index % MOCK_PRODUCTS.length],\n  productId\n  // 입력된 ID로 덮어쓰기\n}));\nconst createMockCollection = (collectionId, index) => ({\n  collectionId,\n  title: `원브랜드데이 ${index + 1}일차`,\n  description: \"오늘이 마지막! 전에 없던 강력한 혜택을 붙잡아요\",\n  displayStartAt: \"2026-01-21T00:00:00.000+09:00\",\n  displayEndAt: \"2026-01-21T23:59:59.999+09:00\",\n  couponId: 3e5 + index,\n  coverImageUrl: \"https://img.29cm.co.kr/next-brand/2025/08/29/4c2abdbffea0465ab184c13a12e07d31_20250829132052.jpg\",\n  productGroupList: [{\n    collectionProductGroupId: collectionId * 100 + 1,\n    title: \"BEST\",\n    sort: \"BEST\"\n  }, {\n    collectionProductGroupId: collectionId * 100 + 2,\n    title: \"아우터\",\n    sort: \"BEST\"\n  }, {\n    collectionProductGroupId: collectionId * 100 + 3,\n    title: \"상의\",\n    sort: \"BEST\"\n  }, {\n    collectionProductGroupId: collectionId * 100 + 4,\n    title: \"하의\",\n    sort: \"BEST\"\n  }, {\n    collectionProductGroupId: collectionId * 100 + 5,\n    title: \"원피스\",\n    sort: \"BEST\"\n  }, {\n    collectionProductGroupId: collectionId * 100 + 6,\n    title: \"가방/잡화\",\n    sort: \"BEST\"\n  }]\n});\nexport {\n  MOCK_PRODUCTS,\n  createMockCollection,\n  createMockProductList\n};\n","import { useMemo } from \"react\";\nimport useSWR from \"../../../node_modules/swr/core/dist/index.js\";\nimport useSWRInfinite from \"../../../node_modules/swr/infinite/dist/index.js\";\nimport { keywordCollectionApi } from \"../../../apis/keyword-collections/KeywordCollectionApiService.js\";\nimport { SortType } from \"../../../types/models/sort.js\";\nimport { bestApi } from \"../../../apis/best/BestApiService.js\";\nimport { displayBffApi } from \"../../../apis/display-bff/DisplayBffApiService.js\";\nimport { DisplayBffSortType } from \"../../../apis/display-bff/DisplayBffApiService.types.js\";\nimport { framerApi } from \"../../../apis/framer/FramerApiService.js\";\nimport { preuserApi } from \"../../../apis/preuser/PreuserApiService.js\";\nimport { recommendApi } from \"../../../apis/recommend/RecommendApiService.js\";\nimport \"../../../hooks/stores/content/content.store.js\";\nimport \"../../../utils/event-properties/source.js\";\nimport { isCanvas } from \"../../../utils/framer/isCanvas.js\";\nimport { isFramerPreview } from \"../../../utils/framer/isFramerPreview.js\";\nimport { splitToNumberArray } from \"../../../utils/splitToNumberArray.js\";\nimport { MOCK_PRODUCTS } from \"../mock.js\";\nimport { QueryType, RankingType } from \"../types.js\";\nimport { createMolocoKey } from \"../utils/key.js\";\nimport last from \"../../../node_modules/lodash-es/last.js\";\nconst BRAND_CURATION_PRODUCTS_MAX_SIZE = 60;\nconst RECOMMENDATION_PRODUCTS_MAX_SIZE = 60;\nconst RANKING_PRODUCTS_PER_REQUEST = 24;\nconst RANKING_PRODUCTS_MAX_SIZE = 99;\nconst RANKING_PRODUCTS_DEFAULT_AGE = 30;\nconst isRankingProductsQuery = (query) => query.type === QueryType.Ranking || query.type === QueryType.CustomCategory;\nconst getRankingFetchPageSize = (pageIndex) => {\n  const remaining = RANKING_PRODUCTS_MAX_SIZE - pageIndex * RANKING_PRODUCTS_PER_REQUEST;\n  return Math.max(Math.min(RANKING_PRODUCTS_PER_REQUEST, remaining), 0);\n};\nconst getRankingProductsHasNext = (pageIndex) => (pageIndex + 1) * RANKING_PRODUCTS_PER_REQUEST < RANKING_PRODUCTS_MAX_SIZE;\nconst getInitialPaginationOptions = (size) => ({\n  page: 1,\n  size\n});\nconst useMolocoProductsQuery = (options) => {\n  const {\n    enabled: _enabled = true,\n    query\n  } = options;\n  const enabled = _enabled && query !== void 0;\n  const cacheKey = enabled && query ? createMolocoKey(query) : null;\n  const {\n    data,\n    isLoading,\n    ...rest\n  } = useSWR(cacheKey, () => fetchMolocoItems(query));\n  const products = useMemo(() => (data == null ? void 0 : data.products) ?? [], [data]);\n  return {\n    isLoading: isLoading || !enabled,\n    products,\n    hasNext: false,\n    page: 1,\n    fetchNextPage: () => {\n    },\n    ...rest\n  };\n};\nconst useProductsQuery = (options) => {\n  const {\n    enabled: _enabled = true,\n    query,\n    size: _size,\n    userSegment\n  } = options;\n  const enabled = _enabled && query !== void 0;\n  const {\n    isLoading,\n    isValidating,\n    data,\n    size,\n    setSize,\n    ...rest\n  } = useSWRInfinite(getKey(query, getInitialPaginationOptions(_size), enabled), ({\n    key\n  }) => queryProducts(key.query, userSegment, key.pagination), {\n    keepPreviousData: true,\n    revalidateFirstPage: false\n  });\n  const products = useMemo(() => {\n    const fetchedProducts = (data == null ? void 0 : data.flatMap((item) => item.products)) ?? [];\n    if (query !== void 0 && isRankingProductsQuery(query)) {\n      return fetchedProducts.slice(0, RANKING_PRODUCTS_MAX_SIZE);\n    }\n    return fetchedProducts;\n  }, [data, query]);\n  const {\n    hasNext = false\n  } = last(data) ?? {};\n  const fetchNextPage = () => {\n    if (!hasNext || isValidating) {\n      return;\n    }\n    setSize((prev) => prev + 1);\n  };\n  return {\n    isLoading: isLoading || !enabled,\n    isValidating,\n    products,\n    hasNext,\n    page: size,\n    fetchNextPage,\n    ...rest\n  };\n};\nconst fetchProducts = async (query, options) => {\n  if (!query.productIds) {\n    return {\n      hasNext: false,\n      products: []\n    };\n  }\n  const {\n    page,\n    size\n  } = options;\n  const offset = page * size;\n  const productIds = splitToNumberArray(query.productIds);\n  const skipped = productIds.slice(offset, productIds.length);\n  const took = skipped.slice(0, size);\n  const hasNext = skipped.length > took.length;\n  const products = await framerApi.getFramerProductListV2(took);\n  return {\n    hasNext,\n    products\n  };\n};\nconst fetchKeywordCollectionProducts = async (query, options) => {\n  var _a, _b;\n  if (!query.keywordCollectionId) {\n    return {\n      hasNext: false,\n      products: []\n    };\n  }\n  const keywordCollectionId = Number(query.keywordCollectionId);\n  const {\n    hasNext,\n    resultList\n  } = await keywordCollectionApi.getCollectionProducts({\n    collectionId: keywordCollectionId,\n    productGroupId: ((_a = query.selectedProductGroup) == null ? void 0 : _a.id) ?? await fetchFirstProductGroupId(keywordCollectionId),\n    sort: ((_b = query.selectedProductGroup) == null ? void 0 : _b.sort) ?? SortType.FEATURED,\n    ...options\n  });\n  return {\n    hasNext,\n    products: resultList\n  };\n};\nconst fetchFirstProductGroupId = async (keywordCollectionId) => {\n  const {\n    data\n  } = await keywordCollectionApi.getKeywordCollection(keywordCollectionId);\n  const [{\n    productGroupId\n  }] = data.productGroups;\n  return productGroupId;\n};\nconst fetchBrandCurationProducts = async (query, options) => {\n  if (!query.brandId) {\n    return {\n      hasNext: false,\n      products: []\n    };\n  }\n  const tagIds = splitToNumberArray(query.brandCurationTagIds);\n  const {\n    products\n  } = await bestApi.getRankedProducts({\n    facetGroupInput: {\n      brandFacetInputs: [{\n        frontBrandNo: query.brandId\n      }],\n      rankingFacetInput: {\n        type: \"POPULARITY\"\n      },\n      periodFacetInput: {\n        type: \"HOURLY\",\n        order: \"DESC\"\n      },\n      stockFacetInputs: [{\n        type: \"IN_STOCK\"\n      }],\n      tagFacetInputs: tagIds.map((tagId) => ({\n        tagId\n      }))\n    },\n    pagination: options\n  });\n  const hasNext = options.page * options.size < BRAND_CURATION_PRODUCTS_MAX_SIZE;\n  return {\n    hasNext,\n    products\n  };\n};\nconst fetchRecommendationProducts = async (query) => {\n  if (!query.recommendationTagIds) {\n    return {\n      hasNext: false,\n      products: []\n    };\n  }\n  if (isCanvas() || isFramerPreview()) {\n    return {\n      hasNext: false,\n      products: MOCK_PRODUCTS\n    };\n  }\n  const tagIds = splitToNumberArray(query.recommendationTagIds).join(\",\");\n  const {\n    data\n  } = await recommendApi.getRecommendedProductsByTagId({\n    limit: RECOMMENDATION_PRODUCTS_MAX_SIZE,\n    tagIds: tagIds || void 0\n  });\n  return {\n    // NOTE(임규민): 개인화 추천 API 는 페이지네이션을 지원하지 않으므로 hasNext 를 false 로 둔다.\n    hasNext: false,\n    products: data.products\n  };\n};\nconst fetchRankingProducts = async (query, userSegment, options) => {\n  if (!query.rankingTagIds) {\n    return {\n      hasNext: false,\n      products: []\n    };\n  }\n  const isTrending = query.rankingType === RankingType.Trending;\n  const hasLargeCategoryId = query.largeCategoryId !== void 0;\n  const hasMiddleCategoryId = query.middleCategoryId !== void 0;\n  const tagIds = splitToNumberArray(query.rankingTagIds);\n  const pageSize = getRankingFetchPageSize(options.page);\n  if (pageSize <= 0) {\n    return {\n      hasNext: false,\n      products: []\n    };\n  }\n  const {\n    products\n  } = await bestApi.getRankedProducts({\n    facetGroupInput: {\n      categoryFacetInputs: hasLargeCategoryId ? [{\n        largeId: query.largeCategoryId,\n        ...hasMiddleCategoryId ? {\n          middleId: query.middleCategoryId\n        } : void 0\n      }] : [],\n      tagFacetInputs: tagIds.map((tagId) => ({\n        tagId\n      })),\n      rankingFacetInput: {\n        type: query.rankingType\n      },\n      periodFacetInput: {\n        type: isTrending ? query.trendingPeriodType : query.popularityPeriodType,\n        order: \"DESC\"\n      }\n    },\n    userSegment: {\n      gender: userSegment.gender ?? \"F\",\n      age: RANKING_PRODUCTS_DEFAULT_AGE\n    },\n    pagination: {\n      ...options,\n      page: options.page,\n      size: pageSize\n    }\n  });\n  return {\n    hasNext: getRankingProductsHasNext(options.page),\n    products\n  };\n};\nconst fetchCouponCollectionProducts = async (query, options) => {\n  var _a;\n  if (!query.couponCollectionId) {\n    return {\n      hasNext: false,\n      products: []\n    };\n  }\n  const {\n    data\n  } = await displayBffApi.getListingItems({\n    pageType: \"COUPON\",\n    sortType: DisplayBffSortType.Recommended,\n    facets: {\n      couponFacetInputs: [{\n        couponId: ((_a = query.coupon) == null ? void 0 : _a.couponId) ?? 0\n      }]\n    },\n    pageRequest: {\n      page: options.page + 1,\n      size: options.size\n    }\n  });\n  return {\n    hasNext: data.pagination.hasNext,\n    products: data.list.map((item) => ({\n      frontBrand: {\n        frontBrandId: item.itemInfo.brandId,\n        nameKor: item.itemInfo.brandName,\n        nameEng: \"\"\n      },\n      productId: item.itemId,\n      productName: item.itemInfo.productName,\n      subjectDescriptions: [],\n      imageUrl: item.itemInfo.thumbnailUrl,\n      consumerPrice: item.itemInfo.originalPrice,\n      lastSalePrice: item.itemInfo.displayPrice,\n      lastSalePercent: item.itemInfo.saleRate,\n      heartCount: item.itemInfo.likeCount,\n      heartOn: item.itemInfo.isLiked,\n      reviewAveragePoint: item.itemInfo.reviewScore,\n      reviewCount: item.itemInfo.reviewCount,\n      isCoupon: false,\n      isFreeShipping: false,\n      isNew: false,\n      isSoldOut: item.itemInfo.isSoldOut,\n      frontCategories: item.itemInfo.extraInfo.categories.map((category) => ({\n        largeCategoryCode: category.largeCategoryCode ?? 0,\n        mediumCategoryCode: category.mediumCategoryCode ?? 0,\n        smallCategoryCode: category.smallCategoryCode ?? 0\n      }))\n    }))\n  };\n};\nconst fetchPreuserProducts = async (query) => {\n  if (!query.preuserIds) {\n    return {\n      hasNext: false,\n      products: []\n    };\n  }\n  const preuserIds = splitToNumberArray(query.preuserIds);\n  const {\n    products\n  } = await preuserApi.getPreuser(preuserIds);\n  return {\n    hasNext: false,\n    products\n  };\n};\nconst fetchMolocoItems = async (query) => {\n  if (!query.tagId) {\n    return {\n      hasNext: false,\n      products: []\n    };\n  }\n  if (isCanvas() || isFramerPreview()) {\n    const MOCK_TABS = [\"추천\", \"신상품\", \"베스트\"];\n    const allProducts2 = MOCK_TABS.flatMap((tabName) => MOCK_PRODUCTS.map((product) => ({\n      ...product,\n      molocoTab: tabName\n    })));\n    return {\n      hasNext: false,\n      products: allProducts2\n    };\n  }\n  const {\n    categories\n  } = query;\n  const tabs = categories == null ? void 0 : categories.map((category) => ({\n    name: category.categoryName.trim(),\n    categoryCodes: splitToNumberArray(category.categoryId)\n  })).filter((tab) => tab.name.length > 0 && tab.categoryCodes.length > 0);\n  const {\n    data\n  } = await displayBffApi.getItems({\n    tagIds: [Number(query.tagId)],\n    inventoryId: query.inventoryId || \"\",\n    pageId: query.pageId || \"\",\n    tabs\n  });\n  const allProducts = data.tabs.flatMap((tab) => tab.items.map((item) => ({\n    // 기본 상품 정보 매핑\n    frontBrand: {\n      frontBrandId: item.itemInfo.brandId,\n      nameKor: item.itemInfo.brandName,\n      nameEng: \"\"\n    },\n    productId: item.itemId,\n    productName: item.itemInfo.productName,\n    subjectDescriptions: [],\n    imageUrl: item.itemInfo.thumbnailUrl,\n    consumerPrice: item.itemInfo.originalPrice,\n    lastSalePrice: item.itemInfo.displayPrice,\n    lastSalePercent: item.itemInfo.saleRate,\n    heartCount: item.itemInfo.likeCount,\n    heartOn: item.itemInfo.isLiked,\n    reviewAveragePoint: item.itemInfo.reviewScore,\n    reviewCount: item.itemInfo.reviewCount,\n    isCoupon: false,\n    isFreeShipping: false,\n    isNew: false,\n    isSoldOut: item.itemInfo.isSoldOut,\n    frontCategories: item.itemInfo.extraInfo.categories.map((cat) => ({\n      largeCategoryCode: cat.largeCategoryCode,\n      mediumCategoryCode: cat.mediumCategoryCode,\n      smallCategoryCode: cat.smallCategoryCode\n    })),\n    // 메타데이터: 이 상품이 어느 탭(facet)에서 온 것인지 표시\n    // 응답 탭명을 사용해 TagsModule의 facetName과 일치시킨다.\n    molocoTab: tab.text,\n    // Moloco 트래커 이벤트 데이터 (impression/onClick)\n    itemEvent: item.itemEvent\n  })));\n  return {\n    hasNext: false,\n    products: allProducts\n  };\n};\nconst fetchRankingCategoryProducts = async (query, options) => {\n  var _a;\n  const categoryIds = (_a = query.categoryIds) == null ? void 0 : _a.map((category) => ({\n    largeId: Number(category.largeCategoryId),\n    ...category.middleCategoryId ? {\n      middleId: Number(category.middleCategoryId)\n    } : void 0\n  }));\n  const hasLargeCategoryId = categoryIds == null ? void 0 : categoryIds.some((category) => category.largeId !== void 0);\n  const tagIds = query.recommendationTagIds ? splitToNumberArray(query.recommendationTagIds) : [];\n  const pageSize = getRankingFetchPageSize(options.page);\n  if (pageSize <= 0) {\n    return {\n      hasNext: false,\n      products: []\n    };\n  }\n  const {\n    products\n  } = await bestApi.getRankedProducts({\n    facetGroupInput: {\n      categoryFacetInputs: hasLargeCategoryId ? categoryIds : [],\n      tagFacetInputs: tagIds.length > 0 ? tagIds.map((tagId) => ({\n        tagId\n      })) : void 0,\n      rankingFacetInput: {\n        type: query.rankingType\n      },\n      periodFacetInput: {\n        type: query.popularityPeriodType,\n        order: \"DESC\"\n      }\n    },\n    userSegment: {\n      gender: query.gender === \"all\" ? void 0 : query.gender,\n      age: query.age === \"all\" ? void 0 : Number(query.age)\n    },\n    pagination: {\n      ...options,\n      page: options.page,\n      size: pageSize\n    }\n  });\n  return {\n    hasNext: getRankingProductsHasNext(options.page),\n    products\n  };\n};\nconst queryProducts = (query, userSegment, options) => {\n  switch (query.type) {\n    case QueryType.Product:\n      return fetchProducts(query, options);\n    case QueryType.KeywordCollection:\n      return fetchKeywordCollectionProducts(query, options);\n    case QueryType.BrandCuration:\n      return fetchBrandCurationProducts(query, options);\n    case QueryType.Recommendation:\n      return fetchRecommendationProducts(query);\n    case QueryType.Ranking:\n      return fetchRankingProducts(query, userSegment, options);\n    case QueryType.CouponCollection:\n      return fetchCouponCollectionProducts(query, options);\n    case QueryType.Preuser:\n      return fetchPreuserProducts(query);\n    case QueryType.CustomCategory:\n      return fetchRankingCategoryProducts(query, options);\n    case QueryType.Moloco:\n      return fetchMolocoItems(query);\n    default:\n      return {\n        hasNext: false,\n        products: []\n      };\n  }\n};\nconst getKey = (query, options, enabled) => (pageIndex) => {\n  if (!enabled || query === void 0) {\n    return null;\n  }\n  if (isRankingProductsQuery(query)) {\n    const pageSize = getRankingFetchPageSize(pageIndex);\n    if (pageSize <= 0) {\n      return null;\n    }\n    return {\n      key: {\n        query,\n        pagination: {\n          page: pageIndex,\n          size: pageSize\n        }\n      }\n    };\n  }\n  return {\n    key: {\n      query,\n      // 전체 query 사용\n      pagination: {\n        ...options,\n        page: pageIndex\n      }\n    }\n  };\n};\nexport {\n  useMolocoProductsQuery,\n  useProductsQuery\n};\n","import { useSegment } from \"../../../@shared/providers/SegmentProvider/SegmentProvider.js\";\nimport { QueryType } from \"../../types.js\";\nimport \"../../../systems/curations/IntersectionProvider/IntersectionProvider.js\";\nimport { useIntersectionContext } from \"../../../systems/curations/IntersectionProvider/IntersectionProvider.hooks.js\";\nimport \"react\";\nimport \"../../../../node_modules/@firebase/analytics/dist/esm/index.esm2017.js\";\nimport \"../../../../node_modules/firebase/app/dist/esm/index.esm.js\";\nimport { useCurrentUser } from \"../../../../hooks/useCurrentUser.js\";\nimport \"framer\";\nimport \"../../../../node_modules/@29cm/snowplow/dist/esm/core/snowplow.js\";\nimport \"../../../../node_modules/swr/core/dist/index.js\";\nimport \"../../../../apis/user-segment/CategoryFirstOrderApiService.js\";\nimport \"../../../../config/index.js\";\nimport \"../../../../node_modules/js-cookie/dist/js.cookie.js\";\nimport \"../../../../apis/highlight-products/HighlightProductsApiService.js\";\nimport \"../../../../apis/brand-mix/BrandMixApiService.js\";\nimport \"../../../../apis/one-brand-days/OneBrandDaysApiService.js\";\nimport \"../../../../apis/taste-sharing/TasteSharingApiService.js\";\nimport \"../../../../apis/user/UserApiService.js\";\nimport \"../../../../apis/preuser/PreuserApiService.js\";\nimport \"../../../../node_modules/vite-plugin-node-polyfills/shims/buffer/dist/index.js\";\nimport \"../../../../node_modules/swr/mutation/dist/index.js\";\nimport \"../../../../hooks/stores/content/content.store.js\";\nimport \"../../../../hooks/stores/dialog/dialog.store.js\";\nimport \"../../../../hooks/stores/global-layout/global-layout.store.js\";\nimport \"../../../../hooks/stores/toast/toast.store.js\";\nimport \"../../../@shared/providers/ThemeProvider/ThemeProvider.js\";\nimport \"../../../@shared/providers/BreakpointProvider/BreakpointProvider.js\";\nimport \"../../../../hooks/stores/bottom-sheet/bottom-sheet.store.js\";\nimport \"react/jsx-runtime\";\nimport \"react-dom\";\nimport \"../../../systems/Dialog/Dialog.module.css.js\";\nimport \"framer-motion\";\nimport \"../../../../containers/DialogContainer/DialogContainer.emitter.js\";\nimport \"../../../../hooks/useFeatureFlag.js\";\nimport \"../../../../utils/redirectLogin.js\";\nimport \"../../../../utils/event-properties/source.js\";\nimport { useSendProductIds } from \"../../../../hooks/product/useSendProductIds.js\";\nimport \"../../../../constants/snowplow/snowplowSchema.js\";\nimport \"../ProductsElementProvider/ProductsElementProvider.js\";\nimport { useProductsElementContext } from \"../ProductsElementProvider/ProductsElementProvider.hooks.js\";\nimport { useMolocoProductsQuery, useProductsQuery } from \"../ProductsModule.hooks.js\";\nconst useProducts = () => {\n  const user = useCurrentUser();\n  const {\n    isInView\n  } = useIntersectionContext();\n  const {\n    query,\n    size\n  } = useProductsElementContext();\n  const {\n    isVisible\n  } = useSegment();\n  const isMoloco = (query == null ? void 0 : query.type) === QueryType.Moloco;\n  const molocoOptions = {\n    query,\n    size,\n    userSegment: user,\n    enabled: isMoloco && isInView && isVisible\n  };\n  const infiniteOptions = {\n    query,\n    size,\n    userSegment: user,\n    enabled: !isMoloco && isInView && isVisible\n  };\n  const molocoResult = useMolocoProductsQuery(molocoOptions);\n  const infiniteResult = useProductsQuery(infiniteOptions);\n  return isMoloco ? molocoResult : infiniteResult;\n};\nconst useSendProductsElementIds = (query) => {\n  useSendProductIds(getProductIds(query));\n};\nconst getProductIds = (query) => {\n  if (!query) {\n    return \"\";\n  }\n  switch (query.type) {\n    case QueryType.Product:\n      return query.productIds;\n    default:\n      return \"\";\n  }\n};\nexport {\n  useProducts,\n  useSendProductsElementIds\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { Button as Default } from \"../../../../../@shared/Button/Button.js\";\nimport { useProducts } from \"../../ProductsElement.hooks.js\";\nimport \"react\";\nimport \"../../../../../../node_modules/@firebase/analytics/dist/esm/index.esm2017.js\";\nimport \"../../../../../../node_modules/firebase/app/dist/esm/index.esm.js\";\nimport \"../../../../../../node_modules/swr/core/dist/index.js\";\nimport \"../../../../../../apis/user-segment/CategoryFirstOrderApiService.js\";\nimport \"../../../../../../config/index.js\";\nimport \"../../../../../../node_modules/js-cookie/dist/js.cookie.js\";\nimport \"../../../../../../apis/highlight-products/HighlightProductsApiService.js\";\nimport \"../../../../../../apis/brand-mix/BrandMixApiService.js\";\nimport \"../../../../../../apis/one-brand-days/OneBrandDaysApiService.js\";\nimport \"../../../../../../apis/taste-sharing/TasteSharingApiService.js\";\nimport \"../../../../../../apis/user/UserApiService.js\";\nimport \"../../../../../../apis/preuser/PreuserApiService.js\";\nimport \"../../../../../../node_modules/vite-plugin-node-polyfills/shims/buffer/dist/index.js\";\nimport \"framer\";\nimport \"../../../../../../node_modules/@29cm/snowplow/dist/esm/core/snowplow.js\";\nimport \"../../../../../../node_modules/swr/mutation/dist/index.js\";\nimport \"../../../../../../hooks/stores/content/content.store.js\";\nimport \"../../../../../../hooks/stores/dialog/dialog.store.js\";\nimport \"../../../../../../hooks/stores/global-layout/global-layout.store.js\";\nimport \"../../../../../../hooks/stores/toast/toast.store.js\";\nimport { useTheme } from \"../../../../../../hooks/useTheme.js\";\nimport \"../../../../../@shared/providers/BreakpointProvider/BreakpointProvider.js\";\nimport \"../../../../../../hooks/stores/bottom-sheet/bottom-sheet.store.js\";\nimport \"react-dom\";\nimport \"../../../../../systems/Dialog/Dialog.module.css.js\";\nimport \"framer-motion\";\nimport \"../../../../../../containers/DialogContainer/DialogContainer.emitter.js\";\nimport \"../../../../../../hooks/useFeatureFlag.js\";\nimport \"../../../../../../utils/redirectLogin.js\";\nimport \"../../../../../../utils/event-properties/source.js\";\nconst ExpandButtonElement = ({\n  pagination,\n  style,\n  ...rest\n}) => {\n  const theme = useTheme();\n  const {\n    page,\n    fetchNextPage,\n    hasNext\n  } = useProducts();\n  const {\n    button,\n    gap\n  } = pagination;\n  const text = button.texts[page - 1];\n  if (text === void 0 || !hasNext) {\n    return null;\n  }\n  return /* @__PURE__ */ jsx(\"div\", { ...rest, style: {\n    ...containerStyle,\n    marginTop: gap,\n    ...style\n  }, children: /* @__PURE__ */ jsx(Default, { ...button, theme, onClick: fetchNextPage, children: text }) });\n};\nconst containerStyle = {\n  display: \"flex\",\n  justifyContent: \"center\",\n  width: \"100%\"\n};\nexport {\n  ExpandButtonElement\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { PaginationType } from \"../../../ProductsModule.types.js\";\nimport { ExpandButtonElement } from \"../ExpandButtonElement/ExpandButtonElement.js\";\nconst VerticalPaginationElement = ({\n  pagination,\n  ...rest\n}) => {\n  if (pagination !== void 0) {\n    switch (pagination.type) {\n      case PaginationType.Default:\n        return null;\n      case PaginationType.ExpandButton:\n        return /* @__PURE__ */ jsx(ExpandButtonElement, { ...rest, pagination });\n      case PaginationType.None:\n        return null;\n    }\n  }\n  return null;\n};\nexport {\n  VerticalPaginationElement\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { ScrollDirection } from \"../../ProductsModule.types.js\";\nimport { VerticalPaginationElement } from \"./VerticalPaginationElement/VerticalPaginationElement.js\";\nconst PaginationElement = ({\n  layout,\n  ...rest\n}) => {\n  switch (layout.direction) {\n    case ScrollDirection.Vertical:\n      return /* @__PURE__ */ jsx(VerticalPaginationElement, { ...rest, pagination: layout.verticalPagination });\n    default:\n      return null;\n  }\n};\nexport {\n  PaginationElement\n};\n","import \"../../../../hooks/stores/content/content.store.js\";\nimport \"../../../../utils/event-properties/source.js\";\nimport { isCanvas } from \"../../../../utils/framer/isCanvas.js\";\nimport \"framer\";\nimport \"react\";\nimport { ScrollDirection, PaginationType } from \"../ProductsModule.types.js\";\nimport { PRODUCTS_PER_REQUEST } from \"../ProductsModule.constants.js\";\nconst getScrollMargin = (layout) => {\n  switch (layout.direction) {\n    case ScrollDirection.Vertical:\n      return layout.scrollMargin;\n    case ScrollDirection.Horizontal:\n      return 0;\n  }\n};\nconst isElementCrossed = (element, upper = 0) => {\n  const top = (element == null ? void 0 : element.getBoundingClientRect().top) ?? 0;\n  return top - upper <= 0;\n};\nconst initializeScroll = (element, layout) => {\n  setTimeout(() => {\n    if (layout.direction === ScrollDirection.Vertical && isElementCrossed(element, getScrollMargin(layout))) {\n      element == null ? void 0 : element.scrollIntoView({\n        block: \"start\",\n        inline: \"nearest\"\n      });\n    }\n    if (layout.direction === ScrollDirection.Horizontal) {\n      element == null ? void 0 : element.scrollTo({\n        left: 0\n      });\n    }\n  });\n};\nconst isExpandable = (pagination, page) => {\n  return pagination.button.texts[page - 1] !== void 0;\n};\nconst getDisplayCount = (layout, page) => {\n  if (layout.direction === ScrollDirection.Vertical && layout.verticalPagination !== void 0) {\n    switch (layout.verticalPagination.type) {\n      case PaginationType.ExpandButton:\n        return isExpandable(layout.verticalPagination, page) ? layout.verticalPagination.rowDisplayCount * layout.columnCount * page : void 0;\n      case PaginationType.None:\n        return layout.verticalPagination.rowDisplayCount * layout.columnCount * page;\n      default:\n        return void 0;\n    }\n  }\n};\nconst canFetchOnLastItemView = (layout, page) => {\n  if (isCanvas()) {\n    return false;\n  }\n  if (layout.direction === ScrollDirection.Vertical && layout.verticalPagination !== void 0) {\n    switch (layout.verticalPagination.type) {\n      case PaginationType.Default:\n        return true;\n      case PaginationType.ExpandButton:\n        return !isExpandable(layout.verticalPagination, page);\n      case PaginationType.None:\n        return false;\n      default:\n        return true;\n    }\n  }\n  return true;\n};\nconst getRequestSize = (layout) => {\n  if (layout.direction === ScrollDirection.Horizontal || layout.isResponsive) {\n    return PRODUCTS_PER_REQUEST;\n  }\n  if (layout.verticalPagination.type === PaginationType.Default || layout.verticalPagination.type === PaginationType.None) {\n    return PRODUCTS_PER_REQUEST;\n  }\n  return layout.verticalPagination.rowDisplayCount * layout.columnCount;\n};\nexport {\n  canFetchOnLastItemView,\n  getDisplayCount,\n  getRequestSize,\n  getScrollMargin,\n  initializeScroll\n};\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { useRef, useMemo, useEffect } from \"react\";\nimport { EventTrigger } from \"../../../@shared/EventTrigger/index.js\";\nimport { ProductCardType } from \"../../../@shared/ProductCard/ProductCard.types.js\";\nimport { useSegment } from \"../../../@shared/providers/SegmentProvider/SegmentProvider.js\";\nimport { useRootComponentId } from \"../../hooks.js\";\nimport { QueryType } from \"../../types.js\";\nimport { Products } from \"../../../systems/curations/Products/index.js\";\nimport { createOptionTemplate, getResponsiveWidth, getHorizontalBarColumnWidth, getResponsiveWidthWithProductPeekInset } from \"../../../systems/curations/Products/Root.utils.js\";\nimport { useComponentTimingContext } from \"../../../../hooks/beacon/ComponentTimingContext.js\";\nimport \"../../../../hooks/stores/content/content.store.js\";\nimport \"../../../../utils/event-properties/source.js\";\nimport { isCanvas } from \"../../../../utils/framer/isCanvas.js\";\nimport \"framer\";\nimport { hideClosestParentByFramerName } from \"../../../../utils/hideParentElement.js\";\nimport { getPadding } from \"../../../../utils/spacing.js\";\nimport { ProductsElementProvider } from \"../ProductsElementProvider/ProductsElementProvider.js\";\nimport { PRODUCTS_PER_REQUEST } from \"../ProductsModule.constants.js\";\nimport { ScrollDirection } from \"../ProductsModule.types.js\";\nimport { PaginationElement } from \"./PaginationElement/PaginationElement.js\";\nimport { useProducts, useSendProductsElementIds } from \"./ProductsElement.hooks.js\";\nimport { getDisplayCount, initializeScroll, getScrollMargin, canFetchOnLastItemView, getRequestSize } from \"./ProductsElement.utils.js\";\nconst ProductsElementInner = ({\n  query,\n  layout\n}) => {\n  const componentId = useRootComponentId(query);\n  const ref = useRef(null);\n  const {\n    isLoading,\n    hasNext,\n    products: _products,\n    page,\n    fetchNextPage\n  } = useProducts();\n  const {\n    isVisible\n  } = useSegment();\n  useSendProductsElementIds(query);\n  const totalProductsLength = _products.length;\n  const loading = isLoading && totalProductsLength === 0 || isCanvas() && totalProductsLength === 0;\n  const displayCount = getDisplayCount(layout, page);\n  const products = useMemo(() => {\n    const filteredProducts = (query == null ? void 0 : query.type) === QueryType.Moloco && query.facetName ? _products.filter((p) => p.molocoTab === query.facetName) : _products;\n    return filteredProducts.slice(0, displayCount).slice(0, isCanvas() ? PRODUCTS_PER_REQUEST : void 0);\n  }, [_products, query, displayCount]);\n  const {\n    markReady\n  } = useComponentTimingContext();\n  useEffect(() => {\n    if (!isLoading && products.length > 0) {\n      markReady();\n    }\n  }, [isLoading, products.length, markReady]);\n  useEffect(() => {\n    initializeScroll(ref.current, layout);\n    window == null ? void 0 : window.dispatchEvent(new Event(\"layout-done\"));\n  }, [query]);\n  useEffect(() => {\n    if (ref.current) {\n      hideClosestParentByFramerName(ref.current, \"광고\", isVisible);\n    }\n  }, [isVisible]);\n  const padding = getPadding(layout);\n  const hasScroll = layout.direction === ScrollDirection.Horizontal && layout.hasScroll;\n  const variant = (query == null ? void 0 : query.type) === QueryType.Preuser ? \"preuser\" : \"default\";\n  if (!isVisible) {\n    window == null ? void 0 : window.dispatchEvent(new Event(\"layout-done\"));\n    return /* @__PURE__ */ jsx(\"div\", { ref });\n  }\n  return /* @__PURE__ */ jsxs(\"div\", { ref, style: {\n    ...containerStyle,\n    paddingTop: padding.top,\n    paddingBottom: padding.bottom,\n    scrollMarginTop: getScrollMargin(layout)\n  }, children: [\n    /* @__PURE__ */ jsx(Products.Root, { loading, cardStyle, padding: {\n      right: padding.right,\n      left: padding.left\n    }, listStyle: hasScroll ? {\n      msOverflowStyle: \"initial\",\n      scrollbarWidth: \"initial\",\n      paddingBottom: \"16px\"\n    } : void 0, options: createOptions(layout), products, hasNext, onLastItemView: canFetchOnLastItemView(layout, page) ? fetchNextPage : void 0, children: ({\n      index\n    }) => /* @__PURE__ */ jsx(EventTrigger.Target, { children: /* @__PURE__ */ jsx(Products.Card, { index, componentName: componentId, variant, eventProperties: {\n      tagValue: query == null ? void 0 : query.facetName\n    } }) }) }),\n    /* @__PURE__ */ jsx(PaginationElement, { style: {\n      paddingLeft: padding.left,\n      paddingRight: padding.right\n    }, layout })\n  ] });\n};\nconst ProductsElement = (props) => {\n  return /* @__PURE__ */ jsx(ProductsElementProvider, { query: props.query, size: getRequestSize(props.layout), children: /* @__PURE__ */ jsx(ProductsElementInner, { ...props }) });\n};\nconst containerStyle = {\n  width: \"100%\",\n  display: \"flex\",\n  flexDirection: \"column\"\n};\nconst cardStyle = {\n  paddingBottom: 0\n};\nconst createOptions = (layout) => {\n  switch (layout.direction) {\n    case ScrollDirection.Vertical:\n      return createVerticalOptions(layout);\n    case ScrollDirection.Horizontal:\n      return createHorizontalOptions(layout);\n  }\n};\nconst createVerticalOptions = (layout) => {\n  switch (layout.cardType) {\n    case ProductCardType.CARD:\n    case ProductCardType.CARD_DETAILED:\n      return createOptionTemplate({\n        base: {\n          direction: layout.direction,\n          card: {\n            type: layout.cardType,\n            size: layout.size,\n            hasRank: layout.hasRank,\n            hasName: layout.hasName,\n            hasBrandName: layout.hasBrandName,\n            hasBadges: layout.hasBadges,\n            hasHeart: layout.hasHeart,\n            hasPriceUnit: false\n          },\n          column: {\n            gap: layout.columnGap,\n            width: layout.isResponsive ? void 0 : getResponsiveWidth(layout.columnGap, layout.columnCount),\n            minWidth: layout.isResponsive ? 185 : 0,\n            count: layout.isResponsive ? \"auto\" : layout.columnCount\n          },\n          row: {\n            displayCount: getDisplayCount(layout, 1),\n            gap: layout.rowGap\n          }\n        }\n      });\n    case ProductCardType.BAR:\n      return createOptionTemplate({\n        base: {\n          direction: layout.direction,\n          card: {\n            type: layout.cardType,\n            size: layout.size,\n            hasRank: layout.hasRank,\n            hasName: layout.hasName,\n            hasBrandName: layout.hasBrandName,\n            hasBadges: layout.hasBadges,\n            hasHeart: layout.hasHeart,\n            hasPriceUnit: false\n          },\n          column: {\n            gap: layout.columnGap,\n            width: layout.isResponsive ? void 0 : getResponsiveWidth(layout.columnGap, layout.columnCount),\n            minWidth: layout.isResponsive ? 300 + (layout.hasRank ? 40 : 0) : 0,\n            count: layout.isResponsive ? \"auto\" : layout.columnCount\n          },\n          row: {\n            displayCount: getDisplayCount(layout, 1),\n            gap: layout.rowGap\n          }\n        }\n      });\n  }\n};\nconst createHorizontalOptions = (layout) => {\n  switch (layout.cardType) {\n    case ProductCardType.CARD:\n    case ProductCardType.CARD_DETAILED:\n      return createOptionTemplate({\n        base: {\n          direction: layout.direction,\n          card: {\n            type: layout.cardType,\n            size: layout.size,\n            hasRank: layout.hasRank,\n            hasName: layout.hasName,\n            hasBrandName: layout.hasBrandName,\n            hasBadges: layout.hasBadges,\n            hasHeart: layout.hasHeart,\n            hasPriceUnit: false\n          },\n          column: {\n            gap: layout.columnGap,\n            displayCount: layout.columnDisplayCount,\n            width: getResponsiveWidthWithProductPeekInset(layout.columnGap, layout.columnDisplayCount)\n          },\n          row: {\n            gap: layout.rowGap,\n            count: layout.rowCount\n          }\n        },\n        desktop: {\n          navigator: true,\n          column: {\n            width: getResponsiveWidth(layout.columnGap, layout.columnDisplayCount)\n          }\n        }\n      });\n    case ProductCardType.BAR: {\n      const {\n        left,\n        right\n      } = getPadding(layout);\n      const horizontalPaddingPx = Math.max(left, right);\n      return createOptionTemplate({\n        base: {\n          direction: layout.direction,\n          ...layout.columnDivider ? {\n            columnDivider: true\n          } : {},\n          card: {\n            type: layout.cardType,\n            size: layout.size,\n            hasRank: layout.hasRank,\n            hasName: layout.hasName,\n            hasBrandName: layout.hasBrandName,\n            hasBadges: layout.hasBadges,\n            hasHeart: layout.hasHeart,\n            hasPriceUnit: false\n          },\n          column: {\n            gap: layout.columnDivider ? 0 : layout.columnGap,\n            displayCount: layout.columnDisplayCount\n          },\n          row: {\n            gap: layout.rowGap,\n            count: layout.rowCount\n          }\n        },\n        mobile: {\n          column: {\n            width: getHorizontalBarColumnWidth(layout, \"mobile\", horizontalPaddingPx)\n          }\n        },\n        tablet: {\n          column: {\n            width: getHorizontalBarColumnWidth(layout, \"tablet\", horizontalPaddingPx)\n          }\n        },\n        desktop: {\n          navigator: true,\n          column: {\n            width: getHorizontalBarColumnWidth(layout, \"desktop\", horizontalPaddingPx)\n          }\n        }\n      });\n    }\n  }\n};\nexport {\n  ProductsElement,\n  ProductsElementInner\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { useQueryStore } from \"../../query-store/query.store.js\";\nimport { ProductsElement } from \"../ProductsElement/ProductsElement.js\";\nimport { createKey } from \"../../utils/key.js\";\nconst LinkedProductsModule = ({\n  value,\n  layout\n}) => {\n  const query = useQueryStore((state) => state.queries[value]);\n  return /* @__PURE__ */ jsx(ProductsElement, { query, layout }, createKey(query));\n};\nexport {\n  LinkedProductsModule\n};\n","import { combineObjectPropertyControls } from \"../../../libs/property-controls/helpers.js\";\nimport { QUERY_CONTROL, PREUSER_CONTROLS, RANKING_CONTROLS, RECOMMENDATION_CONTROLS, KEYWORD_COLLECTION_CONTROLS, PRODUCT_CONTROLS } from \"../controls.js\";\nconst MANUAL_PRODUCTS_MODULE_QUERY = {\n  ...QUERY_CONTROL,\n  controls: combineObjectPropertyControls(PRODUCT_CONTROLS, KEYWORD_COLLECTION_CONTROLS, RECOMMENDATION_CONTROLS, RANKING_CONTROLS, PREUSER_CONTROLS)\n};\nexport {\n  MANUAL_PRODUCTS_MODULE_QUERY\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { addPropertyControls, ControlType } from \"framer\";\nimport { ButtonVariant, ButtonSize } from \"../../@shared/Button/Button.types.js\";\nimport { ProductCardType } from \"../../@shared/ProductCard/ProductCard.types.js\";\nimport { SWRErrorBoundary } from \"../../@shared/SWRErrorBoundary/SWRErrorBoundary.js\";\nimport { PREFIX_ICON_OPTIONS, POSTFIX_ICON_OPTIONS } from \"../../systems/Button/Button.constants.js\";\nimport { NoContent } from \"../../systems/curations/NoContent/NoContent.js\";\nimport { SectionLayout } from \"../../systems/curations/SectionLayout/SectionLayout.js\";\nimport { ComponentTimingProvider } from \"../../../hooks/beacon/ComponentTimingContext.js\";\nimport { useComponentTiming } from \"../../../hooks/beacon/useComponentTiming.js\";\nimport { BREAKPOINT_CONTROLS } from \"../../../libs/property-controls/breakpoint.js\";\nimport { COMPONENT_ID_PROPS } from \"../../../libs/property-controls/component-id.js\";\nimport { SEGMENT_CONTROLS } from \"../../../libs/property-controls/segment.js\";\nimport { THEME_CONTROLS } from \"../../../libs/property-controls/theme.js\";\nimport { LinkedProductsModule } from \"./LinkedProductsModule/LinkedProductsModule.js\";\nimport { ProductsElement } from \"./ProductsElement/ProductsElement.js\";\nimport { MANUAL_PRODUCTS_MODULE_QUERY } from \"./ProductsModule.controls.js\";\nimport { ProductsModuleInputType, ScrollDirection, PaginationType } from \"./ProductsModule.types.js\";\nconst ProductsModuleInner = ({\n  input,\n  layout\n}) => {\n  switch (input.type) {\n    case ProductsModuleInputType.Linked:\n      return /* @__PURE__ */ jsx(LinkedProductsModule, { value: input.value, layout });\n    case ProductsModuleInputType.Manual:\n      return /* @__PURE__ */ jsx(ProductsElement, { query: input.query, layout });\n    default:\n      return null;\n  }\n};\nconst ProductsModule = ({\n  theme,\n  breakpoint,\n  componentId,\n  segment,\n  ...rest\n}) => {\n  const timing = useComponentTiming(\"ProductsModule\");\n  return /* @__PURE__ */ jsx(ComponentTimingProvider, { timing, children: /* @__PURE__ */ jsx(SectionLayout, { theme, breakpoint, componentId, segment, onVisible: timing.markVisible, children: /* @__PURE__ */ jsx(SWRErrorBoundary, { fallback: (retry) => /* @__PURE__ */ jsx(NoContent, { onClick: retry }), reportFailure: true, children: /* @__PURE__ */ jsx(ProductsModuleInner, { ...rest }) }) }) });\n};\naddPropertyControls(ProductsModule, {\n  ...BREAKPOINT_CONTROLS,\n  ...THEME_CONTROLS,\n  ...SEGMENT_CONTROLS,\n  ...COMPONENT_ID_PROPS,\n  input: {\n    type: ControlType.Object,\n    title: \"입력 값\",\n    controls: {\n      type: {\n        type: ControlType.Enum,\n        title: \"유형\",\n        options: [ProductsModuleInputType.Linked, ProductsModuleInputType.Manual],\n        optionTitles: [\"연결\", \"수동\"]\n      },\n      value: {\n        hidden: ({\n          type\n        }) => type !== ProductsModuleInputType.Linked,\n        type: ControlType.String,\n        title: \"출력 값\",\n        defaultValue: \"\"\n      },\n      query: {\n        hidden: ({\n          type\n        }) => type !== ProductsModuleInputType.Manual,\n        ...MANUAL_PRODUCTS_MODULE_QUERY\n      }\n    }\n  },\n  layout: {\n    type: ControlType.Object,\n    title: \"레이아웃\",\n    controls: {\n      direction: {\n        type: ControlType.Enum,\n        title: \"스크롤 방향\",\n        options: [\"horizontal\", \"vertical\"],\n        optionTitles: [\"수평\", \"수직\"]\n      },\n      cardType: {\n        type: ControlType.Enum,\n        title: \"카드 유형\",\n        options: [ProductCardType.CARD, ProductCardType.CARD_DETAILED, ProductCardType.BAR],\n        optionTitles: [\"compact-card\", \"card\", \"horizontal-card\"]\n      },\n      size: {\n        hidden: ({\n          cardType\n        }) => cardType === ProductCardType.CARD || cardType === ProductCardType.CARD_DETAILED,\n        type: ControlType.Enum,\n        title: \"크기\",\n        options: [\"small\", \"medium\"],\n        optionTitles: [\"small\", \"medium\"],\n        defaultValue: \"medium\"\n      },\n      hasRank: {\n        type: ControlType.Boolean,\n        title: \"순위 노출\",\n        defaultValue: false\n      },\n      hasName: {\n        type: ControlType.Boolean,\n        title: \"상품명 노출\",\n        defaultValue: true\n      },\n      hasBrandName: {\n        type: ControlType.Boolean,\n        title: \"브랜드명 노출\",\n        defaultValue: true\n      },\n      hasBadges: {\n        type: ControlType.Boolean,\n        title: \"뱃지 노출\",\n        defaultValue: true\n      },\n      hasHeart: {\n        type: ControlType.Boolean,\n        title: \"좋아요 노출\",\n        defaultValue: true\n      },\n      // 수평\n      rowCount: {\n        hidden: ({\n          direction\n        }) => direction !== ScrollDirection.Horizontal,\n        type: ControlType.Number,\n        title: \"행 개수\",\n        unit: \"개\",\n        defaultValue: 2,\n        min: 1,\n        max: 10\n      },\n      columnDisplayCount: {\n        hidden: ({\n          direction\n        }) => direction !== ScrollDirection.Horizontal,\n        type: ControlType.Number,\n        title: \"노출 열 개수\",\n        unit: \"개\",\n        description: \"뷰포트에 노출될 열 개수를 설정할 수 있습니다.\",\n        defaultValue: 3,\n        min: 1,\n        max: 6\n      },\n      hasScroll: {\n        hidden: ({\n          direction\n        }) => direction !== ScrollDirection.Horizontal,\n        type: ControlType.Boolean,\n        title: \"스크롤 노출\",\n        defaultValue: false\n      },\n      // 수직\n      isResponsive: {\n        hidden: ({\n          direction\n        }) => direction !== ScrollDirection.Vertical,\n        type: ControlType.Boolean,\n        title: \"반응형\",\n        defaultValue: false\n      },\n      columnCount: {\n        hidden: ({\n          direction,\n          isResponsive\n        }) => direction !== ScrollDirection.Vertical || isResponsive === true,\n        type: ControlType.Number,\n        title: \"열 개수\",\n        unit: \"개\",\n        defaultValue: 2,\n        min: 1,\n        max: 6\n      },\n      scrollMargin: {\n        hidden: ({\n          direction\n        }) => direction !== ScrollDirection.Vertical,\n        type: ControlType.Number,\n        title: \"스크롤 마진\",\n        description: \"자동 스크롤 이동 시 위치 보정 값을 설정할 수 있습니다.\",\n        unit: \"px\",\n        defaultValue: 0\n      },\n      verticalPagination: {\n        hidden: ({\n          direction\n        }) => direction !== ScrollDirection.Vertical,\n        type: ControlType.Object,\n        title: \"페이지네이션\",\n        controls: {\n          type: {\n            type: ControlType.Enum,\n            title: \"유형\",\n            options: [PaginationType.Default, PaginationType.ExpandButton, PaginationType.None],\n            optionTitles: [\"기본\", \"더보기 버튼\", \"없음\"]\n          },\n          gap: {\n            hidden: ({\n              type\n            }) => type !== PaginationType.ExpandButton,\n            type: ControlType.Number,\n            title: \"간격\",\n            description: \"상품 UI 와 페이징 UI 간의 간격을 설정할 수 있습니다.\",\n            unit: \"px\",\n            defaultValue: 16,\n            min: 0,\n            max: 50\n          },\n          rowDisplayCount: {\n            hidden: ({\n              type\n            }) => type === PaginationType.Default,\n            type: ControlType.Number,\n            title: \"노출 행 개수\",\n            description: \"(더보기 마다)노출할 행 개수를 설정할 수 있습니다.\",\n            unit: \"개\",\n            min: 1,\n            max: 10,\n            defaultValue: 4\n          },\n          button: {\n            hidden: ({\n              type\n            }) => type !== PaginationType.ExpandButton,\n            type: ControlType.Object,\n            title: \"버튼\",\n            controls: {\n              variant: {\n                type: ControlType.Enum,\n                title: \"변형\",\n                options: [ButtonVariant.PRIMARY, ButtonVariant.SECONDARY, ButtonVariant.TERTIARY],\n                optionTitles: [\"primary\", \"secondary\", \"tertiary\"]\n              },\n              size: {\n                type: ControlType.Enum,\n                title: \"크기\",\n                options: [ButtonSize.LARGE, ButtonSize.MEDIUM, ButtonSize.SMALL],\n                optionTitles: [\"large\", \"medium\", \"small\"],\n                defaultValue: ButtonSize.MEDIUM\n              },\n              fill: {\n                type: ControlType.Boolean,\n                title: \"채우기\",\n                defaultValue: false\n              },\n              prefixIcon: {\n                hidden: ({\n                  postfixIcon\n                }) => Boolean(postfixIcon),\n                type: ControlType.Enum,\n                title: \"좌측 아이콘\",\n                options: [void 0, ...PREFIX_ICON_OPTIONS],\n                optionTitles: [\"선택 안 함\", ...PREFIX_ICON_OPTIONS]\n              },\n              postfixIcon: {\n                hidden: ({\n                  prefixIcon\n                }) => Boolean(prefixIcon),\n                type: ControlType.Enum,\n                title: \"우측 아이콘\",\n                options: [void 0, ...POSTFIX_ICON_OPTIONS],\n                optionTitles: [\"선택 안 함\", ...POSTFIX_ICON_OPTIONS]\n              },\n              fillIcon: {\n                type: ControlType.Boolean,\n                title: \"아이콘 채우기\",\n                defaultValue: false\n              },\n              texts: {\n                type: ControlType.Array,\n                title: \"버튼 타이틀\",\n                defaultValue: [\"첫 번째 버튼\", \"두 번째 버튼\"],\n                control: {\n                  type: ControlType.String\n                }\n              }\n            }\n          }\n        }\n      },\n      // 공통\n      rowGap: {\n        type: ControlType.Number,\n        title: \"행 간격\",\n        unit: \"px\",\n        defaultValue: 16,\n        min: 0,\n        max: 50\n      },\n      columnGap: {\n        type: ControlType.Number,\n        title: \"열 간격\",\n        unit: \"px\",\n        defaultValue: 6,\n        min: 0,\n        max: 50\n      },\n      padding: {\n        type: ControlType.FusedNumber,\n        title: \"패딩\",\n        defaultValue: 0,\n        toggleKey: \"isMixed\",\n        toggleTitles: [\"All\", \"Individual\"],\n        valueKeys: [\"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"],\n        valueLabels: [\"T\", \"R\", \"B\", \"L\"],\n        min: 0\n      }\n    }\n  }\n});\nexport {\n  ProductsModule\n};\n","import{ProductsModule}from\"https://asset.29cm.co.kr/contents/framer/components/modules/ProductsModule/ProductsModule.js\";ProductsModule.displayName=\"[조립형]Products\";export default ProductsModule;\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ProductsModule\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ProductsModule.map"],"mappings":"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"}