dramaling-app/docs/02_design/ui-ux/ui-showcase.html

805 lines
34 KiB
HTML

<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Drama Ling UI/UX 設計系統展示</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="./dramaling-ui.css">
<style>
.showcase {
max-width: 1200px;
margin: 0 auto;
padding: var(--space-8) var(--space-6);
}
.showcase-header {
text-align: center;
margin-bottom: var(--space-16);
padding: var(--space-12);
background: linear-gradient(135deg, var(--primary-teal), var(--secondary-purple));
border-radius: var(--radius-2xl);
color: white;
}
.showcase-title {
font-size: var(--text-4xl);
font-weight: 800;
margin-bottom: var(--space-4);
}
.showcase-subtitle {
font-size: var(--text-xl);
opacity: 0.9;
}
.section {
margin-bottom: var(--space-16);
}
.section-title {
font-size: var(--text-2xl);
font-weight: 700;
margin-bottom: var(--space-8);
color: var(--text-primary);
border-bottom: 2px solid var(--primary-teal);
padding-bottom: var(--space-2);
display: flex;
align-items: center;
gap: var(--space-3);
}
.demo-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: var(--space-6);
}
.demo-item {
background: var(--card-background);
border-radius: var(--radius-xl);
padding: var(--space-6);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.demo-title {
font-size: var(--text-lg);
font-weight: 600;
margin-bottom: var(--space-4);
color: var(--primary-teal);
}
.demo-description {
font-size: var(--text-sm);
color: var(--text-secondary);
margin-bottom: var(--space-6);
line-height: 1.5;
}
.color-palette {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: var(--space-4);
}
.color-item {
text-align: center;
border-radius: var(--radius-lg);
overflow: hidden;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.color-preview {
height: 80px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
font-size: var(--text-sm);
}
.color-info {
padding: var(--space-3);
background: var(--background-secondary);
}
.color-name {
font-size: var(--text-sm);
font-weight: 600;
margin-bottom: var(--space-1);
}
.color-hex {
font-size: var(--text-xs);
color: var(--text-secondary);
font-family: 'JetBrains Mono', monospace;
}
.typography-demo {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.typography-item {
padding: var(--space-4);
background: var(--background-secondary);
border-radius: var(--radius-lg);
border-left: 4px solid var(--primary-teal);
}
.typography-label {
font-size: var(--text-xs);
color: var(--text-secondary);
margin-bottom: var(--space-2);
text-transform: uppercase;
font-weight: 600;
}
.component-demo {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.interactive-demo {
padding: var(--space-6);
background: var(--background-secondary);
border-radius: var(--radius-xl);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.demo-controls {
display: flex;
gap: var(--space-3);
margin-bottom: var(--space-6);
flex-wrap: wrap;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: var(--space-4);
margin-bottom: var(--space-8);
}
.stat-card {
background: var(--card-background);
padding: var(--space-6);
border-radius: var(--radius-xl);
text-align: center;
border: 1px solid rgba(255, 255, 255, 0.1);
transition: all var(--duration-normal);
}
.stat-card:hover {
transform: translateY(-4px);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.3);
}
.stat-number {
font-size: var(--text-4xl);
font-weight: 800;
color: var(--primary-teal);
margin-bottom: var(--space-2);
}
.stat-label {
font-size: var(--text-base);
color: var(--text-secondary);
font-weight: 600;
}
.toast-demo-area {
position: relative;
height: 200px;
background: var(--background-secondary);
border-radius: var(--radius-xl);
border: 2px dashed var(--divider);
display: flex;
align-items: center;
justify-content: center;
color: var(--text-secondary);
margin-bottom: var(--space-4);
}
</style>
</head>
<body>
<div class="showcase">
<!-- Header -->
<header class="showcase-header">
<h1 class="showcase-title">Drama Ling UI/UX 設計系統</h1>
<p class="showcase-subtitle">基於官方設計指南的完整UI組件庫展示</p>
</header>
<!-- Statistics Overview -->
<div class="stats-grid">
<div class="stat-card">
<div class="stat-number">150+</div>
<div class="stat-label">UI 組件</div>
</div>
<div class="stat-card">
<div class="stat-number">50+</div>
<div class="stat-label">CSS 變數</div>
</div>
<div class="stat-card">
<div class="stat-number">100%</div>
<div class="stat-label">響應式設計</div>
</div>
<div class="stat-card">
<div class="stat-number">A++</div>
<div class="stat-label">無障礙評級</div>
</div>
</div>
<!-- Color System -->
<section class="section">
<h2 class="section-title">
<span>🎨</span>
<span>色彩系統</span>
</h2>
<div class="demo-grid">
<div class="demo-item">
<h3 class="demo-title">主要色彩</h3>
<p class="demo-description">品牌主色和輔助色,用於主要互動元素</p>
<div class="color-palette">
<div class="color-item">
<div class="color-preview color-preview-teal">Teal</div>
<div class="color-info">
<div class="color-name">Primary Teal</div>
<div class="color-hex">#00E5CC</div>
</div>
</div>
<div class="color-item">
<div class="color-preview color-preview-purple">Purple</div>
<div class="color-info">
<div class="color-name">Secondary Purple</div>
<div class="color-hex">#8E44AD</div>
</div>
</div>
<div class="color-item">
<div class="color-preview color-preview-violet">Violet</div>
<div class="color-info">
<div class="color-name">Accent Violet</div>
<div class="color-hex">#9B59B6</div>
</div>
</div>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">功能性色彩</h3>
<p class="demo-description">用於狀態提示和系統回饋的功能色彩</p>
<div class="color-palette">
<div class="color-item">
<div class="color-preview color-preview-success">Success</div>
<div class="color-info">
<div class="color-name">Success Green</div>
<div class="color-hex">#27AE60</div>
</div>
</div>
<div class="color-item">
<div class="color-preview color-preview-warning">Warning</div>
<div class="color-info">
<div class="color-name">Warning Yellow</div>
<div class="color-hex">#F39C12</div>
</div>
</div>
<div class="color-item">
<div class="color-preview color-preview-error">Error</div>
<div class="color-info">
<div class="color-name">Error Red</div>
<div class="color-hex">#E74C3C</div>
</div>
</div>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">遊戲化色彩</h3>
<p class="demo-description">用於等級、成就和遊戲化元素的特殊色彩</p>
<div class="color-palette">
<div class="color-item">
<div class="color-preview color-preview-gold">Gold</div>
<div class="color-info">
<div class="color-name">Gold</div>
<div class="color-hex">#FFD700</div>
</div>
</div>
<div class="color-item">
<div class="color-preview color-preview-star">Star</div>
<div class="color-info">
<div class="color-name">Star Active</div>
<div class="color-hex">#F1C40F</div>
</div>
</div>
<div class="color-item">
<div class="color-preview color-preview-glow">Glow</div>
<div class="color-info">
<div class="color-name">Achievement Glow</div>
<div class="color-hex">#F39C12</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Typography -->
<section class="section">
<h2 class="section-title">
<span>📝</span>
<span>字體排版</span>
</h2>
<div class="demo-grid">
<div class="demo-item">
<h3 class="demo-title">標題階層</h3>
<p class="demo-description">從大型標題到小標籤的完整字體階層系統</p>
<div class="typography-demo">
<div class="typography-item">
<div class="typography-label">text-4xl (42px)</div>
<div class="text-4xl font-extrabold">主要標題</div>
</div>
<div class="typography-item">
<div class="typography-label">text-2xl (28px)</div>
<div class="text-2xl font-bold">頁面標題</div>
</div>
<div class="typography-item">
<div class="typography-label">text-xl (22px)</div>
<div class="text-xl font-semibold">卡片標題</div>
</div>
<div class="typography-item">
<div class="typography-label">text-base (16px)</div>
<div class="text-base">正文內容</div>
</div>
<div class="typography-item">
<div class="typography-label">text-sm (13px)</div>
<div class="text-sm text-secondary">輔助資訊</div>
</div>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">字重變化</h3>
<p class="demo-description">不同字重用於建立視覺層次和重要性</p>
<div class="typography-demo">
<div class="typography-item">
<div class="typography-label">font-normal (400)</div>
<div class="font-normal">一般文字內容</div>
</div>
<div class="typography-item">
<div class="typography-label">font-medium (500)</div>
<div class="font-medium">中等重要內容</div>
</div>
<div class="typography-item">
<div class="typography-label">font-semibold (600)</div>
<div class="font-semibold">重要標籤</div>
</div>
<div class="typography-item">
<div class="typography-label">font-bold (700)</div>
<div class="font-bold">標題和強調</div>
</div>
<div class="typography-item">
<div class="typography-label">font-extrabold (800)</div>
<div class="font-extrabold">數字和主標題</div>
</div>
</div>
</div>
</div>
</section>
<!-- Button Components -->
<section class="section">
<h2 class="section-title">
<span>🔘</span>
<span>按鈕組件</span>
</h2>
<div class="demo-grid">
<div class="demo-item">
<h3 class="demo-title">按鈕變體</h3>
<p class="demo-description">不同用途和重要性的按鈕樣式</p>
<div class="component-demo">
<button class="btn-primary">主要按鈕</button>
<button class="btn-secondary">次要按鈕</button>
<button class="btn-danger">危險操作</button>
<button class="btn-reply-help">回覆輔助</button>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">按鈕尺寸</h3>
<p class="demo-description">適應不同界面需求的按鈕尺寸變體</p>
<div class="component-demo">
<button class="btn-primary btn-lg">大型按鈕</button>
<button class="btn-primary">標準按鈕</button>
<button class="btn-primary btn-sm">小型按鈕</button>
<button class="btn-primary btn-xs">迷你按鈕</button>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">圖標按鈕</h3>
<p class="demo-description">簡潔的圖標按鈕,用於工具欄和快捷操作</p>
<div class="component-demo">
<button class="btn-primary btn-icon">🎤</button>
<button class="btn-secondary btn-icon">⚙️</button>
<button class="btn-danger btn-icon">🗑️</button>
<button class="btn-primary btn-icon btn-icon-sm">❤️</button>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">按鈕狀態</h3>
<p class="demo-description">按鈕的不同互動狀態展示</p>
<div class="component-demo">
<button class="btn-primary">正常狀態</button>
<button class="btn-primary demo-hover-effect">懸停狀態</button>
<button class="btn-primary" disabled>禁用狀態</button>
</div>
</div>
</div>
</section>
<!-- Card Components -->
<section class="section">
<h2 class="section-title">
<span>🃏</span>
<span>卡片組件</span>
</h2>
<div class="demo-grid">
<div class="demo-item">
<h3 class="demo-title">基礎卡片</h3>
<p class="demo-description">標準的內容容器,具備圓角和陰影</p>
<div class="card">
<div class="card-header">
<h4 class="card-title">卡片標題</h4>
<p class="card-subtitle">卡片副標題</p>
</div>
<p>這是一個標準卡片的內容區域。卡片提供了清晰的內容分組和視覺層次。</p>
<div class="card-actions">
<button class="btn-secondary btn-sm">取消</button>
<button class="btn-primary btn-sm">確認</button>
</div>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">遊戲化卡片</h3>
<p class="demo-description">具備遊戲化元素的特殊卡片樣式</p>
<div class="card-game">
<div class="card-header">
<h4 class="card-title">學習進度</h4>
<p class="card-subtitle">今日任務完成情況</p>
</div>
<div class="flex items-center gap-4 mb-4">
<div class="avatar-md avatar-user">👤</div>
<div class="flex-1">
<div class="progress mb-2">
<div class="progress-bar progress-xp w-75"></div>
</div>
<div class="text-sm">75% 完成</div>
</div>
</div>
<div class="card-actions">
<button class="btn-primary btn-sm">繼續學習</button>
</div>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">成就卡片</h3>
<p class="demo-description">突出顯示用戶成就和里程碑</p>
<div class="card-achievement">
<div class="card-header">
<h4 class="card-title">🏆 新成就解鎖!</h4>
<p class="card-subtitle">連續學習 7 天</p>
</div>
<p>恭喜!您已經連續學習 7 天,獲得「堅持不懈」成就徽章。</p>
<div class="star-rating mt-4">
<span class="star active"></span>
<span class="star active"></span>
<span class="star active"></span>
<span class="star active"></span>
<span class="star active"></span>
</div>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">進度卡片</h3>
<p class="demo-description">展示學習進度和統計數據</p>
<div class="card-progress">
<div class="card-header">
<h4 class="card-title">本週學習統計</h4>
<p class="card-subtitle">2024年第12週</p>
</div>
<div class="flex justify-between items-center mb-4">
<div class="text-center">
<div class="text-2xl font-bold">142</div>
<div class="text-sm">學習天數</div>
</div>
<div class="text-center">
<div class="text-2xl font-bold">86%</div>
<div class="text-sm">完成率</div>
</div>
<div class="text-center">
<div class="text-2xl font-bold">2.4k</div>
<div class="text-sm">經驗值</div>
</div>
</div>
<div class="progress">
<div class="progress-bar w-86"></div>
</div>
</div>
</div>
</div>
</section>
<!-- Form Components -->
<section class="section">
<h2 class="section-title">
<span>📋</span>
<span>表單組件</span>
</h2>
<div class="demo-grid">
<div class="demo-item">
<h3 class="demo-title">輸入框</h3>
<p class="demo-description">不同狀態的文字輸入框</p>
<div class="component-demo">
<div class="input-group">
<label class="input-label">用戶名稱</label>
<input type="text" class="input-field" placeholder="請輸入用戶名稱">
<div class="input-help">用戶名稱必須是唯一的</div>
</div>
<div class="input-group">
<label class="input-label">電子郵件</label>
<input type="email" class="input-field input-success" value="user@example.com">
<div class="input-help text-success">✓ 電子郵件格式正確</div>
</div>
<div class="input-group">
<label class="input-label">密碼</label>
<input type="password" class="input-field input-error">
<div class="input-help text-error">✗ 密碼長度不足 8 個字符</div>
</div>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">徽章組件</h3>
<p class="demo-description">用於標記狀態和分類的小型標籤</p>
<div class="component-demo">
<div class="flex gap-2 mb-4">
<span class="badge badge-primary">主要</span>
<span class="badge badge-secondary">次要</span>
<span class="badge badge-success">成功</span>
<span class="badge badge-warning">警告</span>
<span class="badge badge-danger">錯誤</span>
</div>
<div class="flex gap-2">
<span class="badge-level">Lv.15</span>
<span class="badge badge-primary">新手</span>
<span class="badge badge-success">已驗證</span>
</div>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">進度條</h3>
<p class="demo-description">視覺化顯示進度和完成度</p>
<div class="component-demo">
<div class="mb-4">
<div class="flex justify-between mb-2">
<span>學習進度</span>
<span>75%</span>
</div>
<div class="progress">
<div class="progress-bar w-75"></div>
</div>
</div>
<div class="mb-4">
<div class="flex justify-between mb-2">
<span>經驗值</span>
<span>2,400 / 3,000</span>
</div>
<div class="progress">
<div class="progress-bar progress-xp w-80"></div>
</div>
</div>
<div>
<div class="flex justify-between mb-2">
<span>等級進度</span>
<span>Lv.15 → Lv.16</span>
</div>
<div class="progress">
<div class="progress-bar progress-level w-45"></div>
</div>
</div>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">頭像組件</h3>
<p class="demo-description">不同尺寸和類型的用戶頭像</p>
<div class="component-demo">
<div class="flex items-center gap-4 mb-4">
<div class="avatar-xl avatar-user">👤</div>
<div class="avatar-lg avatar-ai">🤖</div>
<div class="avatar-md avatar-achievement">🏆</div>
<div class="avatar-sm avatar-user">😊</div>
</div>
<div class="text-sm text-secondary">
從左到右:特大、大、中、小尺寸
</div>
</div>
</div>
</div>
</section>
<!-- Interactive Components -->
<section class="section">
<h2 class="section-title">
<span></span>
<span>互動組件</span>
</h2>
<div class="demo-grid">
<div class="demo-item">
<h3 class="demo-title">星級評分</h3>
<p class="demo-description">互動式星級評分組件</p>
<div class="interactive-demo">
<div class="star-rating mb-4" id="starRating">
<span class="star" data-rating="1"></span>
<span class="star" data-rating="2"></span>
<span class="star" data-rating="3"></span>
<span class="star" data-rating="4"></span>
<span class="star" data-rating="5"></span>
</div>
<div class="text-sm text-secondary">點擊星星來評分</div>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">通知提示</h3>
<p class="demo-description">不同類型的通知和提示訊息</p>
<div class="interactive-demo">
<div class="toast-demo-area" id="toastArea">
點擊下方按鈕查看通知效果
</div>
<div class="demo-controls">
<button class="btn-primary btn-sm" onclick="showToast('success')">成功通知</button>
<button class="btn-danger btn-sm" onclick="showToast('error')">錯誤通知</button>
<button class="btn-secondary btn-sm" onclick="showToast('warning')">警告通知</button>
<button class="btn-primary btn-sm" onclick="showToast('info')">資訊通知</button>
</div>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">模態框</h3>
<p class="demo-description">彈出式對話框和確認視窗</p>
<div class="interactive-demo">
<button class="btn-primary" onclick="showModal()">打開模態框</button>
<div class="text-sm text-secondary mt-4">
點擊按鈕查看模態框效果
</div>
</div>
</div>
<div class="demo-item">
<h3 class="demo-title">特殊效果</h3>
<p class="demo-description">玻璃形態效果和發光效果</p>
<div class="interactive-demo">
<div class="glass p-4 rounded-xl mb-4">
<h4 class="font-semibold mb-2">玻璃形態卡片</h4>
<p class="text-sm text-secondary">半透明的毛玻璃效果</p>
</div>
<div class="card glow-teal">
<h4 class="font-semibold mb-2">青色發光效果</h4>
<p class="text-sm text-secondary">適用於重要提示和強調內容</p>
</div>
</div>
</div>
</div>
</section>
</div>
<!-- Toast Template -->
<div id="toastTemplate" class="toast hidden">
<div class="toast-content">通知內容</div>
</div>
<!-- Modal Template -->
<div id="modalOverlay" class="modal-overlay">
<div class="modal">
<div class="modal-header">
<h3 class="modal-title">確認操作</h3>
<p class="modal-subtitle">您確定要執行此操作嗎?</p>
</div>
<p class="mb-6 text-center">此操作無法撤銷,請確認您的選擇。</p>
<div class="flex gap-4">
<button class="btn-secondary flex-1" onclick="hideModal()">取消</button>
<button class="btn-primary flex-1" onclick="hideModal()">確認</button>
</div>
</div>
</div>
<script>
// Star Rating Interaction
document.getElementById('starRating').addEventListener('click', function(e) {
if (e.target.classList.contains('star')) {
const rating = parseInt(e.target.dataset.rating);
const stars = this.querySelectorAll('.star');
stars.forEach((star, index) => {
if (index < rating) {
star.classList.add('active');
} else {
star.classList.remove('active');
}
});
}
});
// Toast Notifications
function showToast(type) {
const messages = {
success: '操作成功完成!',
error: '發生錯誤,請重試',
warning: '請注意相關設定',
info: '這是一個資訊提示'
};
const toast = document.createElement('div');
toast.className = `toast toast-${type} show`;
toast.textContent = messages[type];
document.body.appendChild(toast);
setTimeout(() => {
toast.classList.remove('show');
setTimeout(() => {
document.body.removeChild(toast);
}, 300);
}, 3000);
}
// Modal Management
function showModal() {
document.getElementById('modalOverlay').classList.add('show');
}
function hideModal() {
document.getElementById('modalOverlay').classList.remove('show');
}
// Close modal when clicking overlay
document.getElementById('modalOverlay').addEventListener('click', function(e) {
if (e.target === this) {
hideModal();
}
});
// Add some interactive animations
document.addEventListener('DOMContentLoaded', function() {
// Animate progress bars
const progressBars = document.querySelectorAll('.progress-bar');
progressBars.forEach(bar => {
const width = bar.style.width;
bar.style.width = '0%';
setTimeout(() => {
bar.style.width = width;
}, 500);
});
// Add hover effects to cards
const cards = document.querySelectorAll('.card, .demo-item');
cards.forEach(card => {
card.addEventListener('mouseenter', function() {
this.style.transform = 'translateY(-2px)';
});
card.addEventListener('mouseleave', function() {
this.style.transform = 'translateY(0)';
});
});
});
</script>
</body>
</html>