v4.0.0: UNIARE 리브랜딩·레이아웃·덱 UX 개선

제품명·헤더 로고 이미지 통일, 덱 이름 변경·조회 수 제거, 썸네일 홀드 미리보기를 누르는 동안만 표시하도록 수정하고 Tailwind CSS를 재빌드했다.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-23 11:19:07 +09:00
parent 2228757ea5
commit a281d731a1
32 changed files with 201 additions and 1910 deletions

View File

@@ -8,12 +8,14 @@
<link rel="stylesheet" href="./style/app-shell.css" />
<link rel="stylesheet" href="./style/auth-header.css" />
<link rel="stylesheet" href="./style/deck-history.css" />
<title>내 덱 관리 - UADECK</title>
<title>내 덱 관리 - UNIARE</title>
</head>
<body class="app-page deck-history-page">
<nav class="app-nav">
<div class="app-nav-inner">
<a href="/" class="app-brand">UADECK <span>v4.0.0</span></a>
<a href="/" class="app-brand">
<img src="/images/assets/uniare-h48.png" alt="UNIARE" class="app-brand-logo" />
</a>
<div id="auth-header-slot"></div>
</div>
</nav>
@@ -278,7 +280,7 @@
${visibilityBadge}
</div>
<h2 class="deck-card-title">${title}</h2>
<div class="deck-card-meta">${escapeHtml(t('deckViews', '조회'))} ${d.view_count} · ${date}</div>
<div class="deck-card-meta">${date}</div>
<div class="deck-card-actions deck-card-actions--primary">
${favoriteButtonHtml(d.share_code)}
<button type="button" class="deck-card-btn deck-card-btn-load" data-load="${escapeHtml(d.share_code)}" data-series="${escapeHtml(d.series)}" data-name="${escapeHtml(d.series_name || '')}">${escapeHtml(t('deckLoad', '불러오기'))}</button>
@@ -288,6 +290,7 @@
</button>
<div class="deck-card-more-menu hidden" role="menu">
<button type="button" class="deck-card-more-item" role="menuitem" data-copy="${escapeHtml(d.share_code)}">${escapeHtml(t('deckCopyLink', '링크 복사'))}</button>
<button type="button" class="deck-card-more-item" role="menuitem" data-rename="${escapeHtml(d.share_code)}" data-current-name="${escapeHtml(getDeckTitle(d))}">${escapeHtml(t('deckRename', '이름 변경'))}</button>
<button type="button" class="deck-card-more-item" role="menuitem" data-toggle="${escapeHtml(d.share_code)}" data-public="${isPublic ? '1' : '0'}">${escapeHtml(toggleLabel)}</button>
<button type="button" class="deck-card-more-item deck-card-more-item--danger" role="menuitem" data-delete="${escapeHtml(d.share_code)}">${escapeHtml(t('deckDelete', '삭제'))}</button>
</div>
@@ -441,6 +444,33 @@
return;
}
const renameBtn = e.target.closest('[data-rename]');
if (renameBtn) {
const code = renameBtn.dataset.rename;
const current = renameBtn.dataset.currentName || '';
const newName = prompt(t('deckRenamePrompt', '새 덱 이름을 입력하세요'), current);
if (newName === null) return;
const trimmed = newName.trim();
if (!trimmed) {
alert(t('deckRenameEmpty', '이름을 입력해 주세요.'));
return;
}
if (trimmed === current) {
closeAllDeckMenus();
return;
}
try {
await UaDeckApi.updateDeck(code, { name: trimmed });
const deck = allDecks.find((d) => d.share_code === code);
if (deck) deck.name = trimmed;
closeAllDeckMenus();
renderDeckList();
} catch (err) {
alert(err.message || t('deckRenameFailed', '이름 변경에 실패했습니다.'));
}
return;
}
const toggleBtn = e.target.closest('[data-toggle]');
if (toggleBtn) {
const code = toggleBtn.dataset.toggle;