PageSourceSearch

https://seq.kr/assets/DdayCalc-D_vD7tXR.js

js seq.kr collected 2026-10-06 14:03:19 UTC 18,516 bytes, 3 lines download raw bytes

1import{r as l,j as r}from"./index-1rUvamFF.js";import{D as J}from"./presets-HWSDk39l.js";function w(n){const o=n.getFullYear(),i=String(n.getMonth()+1).padStart(2,"0"),c=String(n.getDate()).padStart(2,"0");return`${o}-${i}-${c}`}function H(n,o){const i=new Date(n);return i.setDate(i.getDate()+o),i}function X(n,o){let i=(o.getFullYear()-n.getFullYear())*12+(o.getMonth()-n.getMonth());const c=new Date(n);c.setMonth(c.getMonth()+i),c>o&&(i--,c.setMonth(c.getMonth()-1));const b=Math.floor((o.getTime()-c.getTime())/(1e3*60*60*24));return{months:Math.abs(i),days:Math.abs(b)}}const Z=[{label:"+100일",days:100},{label:"+200일",days:200},{label:"+365일",days:365},{label:"+500일",days:500},{label:"+1000일",days:1e3}],_=[{label:"100일",days:100},{label:"200일",days:200},{label:"300일",days:300},{label:"1주년",days:365},{label:"500일",days:500},{label:"2주년",days:730},{label:"1000일",days:1e3}];function q(n,o,i){const b="\uFEFF"+[o.join(","),...i.map(C=>C.map(f=>`"${f.replace(/"/g,'""')}"`).join(","))].join(`
2`),d=new Blob([b],{type:"text/csv;charset=utf-8;"}),g=URL.createObjectURL(d),j=document.createElement("a");j.href=g,j.download=n,j.click(),URL.revokeObjectURL(g)}const T=["일","월","화","수","목","금","토"];function se(){const n=l.useMemo(()=>{const e=new Date;return e.setHours(0,0,0,0),e},[]),[o,i]=l.useState(w(n)),[c,b]=l.useState(""),[d,g]=l.useState(!1),[j,C]=l.useState(!1),[f,M]=l.useState([]),[P,L]=l.useState(""),[v,F]=l.useState(!1),[W,E]=l.useState(!1);l.useEffect(()=>{const e=new URLSearchParams(window.location.search),s=e.get("start"),t=e.get("end"),y=e.get("include"),p=e.get("recurring");s&&i(s),t&&b(t),y==="1"&&g(!0),p==="1"&&F(!0)},[]);const U=l.useCallback(()=>{const e=new URLSearchParams;return o&&e.set("start",o),c&&e.set("end",c),d&&e.set("include","1"),v&&e.set("recurring","1"),`${window.location.origin+window.location.pathname}?${e.toString()}`},[o,c,d,v]),z=l.useCallback(()=>{const e=U();navigator.clipboard.writeText(e).then(()=>{E(!0),setTimeout(()=>E(!1),2e3)})},[U]);function Y(){const e=parseInt(P);isNaN(e)||e<=0||[..._,...f].map(t=>t.days).includes(e)||(M(t=>[...t,{label:`${e.toLocaleString()}일`,days:e}]),L(""))}function O(e){M(s=>s.filter(t=>t.days!==e))}function K(e){i(w(new Date)),b(e.getDate())}const x=l.useMemo(()=>{const e=new Date(o+"T00:00:00");return isNaN(e.getTime())?null:e},[o]),u=l.useMemo(()=>{const e=new Date(c+"T00:00:00");return isNaN(e.getTime())?null:e},[c]),a=l.useMemo(()=>{if(!x||!u)return null;const e=u.getTime()-x.getTime();let s=Math.floor(e/(1e3*60*60*24));d&&(s+=1);const t=Math.abs(s),y=Math.floor(t/7),p=t%7,{months:h,days:N}=X(s>=0?x:u,s>=0?u:x),S=t*24,V=S*60,A=s>0,G=s<0,B=s===0;let R="";return B?R="D-Day":A?R=`D-${t}`:R=`D+${t}`,{diffDays:s,absDays:t,weeks:y,remainingDays:p,months:h,mDays:N,totalHours:S,totalMinutes:V,ddayText:R,isFuture:A,isPast:G,isToday:B}},[x,u,d]),$=l.useMemo(()=>{if(!v||!u)return null;const e=new Date().getFullYear(),s=u.getMonth(),t=u.getDate(),y=u.getFullYear(),p=[];for(let h=y;h<=e+5;h++){const N=new Date(h,s,t);if(N.getMonth()!==s)continue;const S=h-y;p.push({year:h,date:N,dayOfWeek:T[N.getDay()],yearCount:S})}return p},[v,u]);function Q(e){if(!x)return;const s=H(x,e);b(w(s))}const k=l.useMemo(()=>[..._,...f].sort((e,s)=>e.days-s.days),[f]),D=l.useMemo(()=>x?k.map(e=>{const s=H(x,d?e.days-1:e.days),t=s<n,y=f.some(p=>p.days===e.days);return{...e,date:s,dateStr:w(s),isPast:t,isCustom:y}}):[],[x,d,n,k,f]),m={backgroundColor:"var(--color-bg-card)",borderRadius:"var(--radius-lg)",boxShadow:"var(--shadow-card)",border:"1px solid var(--color-border)"},I=a?a.isToday?"var(--color-primary-500)":a.isFuture?"#3b82f6":"#ef4444":"var(--color-text-tertiary)";return r.jsxs("div",{className:"flex flex-col gap-5",children:[r.jsxs("div",{className:"p-4 flex flex-col gap-3",style:{backgroundColor:"var(--color-bg-card)",borderRadius:"var(--radius-xl)",boxShadow:"var(--shadow-card)"},children:[r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx("span",{className:"text-sm font-bold",style:{color:"var(--color-text)"},children:"빠른 시작"}),r.jsx("span",{className:"text-xs",style:{color:"var(--color-text-tertiary)"},children:"원클릭으로 바로 시작하세요"})]}),r.jsx("div",{className:"flex flex-wrap gap-2",children:J.map(e=>r.jsx("button",{onClick:()=>K(e),className:"px-3 py-2 text-sm font-medium transition-all hover:scale-[1.02] active:scale-95",style:{backgroundColor:"var(--color-bg)",border:"1.5px solid var(--color-border)",borderRadius:"var(--radius-lg)",color:"var(--color-text)",cursor:"pointer"},title:e.description,children:e.label},e.id))})]}),r.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[r.jsxs("div",{className:"flex flex-col gap-3 p-5",style:m,children:[r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{className:"text-sm font-semibold",style:{color:"var(--color-text)"},children:"시작일"}),r.jsx("button",{onClick:()=>i(w(new Date)),className:"px-3 py-1.5 text-xs font-medium transition-all hover:opacity-80",style:{backgroundColor:"var(--color-primary-500)",color:"#fff",borderRadius:"var(--radius-sm)"},children:"오늘"})]}),r.jsx("input",{type:"date",value:o,onChange:e=>i(e.target.value),className:"w-full px-4 py-3.5 text-base font-medium outline-none cursor-pointer",style:{backgroundColor:"var(--color-bg)",color:"var(--color-text)",borderRadius:"var(--radius-md)",border:"2px s
2olid var(--color-border)"}})]}),r.jsxs("div",{className:"flex flex-col gap-3 p-5",style:m,children:[r.jsx("span",{className:"text-sm font-semibold",style:{color:"var(--color-text)"},children:"종료일"}),r.jsx("input",{type:"date",value:c,onChange:e=>b(e.target.value),className:"w-full px-4 py-3.5 text-base font-medium outline-none cursor-pointer",style:{backgroundColor:"var(--color-bg)",color:"var(--color-text)",borderRadius:"var(--radius-md)",border:"2px solid var(--color-border)"}})]})]}),r.jsxs("div",{className:"flex flex-col gap-4 p-5",style:m,children:[r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{className:"text-sm font-medium",style:{color:"var(--color-text)"},children:"당일 포함 계산"}),r.jsx("button",{onClick:()=>g(!d),className:"relative shrink-0 transition-colors",style:{width:"52px",height:"28px",backgroundColor:d?"var(--color-primary-500)":"var(--color-border)",borderRadius:"14px",transition:"background-color 0.2s ease"},children:r.jsx("div",{className:"absolute top-1 transition-all",style:{width:"20px",height:"20px",backgroundColor:"#fff",borderRadius:"10px",left:d?"28px":"4px",boxShadow:"0 2px 4px rgba(0,0,0,0.2)",transition:"left 0.2s ease"}})})]}),r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsxs("div",{className:"flex flex-col",children:[r.jsx("span",{className:"text-sm font-medium",style:{color:"var(--color-text)"},children:"매년 반복"}),r.jsx("span",{className:"text-xs",style:{color:"var(--color-text-tertiary)"},children:"종료일 기준으로 매년 요일과 경과 연수를 계산합니다"})]}),r.jsx("button",{onClick:()=>F(!v),className:"relative shrink-0 transition-colors",style:{width:"52px",height:"28px",backgroundColor:v?"var(--color-primary-500)":"var(--color-border)",borderRadius:"14px",transition:"background-color 0.2s ease"},children:r.jsx("div",{className:"absolute top-1 transition-all",style:{width:"20px",height:"20px",backgroundColor:"#fff",borderRadius:"10px",left:v?"28px":"4px",boxShadow:"0 2px 4px rgba(0,0,0,0.2)",transition:"left 0.2s ease"}})})]}),r.jsx("div",{className:"flex flex-wrap gap-2",children:Z.map(e=>r.jsx("button",{onClick:()=>Q(e.days),className:"px-4 py-2.5 text-sm font-semibold transition-all hover:opacity-90",style:{backgroundColor:"var(--color-bg-elevated)",color:"var(--color-text)",borderRadius:"var(--radius-md)",border:"2px solid var(--color-border)",transition:"all 0.15s ease"},children:e.label},e.days))})]}),a?r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"flex flex-col items-center gap-3 p-8",style:{...m,borderRadius:"var(--radius-xl)",boxShadow:"var(--shadow-card-hover)",background:"linear-gradient(135deg, var(--color-bg-card) 0%, var(--color-bg-elevated) 100%)"},children:[r.jsx("span",{className:"text-sm font-medium",style:{color:"var(--color-text-secondary)"},children:a.isFuture?"남은 일수":a.isPast?"지난 일수":"오늘"}),r.jsx("span",{className:"font-bold leading-none",style:{color:I,fontSize:"clamp(3rem, 10vw, 5.5rem)",letterSpacing:"-0.02em"},children:a.ddayText}),!a.isToday&&r.jsx("span",{className:"px-4 py-1.5 text-sm font-semibold",style:{backgroundColor:a.isFuture?"#3b82f615":"#ef444415",color:I,borderRadius:"var(--radius-md)"},children:a.isFuture?"미래":"과거"})]}),r.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[r.jsxs("div",{className:"flex flex-col items-center justify-center p-5 text-center",style:{...m,borderRadius:"var(--radius-lg)"},children:[r.jsxs("span",{className:"text-2xl font-bold",style:{color:"var(--color-primary-500)"},children:[a.weeks,"주 ",a.remainingDays,"일"]}),r.jsx("span",{className:"text-xs mt-1.5 font-medium",style:{color:"var(--color-text-tertiary)"},children:"주 단위 환산"})]}),r.jsxs("div",{className:"flex flex-col items-center justify-center p-5 text-center",style:{...m,borderRadius:"var(--radius-lg)"},children:[r.jsxs("span",{className:"text-2xl font-bold",style:{color:"var(--color-primary-500)"},children:["약 ",a.months,"개월 ",a.mDays,"일"]}),r.jsx("span",{className:"text-xs mt-1.5 font-medium",style:{color:"var(--color-text-tertiary)"},children:"월 단위 환산"})]}),r.jsxs("div",{className:"flex flex-col items-center justify-center p-5 text-center",style:{...m,borderRadius:"var(--radius-lg)"},children:[r.jsx("span",{className:"text-2xl font-bold",style:{color:"var(--color-primary-500)"}
2,children:a.totalHours.toLocaleString()}),r.jsx("span",{className:"text-xs mt-1.5 font-medium",style:{color:"var(--color-text-tertiary)"},children:"시간"})]}),r.jsxs("div",{className:"flex flex-col items-center justify-center p-5 text-center",style:{...m,borderRadius:"var(--radius-lg)"},children:[r.jsx("span",{className:"text-2xl font-bold",style:{color:"var(--color-primary-500)"},children:a.totalMinutes.toLocaleString()}),r.jsx("span",{className:"text-xs mt-1.5 font-medium",style:{color:"var(--color-text-tertiary)"},children:"분"})]})]}),v&&$&&$.length>0&&r.jsxs("div",{className:"flex flex-col gap-4 p-5",style:m,children:[r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx("div",{className:"w-2 h-2 rounded-full",style:{backgroundColor:"#f97316"}}),r.jsx("h3",{className:"text-sm font-semibold",style:{color:"var(--color-text)"},children:"매년 반복 일정"})]}),r.jsx("div",{className:"flex flex-col gap-2",children:$.map(e=>{const s=e.date<n;return r.jsxs("div",{className:"flex items-center justify-between p-3",style:{backgroundColor:s?"var(--color-bg)":"var(--color-bg-elevated)",borderRadius:"var(--radius-md)",border:s?"1px solid var(--color-border)":"1px solid #f9731630",opacity:s?.5:1},children:[r.jsxs("div",{className:"flex flex-col gap-0.5",children:[r.jsxs("span",{className:"text-sm font-bold",style:{color:s?"var(--color-text-tertiary)":"#f97316"},children:[e.year,"년 ",u.getMonth()+1,"월 ",u.getDate(),"일"]}),r.jsxs("span",{className:"text-xs",style:{color:"var(--color-text-secondary)"},children:[e.dayOfWeek,"요일"]})]}),r.jsxs("div",{className:"flex items-center gap-2",children:[e.yearCount>0&&r.jsxs("span",{className:"text-xs font-semibold px-2 py-0.5",style:{backgroundColor:"#f9731610",color:"#f97316",borderRadius:"var(--radius-sm)"},children:[e.yearCount,"주년"]}),r.jsx("span",{className:"text-xs font-semibold px-2 py-0.5",style:{backgroundColor:s?"var(--color-border)":"#f9731610",color:s?"var(--color-text-tertiary)":"#f97316",borderRadius:"var(--radius-sm)"},children:s?"지남":"예정"})]})]},e.year)})})]}),r.jsxs("div",{className:"flex gap-2 flex-wrap",children:[r.jsx("button",{onClick:()=>{if(!a)return;const e=["[D-Day 계산 결과]",`시작일: ${o}`,`종료일: ${c}`,`당일 포함: ${d?"예":"아니오"}`,"",`${a.ddayText}`,`${a.absDays}일 (${a.weeks}주 ${a.remainingDays}일)`,`약 ${a.months}개월 ${a.mDays}일`,`${a.totalHours.toLocaleString()}시간`,`${a.totalMinutes.toLocaleString()}분`].join(`
3`);navigator.clipboard.writeText(e).then(()=>{C(!0),setTimeout(()=>C(!1),2e3)})},className:"px-4 py-2 text-sm font-medium transition-all active:scale-95",style:{backgroundColor:"var(--color-bg)",border:"1.5px solid var(--color-border)",borderRadius:"var(--radius-md)",color:"var(--color-text)",cursor:"pointer"},children:j?"복사됨":"결과 복사"}),r.jsx("button",{onClick:z,className:"px-4 py-2 text-sm font-medium transition-all active:scale-95",style:{backgroundColor:"var(--color-bg)",border:"1.5px solid var(--color-border)",borderRadius:"var(--radius-md)",color:"var(--color-text)",cursor:"pointer"},children:W?"URL 복사됨":"URL 공유"}),x&&D.length>0&&r.jsx("button",{onClick:()=>{const e=["기념일","날짜","요일","상태"],s=D.map(t=>[t.label,t.dateStr,T[t.date.getDay()],t.isPast?"지남":"예정"]);q("dday_milestones.csv",e,s)},className:"px-4 py-2 text-sm font-medium transition-all active:scale-95",style:{backgroundColor:"var(--color-bg)",border:"1.5px solid var(--color-border)",borderRadius:"var(--radius-md)",color:"var(--color-text)",cursor:"pointer"},children:"기념일 목록 CSV"})]})]}):r.jsxs("div",{className:"flex flex-col items-center justify-center py-16 gap-3",style:{backgroundColor:"var(--color-bg-card)",borderRadius:"var(--radius-xl)",boxShadow:"var(--shadow-card)",border:"2px dashed var(--color-border)"},children:[r.jsx("div",{className:"w-12 h-12 flex items-center justify-center text-sm font-bold",style:{backgroundColor:"var(--color-bg-elevated)",color:"var(--color-text-tertiary)",borderRadius:"var(--radius-md)"},children:"D"}),r.jsx("span",{className:"text-sm",style:{color:"var(--color-text-tertiary)"},children:"종료일을 선택하면 D-Day가 계산됩니다"})]}),x&&r.jsxs("div",{className:"flex flex-col gap-4 p-5",style:m,children:[r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("h3",{className:"text-sm font-semibold",style:{color:"var(--color-text)"},children:"기념일 목록"}),r.jsxs("span",{className:"text-xs",style:{color:"var(--color-text-tertiary)"},children:[k.length,"개"]})]}),r.jsxs("div",{className:"flex flex-col gap-2",children:[r.jsx("span",{className:"text-xs font-medium",style:{color:"var(--color-text-secondary)"},children:"커스텀 기념일 추가"}),r.jsxs("div",{className:"flex gap-2",children:[r.jsxs("div",{className:"flex items-center gap-2 flex-1 px-3 py-2",style:{backgroundColor:"var(--color-bg)",borderRadius:"var(--radius-md)",border:"2px s
3olid var(--color-border)"},children:[r.jsx("input",{type:"number",value:P,onChange:e=>L(e.target.value),onKeyDown:e=>{e.key==="Enter"&&Y()},placeholder:"일수를 입력하세요",min:1,className:"w-full text-sm font-medium outline-none bg-transparent",style:{color:"var(--color-text)"}}),r.jsx("span",{className:"text-sm font-medium shrink-0",style:{color:"var(--color-text-tertiary)"},children:"일"})]}),r.jsx("button",{onClick:Y,className:"px-4 py-2 text-sm font-semibold transition-all hover:opacity-90 shrink-0",style:{backgroundColor:"var(--color-primary-500)",color:"#fff",borderRadius:"var(--radius-md)",transition:"all 0.15s ease"},children:"추가"})]}),r.jsx("div",{className:"flex flex-wrap gap-1.5",children:[50,77,200,500,777,999,1500,2e3,3e3].map(e=>k.some(t=>t.days===e)?null:r.jsxs("button",{onClick:()=>{M(t=>[...t,{label:`${e.toLocaleString()}일`,days:e}])},className:"px-2.5 py-1.5 text-xs font-medium transition-all",style:{backgroundColor:"var(--color-bg-elevated)",color:"var(--color-text-secondary)",borderRadius:"var(--radius-sm)",border:"1px solid var(--color-border)",transition:"all 0.15s ease"},children:["+",e.toLocaleString(),"일"]},e))})]}),f.length>0&&r.jsx("div",{className:"flex flex-wrap gap-1.5",children:f.map(e=>r.jsxs("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-1.5 text-xs font-medium",style:{backgroundColor:"var(--color-primary-50)",color:"var(--color-primary-500)",borderRadius:"var(--radius-sm)",border:"1px solid var(--color-primary-300)"},children:[e.label,r.jsx("button",{onClick:()=>O(e.days),className:"text-xs font-bold hover:opacity-70",style:{color:"var(--color-primary-500)",lineHeight:1},children:"x"})]},e.days))}),r.jsxs("div",{className:"flex flex-col relative",children:[r.jsx("div",{className:"absolute left-[15px] top-0 bottom-0 w-0.5",style:{backgroundColor:"var(--color-border)"}}),D.map((e,s)=>{const t=e.date,y=T[t.getDay()],p=s===D.length-1;return r.jsxs("div",{className:"flex items-start gap-4 relative",style:{paddingBottom:p?0:"16px",opacity:e.isPast?.5:1,transition:"opacity 0.2s ease"},children:[r.jsx("div",{className:"relative z-10 shrink-0 w-[31px] h-[31px] flex items-center justify-center",children:r.jsx("div",{className:"w-3 h-3 rounded-full",style:{backgroundColor:e.isPast?"var(--color-text-tertiary)":"var(--color-primary-500)",boxShadow:e.isPast?"none":"0 0 0 4px var(--color-primary-500)20"}})}),r.jsxs("div",{className:"flex-1 flex items-center justify-between p-3.5",style:{backgroundColor:e.isPast?"var(--color-bg)":"var(--color-bg-elevated)",borderRadius:"var(--radius-md)",border:e.isPast?"1px solid var(--color-border)":"1px solid var(--color-primary-500)30"},children:[r.jsxs("div",{className:"flex flex-col gap-0.5",children:[r.jsx("span",{className:"text-sm font-bold",style:{color:e.isPast?"var(--color-text-tertiary)":"var(--color-primary-500)"},children:e.label}),r.jsxs("span",{className:"text-xs",style:{color:"var(--color-text-secondary)"},children:[e.dateStr," (",y,")"]})]}),r.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[r.jsx("span",{className:"text-xs font-semibold px-2.5 py-1",style:{backgroundColor:e.isPast?"var(--color-border)":"var(--color-primary-500)15",color:e.isPast?"var(--color-text-tertiary)":"var(--color-primary-500)",borderRadius:"var(--radius-sm)"},children:e.isPast?"지남":"예정"}),e.isCustom&&r.jsx("button",{onClick:()=>O(e.days),className:"w-6 h-6 flex items-center justify-center text-xs font-bold transition-all hover:opacity-70",style:{backgroundColor:"var(--color-bg)",color:"#ef4444",borderRadius:"var(--radius-sm)",border:"1px solid var(--color-border)"},title:"삭제",children:"x"})]})]})]},e.label)})]})]})]})}export{se as default};

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.