Improve UI layout and notification system

- Fix overlapping text issues in file cards and meta information
- Improve download success notification with actual filenames
- Enhance file actions button layout with better spacing
- Add modern notification system with animations and better styling
- Improve responsive design for mobile devices
- Add proper spacing and alignment for read-only badges
- Update notification positioning and mobile responsiveness

UI improvements:
• Better text spacing and wrapping
• Professional notification animations
• Improved mobile layout
• Enhanced file action button alignment

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-08-19 14:39:08 +09:00
parent 73d5359deb
commit 2889a4e299
2 changed files with 100 additions and 24 deletions

View File

@@ -915,7 +915,8 @@ class FileManager {
document.body.removeChild(link); document.body.removeChild(link);
} }
} }
this.showNotification(`${file.files.length}개의 파일이 다운로드되었습니다!`, 'success'); const fileNames = file.files.map(f => f.original_name || f.name).join(', ');
this.showNotification(`파일 다운로드 완료: ${fileNames}`, 'success');
} catch (error) { } catch (error) {
console.error('파일 다운로드 오류:', error); console.error('파일 다운로드 오류:', error);
this.showNotification('파일 다운로드 중 오류가 발생했습니다.', 'error'); this.showNotification('파일 다운로드 중 오류가 발생했습니다.', 'error');
@@ -994,33 +995,23 @@ class FileManager {
} }
showNotification(message, type = 'info') { showNotification(message, type = 'info') {
// 기존 알림이 있으면 제거
const existingNotification = document.querySelector('.notification');
if (existingNotification) {
existingNotification.remove();
}
const notification = document.createElement('div'); const notification = document.createElement('div');
notification.className = `notification notification-${type}`; notification.className = `notification ${type}`;
notification.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
background: ${type === 'success' ? '#48bb78' : '#667eea'};
color: white;
padding: 15px 20px;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
z-index: 1001;
animation: slideIn 0.3s ease;
max-width: 300px;
word-wrap: break-word;
`;
notification.textContent = message; notification.textContent = message;
document.body.appendChild(notification); document.body.appendChild(notification);
setTimeout(() => { // 3초 후 자동 제거
notification.style.animation = 'slideOut 0.3s ease';
setTimeout(() => { setTimeout(() => {
if (notification.parentNode) { if (notification.parentNode) {
notification.parentNode.removeChild(notification); notification.remove();
} }
}, 300);
}, 3000); }, 3000);
} }

View File

@@ -158,10 +158,14 @@ header p {
.read-only-badge { .read-only-badge {
background: #74b9ff; background: #74b9ff;
color: white; color: white;
padding: 4px 8px; padding: 6px 12px;
border-radius: 4px; border-radius: 15px;
font-size: 0.8em; font-size: 0.8em;
font-weight: 500; font-weight: 500;
white-space: nowrap;
display: inline-flex;
align-items: center;
margin-left: auto;
} }
.sync-status { .sync-status {
@@ -398,6 +402,11 @@ header p {
color: #666; color: #666;
margin-bottom: 10px; margin-bottom: 10px;
flex-wrap: wrap; flex-wrap: wrap;
align-items: center;
}
.file-meta span {
white-space: nowrap;
} }
.file-description { .file-description {
@@ -426,6 +435,8 @@ header p {
display: flex; display: flex;
gap: 10px; gap: 10px;
flex-wrap: wrap; flex-wrap: wrap;
align-items: center;
margin-top: 10px;
} }
.file-actions button { .file-actions button {
@@ -622,4 +633,78 @@ header p {
.guest-login-btn { .guest-login-btn {
margin-top: 10px; margin-top: 10px;
} }
.notification {
left: 10px;
right: 10px;
top: 10px;
max-width: none;
margin: 0;
}
.file-meta {
gap: 8px;
}
.file-meta span {
font-size: 0.8rem;
}
header h1 {
font-size: 2rem;
}
}
/* 알림 메시지 스타일 */
.notification {
position: fixed;
top: 20px;
right: 20px;
max-width: 400px;
padding: 15px 20px;
border-radius: 8px;
color: white;
font-weight: 500;
z-index: 10000;
animation: slideInRight 0.3s ease, fadeOut 0.3s ease 2.7s;
animation-fill-mode: forwards;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
word-wrap: break-word;
line-height: 1.4;
}
.notification.success {
background: linear-gradient(135deg, #48bb78, #38a169);
border-left: 4px solid #2f855a;
}
.notification.error {
background: linear-gradient(135deg, #f56565, #e53e3e);
border-left: 4px solid #c53030;
}
.notification.info {
background: linear-gradient(135deg, #4299e1, #3182ce);
border-left: 4px solid #2c5282;
}
@keyframes slideInRight {
from {
transform: translateX(100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
@keyframes fadeOut {
from {
opacity: 1;
}
to {
opacity: 0;
transform: translateX(100%);
}
} }