PageSourceSearch

https://naemo.ai/_next/static/chunks/7861.03fdfe74d0971f73.js

js naemo.ai collected 2026-09-24 14:31:43 UTC 60,398 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7861],{35596:function(e,t,n){n.d(t,{Z:function(){return m}});var r=n(57437),a=n(2265),i=n(59717),s=n(81906),l=n(33728),c=n(57586),o=n(13100),d=n(93448),x=n(21652);let u=0;function m(e){let{isOpen:t,onClose:n,title:m,children:h,footer:p,className:b}=e,f=(0,i.o)(),g=(0,s.c)(0);(0,a.useEffect)(()=>{t&&g.set(0)},[t,g]);let v=(0,l.H)(g,[0,240],[1,0]),k=(0,a.useRef)(n),w=(0,a.useRef)(!1);(0,a.useEffect)(()=>{k.current=n},[n]),(0,a.useEffect)(()=>{if(!t)return;u++,document.body.style.overflow="hidden";let e=(0,x.UM)(),n=window.history.state||{};!e||w.current||n.isBottomSheet||(window.history.pushState({...n,isBottomSheet:!0},""),w.current=!0);let r=()=>{w.current&&(w.current=!1,k.current())};return window.addEventListener("popstate",r),()=>{window.removeEventListener("popstate",r),--u<=0&&(u=0,document.body.style.overflow="")}},[t]);let j=(0,a.useCallback)(()=>{w.current&&(w.current=!1,window.history.back()),n()},[n]),y=(0,a.useCallback)((e,t)=>{(t.velocity.y>500||t.offset.y>100)&&j()},[j]),z=(0,a.useRef)(null),N=(0,a.useRef)(null);return(0,a.useEffect)(()=>{if(!t)return;let e=z.current;if(!e)return;let n=[],r=function(t){let n=!(arguments.length>1)||void 0===arguments[1]||arguments[1];if(!e||!e.contains(t))return;let r=e.getBoundingClientRect(),a=t.getBoundingClientRect(),i=a.top-r.top,s=Math.min(24,Math.max(12,(e.clientHeight-a.height)/2)),l=e.scrollTop+i-s;e.scrollTo({top:Math.max(0,l),behavior:n?"smooth":"auto"})},a=e=>{let t=e.target;t&&("INPUT"===t.tagName||"TEXTAREA"===t.tagName||"SELECT"===t.tagName||t.isContentEditable)&&(N.current=t,r(t,!1),n.push(setTimeout(()=>r(t,!0),120)),n.push(setTimeout(()=>r(t,!0),300)),n.push(setTimeout(()=>r(t,!0),500)))},i=()=>{N.current=null},s=()=>{N.current&&r(N.current,!0)};e.addEventListener("focusin",a),e.addEventListener("focusout",i);let l=window.visualViewport;return null==l||l.addEventListener("resize",s),()=>{n.forEach(clearTimeout),e.removeEventListener("focusin",a),e.removeEventListener("focusout",i),null==l||l.removeEventListener("resize",s)}},[t]),(0,r.jsx)(c.M,{children:t&&(0,r.jsxs)("div",{className:"md:hidden fixed inset-x-0 z-[100] flex items-end",role:"dialog","aria-modal":"true","aria-label":m,style:{top:"var(--vv-offset-top, 0px)",height:"var(--app-height)"},children:[(0,r.jsx)(o.E.div,{initial:{opacity:0}
1,animate:{opacity:1},exit:{opacity:0},transition:{duration:.22,ease:[.22,1,.36,1]},className:"absolute inset-0",children:(0,r.jsx)(o.E.div,{style:{opacity:v},onClick:j,className:"absolute inset-0 bg-black/50 backdrop-blur-sm"})}),(0,r.jsxs)(o.E.div,{style:{y:g,maxHeight:"90%"},initial:{y:"100%"},animate:{y:0},exit:{y:"100%"},transition:{type:"spring",damping:30,stiffness:320,mass:.8},drag:"y",dragListener:!1,dragControls:f,dragConstraints:{top:0},dragElastic:{top:.12,bottom:.75},onDragEnd:y,role:"dialog","aria-modal":"true",className:(0,d.cn)("relative w-full bg-white dark:bg-[#18181b] border-t border-transparent dark:border-white/[0.08] rounded-t-2xl","flex flex-col overflow-hidden mobile-sheet-pad shadow-2xl",b),children:[(0,r.jsx)("div",{onPointerDown:e=>f.start(e),className:"flex justify-center pt-3 pb-2 shrink-0 cursor-grab active:cursor-grabbing touch-none select-none",children:(0,r.jsx)("div",{className:"w-9 h-1 rounded-full bg-zinc-300 dark:bg-zinc-700"})}),m&&(0,r.jsx)("div",{className:"px-4 pb-3 border-b border-zinc-200/40 dark:border-zinc-800/60 shrink-0",children:(0,r.jsx)("h3",{className:"text-[var(--mobile-font-h2)] font-semibold text-zinc-900 dark:text-zinc-100",children:m})}),(0,r.jsx)("div",{ref:z,className:"flex-1 overflow-y-auto overflow-x-hidden px-4 pt-3 pb-2 mobile-scroll mobile-sheet-scroll",children:h}),p&&(0,r.jsx)("div",{className:"shrink-0 px-4 pt-2.5 pb-1 border-t border-zinc-100 dark:border-zinc-800/80 bg-white/95 dark:bg-[#18181b]/95 backdrop-blur-md",children:p})]})]})})}},43059:function(e,t,n){n.d(t,{Lz:function(){return d},ZP:function(){return o}});var r=n(57437),a=n(93448);n(2265);var i=n(52345),s=n(13100),l=n(92846);let c={type:"spring",stiffness:450,damping:30,mass:.5};function o(e){let{children:t,className:n,onClick:o,hapticFeedback:d=!0}=e,x=(0,i.J)(),u=()=>{o&&(d&&l.MU.tap(),o())},m=(0,a.cn)("relative overflow-hidden","bg-white dark:bg-[#1C1C1E]","border border-zinc-200/70 dark:border-white/[0.08] shadow-[0_1px_3px_rgba(0,0,0,0.03)] dark:shadow-none","rounded-[var(--mobile-radius-card)]","p-4 transition-[background-color,border-color] duration-200",o&&"cursor-pointer touch-pan-y select-none",n);return o?(0,r.jsx)(s.E.div,{role:"button",tabIndex:0,whileTap:x?void 0:{scale:.975},transition:c,onClick:u,onKeyDown:e=>{("Enter"===e.key||" "===e.key)&&(e.preventDefault(),u())},className:m,style:{borderRadius:"var(--mobile-radius-card)"},children:t}):(0,r.jsx)("div",{className:m,style:{borderRadius:"var(--mobile-radius-card)"},children:t})}function d(e){let{children:t,className:n}=e;return(0,r.jsx)("div",{className:(0,a.cn)("flex items-center justify-between mb-2 text-zinc-900 dark:text-zinc-100",n),children:t})}},24754:function(e,t,n){n.d(t,{Z:function(){return h}});var r=n(57437),a=n(2265),i=n(54887),s=n(32489),l=n(21047),c=n(99397),o=n(93448),d=n(98319),x=n(34137),u=n(43232);let m="live_ck_4yKeq5bgrpWgyX6jdZjZVGX0lzW6";function h(e){let{isOpen:t,onClose:n,currentBalance:h}=e,[p,b]=(0,a.useState)(!1),[f,g]=(0,a.useState)(1),[v,k]=(0,a.useState)(!1),[w,j]=(0,a.useState)(!1),{showToast:y}=(0,d.p)(),z=100*f,N=8900*f;(0,a.useEffect)(()=>(b(!0),()=>b(!1)),[]),(0,a.useEffect)(()=>{if(t){if(window.TossPayments)k(!0);else{let e=document.createElement("script");e.src="https://js.tosspayments.com/v2/standard",e.async=!0,e.onload=()=>k(!0),e.onerror=()=>y("결제 시스템을 불러오는데 실패했습니다.","error"),document.head.appendChild(e)}}},[t,y]),(0,x.j)(n,t);let C=(0,a.useCallback)(()=>{let e=Date.now(),t=Math.random().toString(36).substring(2,8).toUpperCase();return"CREDIT-".concat(e,"-").concat(t)},[]),E=async()=>{if(!m){y("결제 시스템이 설정되지 않았습니다.","error");return}if(!v||!window.TossPayments){y("결제 시스템을 불러오는 중입니다.","info");return}j(!0);try{let e=window.TossPayments(m).payment({customerKey:"customer-".concat(Date.now())}),t=window.location.origin;await e.requestPayment({method:"CARD",amount:{currency:"KRW",value:N},orderId:C(),orderName:"내모 크레딧 ".concat(z,"개"),successUrl:"".concat(t,"/payment/credit-success?quantity=").concat(f),failUrl:"".concat(t,"/payment/credit-fail")})}catch(e){(null==e?void 0:e.code)!=="USER_CANCEL"&&y((null==e?void 0:e.message)||"결제 요청 중 오류가 발생했습니다.","error")}finally{j(!1)}};return t&&p?(0,i.createPortal)((0,r.jsx)("div",{className:"modal-viewport z-[300] flex items-center justify-center bg-black/60 backdrop-blur-sm p-4",onClick:e=>e.target===e.currentTarget&&n(),children:(0,r.jsxs)("div",{className:"relative w-full max-w-[400px] h-[540px] max-h-full bg-white dark:bg-[#0D0D0D] border border-zinc-200 dark:border-white/10 rounded-xl overflow-hidden animate-in fade-in zoom-in-95 duration-150 flex flex-col",children:[(0,r.jsx)("button",{"aria-label":"닫기",onClick:n,className:"absolute top-4 right-4 p-1 text-zinc-400 hover:text-zinc-600 dark:hover:text-white transition-colors",children:(0,r.jsx)(s.Z,{size:18})}),(0,r.jsxs)("div",{className:"px-8 pb-4 pt-10 flex-1 flex flex-col overflow-y-auto",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-sm text-zinc-500 mb-3",children:"충전하는 크레딧"}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("div",{className:"flex-1 h-12 bg-white dark:bg-white/5 border border-zinc-200 dark:border-white/10 rounded-lg flex items-center justify-center",children:(0,r.jsx)("span",{className:"text-xl font-semibold text-zinc-900 dark:text-white",children:z.toLocaleStr
1ing()})}),(0,r.jsx)("button",{"aria-label":"수량 줄이기",onClick:()=>g(e=>Math.max(1,e-1)),disabled:f<=1,className:"w-12 h-12 flex items-center justify-center border border-zinc-200 dark:border-white/10 rounded-lg text-zinc-500 hover:text-zinc-700 dark:hover:text-white hover:border-zinc-300 dark:hover:border-white/20 hover:bg-zinc-50 dark:hover:bg-white/5 disabled:opacity-30 disabled:cursor-not-allowed transition",children:(0,r.jsx)(l.Z,{size:18})}),(0,r.jsx)("button",{"aria-label":"수량 늘리기",onClick:()=>g(e=>e+1),className:"w-12 h-12 flex items-center justify-center border border-zinc-200 dark:border-white/10 rounded-lg text-zinc-500 hover:text-zinc-700 dark:hover:text-white hover:border-zinc-300 dark:hover:border-white/20 hover:bg-zinc-50 dark:hover:bg-white/5 transition",children:(0,r.jsx)(c.Z,{size:18})})]}),(0,r.jsxs)("p",{className:"text-sm text-zinc-400 dark:text-zinc-500 mt-3",children:["AI 생활기록부 작성 기능을 ",z.toLocaleString(),"회 이용할 수 있어요"]})]}),(0,r.jsx)("div",{className:"flex-1"}),(0,r.jsxs)("div",{className:"space-y-3 mb-6",children:[(0,r.jsxs)("div",{className:"flex justify-between items-center text-sm",children:[(0,r.jsx)("span",{className:"text-zinc-500",children:"보유 크레딧:"}),(0,r.jsx)("span",{className:"text-zinc-700 dark:text-zinc-300 font-medium",children:h.toLocaleString()})]}),(0,r.jsxs)("div",{className:"flex justify-between items-center text-sm",children:[(0,r.jsx)("span",{className:"text-zinc-500",children:"충전 크레딧:"}),(0,r.jsxs)("span",{className:"text-zinc-700 dark:text-zinc-300 font-medium",children:["+",z.toLocaleString()]})]}),(0,r.jsxs)("div",{className:"flex justify-between items-center text-sm",children:[(0,r.jsx)("span",{className:"text-zinc-900 dark:text-white font-semibold",children:"충전 후 크레딧:"}),(0,r.jsx)("span",{className:"text-zinc-900 dark:text-white font-bold",children:(h+z).toLocaleString()})]})]}),(0,r.jsx)("div",{className:"h-px bg-zinc-100 dark:bg-white/10 mb-6"}),(0,r.jsxs)("div",{className:"flex justify-between items-baseline mb-8",children:[(0,r.jsxs)("div",{className:"flex items-baseline gap-4",children:[(0,r.jsxs)("span",{className:"text-sm text-zinc-500",children:["100 크레딧 \xd7 ",f]}),(0,r.jsx)("span",{className:"text-sm text-zinc-500 font-medium",children:"총 결제금액"})]}),(0,r.jsxs)("span",{className:"text-xl font-bold text-zinc-900 dark:text-white",children:["₩",N.toLocaleString()]})]}),(0,r.jsx)("div",{onClick:w?void 0:E,role:"button",tabIndex:w?-1:0,className:(0,o.cn)("w-full h-12 font-medium text-sm rounded-lg transition flex items-center justify-center gap-2 select-none",w?"bg-zinc-100 dark:bg-white/5 text-zinc-400 cursor-not-allowed":"bg-zinc-900 dark:bg-zinc-100 [color:#fff] dark:[color:#18181b] cursor-pointer"),onMouseEnter:e=>{w||(e.currentTarget.style.backgroundColor="#27272a")},onMouseLeave:e=>{w||(e.currentTarget.style.backgroundColor="")},children:w?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(u.O,{size:16,strokeWidth:3,className:"animate-spin"}),"처리 중"]}):"결제"}),(0,r.jsx)("div",{className:"mt-4 text-center",children:(0,r.jsxs)("p",{className:"text-[11px] text-zinc-400 dark:text-zinc-500",children:["결제 시 ",(0,r.jsx)("a",{href:"/terms",target:"_blank",rel:"noopener noreferrer",className:"underline hover:text-zinc-600 dark:hover:text-zinc-400",children:"이용약관"}),"을 확인하였으며 이에 동의합니다."]})})]})]})}),document.body):null}},67861:function(e,t,n){n.r(t),n.d(t,{default:function(){return ei}});var r=n(57437),a=n(2265),i=n(99397),s=n(51817),l=n(41671),c=n(76865),o=n(92735),d=n(40875),x=n(33245),u=n(54696),m=n(93448),h=n(4908),p=n(83008),b=n(67920),f=n(98319),g=n(39136),v=n(43232),k=n(53834),w=n(24754);let j=["담임 학급","담임학급"],y=["결석","지각","조퇴","결과"];function z(e){return!e.some(e=>!!e.type&&y.includes(e.type))}var N=n(96214),C=n(9235),E=n(82374),M=n(39561),S=n(9244),D=n(7153),L=n(92804),T=n(14064),Z=n(73247),A=n(32489),R=n(95805),I=n(10407),F=n(92451),K=n(30401),P=n(25450),_=n(43059),B=n(35596);function U(e){let{roster:t,isStudentsLoaded:n,getMemo:i,getDraft:l,setMemo:d,setDraft:x,savingKeys:u,dirtyKeys:m,failedKeys:h,onRetryFailed:p,generatingId:b,onGenerate:f,generationWarnings:g,targetRange:k,onTargetRangeChange:w,byteTarget:j,doneCount:y,recordsStatus:z,onRetryRecords:N,attendanceStatus:C,perfectAttendanceLineFor:E,lastYearLineFor:M,appendMemoLine:S,onExcelDownload:D,showAiCreditControls:I,creditBalance:F,onOpenCreditModal:K,onUndo:_,canUndo:U=!1}
1=e,[W,G]=(0,a.useState)("all"),[O,Y]=(0,a.useState)(null),[q,V]=(0,a.useState)(""),J=(0,a.useMemo)(()=>{let e=q.trim();return t.filter(t=>{if(e&&!t.name.includes(e)&&!String(t.number).startsWith(e))return!1;if("all"===W)return!0;let n=l(t.id).trim().length>0;return"done"===W?n:!n})},[t,W,l,q]),Q=(0,a.useMemo)(()=>O?t.findIndex(e=>e.id===O):-1,[t,O]),$=Q>=0?t[Q]:null;(0,a.useEffect)(()=>{O&&Q<0&&Y(null)},[O,Q]);let ee=(0,a.useCallback)(e=>{if(Q<0)return;let n=t[Q+e];n&&Y(n.id)},[Q,t]);return(0,r.jsxs)("div",{className:"flex flex-col h-full bg-[#FBFBF9] dark:bg-[#111]",children:[(0,r.jsxs)("div",{className:"flex-1 overflow-y-auto px-4 mobile-scroll-bottom mobile-scroll",children:[(0,r.jsx)("div",{className:"pt-3 pb-1",children:(0,r.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,r.jsx)("div",{className:"min-w-0",children:"loading"===z?(0,r.jsxs)("p",{className:"flex items-center gap-1.5 text-[13px] text-zinc-400",children:[(0,r.jsx)(s.Z,{size:13,className:"animate-spin"}),"완료 현황을 불러오는 중"]}):"error"===z?(0,r.jsxs)("p",{className:"flex flex-wrap items-center gap-1.5 text-[12px] text-red-500",children:[(0,r.jsx)(c.Z,{size:12,className:"shrink-0"}),"완료 현황을 불러오지 못했습니다.",(0,r.jsx)("button",{type:"button",onClick:N,className:"underline underline-offset-2 font-medium",children:"다시 시도"})]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("p",{className:"text-[15px] font-bold text-zinc-900 dark:text-white leading-tight",children:["초안 ",y,"명 완료",(0,r.jsxs)("span",{className:"font-medium text-zinc-400",children:[" / ",t.length,"명"]})]}),(0,r.jsx)("p",{className:"text-[12px] text-zinc-400 mt-0.5",children:"학생을 눌러 관찰 메모를 남겨 보세요."})]})}),(0,r.jsxs)("div",{className:"flex items-center gap-1.5 shrink-0",children:[_&&(0,r.jsx)("button",{type:"button",onClick:_,disabled:!U,"aria-label":"마지막 변경 되돌리기",className:"flex items-center justify-center min-w-[44px] min-h-[44px] bg-white dark:bg-white/5 border border-zinc-200/60 dark:border-white/10 text-zinc-500 dark:text-zinc-300 rounded-2xl shadow-sm active:scale-[0.95] transition disabled:opacity-40",children:(0,r.jsx)(T.Z,{size:18})}),I&&(0,r.jsxs)("button",{type:"button",onClick:K,className:"flex items-center gap-1.5 min-h-[44px] px-3 bg-white dark:bg-white/5 border border-zinc-200/60 dark:border-white/10 text-zinc-600 dark:text-zinc-300 rounded-2xl shadow-sm active:scale-[0.95] transition",children:[(0,r.jsx)(v.O,{size:14,className:"text-zinc-900 dark:text-white"}),(0,r.jsx)("span",{className:"text-[13px] font-semibold",children:null!=F?F:"-"})]}),(0,r.jsx)("button",{type:"button",onClick:D,disabled:0===t.length,"aria-label":"엑셀로 내려받기",className:"flex items-center justify-center min-w-[44px] min-h-[44px] bg-white dark:bg-white/5 border border-zinc-200/60 dark:border-white/10 text-zinc-500 dark:text-zinc-300 rounded-2xl shadow-sm active:scale-[0.95] transition disabled:opacity-40",children:(0,r.jsx)(o.Z,{size:18})})]})]})}),h&&h.size>0&&(0,r.jsxs)("div",{role:"alert",className:"mt-2 flex flex-wrap items-center gap-x-2 gap-y-1 rounded-xl border border-red-200 dark:border-red-900/50 bg-red-50 dark:bg-red-950/30 px-3 py-2",children:[(0,r.jsx)(c.Z,{size:13,className:"shrink-0 text-red-600 dark:text-red-400"}),(0,r.jsxs)("span",{className:"text-[12px] font-semibold text-red-700 dark:text-red-300 break-keep",children:[h.size,"명분이 저장되지 않았습니다."]}),p&&(0,r.jsx)("button",{type:"button",onClick:p,className:"ml-auto min-h-[36px] px-3 rounded-lg text-[12px] font-bold text-red-700 dark:text-red-200 bg-white dark:bg-red-900/40 border border-red-200 dark:border-red-900/60 active:scale-[0.97] transition",children:"다시 시도"})]}),"error"===C&&(0,r.jsxs)("p",{className:"flex items-start gap-1.5 text-[11px] leading-snug text-zinc-400 mt-2",children:[(0,r.jsx)(c.Z,{size:12,className:"shrink-0 mt-[1px]"}),"출결 기록을 불러오지 못해 개근 여부를 확인할 수 없습니다."]}),(0,r.jsxs)("div",{className:"sticky top-0 z-30 -mx-4 px-4 py-2 bg-[#FBFBF9]/90 dark:bg-[#111]/90 backdrop-blur-md",children:[(0,r.jsxs)("div",{className:"relative mb-2",children:[(0,r.jsx)(Z.Z,{size:16,className:"absolute left-3 top-1/2 -translate-y-1/2 text-zinc-400 dark:text-zinc-500 pointer-events-none","aria-hidden":"true"}),(0,r.jsx)("input",{type:"text",inputMode:"search",value:q,onChange:e=>V(e.target.value),"aria-label":"학생 이름 또는 번호로 찾기",placeholder:"이름 또는 번호로 찾기",className:"w-full min-h-[44px] pl-9 pr-10 rounded-2xl bg-white dark:bg-white/5 border border-zinc-200/60 dark:border-white/10 text-[15px] text-zinc-900 dark:text-zinc-100 placeholder:text-zinc-400 dark:placeholder:text-zinc-500 shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500/60 transition"}),q&&(0,r.jsx)("button",{type:"button",onClick:()=>V(""),"aria-label":"검색어 지우기",className:"absolute right-1.5 top-1/2 -translate-y-1/2 flex items-center justify-center w-10 h-10 rounded-xl text-zinc-400 dark:text-zinc-400 active:bg-zinc-100 dark:active:bg-white/10 transition",children:(0,r.jsx)(A.Z,{size:16})})]}),(0,r.jsx)("div",{className:"flex flex-wrap items-center gap-1.5",children:[["all","전체 ".concat(t.length)],["todo","작성 전 ".concat(t.length-y)],["done","완료 ".concat(y)]].map(e=>{let[t,n]=e;return(0,r.jsx)("button",{type:"button",onClick:()=>G(t),className:(0,P.Fk)(W===t,"flex-none whitespace-nowrap"),children:n},t)})})]}),n||0!==t.length?0===t.length?(0,r.jsxs)("div",{className:"flex flex-col items-center justify-center py-20 px-6 text-zinc-400",children:[(0,r.jsx)("div",{className:"w-14 h-14 bg-zinc-100 dark:bg-white/5 rounded-full flex items-center justify-center mb-4",children:(0,r.jsx)(R.Z,{size:26})}),(0,r.jsxs)("p",{className:"text-[13px] leading-relaxed text-center",children:["담임 학급으로 지정된 학생이 없습니다.",(0,r.jsx)("br",{}),"설정 > 학생 명단에서 담임 학급을 먼저 지정해 주세요."]})]}):0===J.length?(0,r.jsxs)("div",{className:"flex flex-col items-center justify-center gap-3 py-20 px-6 text-zinc-500 dark:text-zinc-400",children:[(0,r.jsx)("p",{className:"text-[13px] text-center break-keep",children:q.trim()?"'".concat(q.trim(),"'").concat((0,L.Ge)(q.trim(),"과","와")," 맞는 학생이 없습니다."):"done"===W?"초안이 작성된 학생이 없습니다.":"작성할 학생이 남지 않았습니다."}),q.trim()&&(0,r.jsx)("button",{type:"button",onClick:()=>
1V(""),className:"min-h-[44px] px-4 rounded-2xl bg-white dark:bg-white/5 border border-zinc-200/60 dark:border-white/10 text-[13px] font-semibold text-zinc-700 dark:text-zinc-200 shadow-sm active:scale-[0.97] transition",children:"검색어 지우기"})]}):(0,r.jsx)("div",{className:"space-y-2.5 pt-1",children:J.map(e=>(0,r.jsx)(H,{student:e,memo:i(e.id),draft:l(e.id),byteTarget:j,isSaving:u.has(e.id),isDirty:m.has(e.id),hasFailed:!!(null==h?void 0:h.has(e.id)),isGenerating:b===e.id,onOpen:()=>Y(e.id)},e.id))}):(0,r.jsxs)("div",{className:"flex flex-col items-center justify-center py-24 text-zinc-400",children:[(0,r.jsx)(s.Z,{size:22,className:"animate-spin mb-3"}),(0,r.jsx)("p",{className:"text-[13px]",children:"학생 데이터를 불러오는 중"})]})]}),(0,r.jsx)(B.Z,{isOpen:!!$,onClose:()=>Y(null),title:$?"".concat($.number,"번 ").concat($.name):void 0,children:$&&(0,r.jsx)(X,{student:$,memo:i($.id),draft:l($.id),onMemoChange:e=>d($.id,e),onDraftChange:e=>x($.id,e),isSaving:u.has($.id),isDirty:m.has($.id),isGenerating:b===$.id,isAnyGenerating:!!b,onGenerate:()=>f($.id,$.name),warning:g[$.id],targetRange:k,onTargetRangeChange:w,byteTarget:j,attendanceStatus:C,perfectAttendanceLine:E($.id),lastYearLine:M($.id),onAppendMemoLine:e=>S($.id,e),hasPrev:Q>0,hasNext:Q>=0&&Q<t.length-1,onPrev:()=>ee(-1),onNext:()=>ee(1)},$.id)})]})}function H(e){let{student:t,memo:n,draft:a,byteTarget:i,isSaving:l,isDirty:o,hasFailed:d=!1,isGenerating:x,onOpen:u}=e,h=n.trim().length>0,p=a.trim().length>0,b=p?(0,C.C)(a):0;return h||p||x?(0,r.jsxs)(_.ZP,{onClick:u,className:"!p-3.5",children:[(0,r.jsxs)(_.Lz,{className:"!mb-2.5",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,r.jsx)("span",{className:"flex items-center justify-center shrink-0 w-6 h-6 rounded-lg bg-zinc-100 dark:bg-white/10 text-[11px] font-bold text-zinc-500 dark:text-zinc-400",children:t.number}),(0,r.jsx)("span",{className:"text-[15px] font-bold text-zinc-900 dark:text-white truncate",children:t.name})]}),(0,r.jsxs)("div",{className:"flex items-center gap-1.5 shrink-0",children:[d?(0,r.jsxs)("span",{className:"flex items-center gap-1 text-[11px] font-bold text-red-600 dark:text-red-400",children:[(0,r.jsx)(c.Z,{size:11}),"저장 안 됨"]}):x?(0,r.jsxs)("span",{className:"flex items-center gap-1 text-[11px] font-semibold text-zinc-500",children:[(0,r.jsx)(k.W,{size:11,className:"text-zinc-500"}),"생성 중"]}):l?(0,r.jsx)(s.Z,{size:13,className:"animate-spin text-blue-500"}):o?(0,r.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-500","aria-label":"저장 대기 중"}):null,(0,r.jsx)("span",{className:(0,m.cn)("px-2 py-0.5 rounded-full text-[10px] font-bold",p?"bg-emerald-500/12 text-emerald-700 dark:text-emerald-300":h?"bg-amber-500/12 text-amber-700 dark:text-amber-300":"bg-zinc-100 dark:bg-white/10 text-zinc-400"),children:p?"초안 완료":h?"메모만":"비어 있음"})]})]}),(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsx)(W,{label:"관찰 메모",value:n,emptyText:"적어 둔 메모가 없습니다",lineClamp:2}),(0,r.jsx)(W,{label:"초안",value:a,emptyText:"아직 초안이 없습니다",lineClamp:2,trailing:p?(0,r.jsxs)("span",{className:(0,m.cn)("text-[10px] font-mono shrink-0",b>i?"text-red-500":"text-emerald-600"),children:[b," / ",i]}):void 0})]})]}):(0,r.jsx)(_.ZP,{onClick:u,className:"!p-3 !py-2.5",children:(0,r.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,r.jsx)("span",{className:"flex items-center justify-center shrink-0 w-6 h-6 rounded-lg bg-zinc-100 dark:bg-white/10 text-[11px] font-bold text-zinc-500 dark:text-zinc-400",children:t.number}),(0,r.jsx)("span",{className:"text-[15px] font-semibold text-zinc-900 dark:text-white truncate",children:t.name}),(0,r.jsxs)("span",{className:"ml-auto shrink-0 flex items-center gap-1.5",children:[d?(0,r.jsx)("span",{className:"text-[11px] font-bold text-red-600 dark:text-red-400",children:"저장 안 됨"}):l?(0,r.jsx)(s.Z,{size:13,className:"animate-spin text-blue-500"}):o?(0,r.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-500","aria-label":"저장 대기 중"}):null,(0,r.jsx)("span",{className:"text-[12px] font-medium text-zinc-400 dark:text-zinc-500",children:"비어 있음"}),(0,r.jsx)(I.Z,{size:15,className:"text-zinc-300 dark:text-zinc-500","aria-hidden":"true"})]})]})})}function W(e){let{label:t,value:n,emptyText:a,lineClamp:i,trailing:s}=e,l=n.trim().length>0;return(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex items-center justify-between gap-2 mb-0.5",children:[(0,r.jsx)("span",{className:"text-[10px] font-bold tracking-wider text-zinc-400 dark:text-zinc-500",children:t}),s]}),(0,r.jsx)("p",{className:(0,m.cn)("text-[13px] leading-[1.55] whitespace-pre-wrap break-words",l?"text-zinc-700 dark:text-zinc-300":"text-zinc-400 dark:text-zinc-500",2===i?"line-clamp-2":"line-clamp-3"),children:l?n:a})]})}
1function X(e){let{student:t,memo:n,draft:a,onMemoChange:i,onDraftChange:o,isSaving:d,isDirty:x,isGenerating:u,isAnyGenerating:h,onGenerate:p,warning:b,targetRange:f,onTargetRangeChange:g,byteTarget:v,attendanceStatus:w,perfectAttendanceLine:j,lastYearLine:y,onAppendMemoLine:z,hasPrev:N,hasNext:E,onPrev:M,onNext:S}=e,D=!n.trim(),L=(0,C.C)(a),T=!!j&&n.includes(j),Z=!!y&&n.includes(y);return(0,r.jsxs)("div",{className:"space-y-5 pb-4",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between gap-2 -mt-1",children:[(0,r.jsxs)("p",{className:"text-[11px] font-medium text-zinc-400 dark:text-zinc-500",children:[t.grade?"".concat(t.grade,"학년 "):"",t.classNum?"".concat(t.classNum,"반 "):"",t.number,"번"]}),(0,r.jsx)("span",{className:"flex items-center gap-1 text-[11px] font-medium text-zinc-400 dark:text-zinc-500",children:d?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.Z,{size:11,className:"animate-spin text-blue-500"}),"저장 중"]}):x?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-amber-500"}),"저장 대기 중"]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(l.Z,{size:11,className:"text-emerald-500"}),"저장됨"]})})]}),(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsx)("label",{htmlFor:"behavior-memo",className:"block text-[11px] font-bold tracking-wider text-zinc-500 dark:text-zinc-400",children:"관찰 메모"}),(0,r.jsx)("textarea",{id:"behavior-memo",value:n,onChange:e=>i(e.target.value),placeholder:"한 해 동안 눈에 남은 모습을 자유롭게 적어 주세요. 여러 줄로 적어도 됩니다.",rows:6,className:"w-full px-3.5 py-3 bg-zinc-50 dark:bg-zinc-800 border border-zinc-200 dark:border-zinc-700 rounded-xl text-[16px] leading-[1.6] text-zinc-900 dark:text-zinc-100 placeholder:text-zinc-400 dark:placeholder:text-zinc-500 focus:outline-none focus:border-blue-500 resize-none"}),(0,r.jsxs)("div",{className:"flex flex-wrap gap-1.5",children:[(0,r.jsx)(G,{label:T?"개근 문구 넣음":"개근 문구 넣기",inserted:T,disabled:"loaded"!==w||!j||T,onClick:()=>j&&z(j)}),(0,r.jsx)(G,{label:Z?"작년 키워드 넣음":"작년 행동특성 가져오기",inserted:Z,disabled:!y||Z,onClick:()=>y&&z(y)})]}),(0,r.jsx)("p",{className:"text-[11px] leading-snug text-zinc-400 dark:text-zinc-500",children:"loading"===w?"출결 기록을 불러오는 중입니다.":"error"===w?"출결 기록을 불러오지 못해 개근 여부를 확인할 수 없습니다.":j||y?"이미 적어 둔 메모는 지우지 않고 아래에 한 줄로 붙습니다.":"이 학생에게 넣을 개근 문구나 작년 키워드가 없습니다."})]}),(0,r.jsxs)("div",{className:"space-y-2.5 pt-1 border-t border-zinc-100 dark:border-zinc-800",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between gap-3 pt-3",children:[(0,r.jsx)("span",{className:"text-[11px] font-bold tracking-wider text-zinc-500 dark:text-zinc-400",children:"초안 분량"}),(0,r.jsx)("div",{className:"flex items-center gap-1 p-0.5 bg-zinc-100 dark:bg-zinc-800 rounded-xl",children:["900","1500"].map(e=>(0,r.jsxs)("button",{type:"button",onClick:()=>g(e),className:(0,m.cn)("px-3 min-h-[34px] rounded-[10px] text-[12px] font-bold transition active:scale-[0.96]",f===e?"bg-white dark:bg-zinc-700 text-zinc-900 dark:text-zinc-100 shadow-sm":"text-zinc-400 dark:text-zinc-500"),children:[e,"byte"]},e))})]}),(0,r.jsx)("button",{type:"button",onClick:p,disabled:D||h,className:"w-full flex items-center justify-center gap-2 min-h-[50px] bg-zinc-900 dark:bg-zinc-100 text-white dark:text-zinc-900 font-bold rounded-xl shadow-lg shadow-zinc-900/10 active:scale-[0.98] transition disabled:opacity-40 disabled:shadow-none",children:u?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(k.W,{size:16,className:"text-white dark:text-zinc-900"}),(0,r.jsx)("span",{children:"생성 중"})]}):(0,r.jsx)("span",{children:"AI로 초안 작성"})}),D&&(0,r.jsx)("p",{className:"text-[11px] text-zinc-400 dark:text-zinc-500 text-center",children:"관찰 메모를 먼저 적어 주세요."})]}),(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,r.jsx)("label",{htmlFor:"behavior-draft",className:"text-[11px] font-bold tracking-wider text-zinc-500 dark:text-zinc-400",children:"초안"}),(0,r.jsxs)("span",{className:(0,m.cn)("text-[11px] font-mono font-medium",L>v?"text-red-500 dark:text-red-400":"text-emerald-600 dark:text-emerald-400"),children:[L," / ",v,"byte"]})]}),(0,r.jsx)("textarea",{id:"behavior-draft",value:a,onChange:e=>o(e.target.value),disabled:u,placeholder:"AI로 초안을 만들거나 직접 적어 주세요.",rows:10,className:"w-full px-3.5 py-3 bg-zinc-50 dark:bg-zinc-800 border border-zinc-200 dark:border-zinc-700 rounded-xl text-[16px] leading-[1.7] text-zinc-900 dark:text-zinc-100 placeholder:text-zinc-400 dark:placeholder:text-zinc-500 focus:outline-none focus:border-blue-500 resize-none disabled:opacity-60"}),b&&(0,r.jsxs)("p",{className:"flex items-start gap-1.5 text-[11px] leading-snug text-amber-600 dar
1k:text-amber-400",children:[(0,r.jsx)(c.Z,{size:12,className:"shrink-0 mt-[1px]"}),b]})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2 pt-1",children:[(0,r.jsxs)("button",{type:"button",onClick:M,disabled:!N,className:"flex-1 flex items-center justify-center gap-1 min-h-[44px] bg-zinc-50 dark:bg-zinc-800 border border-zinc-200 dark:border-zinc-700 text-zinc-600 dark:text-zinc-300 rounded-xl text-[13px] font-semibold active:scale-[0.97] transition disabled:opacity-40",children:[(0,r.jsx)(F.Z,{size:16}),"이전 학생"]}),(0,r.jsxs)("button",{type:"button",onClick:S,disabled:!E,className:"flex-1 flex items-center justify-center gap-1 min-h-[44px] bg-zinc-50 dark:bg-zinc-800 border border-zinc-200 dark:border-zinc-700 text-zinc-600 dark:text-zinc-300 rounded-xl text-[13px] font-semibold active:scale-[0.97] transition disabled:opacity-40",children:[(0,r.jsx)(I.Z,{size:16}),"다음 학생"]})]})]})}function G(e){let{label:t,inserted:n,disabled:a,onClick:s}=e;return(0,r.jsxs)("button",{type:"button",onClick:s,disabled:a,className:(0,m.cn)("flex items-center gap-1 px-3 min-h-[36px] rounded-2xl text-[12px] font-semibold border transition active:scale-[0.96]",n?"bg-emerald-500/10 border-emerald-500/20 text-emerald-700 dark:text-emerald-300":"bg-white dark:bg-zinc-800 border-zinc-200 dark:border-zinc-700 text-zinc-600 dark:text-zinc-300",a&&!n&&"opacity-40"),children:[n?(0,r.jsx)(K.Z,{size:13}):(0,r.jsx)(i.Z,{size:13,className:"text-zinc-400 dark:text-zinc-500"}),t]})}var O=n(64954),Y=n(70809),q=n(69813);let V={sources:[],draft:""},J=e=>e.sources.join("\n"),Q=e=>e.trim().length>0?[e]:[],$=e=>e&&"string"==typeof e?e.replace(/\*\*/g,"").replace(/\*/g,"").replace(/__/g,"").trim():e,ee=e=>{let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return"".concat(t,"-").concat(n,"-").concat(r)},et="saemo.behaviorMemoColWidth.v1",en="한 해 동안 개근하여 생활 전반에 성실함이 드러남",er="작년 행동특성 참고 키워드: ";function ea(e){let{onClick:t,label:n,description:a,disabled:s}=e;return(0,r.jsxs)("button",{type:"button",onClick:t,disabled:s,className:(0,m.cn)("w-full flex items-start gap-2 px-3 py-2 text-left transition-colors",s?"opacity-50 cursor-not-allowed":"hover:bg-zinc-100 dark:hover:bg-white/5"),children:[(0,r.jsx)(i.Z,{size:14,className:"shrink-0 mt-0.5 text-zinc-400"}),(0,r.jsxs)("span",{className:"min-w-0",children:[(0,r.jsx)("span",{className:"block text-sm font-medium text-zinc-800 dark:text-zinc-100",children:n}),(0,r.jsx)("span",{className:"block text-[11px] leading-snug text-zinc-500 dark:text-zinc-400 mt-0.5 font-normal",children:a})]})]})}function ei(){let{students:e,isLoaded:t}=(0,h.AF)(),i=(0,b.XC)(),{showToast:y}=(0,f.p)(),{openSettings:L}=(0,Y.Y)(),T=(0,u.Dv)(),Z=(0,h.fc)(),A=E.H&&!T&&Z,R=(0,M.g)(),I=A&&!R,[F,K]=(0,a.useState)("900"),[P,_]=(0,a.useState)(null),[B,H]=(0,a.useState)({}),[W,X]=(0,a.useState)({}),[G,ei]=(0,a.useState)("loading"),[es,el]=(0,a.useState)(null),[ec,eo]=(0,a.useState)(!1),[ed,ex]=(0,a.useState)("loading"),[eu,em]=(0,a.useState)(0),[eh,ep]=(0,a.useState)(320),eb=(0,a.useRef)(null),[ef,eg]=(0,a.useState)(!1),ev=(0,a.useRef)(null),[ek,ew]=(0,a.useState)(null),[ej,ey]=(0,a.useState)(!1),[ez,eN]=(0,a.useState)(null),[eC,eE]=(0,a.useState)(null),eM=(0,a.useRef)(null),eS=(0,a.useRef)(!1),eD=(0,a.useRef)(null),eL=(0,a.useRef)([]),[eT,eZ]=(0,a.useState)(0),eA=(0,a.useRef)(null),eR=(0,a.useMemo)(()=>e.filter(e=>{var t;return!!(t=e.homeClassId)&&j.includes(t)}).sort((e,t)=>e.number-t.number),[e]),{setItem:eI,hydrateItem:eF,getItem:eK,savingKeys:eP,dirtyKeys:e_,failedKeys:eB,recoveredKeys:eU,flushAll:eH}=(0,g.M)({storageKeyPrefix:"behavior-record",debounceMs:1e3,onSave:async(e,t)=>!!T||(await (0,p.X)("upsertBehaviorRecord",{studentId:e,sources:t.sources,draft:t.draft},i)).success,enableLocalStorage:!T}),eW=(0,a.useCallback)(e=>eK(e,V),[eK]),eX=(0,a.useRef)(eH);(0,a.useEffect)(()=>{eX.current=eH},[eH]),(0,a.useEffect)(()=>{let e=()=>{"hidden"===document.visibilityState&&eX.current()},t=()=>eX.current();return document.addEventListener("visibilitychange",e),window.addEventListener("pagehide",t),()=>{document.removeEventListener("visibilitychange",e),window.removeEventListener("pagehide",t)}},[]),(0,a.useEffect)(()=>
1{if(T){let e=!1;return ex("loading"),(async()=>{var t,n,r;let a=await (0,N.getGuestData)();if(!e){for(let e of null!==(t=null==a?void 0:a.behaviorRecords)&&void 0!==t?t:[])eU.has(e.studentId)||eF(e.studentId,{sources:null!==(n=e.sources)&&void 0!==n?n:[],draft:null!==(r=e.draft)&&void 0!==r?r:""});ex("loaded")}})(),()=>{e=!0}}let e=!1;return ex("loading"),(async()=>{let t=await (0,p.X)("getBehaviorRecords",{},i);if(!e){if(!t.success||!t.data){ex("error");return}for(let e of t.data)eU.has(e.studentId)||eF(e.studentId,{sources:e.sources,draft:e.draft});ex("loaded")}})(),()=>{e=!0}},[i,eF,eU,eu,T]),(0,a.useEffect)(()=>{if(T){let e=!1;return ei("loading"),(async()=>{var t,n,r;let a=await (0,N.getGuestData)();if(e)return;let i={};for(let e of null!==(t=null==a?void 0:a.attendanceRecords)&&void 0!==t?t:[])(null!==(r=i[n=e.studentId])&&void 0!==r?r:i[n]=[]).push({type:e.type});X(i),ei("loaded")})(),()=>{e=!0}}let e=!1;return ei("loading"),(async()=>{let{start:t,end:n}=function(){let e=new Date,t=e.getFullYear(),n=2>e.getMonth()?t-1:t,r=new Date(n,2,1),a=new Date(n+1,2,0);return{start:ee(r),end:ee(a)}}(),r=await (0,p.X)("getAttendanceRecords",{startDate:t,endDate:n,take:5e3},i);if(e)return;let a=r.data;if(r.success&&a&&a.length<5e3){let e={};for(let t of a){var s,l;(null!==(l=e[s=t.studentId])&&void 0!==l?l:e[s]=[]).push({type:t.type})}X(e),ei("loaded")}else ei("error")})(),()=>{e=!0}},[i,T]);let eG=(0,a.useCallback)(async()=>{if(T){el(5);return}try{let e=await fetch("/api/credits");if(e.ok){let t=await e.json();el(t.balance)}}catch(e){console.error("Failed to fetch credits:",e)}},[T]);(0,a.useEffect)(()=>{eG()},[eG]);let eO=eR.filter(e=>eW(e.id).draft.trim().length>0).length,eY=Number(F),eq=(0,a.useCallback)(t=>{let n=e.find(e=>e.id===t),r=null==n?void 0:n.lifeRecordAnalysis,a=r&&"object"==typeof r?r.behaviorKeywords:void 0;return Array.isArray(a)?a.filter(e=>"string"==typeof e).map(e=>$(e)).filter(e=>e.trim().length>0):[]},[e]),eV=(0,a.useMemo)(()=>eR.some(e=>eq(e.id).length>0),[eR,eq]),eJ=(0,a.useCallback)((e,t)=>{let n=eW(e);return 0===t?J(n):n.draft},[eW]),eQ=(0,a.useCallback)((e,t,n)=>{eI(e,e=>{let r=null!=e?e:V;return 0===t?{...r,sources:Q(n)}:{...r,draft:n}})},[eI]),e$=(0,a.useCallback)(()=>{let e={};eR.forEach(t=>{e[t.id]=eW(t.id)}),eL.current.push(e),eL.current.length>20&&eL.current.shift(),eZ(eL.current.length)},[eR,eW]),e0=(0,a.useCallback)((e,t,n)=>{eJ(e,t)!==n&&(eA.current&&clearTimeout(eA.current),eA.current=setTimeout(()=>{e$()},500)),eQ(e,t,n)},[eJ,eQ,e$]),e1=(0,a.useCallback)(()=>{eA.current&&(clearTimeout(eA.current),eA.current=null);let e=eL.current.pop();eZ(eL.current.length),e&&Object.entries(e).forEach(e=>{let[t,n]=e;return eI(t,n)})},[eI]),e5=(0,a.useCallback)(async()=>{if(!ek)return;let e=Math.min(ek.start.row,ek.end.row),t=Math.max(ek.start.row,ek.end.row),n=Math.min(ek.start.col,ek.end.col),r=Math.max(ek.start.col,ek.end.col),a=[];for(let i=e;i<=t;i++){let e=eR[i];if(!e)continue;let t=[];for(let a=n;a<=r;a++)t.push((0,m.vB)(eJ(e.id,a)));a.push(t.join("	"))}try{await navigator.clipboard.writeText(a.join("\r\n"))}catch(e){console.error("Failed to copy",e)}},[ek,eR,eJ]),e2=(0,a.useCallback)((e,t)=>{let n=null!=t?t:ek?{row:Math.min(ek.start.row,ek.end.row),col:Math.min(ek.start.col,ek.end.col)}:null;if(!n)return;let r=(0,m.R3)(e);if(0===r.length)return;let a=!!t;if(a&&1===r.length&&1===r[0].length)return;e$(),a&&r.length>1&&!e.includes("	")&&(r=[[r.map(e=>e[0]).join("\n")]]);let i=r.length,s=t||null===ek||ek.start.row===ek.end.row?i:Math.abs(ek.end.row-ek.start.row)+1;for(let e=0;e<s;e++){let t=eR[n.row+e];if(!t)break;let a=r[e%i];a&&a.forEach((e,r)=>{let a=n.col+r;a>1||eQ(t.id,a,null!=e?e:"")})}},[ek,eR,e$,eQ]),e4=(0,a.useCallback)(()=>{if(!ek)return;e$();let e=Math.min(ek.start.row,ek.end.row),t=Math.max(ek.start.row,ek.end.row),n=Math.min(ek.start.col,ek.end.col),r=Math.max(ek.start.col,ek.end.col),a=0;for(let i=e;i<=t;i++){let e=eR[i];if(e)for(let t=n;t<=r;t++)eJ(e.id,t)&&a++,eQ(e.id,t,"")}a>0&&y(1===a?"칸을 비웠습니다.":"".concat(a,"개 칸을 비웠습니다."),"info",{label:"실행 취소",onClick:e1})}
1,[ek,eR,e$,eQ,eJ,y,e1]),e3=(e,t,n)=>{var r,a;let i=eM.current;i&&i.row===t&&i.col===n||((null===(a=e.target)||void 0===a?void 0:null===(r=a.dataset)||void 0===r?void 0:r.gridEditor)!=="true"&&e.preventDefault(),i&&ts(),tr(),ey(!0),eN({row:t,col:n}),ew({start:{row:t,col:n},end:{row:t,col:n}}))},e6=(e,t)=>{if(ej&&ez){if(ez.row!==e||ez.col!==t){var n;null===(n=window.getSelection())||void 0===n||n.removeAllRanges()}ew({start:ez,end:{row:e,col:t}})}},e9=(0,a.useCallback)(()=>{ey(!1),eN(null)},[]);(0,a.useEffect)(()=>(window.addEventListener("mouseup",e9),()=>window.removeEventListener("mouseup",e9)),[e9]);let e8=(e,t)=>{if(!ek)return!1;let n=Math.min(ek.start.row,ek.end.row),r=Math.max(ek.start.row,ek.end.row),a=Math.min(ek.start.col,ek.end.col),i=Math.max(ek.start.col,ek.end.col);return e>=n&&e<=r&&t>=a&&t<=i},e7=(e,t)=>{var n;return 1===t&&(null===(n=eR[e])||void 0===n?void 0:n.id)===P},te=(()=>{if(!ek)return null;let{start:e,end:t}=ek;return e.row!==t.row||e.col!==t.col||!eR[e.row]||e7(e.row,e.col)?null:e})(),tt=(e,t)=>(null==te?void 0:te.row)===e&&(null==te?void 0:te.col)===t,tn=(e,t)=>(null==eC?void 0:eC.row)===e&&(null==eC?void 0:eC.col)===t,tr=()=>{eS.current=!0};(0,a.useEffect)(()=>{var e;if(!eS.current||(eS.current=!1,!te))return;let t=null===(e=eD.current)||void 0===e?void 0:e.querySelector('[data-grid-editor="true"]');if(!t||(t!==document.activeElement&&t.focus({preventScroll:!0}),eM.current))return;let n=t.value.length;t.setSelectionRange(n,n)});let ta=e=>{var t,n;null===(n=eD.current)||void 0===n||null===(t=n.querySelector('[data-grid-row="'.concat(e,'"]')))||void 0===t||t.scrollIntoView({block:"nearest"})},ti=(e,t)=>{let n=Math.max(0,Math.min(eR.length-1,e)),r=Math.max(0,Math.min(1,t));ew({start:{row:n,col:r},end:{row:n,col:r}}),tr(),ta(n)},ts=()=>{eM.current=null,eE(null)},tl=(e,t)=>{var n,r;((null===(n=eM.current)||void 0===n?void 0:n.row)!==e||(null===(r=eM.current)||void 0===r?void 0:r.col)!==t)&&(!eR[e]||e7(e,t)||(ew({start:{row:e,col:t},end:{row:e,col:t}}),eM.current={row:e,col:t},eE({row:e,col:t}),tr()))},tc=(e,t,n)=>{if(eM.current)return;if(e.detail>=2){tl(t,n);return}let r=e.currentTarget,a=r.value.length;r.setSelectionRange(a,a)},to=(e,t)=>{eM.current||tl(e,t)},td=e=>{tp(e.target),ts()},tx=(e,t)=>{if(!ek)return!1;let n=ek.start.row===ek.end.row&&ek.start.col===ek.end.col;if(n&&("Enter"===e.key||"F2"===e.key))return e.preventDefault(),tl(ek.start.row,ek.start.col),!0;if("ArrowUp"===e.key||"ArrowDown"===e.key||"ArrowLeft"===e.key||"ArrowRight"===e.key){e.preventDefault();let{row:t,col:n}=ek.end;return"ArrowUp"===e.key?t-=1:"ArrowDown"===e.key?t+=1:"ArrowLeft"===e.key?n-=1:n+=1,t=Math.max(0,Math.min(eR.length-1,t)),n=Math.max(0,Math.min(1,n)),e.shiftKey?(ew({start:ek.start,end:{row:t,col:n}}),ta(t)):ti(t,n),!0}if("Tab"===e.key){e.preventDefault();let{row:t,col:n}=ek.end;return ti(t,n+(e.shiftKey?-1:1)),!0}return"Delete"===e.key||"Backspace"===e.key?(e.preventDefault(),e4(),!0):(e.metaKey||e.ctrlKey)&&("c"===e.key||"C"===e.key)?(e.preventDefault(),e5(),!0):!!(!(null==t?void 0:t.yieldTyping)&&n&&(0,q.E$)(e))&&(e.preventDefault(),tl(ek.start.row,ek.start.col),!0)},tu=(0,a.useRef)(tx);tu.current=tx;
1let tm=(e,t,n)=>{var r,a,i,s;if(e.nativeEvent.isComposing)return;if((e.metaKey||e.ctrlKey)&&("z"===e.key||"Z"===e.key)){e.preventDefault(),e.nativeEvent.stopImmediatePropagation(),e1();return}if(!tn(t,n)||(null===(r=eM.current)||void 0===r?void 0:r.col)!==n||(null===(a=eM.current)||void 0===a?void 0:a.row)!==t){tx(e,{yieldTyping:!0})&&e.nativeEvent.stopImmediatePropagation();return}if("Enter"===e.key){if(e.preventDefault(),(0,q.xQ)({key:e.key,altKey:e.altKey,shiftKey:e.shiftKey,multiline:!0})){(0,q.yl)(e.currentTarget);return}e.nativeEvent.stopImmediatePropagation(),ts(),ti(t+1,n);return}if("Escape"===e.key){e.preventDefault(),e.nativeEvent.stopImmediatePropagation(),ts(),ti(t,n);return}if("Tab"===e.key){e.preventDefault(),e.nativeEvent.stopImmediatePropagation(),ts(),ti(t,n+(e.shiftKey?-1:1));return}let l=(0,q.Ud)({key:e.key,value:e.currentTarget.value,selectionStart:null!==(i=e.currentTarget.selectionStart)&&void 0!==i?i:0,selectionEnd:null!==(s=e.currentTarget.selectionEnd)&&void 0!==s?s:0,shiftKey:e.shiftKey});l&&(e.preventDefault(),e.nativeEvent.stopImmediatePropagation(),ts(),ti(t+l.rowDelta,n+l.colDelta))};(0,a.useEffect)(()=>{let e=e=>{if((e.metaKey||e.ctrlKey)&&"z"===e.key){e.preventDefault(),e1();return}if(!ek||eM.current)return;let t=document.activeElement;t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement||t instanceof HTMLSelectElement||tu.current(e)},t=e=>{var t;if(!ek||eM.current)return;let n=document.activeElement;!(n instanceof HTMLElement&&"true"===n.dataset.gridEditor)&&n instanceof HTMLElement&&n.blur(),e.preventDefault(),e2((null===(t=e.clipboardData)||void 0===t?void 0:t.getData("text"))||"")};return window.addEventListener("keydown",e),window.addEventListener("paste",t),()=>{window.removeEventListener("keydown",e),window.removeEventListener("paste",t)}},[e5,e2,e4,e1,ek]),(0,a.useEffect)(()=>{if(!ef)return;let e=e=>{ev.current&&!ev.current.contains(e.target)&&eg(!1)},t=e=>{"Escape"===e.key&&eg(!1)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",t),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",t)}},[ef]),(0,a.useEffect)(()=>{try{let e=Number(window.localStorage.getItem(et));Number.isFinite(e)&&e>0&&ep(Math.max(160,Math.min(720,e)))}catch(e){}},[]),(0,a.useEffect)(()=>{let e=setTimeout(()=>{try{320===eh?window.localStorage.removeItem(et):window.localStorage.setItem(et,String(eh))}catch(e){}},300);return()=>clearTimeout(e)},[eh]),(0,a.useEffect)(()=>{let e=e=>{let t=eb.current;t&&ep(Math.max(160,Math.min(720,t.startWidth+(e.clientX-t.startX))))},t=()=>{eb.current=null};return window.addEventListener("mousemove",e),window.addEventListener("mouseup",t),()=>{window.removeEventListener("mousemove",e),window.removeEventListener("mouseup",t)}},[]);let th="54px",tp=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e){if(t){e.style.height=th;return}e.style.height="auto",e.style.height="".concat(e.scrollHeight,"px")}},tb=e=>tp(e.target),tf=async(e,t)=>{if(T){window.dispatchEvent(new CustomEvent("open-login-modal"));return}if((0,S.I)()){y(D.Ad,"info");return}if(P)return;let n=eW(e),r=J(n);if(!r.trim()){y("관찰 메모를 먼저 입력해 주세요.","warning");return}document.activeElement instanceof HTMLElement&&document.activeElement.blur();let a=function(e){var t;let n=e.memos.map(e=>e.trim()).filter(e=>e.length>0);e.includePerfectAttendance&&n.push("한 해 동안 결석\xb7지각\xb7조퇴\xb7결과가 없는 개근임");let r=(null!==(t=e.lastYearKeywords)&&void 0!==t?t:[]).map(e=>e.trim()).filter(e=>e.length>0);return r.length>0&&n.push("작년 행동특성 참고 키워드: ".concat(r.join(", "))),n}({memos:r.split("\n"),includePerfectAttendance:!1});_(e),H(t=>{if(!(e in t))return t;let n={...t};return delete n[e],n});try{let r=await (0,p.X)("generateBehaviorDraft",{studentId:e,studentName:t,sources:a,memos:n.sources,targetRange:F},i,{timeout:6e5});if(r.success&&r.data){let n=r.data;eI(e,e=>({...null!=e?e:V,draft:n.draft})),"number"==typeof n.remainingCredits&&el(n.remainingCredits),n.warning&&H(t=>({...t,[e]:n.warning})),y("".concat(t," 행동특성 초안을 생성했습니다."),"success")}else r.needCredit?eo(!0):y(r.error||"AI 생성 중 오류가 발생했습니다.","error")}catch(e){console.error("[행동특성] AI 생성 실패:",e),y("AI 생성 중 오류가 발생했습니다.","error")}finally{_(null)}},tg=(0,a.useCallback)((e,t)=>{if(0===e.length){y(t.none,"info");return}let n=e.filter(e=>!J(eW(e.id)).includes(e.line));if(0===n.length){y(t.already,"info");return}
1e$(),n.forEach(e=>{let{id:t,line:n}=e;eI(t,e=>{let t=null!=e?e:V,r=J(t);return r.includes(n)?t:{...t,sources:Q(r.trim()?"".concat(r,"\n").concat(n):n)}})}),y(t.done(n.length),"success")},[eW,e$,eI,y]),tv=(0,a.useCallback)(()=>{"loaded"===G&&tg(eR.filter(e=>{var t;return z(null!==(t=W[e.id])&&void 0!==t?t:[])}).map(e=>({id:e.id,line:en})),{none:"개근인 학생이 없습니다.",already:"개근인 학생의 관찰 메모에 이미 들어가 있습니다.",done:e=>"개근인 학생 ".concat(e,"명의 관찰 메모에 넣었습니다.")})},[G,eR,W,tg]),tk=(0,a.useCallback)(()=>{tg(eR.map(e=>({id:e.id,keywords:eq(e.id)})).filter(e=>e.keywords.length>0).map(e=>({id:e.id,line:"".concat(er).concat(e.keywords.join(", "))})),{none:"작년 행동특성 키워드가 있는 학생이 없습니다.",already:"해당 학생의 관찰 메모에 이미 들어가 있습니다.",done:e=>"학생 ".concat(e,"명의 관찰 메모에 작년 키워드를 넣었습니다.")})},[eR,eq,tg]),tw=(0,a.useCallback)(e=>{var t;return"loaded"!==G?null:z(null!==(t=W[e])&&void 0!==t?t:[])?en:null},[G,W]),tj=(0,a.useCallback)(e=>{let t=eq(e);return t.length>0?"".concat(er).concat(t.join(", ")):null},[eq]),ty=(0,a.useCallback)((e,t)=>{tg([{id:e,line:t}],{none:"넣을 내용이 없습니다.",already:"관찰 메모에 이미 들어가 있습니다.",done:()=>"관찰 메모에 넣었습니다."})},[tg]),tz=(0,a.useCallback)(async()=>{let e=await Promise.all([n.e(1425),n.e(6919)]).then(n.bind(n,2093)),t=eR.map(e=>{var t,n;return[null!==(t=e.grade)&&void 0!==t?t:"",null!==(n=e.classNum)&&void 0!==n?n:"",e.number,e.name,eW(e.id).draft]}),r=e.utils.aoa_to_sheet([["학년","반","번호","이름","초안"],...t]),a=e.utils.book_new();e.utils.book_append_sheet(a,r,"행동특성"),e.writeFile(a,"행동특성_".concat((0,m.RJ)(),".xlsx"))},[eR,eW]),tN=(e,t,n,a)=>{let{value:i,disabled:o,showBytes:d,warning:x}=a,u=eP.has(e),h=e_.has(e),p=d?(0,C.C)(i):0;return(0,r.jsx)("td",{"data-grid-row":t,onMouseDown:e=>e3(e,t,n),onDoubleClick:()=>tl(t,n),onMouseEnter:()=>e6(t,n),className:(0,m.cn)("p-0 border-r border-zinc-300 dark:border-white/5 border-b border-zinc-300 dark:border-white/10","hover:bg-black/5 dark:hover:bg-white/[0.02] focus-within:bg-black/5 dark:focus-within:bg-white/5","align-top transition-colors select-none",e8(t,n)&&"ring-1 ring-inset ring-blue-500 z-20",e8(t,n)&&!tn(t,n)&&"bg-blue-500/10 dark:bg-blue-500/20"),children:(0,r.jsxs)("div",{className:(0,m.cn)("relative group/draft h-full min-h-[54px]",o&&"cursor-not-allowed"),children:[(0,r.jsxs)("div",{className:(0,m.cn)("absolute inset-0 px-2 pt-1.5 text-sm text-black dark:text-gray-300 pointer-events-none select-none flex flex-col transition-opacity",tt(t,n)&&"opacity-0 invisible"),children:[(0,r.jsx)("div",{className:"w-full whitespace-nowrap overflow-hidden",style:{textOverflow:"clip"},children:i.split("\n")[0]}),(i.includes("\n")||i.length>30)&&(0,r.jsx)("div",{className:"text-black dark:text-white text-[10px] leading-none mt-1 font-medium opacity-70",children:"... 더 보기"})]}),tt(t,n)&&(0,r.jsx)("textarea",{"data-grid-editor":"true",value:i,onChange:r=>{to(t,n),e0(e,n,r.target.value),tp(r.target)},onBeforeInput:()=>to(t,n),onCompositionStart:()=>to(t,n),onMouseUp:e=>tc(e,t,n),onFocus:tb,onBlur:td,onKeyDown:e=>tm(e,t,n),onPaste:e=>{eM.current||(e.preventDefault(),e.nativeEvent.stopPropagation(),e2(e.clipboardData.getData("text"),{row:t,col:n}))},style:{height:th},className:(0,m.cn)("w-full bg-transparent border border-transparent rounded-none px-2 pt-1.5 pb-6 text-sm leading-[1.6]","text-black dark:text-gray-300 focus:outline-none focus:ring-0 resize-none overflow-hidden block",tn(t,n)?"caret-black dark:caret-white":"caret-transparent selection:bg-transparent")}),(0,r.jsx)("div",{className:"absolute top-2 right-2 opacity-0 group-hover/draft:opacity-100 transition-opacity pointer-events-none",children:u?(0,r.jsx)(s.Z,{size:12,className:"animate-spin text-blue-500"}):h?(0,r.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-amber-500",title:"저장 대기 중"}):i?(0,r.jsx)(l.Z,{size:12,className:"text-green-500 opacity-40"}):null}),d&&(0,r.jsxs)("div",{className:"absolute bottom-1 right-2 flex items-center gap-1 pointer-events-none opacity-50 group-hover/draft:opacity-100",children:[x&&(0,r.jsx)(c.Z,{size:10,
1className:"text-amber-500"}),(0,r.jsxs)("span",{className:(0,m.cn)("text-[9px] font-mono",p>eY?"text-red-400":"text-green-500"),children:[p," / ",eY]})]})]})})};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"md:hidden block h-full",children:(0,r.jsx)(U,{roster:eR,isStudentsLoaded:t,getMemo:e=>J(eW(e)),getDraft:e=>eW(e).draft,setMemo:(e,t)=>e0(e,0,t),setDraft:(e,t)=>e0(e,1,t),savingKeys:eP,dirtyKeys:e_,failedKeys:eB,onRetryFailed:()=>{eH()},generatingId:P,onGenerate:tf,generationWarnings:B,targetRange:F,onTargetRangeChange:K,byteTarget:eY,doneCount:eO,recordsStatus:ed,onRetryRecords:()=>em(e=>e+1),attendanceStatus:G,perfectAttendanceLineFor:tw,lastYearLineFor:tj,appendMemoLine:ty,onExcelDownload:tz,showAiCreditControls:I,creditBalance:es,onOpenCreditModal:()=>eo(!0),onUndo:e1,canUndo:eT>0})}),(0,r.jsxs)("div",{className:"md:flex hidden h-full flex-col p-6 gap-5 overflow-hidden",children:[(0,r.jsxs)("header",{className:"shrink-0 flex flex-col gap-3 lg:flex-row lg:items-end lg:justify-between",children:[(0,r.jsxs)("div",{className:"ml-2",children:[(0,r.jsx)("h1",{className:"text-2xl font-bold text-zinc-900 dark:text-white",children:"행동특성 및 종합의견"}),"loading"===ed?(0,r.jsxs)("p",{className:"flex items-center gap-1.5 text-sm text-zinc-500 dark:text-[#888] mt-1",children:[(0,r.jsx)(s.Z,{size:13,className:"animate-spin"}),"완료 현황을 불러오는 중..."]}):"error"===ed?(0,r.jsxs)("p",{className:"flex items-center gap-2 text-sm text-red-500 mt-1",children:[(0,r.jsx)(c.Z,{size:13,className:"shrink-0"}),"완료 현황을 불러오지 못했습니다.",(0,r.jsx)("button",{type:"button",onClick:()=>em(e=>e+1),className:"underline underline-offset-2 hover:text-red-600",children:"다시 시도"})]}):(0,r.jsxs)("p",{className:"text-sm text-zinc-500 dark:text-[#888] mt-1",children:["관찰 메모를 남기고 초안을 만들어 보세요. 완료 ",eO," / 전체 ",eR.length]})]}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-3 shrink-0",children:[(0,r.jsxs)("button",{type:"button",onClick:tz,disabled:0===eR.length,className:"flex items-center gap-1.5 h-[38px] px-3 bg-[#f2f2ec] dark:bg-[#1A1A1A] border border-zinc-200 dark:border-white/5 text-zinc-600 dark:text-zinc-400 hover:text-black dark:hover:text-white hover:bg-[#EEEEE8] dark:hover:bg-[#222] rounded-lg transition text-sm font-medium whitespace-nowrap shrink-0 disabled:opacity-50 disabled:cursor-not-allowed",children:[(0,r.jsx)(o.Z,{size:16}),(0,r.jsx)("span",{children:"엑셀"})]}),I&&(0,r.jsxs)("button",{type:"button",onClick:()=>eo(!0),className:"flex items-center gap-2 h-[38px] pl-3 pr-3.5 bg-[#f2f2ec] dark:bg-[#18181b] border border-gray-200 dark:border-white/10 text-gray-600 dark:text-zinc-400 hover:text-black dark:hover:text-white hover:bg-[#EEEEE8] rounded-lg transition text-sm font-medium shrink-0",children:[(0,r.jsx)(v.O,{size:16,className:"text-black dark:text-white"}),"크레딧 ",null!=es?es:"-"]})]})]}),"error"===G&&(0,r.jsxs)("p",{className:"shrink-0 flex items-center gap-1.5 text-xs text-zinc-400 dark:text-zinc-500",children:[(0,r.jsx)(c.Z,{size:12,className:"shrink-0"}),"출결 기록을 불러오지 못해 개근 여부를 확인할 수 없습니다."]}),(0,r.jsx)("div",{ref:eD,className:"flex-1 overflow-y-auto custom-scrollbar",children:t||0!==eR.length?0===eR.length?(0,r.jsx)("div",{className:"h-full flex items-center justify-center p-8",children:(0,r.jsx)(O.Z,{size:"lg",title:"담임 학급 학생이 없습니다",description:"설정 > 학생 명단에서 담임 학급을 먼저 지정해 주세요.",action:(0,r.jsx)("button",{onClick:()=>L("student-list"),className:"px-6 py-2.5 bg-zinc-900 hover:bg-black dark:bg-white dark:hover:bg-zinc-100 text-white dark:text-zinc-900 rounded-xl text-sm font-semibold transition-all shadow-sm active:scale-95 cursor-pointer",children:"담임 학급 설정하기"})})}):(0,r.jsxs)("table",{className:"w-full border-collapse table-fixed",children:[(0,r.jsxs)("colgroup",{children:[(0,r.jsx)("col",{style:{width:48}}),(0,r.jsx)("col",{style:{width:104}}),(0,r.jsx)("col",{style:{width:eh}}),(0,r.jsx)("col",{}),(0,r.jsx)("col",{style:{width:96}})]}),(0,r.jsx)("thead",{className:"sticky top-0 z-30 bg-white dark:bg-[#0D0D0D]",children:(0,r.jsxs)("tr",{className:"border-b border-t border-zinc-200 dark:border-white/10",children:[(0,r.jsx)("th",{className:"text-center text-xs font-medium text-zinc-500 dark:text-[#666] py-3 px-2",children:"번호"}),(0,r.jsx)("th",{className:"text-center text-xs font-medium text-zinc-500 dark:text-[#666] py-3 px-2",children:"이름"}),(0,r.jsxs)("th",{className:"relative text-center text-xs font-medium text-zinc-500 dark:text-[#666] py-3 px-2",children:[(0,r.jsxs)("div",{ref:ev,className:"inline-flex items-center gap-1",children:[(0,r.jsx)("span",{children:"관찰 메모"}),(0,r.jsx)("button",{type:"button",onClick:()=>eg(e=>!e),"aria-haspopup":"menu","aria-expanded":ef,"aria-label":"관찰 메모 채워 넣기",title:"여러 학생의 관찰 메모를 한꺼번에 채워 넣습니다",className:(0,m.cn)("flex items-center justify-center w-4 h-4 rounded transition-colors",ef?"text-zinc-800 dark:text-white bg-zinc-200 dark:bg-white/10":"text-zinc-400 hover:text-zinc-800 dark:hover:text-white hover:bg-zinc-200/70 dark:hover:bg-white/10"),children:(0,r.jsx)(d.Z,{size:12})}),ef&&(0,r.jsxs)("div",{role:"menu",className:"absolute left-1/2 -translate-x-1/2 top-full mt-1 z-50 w-[248px] py-1 rounded-lg border border-zinc-200 dark:border-white/10 bg-white dark:bg-[#1A1A1A] shadow-lg",children:[(0,r.jsx)(ea,{onClick:()=>{eg(!1),tv()},label:"개근 문구 넣기",disabled:"loaded"!==G,description:"loading"===G?"출결 기록을 불러오는 중입니다.":"error"===G?"출결 기록을 불러오지 못해 개근 여부를 확인할 수 없습니다.":'개근인 학생에게 "'.concat(en,'"을 넣습니다.')}),(0,r.jsx)(ea,{onClick:()=>{eg(!1),tk()}
1,label:"작년 행동특성 가져오기",disabled:!eV,description:eV?"작년 생기부에서 추출된 행동특성 키워드를 추가합니다.":"작년 생기부에서 추출된 행동특성 키워드가 있는 학생이 없습니다. 학생 관리에서 작년 생기부를 올리면 쓸 수 있습니다."}),(0,r.jsxs)("p",{className:"flex items-start gap-1.5 px-3 pt-1.5 pb-1 text-[11px] leading-snug text-zinc-400 dark:text-zinc-500 border-t border-zinc-100 dark:border-white/5 mt-1 text-left font-normal",children:[(0,r.jsx)(x.Z,{size:12,className:"shrink-0 mt-[1px]"}),(0,r.jsx)("span",{children:"이미 적어 둔 메모는 지우지 않고 아래에 한 줄로 붙습니다."})]})]})]}),(0,r.jsx)("span",{role:"separator","aria-label":"관찰 메모 열 너비 조절",onMouseDown:e=>{e.preventDefault(),e.stopPropagation(),eb.current={startX:e.clientX,startWidth:eh}},onDoubleClick:()=>ep(320),title:"끌어서 너비 조절 (두 번 클릭하면 기본값)",className:"absolute top-0 right-0 h-full w-2 translate-x-1/2 cursor-col-resize hover:bg-toss-blue/30 active:bg-toss-blue/50 transition-colors"})]}),(0,r.jsx)("th",{className:"text-center text-xs font-medium text-zinc-500 dark:text-[#666] py-3 px-2",children:(0,r.jsxs)("div",{className:"flex items-center justify-center gap-2",children:[(0,r.jsx)("span",{children:"초안"}),(0,r.jsxs)("div",{className:"relative inline-flex items-center text-blue-400",children:[(0,r.jsxs)("select",{value:F,onChange:e=>K(e.target.value),"aria-label":"초안 분량 선택",className:"appearance-none bg-transparent border-none pr-3.5 py-1 text-[11px] font-bold text-blue-400 focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 cursor-pointer text-center",children:[(0,r.jsx)("option",{value:"1500",children:"1500byte"}),(0,r.jsx)("option",{value:"900",children:"900byte"})]}),(0,r.jsx)(d.Z,{size:10,className:"absolute right-0 top-1/2 -translate-y-1/2 pointer-events-none opacity-60"})]})]})}),(0,r.jsx)("th",{className:"text-center text-xs font-medium text-zinc-500 dark:text-[#666] py-3 px-2",children:"작성"})]})}),(0,r.jsx)("tbody",{children:eR.map((e,t)=>{let n=eW(e.id),a=J(n),i=!a.trim(),s=P===e.id;return(0,r.jsxs)("tr",{className:"border-b border-zinc-200 dark:border-white/5",children:[(0,r.jsx)("td",{className:"py-3 px-2 text-center text-sm text-zinc-500 dark:text-[#888] border-r border-zinc-200 dark:border-white/5 align-middle",children:e.number}),(0,r.jsx)("td",{className:"py-2.5 px-2 border-r border-zinc-200 dark:border-white/5 align-middle",children:(0,r.jsx)("span",{className:"block text-center text-sm text-zinc-900 dark:text-white font-medium truncate",children:e.name})}),tN(e.id,t,0,{value:a}),tN(e.id,t,1,{value:n.draft,disabled:s,showBytes:!0,warning:B[e.id]}),(0,r.jsx)("td",{className:"p-0 text-center border-b border-zinc-200 dark:border-white/10 align-middle",children:(0,r.jsx)("div",{className:"py-1.5 px-1 flex items-center justify-center",children:(0,r.jsx)("button",{type:"button",onClick:()=>tf(e.id,e.name),disabled:i||!!P,title:i?"관찰 메모를 먼저 입력해 주세요.":void 0,className:"px-3 py-1 bg-zinc-100 hover:bg-zinc-200 dark:bg-zinc-200 dark:hover:bg-zinc-300 text-black border border-zinc-200 dark:border-zinc-300 rounded-full transition text-[11px] font-medium whitespace-nowrap shadow-sm disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-1.5",children:s?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(k.W,{size:12,className:"text-zinc-600 dark:text-zinc-400"}),(0,r.jsx)("span",{children:"생성 중"})]}):(0,r.jsx)("span",{children:"AI 작성"})})})})]},e.id)})})]}):(0,r.jsx)("div",{className:"h-full flex flex-col items-center justify-center text-zinc-400 dark:text-[#666]",children:(0,r.jsx)("p",{className:"text-sm",children:"학생 데이터를 불러오는 중..."})})})]}),I&&(0,r.jsx)(w.Z,{isOpen:ec,onClose:()=>eo(!1),currentBalance:null!=es?es:0,onChargeComplete:e=>{el(e),eo(!1)}})]})}},9235:function(e,t,n){n.d(t,{C:function(){return r}});function r(e){if(!e)return 0;let t=e.replace(/\r?\n/g,"\r\n"),n=0;for(let e=0;e<t.length;e++)n+=t.charCodeAt(e)>255?2:1;let r=t.length;return(n-r)*2+r}},82374:function(e,t,n){n.d(t,{H:function(){return r}});let r=!0},92804:function(e,t,n){n.d(t,{Ge:function(){return r}});function r(e,t,n){return!function(e){let t=e.trim().slice(-1);if(!t)return!1;let n=t.charCodeAt(0);return n>=44032&&n<=55203?(n-44032)%28!=0:t>="0"&&t<="9"&&["0","1","3","6","7","8"].includes(t)}(e)?n:t}},25450:function(e,t,n){n.d(t,{Fk:function(){return a}});var r=n(93448);function a(e){for(var t=arguments.length,n=Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];return(0,r.cn)("inline-flex items-center justify-center h-8 px-3 rounded-full text-[13px] transition active:scale-[0.96]",e?"bg-white dark:bg-[#1C1C1E] text-zinc-900 dark:text-zinc-100 font-semibold border border-zinc-200/90 dark:border-white/[0.12] shadow-[0_1px_2px_rgba(0,0,0,0.04)]":"bg-zinc-100/80 dark:bg-zinc-800/60 text-zinc-500 dark:text-zinc-400 font-medium border border-transparent",...n)}}}]);

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.