dramaling-vocab-learning/docs/02_design/component-library/index.html

631 lines
26 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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 設計元件庫</title>
<link rel="stylesheet" href="../design-system/tokens/design-tokens.css">
<link rel="stylesheet" href="assets/styles/base.css">
<link rel="stylesheet" href="assets/styles/components.css">
</head>
<body>
<div class="component-library-container">
<!-- 頂部導航 -->
<header class="library-header">
<div style="display: flex; align-items: center; gap: var(--space-3);">
<span style="font-size: var(--text-xl); color: var(--primary-teal);">🎨</span>
<h1 style="font-size: var(--text-xl); margin: 0; color: var(--text-primary);">
Drama Ling 設計元件庫
</h1>
<span class="badge badge-primary">v1.0</span>
</div>
<!-- 主題切換 -->
<div class="theme-toggle">
<button id="theme-dark" class="active" title="暗色主題">🌙</button>
<button id="theme-light" title="亮色主題">☀️</button>
</div>
</header>
<!-- 側邊欄導航 -->
<aside class="library-sidebar">
<nav>
<div class="nav-category">
<div class="nav-category-title">基礎元件</div>
<a href="#buttons" class="nav-link active">按鈕 Buttons</a>
<a href="#inputs" class="nav-link">輸入框 Inputs</a>
<a href="#cards" class="nav-link">卡片 Cards</a>
<a href="#alerts" class="nav-link">警告 Alerts</a>
</div>
<div class="nav-category">
<div class="nav-category-title">展示元件</div>
<a href="#badges" class="nav-link">徽章 Badges</a>
<a href="#progress" class="nav-link">進度條 Progress</a>
<a href="#loading" class="nav-link">載入 Loading</a>
</div>
<div class="nav-category">
<div class="nav-category-title">遊戲化元件</div>
<a href="#life-bar" class="nav-link">生命值 Life Bar</a>
<a href="#star-rating" class="nav-link">星級評分 Stars</a>
<a href="components/06-gamification/game-elements.html" class="nav-link">🎮 完整遊戲化元件</a>
</div>
<div class="nav-category">
<div class="nav-category-title">互動元件</div>
<a href="components/01-interactive/modals.html" class="nav-link">模態框 Modals</a>
<a href="components/02-input/forms.html" class="nav-link">📝 表單元件</a>
<a href="components/05-navigation/navigation.html" class="nav-link">🧭 導航元件</a>
</div>
<div class="nav-category">
<div class="nav-category-title">數據展示</div>
<a href="components/03-display/data-display.html" class="nav-link">📊 數據展示元件</a>
</div>
<div class="nav-category">
<div class="nav-category-title">頁面範例</div>
<a href="pages/login-page.html" class="nav-link">登入頁面</a>
<a href="pages/dashboard.html" class="nav-link">儀表板</a>
<a href="pages/learning-page.html" class="nav-link">學習頁面</a>
</div>
</nav>
</aside>
<!-- 主要內容區 -->
<main class="library-main">
<!-- 歡迎區塊 -->
<section class="component-section">
<h2 class="component-title">歡迎使用 Drama Ling 設計元件庫</h2>
<p class="component-description">
這是一個基於 HTML/CSS 的設計元件系統,取代傳統的 Figma 設計工具。
所有元件都可以直接複製使用,並已針對響應式設計和無障礙性進行優化。
</p>
<div class="alert alert-info">
<span class="alert-icon"></span>
<div class="alert-content">
<div class="alert-title">快速開始</div>
<div class="alert-message">
點擊左側導航選擇元件,每個元件都包含預覽效果和可複製的 HTML/CSS 代碼。
</div>
</div>
</div>
</section>
<!-- 按鈕元件 -->
<section id="buttons" class="component-section">
<h2 class="component-title">按鈕 Buttons</h2>
<p class="component-description">
提供多種樣式和尺寸的按鈕元件,支援主要、次要、成功、危險等狀態。
</p>
<!-- 基礎按鈕 -->
<h3 class="component-subtitle">基礎按鈕</h3>
<div class="component-showcase">
<div class="showcase-preview">
<button class="btn btn-primary">主要按鈕</button>
<button class="btn btn-secondary">次要按鈕</button>
<button class="btn btn-success">成功按鈕</button>
<button class="btn btn-danger">危險按鈕</button>
<button class="btn btn-text">文字按鈕</button>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;button class="btn btn-primary"&gt;主要按鈕&lt;/button&gt;
&lt;button class="btn btn-secondary"&gt;次要按鈕&lt;/button&gt;
&lt;button class="btn btn-success"&gt;成功按鈕&lt;/button&gt;
&lt;button class="btn btn-danger"&gt;危險按鈕&lt;/button&gt;
&lt;button class="btn btn-text"&gt;文字按鈕&lt;/button&gt;</code></pre>
</div>
</div>
<!-- 按鈕尺寸 -->
<h3 class="component-subtitle">按鈕尺寸</h3>
<div class="component-showcase">
<div class="showcase-preview">
<button class="btn btn-primary btn-sm">小按鈕</button>
<button class="btn btn-primary">標準按鈕</button>
<button class="btn btn-primary btn-lg">大按鈕</button>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;button class="btn btn-primary btn-sm"&gt;小按鈕&lt;/button&gt;
&lt;button class="btn btn-primary"&gt;標準按鈕&lt;/button&gt;
&lt;button class="btn btn-primary btn-lg"&gt;大按鈕&lt;/button&gt;</code></pre>
</div>
</div>
<!-- 按鈕狀態 -->
<h3 class="component-subtitle">按鈕狀態</h3>
<div class="component-showcase">
<div class="showcase-preview">
<button class="btn btn-primary">正常狀態</button>
<button class="btn btn-primary" disabled>禁用狀態</button>
<button class="btn btn-icon btn-primary">🎮</button>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;button class="btn btn-primary"&gt;正常狀態&lt;/button&gt;
&lt;button class="btn btn-primary" disabled&gt;禁用狀態&lt;/button&gt;
&lt;button class="btn btn-icon btn-primary"&gt;🎮&lt;/button&gt;</code></pre>
</div>
</div>
<!-- 按鈕群組 -->
<h3 class="component-subtitle">按鈕群組</h3>
<div class="component-showcase">
<div class="showcase-preview">
<div class="btn-group">
<button class="btn btn-primary"></button>
<button class="btn btn-primary"></button>
<button class="btn btn-primary"></button>
</div>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;div class="btn-group"&gt;
&lt;button class="btn btn-primary"&gt;&lt;/button&gt;
&lt;button class="btn btn-primary"&gt;&lt;/button&gt;
&lt;button class="btn btn-primary"&gt;&lt;/button&gt;
&lt;/div&gt;</code></pre>
</div>
</div>
</section>
<!-- 輸入框元件 -->
<section id="inputs" class="component-section">
<h2 class="component-title">輸入框 Input Fields</h2>
<p class="component-description">
提供文字輸入、密碼、搜尋等多種輸入框樣式,支援驗證狀態顯示。
</p>
<!-- 基礎輸入框 -->
<h3 class="component-subtitle">基礎輸入框</h3>
<div class="component-showcase">
<div class="showcase-preview" style="flex-direction: column; align-items: stretch;">
<div class="input-group">
<label class="input-label">使用者名稱</label>
<input type="text" class="input-field" placeholder="請輸入使用者名稱">
</div>
<div class="input-group">
<label class="input-label required">電子郵件</label>
<input type="email" class="input-field" placeholder="example@email.com">
<span class="input-hint">我們不會分享你的電子郵件</span>
</div>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;div class="input-group"&gt;
&lt;label class="input-label"&gt;使用者名稱&lt;/label&gt;
&lt;input type="text" class="input-field" placeholder="請輸入使用者名稱"&gt;
&lt;/div&gt;
&lt;div class="input-group"&gt;
&lt;label class="input-label required"&gt;電子郵件&lt;/label&gt;
&lt;input type="email" class="input-field" placeholder="example@email.com"&gt;
&lt;span class="input-hint"&gt;我們不會分享你的電子郵件&lt;/span&gt;
&lt;/div&gt;</code></pre>
</div>
</div>
<!-- 輸入狀態 -->
<h3 class="component-subtitle">輸入狀態</h3>
<div class="component-showcase">
<div class="showcase-preview" style="flex-direction: column; align-items: stretch;">
<div class="input-group">
<label class="input-label">成功狀態</label>
<input type="text" class="input-field success" value="正確的輸入">
</div>
<div class="input-group">
<label class="input-label">錯誤狀態</label>
<input type="text" class="input-field error" value="錯誤的輸入">
<span class="input-error">請輸入有效的內容</span>
</div>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;input type="text" class="input-field success" value="正確的輸入"&gt;
&lt;input type="text" class="input-field error" value="錯誤的輸入"&gt;
&lt;span class="input-error"&gt;請輸入有效的內容&lt;/span&gt;</code></pre>
</div>
</div>
</section>
<!-- 卡片元件 -->
<section id="cards" class="component-section">
<h2 class="component-title">卡片 Cards</h2>
<p class="component-description">
用於展示內容的容器元件,支援標題、內容、操作按鈕等。
</p>
<!-- 基礎卡片 -->
<h3 class="component-subtitle">基礎卡片</h3>
<div class="component-showcase">
<div class="showcase-preview">
<div class="card" style="max-width: 320px;">
<div class="card-header">
<h3 class="card-title">卡片標題</h3>
<div class="card-subtitle">副標題或描述</div>
</div>
<div class="card-body">
這是卡片的主要內容區域,可以放置任何內容。
</div>
<div class="card-footer">
<button class="btn btn-primary btn-sm">操作</button>
<button class="btn btn-text btn-sm">取消</button>
</div>
</div>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;div class="card"&gt;
&lt;div class="card-header"&gt;
&lt;h3 class="card-title"&gt;卡片標題&lt;/h3&gt;
&lt;div class="card-subtitle"&gt;副標題或描述&lt;/div&gt;
&lt;/div&gt;
&lt;div class="card-body"&gt;
這是卡片的主要內容區域,可以放置任何內容。
&lt;/div&gt;
&lt;div class="card-footer"&gt;
&lt;button class="btn btn-primary btn-sm"&gt;操作&lt;/button&gt;
&lt;button class="btn btn-text btn-sm"&gt;取消&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</code></pre>
</div>
</div>
<!-- 學習卡片 -->
<h3 class="component-subtitle">學習卡片</h3>
<div class="component-showcase">
<div class="showcase-preview">
<div class="card card-learning" style="max-width: 320px;">
<div class="card-header">
<h3 class="card-title">詞彙學習</h3>
<div class="badge badge-level">Level 3</div>
</div>
<div class="card-body">
今日學習了 15 個新詞彙,完成率 75%
</div>
<div class="card-progress">
<div class="progress-bar">
<div class="progress-fill" style="width: 75%"></div>
</div>
</div>
</div>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;div class="card card-learning"&gt;
&lt;div class="card-header"&gt;
&lt;h3 class="card-title"&gt;詞彙學習&lt;/h3&gt;
&lt;div class="badge badge-level"&gt;Level 3&lt;/div&gt;
&lt;/div&gt;
&lt;div class="card-body"&gt;
今日學習了 15 個新詞彙,完成率 75%
&lt;/div&gt;
&lt;div class="card-progress"&gt;
&lt;div class="progress-bar"&gt;
&lt;div class="progress-fill" style="width: 75%"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</code></pre>
</div>
</div>
</section>
<!-- 警告元件 -->
<section id="alerts" class="component-section">
<h2 class="component-title">警告 Alerts</h2>
<p class="component-description">
用於顯示重要訊息、警告或反饋的元件。
</p>
<div class="component-showcase">
<div class="showcase-preview" style="flex-direction: column; align-items: stretch;">
<div class="alert alert-success">
<span class="alert-icon"></span>
<div class="alert-content">
<div class="alert-title">成功!</div>
<div class="alert-message">你的操作已成功完成。</div>
</div>
<button class="alert-close"></button>
</div>
<div class="alert alert-error">
<span class="alert-icon"></span>
<div class="alert-content">
<div class="alert-title">錯誤</div>
<div class="alert-message">發生了錯誤,請稍後再試。</div>
</div>
<button class="alert-close"></button>
</div>
<div class="alert alert-warning">
<span class="alert-icon"></span>
<div class="alert-content">
<div class="alert-title">警告</div>
<div class="alert-message">請注意這個重要訊息。</div>
</div>
<button class="alert-close"></button>
</div>
<div class="alert alert-info">
<span class="alert-icon"></span>
<div class="alert-content">
<div class="alert-title">提示</div>
<div class="alert-message">這是一條有用的資訊。</div>
</div>
<button class="alert-close"></button>
</div>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;div class="alert alert-success"&gt;
&lt;span class="alert-icon"&gt;&lt;/span&gt;
&lt;div class="alert-content"&gt;
&lt;div class="alert-title"&gt;成功!&lt;/div&gt;
&lt;div class="alert-message"&gt;你的操作已成功完成。&lt;/div&gt;
&lt;/div&gt;
&lt;button class="alert-close"&gt;&lt;/button&gt;
&lt;/div&gt;</code></pre>
</div>
</div>
</section>
<!-- 徽章元件 -->
<section id="badges" class="component-section">
<h2 class="component-title">徽章 Badges</h2>
<p class="component-description">
用於標記狀態、分類或計數的小型元件。
</p>
<div class="component-showcase">
<div class="showcase-preview">
<span class="badge badge-primary">主要</span>
<span class="badge badge-secondary">次要</span>
<span class="badge badge-success">成功</span>
<span class="badge badge-danger">危險</span>
<span class="badge badge-warning">警告</span>
<span class="badge badge-info">資訊</span>
<span class="badge badge-level">Level 5</span>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;span class="badge badge-primary"&gt;主要&lt;/span&gt;
&lt;span class="badge badge-secondary"&gt;次要&lt;/span&gt;
&lt;span class="badge badge-success"&gt;成功&lt;/span&gt;
&lt;span class="badge badge-danger"&gt;危險&lt;/span&gt;
&lt;span class="badge badge-warning"&gt;警告&lt;/span&gt;
&lt;span class="badge badge-info"&gt;資訊&lt;/span&gt;
&lt;span class="badge badge-level"&gt;Level 5&lt;/span&gt;</code></pre>
</div>
</div>
</section>
<!-- 進度條元件 -->
<section id="progress" class="component-section">
<h2 class="component-title">進度條 Progress</h2>
<p class="component-description">
展示任務進度或載入狀態的視覺化元件。
</p>
<div class="component-showcase">
<div class="showcase-preview" style="flex-direction: column; align-items: stretch;">
<div>
<div style="margin-bottom: var(--space-2); color: var(--text-secondary); font-size: var(--text-sm);">基礎進度條 (60%)</div>
<div class="progress">
<div class="progress-bar" style="width: 60%"></div>
</div>
</div>
<div>
<div style="margin-bottom: var(--space-2); color: var(--text-secondary); font-size: var(--text-sm);">大型進度條 (40%)</div>
<div class="progress progress-lg">
<div class="progress-bar" style="width: 40%"></div>
</div>
</div>
<div>
<div style="margin-bottom: var(--space-2); color: var(--text-secondary); font-size: var(--text-sm);">條紋進度條 (80%)</div>
<div class="progress progress-striped">
<div class="progress-bar" style="width: 80%"></div>
</div>
</div>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;div class="progress"&gt;
&lt;div class="progress-bar" style="width: 60%"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="progress progress-lg"&gt;
&lt;div class="progress-bar" style="width: 40%"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="progress progress-striped"&gt;
&lt;div class="progress-bar" style="width: 80%"&gt;&lt;/div&gt;
&lt;/div&gt;</code></pre>
</div>
</div>
</section>
<!-- 載入元件 -->
<section id="loading" class="component-section">
<h2 class="component-title">載入 Loading</h2>
<p class="component-description">
顯示載入中狀態的動畫元件。
</p>
<div class="component-showcase">
<div class="showcase-preview">
<div class="spinner spinner-sm"></div>
<div class="spinner"></div>
<div class="spinner spinner-lg"></div>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;div class="spinner spinner-sm"&gt;&lt;/div&gt;
&lt;div class="spinner"&gt;&lt;/div&gt;
&lt;div class="spinner spinner-lg"&gt;&lt;/div&gt;</code></pre>
</div>
</div>
<h3 class="component-subtitle">骨架屏</h3>
<div class="component-showcase">
<div class="showcase-preview" style="flex-direction: column; align-items: stretch;">
<div class="skeleton skeleton-title"></div>
<div class="skeleton skeleton-text"></div>
<div class="skeleton skeleton-text"></div>
<div class="skeleton skeleton-text" style="width: 80%;"></div>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;div class="skeleton skeleton-title"&gt;&lt;/div&gt;
&lt;div class="skeleton skeleton-text"&gt;&lt;/div&gt;
&lt;div class="skeleton skeleton-text"&gt;&lt;/div&gt;
&lt;div class="skeleton skeleton-text" style="width: 80%;"&gt;&lt;/div&gt;</code></pre>
</div>
</div>
</section>
<!-- 生命值元件 -->
<section id="life-bar" class="component-section">
<h2 class="component-title">生命值 Life Bar</h2>
<p class="component-description">
遊戲化的生命值顯示元件。
</p>
<div class="component-showcase">
<div class="showcase-preview">
<div class="life-bar">
<span class="life-heart">❤️</span>
<span class="life-heart">❤️</span>
<span class="life-heart">❤️</span>
<span class="life-heart empty">❤️</span>
<span class="life-heart empty">❤️</span>
</div>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;div class="life-bar"&gt;
&lt;span class="life-heart"&gt;❤️&lt;/span&gt;
&lt;span class="life-heart"&gt;❤️&lt;/span&gt;
&lt;span class="life-heart"&gt;❤️&lt;/span&gt;
&lt;span class="life-heart empty"&gt;❤️&lt;/span&gt;
&lt;span class="life-heart empty"&gt;❤️&lt;/span&gt;
&lt;/div&gt;</code></pre>
</div>
</div>
</section>
<!-- 星級評分元件 -->
<section id="star-rating" class="component-section">
<h2 class="component-title">星級評分 Star Rating</h2>
<p class="component-description">
用於評分或展示等級的星星元件。
</p>
<div class="component-showcase">
<div class="showcase-preview">
<div class="star-rating">
<span class="star active"></span>
<span class="star active"></span>
<span class="star active"></span>
<span class="star active"></span>
<span class="star"></span>
</div>
</div>
<div class="showcase-code">
<button class="copy-button" onclick="copyCode(this)">複製</button>
<pre><code>&lt;div class="star-rating"&gt;
&lt;span class="star active"&gt;&lt;/span&gt;
&lt;span class="star active"&gt;&lt;/span&gt;
&lt;span class="star active"&gt;&lt;/span&gt;
&lt;span class="star active"&gt;&lt;/span&gt;
&lt;span class="star"&gt;&lt;/span&gt;
&lt;/div&gt;</code></pre>
</div>
</div>
</section>
</main>
</div>
<script>
// 主題切換
document.getElementById('theme-dark').addEventListener('click', function() {
document.body.classList.remove('light-theme');
document.getElementById('theme-dark').classList.add('active');
document.getElementById('theme-light').classList.remove('active');
});
document.getElementById('theme-light').addEventListener('click', function() {
document.body.classList.add('light-theme');
document.getElementById('theme-light').classList.add('active');
document.getElementById('theme-dark').classList.remove('active');
});
// 複製代碼功能
function copyCode(button) {
const codeBlock = button.nextElementSibling.querySelector('code');
const textArea = document.createElement('textarea');
textArea.value = codeBlock.textContent;
document.body.appendChild(textArea);
textArea.select();
document.execCommand('copy');
document.body.removeChild(textArea);
button.textContent = '已複製!';
button.classList.add('copied');
setTimeout(() => {
button.textContent = '複製';
button.classList.remove('copied');
}, 2000);
}
// 導航高亮
document.querySelectorAll('.nav-link').forEach(link => {
link.addEventListener('click', function(e) {
if (this.getAttribute('href').startsWith('#')) {
e.preventDefault();
document.querySelectorAll('.nav-link').forEach(l => l.classList.remove('active'));
this.classList.add('active');
const targetId = this.getAttribute('href');
const targetElement = document.querySelector(targetId);
if (targetElement) {
targetElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
}
});
});
// 監聽滾動以更新導航高亮
const sections = document.querySelectorAll('section[id]');
const navLinks = document.querySelectorAll('.nav-link[href^="#"]');
window.addEventListener('scroll', () => {
let current = '';
sections.forEach(section => {
const sectionTop = section.offsetTop;
const sectionHeight = section.clientHeight;
if (pageYOffset >= sectionTop - 100) {
current = section.getAttribute('id');
}
});
navLinks.forEach(link => {
link.classList.remove('active');
if (link.getAttribute('href') === '#' + current) {
link.classList.add('active');
}
});
});
</script>
</body>
</html>