PageSourceSearch

https://tubelab.kr/_next/static/chunks/03dcg0cd156xn.js

js tubelab.kr collected 2026-10-02 02:00:12 UTC 31,078 bytes, 1 lines download raw bytes

1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,768877,e=>{"use strict";let t=(0,e.i(456420).default)("arrow-right",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);e.s(["ArrowRight",0,t],768877)},758925,e=>{"use strict";let t=(0,e.i(456420).default)("key-round",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]);e.s(["KeyRound",0,t],758925)},209619,e=>{"use strict";e.s(["buildSubscribePageUrl",0,function(e,t){let n=new URLSearchParams({plan:e});return t&&n.set("coupon",t),`/subscribe?${n.toString()}`},"findSubscribePlan",0,function(e,t){return t?e.find(e=>e.code===t)??null:null}])},849113,e=>{"use strict";var t=e.i(343575),n=e.i(209619);function s(e){return"expired"===e.status||"used"===e.status||"inactive"===e.unavailableReason?"ended":"not_started"===e.unavailableReason?"not-started":"usable"}function r(e){return"usable"===s(e)}function i(e){return null===e.endsAt?1/0:new Date(e.endsAt).getTime()}e.s(["SCOPE_LABEL",0,{course:"클래스",plan:"구독",all:"전체"},"STATUS_LABEL",0,{available:"사용 가능",used:"사용 완료",expired:"만료"},"calcCouponDiscount",0,function(e,t){let n="percent"===e.discountType?Math.floor(t*e.discountValue/100):e.discountValue;return null!==e.maxDiscountAmount&&(n=Math.min(n,e.maxDiscountAmount)),Math.min(n,t)},"couponUsage",0,function(e,s){var i,a;let l,o;if(!r(e))return null;if("plan"===e.appliesTo&&null!==e.targetRef)return e.targetPlanCode?{href:t.SAAS_ORIGIN+(0,n.buildSubscribePageUrl)(e.targetPlanCode,e.id),name:null,action:"쿠폰 쓰고 결제하기"}:null;let c=(i=e,a=s,l={kind:"scope-list",href:(0,t.pricingUrl)(),scope:"plan"},o={kind:"scope-list",href:(0,t.enrollmentUrl)(),scope:"course-list"},null!==i.targetRef?null!==i.targetCourseTitle?{kind:"specific-open",href:(0,t.lectureUrl)(i.targetRef),title:i.targetCourseTitle}:"plan"===i.appliesTo?l:{kind:"specific-closed"}:"plan"===i.appliesTo?l:"course"===i.appliesTo||"class"===a?o:l);switch(c.kind){case"specific-open":return{href:`${c.href}?purchase=1&coupon=${encodeURIComponent(e.id)}`,name:`「${c.title}」`,action:"쿠폰 쓰고 결제하기"};case"specific-closed":return null;case"scope-list":return"plan"===c.scope?{href:`${c.href}?coupon=${encodeURIComponent(e.id)}`,name:null,action:"쿠폰 쓸 요금제 선택하기"}:{href:`${c.href}?coupon=${encodeURIComponent(e.id)}`,name:null,action:"쿠폰 쓸 강좌 선택하기"}}},"discountText",0,function(e){if("percent"===e.discountType){let t=e.maxDiscountAmount?` (최대 ${e.maxDiscountAmount.toLocaleString()}원)`:"";return`${e.discountValue}% 할인${t}`}return`${e.discountValue.toLocaleString()}원 할인`},"partitionMyCoupons",0,function(e){let t=[],n=[];for(let r of e)("ended"===s(r)?n:t).push(r);return t.sort((e,t)=>i(e)-i(t)),n.sort((e,t)=>{let[n,s]=[i(e),i(t)];return n===s?0:n===1/0?1:s===1/0?-1:s-n}),{held:t,past:n}},"usableCoupons",0,function(e,t,n,s){return e.filter(e=>r(e)&&(e.appliesTo===t||"all"===e.appliesTo)&&n>=e.minOrderAmount&&(null===e.targetRef||void 0===s||e.targetRef===s))}])},502368,e=>{"use strict";var t=e.i(873925),n=e.i(266027),s=e.i(954616),r=e.i(912598),i=e.i(142771);let a=["billing-subscription"],l=["refund-preview"];e.s(["REFUND_PREVIEW_KEY",0,l,"SUBSCRIPTION_KEY",0,a,"useBillingAction",0,function(e){let n=(0,r.useQueryClient)();return(0,s.useMutation)({mutationFn:()=>(0,i.fetchJson)(`/api/billing/${e}`,{method:"POST"}),onSuccess:()=>((0,t.track)("subscription_action",{props:{feature:"subscription",action:e,result:"success"}}),Promise.all([n.invalidateQueries({queryKey:a}),n.invalidateQueries({queryKey:l})])),onError:()=>{(0,t.track)("subscription_action",{props:{feature:"subscription",action:e,result:"error",reason_code:"request_failed"}})}})},"useBillingConfig",0,function(e,t){return(0,n.useQuery)({queryKey:["billing-config",t??null],queryFn:()=>(0,i.fetchJson)(t?`/api/billing/config?plan_code=${encodeURIComponent(t)}`:"/api/billing/config"),enabled:e,retry:!1,staleTime:6e4})},"useChangeCard",0,function(){let e=(0,r.useQueryClient)();return(0,s.useMutation)({mutationFn:({authKey:e})=>(0,i.fetchJson)("/api/billing/change-card",{method:"POST",body:JSON.stringify({authKey:e})}),onSuccess:()=>e.invalidateQueries({queryKey:a})})},"useDeleteCard",0,function(){let e=(0,r.useQueryClient)();return(0,s.useMutation)({mutationFn:({id:e})=>(0,i.fetchJson)(`/api/billing/cards/${e}`,{method:"DELETE"}),onSuccess:()=>e.invalidateQueries({queryKey:a})})},"useRegisterBillingCard",0,function(){let e=(0,r.useQueryClient)();return(0,s.useMutation)({mutationFn:e=>(0,i.fetchJson)("/api/billing/cards",{method:"POST",body:JSON.stringify(e)}),onSuccess:()=>e.invalidateQueries({queryKey:a}),retry:!1})},"useSubscribe",0,function(){let e=(0,r.useQueryClient)();return(0,s.useMutation)({mutationFn:e=>(0,i.fetchJson)(e.upgradeQuoteId?"/api/billing/upgrade":"/api/billing/subscribe",{method:"POST",body:JSON.stringify({..."authKey"in e?{authKey:e.authKey}:"billingKeyId"in e?{billing_key_id:e.billingKeyId}:{},...e.upgradeQuoteId?{quote_id:e.upgradeQuoteId}:{},plan_code:e.planCode,agreedToRecurringBilling:!0,member_coupon_id:e.memberCouponId,expected_amount:e.expectedAmount,installment_months:e.installmentMonths})}),onSuccess:()=>
1{e.invalidateQueries({queryKey:a})},retry:!1})},"useSubscription",0,function(e){return(0,n.useQuery)({queryKey:a,queryFn:()=>(0,i.fetchJson)("/api/billing/subscription"),staleTime:3e4,enabled:e?.enabled??!0})}])},557657,e=>{"use strict";let t=(0,e.i(456420).default)("ticket",[["path",{d:"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z",key:"qn84l0"}],["path",{d:"M13 5v2",key:"dyzc3o"}],["path",{d:"M13 17v2",key:"1ont0d"}],["path",{d:"M13 11v2",key:"1wjjxi"}]]);e.s(["Ticket",0,t],557657)},461875,e=>{"use strict";e.s(["MARKETING_CONSENT_COPY",0,{label:"할인·쿠폰·새 강의 소식 받기",trialLabel:"정식 오픈 소식과 쿠폰을 받아보시면, 사전예약자로 등록되고 이 체험을 드려요",campaignLabel:"할인·쿠폰·새 강의 소식을 받아보시면, 이 혜택을 드려요",legal:"할인·쿠폰·새 강의 소식 등 광고성 정보를 SMS·카카오톡·이메일로 받습니다. 동의하지 않아도 서비스 이용에 제한이 없으며, 마이페이지에서 언제든 철회할 수 있습니다.",withdrawWarning:"해제하면 할인 쿠폰·마감 임박·새 강의 소식을 받을 수 없어요.",funnelTitle:"마케팅 수신 동의",funnelIntroLines:["무료강의를 신청하면 개인정보 수집 및 마케팅 메세지 수신에 동의하는 것으로 간주합니다.","본 서비스에서 제공하는 다른 강좌, 라이브, 쿠폰, 혜택, 이벤트 안내를 포함한 알림톡 및 메시지를 수신하는 것에 동의한 것으로 간주됩니다."],funnelListLead:"본 알림에는 다음 내용이 포함될 수 있습니다.",funnelItems:["신청 여부와 관계없이 제공되는 무료 강의·라이브·이벤트 안내","쿠폰, 무료입장권, 체험권, 혜택 제공 및 소멸 안내","향후 진행 예정인 관련 강좌·프로그램 안내","참여 유도를 위한 일정 안내 및 리마인드 메시지"],funnelPurposeLines:["위 메시지는 본 서비스 운영 및 혜택 제공을 위한 목적으로 발송되며,","일부 알림은 마케팅·홍보 목적의 내용을 포함할 수 있습니다."],funnelClosing:"이를 원하지 않으실 경우 무료강의 신청이 어려운 점 양해 부탁드립니다.",funnelSignupNotice:"신청하시면 마케팅 정보 수신에 동의한 것으로 처리됩니다.",funnelSignupNoticeMore:"자세히"}])},839825,e=>{"use strict";var t=e.i(843476),n=e.i(519455);e.s(["PostActionHelp",0,function(){return(0,t.jsx)(n.Button,{asChild:!0,variant:"link",size:"sm",className:"h-auto min-h-10 max-w-full whitespace-normal text-secondary-600 dark:text-secondary-300",children:(0,t.jsx)("a",{href:"mailto:[email protected]",children:"도움이 필요해요 · 이메일 문의"})})}])},821664,267096,e=>{"use strict";async function t(e,t){let n=["coupons","mine"];await e.cancelQueries({queryKey:n}),e.setQueryData(n,e=>e?{coupons:[t,...e.coupons.filter(e=>e.id!==t.id)]}:void 0),e.invalidateQueries({queryKey:n})}e.s(["refreshCouponHolding",0,t],821664);var n=e.i(843476),s=e.i(768877),r=e.i(519455),i=e.i(839825),a=e.i(849113),l=e.i(798919);e.s(["CouponReceipt",0,function({coupon:e,context:t,already:o,onDismiss:c}){let u=(0,a.couponUsage)(e,t);return(0,n.jsxs)("div",{className:"flex min-w-0 flex-1 flex-wrap items-center justify-between gap-3",role:"status",children:[(0,n.jsxs)("div",{className:"min-w-0 basis-full text-sm sm:flex-1",children:[(0,n.jsxs)("p",{className:"break-words font-semibold",children:["「",e.name,"」 · ",(0,a.discountText)(e)]}),(0,n.jsxs)("p",{className:"break-words",children:[o?"이미 받은 쿠폰입니다.":"쿠폰을 받았습니다."," ",u?"바로 사용하시겠습니까?":"현재 사용 가능한 상품을 확인할 수 없습니다. 쿠폰함에 보관됩니다."]}),(0,n.jsxs)("p",{className:"mt-0.5 flex min-w-0 flex-wrap items-center gap-x-1.5 gap-y-0.5 break-words text-xs text-secondary-500",children:[(0,n.jsxs)("span",{className:"shrink-0 font-medium",children:[a.SCOPE_LABEL[e.appliesTo]," 적용"]}),u?.name&&(0,n.jsxs)("span",{className:"min-w-0 break-words",children:[u.name," 전용"]}),e.minOrderAmount>0&&(0,n.jsxs)("span",{className:"shrink-0",children:[e.minOrderAmount.toLocaleStr
1ing(),"원 이상 구매 시"]}),(0,n.jsx)("span",{className:"shrink-0",children:e.endsAt?`${(0,l.formatKST)(new Date(e.endsAt),"YYYY.MM.DD")}까지 사용 가능`:"기간 제한 없음"})]})]}),(0,n.jsxs)("div",{className:"flex max-w-full flex-wrap items-center gap-2",children:[u&&(0,n.jsx)(r.Button,{asChild:!0,variant:"primary",size:"md",children:(0,n.jsxs)("a",{href:u.href,children:[u.action,(0,n.jsx)(s.ArrowRight,{size:16,"aria-hidden":!0})]})}),(0,n.jsx)(r.Button,{type:"button",variant:"ghost",size:"md",onClick:c,children:"나중에"})]}),(0,n.jsx)("div",{className:"basis-full",children:(0,n.jsx)(i.PostActionHelp,{})})]})}],267096)},43011,e=>{"use strict";let t=(0,e.i(456420).default)("crown",[["path",{d:"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z",key:"1vdc57"}],["path",{d:"M5 21h14",key:"11awu3"}]]);e.s(["Crown",0,t],43011)},593583,e=>{"use strict";let t=(0,e.i(456420).default)("menu",[["path",{d:"M4 5h16",key:"1tepv9"}],["path",{d:"M4 12h16",key:"1lakjw"}],["path",{d:"M4 19h16",key:"1djgab"}]]);e.s(["Menu",0,t],593583)},598992,e=>{"use strict";var t=e.i(271645);let n="--promo-bottom-h";e.s(["useBottomSlotHeight",0,function(){let[e,s]=(0,t.useState)(null),r=(0,t.useCallback)(()=>{let t=e?Math.ceil(e.getBoundingClientRect().height)+8:0;document.documentElement.style.setProperty(n,`${t}px`)},[e]);return(0,t.useLayoutEffect)(()=>{if(!e)return;r();let t=new ResizeObserver(r);return t.observe(e),()=>t.disconnect()},[e,r]),(0,t.useEffect)(()=>()=>{document.documentElement.style.removeProperty(n)},[]),s}])},837287,e=>{"use strict";var t=e.i(271645);let n=null,s=new Set;function r(){for(let e of s)e()}function i(){return n}function a(e){return s.add(e),()=>{s.delete(e)}}e.s(["useEntryPopupOwner",0,function(e,s){let l=(0,t.useSyncExternalStore)(a,i,()=>null),o=s&&(null===l||l===e);return(0,t.useEffect)(()=>{if(o&&(null===n||n===e)&&(n!==e&&(n=e,r()),1))return()=>{n===e&&(n=null,r())}},[e,o]),s&&l===e}])},583272,e=>{"use strict";var t=e.i(456998);e.s(["requiredChecksResolver",0,function(e){return async(n,s,r)=>{let i={};for(let[t,s]of Object.entries(e))!0!==n[t]&&(i[t]={type:"custom",message:s});return Object.keys(i).length>0?{values:{},errors:(0,t.toNestErrors)(i,r)}:(r.shouldUseNativeValidation&&(0,t.validateFieldsNatively)({},r),{values:n,errors:{}})}}])},544379,e=>{"use strict";var t=e.i(843476),n=e.i(271645),s=e.i(618566),r=e.i(526732),i=e.i(266027),a=e.i(142771);let l="2026-09-15T00:00:00+09:00",o="2026-09-17T00:00:00+09:00";var c=e.i(508734),u=e.i(482022),d=e.i(867927),m=e.i(846696),h=e.i(519455),p=e.i(776639),x=e.i(837287),f=e.i(954616),g=e.i(912598),y=e.i(653145),b=e.i(257428),j=e.i(903133);let v=(0,e.i(583272).requiredChecksResolver)({agree:"동의 항목을 선택해주세요."});function k({memberId:e}){let n=(0,g.useQueryClient)(),s=["live-announcement-consent",e],r=(0,i.useQuery)({queryKey:s,queryFn:async({signal:e})=>{let[t,n]=await Promise.all([(0,a.fetchJson)("/api/members/me/marketing-consent",{signal:e}),(0,a.fetchJson)("/api/onboarding/terms",{signal:e})]);return{agreed:t.agreed,terms_url:n.terms.find(e=>"marketing"===e.code)?.content_url??null}},staleTime:0,retry:!1}),l=(0,y.useForm)({resolver:v,defaultValues:{agree:!1}}),o=(0,f.useMutation)({mutationFn:()=>(0,a.fetchJson)("/api/members/me/marketing-consent",{method:"PUT",body:JSON.stringify({agree:!0})}),onSuccess:e=>{n.setQueryData(s,t=>t?{...t,agreed:e.marketingOptIn}:t),n.invalidateQueries({queryKey:["marketing-consent"]}),n.invalidateQueries({queryKey:["marketing-banner"]}),m.toast.success("마케팅 수신 동의를 저장했어요.")},onError:()=>m.toast.error("저장하지 못했어요. 다시 시도해주세요.")});return r.isPending?(0,t.jsx)("p",{role:"status",className:"text-sm text-secondary-500",children:"수신 동의 상태 확인 중…"}):r.isError||!r.data?(0,t.jsxs)("div",{className:"space-y-1 text-sm",children:[(0,t.jsx)("p",{children:"수신 동의 상태를 불러오지 못했어요."}),(0,t.jsx)(h.Button,{variant:"link",onClick:()=>void r.refetch(),children:"다시 확인"})]}):r.data.agreed?(0,t.jsx)("p",{role:"status",className:"text-sm font-medium text-success-600",children:"마케팅 수신 동의 완료"}):r.data.terms_url?(0,t.jsxs)("div",{className:"space-y-3 border-t pt-4",children:[(0,t.jsx)("p",{className:"break-keep text-sm text-secondary-600",children:"다음 특강과 튜브랩 소식·혜택을 문자·카카오톡으로 받아보세요."}),(0,t.jsx)(j.Form,{...l,children:(0,t.jsxs)("form",{onSubmit:l.handleSubmit(()=>o.mutate()),className:"space-y-3",children:[(0,t.jsx)(j.FormField,{control:l.control,name:"agree",render:({field:e})=>(0,t.jsxs)(j.FormItem,{children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsx)(j.FormControl,{children:(0,t.jsx)(b.Checkbox,{checked:e.value,onCheckedChange:t=>e.onChange(!0===t),disabled:o.isPending})}),(0,t.jsx)(j.FormLabel,{className:"text-sm",children:"[선택] 마케팅 정보 수신 동의"}),(0,t.jsx)("a",{href:r.data.terms_url,target:"_blank",rel:"noopener noreferrer",className:"text-xs text-primary-600 underline underline-offset-4 focus-visible:outline focus-visible:outline-2",children:"자세히 보기"})]}),(0,t.jsx)(j.FormMessage,{})]})}),(0,t.jsx)(h.Button,{type:"submit",variant:"outline",className:"min-h-11 w-full",loading:o.isPending,children:"수신 동의 저장"}),o.isError&&(0,t.jsx)("p",{role:"alert",className:"text-sm text-danger-600",children:"저장하지 못했어요. 선택한 항목을 확인하고 다시 저장해주세요."})]})})]}):(0,t.jsx)("p",{className:"text-sm text-secondary-500",children:"수신 동의 안내를 준비 중입니다."})}function N({announcement:e,memberId:s,sticky:r=!1}
1){let[i,a]=(0,n.useState)(!1),[l,o]=(0,n.useState)(null),f=`tl_live_miq-live-20260916_${s}`,g=`${f}_closed`,y=(0,x.useEntryPopupOwner)("live-special",i);function b(){a(!1);try{sessionStorage.setItem(g,"1")}catch{}}async function j(e,t){try{await navigator.clipboard.writeText(e),o(null),m.toast.success(`${t}를 복사했어요.`)}catch{o(e),m.toast.error("자동 복사가 안 돼요. 아래 내용을 선택해 복사해주세요.")}}return(0,n.useEffect)(()=>{let e,t=!1;try{var n,s;let e;t="1"===sessionStorage.getItem(g)||(n=document.cookie,s=Date.now(),e=Number(n.split(";").map(e=>e.trim()).find(e=>e.startsWith(`${f}=`))?.slice(f.length+1)),Number.isFinite(e)&&e>s&&e<=s+864e5)}catch{}if(t)return;let r=new MutationObserver(i);function i(){document.querySelector('[role="dialog"][data-state="open"], [role="alertdialog"][data-state="open"]')||(r.disconnect(),e=setTimeout(()=>a(!0),0))}return r.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-state"]}),i(),()=>{r.disconnect(),e&&clearTimeout(e)}},[f,g]),(0,t.jsxs)(p.Dialog,{open:y,onOpenChange:e=>e?a(!0):b(),children:[(0,t.jsxs)("div",{role:"region","aria-label":"미큐 무료 특강 안내",style:{height:"var(--class-bar-h,2.75rem)"},className:r?"sticky top-0 z-[var(--z-header)] shrink-0":"shrink-0",children:[(0,t.jsx)("style",{children:":root{--promo-top-h:var(--class-bar-h,2.75rem)}"}),(0,t.jsx)(p.DialogTrigger,{asChild:!0,children:(0,t.jsxs)(h.Button,{variant:"primary",className:"h-full w-full justify-center gap-2 rounded-none px-3 text-xs sm:text-sm",children:[(0,t.jsx)("span",{className:"min-w-0 whitespace-normal break-keep text-left leading-tight",children:e.banner_title}),(0,t.jsxs)("span",{className:"flex shrink-0 items-center text-xs",children:["참여 안내",(0,t.jsx)(d.ChevronRight,{className:"size-4"})]})]})})]}),(0,t.jsxs)(p.DialogContent,{size:"lg",className:"rounded-xl p-5 sm:p-6",children:[(0,t.jsxs)(p.DialogHeader,{className:"pr-5 text-left",children:[(0,t.jsx)(p.DialogTitle,{className:"text-xl font-bold",children:e.title}),(0,t.jsx)(p.DialogDescription,{className:"text-base font-semibold text-primary-600",children:e.schedule})]}),(0,t.jsx)("ul",{className:"list-inside list-disc space-y-1 text-sm text-secondary-700",children:e.topics.map(e=>(0,t.jsx)("li",{children:e},e))}),(0,t.jsxs)("div",{className:"space-y-3 rounded-xl bg-secondary-50 p-4 dark:bg-secondary-900",children:[(0,t.jsx)("p",{className:"break-keep text-sm font-medium",children:"라이브 참여 안내는 오픈톡방 공지를 확인해주세요."}),(0,t.jsx)(h.Button,{asChild:!0,variant:"primary",className:"min-h-11 w-full",children:(0,t.jsxs)("a",{href:e.openchat_url,target:"_blank",rel:"noopener noreferrer",children:["오픈톡방 참여하기",(0,t.jsx)(u.ExternalLink,{className:"size-4"})]})}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("a",{href:e.openchat_url,target:"_blank",rel:"noopener noreferrer",className:"min-w-0 flex-1 break-all text-xs text-primary-600 underline underline-offset-4 focus-visible:outline focus-visible:outline-2",children:e.openchat_url}),(0,t.jsxs)(h.Button,{variant:"outline",size:"sm",className:"min-h-11",onClick:()=>void j(e.openchat_url,"주소"),children:[(0,t.jsx)(c.Copy,{}),"주소 복사"]})]}),(0,t.jsxs)("div",{className:"flex items-center justify-between gap-2 border-t pt-3",children:[(0,t.jsxs)("p",{className:"text-sm",children:["참여 코드 ",(0,t.jsx)("strong",{className:"ml-2 text-xl tabular-nums",children:e.join_code})]}),(0,t.jsxs)(h.Button,{variant:"outline",size:"sm",className:"min-h-11",onClick:()=>void j(e.join_code,"참여 코드"),children:[(0,t.jsx)(c.Copy,{}),"코드 복사"]})]}),l&&(0,t.jsx)("p",{role:"status",className:"select-all break-all rounded-lg border p-2 text-sm",children:l})]}),(0,t.jsx)(k,{memberId:s}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2 border-t pt-3",children:[(0,t.jsx)(h.Button,{variant:"ghost",className:"min-h-11 text-secondary-600",onClick:function(){try{var e,t;let n;
1document.cookie=(e=Date.now(),t=window.location.hostname,n="tubelab.kr"===t||t.endsWith(".tubelab.kr"),`${f}=${e+864e5}; Path=/; Max-Age=86400; SameSite=Lax${n?"; Domain=tubelab.kr; Secure":""}`)}catch{}b();try{sessionStorage.removeItem(g)}catch{}},children:"24시간 보지 않기"}),(0,t.jsx)(h.Button,{variant:"outline",className:"min-h-11",onClick:b,children:"닫기"})]})]})]})}e.s(["LiveAnnouncementSlot",0,function({children:e=null,sticky:c=!1,suppressed:u=!1}){var d,m;let h,{data:p,status:x}=(0,r.useSession)(),f=(0,s.usePathname)(),g=p?.user?.memberId,[y,b]=(0,n.useState)(!1);(0,n.useEffect)(()=>{function e(){var e;b((e=Date.now())>=Date.parse(l)&&e<Date.parse(o))}let t=setTimeout(e,0),n=[l,o].map(e=>Date.parse(e)-Date.now()).filter(e=>e>0&&e<=0x7fffffff).map(t=>setTimeout(e,t));return window.addEventListener("focus",e),()=>{clearTimeout(t),n.forEach(clearTimeout),window.removeEventListener("focus",e)}},[]);let j=y&&!u&&(h=f.replace(/^\/(saas|class)(?=\/|$)/,"")||"/",!/^\/(auth|login|signup|payment|payments|checkout|subscribe|pricing|billing|policy|terms|privacy|f|c)(\/|$)/.test(h))&&"authenticated"===x&&p?.user?.role==="user"&&p?.user?.onboarded!==!1,v=(d=g,m=j,(0,i.useQuery)({queryKey:["live-announcement",d??"anonymous"],queryFn:({signal:e})=>(0,a.fetchJson)("/api/my/live-announcement",{signal:e}),enabled:!!d&&m,staleTime:6e4,retry:!1,refetchOnWindowFocus:!0,refetchInterval:3e5,refetchIntervalInBackground:!1}));return j&&g&&!v.isError&&v.data?(0,t.jsx)(N,{announcement:v.data,memberId:g,sticky:c},`${g}:${v.data.id}`):(0,t.jsx)(t.Fragment,{children:e})}],544379)},114670,e=>{"use strict";e.s(["isValidMobilePhone",0,function(e){return null!==e&&/^01\d{8,9}$/.test(e)},"normalizePhone",0,function(e){if(!e)return null;let t=e.replace(/[\s-]/g,"");return t&&(t.startsWith("+82")?`0${t.slice(3)}`:t).replace(/\D/g,"")||null}])},765548,e=>{"use strict";var t=e.i(266027),n=e.i(526732),s=e.i(142771);let r=["withdrawal-status"];e.s(["WITHDRAWAL_STATUS_QUERY_KEY",0,r,"useWithdrawalStatus",0,function(e=!0){let{status:i}=(0,n.useSession)();return(0,t.useQuery)({queryKey:r,queryFn:()=>(0,s.fetchJson)("/api/my/withdraw/status"),enabled:e&&"authenticated"===i,staleTime:1/0,refetchOnWindowFocus:!1,refetchOnReconnect:!1,retry:!1})}])},793684,e=>{"use strict";var t=e.i(843476),n=e.i(271645),s=e.i(618566),r=e.i(526732),i=e.i(716327),a=e.i(653145),l=e.i(954616),o=e.i(266027),c=e.i(846696),u=e.i(519455),d=e.i(641890),m=e.i(257428),h=e.i(776639),p=e.i(903133),x=e.i(793479),f=e.i(911315),g=e.i(114670),y=e.i(873925),b=e.i(142771),j=e.i(583272),v=e.i(461875),k=e.i(782431),N=e.i(765548),C=e.i(975157);let w=["partner"],S={tos:"이용약관 동의",privacy:"개인정보 수집·이용 동의",marketing:v.MARKETING_CONSENT_COPY.label,partner:"파트너 약관"},T={},_={marketing:v.MARKETING_CONSENT_COPY.legal},F=(0,j.requiredChecksResolver)({tos:"필수 약관에 동의해 주세요",privacy:"필수 약관에 동의해 주세요"});e.s(["TermsGateModal",0,function(){let e=(0,s.useRouter)(),j=(0,k.useLogout)(),{data:E,status:D,update:M}=(0,r.useSession)(),{authUnavailable:P}=(0,d.useStableSessionStatus)(),[O,I]=(0,n.useState)(!1),R=(0,n.useRef)(!1),L="authenticated"===D&&E?.user?.onboarded===!1;(0,n.useEffect)(()=>{L&&!R.current&&(R.current=!0,M().then(e=>{e?.user?.onboarded===!1&&I(!0)}))},[L,M]);let{data:A,isLoading:$}=(0,N.useWithdrawalStatus)(L),q=L&&O&&!P&&!$&&A?.pending!==!0,{data:z}=(0,o.useQuery)({queryKey:["onboarding-terms"],queryFn:()=>(0,b.fetchJson)("/api/onboarding/terms"),enabled:q,staleTime:6e5,retry:!1}),K=(z?.terms??[]).filter(e=>{var t;return t=e.code,!w.includes(t)}),B=z?.missing_profile?.name===!0,Q=z?.missing_profile?.phone===!0,U=(0,a.useForm)({resolver:F,defaultValues:{tos:!1,privacy:!1,marketing:!1,name:"",phone:""}}
1),[J,V]=(0,n.useState)(!1),[W,Y]=(0,n.useState)(!1),H=(0,a.useWatch)({control:U.control}),G=K.length>0&&K.every(e=>!0===H[e.code]),Z=(0,l.useMutation)({mutationFn:e=>(0,b.fetchJson)("/api/onboarding/terms",{method:"POST",body:JSON.stringify(e)}),onSuccess:async t=>{await M(),c.toast.success("가입이 완료되었습니다. 환영합니다!"),t.onboarding_just_completed&&(0,y.track)("onboarding_complete",{props:{feature:"onboarding"}}),e.refresh()},onError:e=>{c.toast.error(e instanceof Error?e.message:"처리에 실패했습니다")}});return q?(0,t.jsx)(h.Dialog,{open:q,onOpenChange:()=>{},children:(0,t.jsxs)(h.DialogContent,{showCloseButton:!1,onEscapeKeyDown:e=>e.preventDefault(),onInteractOutside:e=>e.preventDefault(),className:"sm:max-w-md",children:[(0,t.jsxs)(h.DialogHeader,{children:[(0,t.jsx)(h.DialogTitle,{children:B||Q?"가입 정보를 확인해 주세요":"서비스 이용을 위해 약관에 동의해 주세요"}),(0,t.jsxs)(h.DialogDescription,{children:["튜브랩 가입의 마지막 단계입니다."," ",B||Q?"필수 항목 입력과 약관 동의 후 모든 기능을 이용할 수 있어요.":"필수 약관 동의 후 모든 기능을 이용할 수 있어요."]})]}),0===K.length?(0,t.jsx)("div",{className:"flex justify-center py-8",children:(0,t.jsx)(f.Loading,{size:"md",text:"약관을 불러오는 중..."})}):(0,t.jsx)(p.Form,{...U,children:(0,t.jsxs)("form",{onSubmit:U.handleSubmit(e=>{if(B&&!e.name?.trim())return void U.setError("name",{message:"이름을 입력해 주세요"});if(Q&&!(0,g.isValidMobilePhone)((0,g.normalizePhone)(e.phone)))return void U.setError("phone",{message:"휴대폰번호를 정확히 입력해 주세요"});let t=K.filter(t=>e[t.code]).map(e=>e.id);Z.mutate({agreed_terms_ids:t,...B&&{name:e.name?.trim()},...Q&&{phone:e.phone}})},()=>V(!0)),className:"space-y-4",children:[(0,t.jsxs)("div",{className:"rounded-lg border",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 p-4",children:[(0,t.jsx)(m.Checkbox,{id:"agree-all",checked:G,onCheckedChange:e=>(function(e){for(let t of K)U.setValue(t.code,e,{shouldValidate:!1});e&&U.clearErrors(K.map(e=>e.code))})(!0===e)}),(0,t.jsxs)("label",{htmlFor:"agree-all",className:"flex-1 cursor-pointer text-sm font-medium",children:["전체 동의"," ",(0,t.jsx)("span",{className:"font-normal text-muted-foreground",children:"(선택 항목 포함)"})]}),(0,t.jsx)("button",{type:"button",onClick:()=>V(e=>!e),"aria-expanded":J,"aria-controls":"terms-list","aria-label":J?"약관 목록 접기":"약관 목록 펼치기",className:"rounded-md p-1 text-secondary-400 transition-colors hover:text-secondary-600 dark:hover:text-secondary-300",children:(0,t.jsx)(i.ChevronDown,{className:(0,C.cn)("size-4 transition-transform",J&&"rotate-180")})})]}),J&&(0,t.jsx)("div",{id:"terms-list",className:"space-y-3 border-t p-4",children:K.map(e=>(0,t.jsx)(p.FormField,{control:U.control,name:e.code,render:({field:n})=>(0,t.jsxs)(p.FormItem,{className:"flex items-start gap-3 space-y-0",children:[(0,t.jsx)(p.FormControl,{children:(0,t.jsx)(m.Checkbox,{checked:n.value,onCheckedChange:t=>{let s=!0===t;n.onChange(s),"marketing"===e.code&&Y(!s)}})}),(0,t.jsxs)("div",{className:"flex-1 space-y-1",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-2",children:[(0,t.jsxs)(p.FormLabel,{className:"font-normal",children:[S[e.code]??"약관 동의"," ",(0,t.jsxs)("span",{className:"text-muted-foreground",children:["(",e.is_required?"필수":"선택",")"]})]}),(0,t.jsx)("a",{href:e.content_url,target:"_blank",rel:"noopener noreferrer",className:"shrink-0 text-xs text-secondary-400 underline underline-offset-2 transition-colors hover:text-secondary-600 dark:hover:text-secondary-300",children:"보기"})]}),T[e.code]&&!("marketing"===e.code&&W)&&(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:T[e.code]}),"marketing"===e.code&&W&&(0,t.jsx)("p",{className:"text-xs text-warning-600 dark:text-warning-400",children:v.MARKETING_CONSENT_COPY.withdrawWarning}),_[e.code]&&(0,t.jsx)("p",{className:"text-2xs leading-relaxed text-secondary-400 dark:text-secondary-500",children:_[e.code]}),(0,t.jsx)(p.FormMessage,{})]})]})},e.id))})]}),(B||Q)&&(0,t.jsxs)("div",{className:"space-y-3 border-t pt-4",children:[B&&(0,t.jsx)(p.FormField,{control:U.control,name:"name",render:({field:e})=>(0,t.jsxs)(p.FormItem,{children:[(0,t.jsx)(p.FormLabel,{children:"이름"}),(0,t.jsx)(p.FormControl,{children:(0,t.jsx)(x.Input,{...e,autoComplete:"name",placeholder:"실명을 입력해 주세요"})}),(0,t.jsx)(p.FormMessage,{})]})}),Q&&(0,t.jsx)(p.FormField,{control:U.control,name:"phone",render:({field:e})=>(0,t.jsxs)(p.FormItem,{children:[(0,t.jsx)(p.FormLabel,{children:"휴대폰번호"}),(0,t.jsx)(p.FormControl,{children:(0,t.jsx)(x.Input,{...e,type:"tel",inputMode:"numeric",autoComplete:"tel",placeholder:"01012345678"})}),(0,t.jsx)(p.FormMessage,{})]})})]}),(0,t.jsx)(u.Button,{type:"submit",className:"w-full",disabled:Z.isPending,children:Z.isPending?"처리 중…":"동의하고 시작하기"}),(0,t.jsx)("button",{type:"button",onClick:()=>j(),className:"w-full text-center text-xs text-secondary-400 hover:text-secondary-600 dark:hover:text-secondary-300 transition-colors",children:"동의하지 않고 로그아웃"})]})})]})}):null}],793684)},810686,e=>{"use strict";var t=e.i(843476),n=e.i(24071),s=e.i(927735),r=e.i(618566),i=e.i(271645),a=e.i(893622),l=e.i(519455),o=e.i(776639),c=e.i(300678);let u=["/shorts"],d=/^(\/class)?\/f(\/|$)/,m="bottom-[calc(var(--promo-bottom-h,0px)+1.25rem+var(--safe-bottom,0px))]";e.s(["FeedbackFab",0,function({isLoggedIn:e}){let h=(0,r.usePathname)(),[p,x]=(0,i.useState)("closed"),[f,g]=(0,i.useState)(!1),[,y]=(0,c.useLoginParam)();
1return h&&(d.test(h)||u.some(e=>h.includes(e)))||e?null:(0,t.jsxs)(t.Fragment,{children:["closed"===p&&(0,t.jsxs)("button",{type:"button",onClick:function(){e?x("open"):g(!0)},"aria-label":"의견 보내기",className:`fixed ${m} right-4 z-[var(--z-nav)] flex items-center gap-2 rounded-full bg-primary-500 px-4 py-3 text-white shadow-lg transition-colors hover:bg-primary-600 md:right-6`,children:[(0,t.jsx)(s.MessageSquareText,{size:20,"aria-hidden":!0}),(0,t.jsx)("span",{className:"hidden text-sm font-semibold md:inline",children:"피드백"})]}),"minimized"===p&&(0,t.jsxs)("button",{type:"button",onClick:()=>x("open"),className:`fixed ${m} right-0 z-[var(--z-nav)] flex items-center gap-1.5 rounded-l-xl bg-primary-500 py-3 pl-3 pr-2 text-white shadow-lg transition-colors hover:bg-primary-600`,children:[(0,t.jsx)(s.MessageSquareText,{size:16,"aria-hidden":!0}),(0,t.jsx)("span",{className:"whitespace-nowrap text-sm font-semibold",children:"작성 중"}),(0,t.jsx)(n.ChevronLeft,{size:16,"aria-hidden":!0})]}),"closed"!==p&&(0,t.jsx)(a.FeedbackDialog,{open:"open"===p,onOpenChange:e=>x(e?"open":"closed"),onMinimize:()=>x("minimized")}),(0,t.jsx)(o.Dialog,{open:f,onOpenChange:g,children:(0,t.jsxs)(o.DialogContent,{size:"sm",className:"w-[calc(100vw-1.5rem)] sm:w-full",children:[(0,t.jsxs)(o.DialogHeader,{className:"text-left",children:[(0,t.jsx)(o.DialogTitle,{className:"pr-6 text-base font-extrabold",children:"로그인이 필요해요"}),(0,t.jsx)(o.DialogDescription,{className:"text-sm",children:"피드백은 로그인 후 보낼 수 있어요. 어떤 화면에서 생긴 일인지 함께 확인해야 고칠 수 있거든요."})]}),(0,t.jsxs)(o.DialogFooter,{children:[(0,t.jsx)(l.Button,{type:"button",variant:"outline",onClick:()=>g(!1),children:"닫기"}),(0,t.jsx)(l.Button,{type:"button",variant:"primary",onClick:()=>{g(!1),y("1")},children:"로그인"})]})]})})]})}],810686)}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.