캔버스 아티팩트

Canvas artifact

대화는 왼쪽 좁은 영역에 남기고, 코드·문서처럼 길게 붙잡고 편집할 결과물은 오른쪽 넓은 패널에 따로 여는 레이아웃.

다른 이름: Side panel artifactSplit-view documentWorkspace panel
···
html
<div class="split">
  <div class="chat">
    <div class="msg">헤더 컴포넌트 만들어줘</div>
    <div class="msg ai">오른쪽에 만들었어요</div>
    <div class="msg" id="m2" data-hide>패딩 좀 더 넉넉하게</div>
  </div>
  <div class="panel" id="panel">
    <div class="pbar"><span>Header.tsx</span><i class="v">v1</i></div>
    <pre id="code">function Header() {
  return (
    &lt;header&gt;
      &lt;Logo /&gt;
    &lt;/header&gt;
  );
}</pre>
  </div>
</div>
css
.split{width:100%;height:100%;display:grid;grid-template-columns:34% 66%}
.chat{padding:12px 10px;display:grid;align-content:start;gap:7px;border-right:1px solid var(--line);overflow:hidden}
.msg{font-size:10.5px;padding:6px 8px;border-radius:9px;background:var(--surface);border:1px solid var(--line);color:var(--fg);justify-self:end;max-width:96%}
.msg.ai{justify-self:start;background:var(--bg)}
.msg[data-hide]{opacity:0;transform:translateY(4px);transition:opacity .3s,transform .3s}
.msg[data-hide][data-show]{opacity:1;transform:none}
.panel{padding:10px 12px;overflow:hidden;display:grid;align-content:start;gap:8px}
.pbar{display:flex;justify-content:space-between;align-items:center;font-size:10.5px;color:var(--muted);font-weight:600}
.v{font-style:normal;background:var(--line);color:var(--fg);padding:1px 7px;border-radius:999px;font-size:9.5px}
pre{margin:0;font-family:ui-monospace,monospace;font-size:10.5px;line-height:1.6;color:var(--fg);background:var(--surface);border:1px solid var(--line);border-radius:9px;padding:10px;transition:padding .3s}
js
const m2 = document.getElementById('m2'), code = document.getElementById('code'), v = document.querySelector('.v');
const v1 = code.textContent;
const v2 = v1.replace('<header>', '<header style={{ padding: 24 }}>');
function run() {
  code.textContent = v1; v.textContent = 'v1'; m2.removeAttribute('data-show');
  setTimeout(() => m2.setAttribute('data-show', ''), 700);
  setTimeout(() => { code.textContent = v2; v.textContent = 'v2'; }, 1300);
}
run();
setInterval(run, 4200);

짧은 답이 아니라 붙잡고 계속 고쳐 나갈 결과물(코드, 문서, 다이어그램)은 채팅 말풍선 안에 있으면 다루기 불편합니다. 스크롤해서 찾아야 하고, 고친 버전이 또 다른 말풍선으로 쌓이면 어느 게 최신인지 헷갈립니다. 캔버스 아티팩트는 그 결과물을 대화 밖으로 꺼내 전용 패널에 두고, 대화는 그 패널에 대한 지시("3번째 문단 더 짧게")를 주고받는 역할만 하게 분리합니다.

패널은 대화 중 필요한 순간에 오른쪽에서 슬라이드인하며 나타나고, 그 안의 내용은 새 버전이 나올 때마다 같은 자리에서 갱신됩니다(대화창에 새 말풍선을 쌓지 않습니다). 과거 버전으로 되돌아가는 기능이 있으면 실험적으로 고쳐보기가 훨씬 부담 없어집니다.

좁은 화면에서는 패널을 나란히 둘 공간이 없으므로 대화와 패널을 탭으로 전환하는 구조로 접습니다.

언제 쓰나

코드, 긴 문서, 다이어그램처럼 여러 차례 고쳐 나갈 결과물에 씁니다. 한 번 보고 끝나는 짧은 답에는 패널을 열 만한 가치가 없습니다.