|
<!DOCTYPE html>
|
|
<html lang="ja">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>LINE風 Redmineテーマ</title>
|
|
<style>
|
|
/* ベースとなる変数 */
|
|
:root {
|
|
--line-primary: #06C755;
|
|
--line-secondary: #1E1E1E;
|
|
--line-background: #F1F1F4;
|
|
--line-light-gray: #E8EAED;
|
|
--line-mid-gray: #D8D8DD;
|
|
--line-dark-gray: #8E8E93;
|
|
--line-white: #FFFFFF;
|
|
--line-panel-bg: #F8F8FA;
|
|
--line-sidebar-bg: #F1F2F4;
|
|
--line-active-item: #E1F7E8;
|
|
--line-border: #DCDCE0;
|
|
|
|
--border-radius-small: 6px;
|
|
--border-radius-medium: 10px;
|
|
--border-radius-large: 14px;
|
|
|
|
--shadow-small: 0 1px 3px rgba(0,0,0,0.1);
|
|
--shadow-medium: 0 4px 6px rgba(0,0,0,0.08);
|
|
}
|
|
|
|
/* リセット */
|
|
* {
|
|
margin: 0;
|
|
padding: 0;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
body {
|
|
font-family: 'Noto Sans JP', sans-serif;
|
|
background-color: var(--line-background);
|
|
color: var(--line-secondary);
|
|
line-height: 1.5;
|
|
font-size: 14px;
|
|
height: 100vh;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
/* レイアウト */
|
|
.layout {
|
|
display: flex;
|
|
height: calc(100vh - 56px);
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* ヘッダー */
|
|
header {
|
|
background-color: var(--line-panel-bg);
|
|
height: 56px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 0 16px;
|
|
border-bottom: 1px solid var(--line-border);
|
|
box-shadow: var(--shadow-small);
|
|
}
|
|
|
|
.logo {
|
|
display: flex;
|
|
align-items: center;
|
|
font-weight: 600;
|
|
font-size: 16px;
|
|
}
|
|
|
|
.logo img {
|
|
width: 28px;
|
|
height: 28px;
|
|
margin-right: 10px;
|
|
}
|
|
|
|
.search-box {
|
|
position: relative;
|
|
}
|
|
|
|
.search-box input {
|
|
background-color: var(--line-light-gray);
|
|
border: none;
|
|
border-radius: var(--border-radius-medium);
|
|
padding: 10px 12px 10px 36px;
|
|
width: 220px;
|
|
font-size: 14px;
|
|
}
|
|
|
|
.search-box::before {
|
|
content: "⚲";
|
|
position: absolute;
|
|
left: 12px;
|
|
top: 50%;
|
|
transform: translateY(-50%);
|
|
color: var(--line-dark-gray);
|
|
font-size: 16px;
|
|
}
|
|
|
|
.user-avatar {
|
|
width: 34px;
|
|
height: 34px;
|
|
border-radius: 50%;
|
|
background-color: var(--line-primary);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
color: var(--line-white);
|
|
font-weight: bold;
|
|
}
|
|
|
|
/* サイドバー */
|
|
.sidebar {
|
|
display: flex;
|
|
height: 100%;
|
|
}
|
|
|
|
.icon-bar {
|
|
width: 56px;
|
|
background-color: var(--line-sidebar-bg);
|
|
height: 100%;
|
|
padding: 10px 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
border-right: 1px solid var(--line-border);
|
|
}
|
|
|
|
.icon-item {
|
|
height: 40px;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
margin: 5px 8px;
|
|
border-radius: var(--border-radius-small);
|
|
color: var(--line-dark-gray);
|
|
cursor: pointer;
|
|
}
|
|
|
|
.icon-item.active {
|
|
background-color: var(--line-active-item);
|
|
color: var(--line-primary);
|
|
}
|
|
|
|
.icon-item:hover {
|
|
background-color: var(--line-light-gray);
|
|
}
|
|
|
|
.extended-sidebar {
|
|
width: 220px;
|
|
background-color: var(--line-sidebar-bg);
|
|
height: 100%;
|
|
border-right: 1px solid var(--line-border);
|
|
padding: 10px 0;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.sidebar-section {
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.sidebar-title {
|
|
padding: 5px 15px;
|
|
font-size: 12px;
|
|
font-weight: 600;
|
|
color: var(--line-dark-gray);
|
|
}
|
|
|
|
.sidebar-item {
|
|
padding: 8px 15px;
|
|
margin: 2px 8px;
|
|
display: flex;
|
|
align-items: center;
|
|
cursor: pointer;
|
|
border-radius: var(--border-radius-small);
|
|
}
|
|
|
|
.sidebar-item.active {
|
|
background-color: var(--line-active-item);
|
|
color: var(--line-primary);
|
|
font-weight: 500;
|
|
}
|
|
|
|
.sidebar-item:hover {
|
|
background-color: var(--line-light-gray);
|
|
}
|
|
|
|
.sidebar-item i {
|
|
margin-right: 10px;
|
|
}
|
|
|
|
/* メインコンテンツ */
|
|
.main-content {
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.tab-bar {
|
|
background-color: var(--line-panel-bg);
|
|
height: 48px;
|
|
padding: 0 10px;
|
|
display: flex;
|
|
align-items: center;
|
|
border-bottom: 1px solid var(--line-border);
|
|
overflow-x: auto;
|
|
}
|
|
|
|
.tab {
|
|
display: flex;
|
|
align-items: center;
|
|
height: 36px;
|
|
padding: 0 15px;
|
|
margin-right: 8px;
|
|
background-color: var(--line-light-gray);
|
|
border-radius: var(--border-radius-medium);
|
|
cursor: pointer;
|
|
border: 1px solid var(--line-mid-gray);
|
|
min-width: 120px;
|
|
}
|
|
|
|
.tab.active {
|
|
background-color: var(--line-active-item);
|
|
color: var(--line-primary);
|
|
font-weight: 500;
|
|
}
|
|
|
|
.tab i {
|
|
margin-right: 8px;
|
|
}
|
|
|
|
.tab-close {
|
|
margin-left: auto;
|
|
width: 16px;
|
|
height: 16px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
border-radius: 50%;
|
|
color: var(--line-dark-gray);
|
|
font-size: 14px;
|
|
}
|
|
|
|
/* コンテンツエリア */
|
|
.content-area {
|
|
flex: 1;
|
|
padding: 20px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.content-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.content-title {
|
|
font-size: 24px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.button {
|
|
background-color: var(--line-primary);
|
|
color: white;
|
|
border: none;
|
|
border-radius: var(--border-radius-medium);
|
|
padding: 10px 16px;
|
|
font-weight: 500;
|
|
cursor: pointer;
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
.button i {
|
|
margin-right: 8px;
|
|
}
|
|
|
|
/* プロジェクトカード */
|
|
.project-card {
|
|
background-color: var(--line-white);
|
|
border-radius: var(--border-radius-large);
|
|
overflow: hidden;
|
|
margin-bottom: 20px;
|
|
box-shadow: var(--shadow-medium);
|
|
border: 1px solid var(--line-mid-gray);
|
|
}
|
|
|
|
.project-header {
|
|
padding: 15px 20px;
|
|
background-color: var(--line-active-item);
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
border-bottom: 1px solid var(--line-mid-gray);
|
|
}
|
|
|
|
.project-title {
|
|
font-weight: 600;
|
|
font-size: 18px;
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
.project-title i {
|
|
margin-right: 10px;
|
|
color: var(--line-primary);
|
|
}
|
|
|
|
.project-actions {
|
|
display: flex;
|
|
gap: 10px;
|
|
}
|
|
|
|
.button-outline {
|
|
background-color: white;
|
|
color: var(--line-secondary);
|
|
border: 1px solid var(--line-mid-gray);
|
|
border-radius: var(--border-radius-medium);
|
|
padding: 8px 12px;
|
|
font-weight: 500;
|
|
cursor: pointer;
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
.button-outline i {
|
|
margin-right: 8px;
|
|
}
|
|
|
|
.project-body {
|
|
padding: 20px;
|
|
}
|
|
|
|
.project-stats {
|
|
display: flex;
|
|
gap: 15px;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.stat-box {
|
|
flex: 1;
|
|
background-color: var(--line-light-gray);
|
|
border-radius: var(--border-radius-medium);
|
|
padding: 15px;
|
|
text-align: center;
|
|
}
|
|
|
|
.stat-value {
|
|
font-size: 24px;
|
|
font-weight: 600;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.stat-label {
|
|
font-size: 13px;
|
|
color: var(--line-dark-gray);
|
|
}
|
|
|
|
.progress-bar {
|
|
height: 8px;
|
|
background-color: var(--line-light-gray);
|
|
border-radius: 4px;
|
|
margin: 10px 0 20px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.progress-value {
|
|
height: 100%;
|
|
background-color: var(--line-primary);
|
|
width: 65%;
|
|
}
|
|
|
|
.activity-list {
|
|
margin-top: 15px;
|
|
}
|
|
|
|
.activity-item {
|
|
display: flex;
|
|
padding: 12px;
|
|
background-color: var(--line-light-gray);
|
|
border-radius: var(--border-radius-medium);
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.activity-icon {
|
|
width: 32px;
|
|
height: 32px;
|
|
border-radius: 50%;
|
|
background-color: var(--line-primary);
|
|
color: white;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
margin-right: 12px;
|
|
}
|
|
|
|
.activity-content {
|
|
flex: 1;
|
|
}
|
|
|
|
.activity-title {
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.activity-time {
|
|
font-size: 12px;
|
|
color: var(--line-dark-gray);
|
|
}
|
|
|
|
/* フッター */
|
|
.footer-bar {
|
|
background-color: var(--line-panel-bg);
|
|
height: 36px;
|
|
display: flex;
|
|
align-items: center;
|
|
border-top: 1px solid var(--line-border);
|
|
padding: 0 10px;
|
|
}
|
|
|
|
.footer-tab {
|
|
display: flex;
|
|
align-items: center;
|
|
font-size: 13px;
|
|
padding: 0 15px;
|
|
height: 28px;
|
|
margin-right: 5px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.footer-tab.active {
|
|
background-color: var(--line-active-item);
|
|
color: var(--line-primary);
|
|
}
|
|
|
|
.footer-tab i {
|
|
margin-right: 5px;
|
|
font-size: 14px;
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.extended-sidebar {
|
|
display: none;
|
|
}
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<!-- ヘッダー -->
|
|
<header>
|
|
<div class="logo">
|
|
<img src="/api/placeholder/28/28" alt="LINE Redmine">
|
|
<span>LINE Redmine</span>
|
|
</div>
|
|
|
|
<div class="search-box">
|
|
<input type="text" placeholder="検索...">
|
|
</div>
|
|
|
|
<div class="user-avatar">U</div>
|
|
</header>
|
|
|
|
<!-- メインレイアウト -->
|
|
<div class="layout">
|
|
<!-- サイドバー -->
|
|
<div class="sidebar">
|
|
<!-- アイコンバー -->
|
|
<div class="icon-bar">
|
|
<div class="icon-item active">H</div>
|
|
<div class="icon-item">P</div>
|
|
<div class="icon-item">T</div>
|
|
<div class="icon-item">S</div>
|
|
<div class="icon-item">?</div>
|
|
</div>
|
|
|
|
<!-- 拡張サイドバー -->
|
|
<div class="extended-sidebar">
|
|
<div class="sidebar-section">
|
|
<div class="sidebar-title">Redmine</div>
|
|
<div class="sidebar-item active"><i>H</i> ホーム</div>
|
|
<div class="sidebar-item"><i>M</i> マイページ</div>
|
|
<div class="sidebar-item"><i>P</i> プロジェクト</div>
|
|
<div class="sidebar-item"><i>A</i> 管理</div>
|
|
<div class="sidebar-item"><i>?</i> ヘルプ</div>
|
|
</div>
|
|
|
|
<div class="sidebar-section">
|
|
<div class="sidebar-title">プロジェクト</div>
|
|
<div class="sidebar-item"><i>D</i> LINEデザインシステム</div>
|
|
<div class="sidebar-item"><i>M</i> モバイルアプリ</div>
|
|
<div class="sidebar-item"><i>A</i> 認証システム</div>
|
|
<div class="sidebar-item"><i>I</i> API開発</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- メインコンテンツ -->
|
|
<div class="main-content">
|
|
<!-- タブバー -->
|
|
<div class="tab-bar">
|
|
<div class="tab active">
|
|
<i>H</i>
|
|
<span>ダッシュボード</span>
|
|
<div class="tab-close">×</div>
|
|
</div>
|
|
<div class="tab">
|
|
<i>P</i>
|
|
<span>プロジェクト</span>
|
|
<div class="tab-close">×</div>
|
|
</div>
|
|
<div class="tab">
|
|
<i>T</i>
|
|
<span>チケット #123</span>
|
|
<div class="tab-close">×</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- コンテンツエリア -->
|
|
<div class="content-area">
|
|
<div class="content-header">
|
|
<h1 class="content-title">ダッシュボード</h1>
|
|
<button class="button">
|
|
<i>+</i> 新規プロジェクト
|
|
</button>
|
|
</div>
|
|
|
|
<!-- プロジェクトカード -->
|
|
<div class="project-card">
|
|
<div class="project-header">
|
|
<div class="project-title">
|
|
<i>D</i> LINE デザインシステム
|
|
</div>
|
|
<div class="project-actions">
|
|
<button class="button-outline">
|
|
<i>+</i> チケット
|
|
</button>
|
|
<button class="button-outline">
|
|
<i>D</i> 詳細
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="project-body">
|
|
<div class="project-stats">
|
|
<div class="stat-box">
|
|
<div class="stat-value">24</div>
|
|
<div class="stat-label">全チケット</div>
|
|
</div>
|
|
<div class="stat-box">
|
|
<div class="stat-value">12</div>
|
|
<div class="stat-label">進行中</div>
|
|
</div>
|
|
<div class="stat-box">
|
|
<div class="stat-value">8</div>
|
|
<div class="stat-label">完了</div>
|
|
</div>
|
|
<div class="stat-box">
|
|
<div class="stat-value">4</div>
|
|
<div class="stat-label">未対応</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="progress-bar">
|
|
<div class="progress-value"></div>
|
|
</div>
|
|
|
|
<div class="activity-list">
|
|
<div class="activity-item">
|
|
<div class="activity-icon">E</div>
|
|
<div class="activity-content">
|
|
<div class="activity-title">
|
|
<strong>中村 優太</strong> が <a href="#">#123: ボタンスタイル</a> を更新しました
|
|
</div>
|
|
<div class="activity-time">20分前</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="activity-item">
|
|
<div class="activity-icon">C</div>
|
|
<div class="activity-content">
|
|
<div class="activity-title">
|
|
<strong>佐藤 春子</strong> が <a href="#">#123: ボタンスタイル</a> にコメントしました
|
|
</div>
|
|
<div class="activity-time">2時間前</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- もう一つのプロジェクトカード -->
|
|
<div class="project-card">
|
|
<div class="project-header">
|
|
<div class="project-title">
|
|
<i>M</i> モバイルアプリ
|
|
</div>
|
|
<div class="project-actions">
|
|
<button class="button-outline">
|
|
<i>+</i> チケット
|
|
</button>
|
|
<button class="button-outline">
|
|
<i>D</i> 詳細
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="project-body">
|
|
<div class="project-stats">
|
|
<div class="stat-box">
|
|
<div class="stat-value">42</div>
|
|
<div class="stat-label">全チケット</div>
|
|
</div>
|
|
<div class="stat-box">
|
|
<div class="stat-value">18</div>
|
|
<div class="stat-label">進行中</div>
|
|
</div>
|
|
<div class="stat-box">
|
|
<div class="stat-value">20</div>
|
|
<div class="stat-label">完了</div>
|
|
</div>
|
|
<div class="stat-box">
|
|
<div class="stat-value">4</div>
|
|
<div class="stat-label">未対応</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="progress-bar">
|
|
<div class="progress-value" style="width: 75%"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- フッターバー -->
|
|
<div class="footer-bar">
|
|
<div class="footer-tab active">
|
|
<i>i</i> 情報
|
|
</div>
|
|
<div class="footer-tab">
|
|
<i>!</i> 警告: 0
|
|
</div>
|
|
<div class="footer-tab">
|
|
<i>×</i> エラー: 0
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
// 簡単なインタラクション
|
|
document.querySelectorAll('.tab').forEach(tab => {
|
|
tab.addEventListener('click', function() {
|
|
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
|
|
this.classList.add('active');
|
|
});
|
|
});
|
|
|
|
document.querySelectorAll('.icon-item').forEach(item => {
|
|
item.addEventListener('click', function() {
|
|
document.querySelectorAll('.icon-item').forEach(i => i.classList.remove('active'));
|
|
this.classList.add('active');
|
|
});
|
|
});
|
|
|
|
document.querySelectorAll('.sidebar-item').forEach(item => {
|
|
item.addEventListener('click', function() {
|
|
document.querySelectorAll('.sidebar-item').forEach(i => i.classList.remove('active'));
|
|
this.classList.add('active');
|
|
});
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|