{"version":3,"file":"CouponModule.f77WFrW0.mjs","names":["createContext","Root","forwardRef","useCallback","containerStyle","skeletonStyle","skeletonStyleByTheme","useContext","forwardRef","forwardRef","containerStyle","forwardRef","containerStyle","containerStyleByLayout","forwardRef","forwardRef","downloadCoupons","createContext","withStyle","forwardRef","classNames","useState","useContext","withStyle","forwardRef","classNames","withStyle","forwardRef","classNames","forwardRef","sortCouponsByDiscountValueAscending","useMemo","useState","useState","useMemo","useRef","Fragment","COUPON_CONTROLS"],"sources":["https:/asset.29cm.co.kr/contents/framer/libs/property-controls/coupon.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/Coupon/Root.constants.js","https:/asset.29cm.co.kr/contents/framer/utils/object.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/Coupon/Root.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/Coupon/Root.hooks.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/Coupon/Description.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/Coupon/Divider.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/Coupon/Button.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/Coupon/Summary.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/Coupon/Title.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/Coupon/index.js","https:/asset.29cm.co.kr/contents/framer/utils/error/sentry.js","https:/asset.29cm.co.kr/contents/framer/apis/coupon/CouponApiService.js","https:/asset.29cm.co.kr/contents/framer/hooks/fetchers/useFetchCouponsDownloadStatus.js","https:/asset.29cm.co.kr/contents/framer/hooks/mutations/useDownloadCouponsMutation.js","https:/asset.29cm.co.kr/contents/framer/components/canvas/CouponDownloadCTA/CouponDownloadCTA.constants.js","https:/asset.29cm.co.kr/contents/framer/hooks/mutations/useDownloadRandomCouponMutation.js","https:/asset.29cm.co.kr/contents/framer/hooks/useDownloadCoupons.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/CouponModule.utils.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/CouponModule.hooks.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/FoldableList/Root.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/FoldableList/Root.hooks.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/FoldableList/Content.hooks.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/FoldableList/Content.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/FoldableList/Root.constants.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/FoldableList/Item.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/FoldableList/Trigger.js","https:/asset.29cm.co.kr/contents/framer/components/@shared/FoldableList/index.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/NoticesElement/NoticesElement.utils.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/NoticesElement/NoticesElement.js","https:/asset.29cm.co.kr/contents/framer/components/systems/RandomDiscountValue/RandomDiscountValue.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/CouponElement/CouponElement.utils.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/CouponElement/CouponElement.hooks.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/CouponElement/CouponElement.validate.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/CouponElement/CouponElement.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/LinkedCouponModule/LinkedCouponModule.js","https:/asset.29cm.co.kr/contents/framer/libs/property-controls/coupon-notices.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/CouponModule.controls.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/AutoCouponModule/AutoCouponModule.hooks.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/AutoCouponModule/AutoCouponModule.js","https:/asset.29cm.co.kr/contents/framer/components/modules/CouponModule/CouponModule.js","https:/framerusercontent.com/modules/v2w1uRsZPJslVNIRLCeW/PgjboXO18lboOdhFrAoz/CouponModule.js"],"sourcesContent":["import { ControlType } from \"framer\";\nvar CouponColorType = /* @__PURE__ */ ((CouponColorType2) => {\n  CouponColorType2[\"DEFAULT\"] = \"default\";\n  CouponColorType2[\"SOLID\"] = \"solid\";\n  CouponColorType2[\"GRADIENT\"] = \"gradient\";\n  return CouponColorType2;\n})(CouponColorType || {});\nconst COUPON_CONTROLS = {\n  backgroundColor: {\n    type: ControlType.Object,\n    title: \"쿠폰 배경색\",\n    controls: {\n      colorType: {\n        type: ControlType.Enum,\n        title: \"유형\",\n        optionTitles: [\"기본\", \"단색\", \"그라디언트\"],\n        options: [\n          \"default\",\n          \"solid\",\n          \"gradient\"\n          /* GRADIENT */\n        ]\n      },\n      color: {\n        type: ControlType.Color,\n        title: \"단색\",\n        optional: true,\n        hidden: ({\n          colorType\n        }) => colorType !== \"solid\"\n        /* SOLID */\n      },\n      gradient: {\n        type: ControlType.Object,\n        title: \"그라디언트\",\n        controls: {\n          stops: {\n            type: ControlType.Array,\n            title: \"색상 및 정지점들\",\n            control: {\n              type: ControlType.Object,\n              title: \"색상 및 정지점\",\n              controls: {\n                color: {\n                  type: ControlType.Color,\n                  title: \"색상\",\n                  optional: true\n                },\n                offsetPercent: {\n                  type: ControlType.Number,\n                  title: \"정지점\",\n                  unit: \"%\",\n                  min: 0,\n                  max: 100,\n                  defaultValue: 0,\n                  step: 1,\n                  displayStepper: true\n                }\n              }\n            }\n          },\n          degree: {\n            type: ControlType.Number,\n            title: \"각도\",\n            unit: \"deg\",\n            defaultValue: 0,\n            step: 1,\n            displayStepper: true\n          }\n        },\n        hidden: ({\n          colorType\n        }) => colorType !== \"gradient\"\n        /* GRADIENT */\n      }\n    }\n  }\n};\nconst toBackgroundColor = (backgroundColor) => {\n  const {\n    colorType,\n    color,\n    gradient\n  } = backgroundColor;\n  const backgroundColorByType = {\n    [\n      \"default\"\n      /* DEFAULT */\n    ]: void 0,\n    [\n      \"solid\"\n      /* SOLID */\n    ]: color,\n    [\n      \"gradient\"\n      /* GRADIENT */\n    ]: gradient\n  };\n  return backgroundColorByType[colorType];\n};\nexport {\n  COUPON_CONTROLS,\n  CouponColorType,\n  toBackgroundColor\n};\n","const variantByType = {\n  neutral: {\n    background: {\n      light: \"#dee2e6\",\n      dark: \"#27272a\"\n    },\n    primary: {\n      light: \"#000\",\n      dark: \"#fff\"\n    },\n    secondary: {\n      light: \"#474747\",\n      dark: \"#a0a0a0\"\n    },\n    tertiary: {\n      light: \"rgba(0, 0, 0, 0.5)\",\n      dark: \"rgba(255, 255, 255, 0.5)\"\n    },\n    border: \"rgba(255, 255, 255, 0.13)\"\n  },\n  accent: {\n    // NOTE(임규민): 기본 key color, 외부에서 커스터마이즈가 가능한 값입니다.\n    background: {\n      light: \"#ff4800\",\n      dark: \"#ff4800\"\n    },\n    primary: {\n      light: \"#000\",\n      dark: \"#fff\"\n    },\n    secondary: {\n      light: \"#000\",\n      dark: \"#fff\"\n    },\n    tertiary: {\n      light: \"#000\",\n      dark: \"#fff\"\n    },\n    border: \"rgba(255, 255, 255, 0.5)\"\n  },\n  disabled: {\n    background: {\n      light: \"#dee2e6\",\n      dark: \"#27272a\"\n    },\n    primary: {\n      light: \"#474747\",\n      dark: \"#a0a0a0\"\n    },\n    secondary: {\n      light: \"#474747\",\n      dark: \"#a0a0a0\"\n    },\n    tertiary: {\n      light: \"rgba(0, 0, 0, 0.5)\",\n      dark: \"rgba(255, 255, 255, 0.5)\"\n    },\n    border: \"rgba(255, 255, 255, 0.13)\"\n  }\n};\nconst variantByStatus = {\n  upcoming: variantByType.neutral,\n  downloadable: variantByType.accent,\n  downloaded: variantByType.neutral,\n  expired: variantByType.disabled,\n  disabled: variantByType.disabled,\n  issuanceLimitedReached: variantByType.disabled\n};\nexport {\n  variantByStatus,\n  variantByType\n};\n","const pick = (obj, keys) => {\n  const picked = {};\n  keys.forEach((key) => {\n    picked[key] = obj[key];\n  });\n  return picked;\n};\nconst isObject = (object) => {\n  return typeof object === \"object\" && object !== null && !Array.isArray(object);\n};\nexport {\n  isObject,\n  pick\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { createContext, forwardRef, useCallback } from \"react\";\nimport { variantByStatus } from \"./Root.constants.js\";\nimport { Skeleton } from \"../Skeleton/Skeleton.js\";\nimport { isObject } from \"../../../utils/object.js\";\nconst CouponContext = createContext(null);\nconst Root = forwardRef(({\n  children,\n  style,\n  theme = \"light\",\n  loading = false,\n  status = \"downloadable\",\n  layout = \"detail\",\n  backgroundColor: _backgroundColor,\n  ...rest\n}, ref) => {\n  const variant = variantByStatus[status];\n  const backgroundColor = status === \"downloadable\" ? _backgroundColor ?? variant.background : variant.background;\n  const getBackground = useCallback(() => {\n    if (!isObject(backgroundColor)) {\n      return backgroundColor;\n    }\n    if (\"stops\" in backgroundColor) {\n      return getLinearGradient(backgroundColor);\n    }\n    return backgroundColor[theme];\n  }, [backgroundColor, theme]);\n  return /* @__PURE__ */ jsx(CouponContext.Provider, { value: {\n    status,\n    variant,\n    layout\n  }, children: /* @__PURE__ */ jsx(\"div\", { ref, style: {\n    ...containerStyle,\n    ...style\n  }, ...rest, children: loading ? /* @__PURE__ */ jsx(Skeleton, { style: {\n    ...skeletonStyle,\n    ...skeletonStyleByTheme[theme],\n    ...skeletonStyleByLayout[layout]\n  } }) : /* @__PURE__ */ jsx(\"div\", { style: {\n    ...wrapperStyle,\n    background: getBackground(),\n    ...wrapperStyleByLayout[layout],\n    ...layout === \"compact\" ? compactWrapperStyleByStatus[status] : {}\n  }, children }) }) });\n});\nconst getLinearGradient = (linearGradient) => {\n  const {\n    stops,\n    degree\n  } = linearGradient;\n  const gradient = [...stops].sort((x, y) => x.offsetPercent - y.offsetPercent).map((stop) => `${stop.color} ${stop.offsetPercent}%`).join(\", \");\n  return `linear-gradient(${degree}deg, ${gradient})`;\n};\nconst containerStyle = {\n  width: \"100%\"\n};\nconst wrapperStyle = {\n  position: \"relative\",\n  width: \"100%\",\n  display: \"flex\",\n  borderRadius: 4,\n  overflow: \"hidden\"\n};\nconst wrapperStyleByLayout = {\n  compact: {\n    height: 46,\n    WebkitMaskImage: `url('data:image/svg+xml;utf8,<svg width=\"6\" height=\"14\" viewBox=\"0 0 6 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6.00017 7C6.00017 10.866 2.86617 14 0.000163798 14C1.24598e-06 9.18 0.000163798 4.822 0.000163798 0C2.86617 0 6.00017 3.134 6.00017 7Z\" fill=\"white\"/></svg>'), linear-gradient(#fff,#fff)`,\n    maskImage: `url('data:image/svg+xml;utf8,<svg width=\"6\" height=\"14\" viewBox=\"0 0 6 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6.00017 7C6.00017 10.866 2.86617 14 0.000163798 14C1.24598e-06 9.18 0.000163798 4.822 0.000163798 0C2.86617 0 6.00017 3.134 6.00017 7Z\" fill=\"white\"/></svg>'), linear-gradient(#fff,#fff)`,\n    WebkitMaskComposite: \"exclude\",\n    maskComposite: \"exclude\",\n    WebkitMaskPosition: \"0 50%\",\n    maskPosition: \"0 50%\",\n    WebkitMaskSize: \"6px 14px, auto\",\n    maskSize: \"6px 14px, auto\",\n    WebkitMaskRepeat: \"no-repeat\",\n    maskRepeat: \"no-repeat\"\n  },\n  detail: {\n    height: 76,\n    WebkitMaskImage: `url('data:image/svg+xml;utf8,<svg width=\"8\" height=\"16\" viewBox=\"0 0 8 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.00022 8C8.00022 12.4183 4.4185 16 0.000218398 16C1.66131e-06 10.4911 0.000218398 5.52413 0.000218398 0C4.4185 0 8.00022 3.58172 8.00022 8Z\" fill=\"white\"/></svg>'), linear-gradient(#fff,#fff)`,\n    maskImage: `url('data:image/svg+xml;utf8,<svg width=\"8\" height=\"16\" viewBox=\"0 0 8 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.00022 8C8.00022 12.4183 4.4185 16 0.000218398 16C1.66131e-06 10.4911 0.000218398 5.52413 0.000218398 0C4.4185 0 8.00022 3.58172 8.00022 8Z\" fill=\"white\"/></svg>'), linear-gradient(#fff,#fff)`,\n    WebkitMaskComposite: \"exclude\",\n    maskComposite: \"exclude\",\n    WebkitMaskPosition: \"0 50%\",\n    maskPosition: \"0 50%\",\n    WebkitMaskSize: \"8px 16px, auto\",\n    maskSize: \"8px 16px, auto\",\n    WebkitMaskRepeat: \"no-repeat\",\n    maskRepeat: \"no-repeat\"\n  }\n};\nconst compactWrapperStyleByStatus = {\n  upcoming: {\n    cursor: \"not-allowed\"\n  },\n  downloadable: {\n    cursor: \"pointer\"\n  },\n  downloaded: {\n    cursor: \"pointer\"\n  },\n  expired: {\n    cursor: \"not-allowed\"\n  },\n  disabled: {\n    cursor: \"not-allowed\"\n  },\n  issuanceLimitedReached: {\n    cursor: \"not-allowed\"\n  }\n};\nconst skeletonStyle = {\n  width: \"100%\",\n  borderRadius: 4\n};\nconst skeletonStyleByTheme = {\n  light: {\n    backgroundColor: \"#dee2e6\"\n  },\n  dark: {\n    backgroundColor: \"#27272a\"\n  }\n};\nconst skeletonStyleByLayout = {\n  compact: {\n    height: 46\n  },\n  detail: {\n    height: 76\n  }\n};\nexport {\n  CouponContext,\n  Root\n};\n","import { useContext } from \"react\";\nimport { CouponContext } from \"./Root.js\";\nconst useCouponContext = () => {\n  const context = useContext(CouponContext);\n  if (!context) {\n    throw new Error(\"useCouponContext should be used with in Root\");\n  }\n  return context;\n};\nexport {\n  useCouponContext\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { forwardRef } from \"react\";\nimport \"framer\";\nimport { typography } from \"../../../styles/typography.js\";\nimport { useCouponContext } from \"./Root.hooks.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 \"../../../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 \"../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 Description = forwardRef(({\n  children,\n  style,\n  ...rest\n}, ref) => {\n  const {\n    variant,\n    layout\n  } = useCouponContext();\n  const theme = useTheme();\n  if (layout === \"compact\") {\n    return null;\n  }\n  return /* @__PURE__ */ jsx(\"div\", { ref, ...rest, style: {\n    ...typography(12, 400),\n    color: variant.tertiary[theme],\n    ...style\n  }, children });\n});\nexport {\n  Description\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { forwardRef } from \"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 \"../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\";\nimport { useCouponContext } from \"./Root.hooks.js\";\nconst Divider = forwardRef(({\n  children,\n  style,\n  ...rest\n}, ref) => {\n  const theme = useTheme();\n  const {\n    layout\n  } = useCouponContext();\n  if (layout === \"compact\") {\n    return null;\n  }\n  return /* @__PURE__ */ jsx(\"div\", { ref, ...rest, style: {\n    ...containerStyle,\n    ...containerStyleByTheme[theme],\n    ...style\n  }, children });\n});\nconst containerStyle = {\n  zIndex: 1,\n  height: \"100%\",\n  borderLeftWidth: \"1px\",\n  borderLeftStyle: \"dashed\",\n  opacity: 0.2\n};\nconst containerStyleByTheme = {\n  light: {\n    borderColor: \"#000\"\n  },\n  dark: {\n    borderColor: \"#fff\"\n  }\n};\nexport {\n  Divider\n};\n","import { jsxs, jsx } from \"react/jsx-runtime\";\nimport { forwardRef } from \"react\";\nimport { Icon } from \"../Icon/Icon.js\";\nimport \"framer\";\nimport { typography } from \"../../../styles/typography.js\";\nimport { useCouponContext } from \"./Root.hooks.js\";\nimport { playHaptic } from \"../../../utils/playHaptic.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 \"../../../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 \"../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 Button = forwardRef(({\n  style,\n  onClick,\n  ...rest\n}, ref) => {\n  const {\n    variant,\n    status,\n    layout\n  } = useCouponContext();\n  const theme = useTheme();\n  const {\n    icon,\n    text\n  } = contentByStatus[status];\n  const shouldRenderIcon = layout === \"detail\" || status === \"downloadable\" || status === \"downloaded\";\n  const handleClick = (e) => {\n    if (status === \"upcoming\" || status === \"expired\") {\n      return;\n    }\n    playHaptic(\"rigid\");\n    onClick == null ? void 0 : onClick(e);\n  };\n  return /* @__PURE__ */ jsxs(\"div\", { ref, ...rest, style: {\n    ...containerStyle,\n    ...containerStyleByLayout[layout],\n    ...style,\n    ...containerStyleByStatus[status]\n  }, onClick: handleClick, children: [\n    shouldRenderIcon ? /* @__PURE__ */ jsx(Icon, { type: icon, weight: layout === \"detail\" ? \"light\" : \"regular\", size: layout === \"detail\" ? 24 : 16, color: variant.secondary[theme] }) : null,\n    /* @__PURE__ */ jsx(\"div\", { style: {\n      ...typography(12, 400),\n      color: variant.secondary[theme]\n    }, children: text })\n  ] });\n});\nconst contentByStatus = {\n  upcoming: {\n    icon: \"clock\",\n    text: \"발행예정\"\n  },\n  downloadable: {\n    icon: \"download\",\n    text: \"쿠폰받기\"\n  },\n  downloaded: {\n    icon: \"check\",\n    text: \"받기완료\"\n  },\n  expired: {\n    icon: \"close\",\n    text: \"기간만료\"\n  },\n  disabled: {\n    icon: \"close\",\n    text: \"사용불가\"\n  },\n  issuanceLimitedReached: {\n    icon: \"close\",\n    text: \"받기마감\"\n  }\n};\nconst containerStyle = {\n  zIndex: 1,\n  height: \"100%\",\n  display: \"flex\",\n  alignItems: \"center\",\n  justifyContent: \"center\",\n  gap: 4\n};\nconst containerStyleByLayout = {\n  compact: {\n    paddingRight: 16\n  },\n  detail: {\n    aspectRatio: \"1 / 1\",\n    flexDirection: \"column\"\n  }\n};\nconst containerStyleByStatus = {\n  upcoming: {\n    cursor: \"not-allowed\"\n  },\n  downloadable: {\n    cursor: \"pointer\"\n  },\n  downloaded: {\n    cursor: \"pointer\"\n  },\n  expired: {\n    cursor: \"not-allowed\"\n  },\n  disabled: {\n    cursor: \"not-allowed\"\n  },\n  issuanceLimitedReached: {\n    cursor: \"not-allowed\"\n  }\n};\nexport {\n  Button\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { forwardRef } from \"react\";\nimport { useCouponContext } from \"./Root.hooks.js\";\nconst Summary = forwardRef(({\n  children,\n  style,\n  ...rest\n}, ref) => {\n  const {\n    layout\n  } = useCouponContext();\n  return /* @__PURE__ */ jsx(\"div\", { ref, ...rest, style: {\n    ...containerStyle,\n    ...containerStyleByLayout[layout],\n    ...style\n  }, children });\n});\nconst containerStyle = {\n  zIndex: 1,\n  flex: 1,\n  height: \"100%\",\n  display: \"flex\",\n  flexDirection: \"column\",\n  justifyContent: \"center\",\n  gap: 2\n};\nconst containerStyleByLayout = {\n  compact: {\n    padding: \"0px 8px 0px 16px\"\n  },\n  detail: {\n    padding: \"0px 8px 0px 26px\"\n  }\n};\nexport {\n  Summary\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { forwardRef } from \"react\";\nimport \"framer\";\nimport { typography } from \"../../../styles/typography.js\";\nimport { useCouponContext } from \"./Root.hooks.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 \"../../../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 \"../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 Title = forwardRef(({\n  children,\n  style,\n  ...rest\n}, ref) => {\n  const {\n    variant,\n    layout\n  } = useCouponContext();\n  const theme = useTheme();\n  return /* @__PURE__ */ jsx(\"div\", { ref, ...rest, style: {\n    ...styleByLayout[layout],\n    color: variant.primary[theme],\n    ...style\n  }, children });\n});\nconst styleByLayout = {\n  compact: {\n    display: \"flex\",\n    gap: 5,\n    alignItems: \"center\",\n    ...typography(13, 500)\n  },\n  detail: {\n    ...typography(15, 700)\n  }\n};\nexport {\n  Title\n};\n","import { Description } from \"./Description.js\";\nimport { Divider } from \"./Divider.js\";\nimport { Root } from \"./Root.js\";\nimport { Button } from \"./Button.js\";\nimport { Summary } from \"./Summary.js\";\nimport { Title } from \"./Title.js\";\nconst Coupon = {\n  Root,\n  Summary,\n  Title,\n  Description,\n  Divider,\n  Button\n};\nexport {\n  Coupon\n};\n","import { withScope } from \"../../node_modules/@sentry/core/build/esm/currentScopes.js\";\nimport { captureException } from \"../../node_modules/@sentry/core/build/esm/exports.js\";\nconst captureAPIError = (error, response) => {\n  withScope((scope) => {\n    scope.setTag(\"error.type\", \"api_error\");\n    scope.setExtra(\"APIResponse\", response);\n    captureException(error);\n  });\n};\nexport {\n  captureAPIError\n};\n","import { parseErrorMessage, parseDirectionCode } from \"../../utils/error/error.js\";\nimport { GENERAL_ERROR } from \"../../constants/error.js\";\nimport camelcaseKeys from \"../../node_modules/camelcase-keys/index.js\";\nimport { environments, env } from \"../../config/index.js\";\nimport { captureAPIError } from \"../../utils/error/sentry.js\";\nconst COUPONS_PER_REQUEST = 50;\nconst INVALID_COUPON_ID = 0;\nclass CouponApiService {\n  async getCoupons(couponIdList, isDevMode = false) {\n    const slicedCouponIdList = couponIdList.slice(0, COUPONS_PER_REQUEST);\n    const isValidCouponIdList = !slicedCouponIdList.includes(INVALID_COUPON_ID);\n    const slicedCouponIdListString = isValidCouponIdList ? slicedCouponIdList.join(\",\") : null;\n    const baseUrl = isDevMode ? environments.development.api.content : env.api.content;\n    const response = await fetch(`${baseUrl}/api/v4/framers/proxy/promotion-api/api/v1/coupon?couponIdList=${slicedCouponIdListString}`).then((res) => res.json()).then((res) => camelcaseKeys(res, {\n      deep: true\n    }));\n    if (response.result === \"FAIL\" || response.data === null) {\n      captureAPIError(new Error(response.message ?? GENERAL_ERROR), response);\n      throw new Error(response.message ?? GENERAL_ERROR);\n    }\n    return response;\n  }\n  async downloadCouponBulk(couponNoList) {\n    return fetch(`${env.api.promotion}/api/v4/coupons/download:bulk`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        couponList: couponNoList.map((couponId) => ({\n          couponId,\n          downloadCount: 1\n        }))\n      }),\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"accept\": \"application/json\"\n      },\n      credentials: \"include\"\n    }).then((res) => res.json());\n  }\n  async downloadCoupon(couponNo, downloadCount) {\n    const safeDownloadCount = Math.max(downloadCount, 1);\n    return fetch(`${env.api.promotion}/api/v4/coupons/download`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        couponId: couponNo,\n        downloadCount: safeDownloadCount\n      }),\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"accept\": \"application/json\"\n      },\n      credentials: \"include\"\n    }).then((res) => res.json());\n  }\n  async downloadLimitedCoupons(couponNoList) {\n    const promises = couponNoList.map(async (couponId) => {\n      return fetch(`${env.api.promotion}/api/v4/coupons/download:limited`, {\n        method: \"POST\",\n        body: JSON.stringify({\n          couponId\n        }),\n        headers: {\n          \"Content-Type\": \"application/json\",\n          \"accept\": \"application/json\"\n        },\n        credentials: \"include\"\n      }).then((res) => res.json());\n    });\n    const [response] = await Promise.all(promises);\n    return response;\n  }\n  async downloadRandomCoupon() {\n    return fetch(`${env.api.promotion}/api/v1/random-coupon/${env.name === \"qa\" ? \"issue-test\" : \"issue\"}`, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"accept\": \"application/json\"\n      },\n      credentials: \"include\"\n    }).then((res) => res.json());\n  }\n  async getMaxIssueCount(couponId) {\n    const result = await fetch(`${env.api.promotion}/api/v4/coupons/max-issue-count/${couponId}`);\n    const response = await result.json();\n    if (response.result === \"FAIL\" || response.data === null) {\n      throw new Error(response.errorCode ?? GENERAL_ERROR);\n    }\n    return response;\n  }\n  async getDownloadableCouponSummaries(couponIdList, userId) {\n    const result = await fetch(`${env.api.promotion}/api/v4/coupons/downloadable?userId=${userId}`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        couponIdList\n      }),\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"accept\": \"application/json\"\n      },\n      credentials: \"include\"\n    });\n    const response = await result.json();\n    if (response.result === \"FAIL\" || response.data === null) {\n      throw new Error(response.errorCode ?? GENERAL_ERROR);\n    }\n    return response.data.downloadableCouponInfoList;\n  }\n  async getCouponsDownloadStatus(couponIdList, userId) {\n    const result = await fetch(`${env.api.promotion}/api/v4/coupons/download-status?userId=${userId}`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        couponIdList\n      }),\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"accept\": \"application/json\"\n      },\n      credentials: \"include\"\n    });\n    const response = await result.json();\n    if (response.result === \"FAIL\" || response.data === null) {\n      throw new Error(response.errorCode ?? GENERAL_ERROR);\n    }\n    return response.data.resultList;\n  }\n  parseDownloadCouponError(error, fallbackMessage) {\n    const message = parseErrorMessage(error, fallbackMessage) ?? \"\";\n    const directionCode = parseDirectionCode(error);\n    const isAuthError = (directionCode == null ? void 0 : directionCode[0]) === \"auth\";\n    return {\n      message,\n      callbackUrl: isAuthError ? \"/mypage/edit/info\" : void 0\n    };\n  }\n}\nconst couponApi = new CouponApiService();\nexport {\n  couponApi\n};\n","import useSWR from \"../../node_modules/swr/core/dist/index.js\";\nimport { couponApi } from \"../../apis/coupon/CouponApiService.js\";\nconst COUPONS_DOWNLOAD_STATUS_FETCHER_KEY = \"@coupon/coupons-download-status\";\nconst useFetchCouponsDownloadStatus = (couponIds, userNo, enabled = true) => {\n  const canFetch = couponIds.length > 0 && Boolean(userNo) && enabled;\n  const {\n    isLoading,\n    data,\n    ...rest\n  } = useSWR(canFetch ? [COUPONS_DOWNLOAD_STATUS_FETCHER_KEY, ...couponIds] : null, () => couponApi.getCouponsDownloadStatus(couponIds, Number(userNo)), {\n    revalidateIfStale: true\n  });\n  return {\n    isLoading: isLoading || !canFetch,\n    statuses: data ?? [],\n    ...rest\n  };\n};\nexport {\n  useFetchCouponsDownloadStatus\n};\n","import useSWRMutation from \"../../node_modules/swr/mutation/dist/index.js\";\nimport { couponApi } from \"../../apis/coupon/CouponApiService.js\";\nconst COUPON_MULTI_ISSUE_FETCHER_KEY = \"coupon-multi-issue\";\nconst downloadCoupons = (_key, {\n  arg\n}) => {\n  const {\n    couponIds,\n    downloadCount\n  } = arg;\n  const [couponId] = couponIds;\n  return couponIds.length > 1 ? couponApi.downloadCouponBulk(couponIds) : couponApi.downloadCoupon(couponId, downloadCount);\n};\nconst downloadLimitedCoupons = (_key, {\n  arg\n}) => {\n  return couponApi.downloadLimitedCoupons(arg.couponIds);\n};\nconst useDownloadCouponsMutation = ({\n  isLimited = false,\n  enabled = true,\n  onError,\n  onSuccess\n} = {}) => {\n  return useSWRMutation(enabled ? COUPON_MULTI_ISSUE_FETCHER_KEY : null, isLimited ? downloadLimitedCoupons : downloadCoupons, {\n    onError,\n    onSuccess\n  });\n};\nexport {\n  COUPON_MULTI_ISSUE_FETCHER_KEY,\n  useDownloadCouponsMutation\n};\n","const DOWNLOAD_COUPON_MESSAGES = {\n  SUCCESS: \"쿠폰을 받았어요.\\n받은 쿠폰은 마이페이지에서 확인하세요.\",\n  BULK_SUCCESS: \"쿠폰을 모두 받았어요.\\n받은 쿠폰은 마이페이지에서 확인하세요.\",\n  LOADING: \"쿠폰 발급을 시도하고 있어요. 잠시 기다려주세요.\\n신청 순서대로 처리되며 신청량이 많은 경우 쿠폰이 소진될 수 있어요\",\n  NEED_IDENTIFICATION: \"쿠폰 발급을 위해 본인확인이 필요해요.\",\n  FAILED_SOME_COUPON_DOWNLOAD: \"쿠폰을 모두 받았어요. 받은 쿠폰은 MY>쿠폰함에서 확인하세요.\",\n  FAILED_COUPON_DOWNLOAD: \"쿠폰을 모두 받았어요. 받은 쿠폰은 MY>쿠폰함에서 확인하세요.\",\n  NOT_FOUND_USER_ID: \"로그인이 필요해요.\",\n  GENERAL_ERROR: \"쿠폰 발급에 실패했어요.\",\n  RANDOM_COUPON_ISSUANCE_END: \"선착순 쿠폰이 마감되었습니다.\"\n};\nexport {\n  DOWNLOAD_COUPON_MESSAGES\n};\n","import useSWRMutation from \"../../node_modules/swr/mutation/dist/index.js\";\nimport { couponApi } from \"../../apis/coupon/CouponApiService.js\";\nconst DOWNLOAD_RANDOM_COUPON_MUTATION_KEY = \"@coupon/download-random-coupon\";\nconst useDownloadRandomCouponMutation = ({\n  enabled = true,\n  onError,\n  onSuccess\n} = {}) => {\n  return useSWRMutation(enabled ? DOWNLOAD_RANDOM_COUPON_MUTATION_KEY : null, () => couponApi.downloadRandomCoupon(), {\n    onError,\n    onSuccess\n  });\n};\nexport {\n  DOWNLOAD_RANDOM_COUPON_MUTATION_KEY,\n  useDownloadRandomCouponMutation\n};\n","import { useCurrentUser } from \"./useCurrentUser.js\";\nimport { useRedirectLoginDialog } from \"./useRedirectLoginDialog.js\";\nimport { useDownloadCouponsMutation } from \"./mutations/useDownloadCouponsMutation.js\";\nimport \"../node_modules/swr/mutation/dist/index.js\";\nimport \"../config/index.js\";\nimport { useDialog } from \"./useDialog.js\";\nimport { isContentOrigin } from \"../utils/location.js\";\nimport { DOWNLOAD_COUPON_MESSAGES } from \"../components/canvas/CouponDownloadCTA/CouponDownloadCTA.constants.js\";\nimport { useDownloadRandomCouponMutation } from \"./mutations/useDownloadRandomCouponMutation.js\";\nimport { CouponType, DiscountType } from \"../types/models/coupon.js\";\nconst useDownloadCoupons = (couponType = CouponType.NORMAL, discountType = DiscountType.FIXED_RATE, handleCouponDownloadSuccess) => {\n  const {\n    logged\n  } = useCurrentUser();\n  const {\n    showRedirectLoginDialog\n  } = useRedirectLoginDialog();\n  const isValidOrigin = isContentOrigin();\n  const dialog = useDialog();\n  const {\n    trigger: downloadCoupons,\n    isMutating: isLoading\n  } = useDownloadCouponsMutation({\n    isLimited: couponType === CouponType.LIMITED,\n    enabled: isValidOrigin\n  });\n  const {\n    trigger: downloadRandomCoupon,\n    isMutating: isRandomCouponLoading\n  } = useDownloadRandomCouponMutation({\n    enabled: isValidOrigin\n  });\n  const handleSuccess = () => (response) => {\n    if ((response == null ? void 0 : response.result) === \"FAIL\") {\n      dialog.show({\n        content: getErrorMessage(response.errorCode, response.message)\n      });\n      return;\n    }\n    handleCouponDownloadSuccess == null ? void 0 : handleCouponDownloadSuccess();\n    dialog.show({\n      content: getSuccessMessage(response, discountType)\n    });\n  };\n  const validate = () => {\n    if (!isValidOrigin) {\n      return false;\n    }\n    if (!logged) {\n      showRedirectLoginDialog();\n      return false;\n    }\n    if (isLoading || isRandomCouponLoading) {\n      dialog.show({\n        content: DOWNLOAD_COUPON_MESSAGES.LOADING\n      });\n      return false;\n    }\n    return true;\n  };\n  const download = async (couponNoList = [], downloadCount = 1, skipValidation = false) => {\n    if (!skipValidation && !validate()) {\n      return;\n    }\n    if (couponType === CouponType.NORMAL || couponType === CouponType.LIMITED) {\n      await downloadCoupons({\n        couponIds: couponNoList,\n        downloadCount\n      }, {\n        onSuccess: handleSuccess(),\n        onError: () => {\n          dialog.show({\n            content: \"쿠폰 다운로드 요청이 많아 지연 중입니다. 죄송합니다. 잠시 후 다시 시도해 주세요.\"\n          });\n        }\n      });\n      return;\n    }\n    if (couponType === CouponType.RANDOM) {\n      await downloadRandomCoupon(void 0, {\n        onSuccess: handleSuccess(),\n        onError: () => {\n          dialog.show({\n            content: \"쿠폰 다운로드 요청이 많아 지연 중입니다. 죄송합니다. 잠시 후 다시 시도해 주세요.\"\n          });\n        }\n      });\n    }\n  };\n  return {\n    validate,\n    download\n  };\n};\nconst getSuccessMessage = (response, discountType) => {\n  const {\n    data\n  } = response;\n  const isBulk = data && \"downloadSummaryList\" in data;\n  const isRandom = data && \"couponId\" in data;\n  if (isRandom) {\n    return createRandomCouponSuccessMessage(data.discountValue)[discountType];\n  }\n  return isBulk ? DOWNLOAD_COUPON_MESSAGES.BULK_SUCCESS : DOWNLOAD_COUPON_MESSAGES.SUCCESS;\n};\nconst createRandomCouponSuccessMessage = (discountValue) => ({\n  [DiscountType.FIXED_PRICE]: `${discountValue.toLocaleString(\"ko-KR\")}원 쿠폰에 당첨됐어요.\n받은 쿠폰은 마이페이지에서 확인하세요.`,\n  [DiscountType.FIXED_RATE]: `${discountValue}% 쿠폰에 당첨됐어요.\n받은 쿠폰은 마이페이지에서 확인하세요.`\n});\nconst getErrorMessage = (errorCode, errorMessage) => {\n  switch (errorCode) {\n    case \"FAILED_SOME_COUPON_DOWNLOAD\":\n      return DOWNLOAD_COUPON_MESSAGES.FAILED_SOME_COUPON_DOWNLOAD;\n    case \"FAILED_COUPON_DOWNLOAD\":\n      return DOWNLOAD_COUPON_MESSAGES.FAILED_COUPON_DOWNLOAD;\n    case \"NOT_FOUND_USER_ID\":\n      return DOWNLOAD_COUPON_MESSAGES.NOT_FOUND_USER_ID;\n    case \"RANDOM_COUPON_ISSUANCE_END\":\n      return DOWNLOAD_COUPON_MESSAGES.RANDOM_COUPON_ISSUANCE_END;\n    default:\n      return errorMessage || \"쿠폰 다운로드 요청이 많아 지연 중입니다. 죄송합니다. 잠시 후 다시 시도해 주세요.\";\n  }\n};\nconst toCouponNos = (couponNosStr) => {\n  return couponNosStr.split(\",\").map((item) => Number(item.trim()));\n};\nexport {\n  toCouponNos,\n  useDownloadCoupons\n};\n","const formatToCoupon = (coupon) => {\n  if (!coupon) {\n    return void 0;\n  }\n  return {\n    ...coupon,\n    id: coupon.couponId\n  };\n};\nexport {\n  formatToCoupon\n};\n","import { QueryType } from \"../types.js\";\nimport useSWR from \"../../../node_modules/swr/core/dist/index.js\";\nimport { couponApi } from \"../../../apis/coupon/CouponApiService.js\";\nimport { formatToCoupon } from \"./CouponModule.utils.js\";\nconst COUPONS_FETCHER_KEY = \"@coupon/coupons\";\nconst useCouponsQuery = ({\n  query,\n  couponIds,\n  enabled = true\n}) => {\n  const canFetch = couponIds.length > 0 && enabled && query !== void 0;\n  const {\n    data\n  } = useSWR(canFetch ? [COUPONS_FETCHER_KEY, couponIds] : null, () => queryCoupons(couponIds, query));\n  return {\n    coupons: (data == null ? void 0 : data.coupons) ?? []\n  };\n};\nconst fetchCoupons = async (couponIds) => {\n  const {\n    data\n  } = await couponApi.getCoupons(couponIds);\n  return {\n    coupons: data\n  };\n};\nconst fetchCouponCollectionCoupon = (query) => {\n  const coupon = formatToCoupon(query.coupon);\n  return {\n    coupons: coupon ? [coupon] : []\n  };\n};\nconst fetchKeywordCollectionCoupon = async (query) => {\n  if (!query.couponId) {\n    return {\n      coupons: []\n    };\n  }\n  const {\n    data\n  } = await couponApi.getCoupons([query.couponId]);\n  return {\n    coupons: data\n  };\n};\nconst queryCoupons = (couponIds, query) => {\n  if (query === void 0) {\n    return {\n      coupons: []\n    };\n  }\n  switch (query.type) {\n    case QueryType.Coupon:\n      return fetchCoupons(couponIds);\n    case QueryType.CouponCollection:\n      return fetchCouponCollectionCoupon(query);\n    case QueryType.KeywordCollection:\n      return fetchKeywordCollectionCoupon(query);\n    default:\n      return {\n        coupons: []\n      };\n  }\n};\nexport {\n  useCouponsQuery\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { createContext, forwardRef } from \"react\";\nimport { ComponentName } from \"../../../styles/ComponentName.js\";\nimport { createWithStyle } from \"../../../styles/createWithStyle.js\";\nimport { css } from \"../../../styles/css.js\";\nimport { useFold } from \"./Root.hooks.js\";\nimport { cx } from \"framer\";\nimport { Skeleton } from \"../Skeleton/Skeleton.js\";\nconst {\n  classNames,\n  withStyle\n} = createWithStyle(ComponentName.FoldableListRoot, {\n  container: css`\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n  `\n});\nconst FoldableListContext = createContext(null);\nconst Root = withStyle(forwardRef(({\n  children,\n  className,\n  theme = \"light\",\n  pending = false,\n  ...rest\n}, ref) => {\n  const {\n    isFolded,\n    toggleFold\n  } = useFold();\n  if (pending) {\n    return /* @__PURE__ */ jsx(Skeleton, { style: {\n      ...skeletonStyle,\n      ...skeletonStyleByTheme[theme]\n    } });\n  }\n  return /* @__PURE__ */ jsx(FoldableListContext.Provider, { value: {\n    theme,\n    isFolded,\n    toggleFold\n  }, children: /* @__PURE__ */ jsx(\"div\", { className: cx(className, classNames.container), ref, ...rest, children }) });\n}));\nconst skeletonStyle = {\n  width: 100,\n  height: 20,\n  borderRadius: 4\n};\nconst skeletonStyleByTheme = {\n  light: {\n    backgroundColor: \"#dee2e6\"\n  },\n  dark: {\n    backgroundColor: \"#27272a\"\n  }\n};\nexport {\n  FoldableListContext,\n  Root\n};\n","import { useState, useContext } from \"react\";\nimport { FoldableListContext } from \"./Root.js\";\nconst useFold = () => {\n  const [isFolded, setIsFolded] = useState(true);\n  const toggleFold = () => {\n    setIsFolded((prev) => !prev);\n  };\n  return {\n    isFolded,\n    toggleFold\n  };\n};\nconst useFoldableListContext = () => {\n  const context = useContext(FoldableListContext);\n  if (!context) {\n    throw new Error(\"useFoldableListContext should be used within Root\");\n  }\n  return context;\n};\nexport {\n  useFold,\n  useFoldableListContext\n};\n","import { useAnimationControls } from \"framer-motion\";\nimport { useFoldableListContext } from \"./Root.hooks.js\";\nimport { useEffect } from \"react\";\nconst useFoldControls = () => {\n  const {\n    isFolded\n  } = useFoldableListContext();\n  const controls = useAnimationControls();\n  useEffect(() => {\n    if (isFolded) {\n      controls.start({\n        height: 0\n      });\n    } else {\n      controls.start({\n        height: \"auto\"\n      });\n    }\n  }, [isFolded]);\n  return controls;\n};\nexport {\n  useFoldControls\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { forwardRef } from \"react\";\nimport { ComponentName } from \"../../../styles/ComponentName.js\";\nimport { createWithStyle } from \"../../../styles/createWithStyle.js\";\nimport { css } from \"../../../styles/css.js\";\nimport { motion } from \"framer-motion\";\nimport { cx } from \"framer\";\nimport { useFoldControls } from \"./Content.hooks.js\";\nconst {\n  classNames,\n  withStyle\n} = createWithStyle(ComponentName.FoldableListContent, {\n  container: css`\n    display: flex;\n    flex-direction: column;\n    gap: 2px;\n    padding-top: 7px;\n  `\n});\nconst Content = withStyle(forwardRef(({\n  children,\n  className,\n  ...rest\n}, ref) => {\n  const controls = useFoldControls();\n  return /* @__PURE__ */ jsx(motion.div, { ref, initial: {\n    height: 0\n  }, animate: controls, style: {\n    overflow: \"hidden\"\n  }, transition: {\n    type: \"spring\",\n    stiffness: 500,\n    damping: 60,\n    mass: 1\n  }, children: /* @__PURE__ */ jsx(\"div\", { className: cx(className, classNames.container), ...rest, children }) });\n}));\nexport {\n  Content\n};\n","const textStyleByTheme = {\n  light: {\n    color: \"#474747\"\n  },\n  dark: {\n    color: \"#a0a0a0\"\n  }\n};\nexport {\n  textStyleByTheme\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { cx } from \"framer\";\nimport { forwardRef } from \"react\";\nimport { ComponentName } from \"../../../styles/ComponentName.js\";\nimport { createWithStyle } from \"../../../styles/createWithStyle.js\";\nimport { css } from \"../../../styles/css.js\";\nimport { typographyCSS } from \"../../../styles/typography.js\";\nimport { useFoldableListContext } from \"./Root.hooks.js\";\nimport { textStyleByTheme } from \"./Root.constants.js\";\nconst {\n  classNames,\n  withStyle\n} = createWithStyle(ComponentName.FoldableListItem, {\n  \"container\": css`\n    display: flex;\n\n    ${typographyCSS(12, 400)};\n\n    line-height: 1.6em;\n    white-space: pre-wrap;\n    word-break: keep-all;\n  `,\n  \"container::before\": css`\n    content: '•';\n    font-size: 16px;\n    margin-right: 6px;\n  `\n});\nconst Item = withStyle(forwardRef(({\n  children,\n  className,\n  style,\n  ...rest\n}, ref) => {\n  const {\n    theme\n  } = useFoldableListContext();\n  return /* @__PURE__ */ jsx(\"div\", { ref, className: cx(className, classNames.container), style: {\n    ...textStyleByTheme[theme],\n    ...style\n  }, ...rest, children });\n}));\nexport {\n  Item\n};\n","import { jsxs, jsx } from \"react/jsx-runtime\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { forwardRef } from \"react\";\nimport { ComponentName } from \"../../../styles/ComponentName.js\";\nimport { createWithStyle } from \"../../../styles/createWithStyle.js\";\nimport { css } from \"../../../styles/css.js\";\nimport { typographyCSS } from \"../../../styles/typography.js\";\nimport { Icon } from \"../Icon/Icon.js\";\nimport { cx } from \"framer\";\nimport { useFoldableListContext } from \"./Root.hooks.js\";\nimport \"../../../hooks/stores/content/content.store.js\";\nimport \"../../../utils/event-properties/source.js\";\nimport { isCanvas } from \"../../../utils/framer/isCanvas.js\";\nimport { textStyleByTheme } from \"./Root.constants.js\";\nconst {\n  classNames,\n  withStyle\n} = createWithStyle(ComponentName.FoldableListTrigger, {\n  container: css`\n    display: flex;\n    align-items: center;\n    gap: 4px;\n    cursor: pointer;\n  `,\n  text: typographyCSS(14, 500, 1.6)\n});\nconst Trigger = withStyle(forwardRef(({\n  children,\n  className,\n  textStyle,\n  icons,\n  onClick,\n  ...rest\n}, ref) => {\n  const {\n    theme,\n    isFolded,\n    toggleFold\n  } = useFoldableListContext();\n  const {\n    initial = \"chevronDown\",\n    active = \"chevronUp\",\n    size = 14\n  } = icons ?? {};\n  const handleClick = (e) => {\n    onClick == null ? void 0 : onClick(e);\n    toggleFold();\n  };\n  return /* @__PURE__ */ jsxs(\"div\", { ref, className: cx(className, classNames.container), onClick: handleClick, ...rest, children: [\n    /* @__PURE__ */ jsx(\"div\", { className: classNames.text, style: {\n      ...textStyleByTheme[theme],\n      ...baseTextStyle,\n      ...textStyle\n    }, children }),\n    /* @__PURE__ */ jsx(AnimatePresence, { mode: \"wait\", children: /* @__PURE__ */ jsx(motion.div, { style: {\n      display: \"flex\",\n      alignItems: \"center\",\n      justifyContent: \"center\"\n    }, animate: {\n      opacity: 1\n    }, initial: {\n      opacity: isCanvas() ? 1 : 0\n    }, exit: {\n      opacity: 0\n    }, transition: {\n      duration: 0.2\n    }, children: /* @__PURE__ */ jsx(Icon, { type: isFolded ? initial : active, color: textStyleByTheme[theme].color, size, weight: \"bold\" }) }, isFolded ? \"plus\" : \"minus\") })\n  ] });\n}));\nconst baseTextStyle = {\n  minHeight: 20,\n  display: \"flex\",\n  alignItems: \"center\"\n};\nexport {\n  Trigger\n};\n","import { Content } from \"./Content.js\";\nimport { Item } from \"./Item.js\";\nimport { Root } from \"./Root.js\";\nimport { Trigger } from \"./Trigger.js\";\nconst FoldableList = {\n  Root,\n  Trigger,\n  Content,\n  Item\n};\nexport {\n  FoldableList\n};\n","import { CouponType, DiscountType, AvailableDayType } from \"../../../../types/models/coupon.js\";\nimport { deduplicate } from \"../../../../utils/deduplicate.js\";\nimport head from \"../../../../node_modules/lodash-es/head.js\";\nimport { parseISO } from \"../../../../node_modules/date-fns/parseISO.js\";\nimport { formatDate as format } from \"../../../../node_modules/date-fns/format.js\";\nconst DATE_FORMAT = \"yyyy/MM/dd HH:mm\";\nconst HOURS_IN_DAY = 24;\nconst getCouponNotices = (couponType, coupons) => {\n  const coupon = head(coupons);\n  if (!coupon) {\n    return [];\n  }\n  const formattedAvailablePeriod = formatAvailablePeriod(coupon);\n  const formattedMaxDiscountPrice = formatMaxDiscountPrice(couponType, sortCouponsByDiscountValueAscending(coupons));\n  const maxIssueCountNotice = createMaxIssueCountNotice(coupon.personMaxIssueCount);\n  if (couponType === CouponType.RANDOM) {\n    return getRandomCouponNotices(formattedAvailablePeriod, formattedMaxDiscountPrice);\n  }\n  if (coupon.discountType === DiscountType.FIXED_RATE) {\n    return getRateCouponNotices(formattedAvailablePeriod, formattedMaxDiscountPrice, maxIssueCountNotice);\n  }\n  return getAmountCouponNotices(formattedAvailablePeriod, formattedMaxDiscountPrice, maxIssueCountNotice);\n};\nconst createMaxIssueCountNotice = (maxIssueCount) => {\n  if (!maxIssueCount) {\n    return \"\";\n  }\n  const hasMaxIssueCount = maxIssueCount > 0;\n  if (!hasMaxIssueCount) {\n    return \"쿠폰은 이벤트 기간 중복 발급 가능합니다.\";\n  }\n  return `쿠폰은 이벤트 기간 동안 하나의 ID 당 ${maxIssueCount}회 발급 및 사용 가능합니다.`;\n};\nconst formatMaxDiscountPrice = (couponType, coupons) => {\n  const hasMaxDiscountPrice = coupons.some((coupon2) => coupon2.maxDiscountPrice > 0);\n  if (!hasMaxDiscountPrice) {\n    return \"제한 없음\";\n  }\n  const [coupon] = coupons;\n  if (couponType === CouponType.RANDOM) {\n    return formatRandomCouponMaxDiscountPrice(coupons);\n  }\n  if (coupon.discountType === DiscountType.FIXED_PRICE) {\n    return formatAmountCouponMaxDiscountPrice(coupons);\n  }\n  return formatRateCouponMaxDiscountPrice(coupons);\n};\nconst formatRateCouponMaxDiscountPrice = (coupons) => {\n  return `${composeWithUnit(getMaxDiscountPrice(coupons), \"원\")}`;\n};\nconst formatAmountCouponMaxDiscountPrice = (coupons) => {\n  const uniquified = uniquifyCouponsByMinPayAmount(coupons);\n  const formatted = uniquified.reduce((acc, curr) => {\n    const {\n      maxDiscountPrice,\n      minPayAmount\n    } = curr;\n    acc.push(`${composeWithUnit(minPayAmount, \"원\")} 이상 구매 시 ${composeWithUnit(maxDiscountPrice, \"원\")} 할인`);\n    return acc;\n  }, []);\n  return formatted.join(\", \");\n};\nconst formatRandomCouponMaxDiscountPrice = (coupons) => {\n  const uniquified = uniquifyCouponsByDiscountValue(coupons);\n  const formatted = uniquified.reduce((acc, curr) => {\n    const {\n      discountType,\n      discountValue,\n      maxDiscountPrice\n    } = curr;\n    acc.push(`${composeWithUnitByType(discountType, discountValue)} 쿠폰 ${composeWithUnit(maxDiscountPrice, \"원\")} 할인`);\n    return acc;\n  }, []);\n  return formatted.join(\", \");\n};\nconst formatAvailablePeriod = (coupon) => {\n  if (coupon.useAvailableDayType === AvailableDayType.DAY) {\n    return `쿠폰 발급 후 ${coupon.couponUseAfterDay * HOURS_IN_DAY}시간 이내`;\n  }\n  if (coupon.useAvailableDayType === AvailableDayType.RANGE) {\n    const availableStartAt = parseISO(coupon.couponUseStartAt);\n    const availableEndAt = parseISO(coupon.couponUseEndAt);\n    return `${format(availableStartAt, DATE_FORMAT)} - ${format(availableEndAt, DATE_FORMAT)}`;\n  }\n  return \"없음\";\n};\nconst uniquifyCouponsByDiscountValue = (coupons) => {\n  return deduplicate(coupons, (x, y) => x.discountValue === y.discountValue && x.maxDiscountPrice === y.maxDiscountPrice);\n};\nconst uniquifyCouponsByMinPayAmount = (coupons) => {\n  return deduplicate(coupons, (x, y) => x.minPayAmount === y.minPayAmount && x.maxDiscountPrice === y.maxDiscountPrice);\n};\nconst sortCouponsByDiscountValueAscending = (coupons) => {\n  return [...coupons].sort((x, y) => x.discountValue - y.discountValue);\n};\nconst getMaxDiscountPrice = (coupons) => {\n  return Math.max(...coupons.map((coupon) => coupon.maxDiscountPrice));\n};\nconst getRandomCouponNotices = (_availablePeriod, maxDiscountPrice) => [`쿠폰 사용 기간 : 발급일 기준 익일 11:59 까지`, `쿠폰 최대 할인 금액 : ${maxDiscountPrice}`, `다운로드한 쿠폰은 'MY PAGE > 사용 가능 쿠폰'에서 확인 가능합니다.`, `쿠폰을 사용한 이력이 있는 경우 쿠폰은 보이지 않습니다.`, `쿠폰 소멸, 발급 중단, 사용 완료된 쿠폰은 구매 취소 시 별도 재발급이 불가합니다.`, `브랜드 정책에 따라 일부 상품 쿠폰 적용이 불가할 수 있습니다.`];\nconst getRateCouponNotices = (availablePeriod, maxDiscountPrice, maxIssueCountNotice) => [`쿠폰 사용 기간 : ${availablePeriod}`, `쿠폰 최대 할인 금액 : ${maxDiscountPrice}`, maxIssueCountNotice, `다운로드한 쿠폰은 'MY PAGE > 사용 가능 쿠폰'에서 확인 가능합니다.`, `해당 쿠폰은 이벤트 참여 상품 대상으로만 적용 가능합니다.`, `쿠폰 적용 가능 상품은 수시로 변경되며, 일부 품목에 한하여 쿠폰 적용이 제한될 수 있습니다.`, `브랜드 재고 사정에 따라 품절이나 환불 안내를 받게 될 수 있습니다.`];\nconst getAmountCouponNotices = (availablePeriod, maxDiscountPrice, maxIssueCountNotice) => {\n  return [`쿠폰 사용 기간 : ${availablePeriod}`, `쿠폰 최대 할인 금액 : ${maxDiscountPrice}`, maxIssueCountNotice, `다운로드한 쿠폰은 'MY PAGE > 사용 가능 쿠폰'에서 확인 가능합니다.`, `해당 쿠폰은 이벤트 참여 상품 대상으로만 적용 가능합니다.`, `쿠폰 적용 가능 상품은 수시로 변경되며, 일부 품목에 한하여 쿠폰 적용이 제한될 수 있습니다.`, `브랜드 재고 사정에 따라 품절이나 환불 안내를 받게 될 수 있습니다.`];\n};\nconst composeWithUnitByType = (discountType, discountValue) => {\n  switch (discountType) {\n    case DiscountType.FIXED_RATE:\n      return composeWithUnit(discountValue, \"%\");\n    case DiscountType.FIXED_PRICE:\n      return composeWithUnit(discountValue, \"원\");\n  }\n};\nconst composeWithUnit = (discountValue, unit) => {\n  return `${discountValue.toLocaleString(\"ko-KR\")}${unit}`;\n};\nexport {\n  composeWithUnit,\n  composeWithUnitByType,\n  getCouponNotices\n};\n","import { jsxs, jsx } from \"react/jsx-runtime\";\nimport { useMemo } from \"react\";\nimport { FoldableList } from \"../../../@shared/FoldableList/index.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 \"../../../../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\";\nimport { typography } from \"../../../../styles/typography.js\";\nimport { getCouponNotices } from \"./NoticesElement.utils.js\";\nimport { filterMap } from \"../../../../utils/filterMap.js\";\nconst NoticesElement = ({\n  couponType,\n  coupons,\n  mainNotices,\n  hasAdditionalNotices,\n  additionalNotices\n}) => {\n  const theme = useTheme();\n  const uniqueMainNotices = [...new Set(mainNotices)];\n  const mergedAdditionalNotices = useMemo(() => [...getCouponNotices(couponType, coupons), ...additionalNotices], [couponType, coupons, additionalNotices]);\n  const uniqueAdditionalNotices = [...new Set(mergedAdditionalNotices)];\n  const hasMainNotices = mainNotices.length > 0;\n  const hasNotices = hasMainNotices || hasAdditionalNotices;\n  if (!hasNotices) {\n    return null;\n  }\n  return /* @__PURE__ */ jsxs(\"div\", { style: noticesLayout, children: [\n    hasMainNotices ? /* @__PURE__ */ jsx(\"div\", { style: mainNoticesStyle, children: uniqueMainNotices.map((notice) => /* @__PURE__ */ jsxs(\"div\", { style: {\n      ...typography(12, 400),\n      ...mainNoticeStyleByTheme[theme]\n    }, children: [\n      \"*\",\n      notice\n    ] }, notice)) }) : null,\n    hasAdditionalNotices ? /* @__PURE__ */ jsxs(FoldableList.Root, { theme, children: [\n      /* @__PURE__ */ jsx(FoldableList.Trigger, { style: {\n        gap: 2\n      }, textStyle: typography(12, 700), icons: {\n        initial: \"chevronDown\",\n        active: \"chevronUp\",\n        size: 12\n      }, children: \"유의사항\" }),\n      /* @__PURE__ */ jsx(FoldableList.Content, { children: filterMap(uniqueAdditionalNotices, (notice) => notice !== \"\", (notice) => /* @__PURE__ */ jsx(FoldableList.Item, { children: notice }, notice)) })\n    ] }) : null\n  ] });\n};\nconst noticesLayout = {\n  display: \"flex\",\n  flexDirection: \"column\",\n  gap: \"12px\",\n  marginTop: \"8px\"\n};\nconst mainNoticesStyle = {\n  width: \"100%\",\n  display: \"flex\",\n  flexDirection: \"column\"\n};\nconst mainNoticeStyleByTheme = {\n  light: {\n    color: \"#474747\"\n  },\n  dark: {\n    color: \"#a0a0a0\"\n  }\n};\nexport {\n  NoticesElement\n};\n","import { jsxs, jsx } from \"react/jsx-runtime\";\nimport { useState } from \"react\";\nimport { DiscountType } from \"../../../types/models/coupon.js\";\nimport \"../Countdown/Countdown.js\";\nimport \"react-dom\";\nimport \"../Dialog/Dialog.module.css.js\";\nimport \"framer-motion\";\nimport \"../Expandable/Expandable.js\";\nimport \"../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/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 \"../ResponsiveSplitView/ResponsiveSplitView.js\";\nimport \"../ResponsiveSplitViewOverlayButton/ResponsiveSplitViewOverlayButton.js\";\nimport { RollingNumber } from \"../RollingNumber/RollingNumber.js\";\nimport \"../TabBar/TabBar.js\";\nimport \"../TimeProgressBar/TimeProgressBar.js\";\nimport \"../ViewportContainer/ViewportContainer.js\";\nimport \"../TabBarV2/TabBarV2.js\";\nimport \"../TabBarV3/TabBarV3.js\";\nimport useInterval from \"../../../node_modules/react-use/esm/useInterval.js\";\nconst RandomDiscountValue = ({\n  discountType,\n  discountValues\n}) => {\n  const [index, setIndex] = useState(0);\n  useInterval(() => {\n    setIndex((index + 1) % discountValues.length);\n  }, 800);\n  return /* @__PURE__ */ jsxs(\"div\", { style: {\n    display: \"flex\",\n    alignItems: \"center\"\n  }, children: [\n    /* @__PURE__ */ jsx(RollingNumber, { value: discountValues[index] ?? 0 }),\n    discountType === DiscountType.FIXED_RATE ? \"%\" : \"원\"\n  ] });\n};\nexport {\n  RandomDiscountValue\n};\n","import { jsxs, jsx } from \"react/jsx-runtime\";\nimport { Countdown } from \"../../../systems/Countdown/Countdown.js\";\nimport \"react-dom\";\nimport \"react\";\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 { isCanvas } from \"../../../../utils/framer/isCanvas.js\";\nimport \"framer\";\nimport \"../../../../node_modules/@29cm/snowplow/dist/esm/core/snowplow.js\";\nimport \"../../../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\";\nimport { typography } from \"../../../../styles/typography.js\";\nimport { DiscountType, KindType, CouponType, AvailableDayType } from \"../../../../types/models/coupon.js\";\nimport { createKRTimeZoneDate } from \"../../../../utils/createUTCDate.js\";\nimport { RandomDiscountValue } from \"../../../systems/RandomDiscountValue/RandomDiscountValue.js\";\nimport { QueryType } from \"../../types.js\";\nimport { isAbove } from \"../../../../utils/date.js\";\nimport head from \"../../../../node_modules/lodash-es/head.js\";\nimport { isBefore } from \"../../../../node_modules/date-fns/isBefore.js\";\nimport { isAfter } from \"../../../../node_modules/date-fns/isAfter.js\";\nimport { formatDate as format } from \"../../../../node_modules/date-fns/format.js\";\nimport { isWithinInterval } from \"../../../../node_modules/date-fns/isWithinInterval.js\";\nimport { differenceInCalendarDays } from \"../../../../node_modules/date-fns/differenceInCalendarDays.js\";\nimport { ko } from \"../../../../node_modules/date-fns/locale/ko.js\";\nconst getCouponUseEndAt = (coupon) => {\n  if (coupon.useAvailableDayType === AvailableDayType.RANGE) {\n    return createKRTimeZoneDate(coupon.couponUseEndAt);\n  }\n  return void 0;\n};\nconst getCouponStatus = (coupon, logged, query, statuses) => {\n  var _a;\n  if (!coupon) {\n    return \"downloadable\";\n  }\n  if (isCanvas()) {\n    return \"downloadable\";\n  }\n  if (query.type === QueryType.Coupon && query.couponType === CouponType.RANDOM) {\n    return \"downloadable\";\n  }\n  const now = createKRTimeZoneDate();\n  const issueStartAt = createKRTimeZoneDate(coupon.couponIssueStartAt);\n  const issueEndAt = createKRTimeZoneDate(coupon.couponIssueEndAt);\n  const useEndAt = getCouponUseEndAt(coupon);\n  const isUpcoming = isBefore(now, issueStartAt);\n  const isEnd = isAfter(now, issueEndAt);\n  const isExpired = useEndAt !== void 0 && isAfter(now, useEndAt);\n  if (isUpcoming) {\n    return \"upcoming\";\n  }\n  if (isExpired || isEnd) {\n    return \"expired\";\n  }\n  if (!logged) {\n    return \"downloadable\";\n  }\n  const status = (_a = statuses.find((_status) => _status.couponId === coupon.id)) == null ? void 0 : _a.couponDownloadStatus;\n  switch (status) {\n    case \"NOT_ISSUED\":\n      return \"upcoming\";\n    case \"DOWNLOADABLE\":\n      return \"downloadable\";\n    case \"ISSUANCE_LIMIT_REACHED\":\n      return \"issuanceLimitedReached\";\n    case \"EXPIRED\":\n      return \"expired\";\n    case \"DOWNLOADED\":\n      return \"downloaded\";\n    case \"DISABLED\":\n      return \"disabled\";\n    default:\n      return \"downloadable\";\n  }\n};\nconst getCouponFallbackDescription = (coupons) => {\n  const discountValues = coupons.map((coupon) => coupon.discountValue);\n  const {\n    discountType = DiscountType.FIXED_RATE,\n    couponKindType = KindType.CART\n  } = head(coupons) ?? {};\n  const minDiscountValue = Math.min(...discountValues).toLocaleString(\"ko-KR\");\n  const maxDiscountValue = Math.max(...discountValues).toLocaleString(\"ko-KR\");\n  const unit = unitByDiscountType[discountType];\n  return `${minDiscountValue}${unit}~${maxDiscountValue}${unit} ${textByCouponKindType[couponKindType]} 쿠폰 랜덤 지급`;\n};\nconst unitByDiscountType = {\n  [DiscountType.FIXED_RATE]: \"%\",\n  [DiscountType.FIXED_PRICE]: \"원\"\n};\nconst textByCouponKindType = {\n  [KindType.CART]: \"장바구니\",\n  [KindType.PRODUCT]: \"상품\"\n};\nconst getUpcomingText = (issueStartAt) => {\n  const hour = format(issueStartAt, \"H\", {\n    locale: ko\n  });\n  const minute = format(issueStartAt, \"m\", {\n    locale: ko\n  });\n  const timeText = minute === \"0\" ? `${hour}시` : `${hour}시 ${minute}분`;\n  return `${format(issueStartAt, \"M월 d일(EEE)\", {\n    locale: ko\n  })} ${timeText} 발행 예정`;\n};\nconst getDescriptionByStatus = (coupon) => {\n  const issueStartAt = createKRTimeZoneDate(coupon.couponIssueStartAt);\n  const issueEndAt = createKRTimeZoneDate(coupon.couponIssueEndAt);\n  const useEndAt = getCouponUseEndAt(coupon);\n  return {\n    upcoming: getUpcomingText(issueStartAt),\n    downloadable: /* @__PURE__ */ jsxs(\"div\", { style: descriptionStyle, children: [\n      /* @__PURE__ */ jsx(Countdown, { targetDateString: format(issueEndAt, \"yyyy-MM-dd\"), targetTimeString: format(issueEndAt, \"HH:mm:ss\"), dateDisplayFormat: \"D일\", timeDisplayFormat: \"H시간 m분 s초\", fontSize: 12, color: \"inherit\", style: typography(12, 400) }),\n      \"남음\"\n    ] }),\n    downloaded: useEndAt ? /* @__PURE__ */ jsxs(\"div\", { style: descriptionStyle, children: [\n      /* @__PURE__ */ jsx(Countdown, { targetDateString: format(useEndAt, \"yyyy-MM-dd\"), targetTimeString: format(useEndAt, \"HH:mm:ss\"), dateDisplayFormat: \"D일\", timeDisplayFormat: \"H시간 m분 s초\", fontSize: 12, color: \"inherit\", style: typography(12, 400) }),\n      \"남음\"\n    ] }) : null,\n    expired: \"쿠폰 사용 기간이 종료되었어요\",\n    disabled: \"사용할 수 없는 쿠폰입니다\",\n    issuanceLimitedReached: \"쿠폰이 모두 소진되었어요\"\n  };\n};\nconst descriptionStyle = {\n  display: \"flex\",\n  alignItems: \"center\",\n  gap: 3,\n  color: \"inherit\"\n};\nconst markAsDownloaded = (statuses, couponIds) => {\n  return statuses.map((status) => ({\n    ...status,\n    couponDownloadStatus: status.couponDownloadStatus === \"DOWNLOADABLE\" && couponIds.includes(status.couponId) ? \"DOWNLOADED\" : status.couponDownloadStatus\n  }));\n};\nconst getCouponCollectionCouponName = (query) => {\n  var _a, _b;\n  const personMaxIssueCount = (_a = query.coupon) == null ? void 0 : _a.personMaxIssueCount;\n  const issueCount = personMaxIssueCount && personMaxIssueCount > 1 ? ` ${personMaxIssueCount}장` : \"\";\n  return `${(_b = query.coupon) == null ? void 0 : _b.couponName}${issueCount}`;\n};\nconst getRandomCouponName = (coupons) => {\n  var _a;\n  const sortByDiscountValue = sortCouponsByDiscountValueAscending(coupons);\n  const couponDiscountValues = sortByDiscountValue.map((coupon) => coupon.discountValue);\n  return /* @__PURE__ */ jsxs(\"div\", { style: {\n    display: \"flex\",\n    alignItems: \"center\",\n    gap: 6\n  }, children: [\n    /* @__PURE__ */ jsx(\"div\", { children: /* @__PURE__ */ jsx(RandomDiscountValue, { discountType: ((_a = head(coupons)) == null ? void 0 : _a.discountType) ?? DiscountType.FIXED_RATE, discountValues: couponDiscountValues }) }),\n    /* @__PURE__ */ jsx(\"span\", { children: \"쿠폰\" })\n  ] });\n};\nconst getGeneralCouponName = (coupons) => {\n  if (coupons.length === 1) {\n    const firstCoupon = coupons[0];\n    const personMaxIssueCount = firstCoupon.personMaxIssueCount;\n    const issueCount = personMaxIssueCount && personMaxIssueCount > 1 ? ` ${personMaxIssueCount}장` : \"\";\n    return getCouponNameByDiscountType(firstCoupon) + issueCount;\n  }\n  const isAllFixedRateCoupon = coupons.every((coupon) => coupon.discountType === DiscountType.FIXED_RATE);\n  const maxDiscountValue = Math.max(...coupons.map((coupon) => coupon.discountValue), 0).toLocaleString(\"ko-KR\");\n  if (isAllFixedRateCoupon) {\n    return `${maxDiscountValue}% 쿠폰 외 ${coupons.length - 1}장`;\n  }\n  return `${maxDiscountValue}원 쿠폰 외 ${coupons.length - 1}장`;\n};\nconst getCouponNameByCouponType = (coupons, query) => {\n  switch (query.couponType) {\n    case CouponType.RANDOM:\n      return getRandomCouponName(coupons);\n    case CouponType.LIMITED:\n    case CouponType.NORMAL:\n      return getGeneralCouponName(coupons);\n  }\n};\nconst getCouponName = (coupons, query) => {\n  if (coupons.length === 0) {\n    return \"\";\n  }\n  switch (query.type) {\n    case QueryType.CouponCollection:\n      return getCouponCollectionCouponName(query);\n    case QueryType.KeywordCollection:\n      return getGeneralCouponName(coupons);\n    case QueryType.Coupon:\n      return getCouponNameByCouponType(coupons, query);\n  }\n};\nconst getCouponNameByDiscountType = (coupon) => {\n  if (!coupon) {\n    return \"\";\n  }\n  const {\n    discountType,\n    discountValue\n  } = coupon;\n  const postfix = discountType === DiscountType.FIXED_PRICE ? \"원 쿠폰\" : \"% 쿠폰\";\n  return discountValue.toLocaleString(\"ko-KR\") + postfix;\n};\nconst sortCouponsByDiscountValueAscending = (coupons) => {\n  return [...coupons].sort((x, y) => x.discountValue - y.discountValue);\n};\nconst findCurrentSchedule = (schedule) => {\n  const now = createKRTimeZoneDate();\n  const scheduleIndex = schedule.findIndex((item, index) => {\n    const {\n      shouldUpdateAt\n    } = item;\n    const next = schedule[index + 1];\n    const hasNext = next !== void 0;\n    const isFirst = index === 0 && isAbove(shouldUpdateAt, now);\n    const isWithin = hasNext && isWithinInterval(now, {\n      start: shouldUpdateAt,\n      end: next.shouldUpdateAt\n    });\n    const isLast = !hasNext && isAbove(now, shouldUpdateAt);\n    return isFirst || isWithin || isLast;\n  });\n  return schedule[scheduleIndex];\n};\nconst toSchedule = (options) => sortScheduleAscending(toCouponSchedule(options));\nconst sortScheduleAscending = (schedule) => {\n  return [...schedule].sort((x, y) => x.shouldUpdateAt.getTime() - y.shouldUpdateAt.getTime());\n};\nconst toCouponSchedule = (options) => {\n  return options.flatMap((option) => {\n    const {\n      dailyCouponIds,\n      updateSchedule,\n      updateAt\n    } = option;\n    const {\n      startAt,\n      endAt\n    } = updateSchedule;\n    if (!startAt || !endAt) {\n      return [];\n    }\n    const diff = differenceInCalendarDays(endAt, startAt);\n    return Array.from({\n      length: diff + 1\n    }, (_, index) => {\n      const {\n        hours,\n        minutes,\n        seconds\n      } = updateAt;\n      const date = createKRTimeZoneDate(startAt);\n      date.setDate(date.getDate() + index);\n      date.setHours(hours, minutes, seconds);\n      return {\n        shouldUpdateAt: date,\n        couponIdList: dailyCouponIds[index]\n      };\n    });\n  });\n};\nexport {\n  findCurrentSchedule,\n  getCouponFallbackDescription,\n  getCouponName,\n  getCouponStatus,\n  getDescriptionByStatus,\n  markAsDownloaded,\n  toSchedule\n};\n","import { toCouponNos } from \"../../../../hooks/useDownloadCoupons.js\";\nimport { CouponUpdateType } from \"../CouponModule.types.js\";\nimport { CouponType } from \"../../../../types/models/coupon.js\";\nimport { shallowUnique } from \"../../../../utils/unique.js\";\nimport { useState, useEffect } from \"react\";\nimport { QueryType } from \"../../types.js\";\nimport { findCurrentSchedule, toSchedule } from \"./CouponElement.utils.js\";\nimport useInterval from \"../../../../node_modules/react-use/esm/useInterval.js\";\nconst MS_IN_SECOND = 1e3;\nconst DEFAULT_COUPON_ITEM_ENTRY = {\n  couponIds: [],\n  updateType: CouponUpdateType.NORMAL,\n  couponType: CouponType.NORMAL\n};\nconst useCouponIds = ({\n  query\n}) => {\n  const [couponItemEntry, setCouponItemEntry] = useState(getCouponItemEntry({\n    query\n  }) ?? DEFAULT_COUPON_ITEM_ENTRY);\n  useInterval(() => {\n    if (couponItemEntry.updateType === CouponUpdateType.NORMAL) {\n      return;\n    }\n    const currentSchedule = findCurrentSchedule(couponItemEntry.schedules ?? []);\n    setCouponItemEntry((prev) => ({\n      ...prev,\n      couponIds: shallowUnique(toCouponNos((currentSchedule == null ? void 0 : currentSchedule.couponIdList) ?? \"\"))\n    }));\n  }, MS_IN_SECOND);\n  useEffect(() => {\n    setCouponItemEntry(getCouponItemEntry({\n      query\n    }) ?? DEFAULT_COUPON_ITEM_ENTRY);\n  }, [query]);\n  return {\n    couponIds: couponItemEntry.couponIds,\n    couponType: couponItemEntry.couponType\n  };\n};\nconst getCouponCollectionCouponItemEntry = ({\n  coupon\n}) => {\n  return {\n    couponIds: coupon ? [coupon.couponId] : [],\n    updateType: CouponUpdateType.NORMAL,\n    couponType: CouponType.NORMAL\n  };\n};\nconst getKeywordCollectionCouponItemEntry = ({\n  couponId\n}) => {\n  return {\n    couponIds: couponId ? [couponId] : [],\n    updateType: CouponUpdateType.NORMAL,\n    couponType: CouponType.NORMAL\n  };\n};\nconst getRandomCouponItemEntry = (query) => {\n  const {\n    couponType,\n    couponIds = \"\"\n  } = query;\n  return {\n    couponIds: shallowUnique(toCouponNos(couponIds)),\n    updateType: CouponUpdateType.NORMAL,\n    couponType\n  };\n};\nconst getNormalCouponItemEntry = (query) => {\n  const {\n    couponType,\n    couponIds = \"\",\n    couponUpdateType\n  } = query;\n  return {\n    couponIds: shallowUnique(toCouponNos(couponIds)),\n    updateType: couponUpdateType,\n    couponType\n  };\n};\nconst getDailyCouponItemEntry = (query) => {\n  const {\n    couponType,\n    dailyCouponOptions = [],\n    couponUpdateType\n  } = query;\n  const schedules = toSchedule(dailyCouponOptions);\n  const currentSchedule = findCurrentSchedule(schedules);\n  return {\n    couponIds: shallowUnique(toCouponNos((currentSchedule == null ? void 0 : currentSchedule.couponIdList) ?? \"\")),\n    updateType: couponUpdateType,\n    couponType,\n    schedules\n  };\n};\nconst getGeneralCouponItemEntry = (query) => {\n  switch (query.couponUpdateType) {\n    case CouponUpdateType.NORMAL:\n      return getNormalCouponItemEntry(query);\n    case CouponUpdateType.DAILY:\n      return getDailyCouponItemEntry(query);\n    default:\n      return null;\n  }\n};\nconst getCouponItemEntryByCouponType = (query) => {\n  switch (query.couponType) {\n    case CouponType.RANDOM:\n      return getRandomCouponItemEntry(query);\n    case CouponType.LIMITED:\n    case CouponType.NORMAL:\n      return getGeneralCouponItemEntry(query);\n    default:\n      return null;\n  }\n};\nconst getCouponItemEntry = ({\n  query\n}) => {\n  if (query === void 0) {\n    return null;\n  }\n  switch (query.type) {\n    case QueryType.CouponCollection:\n      return getCouponCollectionCouponItemEntry(query);\n    case QueryType.KeywordCollection:\n      return getKeywordCollectionCouponItemEntry(query);\n    case QueryType.Coupon:\n      return getCouponItemEntryByCouponType(query);\n    default:\n      return null;\n  }\n};\nexport {\n  useCouponIds\n};\n","import { CouponType } from \"../../../../types/models/coupon.js\";\nimport { QueryType } from \"../../types.js\";\nimport { CouponUpdateType } from \"../CouponModule.types.js\";\nimport { toSchedule } from \"./CouponElement.utils.js\";\nimport { filterMap } from \"../../../../utils/filterMap.js\";\nconst validateCoupon = ({\n  query,\n  enabled\n}) => {\n  if (!enabled) {\n    return {\n      isValid: true\n    };\n  }\n  return validateCouponByQuery(query);\n};\nconst validateDailyUpdateCoupon = (query) => {\n  const schedule = toSchedule(query.dailyCouponOptions ?? []);\n  const isValid = schedule.every(({\n    couponIdList\n  }) => couponIdList !== void 0);\n  const errorMessage = isValid ? void 0 : `[관리자용 메시지] 일자별 쿠폰이 모두 입력되어 있는지 확인해주세요.\n${filterMap(schedule, ({\n    couponIdList\n  }) => couponIdList === void 0, ({\n    shouldUpdateAt\n  }) => {\n    return `[${shouldUpdateAt.toLocaleDateString()}] 쿠폰이 없습니다.`;\n  }).join(\"\\n\")}`;\n  return {\n    isValid,\n    errorMessage\n  };\n};\nconst validateCouponQuery = (query) => {\n  if (query.couponType === CouponType.RANDOM) {\n    return {\n      isValid: true\n    };\n  }\n  switch (query.couponUpdateType) {\n    case CouponUpdateType.DAILY:\n      return validateDailyUpdateCoupon(query);\n    default:\n      return {\n        isValid: true\n      };\n  }\n};\nconst validateCouponByQuery = (query) => {\n  if (query === void 0) {\n    return {\n      isValid: false,\n      errorMessage: \"쿠폰 쿼리가 없습니다.\"\n    };\n  }\n  switch (query.type) {\n    case QueryType.Coupon:\n      return validateCouponQuery(query);\n    default:\n      return {\n        isValid: true\n      };\n  }\n};\nexport {\n  validateCoupon\n};\n","import { jsx, jsxs, Fragment } from \"react/jsx-runtime\";\nimport { useMemo, useRef, useEffect } from \"react\";\nimport { Coupon } from \"../../../@shared/Coupon/index.js\";\nimport { EventTrigger } from \"../../../@shared/EventTrigger/index.js\";\nimport { useSegment } from \"../../../@shared/providers/SegmentProvider/SegmentProvider.js\";\nimport { useRootComponentId, useSetRootModule } from \"../../hooks.js\";\nimport { useQueryStore } from \"../../query-store/query.store.js\";\nimport { QueryType } from \"../../types.js\";\nimport \"../../../systems/curations/IntersectionProvider/IntersectionProvider.js\";\nimport { useIntersectionContext } from \"../../../systems/curations/IntersectionProvider/IntersectionProvider.hooks.js\";\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 { isCanvas } from \"../../../../utils/framer/isCanvas.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 { 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\";\nimport { useFetchCouponsDownloadStatus } from \"../../../../hooks/fetchers/useFetchCouponsDownloadStatus.js\";\nimport { useTrackSnowplowEvent } from \"../../../../hooks/snowplow/useTrackSnowplowEvent.js\";\nimport { useDownloadCoupons } from \"../../../../hooks/useDownloadCoupons.js\";\nimport { toBackgroundColor } from \"../../../../libs/property-controls/coupon.js\";\nimport { CouponType } from \"../../../../types/models/coupon.js\";\nimport { hideClosestParentByFramerName } from \"../../../../utils/hideParentElement.js\";\nimport { getPaddingStyle } from \"../../../../utils/spacing.js\";\nimport { useCouponsQuery } from \"../CouponModule.hooks.js\";\nimport { NoticesElement } from \"../NoticesElement/NoticesElement.js\";\nimport { useCouponIds } from \"./CouponElement.hooks.js\";\nimport { getCouponName, getCouponStatus, getCouponFallbackDescription, getDescriptionByStatus, markAsDownloaded } from \"./CouponElement.utils.js\";\nimport { validateCoupon } from \"./CouponElement.validate.js\";\nimport head from \"../../../../node_modules/lodash-es/head.js\";\nconst CouponElement = ({\n  loading = false,\n  query: _query,\n  output,\n  layout\n}) => {\n  const {\n    logged,\n    userNo\n  } = useCurrentUser();\n  const trackSnowplowEvent = useTrackSnowplowEvent();\n  const dispatchSetQuery = useQueryStore((state) => state.dispatchSetQuery);\n  const theme = useTheme();\n  const {\n    isInView\n  } = useIntersectionContext();\n  const query = useMemo(() => attachAdditionalQuery(_query, output), [_query, output]);\n  const {\n    isVisible\n  } = useSegment();\n  const rootRef = useRef(null);\n  const componentId = useRootComponentId(query);\n  const {\n    couponIds,\n    couponType\n  } = useCouponIds({\n    query\n  });\n  const isFramer = isCanvas();\n  const {\n    isValid,\n    errorMessage\n  } = validateCoupon({\n    query,\n    enabled: isFramer\n  });\n  const {\n    coupons\n  } = useCouponsQuery({\n    query,\n    couponIds,\n    enabled: isInView\n  });\n  const headCoupon = head(coupons);\n  const hasCoupon = headCoupon !== void 0;\n  const isRandomCoupon = (query == null ? void 0 : query.type) === QueryType.Coupon && (query == null ? void 0 : query.couponType) === CouponType.RANDOM;\n  const enabledFetchCouponDownloadStatus = isInView && !isRandomCoupon;\n  const {\n    statuses,\n    isLoading,\n    mutate\n  } = useFetchCouponsDownloadStatus(couponIds, userNo, enabledFetchCouponDownloadStatus);\n  const handleCouponDownloadSuccess = () => {\n    if (!headCoupon) {\n      return;\n    }\n    trackSnowplowEvent(\"click_button\", {\n      section_name: componentId || \"unknown_section\",\n      section_title: componentId || \"unknown_section\",\n      position: -1,\n      button_id: `coupondown_${headCoupon.id}`,\n      button_name: headCoupon.couponName,\n      layout_position: -1\n    });\n  };\n  const {\n    validate,\n    download\n  } = useDownloadCoupons(couponType, headCoupon == null ? void 0 : headCoupon.discountType, handleCouponDownloadSuccess);\n  const shouldRender = query && hasCoupon && (!loading || !isLoading || !logged);\n  const paddingStyle = getPaddingStyle(layout);\n  useEffect(() => {\n    window == null ? void 0 : window.dispatchEvent(new CustomEvent(\"layout-done\"));\n    if (!query) {\n      return;\n    }\n    if (!output) {\n      return;\n    }\n    dispatchSetQuery(output, query);\n  }, [output, query]);\n  useSetRootModule(query, output);\n  const shouldRenderError = !isValid && isFramer;\n  useEffect(() => {\n    if (rootRef.current) {\n      hideClosestParentByFramerName(rootRef.current, \"카테고리첫구매쿠폰\", isVisible);\n    }\n  }, [isVisible]);\n  if (!isVisible) {\n    window == null ? void 0 : window.dispatchEvent(new CustomEvent(\"layout-done\"));\n    return /* @__PURE__ */ jsx(\"div\", { ref: rootRef });\n  }\n  if (!shouldRender) {\n    return /* @__PURE__ */ jsxs(Fragment, { children: [\n      /* @__PURE__ */ jsx(Coupon.Root, { ref: rootRef, style: {\n        padding: paddingStyle\n      }, loading: true, theme }),\n      shouldRenderError ? /* @__PURE__ */ jsx(\"div\", { style: errorMessageStyle, children: errorMessage ?? \"쿠폰 상태가 올바르지 않습니다.\" }) : null\n    ] });\n  }\n  const downloadCount = Math.max(headCoupon.personMaxIssueCount ?? 1, 1);\n  const downloadCoupon = async () => {\n    await download(couponIds, downloadCount, true);\n    return markAsDownloaded(statuses, couponIds);\n  };\n  const handleClick = () => {\n    if (!validate()) {\n      return;\n    }\n    mutate(downloadCoupon(), {\n      optimisticData: markAsDownloaded(statuses, couponIds),\n      rollbackOnError: true,\n      populateCache: true,\n      revalidate: true\n    });\n  };\n  const handleImpression = () => {\n    trackSnowplowEvent(\"impression_content\", {\n      section_name: componentId || \"unknown_section\",\n      section_title: componentId || \"unknown_section\",\n      position: -1,\n      layout_position: -1,\n      layout_id: `coupondown_${headCoupon.id}`\n    });\n  };\n  const couponName = getCouponName(coupons, query);\n  const status = getCouponStatus(headCoupon, logged, query, statuses);\n  const description = isRandomCoupon ? getCouponFallbackDescription(coupons) : getDescriptionByStatus(headCoupon)[status];\n  const {\n    backgroundColor,\n    ...rest\n  } = layout;\n  return /* @__PURE__ */ jsxs(EventTrigger.Root, { ref: rootRef, style: {\n    padding: paddingStyle\n  }, types: [\"impression\"], onImpression: handleImpression, children: [\n    /* @__PURE__ */ jsxs(Coupon.Root, { theme, backgroundColor: toBackgroundColor(backgroundColor), status, children: [\n      /* @__PURE__ */ jsxs(Coupon.Summary, { children: [\n        /* @__PURE__ */ jsx(Coupon.Title, { children: couponName }),\n        /* @__PURE__ */ jsx(Coupon.Description, { children: description })\n      ] }),\n      /* @__PURE__ */ jsx(Coupon.Divider, {}),\n      /* @__PURE__ */ jsx(EventTrigger.Target, { style: {\n        aspectRatio: \"1 / 1\"\n      }, children: /* @__PURE__ */ jsx(Coupon.Button, { onClick: handleClick }) })\n    ] }),\n    /* @__PURE__ */ jsx(NoticesElement, { couponType, coupons, ...rest }),\n    shouldRenderError ? /* @__PURE__ */ jsx(\"div\", { style: errorMessageStyle, children: errorMessage ?? \"쿠폰 상태가 올바르지 않습니다.\" }) : null\n  ] });\n};\nconst errorMessageStyle = {\n  background: \"white\",\n  border: \"0.7px solid #00000066\",\n  borderRadius: \"2px\",\n  padding: \"8px\",\n  whiteSpace: \"pre-line\"\n};\nconst attachAdditionalQuery = (query, output) => {\n  return query ? {\n    ...query,\n    isRoot: query.rootOutput === void 0,\n    rootOutput: query.rootOutput || output\n  } : void 0;\n};\nexport {\n  CouponElement\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { useQueryStore } from \"../../query-store/query.store.js\";\nimport { CouponElement } from \"../CouponElement/CouponElement.js\";\nimport { createKey } from \"../../utils/key.js\";\nconst LinkedCouponModule = ({\n  value,\n  output,\n  layout\n}) => {\n  const query = useQueryStore((state) => state.queries[value]);\n  return /* @__PURE__ */ jsx(CouponElement, { query, output, layout }, createKey(query));\n};\nexport {\n  LinkedCouponModule\n};\n","import { ControlType } from \"framer\";\nconst COUPON_NOTICES_CONTROLS = {\n  mainNotices: {\n    type: ControlType.Array,\n    title: \"메인 유의사항\",\n    description: \"상시 노출되는 유의사항으로, 최대 두 줄 입력이 가능합니다.\",\n    control: {\n      type: ControlType.String\n    },\n    maxCount: 2\n  },\n  hasAdditionalNotices: {\n    type: ControlType.Boolean,\n    title: \"추가 유의사항 노출\",\n    enabledTitle: \"노출\",\n    disabledTitle: \"미노출\",\n    defaultValue: false\n  },\n  additionalNotices: {\n    hidden: ({\n      hasAdditionalNotices\n    }) => hasAdditionalNotices === false,\n    type: ControlType.Array,\n    title: \"추가 유의사항\",\n    description: \"더보기 클릭 시 노출되는 추가 유의사항입니다.\",\n    control: {\n      type: ControlType.String\n    }\n  }\n};\nexport {\n  COUPON_NOTICES_CONTROLS\n};\n","import { combineObjectPropertyControls } from \"../../../libs/property-controls/helpers.js\";\nimport { QUERY_CONTROL, COUPON_CONTROLS, KEYWORD_COLLECTIONS_CONTROLS, KEYWORD_COLLECTION_CONTROLS } from \"../controls.js\";\nconst MANUAL_COUPON_MODULE_QUERY = {\n  ...QUERY_CONTROL,\n  controls: combineObjectPropertyControls(COUPON_CONTROLS)\n};\nconst AUTO_COUPON_MODULE_QUERY = {\n  ...QUERY_CONTROL,\n  controls: combineObjectPropertyControls(KEYWORD_COLLECTION_CONTROLS, KEYWORD_COLLECTIONS_CONTROLS)\n};\nexport {\n  AUTO_COUPON_MODULE_QUERY,\n  MANUAL_COUPON_MODULE_QUERY\n};\n","import useSWR from \"../../../../node_modules/swr/core/dist/index.js\";\nimport { collectionApi } from \"../../../../apis/collection/CollectionApiService.js\";\nimport { keywordCollectionApi } from \"../../../../apis/keyword-collections/KeywordCollectionApiService.js\";\nimport { QueryType } from \"../../types.js\";\nimport { orderByDateAsc, getCurrentScheduleIndex } from \"../../../../utils/date.js\";\nimport { splitToNumberArray } from \"../../../../utils/splitToNumberArray.js\";\nconst COUPON_ID_FETCHER_KEY = \"coupon-module/coupon-id\";\nconst useCouponIdQuery = (options) => {\n  const {\n    enabled: _enabled = true,\n    query\n  } = options;\n  const enabled = _enabled && query !== void 0;\n  const {\n    data,\n    isLoading,\n    ...rest\n  } = useSWR(enabled ? [COUPON_ID_FETCHER_KEY, query] : null, () => queryCouponId(query));\n  return {\n    isLoading: isLoading || !enabled,\n    query: data,\n    ...rest\n  };\n};\nconst fetchKeywordCollectionCouponId = async (query) => {\n  if (!query.keywordCollectionId) {\n    return query;\n  }\n  const {\n    data\n  } = await keywordCollectionApi.getKeywordCollection(Number(query.keywordCollectionId));\n  const {\n    title,\n    description,\n    displayEndAt,\n    productGroups,\n    couponId\n  } = data;\n  const [firstProductGroup] = productGroups;\n  return {\n    ...query,\n    title,\n    description: description ?? void 0,\n    displayEndAt: displayEndAt ?? void 0,\n    couponId: couponId ?? void 0,\n    productGroups,\n    selectedProductGroup: {\n      id: firstProductGroup.productGroupId,\n      sort: firstProductGroup.sort,\n      index: 0\n    }\n  };\n};\nconst fetchKeywordCollectionsCouponId = async (query) => {\n  if (!query.keywordCollectionIds) {\n    return query;\n  }\n  const {\n    data\n  } = await collectionApi.getCollections(splitToNumberArray(query.keywordCollectionIds));\n  const collections = orderByDateAsc(data, (x) => x.displayStartAt);\n  const currentIndex = getCurrentScheduleIndex(collections, (current) => current.displayStartAt, (_, next) => next == null ? void 0 : next.displayStartAt);\n  const collection = collections[currentIndex ?? 0];\n  if (!collection) {\n    return query;\n  }\n  const {\n    collectionId,\n    title,\n    description,\n    displayEndAt,\n    productGroupList,\n    couponId\n  } = collection;\n  const [firstProductGroup] = productGroupList;\n  return {\n    type: QueryType.KeywordCollection,\n    keywordCollectionId: `${collectionId}`,\n    title,\n    description: description ?? void 0,\n    displayEndAt: displayEndAt ?? void 0,\n    couponId: couponId ?? void 0,\n    productGroups: productGroupList.map((group) => ({\n      productGroupId: group.collectionProductGroupId,\n      title: group.title,\n      sort: group.sort\n    })),\n    selectedProductGroup: {\n      id: firstProductGroup.collectionProductGroupId,\n      sort: firstProductGroup.sort,\n      index: 0\n    }\n  };\n};\nconst queryCouponId = (query) => {\n  if (!query) {\n    return;\n  }\n  switch (query.type) {\n    case QueryType.KeywordCollection:\n      return fetchKeywordCollectionCouponId(query);\n    case QueryType.KeywordCollections:\n      return fetchKeywordCollectionsCouponId(query);\n    default:\n      return query;\n  }\n};\nexport {\n  useCouponIdQuery\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport \"../../../systems/curations/IntersectionProvider/IntersectionProvider.js\";\nimport { useIntersectionContext } from \"../../../systems/curations/IntersectionProvider/IntersectionProvider.hooks.js\";\nimport { useCouponIdQuery } from \"./AutoCouponModule.hooks.js\";\nimport { CouponElement } from \"../CouponElement/CouponElement.js\";\nconst AutoCouponModule = ({\n  query: _query,\n  output,\n  layout\n}) => {\n  const {\n    isInView\n  } = useIntersectionContext();\n  const {\n    isLoading,\n    query\n  } = useCouponIdQuery({\n    query: _query,\n    enabled: isInView\n  });\n  return /* @__PURE__ */ jsx(CouponElement, { loading: isLoading, query, output, layout });\n};\nexport {\n  AutoCouponModule\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { addPropertyControls, ControlType } from \"framer\";\nimport { COUPON_CONTROLS } from \"../../../libs/property-controls/coupon.js\";\nimport { THEME_CONTROLS } from \"../../../libs/property-controls/theme.js\";\nimport { SEGMENT_CONTROLS } from \"../../../libs/property-controls/segment.js\";\nimport { CouponModuleInputType } from \"./CouponModule.types.js\";\nimport { LinkedCouponModule } from \"./LinkedCouponModule/LinkedCouponModule.js\";\nimport { COUPON_NOTICES_CONTROLS } from \"../../../libs/property-controls/coupon-notices.js\";\nimport { COMPONENT_ID_PROPS } from \"../../../libs/property-controls/component-id.js\";\nimport { SectionLayout } from \"../../systems/curations/SectionLayout/SectionLayout.js\";\nimport { MANUAL_COUPON_MODULE_QUERY, AUTO_COUPON_MODULE_QUERY } from \"./CouponModule.controls.js\";\nimport { AutoCouponModule } from \"./AutoCouponModule/AutoCouponModule.js\";\nimport { CouponElement } from \"./CouponElement/CouponElement.js\";\nconst CouponModuleInner = ({\n  input,\n  output,\n  layout\n}) => {\n  switch (input.type) {\n    case CouponModuleInputType.Linked:\n      return /* @__PURE__ */ jsx(LinkedCouponModule, { value: input.value, output, layout });\n    case CouponModuleInputType.Auto:\n      return /* @__PURE__ */ jsx(AutoCouponModule, { query: input.autoQuery, output, layout });\n    case CouponModuleInputType.Manual:\n      return /* @__PURE__ */ jsx(CouponElement, { query: input.query, output, layout });\n    default:\n      return null;\n  }\n};\nconst CouponModule = ({\n  theme,\n  componentId,\n  segment,\n  ...rest\n}) => {\n  return /* @__PURE__ */ jsx(SectionLayout, { componentId, theme, segment, children: /* @__PURE__ */ jsx(CouponModuleInner, { ...rest }) });\n};\naddPropertyControls(CouponModule, {\n  ...THEME_CONTROLS,\n  ...SEGMENT_CONTROLS,\n  componentId: {\n    hidden: ({\n      input\n    }) => (input == null ? void 0 : input.type) === CouponModuleInputType.Linked,\n    ...COMPONENT_ID_PROPS.componentId\n  },\n  input: {\n    type: ControlType.Object,\n    title: \"입력 값\",\n    controls: {\n      type: {\n        type: ControlType.Enum,\n        title: \"유형\",\n        options: [CouponModuleInputType.Manual, CouponModuleInputType.Linked, CouponModuleInputType.Auto],\n        optionTitles: [\"수동\", \"연결\", \"자동\"],\n        defaultValue: CouponModuleInputType.Manual\n      },\n      value: {\n        hidden: ({\n          type\n        }) => type !== CouponModuleInputType.Linked,\n        type: ControlType.String,\n        title: \"출력 값\",\n        defaultValue: \"\"\n      },\n      query: {\n        hidden: ({\n          type\n        }) => type !== CouponModuleInputType.Manual,\n        ...MANUAL_COUPON_MODULE_QUERY\n      },\n      autoQuery: {\n        hidden: ({\n          type\n        }) => type !== CouponModuleInputType.Auto,\n        ...AUTO_COUPON_MODULE_QUERY\n      }\n    }\n  },\n  output: {\n    type: ControlType.String,\n    title: \"출력 값\",\n    defaultValue: \"\"\n  },\n  layout: {\n    type: ControlType.Object,\n    title: \"레이아웃\",\n    controls: {\n      ...COUPON_CONTROLS,\n      ...COUPON_NOTICES_CONTROLS,\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  CouponModule\n};\n","import{CouponModule}from\"https://asset.29cm.co.kr/contents/framer/components/modules/CouponModule/CouponModule.js\";CouponModule.displayName=\"[조립형]Coupon\";export default CouponModule;\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CouponModule\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./CouponModule.map"],"mappings":"47DAAqC,CAO/B,GAAkB,CACtB,gBAAiB,CACf,KAAM,EAAY,OAClB,MAAO,SACP,SAAU,CACR,UAAW,CACT,KAAM,EAAY,KAClB,MAAO,KACP,aAAc,CAAC,KAAM,KAAM,QAAQ,CACnC,QAAS,CACP,UACA,QACA,WAED,CACF,CACD,MAAO,CACL,KAAM,EAAY,MAClB,MAAO,KACP,SAAU,GACV,QAAS,CACP,eACI,IAAc,QAErB,CACD,SAAU,CACR,KAAM,EAAY,OAClB,MAAO,QACP,SAAU,CACR,MAAO,CACL,KAAM,EAAY,MAClB,MAAO,YACP,QAAS,CACP,KAAM,EAAY,OAClB,MAAO,WACP,SAAU,CACR,MAAO,CACL,KAAM,EAAY,MAClB,MAAO,KACP,SAAU,GACX,CACD,cAAe,CACb,KAAM,EAAY,OAClB,MAAO,MACP,KAAM,IACN,IAAK,EACL,IAAK,IACL,aAAc,EACd,KAAM,EACN,eAAgB,GACjB,CACF,CACF,CACF,CACD,OAAQ,CACN,KAAM,EAAY,OAClB,MAAO,KACP,KAAM,MACN,aAAc,EACd,KAAM,EACN,eAAgB,GACjB,CACF,CACD,QAAS,CACP,eACI,IAAc,WAErB,CACF,CACF,CACF,CACK,GAAqB,GAAoB,CAC7C,GAAM,CACJ,YACA,QACA,YACE,EAeJ,MAd8B,CAE1B,QAEC,IAAK,GAEN,MAEC,EAED,SAEC,EACJ,CAC4B,uBClGzB,EAAgB,CACpB,QAAS,CACP,WAAY,CACV,MAAO,UACP,KAAM,UACP,CACD,QAAS,CACP,MAAO,OACP,KAAM,OACP,CACD,UAAW,CACT,MAAO,UACP,KAAM,UACP,CACD,SAAU,CACR,MAAO,qBACP,KAAM,2BACP,CACD,OAAQ,4BACT,CACD,OAAQ,CAEN,WAAY,CACV,MAAO,UACP,KAAM,UACP,CACD,QAAS,CACP,MAAO,OACP,KAAM,OACP,CACD,UAAW,CACT,MAAO,OACP,KAAM,OACP,CACD,SAAU,CACR,MAAO,OACP,KAAM,OACP,CACD,OAAQ,2BACT,CACD,SAAU,CACR,WAAY,CACV,MAAO,UACP,KAAM,UACP,CACD,QAAS,CACP,MAAO,U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"}