{"version":3,"file":"static/chunks/5765-e1f5a8a7436ae9ca.js","mappings":"AACA","sources":["webpack://_N_E/./src/components/modal/BottomDrawer.tsx","webpack://_N_E/./src/components/Product/AllowanceChip.tsx","webpack://_N_E/./src/components/Product/AllowanceChipList.tsx","webpack://_N_E/./src/components/Product/ExtraResourceNew.tsx","webpack://_N_E/./src/components/Product/Handout/TooltipWithIcon.tsx","webpack://_N_E/./src/components/Product/Handout/HandoutAllowanceChip.tsx","webpack://_N_E/./src/lib/utils/renderType.ts","webpack://_N_E/./src/modules/products/components/ProductDetail/coreInfoList.ts","webpack://_N_E/./src/modules/products/components/ProductDetail/detailInfoList.ts","webpack://_N_E/./src/modules/products/components/ProductPreviewModal.tsx","webpack://_N_E/./src/modules/products/utils/getPreviewImage.ts","webpack://_N_E/./src/modules/products/components/ProductDetail/ProductDetailContent.tsx","webpack://_N_E/./src/modules/products/components/ProductDetail/ProductDetailInfo.tsx","webpack://_N_E/./src/modules/products/views/ProductDetailView.tsx","webpack://_N_E/"],"sourcesContent":["import { _ as _tagged_template_literal } from \"@swc/helpers/_/_tagged_template_literal\";\nfunction _templateObject() {\n const data = _tagged_template_literal([\n \"\\n > div:last-child {\\n padding: 20px;\\n border-radius: 16px;\\n @media (max-width: 1200px) {\\n width: 50%;\\n }\\n @media (max-width: 768px) {\\n //width: 90%;\\n width: 360px;\\n }\\n }\\n\"\n ]);\n _templateObject = function() {\n return data;\n };\n return data;\n}\nfunction _templateObject1() {\n const data = _tagged_template_literal([\n \"\\n position: relative;\\n h3 {\\n color: \",\n \";\\n font-size: 20px;\\n font-weight: 700;\\n margin-bottom: 16px;\\n line-height: 1.5;\\n }\\n i {\\n position: absolute;\\n right: 0;\\n }\\n a {\\n width: 100%;\\n padding: 12px;\\n line-height: 1.5;\\n font-size: 16px;\\n font-weight: 600;\\n color: \",\n \";\\n border: 1px solid \",\n \";\\n border-radius: 6px;\\n display: inline-block;\\n text-align: center;\\n }\\n .body {\\n margin-bottom: 32px;\\n color: \",\n \";\\n line-height: 1.5;\\n font-size: 16px;\\n }\\n\"\n ]);\n _templateObject1 = function() {\n return data;\n };\n return data;\n}\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport React from \"react\";\nimport styled, { useTheme } from \"styled-components\";\nimport Modal from \"@/components/modal/Modal\";\nimport Link from \"next/link\";\nimport Icon from \"../icon/Icon\";\nimport { Close, Sizes } from \"@/components/icon/IconList\";\nexport const BottomDrawer = (props)=>{\n const { text , title , position , link , linkTitle , ...rest } = props;\n const theme = useTheme();\n //채널톡 이슈로 임시 모달로 ui변경\n return /*#__PURE__*/ _jsx(CustomModal, {\n ...rest,\n children: /*#__PURE__*/ _jsxs(DrawerWrapper, {\n children: [\n /*#__PURE__*/ _jsx(Icon, {\n onClick: props.onClose,\n icon: Close,\n size: Sizes.small,\n color: theme.new.colors.sol_gray_800\n }),\n /*#__PURE__*/ _jsx(\"h3\", {\n children: title\n }),\n /*#__PURE__*/ _jsx(\"div\", {\n className: \"body\",\n children: text\n }),\n link && /*#__PURE__*/ _jsx(Link, {\n target: \"_blank\",\n href: link,\n children: linkTitle || \"자세히 보기\"\n })\n ]\n })\n });\n};\nconst CustomModal = styled(Modal).withConfig({\n componentId: \"sc-6b18ed79-0\"\n})(_templateObject());\nconst DrawerWrapper = styled.div.withConfig({\n componentId: \"sc-6b18ed79-1\"\n})(_templateObject1(), (props)=>props.theme.new.colors.sol_gray_800, (props)=>props.theme.new.colors.sol_indigo_500, (props)=>props.theme.new.colors.sol_indigo_500, (props)=>props.theme.new.colors.sol_gray_600);\n","import { _ as _tagged_template_literal } from \"@swc/helpers/_/_tagged_template_literal\";\nfunction _templateObject() {\n const data = _tagged_template_literal([\n \"\\n padding: 4px 8px;\\n max-width: 410px;\\n\\n &:hover {\\n .tooltip {\\n display: flex;\\n opacity: 1;\\n visibility: visible;\\n transform: scale(1);\\n @media (max-width: 1200px) {\\n display: none;\\n }\\n }\\n }\\n\\n .tooltip {\\n transition: all 0.3s ease;\\n transform: scale(0.8);\\n opacity: 0;\\n max-width: 410px;\\n position: absolute;\\n box-shadow: 6px 6px 20px 0px rgba(28, 31, 46, 0.12);\\n visibility: hidden;\\n top: -150px;\\n left: 0;\\n white-space: nowrap;\\n padding: 16px;\\n border-radius: 4px;\\n background: #ffff;\\n\\n > div {\\n display: flex;\\n font-size: 14px;\\n color: #4f556b;\\n width: 400px;\\n word-wrap: break-word;\\n white-space: normal;\\n flex-wrap: wrap;\\n }\\n\\n &::after {\\n content: '';\\n position: absolute;\\n top: 100%;\\n left: 42px;\\n margin-left: -8px;\\n border-width: 8px;\\n border-style: solid;\\n border-color: #ffff transparent transparent transparent;\\n }\\n }\\n\"\n ]);\n _templateObject = function() {\n return data;\n };\n return data;\n}\nfunction _templateObject1() {\n const data = _tagged_template_literal([\n \"\\n font-size: 14px;\\n display: flex;\\n position: relative;\\n align-items: center;\\n\\n line-height: 22px;\\n border-radius: 3px;\\n border: 1px solid \",\n \";\\n //padding: 4px 8px;\\n height: 30px;\\n cursor: pointer;\\n transition: all 0.3s ease;\\n\\n div {\\n color: \",\n \";\\n }\\n\\n > p {\\n margin: 0;\\n }\\n\\n i {\\n margin-left: 4px;\\n margin-bottom: 2px;\\n }\\n\\n \",\n \"\\n .chip-desc {\\n color: \",\n \";\\n }\\n\\n .tooltip-desc {\\n color: \",\n \";\\n max-width: 410px;\\n }\\n\\n :hover {\\n border: 1px solid \",\n \";\\n background-color: \",\n \";\\n }\\n\"\n ]);\n _templateObject1 = function() {\n return data;\n };\n return data;\n}\nfunction _templateObject2() {\n const data = _tagged_template_literal([\n \"\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n\\n > b {\\n font-size: 16px;\\n font-weight: 600;\\n color: \",\n \";\\n }\\n\\n div {\\n display: flex;\\n font-size: 14px;\\n color: \",\n \";\\n width: 380px;\\n word-wrap: break-word;\\n }\\n\\n a {\\n color: \",\n \";\\n display: flex;\\n font-size: 12px;\\n align-items: center;\\n font-weight: 600;\\n }\\n\\n .title {\\n font-size: 20px;\\n font-weight: 700;\\n }\\n\\n .description {\\n font-size: 16px;\\n font-weight: 400;\\n line-height: 1.5;\\n letter-spacing: -0.16px;\\n margin-bottom: 8px;\\n }\\n\"\n ]);\n _templateObject2 = function() {\n return data;\n };\n return data;\n}\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport styled, { useTheme } from \"styled-components\";\nimport { ArrowRight, InfoCircle, QuestionCircle, Sizes } from \"@/components/icon/IconList\";\nimport Icon from \"../icon/Icon\";\nimport Link from \"next/link\";\nimport useWindowDimensions from \"@/lib/web-ui/useWindowDimensions\";\nimport { useModal } from \"../../utils/overlay\";\nimport { mixpanelEvent } from \"@/lib/mixpanels/mixpanel\";\nimport { AllowanceListType } from \"./Handout/HandoutAllowanceChip\";\n// export const enum AllowanceListType {\n// \tprint = 'print',\n// \tviewer = 'viewer',\n// \tedit = 'edit',\n// \tselling = 'slot',\n// \twarningPrint = 'warningPrint',\n// }\nexport const AllowanceListTypeWithString = {\n [AllowanceListType.print]: \"프린터 출력 (PC, 100부)\",\n [AllowanceListType.viewer]: \"쏠북 뷰어로 열람\",\n [AllowanceListType.selling]: \"자료 저작 및 판매 가능\",\n [AllowanceListType.warningPrint]: \"프린트 출력 불가\"\n};\nexport const licenseAllowanceChipList = [\n {\n key: AllowanceListType.selling,\n color: \"info\",\n hasInfo: true,\n link: \"https://solvookguide.oopy.io/guide/8\",\n description: \"라이선스 구매 시 쏠북이 제공하는 범위 내에서 제작, 편집, 판매 등의 활동을 진행할 수 있습니다. \"\n },\n {\n key: AllowanceListType.warningPrint,\n color: \"warning\",\n hasInfo: false\n },\n {\n key: AllowanceListType.viewer,\n color: \"info\",\n hasInfo: true,\n link: \"https://solvookguide.oopy.io/guide/5\",\n description: \"쏠북의 콘텐츠는 저작권 보호를 위해 쏠북 뷰어를 통해 열람할 수 있습니다. 실물 교재의 제공이나 인쇄는 지원되지 않습니다.\"\n }\n];\nexport const workAllowanceChipList = [\n {\n key: AllowanceListType.selling,\n color: \"info\",\n hasInfo: true,\n link: \"https://solvookguide.oopy.io/guide/8\",\n description: \"라이선스를 구매하게 되면 해당 권리를 계약(1년간)하게 되는 것으로 1회 구매당 총 100개의 저작자료를 쏠북에서 판매할 수 있습니다.\"\n }\n];\nexport const handoutAllowanceChipList = [\n {\n key: AllowanceListType.viewer,\n color: \"info\",\n hasInfo: true,\n link: \"https://solvookguide.oopy.io/guide/5\",\n description: \"쏠북의 모든 수업자료는 저작권 보호를 위해 쏠북의 뷰어 기능을 통해서만 열람할 수 있습니다. 프린트 출력은 뷰어의 출력하기 버튼을 통해 가능합니다. (PC에서만 가능)\"\n },\n {\n key: AllowanceListType.print,\n color: \"info\",\n hasInfo: false\n }\n];\nexport const AllowanceChip = (param)=>{\n let { chipItem , handleDrawer , productType } = param;\n const theme = useTheme();\n const [isDrawerOpen, { open: openDrawer , close: closeDrawer }] = useModal(\"drawer-modal\");\n const { width } = useWindowDimensions();\n const isMobile = width < 1200;\n const { key , color , link , hasInfo , description , linkTitle } = chipItem;\n const title = AllowanceListTypeWithString[key];\n return /*#__PURE__*/ _jsx(AllowanceChipWrapper, {\n type: color,\n style: {\n pointerEvents: hasInfo ? \"auto\" : \"none\"\n },\n onMouseEnter: ()=>{\n if (isMobile) return;\n mixpanelEvent(\"Product Detail Page Marker hovered\", {\n \"Product Type\": productType,\n \"Marker Name\": title,\n \"Marker Btn Link\": link\n });\n },\n onClick: ()=>{\n if (isMobile) {\n handleDrawer(chipItem);\n mixpanelEvent(\"Product Detail Page Marker hovered\", {\n \"Product Type\": productType,\n \"Marker Name\": title,\n \"Marker Btn Link\": link\n });\n }\n },\n children: /*#__PURE__*/ _jsx(TooltipWithIcon, {\n color: theme.new.colors.sol_gray_600,\n icon: hasInfo ? \"info\" : null,\n message: /*#__PURE__*/ _jsxs(TooltipWrapper, {\n children: [\n /*#__PURE__*/ _jsx(\"b\", {\n className: \"title\",\n children: title\n }),\n /*#__PURE__*/ _jsx(\"div\", {\n className: \"description\",\n children: description\n }),\n link && /*#__PURE__*/ _jsxs(Link, {\n href: link,\n target: \"_blank\",\n onClick: ()=>mixpanelEvent(\"Product Detail Page Marker Detail Clicked\", {\n \"Product Type\": productType,\n \"Marker Name\": title,\n \"Marker Btn Link\": link\n }),\n children: [\n linkTitle || \"자세히 보기\",\n /*#__PURE__*/ _jsx(Icon, {\n icon: ArrowRight,\n size: Sizes.xsmall,\n color: theme.new.colors.indigo500\n })\n ]\n })\n ]\n }),\n link: link,\n size: Sizes.small,\n children: title\n })\n });\n};\nconst TooltipWithIcon = (param)=>{\n let { icon , message , color , size , children , link , isHover } = param;\n const theme = useTheme();\n const isMobile = useWindowDimensions().width < 1200;\n const renderIcon = useCallback(()=>{\n switch(icon){\n case \"question\":\n return /*#__PURE__*/ _jsx(Icon, {\n icon: QuestionCircle,\n size: size,\n color: color\n });\n case \"info\":\n return /*#__PURE__*/ _jsx(Icon, {\n icon: InfoCircle,\n size: size,\n color: color\n });\n default:\n return null;\n }\n }, [\n icon\n ]);\n const tooltipRef = useRef(null);\n const [tooltipTop, setTooltipTop] = useState(150);\n const [isHovered, setIsHovered] = useState(false);\n useEffect(()=>{\n if (tooltipRef.current) {\n const tooltipHeight = tooltipRef.current.clientHeight + 16;\n setTooltipTop(tooltipHeight);\n }\n }, [\n message,\n isHovered\n ]);\n return /*#__PURE__*/ _jsxs(Tooltip, {\n children: [\n /*#__PURE__*/ _jsx(\"div\", {\n onMouseEnter: ()=>setIsHovered(true),\n onMouseLeave: ()=>setIsHovered(false),\n className: \"tooltip\",\n style: {\n color: color,\n top: -tooltipTop\n },\n ref: tooltipRef,\n children: /*#__PURE__*/ _jsx(\"div\", {\n children: message\n })\n }),\n /*#__PURE__*/ _jsx(\"span\", {\n children: children\n }),\n !!icon && /*#__PURE__*/ _jsx(\"span\", {\n children: renderIcon()\n })\n ]\n });\n};\n// export default TooltipWithIcon\nconst Tooltip = styled.div.withConfig({\n componentId: \"sc-591ba1b2-0\"\n})(_templateObject());\nconst AllowanceChipWrapper = styled.div.withConfig({\n componentId: \"sc-591ba1b2-1\"\n})(_templateObject1(), (props)=>props.theme.new.colors.sol_gray_100, (props)=>props.theme.new.colors.sol_gray_600, (props)=>props.type === \"warning\" && \"\\n\t\tdiv {\\n\t\t\tcolor: \".concat(props.theme.new.colors.sol_red_400, \";\\n\t\t}\\n\t\\n\tborder: 1px solid \").concat(props.theme.new.colors.sol_red_100, \";\\n\t\"), (props)=>props.theme.new.colors.sol_gray_600, (props)=>props.theme.new.colors.sol_gray_600, (props)=>props.theme.new.colors.sol_gray_600, (props)=>props.theme.new.colors.sol_gray_0);\nconst TooltipWrapper = styled.div.withConfig({\n componentId: \"sc-591ba1b2-2\"\n})(_templateObject2(), (props)=>props.theme.new.colors.sol_gray_800, (props)=>props.theme.new.colors.sol_gray_600, (props)=>props.theme.new.colors.indigo500);\n","import { _ as _tagged_template_literal } from \"@swc/helpers/_/_tagged_template_literal\";\nfunction _templateObject() {\n const data = _tagged_template_literal([\n \"\\n width: 100%;\\n display: flex;\\n gap: 8px;\\n\\n @media (max-width: 1120px) {\\n max-width: 388px;\\n }\\n @media (max-width: 1080px) {\\n max-width: 100%;\\n }\\n @media (max-width: 768px) {\\n overflow-x: auto;\\n }\\n\"\n ]);\n _templateObject = function() {\n return data;\n };\n return data;\n}\nimport { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport React, { useMemo, useState } from \"react\";\nimport { useModal } from \"src/utils/overlay\";\nimport styled from \"styled-components\";\nimport { BottomDrawer } from \"../modal/BottomDrawer\";\nimport { AllowanceChip, AllowanceListTypeWithString, licenseAllowanceChipList } from \"./AllowanceChip\";\nimport { AllowanceListType, HandoutAllowanceChip, handoutAllowanceChipList, HandoutAllowanceListTypeWithString } from \"./Handout/HandoutAllowanceChip\";\nexport const AllowanceChipList = (param)=>{\n let { productType , studioVersion , isParsedByMl } = param;\n const isStudio = useMemo(()=>studioVersion === \"v2\", [\n studioVersion\n ]);\n const isEditStudio = useMemo(()=>isStudio && isParsedByMl, [\n studioVersion,\n isParsedByMl\n ]);\n const isWriteStudio = useMemo(()=>isStudio && !isParsedByMl, [\n studioVersion,\n isParsedByMl\n ]);\n const [isDrawerOpen, { open: openDrawer , close: closeDrawer }] = useModal(\"drawer-modal\");\n const [drawerData, setDrawerData] = useState({\n key: AllowanceListType.selling,\n color: \"info\",\n hasInfo: true,\n link: \"/\",\n description: \"라이선스를 구매하게 되면 해당 권리를 계약(1년간)하게 되는 것으로 1회 구매당 총 100개의 저작자료를 쏠북에서 판매할 수 있습니다.\"\n });\n if (productType === \"handout\") //FIXME handout만 임시로 변경된 컴포넌트 추후 모두 hanout 과 동일한 컴포넌트 사용예정\n return /*#__PURE__*/ _jsxs(_Fragment, {\n children: [\n /*#__PURE__*/ _jsx(Container, {\n children: handoutAllowanceChipList.map((item, idx)=>{\n if (item.key === AllowanceListType.editStudio && !isEditStudio) return null;\n if (item.key === AllowanceListType.writeStudio && !isWriteStudio) return null;\n return /*#__PURE__*/ _jsx(HandoutAllowanceChip, {\n handleDrawer: ()=>{\n setDrawerData(item);\n openDrawer();\n },\n chipItem: item,\n productType: productType\n }, \"allowance-chip\" + idx);\n })\n }),\n /*#__PURE__*/ _jsx(BottomDrawer, {\n title: HandoutAllowanceListTypeWithString[drawerData.key],\n onClose: closeDrawer,\n open: isDrawerOpen,\n text: drawerData.description,\n link: drawerData.link,\n linkTitle: drawerData.linkTitle,\n position: null,\n name: \"drawer-modal\"\n })\n ]\n });\n if (productType === \"textbook\" || \"workbook\") return /*#__PURE__*/ _jsxs(_Fragment, {\n children: [\n licenseAllowanceChipList.map((item, idx)=>/*#__PURE__*/ _jsx(AllowanceChip, {\n handleDrawer: ()=>{\n setDrawerData(item);\n openDrawer();\n },\n chipItem: item,\n productType: productType\n }, \"allowance-chip\" + idx)),\n /*#__PURE__*/ _jsx(BottomDrawer, {\n title: AllowanceListTypeWithString[drawerData.key],\n onClose: closeDrawer,\n open: isDrawerOpen,\n text: drawerData.description,\n link: drawerData.link,\n linkTitle: drawerData.linkTitle,\n position: null,\n name: \"drawer-modal\"\n })\n ]\n });\n return null;\n};\nconst Container = styled.div.withConfig({\n componentId: \"sc-83f18a5d-0\"\n})(_templateObject());\n","import { _ as _tagged_template_literal } from \"@swc/helpers/_/_tagged_template_literal\";\nfunction _templateObject() {\n const data = _tagged_template_literal([\n \"\\n font-size: 16px;\\n line-height: 1.5;\\n padding: 4px 8px;\\n border-radius: 3px;\\n height: 32px;\\n display: inline-block;\\n font-weight: 600;\\n &.type10 {\\n color: \",\n \";\\n border: 1px solid \",\n \";\\n }\\n //교사용\\n &.type20 {\\n color: \",\n \";\\n border: 1px solid \",\n \";\\n }\\n //해설지\\n &.type30 {\\n color: \",\n \";\\n border: 1px solid \",\n \";\\n }\\n //부가자료\\n &.type40 {\\n color: \",\n \";\\n border: 1px solid \",\n \";\\n }\\n @media (max-width: 768px) {\\n font-size: 14px;\\n }\\n\"\n ]);\n _templateObject = function() {\n return data;\n };\n return data;\n}\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport styled from \"styled-components\";\nimport React from \"react\";\nexport const ExtraResourcesWrapper = styled.span.withConfig({\n componentId: \"sc-64990a3c-0\"\n})(_templateObject(), (props)=>props.theme.new.colors.sol_yellow_400, (props)=>props.theme.new.colors.sol_yellow_100, (props)=>props.theme.new.colors.sol_mint_400, (props)=>props.theme.new.colors.sol_mint_100, (props)=>props.theme.new.colors.sol_blue_400, (props)=>props.theme.new.colors.sol_blue_100, (props)=>props.theme.new.colors.sol_gray_400, (props)=>props.theme.new.colors.sol_gray_100);\nvar ExtraResourcesType;\n(function(ExtraResourcesType) {\n ExtraResourcesType[ExtraResourcesType[\"Student\"] = 10] = \"Student\";\n ExtraResourcesType[ExtraResourcesType[\"Teacher\"] = 20] = \"Teacher\";\n ExtraResourcesType[ExtraResourcesType[\"Explanation\"] = 30] = \"Explanation\";\n ExtraResourcesType[ExtraResourcesType[\"Extra\"] = 40] = \"Extra\";\n})(ExtraResourcesType || (ExtraResourcesType = {}));\nconst ExtraResourceString = {\n [20]: \"교사용\",\n [10]: \"학생용\",\n [40]: \"부가자료\",\n [30]: \"해설지\"\n};\nexport const ExtraResourceNew = (param)=>/*#__PURE__*/ {\n let { type } = param;\n return _jsx(ExtraResourcesWrapper, {\n className: \"type\".concat(type),\n children: ExtraResourceString[type]\n });\n} //10:학생용, 20:선생용, 30:해설지, 40:부가자료\n;\n","import { _ as _tagged_template_literal } from \"@swc/helpers/_/_tagged_template_literal\";\nfunction _templateObject() {\n const data = _tagged_template_literal([\n \"\\n max-width: 410px;\\n\\n &:hover {\\n .tooltip {\\n display: flex;\\n opacity: 1;\\n visibility: visible;\\n transform: scale(1);\\n @media (max-width: 1200px) {\\n display: none;\\n }\\n }\\n }\\n\\n .tooltip {\\n z-index: 1;\\n transition: all 0.3s ease;\\n transform: scale(0.8);\\n opacity: 0;\\n max-width: 410px;\\n position: absolute;\\n box-shadow: 6px 6px 20px 0px rgba(28, 31, 46, 0.12);\\n visibility: hidden;\\n top: -150px;\\n left: 0;\\n white-space: nowrap;\\n padding: 20px;\\n border-radius: 4px;\\n background: #ffff;\\n\\n > div {\\n display: flex;\\n font-size: 14px;\\n color: #4f556b;\\n width: 400px;\\n word-wrap: break-word;\\n white-space: normal;\\n flex-wrap: wrap;\\n }\\n\\n &::after {\\n content: '';\\n position: absolute;\\n top: 100%;\\n left: 42px;\\n margin-left: -8px;\\n border-width: 8px;\\n border-style: solid;\\n border-color: #ffff transparent transparent transparent;\\n }\\n .tooltip-message {\\n @media (max-width: 1200px) {\\n display: none;\\n }\\n }\\n }\\n\"\n ]);\n _templateObject = function() {\n return data;\n };\n return data;\n}\nimport { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport styled, { useTheme } from \"styled-components\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport Icon from \"@/components/icon/Icon\";\nimport { InfoCircle, QuestionCircle } from \"@/components/icon/IconList\";\nimport useWindowDimensions from \"@/lib/web-ui/useWindowDimensions\";\nexport const TooltipWithIcon = (param)=>{\n let { icon , message , color , size , children , link , isHover } = param;\n const theme = useTheme();\n const isMobile = useWindowDimensions().width < 1200;\n const renderIcon = useCallback(()=>{\n switch(icon){\n case \"question\":\n return /*#__PURE__*/ _jsx(Icon, {\n icon: QuestionCircle,\n size: size,\n color: color\n });\n case \"info\":\n return /*#__PURE__*/ _jsx(Icon, {\n icon: InfoCircle,\n size: size,\n color: color\n });\n default:\n return null;\n }\n }, [\n icon\n ]);\n const tooltipRef = useRef(null);\n const [tooltipTop, setTooltipTop] = useState(150);\n const [isHovered, setIsHovered] = useState(false);\n useEffect(()=>{\n if (tooltipRef.current) {\n const tooltipHeight = tooltipRef.current.clientHeight + 16;\n setTooltipTop(tooltipHeight);\n }\n }, [\n message,\n isHovered\n ]);\n return /*#__PURE__*/ _jsxs(Tooltip, {\n children: [\n /*#__PURE__*/ _jsx(\"div\", {\n onMouseEnter: ()=>setIsHovered(true),\n onMouseLeave: ()=>setIsHovered(false),\n className: \"tooltip\",\n style: {\n color: color,\n top: -tooltipTop\n },\n ref: tooltipRef,\n children: /*#__PURE__*/ _jsx(\"div\", {\n className: \"tooltip-message\",\n children: message\n })\n }),\n /*#__PURE__*/ _jsx(_Fragment, {\n children: children\n }),\n !!icon && /*#__PURE__*/ _jsx(\"span\", {\n children: renderIcon()\n })\n ]\n });\n};\nconst Tooltip = styled.div.withConfig({\n componentId: \"sc-aa3fe966-0\"\n})(_templateObject());\n","import { _ as _tagged_template_literal } from \"@swc/helpers/_/_tagged_template_literal\";\nfunction _templateObject() {\n const data = _tagged_template_literal([\n \"\\n white-space: nowrap;\\n\\n > p {\\n white-space: nowrap;\\n }\\n\"\n ]);\n _templateObject = function() {\n return data;\n };\n return data;\n}\nfunction _templateObject1() {\n const data = _tagged_template_literal([\n \"\\n color: \",\n \";\\n text-align: right;\\n font-size: 10px;\\n font-weight: 700;\\n line-height: 18px;\\n vertical-align: text-bottom;\\n margin-left: 2px;\\n\"\n ]);\n _templateObject1 = function() {\n return data;\n };\n return data;\n}\nfunction _templateObject2() {\n const data = _tagged_template_literal([\n \"\\n display: flex;\\n flex-direction: column;\\n margin-bottom: 8px;\\n\"\n ]);\n _templateObject2 = function() {\n return data;\n };\n return data;\n}\nfunction _templateObject3() {\n const data = _tagged_template_literal([\n \"\\n font-size: 14px;\\n display: flex;\\n //width: 100%;\\n position: relative;\\n align-items: center;\\n flex-direction: column;\\n line-height: 22px;\\n border-radius: 4px;\\n border: 1px solid \",\n \";\\n padding: 12px;\\n cursor: pointer;\\n transition: all 0.3s ease;\\n letter-spacing: -0.14px;\\n\\n div {\\n color: \",\n \";\\n }\\n\\n > p {\\n margin: 0;\\n }\\n\\n i {\\n margin-left: 4px;\\n margin-bottom: 2px;\\n }\\n\\n \",\n \"\\n .chip-desc {\\n color: \",\n \";\\n }\\n\\n .tooltip-desc {\\n color: \",\n \";\\n max-width: 410px;\\n }\\n\\n :hover {\\n border: 1px solid \",\n \";\\n background-color: \",\n \";\\n }\\n\"\n ]);\n _templateObject3 = function() {\n return data;\n };\n return data;\n}\nfunction _templateObject4() {\n const data = _tagged_template_literal([\n \"\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n\\n > b {\\n text-align: left;\\n font-size: 16px;\\n font-weight: 600;\\n color: \",\n \";\\n }\\n\\n div {\\n display: flex;\\n font-size: 14px;\\n color: \",\n \";\\n width: 380px;\\n word-wrap: break-word;\\n }\\n\\n a {\\n color: \",\n \";\\n display: flex;\\n font-size: 14px;\\n align-items: center;\\n font-weight: 600;\\n }\\n\\n .title {\\n font-size: 20px;\\n font-weight: 700;\\n }\\n\\n .description {\\n font-size: 16px;\\n font-weight: 400;\\n line-height: 1.5;\\n letter-spacing: -0.16px;\\n margin-bottom: 8px;\\n }\\n\"\n ]);\n _templateObject4 = function() {\n return data;\n };\n return data;\n}\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport React, { useCallback } from \"react\";\nimport styled, { useTheme } from \"styled-components\";\nimport { ArrowRight, Cart, DownLoadDiasbled, EditStudio, Print, Sizes, Studio } from \"@/components/icon/IconList\";\nimport Icon from \"@/components/icon/Icon\";\nimport Link from \"next/link\";\nimport useWindowDimensions from \"@/lib/web-ui/useWindowDimensions\";\nimport { mixpanelEvent } from \"@/lib/mixpanels/mixpanel\";\nimport { TooltipWithIcon } from \"@/components/Product/Handout/TooltipWithIcon\";\nexport var AllowanceListType;\n(function(AllowanceListType) {\n AllowanceListType[\"print\"] = \"print\";\n AllowanceListType[\"viewer\"] = \"viewer\";\n AllowanceListType[\"editStudio\"] = \"editStudio\";\n AllowanceListType[\"writeStudio\"] = \"writeStudio\";\n AllowanceListType[\"selling\"] = \"slot\";\n AllowanceListType[\"warningPrint\"] = \"warningPrint\";\n})(AllowanceListType || (AllowanceListType = {}));\nexport const HandoutAllowanceListTypeWithString = {\n [\"print\"]: \"프린터 출력 (PC,100부)\",\n [\"viewer\"]: \"파일 다운로드 불가\",\n [\"editStudio\"]: \"자료 편집하기\",\n [\"writeStudio\"]: \"문제 편집 가능\",\n [\"slot\"]: \"자료 저작 및 판매 가능\",\n [\"warningPrint\"]: \"프린트 출력 불가\"\n};\nexport const handoutAllowanceChipList = [\n {\n key: \"viewer\",\n color: \"info\",\n hasInfo: true,\n link: \"https://solvookguide.oopy.io/guide/5\",\n description: \"쏠북의 모든 수업자료는 저작권 보호를 위해 쏠북의 뷰어 기능을 통해서만 열람할 수 있습니다. 프린트 출력은 뷰어의 출력하기 버튼을 통해 가능합니다. (PC에서만 가능)\"\n },\n {\n key: \"print\",\n color: \"info\",\n hasInfo: false\n },\n {\n key: \"editStudio\",\n color: \"info\",\n hasInfo: true,\n link: \"https://solvookguide.oopy.io/guide/studio/edit\",\n linkTitle: \"편집하기 기능 알아보기\",\n description: \"문제의 순서를 바꾸거나 삭제할 수 있어요. \"\n },\n {\n key: \"writeStudio\",\n color: \"info\",\n hasInfo: true,\n link: \"https://solvookguide.oopy.io/guide/6\",\n linkTitle: \"편집하기 기능 알아보기\",\n description: \"문제의 순서를 바꾸거나 삭제할 수 있어요. 또한 텍스트 수정도 가능해요.\"\n }\n];\nexport const HandoutAllowanceChip = (param)=>{\n let { chipItem , handleDrawer , productType } = param;\n const theme = useTheme();\n const { isTablet } = useWindowDimensions();\n const { key: allowanceKey , color , link , hasInfo , description , linkTitle } = chipItem;\n const title = HandoutAllowanceListTypeWithString[allowanceKey];\n return /*#__PURE__*/ _jsx(AllowanceChipWrapper, {\n type: color,\n style: {\n pointerEvents: hasInfo ? \"auto\" : \"none\"\n },\n onMouseEnter: ()=>{\n if (isTablet) return;\n mixpanelEvent(\"Product Detail Page Marker hovered\", {\n \"Product Type\": productType,\n \"Marker Name\": title,\n \"Marker Btn Link\": link\n });\n },\n onClick: ()=>{\n if (isTablet) {\n handleDrawer(chipItem);\n mixpanelEvent(\"Product Detail Page Marker hovered\", {\n \"Product Type\": productType,\n \"Marker Name\": title,\n \"Marker Btn Link\": link\n });\n }\n },\n children: /*#__PURE__*/ _jsx(TooltipWithIcon, {\n color: theme.new.colors.sol_gray_600,\n icon: null,\n message: /*#__PURE__*/ _jsx(TooltipItem, {\n title: title,\n link: link,\n description: description,\n productType: productType,\n linkTitle: linkTitle\n }),\n link: link,\n size: Sizes.small,\n children: /*#__PURE__*/ _jsx(TooltipContent, {\n allowanceKey: allowanceKey,\n title: title\n })\n })\n });\n};\nconst TooltipContent = (param)=>{\n let { allowanceKey , title } = param;\n const renderIcon = useCallback(()=>{\n switch(allowanceKey){\n case \"print\":\n return /*#__PURE__*/ _jsx(Icon, {\n icon: Print,\n size: Sizes.medium\n });\n case \"viewer\":\n return /*#__PURE__*/ _jsx(Icon, {\n icon: DownLoadDiasbled,\n size: Sizes.medium\n });\n case \"editStudio\":\n return /*#__PURE__*/ _jsx(Icon, {\n icon: EditStudio,\n size: Sizes.medium\n });\n case \"writeStudio\":\n return /*#__PURE__*/ _jsx(Icon, {\n icon: Studio,\n size: Sizes.medium\n });\n case \"slot\":\n return /*#__PURE__*/ _jsx(Icon, {\n icon: Cart,\n size: Sizes.medium\n });\n case \"warningPrint\":\n return /*#__PURE__*/ _jsx(Icon, {\n icon: Print,\n size: Sizes.medium\n });\n default:\n return null;\n }\n }, []);\n return /*#__PURE__*/ _jsxs(TooltipContentLayout, {\n children: [\n /*#__PURE__*/ _jsx(ChipLayoutContainer, {\n children: renderIcon()\n }),\n /*#__PURE__*/ _jsxs(\"p\", {\n children: [\n title,\n allowanceKey === \"editStudio\" && /*#__PURE__*/ _jsx(Em, {\n children: \"Beta\"\n })\n ]\n })\n ]\n });\n};\nconst TooltipContentLayout = styled.div.withConfig({\n componentId: \"sc-c18001bd-0\"\n})(_templateObject());\nexport const TooltipItem = (param)=>{\n let { title , link , description , productType , linkTitle } = param;\n const theme = useTheme();\n return /*#__PURE__*/ _jsxs(TooltipWrapper, {\n children: [\n /*#__PURE__*/ _jsx(\"b\", {\n className: \"title\",\n children: title\n }),\n /*#__PURE__*/ _jsx(\"div\", {\n className: \"description\",\n children: description\n }),\n link && /*#__PURE__*/ _jsxs(Link, {\n href: link,\n target: \"_blank\",\n onClick: ()=>mixpanelEvent(\"Product Detail Page Marker Detail Clicked\", {\n \"Product Type\": productType,\n \"Marker Name\": title,\n \"Marker Btn Link\": link\n }),\n children: [\n linkTitle || \"자세히 보기\",\n /*#__PURE__*/ _jsx(Icon, {\n icon: ArrowRight,\n size: Sizes.xsmall,\n color: theme.new.colors.indigo500\n })\n ]\n })\n ]\n });\n};\nconst Em = styled.em.withConfig({\n componentId: \"sc-c18001bd-1\"\n})(_templateObject1(), (props)=>props.theme.new.colors.sol_mint_300);\nconst ChipLayoutContainer = styled.div.withConfig({\n componentId: \"sc-c18001bd-2\"\n})(_templateObject2());\nconst AllowanceChipWrapper = styled.div.withConfig({\n componentId: \"sc-c18001bd-3\"\n})(_templateObject3(), (props)=>props.theme.new.colors.sol_gray_100, (props)=>props.theme.new.colors.sol_gray_600, (props)=>props.type === \"warning\" && \"\\n\t\tdiv {\\n\t\t\tcolor: \".concat(props.theme.new.colors.sol_red_400, \";\\n\t\t}\\n\t\\n\tborder: 1px solid \").concat(props.theme.new.colors.sol_red_100, \";\\n\t\"), (props)=>props.theme.new.colors.sol_gray_600, (props)=>props.theme.new.colors.sol_gray_600, (props)=>props.theme.new.colors.sol_gray_600, (props)=>props.theme.new.colors.sol_gray_0);\nconst TooltipWrapper = styled.div.withConfig({\n componentId: \"sc-c18001bd-4\"\n})(_templateObject4(), (props)=>props.theme.new.colors.sol_gray_800, (props)=>props.theme.new.colors.sol_gray_600, (props)=>props.theme.new.colors.indigo500);\n","import { ContentTypesWithString, DataTypesWithString } from \"src/api/product\";\nexport const renderOption = (option)=>{\n let renderString;\n switch(option){\n case 1:\n renderString = \"라이트\";\n break;\n case 2:\n renderString = \"베이직\";\n break;\n case 3:\n renderString = \"프로\";\n break;\n case 20:\n renderString = \"라이선스\";\n break;\n default:\n renderString = \"\";\n }\n return renderString;\n};\nexport const maxUsageType = (option)=>{\n let renderString;\n switch(option){\n case 1:\n renderString = 5;\n break;\n case 2:\n renderString = 100;\n break;\n case 3:\n renderString = 500;\n break;\n default:\n renderString = 0;\n }\n return renderString;\n};\nexport const renderSourceType = (status)=>{\n let renderString;\n switch(status){\n case \"work\":\n renderString = \"문학 라이선스\";\n break;\n case \"textbook\":\n renderString = \"교과서 라이선스\";\n break;\n case \"handout\":\n renderString = \"수업자료\";\n break;\n case \"workbook\":\n renderString = \"참고서 라이선스\";\n break;\n case \"aladinbook\":\n renderString = \"도서\";\n break;\n default:\n renderString = \"\";\n }\n return renderString;\n};\nexport const renderPriceLimit = (status)=>{\n let renderString;\n switch(status){\n case \"lite\":\n renderString = \"라이트 (최대 5명까지 이용 가능)\";\n break;\n case \"basic\":\n renderString = \"베이직 (최대 100명까지 이용 가능)\";\n break;\n case \"pro\":\n renderString = \"프로 (최대 500명까지 이용 가능)\";\n break;\n case \"e-learning\":\n renderString = \"디지털 교재\";\n break;\n case \"e-teaching\":\n renderString = \"라이선스\";\n break;\n default:\n renderString = \"\";\n }\n return renderString;\n};\nexport const PLAN_LEARNING = \"e-learning\";\nexport const PLAN_TEACHING = \"e-teaching\";\nexport const renderPlanDescription = (plan)=>{\n let renderString;\n switch(plan){\n case PLAN_LEARNING:\n renderString = \"개인 이용 목적, 비상업적 이용\";\n break;\n case PLAN_TEACHING:\n renderString = \"수업 이용 목적, 상업적 이용\";\n break;\n default:\n renderString = \"\";\n break;\n }\n return renderString;\n};\nexport const renderPlanNewType = (plan)=>{\n let renderString;\n switch(plan){\n case PLAN_LEARNING:\n renderString = \"디지털 교재\";\n break;\n case PLAN_TEACHING:\n renderString = \"라이선스\";\n break;\n default:\n renderString = \"\";\n break;\n }\n return renderString;\n};\nexport const renderDataTypeWithComma = (data)=>{\n if (!data) return null;\n return data.map((item)=>DataTypesWithString[item]).join(\", \");\n};\nexport const renderContentTypeWithComma = (data)=>{\n if (!data) return null;\n return data.map((item)=>ContentTypesWithString[item]).join(\", \");\n};\n","// TODO: 중복제거\nimport { renderDataTypeWithComma } from \"@/lib/utils/renderType\";\nimport { isBooksProduct } from \"src/api/booksProducts\";\nimport { CurriculumsWithString, GradesWithString, Subjects, SubjectsWithString } from \"src/api/product\";\n// TODO: remove publisherName parameter\n//수업자료\nexport default function coreInfoList(product, publisherName) {\n if (isBooksProduct(product)) {\n return [\n {\n type: \"과목\",\n value: SubjectsWithString[product.subject]\n },\n {\n type: \"출판사\",\n value: publisherName\n },\n {\n type: \"학년\",\n value: CurriculumsWithString[product.curriculum] + product.grades.map((grade)=>GradesWithString[grade]).join(\", \")\n }\n ];\n }\n const { subject , curriculum , grade , based_textbook_title , genre , era , question_number , unit , publisher } = product.source// TODO: remove type assertion\n ;\n const subjectValue = SubjectsWithString[subject];\n const gradeValue = CurriculumsWithString[curriculum] + GradesWithString[grade];\n // TODO: remove type assertion\n const dataTypeValue = renderDataTypeWithComma(product.source.data_type);\n switch(product.source_type){\n case \"handout\":\n var _product_source;\n if (subject === Subjects.KO) {\n return [\n {\n type: \"과목\",\n value: subjectValue\n },\n {\n type: \"출처작품\",\n value: based_textbook_title\n },\n {\n type: \"장르\",\n value: genre\n },\n {\n type: \"시대\",\n value: era\n },\n {\n type: \"문항 수\",\n value: question_number\n },\n {\n type: \"학년\",\n value: gradeValue\n }\n ];\n }\n return [\n {\n type: \"과목\",\n value: subjectValue\n },\n {\n type: \"출처교재\",\n value: based_textbook_title,\n link: \"/products/\".concat(product === null || product === void 0 ? void 0 : (_product_source = product.source) === null || _product_source === void 0 ? void 0 : _product_source.product_id)\n },\n {\n type: \"단원\",\n value: unit\n },\n {\n type: \"자료유형\",\n value: dataTypeValue\n },\n {\n type: \"문항 수\",\n value: question_number\n },\n {\n type: \"학년\",\n value: gradeValue\n }\n ];\n case \"textbook\":\n case \"workbook\":\n return [\n {\n type: \"과목\",\n value: subjectValue\n },\n {\n type: \"출판사\",\n value: publisherName\n },\n {\n type: \"학년\",\n value: gradeValue\n }\n ];\n case \"work\":\n return [\n {\n type: \"과목\",\n value: subjectValue\n },\n {\n type: \"저작권자\",\n value: publisher\n },\n {\n type: \"장르\",\n value: genre\n },\n {\n type: \"시대\",\n value: era\n }\n ];\n }\n}\n","// TODO: 중복제거\nimport { renderContentTypeWithComma, renderDataTypeWithComma } from \"@/lib/utils/renderType\";\nimport dayjs from \"dayjs\";\nimport { isBooksProduct } from \"src/api/booksProducts\";\nimport { CurriculumsWithString, GradesWithString, SourceTypeWithString, Subjects, SubjectsWithString } from \"src/api/product\";\n// TODO: remove publisherName parameter\nexport default function getDetailInfoList(product, publisherName) {\n const { title , author } = product;\n const source_type = isBooksProduct(product) ? product.productType : product.source_type;\n const source = isBooksProduct(product) ? product : product.source;\n const createdAt = isBooksProduct(product) ? null : product.created_at;\n const { published_at } = source// TODO: remove type assertion\n ;\n const { genre , era , subject , based_textbook_title , unit , grade , data_type , content_type , question_number , curriculum , publisher: workPublisher } = source// TODO: remove type assertion\n ;\n const sourceTypeValue = SourceTypeWithString[source_type];\n const subjectValue = SubjectsWithString[subject];\n const gradeValue = CurriculumsWithString[curriculum] + GradesWithString[grade];\n const dataTypeValue = renderDataTypeWithComma(data_type);\n const contentTypeValue = renderContentTypeWithComma(content_type);\n const dateFormat = (date, format)=>{\n return date ? dayjs(date).format(format) : null;\n };\n switch(source_type){\n case \"handout\":\n if (subject === Subjects.KO) {\n return [\n {\n type: \"상품 유형\",\n value: sourceTypeValue\n },\n {\n type: \"과목\",\n value: subjectValue\n },\n {\n type: \"자료명\",\n value: title\n },\n {\n type: \"저작자\",\n value: author\n },\n {\n type: \"출처\",\n value: based_textbook_title\n },\n {\n type: \"장르\",\n value: genre\n },\n {\n type: \"시대\",\n value: era\n },\n {\n type: \"학년\",\n value: gradeValue\n },\n {\n type: \"자료 유형\",\n value: dataTypeValue\n },\n {\n type: \"문항 수\",\n value: question_number\n },\n {\n type: \"등록일자\",\n value: dateFormat(createdAt, \"YYYY년 MM월 DD일\")\n }\n ];\n }\n return [\n {\n type: \"상품 유형\",\n value: sourceTypeValue\n },\n {\n type: \"과목\",\n value: subjectValue\n },\n {\n type: \"자료명\",\n value: title\n },\n {\n type: \"저작자\",\n value: author\n },\n {\n type: \"출처\",\n value: based_textbook_title\n },\n {\n type: \"단원\",\n value: unit\n },\n {\n type: \"학년\",\n value: gradeValue\n },\n {\n type: \"자료 유형\",\n value: dataTypeValue\n },\n {\n type: \"학습 내용\",\n value: contentTypeValue\n },\n {\n type: \"문항 수\",\n value: question_number\n },\n {\n type: \"등록일자\",\n value: dateFormat(createdAt, \"YYYY년 MM월 DD일\")\n }\n ];\n case \"textbook\":\n case \"workbook\":\n return [\n {\n type: \"상품 유형\",\n value: sourceTypeValue\n },\n {\n type: \"과목\",\n value: subjectValue\n },\n {\n type: \"교재명\",\n value: title\n },\n {\n type: \"대표저자\",\n value: author\n },\n {\n type: \"출판사명\",\n value: publisherName\n },\n {\n type: \"학년\",\n value: gradeValue\n },\n {\n type: \"출간년도\",\n value: dateFormat(published_at, \"YYYY년\")\n }\n ];\n case \"work\":\n return [\n {\n type: \"상품유형\",\n value: sourceTypeValue\n },\n {\n type: \"과목\",\n value: subjectValue\n },\n {\n type: \"제목\",\n value: title\n },\n {\n type: \"글쓴이\",\n value: author\n },\n {\n type: \"저작권자\",\n value: workPublisher\n },\n {\n type: \"장르\",\n value: genre\n },\n {\n type: \"시대\",\n value: era\n }\n ];\n default:\n // 상품 유형, 과목, 교재명, 대표저자, 출판사명, 학년, 출간년도, ISBN\n if (!isBooksProduct(product)) return [];\n return [\n {\n type: \"상품 유형\",\n value: sourceTypeValue\n },\n {\n type: \"과목\",\n value: subjectValue\n },\n {\n type: \"교재명\",\n value: title\n },\n {\n type: \"대표저자\",\n value: author\n },\n {\n type: \"출판사명\",\n value: publisherName\n },\n {\n type: \"학년\",\n value: CurriculumsWithString[product.curriculum] + \" \" + product.grades.map((grade)=>GradesWithString[grade]).join(\", \")\n },\n {\n type: \"출간년도\",\n value: dateFormat(published_at, \"YYYY년\")\n },\n {\n type: \"ISBN\",\n value: product.isbn13\n }\n ];\n }\n}\n","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport Modal from \"@/components/modal/Modal\";\nimport React, { useState } from \"react\";\nimport { PreviewModal, PreviewTitle } from \"../styles/ProductDetail.style\";\nimport { useModal } from \"src/utils/overlay\";\nimport getPreviewImage from \"../utils/getPreviewImage\";\nconst ProductPreviewModal = (props)=>{\n const { product } = props;\n const previewImages = getPreviewImage(product);\n const totalPage = previewImages.length + 1;\n const [defaultImage, setDefaultImage] = useState({\n url: product.thumb_img,\n page: 1\n });\n const [isPreviewOpen, { close: closePreviewModal }] = useModal(\"preview-modal\");\n return /*#__PURE__*/ _jsx(Modal, {\n depth: 1,\n onClose: closePreviewModal,\n open: isPreviewOpen,\n title: /*#__PURE__*/ _jsxs(PreviewTitle, {\n children: [\n product.title,\n \" 미리보기\",\n \" \",\n /*#__PURE__*/ _jsxs(\"span\", {\n children: [\n defaultImage.page,\n \"/\",\n totalPage\n ]\n })\n ]\n }),\n name: \"preview\",\n children: /*#__PURE__*/ _jsxs(PreviewModal, {\n children: [\n /*#__PURE__*/ _jsx(\"div\", {\n className: \"navigator\",\n children: /*#__PURE__*/ _jsxs(\"div\", {\n children: [\n /*#__PURE__*/ _jsx(\"button\", {\n className: defaultImage.url === product.thumb_img ? \"active\" : \"\",\n onClick: ()=>setDefaultImage({\n url: product.thumb_img,\n page: 1\n }),\n style: {\n backgroundImage: \"url(\".concat(product.thumb_img, \")\")\n }\n }),\n /*#__PURE__*/ _jsx(_Fragment, {\n children: previewImages.map((item, index)=>{\n return /*#__PURE__*/ _jsx(\"button\", {\n className: defaultImage.url === item.url ? \"active\" : \"\",\n onClick: ()=>setDefaultImage({\n url: item.url,\n page: index + 2\n }),\n style: {\n backgroundImage: \"url(\".concat(item.url, \")\")\n }\n }, \"preview-image\" + index);\n })\n })\n ]\n })\n }),\n /*#__PURE__*/ _jsx(\"div\", {\n className: \"zoom\",\n children: /*#__PURE__*/ _jsx(\"div\", {\n className: \"zoom-image\",\n style: {\n backgroundImage: \"url(\".concat(defaultImage.url, \")\")\n }\n })\n })\n ]\n })\n });\n};\nexport default ProductPreviewModal;\n","import { isBooksProduct } from \"src/api/booksProducts\";\nexport default function getPreviewImage(product) {\n const isBooks = isBooksProduct(product);\n if (isBooks) {\n return null;\n } else if (typeof product.source.images === \"object\" && \"previews\" in product.source.images) {\n return product.source.images.previews;\n } else {\n return [];\n }\n}\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport Image from \"next/image\";\nimport React, { useMemo, useState } from \"react\";\nimport { StickySection } from \"../../styles/ProductDetail.style\";\nimport { AdBanner } from \"@/components/Banner/AdBanner/AdBanner\";\nimport { useBooks } from \"@/components/Books/Order\";\nimport { ExtraResourceNew } from \"@/components/Product/ExtraResourceNew\";\nimport { mixpanelEvent } from \"@/lib/mixpanels/mixpanel\";\nimport useWindowDimensions from \"@/lib/web-ui/useWindowDimensions\";\nimport { Link as ScrollLink } from \"react-scroll\";\nimport { isBooksProduct } from \"src/api/booksProducts\";\nimport { BookInfoTab, ContentsTab, DetailTab, PreviewTab, PriceTab, ProductDetailContentWrapper, ScrollSection, StyledAnchor } from \"./ProductDetailContent.style\";\nimport ProductDetailTerms from \"./ProductDetailTerms\";\nimport detailInfoList from \"./detailInfoList\";\nvar LinkTab;\n(function(LinkTab) {\n LinkTab[\"contents\"] = \"contents\";\n LinkTab[\"author\"] = \"author\";\n LinkTab[\"preview\"] = \"preview\";\n LinkTab[\"detail\"] = \"detail\";\n LinkTab[\"refund\"] = \"refund\";\n LinkTab[\"book\"] = \"book\";\n LinkTab[\"bookShipRefund\"] = \"bookShipRefund\";\n LinkTab[\"review\"] = \"review\";\n})(LinkTab || (LinkTab = {}));\nexport const ProductDetailContent = (param)=>{\n let { product , priceSection } = param;\n const isBooks = isBooksProduct(product);\n const { isBooks: isAladinbook } = useBooks();\n const isEbook = isBooks && !isAladinbook;\n const productType = isBooks ? product.productType : product.source_type;\n const { publisherName , brandName } = product;\n const source = isBooks ? product : product.source;\n const { sub_items } = source;\n const { images } = source;\n const previewImages = images === null || images === void 0 ? void 0 : images.previews;\n const promotionImages = product && (images === null || images === void 0 ? void 0 : images.promotions) ? Array.isArray(images === null || images === void 0 ? void 0 : images.promotions) && (images === null || images === void 0 ? void 0 : images.promotions.slice().sort((a, b)=>a.order - b.order)) : [];\n const hasSubItems = useMemo(()=>{\n return sub_items && sub_items.length > 0;\n }, [\n sub_items\n ]);\n const { width } = useWindowDimensions();\n const isMobile = width < 1200;\n const [scrollLinkOptions] = useState({\n activeClass: \"active\",\n smooth: true,\n offset: isMobile ? -200 : -150,\n spy: true\n });\n const TabList = [\n {\n key: \"book\",\n title: \"도서 정보\",\n render: isBooks && (product.introduction || product.tableOfContents)\n },\n {\n key: \"contents\",\n title: \"포함된 컨텐츠\",\n render: !isBooks && hasSubItems\n },\n {\n key: \"author\",\n title: \"저자 정보\",\n render: !isBooks && brandName\n },\n {\n key: \"preview\",\n title: \"미리보기\",\n render: !isBooks && previewImages\n },\n {\n key: \"detail\",\n title: \"상세 정보\",\n render: true\n },\n {\n key: \"refund\",\n title: \"환불/교환 정보\",\n render: !isBooks || isEbook\n },\n {\n key: \"bookShipRefund\",\n title: \"배송/환불/교환 정보\",\n render: isAladinbook\n }\n ];\n return /*#__PURE__*/ _jsxs(ProductDetailContentWrapper, {\n children: [\n /*#__PURE__*/ _jsxs(ScrollSection, {\n children: [\n /*#__PURE__*/ _jsx(StyledAnchor, {\n children: TabList.map((tab, index)=>{\n return tab.render ? /*#__PURE__*/ _jsx(\"li\", {\n children: /*#__PURE__*/ _jsx(ScrollLink, {\n to: tab.key,\n ...scrollLinkOptions,\n onClick: ()=>mixpanelEvent(\"Product Detail Page Tab Clicked\", {\n \"Tab Name\": tab.title\n }),\n children: tab.title\n })\n }, \"bottom-tab-\".concat(index)) : null;\n })\n }),\n /*#__PURE__*/ _jsx(AdBanner, {\n position: \"productDetail\",\n mixpanelPosition: \"product detail page\",\n subject: isBooks ? product.subject : product.source.subject\n }),\n /*#__PURE__*/ _jsxs(\"div\", {\n className: \"detail-content\",\n children: [\n isEbook && /*#__PURE__*/ _jsx(\"div\", {\n children: /*#__PURE__*/ _jsx(\"img\", {\n src: \"/static/assets/\".concat(isMobile ? \"Mobile\" : \"PC\", \"-image-goodnote.jpg\"),\n alt: \"ebook-promotion-img\"\n })\n }),\n hasSubItems && /*#__PURE__*/ _jsxs(ContentsTab, {\n name: \"contents\",\n children: [\n /*#__PURE__*/ _jsx(\"h3\", {\n children: \"포함된 컨텐츠\"\n }),\n /*#__PURE__*/ _jsx(\"div\", {\n children: sub_items.map((subItem, index)=>{\n return /*#__PURE__*/ _jsxs(\"div\", {\n children: [\n /*#__PURE__*/ _jsx(ExtraResourceNew, {\n type: subItem.type\n }),\n /*#__PURE__*/ _jsx(\"span\", {\n children: subItem.title\n })\n ]\n }, \"sub-item-\".concat(index));\n })\n })\n ]\n }),\n previewImages && /*#__PURE__*/ _jsxs(PreviewTab, {\n name: \"preview\",\n children: [\n /*#__PURE__*/ _jsx(\"h3\", {\n children: \"미리보기\"\n }),\n /*#__PURE__*/ _jsxs(\"div\", {\n children: [\n previewImages.sort((a, b)=>a.page_num - b.page_num).map((image, index)=>{\n return /*#__PURE__*/ _jsx(Image, {\n alt: \"\".concat(product.title, \"_preview_\").concat(image.page_num),\n width: 3000,\n height: 6000,\n src: image.url\n }, \"preview-image-\" + index);\n }),\n promotionImages && promotionImages.map((image, index)=>{\n return /*#__PURE__*/ _jsx(Image, {\n width: 3000,\n height: 6000,\n src: image.url,\n alt: \"product-detail-image\"\n }, \"detail-image-\".concat(index));\n })\n ]\n })\n ]\n }),\n isBooks && (product.introduction || product.tableOfContents) && /*#__PURE__*/ _jsxs(BookInfoTab, {\n name: \"book\",\n children: [\n /*#__PURE__*/ _jsx(\"h3\", {\n children: \"도서 정보\"\n }),\n product.introduction && /*#__PURE__*/ _jsxs(\"div\", {\n className: \"info-cell\",\n children: [\n /*#__PURE__*/ _jsx(\"p\", {\n className: \"title\",\n children: \"책소개\"\n }),\n /*#__PURE__*/ _jsx(\"p\", {\n className: \"content\",\n dangerouslySetInnerHTML: {\n __html: product.introduction\n }\n })\n ]\n }),\n product.tableOfContents && /*#__PURE__*/ _jsxs(\"div\", {\n className: \"info-cell\",\n children: [\n /*#__PURE__*/ _jsx(\"p\", {\n className: \"title\",\n children: \"목차\"\n }),\n /*#__PURE__*/ _jsx(\"div\", {\n className: \"content\",\n dangerouslySetInnerHTML: {\n __html: product.tableOfContents\n }\n })\n ]\n })\n ]\n }),\n /*#__PURE__*/ _jsxs(DetailTab, {\n name: \"detail\",\n children: [\n /*#__PURE__*/ _jsx(\"h3\", {\n children: \"상세 정보\"\n }),\n (product === null || product === void 0 ? void 0 : product.description) && /*#__PURE__*/ _jsx(\"div\", {\n className: \"wrapper description\",\n children: product === null || product === void 0 ? void 0 : product.description\n }),\n /*#__PURE__*/ _jsx(\"div\", {\n className: \"wrapper info-wrapper\",\n children: /*#__PURE__*/ _jsx(\"div\", {\n children: /*#__PURE__*/ _jsx(\"ul\", {\n children: detailInfoList(product, isBooks ? product.publisher : publisherName).map((item, index)=>{\n if (item.value === null || item.value === undefined || item.value === \"0\" || item.value === \"\") return null;\n return /*#__PURE__*/ _jsxs(\"li\", {\n children: [\n /*#__PURE__*/ _jsx(\"span\", {\n className: \"title\",\n children: item.type\n }),\n /*#__PURE__*/ _jsx(\"span\", {\n className: \"content\",\n children: item.value\n })\n ]\n }, \"detail-info-\".concat(index));\n })\n })\n })\n })\n ]\n }),\n /*#__PURE__*/ _jsx(ProductDetailTerms, {\n productType: productType\n })\n ]\n })\n ]\n }),\n /*#__PURE__*/ _jsx(StickySection, {\n children: /*#__PURE__*/ _jsx(PriceTab, {\n children: priceSection\n })\n })\n ]\n });\n};\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { AllowanceChipList } from \"@/components/Product/AllowanceChipList\";\nimport Image from \"@/components/common/Image\";\nimport Icon from \"@/components/icon/Icon\";\nimport { ArrowRight, Sizes, UCILogo } from \"@/components/icon/IconList\";\nimport { mixpanelEvent } from \"@/lib/mixpanels/mixpanel\";\nimport useWindowDimensions from \"@/lib/web-ui/useWindowDimensions\";\nimport { Button, Row } from \"antd\";\nimport dayjs from \"dayjs\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/router\";\nimport React from \"react\";\nimport { isBooksProduct } from \"src/api/booksProducts\";\nimport { SourceTypeWithString } from \"src/api/product\";\nimport { useModal } from \"src/utils/overlay\";\nimport { useTheme } from \"styled-components\";\nimport { AllowanceInfo, ContentInfo, CoreSection, ImageSection, ProductDetailInfoWrapper, StickySection, UCIPromotionBox } from \"../../styles/ProductDetail.style\";\nimport getPreviewImage from \"../../utils/getPreviewImage\";\nimport BooksBadge from \"./BooksBadge\";\nimport coreInfoList from \"./coreInfoList\";\nconst ProductDetailInfo = (props)=>{\n var _product_source, _product_source1, _product_source_object;\n const [_, { open: openPreviewModal }] = useModal(\"preview-modal\");\n const product = props.product;\n const productType = isBooksProduct(product) ? product.productType : product.source_type;\n const isBooks = isBooksProduct(product);\n const thumbImg = isBooks ? product.thumbImg : product.thumb_img;\n const { uciCode , publisherName , brandName } = product;\n // TODO: remove this\n const { width } = useWindowDimensions();\n const isMobile = width < 768;\n // theme\n const theme = useTheme();\n const router = useRouter();\n return /*#__PURE__*/ _jsx(ProductDetailInfoWrapper, {\n children: /*#__PURE__*/ _jsxs(Row, {\n children: [\n /*#__PURE__*/ _jsxs(ImageSection, {\n className: \"new-col\",\n children: [\n /*#__PURE__*/ _jsx(\"div\", {\n className: \"img_box\",\n children: /*#__PURE__*/ _jsx(Image, {\n className: \"thumb-img\",\n src: thumbImg,\n alt: \"product-thumbImg-\".concat(product.title),\n width: 330,\n height: 440\n })\n }),\n !isBooks && getPreviewImage(product).length > 0 && /*#__PURE__*/ _jsx(Button, {\n className: \"preview-btn\",\n onClick: ()=>{\n openPreviewModal();\n mixpanelEvent(\"Product Detail Page_Preview\");\n },\n children: \"미리보기\"\n }),\n isBooks && /*#__PURE__*/ _jsx(BooksBadge, {}),\n uciCode && /*#__PURE__*/ _jsxs(UCIPromotionBox, {\n children: [\n /*#__PURE__*/ _jsx(Icon, {\n icon: UCILogo,\n size: isMobile ? Sizes.small : Sizes.large\n }),\n /*#__PURE__*/ _jsxs(\"div\", {\n children: [\n /*#__PURE__*/ _jsx(\"p\", {\n children: uciCode\n }),\n /*#__PURE__*/ _jsx(\"p\", {\n className: \"hide_m\",\n children: \"해당 자료는 국가콘텐츠식별체계를 통해 유통 및 관리됩니다.\"\n })\n ]\n })\n ]\n })\n ]\n }),\n /*#__PURE__*/ _jsxs(CoreSection, {\n className: \"new-col\",\n children: [\n /*#__PURE__*/ _jsxs(\"p\", {\n children: [\n SourceTypeWithString[productType],\n \" \",\n isBooks ? /*#__PURE__*/ _jsx(\"span\", {\n children: dayjs(product.publishedAt).format(\"YYYY년 개정판\")\n }) : (productType === \"textbook\" || productType === \"workbook\") && /*#__PURE__*/ _jsx(\"span\", {\n children: product.published_at && dayjs(product.published_at).format(\"YYYY년 출간\")\n })\n ]\n }),\n /*#__PURE__*/ _jsx(\"h1\", {\n children: product.title\n }),\n /*#__PURE__*/ _jsxs(\"div\", {\n className: \"authorContainer\",\n children: [\n product.author,\n brandName && /*#__PURE__*/ _jsxs(Link, {\n onClick: ()=>mixpanelEvent(\"Product Detail Page Lab Button Clicked\", {\n \"Lab Button Proposition\": \"Top Section\"\n }),\n href: \"/@\".concat(brandName),\n className: \"author-nickname\",\n children: [\n \"브랜드\",\n /*#__PURE__*/ _jsx(Icon, {\n icon: ArrowRight,\n size: Sizes.xsmall,\n color: theme.new.colors.sol_gray_600\n })\n ]\n })\n ]\n }),\n /*#__PURE__*/ _jsx(ContentInfo, {\n children: coreInfoList(product, isBooks ? product.publisher : publisherName).map((item, idx)=>{\n if (item.value == 0 || !item.value) {\n return;\n }\n return /*#__PURE__*/ _jsxs(\"li\", {\n className: \"core-info-\" + productType,\n children: [\n /*#__PURE__*/ _jsx(\"div\", {\n className: \"type\",\n children: item.type\n }),\n /*#__PURE__*/ _jsxs(\"div\", {\n className: \"type-value \".concat(item.type),\n children: [\n /*#__PURE__*/ _jsx(\"span\", {\n onClick: ()=>{\n if (item.link) {\n router.push(item.link);\n }\n },\n children: item.value\n }),\n item.link && /*#__PURE__*/ _jsx(Icon, {\n icon: ArrowRight,\n size: Sizes.xsmall,\n color: theme.new.colors.sol_gray_600\n })\n ]\n })\n ]\n }, \"core-info\" + idx);\n })\n }),\n !isBooks && /*#__PURE__*/ _jsx(AllowanceInfo, {\n children: /*#__PURE__*/ _jsxs(\"div\", {\n className: \"activity\",\n children: [\n /*#__PURE__*/ _jsxs(\"p\", {\n className: \"desc-title\",\n children: [\n isBooks ? \"도서\" : productType === \"handout\" ? \"수업자료\" : \"라이선스\",\n \" 이용 범위\"\n ]\n }),\n /*#__PURE__*/ _jsx(\"div\", {\n className: \"allowance-wrapper\",\n children: /*#__PURE__*/ _jsx(AllowanceChipList, {\n productType: productType,\n studioVersion: (_product_source = product.source) === null || _product_source === void 0 ? void 0 : _product_source.studio_version,\n isParsedByMl: (_product_source1 = product.source) === null || _product_source1 === void 0 ? void 0 : (_product_source_object = _product_source1.object) === null || _product_source_object === void 0 ? void 0 : _product_source_object.isParsedByMl\n })\n })\n ]\n })\n }),\n props.priceSection\n ]\n }),\n /*#__PURE__*/ _jsx(StickySection, {\n className: \"new-col\"\n })\n ]\n })\n });\n};\nexport default ProductDetailInfo;\n","import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { PassInfoModal } from \"@/components/Package/PassInfoModal\";\nimport PurchaseSection from \"@/components/Package/PurchaseSection\";\nimport { useAuthStore } from \"@/lib/auth/AuthStore\";\nimport useWindowDimensions from \"@/lib/web-ui/useWindowDimensions\";\nimport React from \"react\";\nimport { isBooksProduct } from \"src/api/booksProducts\";\nimport { PriceSection } from \"../components/PriceSection\";\nimport { ProductDetailContent } from \"../components/ProductDetail/ProductDetailContent\";\nimport ProductDetailInfo from \"../components/ProductDetail/ProductDetailInfo\";\nimport ProductPreviewModal from \"../components/ProductPreviewModal\";\nimport { ProductDetailViewWrapper } from \"../styles/ProductDetail.style\";\nexport const ProductDetailView = (param)=>{\n let { product } = param;\n const { width } = useWindowDimensions();\n const productType = isBooksProduct(product) ? product.productType : product.source_type;\n const isMobile = width < 768;\n const { isLoggedIn , user: { hasUsableFreepass } } = useAuthStore();\n return /*#__PURE__*/ _jsx(_Fragment, {\n children: /*#__PURE__*/ _jsxs(ProductDetailViewWrapper, {\n children: [\n /*#__PURE__*/ _jsx(ProductDetailInfo, {\n product: product,\n priceSection: productType === \"handout\" ? /*#__PURE__*/ _jsx(PurchaseSection, {\n product: product,\n hasUsableFreepass: hasUsableFreepass,\n isLoggedIn: isLoggedIn\n }) : /*#__PURE__*/ _jsx(PriceSection, {\n product: product\n })\n }),\n /*#__PURE__*/ _jsx(ProductDetailContent, {\n product: product,\n priceSection: productType === \"handout\" ? /*#__PURE__*/ _jsx(PurchaseSection, {\n product: product,\n hasUsableFreepass: hasUsableFreepass,\n isLoggedIn: isLoggedIn\n }) : /*#__PURE__*/ _jsx(PriceSection, {\n product: product,\n type: \"side\"\n })\n }),\n !isBooksProduct(product) && !isMobile && /*#__PURE__*/ _jsx(ProductPreviewModal, {\n product: product\n }),\n /*#__PURE__*/ _jsx(PassInfoModal, {})\n ]\n })\n });\n};\n"],"names":[],"sourceRoot":""}