diff --git a/src/main.ts b/src/main.ts
index b7b5985..c6370da 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -700,8 +700,8 @@ function renderCopyTargets(): void {
function renderCopyPreview(): void {
const src = activePier();
const items = chosenCopyItems();
- const body = $
('cp-preview').tBodies[0];
- body.replaceChildren();
+ const box = $('cp-preview');
+ box.replaceChildren();
let applied = 0;
let skippedTotal = 0;
const selected = selectedCopyTargets();
@@ -712,15 +712,8 @@ function renderCopyPreview(): void {
const skipped = plan.skipped.map((k) => k.reason);
skippedTotal += skipped.length;
if (plan.changes.length) applied++;
- const row = el('tr');
- row.append(
- el('td', t.input.name),
- el('td', t.input.type),
- el('td', String(plan.changes.length)),
- el('td', String(skipped.length)),
- el('td', [...labels, ...skipped].join(' · ') || '바뀌는 값 없음'),
- );
- body.appendChild(row);
+ const detail = [...labels, ...skipped.map((r) => `건너뜀: ${r}`)].join(' · ') || '바뀌는 값 없음';
+ box.appendChild(el('p', `${t.input.name} · ${detail}`, 'cp-line'));
}
const n = selected.length;
$('cp-summary').textContent = `${src?.input.name ?? ''} → ${n}기 · 항목 ${items.length}개 · 건너뜀 ${skippedTotal}건`;
diff --git a/src/style.css b/src/style.css
index e67f42a..f27de84 100644
--- a/src/style.css
+++ b/src/style.css
@@ -821,6 +821,9 @@ body { background: #eef1f4; font-family: 'Noto Sans KR', system-ui, sans-serif;
/* Import preview: all piers' 받침·IP rows scroll inside the dialog. */
.pv-scroll { max-height: 240px; overflow: auto; }
+/* 속성 복사: one line per target in the change summary. */
+.copy-panel .cp-line { margin: 2px 0; font-size: 12px; }
+
/* 속성 복사: an inline panel at the bottom of the 부재별 편집창 (was a modal dialog). */
.copy-panel { margin-top: 12px; border-top: 1px solid #d5dde6; padding-top: 10px; }
.copy-panel .copy-head h3 { margin: 0 0 4px; font-size: 13px; }