{"version":3,"file":"ProductsModule.C4UZf_7Z.mjs","names":["initialState","createContext","PRODUCTS_PER_REQUEST","useContext","formatProducts","useMemo","containerStyle","useRef","useMemo","p"],"sources":["https:/asset.29cm.co.kr/contents/framer/components/systems/Button/Button.constants.js","https:/asset.29cm.co.kr/contents/framer/libs/property-controls/component-id.js","https:/asset.29cm.co.kr/contents/framer/libs/property-controls/segment.js","https:/asset.29cm.co.kr/contents/framer/components/modules/query-store/query.store.js","https:/asset.29cm.co.kr/contents/framer/components/modules/module-store/module.store.js","https:/asset.29cm.co.kr/contents/framer/components/modules/hooks.js","https:/asset.29cm.co.kr/contents/framer/components/modules/types.js","https:/asset.29cm.co.kr/contents/framer/utils/hideParentElement.js","https:/asset.29cm.co.kr/contents/framer/utils/spacing.js","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/brand-sale/BrandSaleApiService.js","https:/asset.29cm.co.kr/contents/framer/apis/display-bff/DisplayBffApiService.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/utils/key.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/libs/property-controls/helpers.js","https:/asset.29cm.co.kr/contents/framer/types/models/coupon.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/CouponModule.types.js","https:/asset.29cm.co.kr/contents/framer/components/modules/controls.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/evWh54PeGRiY9mrx2Kx0/ProductsModule.js"],"sourcesContent":["import \"react/jsx-runtime\";\nimport { download } from \"../../@shared/Icon/assets/download.js\";\nimport { plus } from \"../../@shared/Icon/assets/plus.js\";\nimport { chevronRight } from \"../../@shared/Icon/assets/chevronRight.js\";\nimport { chevronDown } from \"../../@shared/Icon/assets/chevronDown.js\";\nimport { heart } from \"../../@shared/Icon/assets/heart.js\";\nimport { bell } from \"../../@shared/Icon/assets/bell.js\";\nimport { gift } from \"../../@shared/Icon/assets/gift.js\";\nimport { share } from \"../../@shared/Icon/assets/share.js\";\nimport { scrap } from \"../../@shared/Icon/assets/scrap.js\";\nimport { lock } from \"../../@shared/Icon/assets/lock.js\";\nimport { lockOff } from \"../../@shared/Icon/assets/lockOff.js\";\nconst prefixIconAssets = {\n  scrap,\n  lock,\n  lockOff,\n  heart,\n  bell,\n  gift,\n  share\n};\nconst postfixIconAssets = {\n  plus,\n  chevronRight,\n  download,\n  chevronDown,\n  share\n};\nconst PREFIX_ICON_OPTIONS = Object.keys(prefixIconAssets);\nconst POSTFIX_ICON_OPTIONS = Object.keys(postfixIconAssets);\nexport {\n  POSTFIX_ICON_OPTIONS,\n  PREFIX_ICON_OPTIONS,\n  postfixIconAssets,\n  prefixIconAssets\n};\n","import { ControlType } from \"framer\";\nconst COMPONENT_ID_PROPS = {\n  componentId: {\n    type: ControlType.String,\n    title: \"컴포넌트 ID\",\n    description: \"이벤트 수집 시에 모듈을 구분하기 위한 값\\nex. 29welcoming\",\n    defaultValue: \"\"\n  }\n};\nexport {\n  COMPONENT_ID_PROPS\n};\n","import { ControlType } from \"framer\";\nconst SEGMENT_CONTROLS = {\n  segment: {\n    title: \"세그먼트\",\n    type: ControlType.Array,\n    description: \"설정한 세그먼트 조건에 따라 노출/미노출이 됩니다.\",\n    control: {\n      type: ControlType.Object,\n      controls: {\n        type: {\n          type: ControlType.Enum,\n          title: \"타입\",\n          options: [\"login\", \"guest\", \"newBuyer\", \"categoryNewBuyerProduct\", \"categoryNewBuyerCoupon\"],\n          optionTitles: [\"로그인\", \"미로그인\", \"생애 첫구매\", \"카테고리 첫구매 상품\", \"카테고리 첫구매 쿠폰\"],\n          defaultValue: \"\"\n        },\n        groupId: {\n          hidden: ({\n            type\n          }) => type !== \"categoryNewBuyerProduct\",\n          type: ControlType.String,\n          title: \"그룹 ID\",\n          defaultValue: \"\"\n        },\n        couponId: {\n          hidden: ({\n            type\n          }) => type !== \"categoryNewBuyerCoupon\",\n          type: ControlType.String,\n          title: \"쿠폰 ID\",\n          defaultValue: \"\"\n        }\n      }\n    }\n  }\n};\nexport {\n  SEGMENT_CONTROLS\n};\n","import { create } from \"../../../node_modules/zustand/esm/index.js\";\nconst initialState = {\n  queries: {}\n};\nconst useQueryStore = create((set) => ({\n  ...initialState,\n  dispatchSetQuery: (key, query) => set((prev) => ({\n    queries: {\n      ...prev.queries,\n      [key]: query\n    }\n  }))\n}));\nexport {\n  useQueryStore\n};\n","import { create } from \"../../../node_modules/zustand/esm/index.js\";\nimport { subscribeWithSelector } from \"../../../node_modules/zustand/esm/middleware.js\";\nconst initialState = {\n  rootModules: {}\n};\nconst useModuleStore = create(subscribeWithSelector((set) => ({\n  ...initialState,\n  dispatchSetRootModule: (key, module) => set((prev) => ({\n    rootModules: {\n      ...prev.rootModules,\n      [key]: module\n    }\n  }))\n})));\nexport {\n  useModuleStore\n};\n","import { useEffect } from \"react\";\nimport { useComponentId } from \"../systems/curations/EventTrackingProvider/EventTrackingProvider.hooks.js\";\nimport \"../systems/curations/EventTrackingProvider/EventTrackingProvider.js\";\nimport { useTrackSnowplowEvent } from \"../../hooks/snowplow/useTrackSnowplowEvent.js\";\nimport { useModuleStore } from \"./module-store/module.store.js\";\nimport { shallow as shallow$1 } from \"../../node_modules/zustand/esm/shallow.js\";\nimport { useSegment } from \"../@shared/providers/SegmentProvider/SegmentProvider.js\";\nconst useRootComponentId = (query) => {\n  const componentId = useComponentId();\n  const root = useModuleStore((state) => state.rootModules[(query == null ? void 0 : query.rootOutput) ?? \"\"], shallow$1);\n  return (root == null ? void 0 : root.componentId) || componentId;\n};\nconst useSetRootModule = (query, output) => {\n  const componentId = useComponentId();\n  const segment = useSegment();\n  const dispatchSetRootModule = useModuleStore((state) => state.dispatchSetRootModule);\n  const {\n    isRoot = false\n  } = query ?? {};\n  useEffect(() => {\n    if (!isRoot) {\n      return;\n    }\n    if (!output) {\n      return;\n    }\n    dispatchSetRootModule(output, {\n      componentId,\n      segment: segment.segments\n    });\n  }, [isRoot, output, componentId, segment]);\n};\nconst useTrackClickButtonEvent = (query) => {\n  const trackSnowplowEvent = useTrackSnowplowEvent();\n  const componentId = useRootComponentId(query);\n  const trackClickButtonEvent = ({\n    type,\n    layoutPosition = -1,\n    name = \"\"\n  }) => {\n    trackSnowplowEvent(\"click_button\", {\n      // TODO(임규민): section_name, position 프로퍼티에 할당한 약속된 임의 값 수정\n      section_name: componentId,\n      section_title: componentId,\n      position: -1,\n      layout_position: layoutPosition,\n      button_id: type,\n      button_name: name\n    });\n  };\n  return trackClickButtonEvent;\n};\nconst useTrackImpressionContentEvent = () => {\n  const trackSnowplowEvent = useTrackSnowplowEvent();\n  const componentId = useComponentId();\n  const trackImpressionContentEvent = () => {\n    trackSnowplowEvent(\"impression_content\", {\n      // TODO(임규민): section_name, position, layout_position 프로퍼티에 할당한 약속된 임의 값 수정\n      section_name: componentId,\n      section_title: componentId,\n      position: -1,\n      layout_position: -1\n    });\n  };\n  return trackImpressionContentEvent;\n};\nexport {\n  useRootComponentId,\n  useSetRootModule,\n  useTrackClickButtonEvent,\n  useTrackImpressionContentEvent\n};\n","var QueryType = /* @__PURE__ */ ((QueryType2) => {\n  QueryType2[\"Product\"] = \"product\";\n  QueryType2[\"KeywordCollection\"] = \"keyword-collection\";\n  QueryType2[\"KeywordCollections\"] = \"keyword-collections\";\n  QueryType2[\"BrandCuration\"] = \"brand-curation\";\n  QueryType2[\"Recommendation\"] = \"recommendation\";\n  QueryType2[\"Ranking\"] = \"ranking\";\n  QueryType2[\"CouponCollection\"] = \"coupon-collection\";\n  QueryType2[\"RaffleGroup\"] = \"raffle-group\";\n  QueryType2[\"Coupon\"] = \"coupon\";\n  QueryType2[\"Preuser\"] = \"preuser\";\n  QueryType2[\"CustomCategory\"] = \"custom-category\";\n  QueryType2[\"Moloco\"] = \"moloco\";\n  return QueryType2;\n})(QueryType || {});\nvar RankingType = /* @__PURE__ */ ((RankingType2) => {\n  RankingType2[\"Popularity\"] = \"POPULARITY\";\n  RankingType2[\"Trending\"] = \"TRENDING\";\n  return RankingType2;\n})(RankingType || {});\nvar PopularityPeriodType = /* @__PURE__ */ ((PopularityPeriodType2) => {\n  PopularityPeriodType2[\"Realtime\"] = \"REALTIME\";\n  PopularityPeriodType2[\"Hourly\"] = \"HOURLY\";\n  PopularityPeriodType2[\"Daily\"] = \"DAILY\";\n  return PopularityPeriodType2;\n})(PopularityPeriodType || {});\nvar TrendingPeriodType = /* @__PURE__ */ ((TrendingPeriodType2) => {\n  TrendingPeriodType2[\"Hourly\"] = \"HOURLY\";\n  return TrendingPeriodType2;\n})(TrendingPeriodType || {});\nvar CategoryType = /* @__PURE__ */ ((CategoryType2) => {\n  CategoryType2[CategoryType2[\"Large\"] = 0] = \"Large\";\n  CategoryType2[CategoryType2[\"Middle\"] = 1] = \"Middle\";\n  return CategoryType2;\n})(CategoryType || {});\nexport {\n  CategoryType,\n  PopularityPeriodType,\n  QueryType,\n  RankingType,\n  TrendingPeriodType\n};\n","const hideClosestParentByFramerName = (currentElement, framerName, isVisible) => {\n  if (!currentElement) {\n    return null;\n  }\n  const parentElement = currentElement.closest(`[data-framer-name=\"${framerName}\"]`);\n  if (parentElement) {\n    parentElement.style.display = isVisible ? parentElement.style.display === \"none\" ? \"\" : parentElement.style.display : \"none\";\n  }\n  return parentElement;\n};\nexport {\n  hideClosestParentByFramerName\n};\n","const getPaddingStyle = (value) => {\n  return value.isMixed ? `${value.paddingTop}px ${value.paddingRight}px ${value.paddingBottom}px ${value.paddingLeft}px` : `${value.padding}px`;\n};\nconst getPadding = (value) => {\n  return {\n    top: value.isMixed ? value.paddingTop : value.padding,\n    right: value.isMixed ? value.paddingRight : value.padding,\n    bottom: value.isMixed ? value.paddingBottom : value.padding,\n    left: value.isMixed ? value.paddingLeft : value.padding\n  };\n};\nexport {\n  getPadding,\n  getPaddingStyle\n};\n","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/vite-plugin-node-polyfills/shims/buffer/dist/index.js\";\nimport \"../../../../node_modules/js-cookie/dist/js.cookie.js\";\nimport \"../../../../apis/preuser/PreuserApiService.js\";\nimport \"framer\";\nimport \"../../../../node_modules/@29cm/snowplow/dist/esm/core/snowplow.js\";\nimport { PRODUCTS_PER_REQUEST } from \"../../../systems/Products/Products.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 \"../../../../utils/redirectLogin.js\";\nimport \"../../../../utils/event-properties/source.js\";\nimport \"../../../../constants/snowplow/snowplowSchema.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\";\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 { APIService } from \"../APIService.js\";\nimport { throwFailError } from \"../@middlewares/throwFailError.js\";\nimport { env } from \"../../config/index.js\";\nclass BrandSaleApiService extends APIService {\n  constructor() {\n    super();\n    this.setBaseUrl(env.api.content);\n    this.setMiddleware(throwFailError);\n  }\n  // NOTE: (김홍동) 구 이굿입점회(BrandTimeSale) 신 이굿입점회(CouponCollection)에서 사용되는 api로 brandSaleList를 받아옵니다.\n  // brandSaleList은 그룹별로 어떤 brandSaleId이 있는지 확인할 수 있습니다. 이굿입점회에서는 그룹별 시작 날짜를 가져와 탭을 그리는데 사용됩니다.\n  getBrandSaleGroup(brandSaleGroupId) {\n    return this.get(`/api/v4/framers/proxy/content-api/api/v4/brand-sale-groups/${brandSaleGroupId}`);\n  }\n  // NOTE: (김홍동) 구 이굿입점회(BrandTimeSale) 신 이굿입점회(CouponCollection)에서 사용되는 api로 brandSaleCouponList를 받아옵니다.\n  // brandSaleCouponList에서는 쿠폰의 정보, 브랜드의 정보를 알 수 있습니다.\n  getBrandSales(brandSaleId) {\n    return this.get(`/api/v4/framers/proxy/content-api/api/v4/brand-sales/${brandSaleId}`);\n  }\n  // NOTE: (김홍동) 구 이굿입점회(CouponCollection)에서 사용되는 api로 상품리스트를 받아옵니다. 페이지네이션을 제공하지 않습니다.\n  getBrandSaleCouponDetail(brandSaleCouponId, size) {\n    return this.get(`/api/v4/framers/proxy/content-api/api/v4/brand-sale-coupons/${brandSaleCouponId}`, {\n      size\n    });\n  }\n  // NOTE: (김홍동) 신 이굿입점회(CouponCollection)에서 사용되는 api로 getBrandSales에서 각 브랜드의 couponCollectionId를 바탕으로 상품리스트를 받아옵니다. 페이지네이션을 제공합니다.\n  async getCouponCollectionProducts(couponCollectionId, params) {\n    return this.get(`/api/v4/framers/proxy/content-api/api/v5/coupon-collections/${couponCollectionId}/products`, params).then((res) => {\n      return {\n        ...res.data,\n        resultList: formatProducts(res.data.resultList)\n      };\n    });\n  }\n}\nconst brandSaleApi = new BrandSaleApiService();\nconst formatProducts = (products) => products.map((product) => {\n  var _a;\n  return {\n    ...product,\n    frontBrand: {\n      frontBrandId: product.frontBrand.id,\n      nameKor: product.frontBrand.nameKor,\n      nameEng: product.frontBrand.nameEng\n    },\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});\nexport {\n  brandSaleApi\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      ...payload,\n      pageType: \"CATEGORY_PLP\"\n    });\n  }\n  async getItems(payload) {\n    const params = new URLSearchParams({\n      tagIds: payload.tagIds.join(\",\"),\n      inventoryId: payload.inventoryId,\n      pageId: payload.pageId\n    });\n    return this.get(`/api/v1/framer/listing/promoted-items?${params.toString()}`, void 0, {\n      credentials: \"include\"\n    });\n  }\n}\nconst displayBffApi = new DisplayBffApiService();\nexport {\n  displayBffApi\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  async getRecommendedProductsByTagId(query) {\n    return this.get(\"/api/v4/framers/proxy/content-api/api/v5/recommendation/personalize/products\", query, {\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}];\nexport {\n  MOCK_PRODUCTS\n};\n","import { QueryType } from \"../types.js\";\nconst createKey = (query) => {\n  var _a;\n  return ((_a = query == null ? void 0 : query.keys) == null ? void 0 : _a.join(\"-\")) ?? void 0;\n};\nconst MOLOCO_SHARED_KEY = \"moloco-shared\";\nconst getMolocoCacheQuery = (query) => {\n  if (query.type !== QueryType.Moloco) {\n    return query;\n  }\n  const molocoQuery = query;\n  return {\n    type: molocoQuery.type,\n    tagId: molocoQuery.tagId,\n    inventoryId: molocoQuery.inventoryId,\n    pageId: molocoQuery.pageId\n    // facetName은 의도적으로 제외\n    // 이유: 모든 탭 데이터가 이미 API에서 반환되므로\n    //       탭마다 다른 cache를 만들 필요가 없음\n  };\n};\nconst createMolocoKey = (query) => {\n  return [MOLOCO_SHARED_KEY, getMolocoCacheQuery(query)];\n};\nexport {\n  createKey,\n  createMolocoKey,\n  getMolocoCacheQuery\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 { brandSaleApi } from \"../../../apis/brand-sale/BrandSaleApiService.js\";\nimport { displayBffApi } from \"../../../apis/display-bff/DisplayBffApiService.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 = 100;\nconst RANKING_PRODUCTS_DEFAULT_AGE = 30;\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    data,\n    size,\n    setSize,\n    ...rest\n  } = useSWRInfinite(getKey(query, getInitialPaginationOptions(_size), enabled), ({\n    key\n  }) => queryProducts(key.query, userSegment, key.pagination));\n  const products = useMemo(() => (data == null ? void 0 : data.flatMap((item) => item.products)) ?? [], [data]);\n  const {\n    hasNext = false\n  } = last(data) ?? {};\n  const fetchNextPage = () => {\n    if (!hasNext) {\n      return;\n    }\n    setSize((prev) => prev + 1);\n  };\n  return {\n    isLoading: isLoading || !enabled,\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 {\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      size: RANKING_PRODUCTS_PER_REQUEST\n    }\n  });\n  const hasNext = options.page * options.size < RANKING_PRODUCTS_MAX_SIZE;\n  return {\n    hasNext,\n    products\n  };\n};\nconst fetchCouponCollectionProducts = async (query, options) => {\n  if (!query.couponCollectionId) {\n    return {\n      hasNext: false,\n      products: []\n    };\n  }\n  const {\n    hasNext,\n    resultList\n  } = await brandSaleApi.getCouponCollectionProducts(query.couponCollectionId, {\n    ...options,\n    sort: SortType.BEST\n  });\n  return {\n    hasNext,\n    products: resultList\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    data\n  } = await displayBffApi.getItems({\n    tagIds: [Number(query.tagId)],\n    inventoryId: query.inventoryId || \"\",\n    pageId: query.pageId || \"\"\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    // 컴포넌트에서 query.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 {\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      size: RANKING_PRODUCTS_PER_REQUEST\n    }\n  });\n  const hasNext = options.page * options.size < RANKING_PRODUCTS_MAX_SIZE;\n  return {\n    hasNext,\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  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/vite-plugin-node-polyfills/shims/buffer/dist/index.js\";\nimport \"../../../../node_modules/js-cookie/dist/js.cookie.js\";\nimport \"../../../../apis/preuser/PreuserApiService.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 \"../../../../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/vite-plugin-node-polyfills/shims/buffer/dist/index.js\";\nimport \"../../../../../../node_modules/js-cookie/dist/js.cookie.js\";\nimport \"../../../../../../apis/preuser/PreuserApiService.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 \"../../../../../../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 } from \"../../../systems/curations/Products/Root.utils.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 || 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 ? (\n      // molocoTab 메타데이터와 현재 query.facetName을 비교하여 필터링\n      _products.filter((p) => p.molocoTab === query.facetName)\n    ) : (\n      // Moloco가 아닌 경우 필터링 없이 전체 데이터 사용\n      _products\n    );\n    return filteredProducts.slice(0, displayCount).slice(0, isCanvas() ? PRODUCTS_PER_REQUEST : void 0);\n  }, [_products, query, displayCount]);\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, 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, { style: cardStyle, 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: getResponsiveWidth(layout.columnGap, layout.columnDisplayCount)\n          },\n          row: {\n            gap: layout.rowGap,\n            count: layout.rowCount\n          }\n        },\n        desktop: {\n          navigator: true\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            displayCount: layout.columnDisplayCount\n          },\n          row: {\n            gap: layout.rowGap,\n            count: layout.rowCount\n          }\n        },\n        mobile: {\n          column: {\n            width: getResponsiveWidth(layout.columnGap, layout.columnDisplayCount, layout.hasRank ? 44 : 4)\n          }\n        },\n        tablet: {\n          column: {\n            width: getResponsiveWidth(layout.columnGap, layout.columnDisplayCount, layout.hasRank ? 60 : 20)\n          }\n        },\n        desktop: {\n          navigator: true,\n          column: {\n            width: getResponsiveWidth(layout.columnGap, layout.columnDisplayCount)\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 { ControlType } from \"framer\";\nimport { entries } from \"../../utils/entries.js\";\nconst combineObjectPropertyControls = (...controls) => {\n  return controls.flatMap(entries).reduce((prev, curr) => {\n    const [key, incoming] = curr;\n    const copied = {\n      ...prev\n    };\n    const existing = copied[key] ?? {};\n    if (existing.type === ControlType.Enum && incoming.type === ControlType.Enum) {\n      copied[key] = mergeEnumControlDescription(existing, incoming);\n      return prev = copied;\n    }\n    return prev = {\n      ...prev,\n      [key]: incoming\n    };\n  }, {});\n};\nconst mergeEnumControlDescription = (existing, incoming) => {\n  return {\n    ...existing,\n    options: [...existing.options, ...incoming.options],\n    optionTitles: [...existing.optionTitles ?? [], ...incoming.optionTitles ?? []]\n  };\n};\nexport {\n  combineObjectPropertyControls\n};\n","var CouponType = /* @__PURE__ */ ((CouponType2) => {\n  CouponType2[CouponType2[\"NORMAL\"] = 0] = \"NORMAL\";\n  CouponType2[CouponType2[\"LIMITED\"] = 1] = \"LIMITED\";\n  CouponType2[CouponType2[\"RANDOM\"] = 2] = \"RANDOM\";\n  return CouponType2;\n})(CouponType || {});\nvar CouponDiscountType = /* @__PURE__ */ ((CouponDiscountType2) => {\n  CouponDiscountType2[CouponDiscountType2[\"RATE\"] = 0] = \"RATE\";\n  CouponDiscountType2[CouponDiscountType2[\"AMOUNT\"] = 1] = \"AMOUNT\";\n  return CouponDiscountType2;\n})(CouponDiscountType || {});\nvar DiscountType = /* @__PURE__ */ ((DiscountType2) => {\n  DiscountType2[\"FIXED_RATE\"] = \"FIXED_RATE\";\n  DiscountType2[\"FIXED_PRICE\"] = \"FIXED_PRICE\";\n  return DiscountType2;\n})(DiscountType || {});\nvar AvailableDayType = /* @__PURE__ */ ((AvailableDayType2) => {\n  AvailableDayType2[\"RANGE\"] = \"RANGE\";\n  AvailableDayType2[\"DAY\"] = \"DAY\";\n  AvailableDayType2[\"NONE\"] = \"NONE\";\n  return AvailableDayType2;\n})(AvailableDayType || {});\nvar KindType = /* @__PURE__ */ ((KindType2) => {\n  KindType2[\"PRODUCT\"] = \"PRODUCT\";\n  KindType2[\"CART\"] = \"CART\";\n  return KindType2;\n})(KindType || {});\nexport {\n  AvailableDayType,\n  CouponDiscountType,\n  CouponType,\n  DiscountType,\n  KindType\n};\n","var CouponModuleInputType = /* @__PURE__ */ ((CouponModuleInputType2) => {\n  CouponModuleInputType2[CouponModuleInputType2[\"Linked\"] = 0] = \"Linked\";\n  CouponModuleInputType2[CouponModuleInputType2[\"Manual\"] = 1] = \"Manual\";\n  CouponModuleInputType2[CouponModuleInputType2[\"Auto\"] = 2] = \"Auto\";\n  return CouponModuleInputType2;\n})(CouponModuleInputType || {});\nvar CouponUpdateType = /* @__PURE__ */ ((CouponUpdateType2) => {\n  CouponUpdateType2[CouponUpdateType2[\"NORMAL\"] = 0] = \"NORMAL\";\n  CouponUpdateType2[CouponUpdateType2[\"DAILY\"] = 1] = \"DAILY\";\n  return CouponUpdateType2;\n})(CouponUpdateType || {});\nexport {\n  CouponModuleInputType,\n  CouponUpdateType\n};\n","import { ControlType } from \"framer\";\nimport { CouponType } from \"../../types/models/coupon.js\";\nimport { CouponUpdateType } from \"./CouponModule/CouponModule.types.js\";\nimport { QueryType, RankingType, PopularityPeriodType, TrendingPeriodType, CategoryType } from \"./types.js\";\nconst PRODUCT_CONTROLS = {\n  type: {\n    type: ControlType.Enum,\n    title: \"유형\",\n    options: [QueryType.Product],\n    optionTitles: [\"상품\"]\n  },\n  productIds: {\n    hidden: ({\n      type\n    }) => type !== QueryType.Product,\n    type: ControlType.String,\n    title: \"상품 ID\",\n    description: \"복수 입력 시 콤마(,)로 구분\",\n    defaultValue: \"\"\n  }\n};\nconst KEYWORD_COLLECTION_CONTROLS = {\n  type: {\n    type: ControlType.Enum,\n    title: \"유형\",\n    options: [QueryType.KeywordCollection],\n    optionTitles: [\"키워드 컬렉션\"]\n  },\n  keywordCollectionId: {\n    hidden: ({\n      type\n    }) => type !== QueryType.KeywordCollection,\n    type: ControlType.String,\n    title: \"키워드 컬렉션 ID\",\n    description: \"단수만 입력\",\n    defaultValue: \"\"\n  }\n};\nconst KEYWORD_COLLECTIONS_CONTROLS = {\n  type: {\n    type: ControlType.Enum,\n    title: \"유형\",\n    options: [QueryType.KeywordCollections],\n    optionTitles: [\"다중 키워드 컬렉션\"]\n  },\n  keywordCollectionIds: {\n    hidden: ({\n      type\n    }) => type !== QueryType.KeywordCollections,\n    type: ControlType.String,\n    title: \"키워드 컬렉션 ID\",\n    description: \"복수 입력 시 콤마(,)로 구분\",\n    defaultValue: \"\",\n    placeholder: \"11628,11629,11630\"\n  }\n};\nconst BRAND_CURATION_CONTROLS = {\n  type: {\n    type: ControlType.Enum,\n    title: \"유형\",\n    options: [QueryType.BrandCuration],\n    optionTitles: [\"브랜드 큐레이션\"]\n  },\n  brandGroupIds: {\n    hidden: ({\n      type\n    }) => type !== QueryType.BrandCuration,\n    type: ControlType.String,\n    title: \"브랜드 그룹 ID\",\n    description: \"복수 입력 시 콤마(,)로 구분\",\n    defaultValue: \"\"\n  },\n  brandSize: {\n    hidden: ({\n      type\n    }) => type !== QueryType.BrandCuration,\n    type: ControlType.Number,\n    title: \"개수\",\n    description: \"최대 500개, 미입력 시 최대 개수로 노출\",\n    unit: \"개\",\n    defaultValue: 20,\n    min: 0,\n    displayStepper: true\n  },\n  brandCurationTagIds: {\n    hidden: ({\n      type\n    }) => type !== QueryType.BrandCuration,\n    type: ControlType.String,\n    title: \"태그 ID\",\n    description: \"태그 아이디 입력 시 매핑된 상품만 노출\\n복수 입력 시 콤마(,)로 구분\",\n    defaultValue: \"\"\n  }\n};\nconst RECOMMENDATION_CONTROLS = {\n  type: {\n    type: ControlType.Enum,\n    title: \"유형\",\n    options: [QueryType.Recommendation],\n    optionTitles: [\"개인화 추천\"]\n  },\n  recommendationTagIds: {\n    hidden: ({\n      type\n    }) => type !== QueryType.Recommendation,\n    type: ControlType.String,\n    title: \"태그 ID\",\n    description: \"태그 아이디 입력 시 매핑된 상품만 노출\\n복수 입력 시 콤마(,)로 구분\",\n    defaultValue: \"\"\n  }\n};\nconst RANKING_CONTROLS = {\n  type: {\n    type: ControlType.Enum,\n    title: \"유형\",\n    options: [QueryType.Ranking],\n    optionTitles: [\"랭킹\"]\n  },\n  rankingType: {\n    hidden: ({\n      type\n    }) => type !== QueryType.Ranking,\n    type: ControlType.Enum,\n    title: \"랭킹 유형\",\n    options: [RankingType.Popularity, RankingType.Trending],\n    optionTitles: [\"인기\", \"급상승\"]\n  },\n  popularityPeriodType: {\n    hidden: ({\n      type,\n      rankingType\n    }) => type !== QueryType.Ranking || rankingType !== RankingType.Popularity,\n    type: ControlType.Enum,\n    title: \"기간\",\n    options: [PopularityPeriodType.Realtime, PopularityPeriodType.Hourly, PopularityPeriodType.Daily],\n    optionTitles: [\"실시간\", \"시간별\", \"일별\"]\n  },\n  trendingPeriodType: {\n    hidden: ({\n      type,\n      rankingType\n    }) => type !== QueryType.Ranking || rankingType !== RankingType.Trending,\n    type: ControlType.Enum,\n    title: \"기간\",\n    options: [TrendingPeriodType.Hourly],\n    optionTitles: [\"시간별\"]\n  },\n  rankingTagIds: {\n    hidden: ({\n      type\n    }) => type !== QueryType.Ranking,\n    type: ControlType.String,\n    title: \"태그 ID\",\n    description: \"태그 아이디 입력 시 매핑된 상품만 노출\\n복수 입력 시 콤마(,)로 구분\",\n    defaultValue: \"\"\n  },\n  categoryType: {\n    hidden: ({\n      type\n    }) => type !== QueryType.Ranking,\n    type: ControlType.Enum,\n    title: \"카테고리 유형\",\n    options: [CategoryType.Large, CategoryType.Middle],\n    optionTitles: [\"대카테고리\", \"중카테고리\"],\n    defaultValue: CategoryType.Large\n  },\n  excludeLargeCategoryIds: {\n    hidden: ({\n      type\n    }) => type !== QueryType.Ranking,\n    title: \"제외 대카테고리 ID\",\n    type: ControlType.String,\n    description: \"패싯에서 제외 시킬 대카테고리 ID 입력\\n복수 입력 시 콤마(,)로 구분\",\n    defaultValue: \"\",\n    placeholder: \"268100100,269100100,272100100,273100100\"\n  },\n  excludeMiddleCategoryIds: {\n    hidden: ({\n      type\n    }) => type !== QueryType.Ranking,\n    type: ControlType.String,\n    title: \"제외 중카테고리 ID\",\n    description: \"패싯에서 제외 시킬 중카테고리 ID 입력\\n복수 입력 시 콤마(,)로 구분\",\n    defaultValue: \"\",\n    placeholder: \"268103100,268106100,268104100,268117100\"\n  }\n};\nconst COUPON_COLLECTION_CONTROLS = {\n  type: {\n    type: ControlType.Enum,\n    title: \"유형\",\n    options: [QueryType.CouponCollection],\n    optionTitles: [\"타임 세일 브랜드\"]\n  },\n  brandSaleGroupId: {\n    hidden: ({\n      type\n    }) => type !== QueryType.CouponCollection,\n    type: ControlType.String,\n    title: \"타임 세일 브랜드 ID\",\n    description: \"단수만 입력\",\n    defaultValue: \"\"\n  }\n};\nconst RAFFLE_GROUP_CONTROLS = {\n  type: {\n    type: ControlType.Enum,\n    title: \"유형\",\n    options: [QueryType.RaffleGroup],\n    optionTitles: [\"래플 그룹\"]\n  },\n  raffleGroupId: {\n    hidden: ({\n      type\n    }) => type !== QueryType.RaffleGroup,\n    type: ControlType.String,\n    title: \"래플 그룹 ID\"\n  }\n};\nconst COUPON_CONTROLS = {\n  type: {\n    type: ControlType.Enum,\n    title: \"유형\",\n    options: [QueryType.Coupon],\n    optionTitles: [\"쿠폰\"]\n  },\n  couponType: {\n    type: ControlType.Enum,\n    title: \"쿠폰 유형\",\n    description: \"랜덤 쿠폰은 쿠폰 번호 없이 당일에 발급 가능한 쿠폰이 발급됩니다.\",\n    options: [CouponType.NORMAL, CouponType.LIMITED, CouponType.RANDOM],\n    optionTitles: [\"일반\", \"선착순\", \"랜덤\"]\n  },\n  couponUpdateType: {\n    hidden: (props) => props.couponType === CouponType.RANDOM,\n    type: ControlType.Enum,\n    title: \"쿠폰 갱신 유형\",\n    options: [CouponUpdateType.NORMAL, CouponUpdateType.DAILY],\n    optionTitles: [\"고정\", \"일자별\"]\n  },\n  couponIds: {\n    hidden: (props) => props.couponType !== CouponType.RANDOM && props.couponUpdateType !== CouponUpdateType.NORMAL,\n    type: ControlType.String,\n    title: \"쿠폰 ID\",\n    description: \"복수 입력 시 콤마(,)로 구분\\n랜덤 쿠폰은 유의사항 문구 자동생성을 위해 첫 회차에 해당하는 쿠폰번호 목록을 입력해 주세요.\"\n  },\n  dailyCouponOptions: {\n    hidden: (props) => props.couponType === CouponType.RANDOM || props.couponUpdateType !== CouponUpdateType.DAILY,\n    type: ControlType.Array,\n    title: \"갱신 일자\",\n    control: {\n      type: ControlType.Object,\n      controls: {\n        dailyCouponIds: {\n          type: ControlType.Array,\n          title: \"쿠폰 번호 목록\",\n          description: \"일자별 쿠폰 번호 목록을 입력합니다.\\n하나의 쿠폰 번호 목록당 하나의 날짜에 연결됩니다.\",\n          control: {\n            type: ControlType.String,\n            title: \"쿠폰 번호 목록\"\n          }\n        },\n        updateSchedule: {\n          type: ControlType.Object,\n          title: \"갱신 기간\",\n          controls: {\n            startAt: {\n              type: ControlType.Date,\n              title: \"시작일\"\n            },\n            endAt: {\n              type: ControlType.Date,\n              title: \"종료일\"\n            }\n          }\n        },\n        updateAt: {\n          type: ControlType.Object,\n          title: \"갱신 주기\",\n          description: \"ex) 10시 0분 0초 입력 -> 매일 오전 10시에 쿠폰번호 갱신\",\n          controls: {\n            hours: {\n              type: ControlType.Number,\n              title: \"시\",\n              defaultValue: 0,\n              min: 0,\n              max: 23,\n              unit: \"시\",\n              step: 1,\n              displayStepper: true\n            },\n            minutes: {\n              type: ControlType.Number,\n              title: \"분\",\n              defaultValue: 0,\n              min: 0,\n              max: 59,\n              unit: \"분\",\n              step: 1,\n              displayStepper: true\n            },\n            seconds: {\n              type: ControlType.Number,\n              title: \"초\",\n              defaultValue: 0,\n              min: 0,\n              max: 59,\n              unit: \"초\",\n              step: 1,\n              displayStepper: true\n            }\n          }\n        }\n      }\n    }\n  }\n};\nconst PREUSER_CONTROLS = {\n  type: {\n    type: ControlType.Enum,\n    title: \"유형\",\n    options: [QueryType.Preuser],\n    optionTitles: [\"체험단\"]\n  },\n  preuserIds: {\n    type: ControlType.String,\n    hidden: ({\n      type\n    }) => type !== QueryType.Preuser,\n    title: \"체험단 ID\",\n    description: \"복수 입력 시 콤마(,)로 구분\",\n    defaultValue: \"\"\n  }\n};\nconst QUERY_CONTROL = {\n  type: ControlType.Object,\n  title: \"질의\",\n  controls: {}\n};\nconst CUSTOM_CATEGORY_CONTROLS = {\n  type: {\n    type: ControlType.Enum,\n    title: \"질의 유형\",\n    options: [QueryType.CustomCategory],\n    optionTitles: [\"카테고리\"]\n  },\n  categoryIds: {\n    hidden: ({\n      type\n    }) => type !== QueryType.CustomCategory,\n    type: ControlType.String,\n    title: \"카테고리 ID\",\n    description: \"복수개의 카테고리를 mix 하여 커스텀 카테고리 입력 시 콤마(,)로 구분\",\n    defaultValue: \"\"\n  }\n};\nconst MOLOCO_CONTROL = {\n  type: {\n    type: ControlType.Enum,\n    title: \"유형\",\n    options: [QueryType.Moloco],\n    optionTitles: [\"몰로코\"]\n  },\n  tagId: {\n    hidden: ({\n      type\n    }) => type !== QueryType.Moloco,\n    type: ControlType.String,\n    title: \"태그 ID\"\n  },\n  inventoryId: {\n    hidden: ({\n      type\n    }) => type !== QueryType.Moloco,\n    type: ControlType.String,\n    title: \"인벤토리 ID\",\n    description: \"몰로코와 협의된 값 ex) campaign_29week\"\n  },\n  pageId: {\n    hidden: ({\n      type\n    }) => type !== QueryType.Moloco,\n    type: ControlType.String,\n    title: \"페이지 ID\",\n    description: \"해당 모듈이 노출될 이구위크 페이지 이름, 임의값으로 정해서 전달주시면 됩니다. *페이지당 1개의 고유 pageId 필요\"\n  }\n};\nexport {\n  BRAND_CURATION_CONTROLS,\n  COUPON_COLLECTION_CONTROLS,\n  COUPON_CONTROLS,\n  CUSTOM_CATEGORY_CONTROLS,\n  KEYWORD_COLLECTIONS_CONTROLS,\n  KEYWORD_COLLECTION_CONTROLS,\n  MOLOCO_CONTROL,\n  PREUSER_CONTROLS,\n  PRODUCT_CONTROLS,\n  QUERY_CONTROL,\n  RAFFLE_GROUP_CONTROLS,\n  RANKING_CONTROLS,\n  RECOMMENDATION_CONTROLS\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 { 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  return /* @__PURE__ */ jsx(SectionLayout, { theme, breakpoint, componentId, segment, children: /* @__PURE__ */ jsx(SWRErrorBoundary, { fallback: (retry) => /* @__PURE__ */ jsx(NoContent, { onClick: retry }), 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                }) => postfixIcon !== void 0,\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                }) => prefixIcon !== void 0,\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=\"ProductsModule\";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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"}