UNPKG

branch-commit-compare

Version:
638 lines (538 loc) 12.6 kB
/** * Layout Styles 布局样式 * Playful Geometric Design System - Layout Components */ /* ========== Container 容器 ========== */ .container { max-width: 1280px; margin: 0 auto; background: var(--color-card); border-radius: var(--radius-xl); border: var(--border-width) solid var(--color-fg); box-shadow: var(--shadow-card); padding: var(--spacing-8); } /* ========== Header 头部 ========== */ .header { margin-bottom: var(--spacing-8); padding-bottom: var(--spacing-6); display: flex; justify-content: space-between; align-items: flex-start; flex-wrap: wrap; gap: var(--spacing-6); border-bottom: 3px dashed var(--color-border); } .header h1 { margin: 0 0 var(--spacing-4) 0; color: var(--color-fg); font-family: var(--font-display); font-size: var(--font-size-4xl); font-weight: var(--font-weight-extrabold); letter-spacing: -0.02em; position: relative; display: inline-block; } .meta-info { color: var(--color-muted); font-size: var(--font-size-sm); line-height: 1.8; font-weight: var(--font-weight-medium); } .meta-info > div { margin-bottom: var(--spacing-2); } /* ========== Legend 图例 ========== */ .timeline-legend { display: flex; justify-content: flex-start; flex-wrap: wrap; gap: var(--spacing-4); margin-top: var(--spacing-5); } .legend-item { display: inline-flex; align-items: center; background: var(--color-bg); padding: var(--spacing-1) var(--spacing-3); border-radius: var(--radius-full); box-shadow: var(--shadow-extruded-small); font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); color: var(--color-fg); transition: all var(--transition-base); min-height: 36px; } .legend-item:hover { transform: translateY(-2px); box-shadow: 8px 8px 16px rgba(163, 177, 198, 0.5), -8px -8px 16px rgba(255, 255, 255, 0.8); } .legend-dot { width: 12px; height: 12px; border-radius: 50%; margin-right: var(--spacing-2); display: inline-block; box-shadow: inset 2px 2px 4px rgba(163, 177, 198, 0.3), inset -2px -2px 4px rgba(255, 255, 255, 0.5); } .legend-dot.source { background-color: var(--color-success); } .legend-dot.target { background-color: var(--color-warning); } .legend-dot.both { background-color: var(--color-info); } /* ========== Theme Switcher 主题切换器 ========== */ .theme-switcher { display: flex; align-items: center; background: var(--color-bg); border-radius: var(--radius-full); padding: var(--spacing-1); box-shadow: var(--shadow-inset); gap: var(--spacing-1); } .theme-button { border: none; background: transparent; color: var(--color-muted); padding: var(--spacing-2) var(--spacing-4); border-radius: var(--radius-full); cursor: pointer; font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold); display: flex; align-items: center; gap: var(--spacing-2); transition: all var(--transition-base); min-height: 36px; white-space: nowrap; } .theme-button:hover:not(.active) { color: var(--color-fg); } .theme-button.active { background: var(--color-accent); color: white; box-shadow: var(--shadow-extruded-small); } .theme-button .layout-icon { font-size: var(--font-size-base); } /* ========== Timeline 时间线 ========== */ .timeline { position: relative; display: flex; flex-direction: column; padding: var(--spacing-4) 0; width: 100%; } .commit-row { display: flex; margin-bottom: var(--spacing-4); position: relative; width: 100%; } /* 只在首次加载时播放动画 */ .commit-row.initial-load { animation: popIn 0.5s cubic-bezier(0.34, 1.56, 0.64, 1); } /* 状态改变时的动画 */ .commit-row.state-changed { animation: stateChange 0.3s ease-out; } @keyframes stateChange { 0% { transform: scale(1); } 50% { transform: scale(1.02); } 100% { transform: scale(1); } } @keyframes popIn { from { opacity: 0; transform: scale(0.9) translateY(20px); } to { opacity: 1; transform: scale(1) translateY(0); } } /* ========== Commit Container 提交容器 ========== */ .commit-container { max-width: 75%; width: 75%; position: relative; } .commit-container.source { align-self: flex-start; margin-right: auto; } .commit-container.target { align-self: flex-end; margin-left: auto; } .commit-container.both { align-self: center; max-width: 90%; width: 90%; margin: 0 auto; } /* ========== Flat Layout 平铺布局 ========== */ body[data-layout="flat"] .timeline .commit-row { justify-content: center; } body[data-layout="flat"] .timeline .commit-container { max-width: 100%; width: 100%; margin: 0 auto; align-self: center; } body[data-layout="flat"] .timeline .commit-container.both { max-width: 100%; } /* ========== Filter Section 筛选区域 ========== */ .filter-section { margin-bottom: var(--spacing-6); padding: var(--spacing-6); background: var(--color-card); border-radius: var(--radius-xl); border: var(--border-width) solid var(--color-fg); box-shadow: var(--shadow-card); } .filter-buttons { display: flex; gap: var(--spacing-3); margin-bottom: var(--spacing-6); flex-wrap: wrap; } .sub-filter-section { display: flex; flex-wrap: wrap; gap: var(--spacing-5); margin: var(--spacing-5) 0 0 0; padding: var(--spacing-5); background: rgba(139, 92, 246, 0.05); border-radius: var(--radius-md); border: 2px dashed var(--color-accent); transition: all var(--transition-base); max-height: 200px; overflow: hidden; } .sub-filter-section.hidden { max-height: 0; margin: 0; padding: 0; opacity: 0; border: none; } /* ========== Search Section 搜索区域 ========== */ .search-section { margin-top: var(--spacing-6); padding: var(--spacing-5); background: rgba(251, 191, 36, 0.08); border-radius: var(--radius-md); border: 2px dashed var(--color-tertiary); } .search-container { position: relative; width: 100%; display: flex; align-items: center; margin-bottom: var(--spacing-5); gap: var(--spacing-3); flex-wrap: wrap; } .search-input { flex: 1 1 280px; min-width: 200px; max-width: 100%; padding-right: 44px; } .clear-search { position: absolute; right: 8px; top: 50%; transform: translateY(-50%); flex-shrink: 0; width: 32px; height: 32px; min-width: 32px; min-height: 32px; border-radius: 50%; background: var(--color-secondary); color: white; border: var(--border-width) solid var(--color-fg); cursor: pointer; display: none; align-items: center; justify-content: center; font-size: 16px; font-weight: var(--font-weight-extrabold); box-shadow: var(--shadow-small); transition: all var(--transition-base); z-index: 10; opacity: 0; visibility: hidden; } .clear-search.visible { display: flex; opacity: 1; visibility: visible; } .clear-search:hover { background: var(--color-danger); transform: translateY(-50%) translate(-2px, -2px) rotate(-5deg); box-shadow: var(--shadow-small-hover); } .clear-search:active { transform: translateY(-50%) translate(1px, 1px) rotate(0deg); box-shadow: var(--shadow-pop-active); } .search-options { display: flex; flex-wrap: wrap; gap: var(--spacing-4); align-items: center; width: 100%; } /* ========== Command Section 命令区域 ========== */ .command-section { margin-top: var(--spacing-8); background: var(--color-card); padding: var(--spacing-8); border-radius: var(--radius-xl); border: var(--border-width) solid var(--color-fg); box-shadow: var(--shadow-card); } .command-section h3 { margin: 0 0 var(--spacing-5) 0; color: var(--color-fg); font-family: var(--font-display); font-size: var(--font-size-2xl); font-weight: var(--font-weight-extrabold); display: flex; align-items: center; justify-content: space-between; gap: var(--spacing-4); flex-wrap: nowrap; } .command-section h3 > span:first-child { white-space: nowrap; } .copy-button { flex-shrink: 0; white-space: nowrap; } .command-tabs { display: flex; gap: var(--spacing-2); margin-bottom: var(--spacing-6); background: var(--color-bg); padding: var(--spacing-2); border-radius: var(--radius-full); border: var(--border-width) solid var(--color-border); } .command-content { display: none; } .command-content.active { display: block; } .command-line { display: flex; align-items: center; margin: var(--spacing-3) 0; gap: var(--spacing-3); padding: var(--spacing-4) var(--spacing-5); background: linear-gradient( 135deg, rgba(30, 41, 59, 0.98) 0%, rgba(15, 23, 42, 0.98) 100% ); border-radius: var(--radius-md); border-left: 4px solid var(--color-accent); border: var(--border-width) solid var(--color-fg); box-shadow: var(--shadow-small); transition: all var(--transition-fast); } .command-line:hover { border-left-color: var(--color-accent-light); transform: translate(-1px, -1px); box-shadow: var(--shadow-small-hover); } .command-line pre { margin: 0; flex-grow: 1; font-family: var(--font-mono); font-size: var(--font-size-sm); white-space: pre-wrap; overflow-x: auto; color: #e2e8f0; line-height: 1.7; font-weight: var(--font-weight-medium); } .command-line pre code { color: #8b5cf6; text-shadow: 0 0 10px rgba(139, 92, 246, 0.4); font-weight: var(--font-weight-bold); } /* Git 命令语法高亮 */ .git-keyword { color: #f472b6; font-weight: var(--font-weight-extrabold); text-shadow: 0 0 8px rgba(244, 114, 182, 0.5); } .git-subcommand { color: #8b5cf6; font-weight: var(--font-weight-bold); text-shadow: 0 0 10px rgba(139, 92, 246, 0.4); } .git-hash { color: #fbbf24; font-weight: var(--font-weight-bold); text-shadow: 0 0 8px rgba(251, 191, 36, 0.4); } .git-branch { color: #34d399; font-weight: var(--font-weight-semibold); text-shadow: 0 0 8px rgba(52, 211, 153, 0.3); } .git-comment { color: #94a3b8; font-style: italic; font-weight: var(--font-weight-normal); } #source-to-target-commands-container, #target-to-source-commands-container { max-height: 450px; overflow-y: auto; padding: var(--spacing-4); background: rgba(139, 92, 246, 0.03); border-radius: var(--radius-md); border: 2px dashed var(--color-border); } /* ========== Responsive Design 响应式设计 ========== */ @media (max-width: 1024px) { .container { padding: var(--spacing-6); } .commit-container { max-width: 85%; } body[data-layout="flat"] .timeline .commit-container { max-width: 100%; } } @media (max-width: 768px) { body { padding: var(--spacing-3); } .container { padding: var(--spacing-5); border-radius: var(--radius-md); } .header { flex-direction: column; gap: var(--spacing-5); padding-bottom: var(--spacing-5); } .header h1 { font-size: var(--font-size-3xl); } .header h1::after { display: none; } .timeline-legend { gap: var(--spacing-3); justify-content: flex-start; } .legend-item { font-size: var(--font-size-xs); padding: var(--spacing-2) var(--spacing-4); } .theme-switcher { width: 100%; } .theme-button { flex: 1; justify-content: center; padding: var(--spacing-3) var(--spacing-4); } .timeline { padding: var(--spacing-4) 0; } .commit-container, .commit-container.source, .commit-container.target, .commit-container.both { max-width: 100%; } body[data-layout="flat"] .timeline .commit-container { max-width: 100%; } .filter-section { padding: var(--spacing-5); } .filter-buttons { gap: var(--spacing-2); } .search-container { flex-direction: column; align-items: stretch; gap: var(--spacing-3); } .search-input { flex: 1; max-width: 100%; min-width: 100%; } .clear-search { right: 8px; } .search-options { gap: var(--spacing-3); flex-wrap: wrap; } .command-section { padding: var(--spacing-5); margin-top: var(--spacing-6); } .command-section h3 { flex-direction: column; align-items: flex-start; gap: var(--spacing-3); font-size: var(--font-size-xl); } .command-tabs { flex-direction: column; width: 100%; } } @media (max-width: 480px) { .container { padding: var(--spacing-4); } .header h1 { font-size: var(--font-size-2xl); } .filter-section, .command-section { padding: var(--spacing-4); } .legend-item { padding: var(--spacing-2) var(--spacing-3); } .legend-dot { width: 12px; height: 12px; } }