{"version":3,"file":"customOptionGraphNavigator.CYVkniFM.mjs","names":["useState","e","React","React.useState","e","p","_define_property"],"sources":["https:/framerusercontent.com/modules/KkyTW8FBCHmm460C34rx/FXei6Ds5BNUv0FsHfnvS/Selector.js","https:/framerusercontent.com/modules/mhnaOKvTTEAN2O3eASsn/cT5upKimCcpSyDvPlC50/ProductImage.js","https:/framerusercontent.com/modules/p2OA0zrP2KXIDcyogknv/TqEEZGViG5goHJyV1Kme/customOptionGraphModel.js","https:/framerusercontent.com/modules/16wlTcIV7gGrcjxOkN1U/ipmQHQJVMjWsJShzjgxy/customOptionSelection.js","https:/framerusercontent.com/modules/nI4jjYq9sfGihPTeUomN/ZSt2CaRWpvwUnVhpefpO/customOptionGraphNavigator.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";import React,{useEffect,useState}from\"react\";export default function QuantityCounter(props){const{// 기본 설정\ninitialValue=1,minValue=0,maxValue=1e4,step=1,value:valueProp,// 컨테이너 스타일\ncontainerWidth=120,containerHeight=44,containerRadius=22,containerBackground=\"#f5f5f5\",containerBorder=\"none\",containerShadow=\"none\",// 버튼 스타일\nbuttonWidth=36,buttonHeight=36,buttonRadius=18,buttonMinusRadius,buttonPlusRadius,buttonBackground=\"#ffffff\",buttonBorder=\"1px solid #e0e0e0\",buttonActiveBackground=\"#f0f0f0\",buttonDisabledBackground=\"#f8f8f8\",// 숫자 입력 스타일\ninputRadius,// 텍스트 스타일\ntextFontSize=16,textFontWeight=\"600\",textColor=\"#000000\",textFontFamily=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",// 버튼 텍스트 스타일\nbuttonTextFontSize=20,buttonTextColor=\"#666666\",buttonTextActiveColor=\"#333333\",buttonTextDisabledColor=\"#cccccc\",onChange}=props;// 외부에서 값(value)을 내려주면 그 값으로 동작, 없으면 내부에서 상태 관리\nconst isControlled=valueProp!==undefined;const[value,setValue]=useState(valueProp??initialValue);// 외부 값(value)이 바뀌면 내부 표시도 같이 업데이트\nuseEffect(()=>{if(isControlled)setValue(valueProp);},[valueProp,isControlled]);// 내부 값 업데이트 + onChange 콜백 실행\nconst setAndEmit=next=>{setValue(next)// ✅ 항상 즉시 화면에 반영\n;onChange?.(next)// 외부(ui.qty)도 업데이트\n;};// 감소 버튼 (-)\nconst handleDecrease=()=>{const newValue=Math.max(minValue,value-step);setAndEmit(newValue);};// 증가 버튼 (+)\nconst handleIncrease=()=>{const newValue=Math.min(maxValue,value+step);setAndEmit(newValue);};// 직접 입력 처리\nconst handleInputChange=e=>{const inputValue=e.target.value;// 빈 값이면 0으로 임시 설정\nif(inputValue===\"\"){setValue(0);return;}// 숫자만 입력 허용\nconst numValue=parseInt(inputValue,10);if(!isNaN(numValue)){setValue(numValue);}};// input blur 시 범위 체크 및 확정\nconst handleInputBlur=e=>{const inputValue=e.target.value;// 빈 값이면 minValue로 설정\nif(inputValue===\"\"){setAndEmit(minValue);return;}const numValue=parseInt(inputValue,10);if(!isNaN(numValue)){// min/max 범위 내로 제한\nconst clampedValue=Math.max(minValue,Math.min(maxValue,numValue));setAndEmit(clampedValue);}else{// 숫자가 아니면 이전 값으로 복원\nsetValue(value);}};// Enter 키 누르면 blur 처리\nconst handleInputKeyDown=e=>{if(e.key===\"Enter\"){e.currentTarget.blur();}};// input hover/focus 효과\nconst[inputHovered,setInputHovered]=React.useState(false);const[inputFocused,setInputFocused]=React.useState(false);const isMinReached=value<=minValue;const isMaxReached=value>=maxValue;return /*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",alignItems:\"center\",justifyContent:\"space-between\",width:containerWidth,height:containerHeight,backgroundColor:containerBackground,borderRadius:containerRadius,border:containerBorder,boxShadow:containerShadow,padding:\"4px\",boxSizing:\"border-box\"},children:[/*#__PURE__*/_jsx(\"button\",{onClick:handleDecrease,disabled:isMinReached,style:{width:buttonWidth,height:buttonHeight,borderRadius:buttonMinusRadius??buttonRadius,backgroundColor:\"transparent\",border:\"none\",fontSize:buttonTextFontSize,color:isMinReached?buttonTextDisabledColor:buttonTextColor,fontWeight:\"500\",cursor:isMinReached?\"not-allowed\":\"pointer\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",lineHeight:1,userSelect:\"none\",transition:\"all 0.2s ease\",outline:\"none\"},onMouseDown:e=>{if(!isMinReached){e.currentTarget.style.color=buttonTextActiveColor;}},onMouseUp:e=>{if(!isMinReached){e.currentTarget.style.color=buttonTextColor;}},onMouseLeave:e=>{if(!isMinReached){e.currentTarget.style.color=buttonTextColor;}},children:\"−\"}),/*#__PURE__*/_jsx(\"input\",{type:\"text\",inputMode:\"numeric\",value:value,onChange:handleInputChange,onBlur:e=>{setInputFocused(false);handleInputBlur(e);},onFocus:e=>{setInputFocused(true);e.target.select();},onKeyDown:handleInputKeyDown,onMouseEnter:()=>setInputHovered(true),onMouseLeave:()=>setInputHovered(false),style:{fontSize:textFontSize,fontWeight:textFontWeight,color:textColor,fontFamily:textFontFamily,minWidth:\"24px\",width:\"48px\",height:buttonHeight,textAlign:\"center\",border:inputFocused?`2px solid ${buttonTextActiveColor}`:buttonBorder,background:inputFocused||inputHovered?buttonActiveBackground:buttonBackground,borderRadius:inputRadius??buttonRadius,outline:\"none\",padding:0,margin:0,cursor:\"text\",transition:\"all 0.2s ease\",boxShadow:inputFocused?`0 0 0 3px ${buttonTextActiveColor}22`:\"none\",// 화살표 제거 (Chrome, Safari, Edge)\nWebkitAppearance:\"none\",MozAppearance:\"textfield\",touchAction:\"manipulation\"}}),/*#__PURE__*/_jsx(\"button\",{onClick:handleIncrease,disabled:isMaxReached,style:{width:buttonWidth,height:buttonHeight,borderRadius:buttonPlusRadius??buttonRadius,backgroundColor:\"transparent\",border:\"none\",fontSize:buttonTextFontSize,color:isMaxReached?buttonTextDisabledColor:buttonTextColor,fontWeight:\"500\",cursor:isMaxReached?\"not-allowed\":\"pointer\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",lineHeight:1,userSelect:\"none\",transition:\"all 0.2s ease\",outline:\"none\"},onMouseDown:e=>{if(!isMaxReached){e.currentTarget.style.color=buttonTextActiveColor;}},onMouseUp:e=>{if(!isMaxReached){e.currentTarget.style.color=buttonTextColor;}},onMouseLeave:e=>{if(!isMaxReached){e.currentTarget.style.color=buttonTextColor;}},children:\"+\"})]});}// Framer 프로퍼티 컨트롤 추가\naddPropertyControls(QuantityCounter,{// 기본 설정\ninitialValue:{type:ControlType.Number,title:\"초기값\",defaultValue:1,min:0,max:99,step:1},minValue:{type:ControlType.Number,title:\"최솟값\",defaultValue:0,step:1},maxValue:{type:ControlType.Number,title:\"최댓값\",defaultValue:1e4,step:1},step:{type:ControlType.Number,title:\"증감 단위\",defaultValue:1,min:1,step:1},// 컨테이너 스타일\ncontainerWidth:{type:ControlType.Number,title:\"전체 너비\",defaultValue:120,min:80,max:200,step:1},containerHeight:{type:ControlType.Number,title:\"전체 높이\",defaultValue:44,min:32,max:60,step:1},containerRadius:{type:ControlType.Number,title:\"모서리 반경\",defaultValue:22,min:0,max:30,step:1},containerBackground:{type:ControlType.Color,title:\"배경색\",defaultValue:\"#f5f5f5\"},// 버튼 스타일\nbuttonBackground:{type:ControlType.Color,title:\"버튼 배경색\",defaultValue:\"#ffffff\"},buttonActiveBackground:{type:ControlType.Color,title:\"버튼 활성 배경색\",defaultValue:\"#f0f0f0\"},buttonMinusRadius:{type:ControlType.Number,title:\"- 버튼 모서리\",min:0,max:30,step:1},buttonPlusRadius:{type:ControlType.Number,title:\"+ 버튼 모서리\",min:0,max:30,step:1},// 숫자 입력 스타일\ninputRadius:{type:ControlType.Number,title:\"숫자 모서리\",min:0,max:30,step:1},// 텍스트 스타일\ntextFontSize:{type:ControlType.Number,title:\"숫자 크기\",defaultValue:16,min:12,max:24,step:1},textColor:{type:ControlType.Color,title:\"숫자 색상\",defaultValue:\"#000000\"},// 버튼 텍스트 스타일\nbuttonTextColor:{type:ControlType.Color,title:\"버튼 텍스트 색상\",defaultValue:\"#666666\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"QuantityCounter\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Selector.map","// ProductImage.tsx\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";import*as React from\"react\";export default function ProductImage(props){const{image,alt,fit,border,borderWidth,borderColor,shadow,bg,padding,aspect,customRatio,emptyMode,placeholderText,customEmptyImage,emptyTint,stylePreset,showCaption,caption,hoverZoom,collapseWhenEmpty=true,style,className}=props;const preset=getPreset(stylePreset,{bg,borderColor,borderWidth,shadow,border});const ratio=getAspectRatio(aspect,customRatio);// 이미지 로드 실패 처리\nconst[failed,setFailed]=React.useState(false);React.useEffect(()=>setFailed(false),[image]);const isLikelyEmpty=v=>{if(!v)return true;const s=v.trim().toLowerCase();if(!s)return true;return[\"null\",\"undefined\",\"n/a\",\"na\",\"none\",\"-\",\"—\",\"0\",\"false\"].includes(s);};const canAttemptLoad=v=>{if(!v||isLikelyEmpty(v))return false;const s=v.trim();if(/^(https?:|data:|blob:)/.test(s))return true;if(/^(\\.|\\.\\.|\\/)/.test(s))return true;return/(\\.png|\\.jpe?g|\\.webp|\\.gif|\\.svg)(\\?.*)?$/i.test(s);};const showImage=canAttemptLoad(image)&&!failed;const hasNoImage=!image||isLikelyEmpty(image);// 디버그 로그\nconsole.log(\"[ProductImage]\",{image,hasNoImage,showImage,failed});// ✅ 이미지 없거나 로드 불가/실패 && 접기 옵션이 켜져 있으면 레이어 접기\nif((hasNoImage||!showImage)&&collapseWhenEmpty){return /*#__PURE__*/_jsx(\"div\",{style:{display:\"none\"}});}// ✅ per-corner radii (linkCorners=true면 radiusAll을 4개 모서리에 적용)\nconst radii=resolveCornerRadii(props);const wrapperStyle={width:\"100%\",height:\"100%\",display:\"flex\",flexDirection:\"column\",gap:8,justifyContent:\"center\",alignItems:\"center\",boxSizing:\"border-box\",padding};const frameStyle={position:\"relative\",width:\"100%\",height:\"100%\",overflow:\"hidden\",background:preset.bg,border:preset.border?`${preset.borderWidth}px solid ${preset.borderColor}`:\"none\",boxShadow:shadowMap[preset.shadow],borderTopLeftRadius:radii.tl,borderTopRightRadius:radii.tr,borderBottomRightRadius:radii.br,borderBottomLeftRadius:radii.bl};const contentStyle=ratio?{width:\"100%\",aspectRatio:`${ratio}`,position:\"relative\"}:{width:\"100%\",height:\"100%\",position:\"relative\"};const imgStyle={position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",objectFit:fit,transition:hoverZoom?\"transform 200ms ease\":undefined,willChange:hoverZoom?\"transform\":undefined};const onEnter=e=>{if(!hoverZoom)return;const img=e.currentTarget.querySelector(\"img\");if(img)img.style.transform=\"scale(1.05)\";};const onLeave=e=>{if(!hoverZoom)return;const img=e.currentTarget.querySelector(\"img\");if(img)img.style.transform=\"scale(1)\";};return /*#__PURE__*/_jsxs(\"div\",{style:{...wrapperStyle,...style},className:className,children:[/*#__PURE__*/_jsx(\"div\",{style:contentStyle,onMouseEnter:onEnter,onMouseLeave:onLeave,children:/*#__PURE__*/_jsx(\"div\",{style:frameStyle,role:\"img\",\"aria-label\":alt,children:showImage?/*#__PURE__*/_jsx(\"img\",{src:image,alt:alt,style:imgStyle,draggable:false,onError:()=>setFailed(true)}):emptyMode===\"customImage\"&&customEmptyImage?/*#__PURE__*/_jsx(\"img\",{src:customEmptyImage,alt:\"placeholder\",style:imgStyle,draggable:false}):emptyMode===\"text\"?/*#__PURE__*/_jsx(PlaceholderText,{text:placeholderText,tint:emptyTint}):/*#__PURE__*/_jsx(PlaceholderIcon,{tint:emptyTint})})}),showCaption&&/*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",fontSize:12,color:\"rgba(0,0,0,0.7)\",textAlign:\"center\",lineHeight:1.4},children:caption})]});}const shadowMap={none:\"none\",xs:\"0 1px 2px rgba(0,0,0,.06)\",sm:\"0 1.5px 4px rgba(0,0,0,.10)\",md:\"0 4px 12px rgba(0,0,0,.12)\",lg:\"0 12px 24px rgba(0,0,0,.18)\"};function getAspectRatio(aspect,custom){switch(aspect){case\"1:1\":return 1;case\"4:3\":return 4/3;case\"3:2\":return 3/2;case\"16:9\":return 16/9;case\"2:3\":return 2/3;case\"A4\":return 210/297;case\"Custom\":return custom>0?custom:1;default:return null;}}function getPreset(stylePreset,base){const map={Default:{...base,border:false},Minimal:{...base,border:false,bg:\"transparent\",shadow:\"none\"},Card:{...base,border:false,bg:\"#ffffff\",shadow:\"md\"},Badge:{...base,border:true,borderWidth:Math.max(1,base.borderWidth),shadow:\"none\"},Polaroid:{...base,border:false,bg:\"#ffffff\",shadow:\"lg\"}};return map[stylePreset]||map[\"Default\"];}/** ✅ per-corner radii 계산 */function resolveCornerRadii(p){if(p.linkCorners){const r=p.radiusAll??0;return{tl:r,tr:r,br:r,bl:r};}return{tl:p.radiusTL??0,tr:p.radiusTR??0,br:p.radiusBR??0,bl:p.radiusBL??0};}function PlaceholderText({text,tint}){return /*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",inset:0,display:\"grid\",placeItems:\"center\",padding:16,color:tint,fontSize:12,letterSpacing:.2,textAlign:\"center\",background:\"repeating-linear-gradient(45deg, rgba(0,0,0,0.03) 0, rgba(0,0,0,0.03) 10px, transparent 10px, transparent 20px)\"},children:/*#__PURE__*/_jsx(\"span\",{style:{opacity:.8},children:text||\"No image\"})});}function PlaceholderIcon({tint}){const stroke=tint;return /*#__PURE__*/_jsxs(\"svg\",{\"aria-hidden\":\"true\",viewBox:\"0 0 24 24\",style:{position:\"absolute\",left:\"50%\",top:\"50%\",transform:\"translate(-50%, -50%)\",width:40,height:40,opacity:.6},children:[/*#__PURE__*/_jsx(\"rect\",{x:\"3\",y:\"5\",width:\"18\",height:\"14\",rx:\"2\",ry:\"2\",fill:\"none\",stroke:stroke,strokeWidth:\"1.5\"}),/*#__PURE__*/_jsx(\"circle\",{cx:\"9\",cy:\"10\",r:\"2\",fill:\"none\",stroke:stroke,strokeWidth:\"1.5\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M5 17l5-4 4 3 5-5v6H5z\",fill:\"none\",stroke:stroke,strokeWidth:\"1.5\"})]});}/* ---------- Defaults ---------- */ProductImage.defaultProps={width:300,height:300,alt:\"상품 이미지\",fit:\"cover\",// ✅ per-corner\nlinkCorners:true,radiusAll:0,radiusTL:0,radiusTR:0,radiusBR:0,radiusBL:0,border:false,borderWidth:1,borderColor:\"rgba(0,0,0,0.1)\",bg:\"rgba(0,0,0,0.03)\",shadow:\"none\",padding:0,aspect:\"Auto\",customRatio:1,emptyMode:\"placeholder\",placeholderText:\"이미지가 없습니다\",emptyTint:\"rgba(0,0,0,0.35)\",stylePreset:\"Default\",showCaption:false,caption:\"\",hoverZoom:false,/** ✅ 기본 ON: 이미지 없거나 실패 시 레이어 접기 */collapseWhenEmpty:true};/* ---------- Property Controls ---------- */addPropertyControls(ProductImage,{image:{type:ControlType.Image,title:\"Image\"},alt:{type:ControlType.String,title:\"Alt\"},fit:{type:ControlType.Enum,title:\"Object Fit\",options:[\"cover\",\"contain\",\"fill\",\"none\",\"scale-down\"]},aspect:{type:ControlType.Enum,title:\"Aspect\",options:[\"Auto\",\"1:1\",\"4:3\",\"3:2\",\"16:9\",\"2:3\",\"A4\",\"Custom\"]},customRatio:{type:ControlType.Number,title:\"Custom Ratio\",displayStepper:true,min:.1,max:4,step:.05,hidden:p=>p.aspect!==\"Custom\"},// ✅ per-corner — 프로토타이핑 변수 바인딩 용이\nlinkCorners:{type:ControlType.Boolean,title:\"Link Corners\",defaultValue:true},radiusAll:{type:ControlType.Number,title:\"Radius\",min:0,max:64,displayStepper:true,hidden:p=>!p.linkCorners},radiusTL:{type:ControlType.Number,title:\"TL\",min:0,max:64,displayStepper:true,hidden:p=>p.linkCorners},radiusTR:{type:ControlType.Number,title:\"TR\",min:0,max:64,displayStepper:true,hidden:p=>p.linkCorners},radiusBR:{type:ControlType.Number,title:\"BR\",min:0,max:64,displayStepper:true,hidden:p=>p.linkCorners},radiusBL:{type:ControlType.Number,title:\"BL\",min:0,max:64,displayStepper:true,hidden:p=>p.linkCorners},// Styling\nstylePreset:{type:ControlType.SegmentedEnum,title:\"Preset\",options:[\"Default\",\"Minimal\",\"Card\",\"Badge\",\"Polaroid\"]},bg:{type:ControlType.Color,title:\"BG\"},shadow:{type:ControlType.Enum,title:\"Shadow\",options:[\"none\",\"xs\",\"sm\",\"md\",\"lg\"]},border:{type:ControlType.Boolean,title:\"Border\"},borderWidth:{type:ControlType.Number,title:\"B Width\",min:0,max:8,hidden:p=>!p.border},borderColor:{type:ControlType.Color,title:\"B Color\",hidden:p=>!p.border},padding:{type:ControlType.Number,title:\"Padding\",min:0,max:48},// Empty state\nemptyMode:{type:ControlType.SegmentedEnum,title:\"Empty\",options:[\"placeholder\",\"text\",\"customImage\"],optionTitles:[\"Icon\",\"Text\",\"Custom\"]},placeholderText:{type:ControlType.String,title:\"Empty Text\",hidden:p=>p.emptyMode!==\"text\"},customEmptyImage:{type:ControlType.Image,title:\"Empty Image\",hidden:p=>p.emptyMode!==\"customImage\"},emptyTint:{type:ControlType.Color,title:\"Empty Tint\"},// Caption\nshowCaption:{type:ControlType.Boolean,title:\"Caption\"},caption:{type:ControlType.String,title:\"Text\",hidden:p=>!p.showCaption},hoverZoom:{type:ControlType.Boolean,title:\"Hover Zoom\"},// ✅ 접기 스위치\ncollapseWhenEmpty:{type:ControlType.Boolean,title:\"Hide when empty\",defaultValue:true}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ProductImage\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ProductImage.map","// Custom Option Graph TypeScript Types\n// ===== 노드 타입 상수 =====\nexport const NODE_TYPES={SINGLE_CHOICE:\"single_choice\",MULTIPLE_CHOICE:\"multiple_choice\",TEXT_INPUT:\"text_input\",QUANTITY_INPUT:\"quantity_input\",NOTICE:\"notice\"};\nexport const __FramerMetadata__ = {\"exports\":{\"NodeType\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"QuantityInputConfig\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CustomOptionChoice\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CustomOptionNode\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CustomOptionGraph\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"TextInputConfig\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"NODE_TYPES\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./customOptionGraphModel.map","// CustomOptionSelection 타입 정의\n// 커스텀 옵션 선택 정보를 관리하는 클래스\nfunction _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import{NODE_TYPES}from\"https://framerusercontent.com/modules/p2OA0zrP2KXIDcyogknv/TqEEZGViG5goHJyV1Kme/customOptionGraphModel.js\";// ===== CustomOptionSelection Class =====\nexport class CustomOptionSelection{// 선택 내용 요약\ngetSummary(){switch(this.nodeType){case NODE_TYPES.SINGLE_CHOICE:case NODE_TYPES.MULTIPLE_CHOICE:// 수량이 있는 choice는 \"이름 x수량\" 형태로 표시\nconst summaryParts=[];for(let i=0;i<this.selectedChoiceIds.length;i++){const choiceId=this.selectedChoiceIds[i];const choiceName=i<this.selectedChoiceNames.length?this.selectedChoiceNames[i]:choiceId;const quantity=this.selectedChoiceQuantities[choiceId];if(quantity!==undefined&&quantity>1){summaryParts.push(`${choiceName} x${quantity}`);}else{summaryParts.push(choiceName);}}return summaryParts.join(\", \");case NODE_TYPES.TEXT_INPUT:return this.inputText||\"\";case NODE_TYPES.QUANTITY_INPUT:const unit=\"개\"// 기본 단위\n;return`${this.inputQuantity||0}${unit}`;case NODE_TYPES.NOTICE:return\"확인됨\";default:return\"\";}}// 빈 선택인지 확인\nisEmpty(){switch(this.nodeType){case NODE_TYPES.SINGLE_CHOICE:case NODE_TYPES.MULTIPLE_CHOICE:return this.selectedChoiceIds.length===0;case NODE_TYPES.TEXT_INPUT:return!this.inputText||this.inputText.length===0;case NODE_TYPES.QUANTITY_INPUT:return this.inputQuantity===null||this.inputQuantity===undefined||this.inputQuantity===0;case NODE_TYPES.NOTICE:return false// 공지는 항상 완료\n;default:return true;}}// 복사\ncopy(){return new CustomOptionSelection({...this,selectedChoiceIds:[...this.selectedChoiceIds],selectedChoiceNames:[...this.selectedChoiceNames],selectedChoiceQuantities:{...this.selectedChoiceQuantities},selectedAt:this.selectedAt});}constructor(params){_define_property(this,\"nodeId\",void 0// 어떤 노드에서의 선택인지\n);_define_property(this,\"nodeTitle\",void 0// 노드 제목 (기록용)\n);_define_property(this,\"nodeType\",void 0);// 선택 값들\n_define_property(this,\"selectedChoiceIds\",[]// 선택한 옵션 ID들\n);_define_property(this,\"selectedChoiceNames\",[]// 선택한 옵션 이름들 (표시용)\n);_define_property(this,\"selectedChoiceQuantities\",{}// choiceId → 수량 매핑 (수량 입력 활성화된 choice용)\n);_define_property(this,\"inputText\",void 0// 입력한 텍스트\n);_define_property(this,\"inputQuantity\",void 0// 입력한 수량\n);// 계산된 금액\n_define_property(this,\"calculatedPrice\",0);// 선택 시점 (millisecondsSinceEpoch)\n_define_property(this,\"selectedAt\",void 0);this.nodeId=params.nodeId;this.nodeTitle=params.nodeTitle;this.nodeType=params.nodeType;this.selectedChoiceIds=params.selectedChoiceIds||[];this.selectedChoiceNames=params.selectedChoiceNames||[];this.selectedChoiceQuantities=params.selectedChoiceQuantities||{};this.inputText=params.inputText;this.inputQuantity=params.inputQuantity;this.calculatedPrice=params.calculatedPrice||0;this.selectedAt=params.selectedAt||Date.now();}}\nexport const __FramerMetadata__ = {\"exports\":{\"CustomOptionSelection\":{\"type\":\"class\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./customOptionSelection.map","function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}import{NODE_TYPES}from\"https://framerusercontent.com/modules/p2OA0zrP2KXIDcyogknv/TqEEZGViG5goHJyV1Kme/customOptionGraphModel.js\";// CustomOptionSelection 클래스 가져오기\nimport{CustomOptionSelection}from\"https://framerusercontent.com/modules/16wlTcIV7gGrcjxOkN1U/ipmQHQJVMjWsJShzjgxy/customOptionSelection.js\";import{debugLog}from\"https://framerusercontent.com/modules/lAZ2BZ9JYvlotEWncq8V/JCrDYHV6scQB7mfaxNpw/debugLog.js\";import{UniqueNumberGenerator}from\"https://framerusercontent.com/modules/lZF7w42L47l98utkyjDp/Rzk4E2c0HhGAX8JECZyV/unique_number_generator.js\";// ===== 통합된 Custom Option Navigator 싱글톤 클래스 =====\nclass CustomOptionNavigator{// ===== 싱글톤 인스턴스 =====\nstatic getInstance(){if(!CustomOptionNavigator.instance){CustomOptionNavigator.instance=new CustomOptionNavigator;}return CustomOptionNavigator.instance;}// ===== 초기화 메서드들 =====\n// 통합 초기화 메서드\ninit(graph,initialNode){// 그래프와 초기 노드 설정\nthis.graph=graph;this.graphId=graph.id// 그래프 ID 저장\n;this.initialNode=initialNode;if(!this.graph||!this.initialNode||!this.initialNode.id){throw new Error(\"그래프 또는 초기 노드가 설정되지 않았습니다.\");}// 1. 그래프 초기화\nthis.selections.clear();this.navigationHistory=[];this.currentNodeId=undefined;this.currentNode=this.initialNode;this.currentSelection=null;// 2. 네비게이션 시작\nif(!this.graph.nodes[this.initialNode.id]){throw new Error(`노드 ID ${this.initialNode.id}를 찾을 수 없습니다.`);}this.currentNodeId=this.initialNode.id;this.navigationHistory.push(this.currentNodeId);this.currentNode=this.graph.nodes[this.currentNodeId];// 첫 Selection 자동 생성\nthis.resetSelection();// 리스너들에게 알림\nthis.notifyListeners();}// ===== 네비게이션 메서드들 =====\n// 다음으로 진행\nproceed(){debugLog(\"[Navigator] proceed 호출:\",{currentNodeId:this.currentNodeId,currentSelection:this.currentSelection});if(!this.currentNodeId||!this.currentSelection||!this.graph){debugLog(\"[Navigator] proceed 실패 - 필수 값 없음\");return false;}const node=this.graph.nodes[this.currentNodeId];if(!node){debugLog(\"[Navigator] proceed 실패 - 노드 없음\");return false;}// 유효성 검사\nif(!this.validateSelection(node,this.currentSelection)){debugLog(\"[Navigator] proceed 실패 - 유효성 검사 실패\");return false;}// 가격 계산\nthis.currentSelection.calculatedPrice=this.calculatePrice(node,this.currentSelection);// 선택 저장\nthis.selections.set(this.currentNodeId,this.currentSelection);// 다음 노드로 이동\nconst nextId=this.getNextNodeId(this.currentSelection);if(nextId&&this.graph.nodes[nextId]){this.currentNodeId=nextId;this.navigationHistory.push(nextId);this.currentNode=this.graph.nodes[nextId];debugLog(\"[Navigator] 다음 노드로 이동:\",{nextNodeId:nextId,nodeTitle:this.currentNode.title});// 새 Selection 자동 생성\nthis.resetSelection();// NOTICE 타입은 자동 진행\nif(this.currentNode.nodeType===NODE_TYPES.NOTICE){setTimeout(()=>{this.proceed()// 재귀 호출로 자동 진행\n;},100);}// 리스너들에게 알림\nthis.notifyListeners();return true;}// 다음 노드가 없으면 종료 노드임\nreturn this.isEndNode();}// 뒤로가기\n// 버그 수정: goBack 시 이전 selection을 복사본으로 복원하여\n// 선택 변경 후 getTotalPrice()가 정확하게 동작하도록 함\ngoBack(){debugLog(\"[Navigator] goBack 호출:\",{navigationHistory:this.navigationHistory});if(this.navigationHistory.length<=1||!this.graph){debugLog(\"[Navigator] goBack 실패 - 더 이상 뒤로 갈 수 없음\");return false;}// 현재 선택 제거\nif(this.currentNodeId){this.selections.delete(this.currentNodeId);}// 이전 노드로\nthis.navigationHistory.pop();this.currentNodeId=this.navigationHistory[this.navigationHistory.length-1];this.currentNode=this.graph.nodes[this.currentNodeId]||null;// 이전 Selection 복원 또는 새로 생성\nif(this.currentNode){const savedSelection=this.selections.get(this.currentNode.id);if(savedSelection){// 복사본 생성하여 복원 (원본은 Map에서 삭제)\nthis.currentSelection=new CustomOptionSelection({nodeId:savedSelection.nodeId,nodeTitle:savedSelection.nodeTitle,nodeType:savedSelection.nodeType,selectedChoiceIds:[...savedSelection.selectedChoiceIds],selectedChoiceNames:[...savedSelection.selectedChoiceNames],selectedChoiceQuantities:{...savedSelection.selectedChoiceQuantities},inputText:savedSelection.inputText,inputQuantity:savedSelection.inputQuantity,calculatedPrice:savedSelection.calculatedPrice,selectedAt:savedSelection.selectedAt});// Map에서도 삭제하여 proceed 시 새로 저장되도록 함\nthis.selections.delete(this.currentNode.id);}else{this.resetSelection();}}// 리스너들에게 알림\nthis.notifyListeners();return true;}// ===== Selection 업데이트 메서드들 =====\n// 선택지 업데이트\nupdateChoices(choiceIds){if(!this.currentSelection||!this.currentNode)return;// totalQuantityMax 체크 - 새 choice 추가 시 수량 합계 초과 여부 검증\nif(this.currentNode.totalQuantityMax!=null){// 새로 추가되는 choice들 찾기\nconst newChoiceIds=choiceIds.filter(id=>!this.currentSelection.selectedChoiceIds.includes(id));// 새 choice들의 수량 합계 (비활성화는 1개로 취급)\nlet additionalQty=0;for(const choiceId of newChoiceIds){const choice=this.currentNode.choices?.find(c=>c.id===choiceId);if(choice){if(choice.isQuantityEnabled){additionalQty+=choice.quantityDefault??1;}else{// 수량 비활성화: 1개로 취급\nadditionalQty+=1;}}}// 현재 총 수량 + 추가될 수량이 max 초과하면 선택 거부\nconst currentTotal=this.getTotalSelectedQuantity();if(currentTotal+additionalQty>this.currentNode.totalQuantityMax){debugLog(\"⚠️ [updateChoices] 선택 거부 - 총 수량 초과\",{currentTotal,additionalQty,max:this.currentNode.totalQuantityMax});return;// 선택 반영 안 함\n}}// 선택지 이름 찾기 및 수량 매핑 업데이트\nconst choiceNames=[];const newQuantities={};if(this.currentNode.choices){for(const choiceId of choiceIds){const choice=this.currentNode.choices.find(c=>c.id===choiceId);if(choice){choiceNames.push(choice.name);// 수량 입력 활성화된 choice 처리\nif(choice.isQuantityEnabled){// 기존 수량이 있으면 유지, 없으면 기본값\nconst existingQty=this.currentSelection?.selectedChoiceQuantities?.[choiceId];// quantityDefault가 유효 범위 내에 있으면 사용, 아니면 min 사용\nconst min=choice.quantityMin??1;const max=choice.quantityMax??99;const defaultQty=choice.quantityDefault;const initialQty=defaultQty!=null&&defaultQty>=min&&defaultQty<=max?defaultQty:min;newQuantities[choiceId]=existingQty??initialQty;}}}}this.currentSelection=new CustomOptionSelection({...this.currentSelection,selectedChoiceIds:choiceIds,selectedChoiceNames:choiceNames,selectedChoiceQuantities:newQuantities});// 가격 자동 재계산\nthis.currentSelection.calculatedPrice=this.calculatePrice(this.currentNode,this.currentSelection);// 리스너들에게 알림\nthis.notifyListeners();}// 텍스트 입력 업데이트\nupdateText(text){if(!this.currentSelection||!this.currentNode)return;this.currentSelection=new CustomOptionSelection({...this.currentSelection,inputText:text});// 가격 재계산\nthis.currentSelection.calculatedPrice=this.calculatePrice(this.currentNode,this.currentSelection);// 리스너들에게 알림\nthis.notifyListeners();}// 수량 업데이트\nupdateQuantity(quantity){if(!this.currentSelection||!this.currentNode)return;this.currentSelection=new CustomOptionSelection({...this.currentSelection,inputQuantity:quantity});// 가격 재계산\nthis.currentSelection.calculatedPrice=this.calculatePrice(this.currentNode,this.currentSelection);// 리스너들에게 알림\nthis.notifyListeners();}// Choice 수량 업데이트 (수량 입력 활성화된 choice용)\nupdateChoiceQuantity(choiceId,quantity){if(!this.currentSelection||!this.currentNode)return;// 해당 choice가 선택되어 있는지 확인\nif(!this.currentSelection.selectedChoiceIds.includes(choiceId))return;// choice 정보 가져오기\nconst choice=this.currentNode.choices?.find(c=>c.id===choiceId);if(!choice?.isQuantityEnabled)return;// 수량 범위 제한 (최소값)\nconst min=choice.quantityMin??1;let max=choice.quantityMax??99;// 노드 레벨 totalQuantityMax 고려 - 다른 choice들의 수량을 제외한 나머지만 허용\nif(this.currentNode.totalQuantityMax!=null){const currentQty=this.currentSelection.selectedChoiceQuantities?.[choiceId]??1;const otherTotal=this.getTotalSelectedQuantity()-currentQty;const remaining=this.currentNode.totalQuantityMax-otherTotal;max=Math.min(max,remaining);}const clampedQty=Math.max(min,Math.min(max,quantity));// 새 수량 매핑 생성\nconst newQuantities={...this.currentSelection.selectedChoiceQuantities,[choiceId]:clampedQty};this.currentSelection=new CustomOptionSelection({...this.currentSelection,selectedChoiceQuantities:newQuantities});// 가격 재계산\nthis.currentSelection.calculatedPrice=this.calculatePrice(this.currentNode,this.currentSelection);debugLog(\"🔢 [Navigator] Choice 수량 변경:\",{choiceId,quantity:clampedQty,totalSelectedQuantity:this.getTotalSelectedQuantity(),calculatedPrice:this.currentSelection.calculatedPrice});// 리스너들에게 알림\nthis.notifyListeners();}// 선택된 choice들의 수량 합계 계산 (모든 choice 포함, 수량 비활성화는 1개로 취급)\ngetTotalSelectedQuantity(){if(!this.currentSelection||!this.currentNode)return 0;let total=0;for(const choiceId of this.currentSelection.selectedChoiceIds){const choice=this.currentNode.choices?.find(c=>c.id===choiceId);if(choice){if(choice.isQuantityEnabled){// 수량 활성화: 설정된 수량 사용\ntotal+=this.currentSelection.selectedChoiceQuantities?.[choiceId]??1;}else{// 수량 비활성화: 1개로 취급\ntotal+=1;}}}return total;}// ===== 조회 메서드들 =====\n// 현재 노드 가져오기\ngetCurrentNode(){return this.currentNode;}// 현재 노드 ID 가져오기\ngetCurrentNodeId(){return this.currentNodeId;}// 초기 노드 가져오기\ngetInitialNode(){return this.initialNode;}// 그래프 ID 가져오기\ngetGraphId(){return this.graphId;}// 현재 선택 가져오기\ngetCurrentSelection(){return this.currentSelection;}// 총 가격 계산\ngetTotalPrice(){let total=0;this.selections.forEach(selection=>{total+=selection.calculatedPrice;});// 현재 선택도 포함 (아직 proceed 안 한 경우)\nif(this.currentSelection&&!this.selections.has(this.currentNodeId||\"\")){total+=this.currentSelection.calculatedPrice;}return total;}// 완료 여부\nisCompleted(){// 현재 노드가 존재하고, 선택이 완료되었으며, 다음 노드가 없으면 완료\nif(!this.currentNodeId)return false;// 현재 노드에 대한 선택이 있고, 해당 노드가 종료 노드인지 확인\nconst selection=this.selections.get(this.currentNodeId);if(!selection)return false;const node=this.graph?.nodes[this.currentNodeId];if(!node)return false;// 현재 선택이 유효한지 검증 추가\nreturn this.validateSelection(node,selection)&&this.isEndNode();}// 모든 선택 내역 가져오기\ngetAllSelections(){return new Map(this.selections);}// 특정 노드의 선택 내역 가져오기\ngetSelection(nodeId){return this.selections.get(nodeId);}// 네비게이션 히스토리 가져오기\ngetNavigationHistory(){return[...this.navigationHistory];}// ===== 유효성 검사 메서드들 =====\n// 유효성 검사 (UI에서 미리 확인용)\nvalidateCurrentSelection(){if(!this.currentNode||!this.currentSelection){return false;}return this.validateSelection(this.currentNode,this.currentSelection);}// 현재 선택의 에러 메시지 가져오기\ngetValidationError(){if(!this.currentNode||!this.currentSelection){return null;}const nodeType=this.currentNode.nodeType;switch(nodeType){case NODE_TYPES.SINGLE_CHOICE:if(this.currentSelection.selectedChoiceIds.length===0){return\"옵션을 선택해주세요.\";}// 수량 합계 에러 메시지\nconst singleTotalQty=this.getTotalSelectedQuantity();if(this.currentNode.totalQuantityMin!=null&&singleTotalQty<this.currentNode.totalQuantityMin){return`총 수량이 최소 ${this.currentNode.totalQuantityMin}개 이상이어야 합니다.`;}if(this.currentNode.totalQuantityMax!=null&&singleTotalQty>this.currentNode.totalQuantityMax){return`총 수량이 최대 ${this.currentNode.totalQuantityMax}개를 초과할 수 없습니다.`;}break;case NODE_TYPES.MULTIPLE_CHOICE:const count=this.currentSelection.selectedChoiceIds.length;const min=this.currentNode.minSelectionCount;const max=this.currentNode.maxSelectionCount;// null은 제한 없음으로 처리\nif(min!==undefined&&min!==null&&count<min){return`최소 ${min}개 이상 선택해주세요.`;}// null은 제한 없음으로 처리\nif(max!==undefined&&max!==null&&count>max){return`최대 ${max}개까지 선택 가능합니다.`;}// 수량 합계 에러 메시지\nconst multiTotalQty=this.getTotalSelectedQuantity();if(this.currentNode.totalQuantityMin!=null&&multiTotalQty<this.currentNode.totalQuantityMin){return`총 수량이 최소 ${this.currentNode.totalQuantityMin}개 이상이어야 합니다.`;}if(this.currentNode.totalQuantityMax!=null&&multiTotalQty>this.currentNode.totalQuantityMax){return`총 수량이 최대 ${this.currentNode.totalQuantityMax}개를 초과할 수 없습니다.`;}break;case NODE_TYPES.TEXT_INPUT:if(this.currentNode.textInputConfig?.isRequired){if(!this.currentSelection.inputText||this.currentSelection.inputText.length===0){return\"텍스트를 입력해주세요.\";}}if(this.currentNode.textInputConfig?.maxLength){const len=this.currentSelection.inputText?.length||0;if(len>this.currentNode.textInputConfig.maxLength){return`최대 ${this.currentNode.textInputConfig.maxLength}자까지 입력 가능합니다.`;}}break;case NODE_TYPES.QUANTITY_INPUT:const qty=this.currentSelection.inputQuantity||0;const config=this.currentNode.quantityConfig;if(config){if(qty<config.min){return`최소 ${config.min}${config.unit||\"개\"} 이상 입력해주세요.`;}if(qty>config.max){return`최대 ${config.max}${config.unit||\"개\"}까지 입력 가능합니다.`;}}break;}return null;}// ===== Private 헬퍼 메서드들 =====\n// 현재 Selection 초기화/재생성\nresetSelection(){if(!this.currentNode)return;this.currentSelection=new CustomOptionSelection({nodeId:this.currentNode.id,nodeTitle:this.currentNode.title,nodeType:this.currentNode.nodeType,// 타입별 기본값\ninputQuantity:this.currentNode.quantityConfig?.defaultValue,inputText:\"\",selectedChoiceQuantities:{}});// NOTICE 타입은 자동 완료 처리\nif(this.currentNode.nodeType===NODE_TYPES.NOTICE){this.currentSelection.calculatedPrice=this.currentNode.defaultPrice||0;}}// 리스너들에게 상태 변경 알림\nnotifyListeners(){this.listeners.forEach(listener=>listener());}// Observer 패턴 - 구독\nsubscribe(listener){this.listeners.add(listener);// 구독 해제 함수 반환\nreturn()=>{this.listeners.delete(listener);};}// 다음 노드 ID 가져오기\ngetNextNodeId(selection){if(!this.currentNodeId||!this.graph)return undefined;const current=this.graph.nodes[this.currentNodeId];if(!current)return undefined;// 전달받은 selection 또는 저장된 selection 사용\nconst sel=selection||this.selections.get(this.currentNodeId);// 단일선택: choice의 nextNodeId 확인\nif(current.nodeType===NODE_TYPES.SINGLE_CHOICE){if(sel&&sel.selectedChoiceIds.length>0&&current.choices){const choice=current.choices.find(c=>c.id===sel.selectedChoiceIds[0]);if(choice?.nextNodeId){return choice.nextNodeId;}}}// 나머지: defaultNextNodeId\nreturn current.defaultNextNodeId;}// 노드 선택 유효성 검사\nvalidateSelection(node,selection){switch(node.nodeType){case NODE_TYPES.SINGLE_CHOICE:if(selection.selectedChoiceIds.length!==1)return false;// 수량 합계 검증\nconst singleTotalQty=this.getTotalSelectedQuantity();if(node.totalQuantityMin!=null&&singleTotalQty<node.totalQuantityMin){return false;}if(node.totalQuantityMax!=null&&singleTotalQty>node.totalQuantityMax){return false;}return true;case NODE_TYPES.MULTIPLE_CHOICE:const count=selection.selectedChoiceIds.length;// null은 제한 없음으로 처리\nif(node.minSelectionCount!==undefined&&node.minSelectionCount!==null&&count<node.minSelectionCount){return false;}// null은 제한 없음으로 처리\nif(node.maxSelectionCount!==undefined&&node.maxSelectionCount!==null&&count>node.maxSelectionCount){return false;}// 수량 합계 검증\nconst multiTotalQty=this.getTotalSelectedQuantity();if(node.totalQuantityMin!=null&&multiTotalQty<node.totalQuantityMin){return false;}if(node.totalQuantityMax!=null&&multiTotalQty>node.totalQuantityMax){return false;}return true;case NODE_TYPES.TEXT_INPUT:if(node.textInputConfig?.isRequired===true){return!!selection.inputText&&selection.inputText.length>0;}return true;case NODE_TYPES.QUANTITY_INPUT:const qty=selection.inputQuantity||0;if(node.quantityConfig){return qty>=node.quantityConfig.min&&qty<=node.quantityConfig.max;}return true;case NODE_TYPES.NOTICE:return true;default:return false;}}// 가격 계산\ncalculatePrice(node,selection){let total=0;switch(node.nodeType){case NODE_TYPES.SINGLE_CHOICE:case NODE_TYPES.MULTIPLE_CHOICE:// 선택형은 choice의 가격 사용 (수량 입력 활성화된 choice는 수량 곱하기)\nif(node.choices){for(const choiceId of selection.selectedChoiceIds){const choice=node.choices.find(c=>c.id===choiceId);if(choice){// 수량 입력 활성화된 choice는 price × quantity\nif(choice.isQuantityEnabled){const qty=selection.selectedChoiceQuantities?.[choiceId]??1;total+=choice.price*qty;}else{// 기존대로 price만 적용\ntotal+=choice.price;}}}}break;case NODE_TYPES.TEXT_INPUT:// defaultPrice 적용\nif(node.defaultPrice!==undefined){total+=node.defaultPrice;}// 글자당 가격 적용 (공백 제외)\nif(node.textInputConfig?.pricePerLetter&&selection.inputText){// 공백을 제외한 글자 수 계산 (UI 표시와 일치)\nconst textWithoutSpaces=selection.inputText.replace(/ /g,\"\");const letterCount=[...textWithoutSpaces].length// 이모지 고려\n;total+=node.textInputConfig.pricePerLetter*letterCount;}break;case NODE_TYPES.QUANTITY_INPUT:// defaultPrice 적용\nif(node.defaultPrice!==undefined){total+=node.defaultPrice;}// 수량별 가격 적용\nif(node.quantityConfig&&selection.inputQuantity!==undefined){total+=node.quantityConfig.pricePerUnit*selection.inputQuantity;}break;case NODE_TYPES.NOTICE:// defaultPrice만 적용\nif(node.defaultPrice!==undefined){total+=node.defaultPrice;}break;}return total;}// 종료 노드인지 확인\nisEndNode(){if(!this.currentNodeId||!this.graph)return false;const node=this.graph.nodes[this.currentNodeId];if(!node)return false;// 다음 노드가 없으면 종료\nconst nextId=this.getNextNodeId();return nextId===undefined||nextId===null;}// ===== ProductOption 변환 메서드 =====\n/**\n     * CustomOptionNavigator의 선택 결과를 ProductOption으로 변환\n     * @returns ProductOption 객체\n     */convertToProductOption(){debugLog(\"[convertCustomOption] 변환 시작\",{graphId:this.graphId});const selections=this.getAllSelections();const totalPrice=this.getTotalPrice();const initialNode=this.getInitialNode();// 공지노드(NOTICE)를 제외한 selections (name, description, customOptionSelections에서 공통 사용)\nconst filteredSelections=new Map(Array.from(selections.entries()).filter(([_,sel])=>sel.nodeType!==NODE_TYPES.NOTICE));// name: 요약된 상품명 생성 (각 선택의 요약을 '\\n  -'로 연결)\nlet name=Array.from(filteredSelections.values()).map(sel=>sel.getSummary()).filter(s=>s&&s.length>0).join(\" -\");// name이 비어있으면 initialNode의 title 사용\nif(!name&&initialNode){name=initialNode.title;}// description: 상세 설명 생성 (각 노드별로 제목: 요약 형식)\nconst description=Array.from(filteredSelections.values()).map(sel=>{const priceStr=sel.calculatedPrice>0?` (+${sel.calculatedPrice}원)`:\"\";return`${sel.nodeTitle}: ${sel.getSummary()}${priceStr}`;}).join(\" -\");// customOptionSelections: CustomOptionSelection 배열로 변환\nconst customOptionSelections=[];filteredSelections.forEach(selection=>{customOptionSelections.push(new CustomOptionSelection({nodeId:selection.nodeId,nodeTitle:selection.nodeTitle,nodeType:selection.nodeType,selectedChoiceIds:[...selection.selectedChoiceIds],selectedChoiceNames:[...selection.selectedChoiceNames],selectedChoiceQuantities:{...selection.selectedChoiceQuantities},inputText:selection.inputText,inputQuantity:selection.inputQuantity,calculatedPrice:selection.calculatedPrice,selectedAt:selection.selectedAt}));});const productOption={id:UniqueNumberGenerator.generate(\"custom_po_\"),name,unitPrice:totalPrice,description,imageUrl:initialNode?.imageUrls?.[0],isFromCustomOption:true,customOptionGraphId:this.graphId,customOptionSelections};debugLog(\"[convertCustomOption] 변환 완료\",{name,unitPrice:totalPrice,selectionsCount:customOptionSelections.length});return productOption;}// Private constructor for singleton\nconstructor(){// 그래프 및 네비게이션 상태\n_define_property(this,\"graph\",null);_define_property(this,\"graphId\",undefined// 그래프 ID 저장\n);_define_property(this,\"selections\",new Map);_define_property(this,\"navigationHistory\",[]);_define_property(this,\"currentNodeId\",void 0);_define_property(this,\"initialNode\",null// 초기 노드 저장\n);// React 연동용 현재 상태\n_define_property(this,\"currentNode\",null);_define_property(this,\"currentSelection\",null);// Observer 패턴용 리스너들\n_define_property(this,\"listeners\",new Set);}}_define_property(CustomOptionNavigator,\"instance\",null);// 전역 싱글톤 인스턴스 export\nexport const customOptionGraphNavigator=CustomOptionNavigator.getInstance();\nexport const __FramerMetadata__ = {\"exports\":{\"customOptionGraphNavigator\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./customOptionGraphNavigator.map"],"mappings":"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"}