<!doctype html> <html lang="ko"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <style> :root{--gold:#d8b900;--ink:#20241f;--muted:#596258;--paper:#f7faf7;--line:#e3cb22} *{box-sizing:border-box} html,body{margin:0;padding:0;background:transparent;color:var(--ink);font-family:Arial,"Noto Sans KR",sans-serif} [data-block-id="40812e64-c65f-8034-9cd1-edcc1d512dbf"],[data-block-id="f3cc8734-f89b-475f-915c-f87c183b361c"],[data-block-id="755b616a-1681-450e-8adb-6378677f9b24"],[data-block-id="381c3395-2f63-4a75-b253-54e0d5d0f5c6"],[data-block-id="1e01371b-1495-49ec-94d7-76bcfefbf6e3"],[data-block-id="1fea306f-691d-485d-9155-b626105ce526"]{display:none!important} .timeline-wrap{width:100%;max-width:920px;margin:0 auto;padding:16px 22px 24px;background:linear-gradient(180deg,#fbfdf9 0%,#f3f8f5 100%);border-radius:20px;overflow:hidden} .timeline{position:relative;padding:4px 0} .timeline:before{content:"";position:absolute;left:50%;top:0;bottom:0;width:3px;transform:translateX(-50%);background:var(--line);border-radius:4px} .item{position:relative;width:50%;min-height:87px;padding:0 34px 21px} .item.left{left:0;text-align:right} .item.right{left:50%;text-align:left} .item:after{content:"";position:absolute;top:10px;width:20px;height:20px;border-radius:50%;border:3px solid var(--gold);box-shadow:0 0 0 5px rgba(216,185,0,.13)} .item.left:after{right:-10px;background:#171916} .item.right:after{left:-10px;background:#fff} .item:before{content:"";position:absolute;top:19px;width:24px;height:3px;background:var(--line)} .item.left:before{right:0} .item.right:before{left:0} .item-trigger{display:block;width:100%;margin:0;padding:0 0 7px;border:0;border-radius:10px;background:transparent;color:inherit;font:inherit;text-align:inherit;text-decoration:none;cursor:pointer} .item-trigger:hover,.item-trigger:focus-visible{background:rgba(216,185,0,.1);outline:2px solid transparent} .item-trigger:focus-visible{box-shadow:0 0 0 3px rgba(216,185,0,.3)} .year{display:block;font-size:24px;font-weight:800;letter-spacing:-.02em;margin:0 0 4px} .event{display:block;font-size:18px;font-weight:750;line-height:1.35;word-break:keep-all} .desc{display:block;margin-top:7px;color:var(--muted);font-size:14px;font-weight:400;line-height:1.58;word-break:keep-all} .more{display:block;margin-top:6px;color:#8a7800;font-size:11px;font-weight:700} .item.current{z-index:2} .item.current:after{top:6px;width:28px;height:28px;border-width:4px;box-shadow:0 0 0 7px rgba(216,185,0,.15),0 0 24px rgba(216,185,0,.28)} .item.current.right:after{left:-14px} .item.current:before{width:30px} .item.current .item-trigger{margin:-7px 0 0;padding:12px 14px 14px;border:1px solid rgba(216,185,0,.32);border-radius:16px;background:linear-gradient(135deg,rgba(255,253,229,.82),rgba(255,255,255,.38));box-shadow:0 10px 28px rgba(89,78,0,.08)} .item.current .year{color:#9a8200;font-size:30px} .item.current .event{font-size:21px} .item.current .desc{font-size:15px} .item.current .more{color:#806b00;font-size:12px} @media(min-width:641px){.item + .item{margin-top:-58px}} .note{text-align:center;color:#7b827b;font-size:12px;margin:8px 0 0} .timeline-detail[hidden]{display:none!important} .timeline-detail{position:fixed;z-index:99999;inset:0;display:flex;align-items:center;justify-content:center;padding:22px;background:rgba(20,24,20,.58);backdrop-filter:blur(3px)} .detail-page{position:relative;width:min(620px,100%);max-height:min(720px,calc(100vh - 44px));overflow:auto;padding:34px 34px 38px;background:var(--paper);border:1px solid rgba(216,185,0,.45);border-radius:22px;box-shadow:0 22px 70px rgba(0,0,0,.24)} .detail-back{display:inline-flex;align-items:center;gap:6px;margin:0 0 28px;padding:9px 13px;border:1px solid #d6ddd6;border-radius:999px;background:#fff;color:var(--ink);font-size:13px;font-weight:700;cursor:pointer} .detail-back:hover,.detail-back:focus-visible{border-color:var(--gold);outline:none;box-shadow:0 0 0 3px rgba(216,185,0,.18)} .detail-stone{width:24px;height:24px;margin:0 0 18px;border:4px solid var(--gold);border-radius:50%;background:#171916;box-shadow:0 0 0 6px rgba(216,185,0,.12)} .detail-year{margin:0 0 10px;color:var(--gold);font-size:36px;line-height:1;font-weight:850;letter-spacing:-.03em} .detail-title{margin:0 0 20px;font-size:24px;line-height:1.42;font-weight:800;word-break:keep-all} .detail-desc{margin:0;color:var(--muted);font-size:17px;line-height:1.8;word-break:keep-all} @media(max-width:640px){ .timeline-wrap{padding:14px 16px 20px;border-radius:15px} .timeline:before{left:17px} .item,.item.left,.item.right{left:0;width:100%;text-align:left;padding:0 4px 15px 54px;min-height:81px} .item.left:after,.item.right:after{left:7px;right:auto;top:8px} .item.left:before,.item.right:before{left:17px;right:auto;top:17px;width:24px} .year{font-size:21px}.event{font-size:16px}.desc{font-size:13px;line-height:1.55}.more{font-size:10px} .item.current.left:after,.item.current.right:after{left:3px;top:4px} .item.current .item-trigger{margin:-4px 0 0;padding:10px 12px 12px} .item.current .year{font-size:26px}.item.current .event{font-size:19px}.item.current .desc{font-size:14px} .timeline-detail{padding:14px;align-items:flex-end} .detail-page{max-height:calc(100vh - 28px);padding:24px 22px 30px;border-radius:20px} .detail-back{margin-bottom:24px}.detail-year{font-size:32px}.detail-title{font-size:21px}.detail-desc{font-size:15px;line-height:1.72} } </style> </head> <body> <section class="timeline-wrap" aria-label="딥바둑 연대표"> <div class="timeline"> <article class="item right current"> <a class="item-trigger" href="/40912e64-c65f-81fe-9699-dbcf1fd91db3" aria-label="2026년 지금 자라는 이야기"> <span class="year">2026.</span> <span class="event">본질(本質) : 바둑의 뿌리를 배웁니다</span> <span class="desc">바둑을 통해 깊이 사유하고 정서를 순화하는 교육을 시작합니다.</span> <span class="more">지금 자라는 이야기 →</span> </a> </article> <article class="item left"> <button type="button" class="item-trigger" aria-haspopup="dialog"> <span class="year">2020.</span> <span class="event">지혜(智慧) : 인문학을 익히며 바둑의 본질을 사유</span> <span class="desc">메타 바둑의 원리와 인문 고전의 철학이 맞닿아 있음을 깨닫습니다. 고대의 성인(聖人)들은 바둑으로 정신 수양을 해왔습니다.</span> <span class="more">더보기 +</span> </button> </article> <article class="item right"> <button type="button" class="item-trigger" aria-haspopup="dialog"> <span class="year">2018.</span> <span class="event">요석(要石) : 바둑의 핵심 원리를 익히다</span> <span class="desc">AI에게 바둑을 가르치며, 바둑 교육의 핵심 원리를 계발한 메타 바둑 대표 김찬우 스승님을 만난 것은 저에게 큰 행운이었습니다.</span> <span class="more">더보기 +</span> </button> </article> <article class="item left"> <button type="button" class="item-trigger" aria-haspopup="dialog"> <span class="year">2006.</span> <span class="event">생존(生存) : 바둑 교육으로 먹고 살기 위해, 고군분투</span> <span class="desc">학생들은 바둑을 어려워했어요. 그래서 쉽고, 재미있게 가르치기 위해 ‘커리큘럼’을 연구했어요.</span> <span class="more">더보기 +</span> </button> </article> <article class="item right"> <button type="button" class="item-trigger" aria-haspopup="dialog"> <span class="year">2005.</span> <span class="event">입지(立志) : 바둑 보급 결심</span> <span class="desc">풋내기 혈혈단신의 청년으로 해외 첫 바둑 지도를 했어요. 모든 것이 새로웠고, 어떻게 가르쳐야 할지 몰랐어요. 그런데도 철학의 나라답게 진지한 독일인들은 제 바둑 강의에 흠뻑 매료되었죠. 그때 결심했습니다. “바둑으로 세상을 널리 이롭게 하겠다.”</span> <span class="more">더보기 +</span> </button> </article> <article class="item left"> <button type="button" class="item-trigger" aria-haspopup="dialog"> <span class="year">2000.</span> <span class="event">재개(再開) : 바둑학과 수석 입학</span> <span class="desc">포항공대 수학과에 떨어지고 재수를 생각하다, 내가 가장 좋아했던 바둑이 다시 떠올랐어요. 세계 유일의 바둑학과가 있었죠.</span> <span class="more">더보기 +</span> </button> </article> <article class="item right"> <button type="button" class="item-trigger" aria-haspopup="dialog"> <span class="year">1993.</span> <span class="event">봉수(烽燧) : 바둑을 멈추다</span> <span class="desc">중학교 입학 전, 바둑프로기사와 공부의 갈림길에서 경제적 형편 및 재능 부족으로 바둑을 접었어요. 그래도 중고등시절에 공부에서 지칠 때마다, 바둑을 취미로 즐겼어요.</span> <span class="more">더보기 +</span> </button> </article> <article class="item left"> <button type="button" class="item-trigger" aria-haspopup="dialog"> <span class="year">1991.</span> <span class="event">착수(着手) : 처음 바둑을 배우다</span> <span class="desc">11살, 바둑을 처음 배웠을 때, 마법에 빠진 듯한 황홀감을 느꼈어요. 다른 모든 놀이가 시들시들해졌어요.</span> <span class="more">더보기 +</span> </button> </article> </div> <p class="note">깊이 보고, 연결하고, 균형을 찾는 시간</p> </section> <div class="timeline-detail" hidden aria-hidden="true"> <section class="detail-page" role="dialog" aria-modal="true" aria-labelledby="detail-title" aria-describedby="detail-desc"> <button type="button" class="detail-back" aria-label="연대표로 돌아가기">← 연대표로</button> <div class="detail-stone" aria-hidden="true"></div> <p class="detail-year"></p> <h2 class="detail-title" id="detail-title"></h2> <p class="detail-desc" id="detail-desc"></p> </section> </div> <script> (()=>{ const SOURCE_BLOCK='40812e64-c65f-8034-9cd1-edcc1d512dbf'; const STORY_URL='/40912e64-c65f-81fe-9699-dbcf1fd91db3'; const timeline=document.querySelector('.timeline'); const overlay=document.querySelector('.timeline-detail'); const back=overlay.querySelector('.detail-back'); const detailYear=overlay.querySelector('.detail-year'); const detailTitle=overlay.querySelector('.detail-title'); const detailDesc=overlay.querySelector('.detail-desc'); let lastTrigger=null; let synced=false; let attempts=0; let timer=null; function clean(value){ return (value||'').replace(/\s+/g,' ').trim(); } function openDetail(trigger){ lastTrigger=trigger; detailYear.textContent=trigger.querySelector('.year').textContent; detailTitle.textContent=trigger.querySelector('.event').textContent; detailDesc.textContent=trigger.querySelector('.desc').textContent; overlay.hidden=false; overlay.setAttribute('aria-hidden','false'); document.documentElement.style.overflow='hidden'; back.focus(); } function closeDetail(){ overlay.hidden=true; overlay.setAttribute('aria-hidden','true'); document.documentElement.style.overflow=''; if(lastTrigger) lastTrigger.focus(); } function sourceTable(){ return Array.from(document.querySelectorAll('table')).find(table=>{ const first=Array.from(table.querySelectorAll('tr:first-child th,tr:first-child td')).map(cell=>clean(cell.textContent)); return first[0]==='날짜'&&first[1]==='제목'&&first[2]==='설명'; }); } function readRows(table){ return Array.from(table.querySelectorAll('tr')).slice(1).map(row=>Array.from(row.querySelectorAll('th,td')).map(cell=>clean(cell.textContent)).slice(0,3)).filter(row=>row.length===3&&row[0]&&row[1]); } function span(className,text){ const node=document.createElement('span'); node.className=className; node.textContent=text; return node; } function renderTimelineFromNotion(rows){ const fragment=document.createDocumentFragment(); rows.forEach((row,index)=>{ const article=document.createElement('article'); article.className='item '+(index%2===0?'right':'left')+(index===0?' current':''); let trigger; if(index===0){ trigger=document.createElement('a'); trigger.href=STORY_URL; trigger.setAttribute('aria-label',row[0].replace(/\.$/,'')+'년 지금 자라는 이야기'); }else{ trigger=document.createElement('button'); trigger.type='button'; trigger.setAttribute('aria-haspopup','dialog'); } trigger.className='item-trigger'; trigger.append(span('year',row[0]),span('event',row[1]),span('desc',row[2]),span('more',index===0?'지금 자라는 이야기 →':'더보기 +')); article.append(trigger); fragment.append(article); }); timeline.replaceChildren(fragment); timeline.dataset.source='notion-table'; } function trySync(){ if(synced) return; const table=sourceTable(); if(table){ const rows=readRows(table); if(rows.length){ renderTimelineFromNotion(rows); synced=true; observer.disconnect(); if(timer) clearInterval(timer); return; } } const source=document.querySelector('[data-block-id="'+SOURCE_BLOCK+'"]'); const unfold=source&&source.querySelector('[aria-label="unfold"]'); if(unfold) unfold.click(); if(++attempts>80){ observer.disconnect(); if(timer) clearInterval(timer); } } timeline.addEventListener('click',event=>{ const trigger=event.target.closest('button.item-trigger'); if(trigger&&timeline.contains(trigger)) openDetail(trigger); }); back.addEventListener('click',closeDetail); overlay.addEventListener('click',event=>{ if(event.target===overlay) closeDetail(); }); document.addEventListener('keydown',event=>{ if(event.key==='Escape'&&!overlay.hidden) closeDetail(); }); const observer=new MutationObserver(trySync); observer.observe(document.documentElement,{childList:true,subtree:true}); timer=setInterval(trySync,250); trySync(); })(); </script> </body> </html>