Files
RustUI/docs/components/index.md
T
2026-05-31 18:34:36 +08:00

1268 lines
48 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
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.
---
nav: 组件
title: 组件总览
---
<style>
.overview-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(290px, 1fr));
gap: 20px;
margin: 24px 0 48px;
}
.overview-card {
display: flex;
flex-direction: column;
border: 1px solid #e8e8e8;
border-radius: 8px;
text-decoration: none;
color: inherit;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
background: #fff;
overflow: hidden;
}
.overview-card:hover {
border-color: #1890ff;
box-shadow: 0 4px 16px rgba(24, 144, 255, 0.15);
transform: translateY(-2px);
}
.overview-preview {
display: flex;
align-items: center;
justify-content: center;
padding: 28px 16px 20px;
background: #fafafa;
min-height: 80px;
border-bottom: 1px solid #f0f0f0;
flex-wrap: wrap;
gap: 8px;
}
.overview-info {
padding: 14px 16px;
}
.overview-title {
font-weight: 500;
font-size: 14px;
color: rgba(0, 0, 0, 0.88);
margin-bottom: 2px;
}
.overview-desc {
font-size: 12px;
color: rgba(0, 0, 0, 0.45);
line-height: 1.4;
}
/* Preview elements */
.prev-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 4px 12px;
border: 1px solid #d9d9d9;
border-radius: 4px;
font-size: 12px;
background: #fff;
font-weight: 500;
}
.prev-btn-primary { background: #1677ff; color: #fff; border-color: #1677ff; }
.prev-btn-danger { background: #ff4d4f; color: #fff; border-color: #ff4d4f; }
.prev-circle {
width: 32px; height: 32px; border-radius: 50%; background: #1677ff;
display: flex; align-items: center; justify-content: center;
color: #fff; font-size: 16px; font-weight: 600;
box-shadow: 0 2px 8px rgba(22,119,255,0.3);
}
.prev-circle-green { background: #52c41a; }
.prev-circle-light {
width: 32px; height: 32px; border-radius: 50%; background: #f5f5f5;
border: 1px solid #d9d9d9; display: flex; align-items: center; justify-content: center;
font-size: 14px;
}
.prev-icon { font-size: 22px; }
.prev-icon-blue { color: #1677ff; }
.prev-icon-gold { color: #faad14; }
.prev-icon-red { color: #ff4d4f; }
.prev-text { font-size: 14px; line-height: 1; }
.prev-label {
display: inline-block; padding: 2px 8px; border-radius: 3px; font-size: 11px;
}
.prev-label-blue { background: #e6f4ff; color: #1677ff; border: 1px solid #91caff; }
.prev-label-gray { background: #f5f5f5; color: #666; }
.prev-tag {
display: inline-block; padding: 1px 6px; border-radius: 3px; font-size: 11px; font-weight: 500;
}
.prev-tag-blue { background: #e6f4ff; color: #1677ff; }
.prev-tag-green { background: #f6ffed; color: #52c41a; }
.prev-tag-red { background: #fff2f0; color: #ff4d4f; }
.prev-input {
border: 1px solid #d9d9d9; border-radius: 4px; padding: 4px 10px; font-size: 12px;
background: #fff; color: #999;
}
.prev-divider { width: 100%; border-top: 1px solid #e8e8e8; }
.prev-switch {
width: 32px; height: 18px; border-radius: 9px; background: #1677ff; position: relative;
}
.prev-switch::after {
content: ''; position: absolute; top: 2px; right: 2px;
width: 14px; height: 14px; border-radius: 50%; background: #fff;
}
.prev-avatar {
border-radius: 50%; display: flex; align-items: center; justify-content: center;
color: #fff; font-weight: 600;
}
.prev-avatar-32 { width: 32px; height: 32px; font-size: 13px; }
.prev-avatar-blue { background: #1677ff; }
.prev-avatar-green { background: #52c41a; }
.prev-avatar-gray { background: #bfbfbf; }
.prev-rate { color: #faad14; font-size: 16px; letter-spacing: 2px; }
.prev-slider {
width: 100px; height: 4px; background: #e8e8e8; border-radius: 2px; position: relative;
}
.prev-slider::after {
content: ''; position: absolute; left: 30%; top: -4px;
width: 12px; height: 12px; border-radius: 50%; background: #1677ff;
border: 2px solid #fff; box-shadow: 0 1px 3px rgba(0,0,0,0.2);
}
.prev-radio {
width: 14px; height: 14px; border-radius: 50%; border: 2px solid #1677ff;
display: inline-flex; align-items: center; justify-content: center; vertical-align: middle;
}
.prev-radio::after {
content: ''; width: 7px; height: 7px; border-radius: 50%; background: #1677ff;
}
.prev-check {
width: 14px; height: 14px; border-radius: 3px; border: 2px solid #1677ff;
background: #1677ff; display: inline-flex; align-items: center; justify-content: center;
vertical-align: middle; color: #fff; font-size: 10px;
}
.prev-progress { width: 100%; height: 6px; background: #f0f0f0; border-radius: 3px; overflow: hidden; }
.prev-progress-bar { height: 100%; background: #1677ff; border-radius: 3px; }
.prev-alert {
width: 100%; padding: 6px 12px; border-radius: 6px; font-size: 12px;
display: flex; align-items: center; gap: 6px;
}
.prev-alert-success { background: #f6ffed; border: 1px solid #b7eb8f; color: #52c41a; }
.prev-alert-info { background: #e6f4ff; border: 1px solid #91caff; color: #1677ff; }
.prev-spin {
width: 20px; height: 20px; border: 2px solid #f0f0f0;
border-top: 2px solid #1677ff; border-radius: 50%;
animation: prev-spin 1s linear infinite;
}
@keyframes prev-spin { to { transform: rotate(360deg); } }
.prev-result { text-align: center; padding: 4px 0; }
.prev-result-icon {
width: 36px; height: 36px; border-radius: 50%; display: inline-flex;
align-items: center; justify-content: center; font-size: 18px; margin-bottom: 4px;
}
.prev-result-success { background: #f6ffed; color: #52c41a; }
.prev-skeleton-line { height: 10px; background: #f0f0f0; border-radius: 3px; margin-bottom: 4px; }
.prev-stat { font-size: 22px; font-weight: 600; color: #1677ff; line-height: 1; }
.prev-stat-label { font-size: 11px; color: #999; margin-top: 2px; }
.prev-breadcrumb { font-size: 12px; color: #999; }
.prev-breadcrumb .current { color: rgba(0,0,0,0.65); }
.prev-step { display: flex; gap: 4px; align-items: center; font-size: 11px; }
.prev-step-dot {
width: 18px; height: 18px; border-radius: 50%; display: flex;
align-items: center; justify-content: center; font-size: 10px;
}
.prev-step-dot-done { background: #1677ff; color: #fff; }
.prev-step-dot-active { background: #1677ff; color: #fff; }
.prev-step-dot-pending { background: #f0f0f0; color: #999; }
.prev-step-line { width: 20px; height: 1px; background: #e8e8e8; }
.prev-step-line-done { background: #1677ff; }
.prev-tab-bar { display: flex; gap: 0; border-bottom: 1px solid #f0f0f0; }
.prev-tab-item { padding: 4px 12px; font-size: 12px; }
.prev-tab-active { color: #1677ff; border-bottom: 2px solid #1677ff; }
.prev-tab-inactive { color: #999; }
.prev-pagination { display: flex; gap: 2px; align-items: center; font-size: 11px; }
.prev-page {
min-width: 22px; height: 22px; display: flex; align-items: center; justify-content: center;
border-radius: 4px; border: 1px solid #d9d9d9;
}
.prev-page-active { background: #1677ff; color: #fff; border-color: #1677ff; }
.prev-dropdown {
display: flex; align-items: center; gap: 4px; padding: 4px 10px;
border: 1px solid #d9d9d9; border-radius: 4px; font-size: 12px;
}
.prev-menu-item { padding: 2px 8px; font-size: 12px; border-radius: 3px; }
.prev-menu-active { background: #e6f4ff; color: #1677ff; }
.prev-split {
display: flex; width: 100%; height: 34px; border-radius: 4px;
overflow: hidden; border: 1px solid #e8e8e8;
}
.prev-split-handle { width: 4px; background: #1677ff; }
.prev-card-mini {
width: 100%; border: 1px solid #f0f0f0; border-radius: 6px; overflow: hidden;
}
.prev-card-header {
padding: 6px 10px; background: #fafafa; font-size: 12px; font-weight: 500;
border-bottom: 1px solid #f0f0f0;
}
.prev-card-body { padding: 6px 10px; font-size: 11px; color: #666; }
.prev-collapse { width: 100%; }
.prev-collapse-item { border: 1px solid #f0f0f0; border-radius: 4px; overflow: hidden; margin-bottom: 2px; }
.prev-collapse-header {
padding: 4px 10px; background: #fafafa; font-size: 12px;
display: flex; justify-content: space-between;
}
.prev-collapse-content { padding: 4px 10px; font-size: 11px; color: #666; }
.prev-timeline { font-size: 12px; padding-left: 12px; border-left: 2px solid #1677ff; }
.prev-timeline-item { padding: 2px 0 2px 12px; position: relative; }
.prev-timeline-item::before {
content: ''; position: absolute; left: -18px; top: 7px;
width: 6px; height: 6px; border-radius: 50%; background: #1677ff;
}
.prev-table { width: 100%; border-collapse: collapse; font-size: 11px; }
.prev-table th {
padding: 3px 8px; text-align: left; border-bottom: 1px solid #f0f0f0;
color: #999; font-weight: 500;
}
.prev-table td { padding: 3px 8px; border-bottom: 1px solid #fafafa; }
.prev-tree { padding-left: 8px; font-size: 12px; line-height: 1.8; }
.prev-tree-item { color: #666; }
.prev-tree-item::before { content: '├ '; color: #d9d9d9; }
.prev-tree-item.prev-tree-root::before { content: ''; }
.prev-modal {
width: 100%; border: 1px solid #d9d9d9; border-radius: 6px; overflow: hidden;
box-shadow: 0 2px 8px rgba(0,0,0,0.08);
}
.prev-modal-header {
padding: 6px 12px; border-bottom: 1px solid #f0f0f0; font-size: 12px; font-weight: 500;
}
.prev-modal-body { padding: 8px 12px; font-size: 11px; color: #666; }
.prev-modal-footer {
padding: 6px 12px; border-top: 1px solid #f0f0f0; text-align: right; font-size: 11px;
}
.prev-drawer {
width: 100%; height: 36px; background: #fafafa; border: 1px solid #e8e8e8;
border-radius: 4px; position: relative; overflow: hidden;
}
.prev-drawer-panel {
position: absolute; right: 0; top: 0; width: 34px; height: 100%;
background: #fff; border-left: 1px solid #e8e8e8; border-radius: 0 4px 4px 0;
display: flex; align-items: center; justify-content: center; color: #999; font-size: 12px;
}
.prev-badge-wrap { position: relative; display: inline-block; }
.prev-badge-dot { position: absolute; top: -2px; right: -4px; }
.prev-badge-count {
background: #ff4d4f; color: #fff; border-radius: 10px; padding: 0 5px;
font-size: 10px; min-width: 16px; height: 16px; display: flex;
align-items: center; justify-content: center; box-shadow: 0 0 0 1px #fff;
}
.prev-calendar { display: grid; grid-template-columns: repeat(7,1fr); gap: 2px; text-align: center; font-size: 11px; }
.prev-calendar-header { color: #1677ff; font-weight: 500; padding: 2px 0; }
.prev-calendar-day { padding: 1px 0; border-radius: 3px; }
.prev-calendar-today { background: #1677ff; color: #fff; }
.prev-masonry { display: grid; grid-template-columns: repeat(3,1fr); gap: 3px; width: 100%; }
.prev-masonry-item { border-radius: 2px; }
.prev-masonry-block-1 { height: 24px; background: #1677ff; }
.prev-masonry-block-2 { height: 32px; background: #69b1ff; }
.prev-masonry-block-3 { height: 20px; background: #91caff; }
.prev-segmented { display: flex; border: 1px solid #d9d9d9; border-radius: 4px; overflow: hidden; font-size: 12px; }
.prev-segmented-item { padding: 3px 10px; }
.prev-segmented-active { background: #1677ff; color: #fff; }
.prev-segmented-inactive { background: #fff; color: #666; border-right: 1px solid #f0f0f0; }
.prev-transfer-box { padding: 3px 10px; border: 1px solid #d9d9d9; border-radius: 3px; font-size: 11px; color: #666; min-width: 50px; text-align: center; }
.prev-tooltip-target { border-bottom: 1px dashed #1677ff; font-size: 12px; color: #1677ff; }
.prev-tooltip-bubble { background: #333; color: #fff; padding: 2px 8px; border-radius: 3px; font-size: 10px; white-space: nowrap; }
.prev-popover-wrap { display: flex; align-items: flex-start; gap: 6px; }
.prev-popover-dot { width: 8px; height: 8px; border-radius: 50%; background: #1677ff; margin-top: 25px; flex-shrink: 0; }
.prev-popover-card { background: #fff; border: 1px solid #d9d9d9; border-radius: 6px; padding: 6px 10px; font-size: 12px; box-shadow: 0 1px 4px rgba(0,0,0,0.1); }
.prev-empty { text-align: center; padding: 8px 0; }
.prev-empty-icon { font-size: 28px; color: #d9d9d9; margin-bottom: 4px; }
.prev-empty-text { font-size: 12px; color: #999; }
.prev-tour-steps { display: flex; gap: 6px; align-items: center; font-size: 12px; }
.prev-tour-dot { width: 14px; height: 14px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 9px; }
.prev-tour-dot-active { background: #1677ff; color: #fff; }
.prev-tour-dot-pending { border: 1px solid #d9d9d9; color: #999; }
.prev-image-placeholder { width: 60px; height: 40px; background: #f5f5f5; border: 1px solid #e8e8e8; border-radius: 4px; display: flex; align-items: center; justify-content: center; color: #ccc; font-size: 20px; }
.prev-qrcode { width: 48px; height: 48px; background: #000; display: grid; grid-template-columns: repeat(5,1fr); gap: 1px; padding: 2px; border-radius: 3px; }
.prev-qrcode-w { background: #fff; }
.prev-qrcode-b { background: #000; }
.prev-list-item { padding: 3px 8px; border-bottom: 1px solid #fafafa; font-size: 12px; }
.prev-list-item:last-child { border-bottom: none; }
.prev-carousel-slide { height: 32px; background: linear-gradient(135deg, #1677ff, #69b1ff); border-radius: 4px; display: flex; align-items: center; justify-content: center; color: #fff; font-size: 12px; }
.prev-carousel-dots { display: flex; justify-content: center; gap: 4px; margin-top: 4px; }
.prev-carousel-dot { width: 6px; height: 6px; border-radius: 50%; }
.prev-carousel-dot-active { background: #1677ff; }
.prev-carousel-dot-inactive { background: #d9d9d9; }
.prev-descriptions { font-size: 12px; width: 100%; }
.prev-descriptions-row { display: flex; gap: 8px; padding: 2px 0; border-bottom: 1px solid #fafafa; }
.prev-descriptions-label { color: #999; min-width: 40px; }
.prev-notification { width: 100%; background: #fff; border: 1px solid #d9d9d9; border-radius: 6px; padding: 8px 12px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); }
.prev-notification-title { font-size: 12px; font-weight: 500; margin-bottom: 2px; }
.prev-notification-desc { font-size: 11px; color: #666; }
.prev-popconfirm { position: relative; }
.prev-popconfirm-trigger { padding: 4px 10px; border: 1px solid #ff4d4f; border-radius: 4px; font-size: 12px; color: #ff4d4f; }
.prev-popconfirm-bubble { position: absolute; top: -28px; left: 0; background: #fff; border: 1px solid #d9d9d9; border-radius: 4px; padding: 2px 8px; font-size: 10px; box-shadow: 0 2px 6px rgba(0,0,0,0.1); white-space: nowrap; }
</style>
# 组件总览
RustUI 提供了丰富的组件库,覆盖通用、布局、导航、数据录入、数据展示和反馈等场景。
## 通用 10 个组件
<div class="overview-grid">
<a href="/components/common/button" class="overview-card">
<div class="overview-preview">
<span class="prev-btn prev-btn-primary">Primary</span>
<span class="prev-btn">Default</span>
<span class="prev-btn prev-btn-danger">Danger</span>
</div>
<div class="overview-info">
<div class="overview-title">Button 按钮</div>
<div class="overview-desc">触发操作的按钮组件</div>
</div>
</a>
<a href="/components/common/float-button" class="overview-card">
<div class="overview-preview">
<div class="prev-circle">+</div>
<div class="prev-circle prev-circle-green">✓</div>
<div class="prev-circle-light">?</div>
</div>
<div class="overview-info">
<div class="overview-title">FloatButton 悬浮按钮</div>
<div class="overview-desc">悬浮在页面边缘的操作按钮</div>
</div>
</a>
<a href="/components/common/icon" class="overview-card">
<div class="overview-preview">
<span class="prev-icon prev-icon-blue">🔍</span>
<span class="prev-icon prev-icon-gold">🔔</span>
<span class="prev-icon prev-icon-red">⭐</span>
</div>
<div class="overview-info">
<div class="overview-title">Icon 图标</div>
<div class="overview-desc">语义化的矢量图形</div>
</div>
</a>
<a href="/components/common/typography" class="overview-card">
<div class="overview-preview">
<span class="prev-text" style="font-size:18px;font-weight:600;color:rgba(0,0,0,0.88)">Aa</span>
<span class="prev-text" style="font-size:13px;color:#999">Bb</span>
<span class="prev-text" style="font-size:13px;color:#ff4d4f">Cc</span>
</div>
<div class="overview-info">
<div class="overview-title">Typography 排版</div>
<div class="overview-desc">标题、段落、文本组件</div>
</div>
</a>
<a href="/components/common/affix" class="overview-card">
<div class="overview-preview">
<span style="font-size:28px">📌</span>
<span class="prev-label prev-label-gray">Fixed</span>
</div>
<div class="overview-info">
<div class="overview-title">Affix 固钉</div>
<div class="overview-desc">将元素固定在可视范围</div>
</div>
</a>
<a href="/components/common/anchor" class="overview-card">
<div class="overview-preview">
<div style="display:flex;flex-direction:column;gap:3px;font-size:12px;color:#666">
<span style="color:#1677ff">▸ Section 1</span>
<span style="padding-left:8px">Section 2</span>
<span style="padding-left:8px">Section 3</span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Anchor 锚点</div>
<div class="overview-desc">页面内锚点导航</div>
</div>
</a>
<a href="/components/common/app" class="overview-card">
<div class="overview-preview">
<span class="prev-label prev-label-blue">App Container</span>
</div>
<div class="overview-info">
<div class="overview-title">App 包裹组件</div>
<div class="overview-desc">提供全局化配置的包裹组件</div>
</div>
</a>
<a href="/components/common/back-top" class="overview-card">
<div class="overview-preview">
<div style="width:36px;height:36px;border-radius:8px;background:#1677ff;display:flex;align-items:center;justify-content:center;color:#fff;font-size:18px;box-shadow:0 2px 8px rgba(22,119,255,0.3)">↑</div>
</div>
<div class="overview-info">
<div class="overview-title">BackTop 回到顶部</div>
<div class="overview-desc">返回页面顶部的快捷按钮</div>
</div>
</a>
<a href="/components/common/config-provider" class="overview-card">
<div class="overview-preview">
<div style="display:flex;gap:6px">
<div style="width:20px;height:20px;border-radius:4px;background:#1677ff"></div>
<div style="width:20px;height:20px;border-radius:4px;background:#52c41a"></div>
<div style="width:20px;height:20px;border-radius:4px;background:#ff4d4f"></div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">ConfigProvider 全局配置</div>
<div class="overview-desc">全局化配置</div>
</div>
</a>
<a href="/components/common/watermark" class="overview-card">
<div class="overview-preview">
<div style="position:relative;padding:12px 20px;border:1px dashed #d9d9d9;border-radius:4px;font-size:12px;color:#999;text-align:center">
<span style="position:absolute;top:4px;left:8px;font-size:10px;color:rgba(0,0,0,0.06);transform:rotate(-15deg);pointer-events:none">RustUI</span>
<span style="position:absolute;top:8px;left:60px;font-size:10px;color:rgba(0,0,0,0.06);transform:rotate(-15deg);pointer-events:none">RustUI</span>
Content Area
</div>
</div>
<div class="overview-info">
<div class="overview-title">Watermark 水印</div>
<div class="overview-desc">页面水印</div>
</div>
</a>
</div>
## 布局 8 个组件
<div class="overview-grid">
<a href="/components/layout/divider" class="overview-card">
<div class="overview-preview" style="flex-direction:column;align-items:stretch">
<span style="font-size:12px;color:#666;margin-bottom:4px">Above</span>
<div class="prev-divider"></div>
<span style="font-size:12px;color:#666;margin-top:4px">Below</span>
</div>
<div class="overview-info">
<div class="overview-title">Divider 分割线</div>
<div class="overview-desc">区隔内容的分割线</div>
</div>
</a>
<a href="/components/layout/flex" class="overview-card">
<div class="overview-preview">
<div style="display:flex;gap:6px;align-items:end;height:40px">
<div style="width:32px;height:28px;background:#1677ff;border-radius:3px"></div>
<div style="width:32px;height:36px;background:#69b1ff;border-radius:3px"></div>
<div style="width:32px;height:20px;background:#91caff;border-radius:3px"></div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Flex 弹性布局</div>
<div class="overview-desc">弹性布局容器</div>
</div>
</a>
<a href="/components/layout/grid" class="overview-card">
<div class="overview-preview">
<div style="display:flex;gap:4px;width:100%">
<div style="flex:8;height:32px;background:#1677ff;border-radius:3px"></div>
<div style="flex:8;height:32px;background:#69b1ff;border-radius:3px"></div>
<div style="flex:8;height:32px;background:#91caff;border-radius:3px"></div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Grid 栅格</div>
<div class="overview-desc">24 栅格系统</div>
</div>
</a>
<a href="/components/layout/layout" class="overview-card">
<div class="overview-preview">
<div style="width:100%;background:#f5f5f5;border-radius:4px;overflow:hidden">
<div style="height:16px;background:#1677ff;border-radius:4px 4px 0 0"></div>
<div style="display:flex;height:36px">
<div style="width:28px;background:#e6f4ff;border-right:1px solid #d6e4ff"></div>
<div style="flex:1;background:#fff"></div>
</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Layout 布局</div>
<div class="overview-desc">页面级布局</div>
</div>
</a>
<a href="/components/layout/space" class="overview-card">
<div class="overview-preview">
<div style="display:flex;gap:8px;align-items:center">
<div style="width:22px;height:22px;border-radius:3px;background:#1677ff"></div>
<div style="width:22px;height:22px;border-radius:3px;background:#69b1ff"></div>
<div style="width:22px;height:22px;border-radius:3px;background:#91caff"></div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Space 间距</div>
<div class="overview-desc">组件间距</div>
</div>
</a>
<a href="/components/layout/splitter" class="overview-card">
<div class="overview-preview">
<div class="prev-split">
<div style="flex:1;background:#fafafa"></div>
<div class="prev-split-handle"></div>
<div style="flex:1;background:#fafafa"></div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Splitter 分割面板</div>
<div class="overview-desc">可拖拽的面板分割</div>
</div>
</a>
<a href="/components/layout/masonry" class="overview-card">
<div class="overview-preview">
<div class="prev-masonry">
<div class="prev-masonry-item prev-masonry-block-1"></div>
<div class="prev-masonry-item prev-masonry-block-2"></div>
<div class="prev-masonry-item prev-masonry-block-3"></div>
<div class="prev-masonry-item prev-masonry-block-3"></div>
<div class="prev-masonry-item prev-masonry-block-1"></div>
<div class="prev-masonry-item prev-masonry-block-2"></div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Masonry 瀑布流</div>
<div class="overview-desc">瀑布流布局</div>
</div>
</a>
<a href="/components/layout/stack" class="overview-card">
<div class="overview-preview">
<div style="position:relative;width:100px;height:48px">
<div style="position:absolute;top:0;left:0;width:80px;height:36px;background:#1677ff;border-radius:4px;opacity:0.9"></div>
<div style="position:absolute;top:6px;left:6px;width:80px;height:36px;background:#69b1ff;border-radius:4px;opacity:0.7"></div>
<div style="position:absolute;top:12px;left:12px;width:80px;height:36px;background:#91caff;border-radius:4px;opacity:0.5"></div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Stack 堆栈布局</div>
<div class="overview-desc">堆栈式布局</div>
</div>
</a>
</div>
## 导航 6 个组件
<div class="overview-grid">
<a href="/components/nav/breadcrumb" class="overview-card">
<div class="overview-preview">
<div class="prev-breadcrumb">
🏠 <span style="margin:0 4px;color:#ccc">/</span> Page <span style="margin:0 4px;color:#ccc">/</span> <span class="current">Detail</span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Breadcrumb 面包屑</div>
<div class="overview-desc">页面路径导航</div>
</div>
</a>
<a href="/components/nav/dropdown" class="overview-card">
<div class="overview-preview">
<div class="prev-dropdown">
Actions <span style="font-size:10px">▼</span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Dropdown 下拉菜单</div>
<div class="overview-desc">下拉菜单</div>
</div>
</a>
<a href="/components/nav/menu" class="overview-card">
<div class="overview-preview">
<div style="display:flex;flex-direction:column;gap:4px">
<div class="prev-menu-item prev-menu-active">Home</div>
<div class="prev-menu-item">Products</div>
<div class="prev-menu-item">Settings</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Menu 导航菜单</div>
<div class="overview-desc">侧边/顶部导航菜单</div>
</div>
</a>
<a href="/components/nav/pagination" class="overview-card">
<div class="overview-preview">
<div class="prev-pagination">
<span class="prev-page"></span>
<span class="prev-page prev-page-active">1</span>
<span class="prev-page">2</span>
<span class="prev-page">3</span>
<span class="prev-page"></span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Pagination 分页</div>
<div class="overview-desc">数据分页</div>
</div>
</a>
<a href="/components/nav/steps" class="overview-card">
<div class="overview-preview">
<div class="prev-step">
<span class="prev-step-dot prev-step-dot-done">1</span>
<span class="prev-step-line prev-step-line-done"></span>
<span class="prev-step-dot prev-step-dot-active">2</span>
<span class="prev-step-line"></span>
<span class="prev-step-dot prev-step-dot-pending">3</span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Steps 步骤条</div>
<div class="overview-desc">步骤指示器</div>
</div>
</a>
<a href="/components/nav/tabs" class="overview-card">
<div class="overview-preview">
<div class="prev-tab-bar">
<span class="prev-tab-item prev-tab-active">Tab 1</span>
<span class="prev-tab-item prev-tab-inactive">Tab 2</span>
<span class="prev-tab-item prev-tab-inactive">Tab 3</span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Tabs 标签页</div>
<div class="overview-desc">选项卡切换</div>
</div>
</a>
</div>
## 数据录入 19 个组件
<div class="overview-grid">
<a href="/components/entry/auto-complete" class="overview-card">
<div class="overview-preview">
<span class="prev-input">Search...</span>
</div>
<div class="overview-info">
<div class="overview-title">AutoComplete 自动完成</div>
<div class="overview-desc">自动补全输入</div>
</div>
</a>
<a href="/components/entry/cascader" class="overview-card">
<div class="overview-preview">
<span class="prev-input">Select... ▾</span>
</div>
<div class="overview-info">
<div class="overview-title">Cascader 级联选择</div>
<div class="overview-desc">级联选择器</div>
</div>
</a>
<a href="/components/entry/choice" class="overview-card">
<div class="overview-preview">
<span class="prev-check">✓</span>
<span style="font-size:12px;margin-left:4px">Check</span>
</div>
<div class="overview-info">
<div class="overview-title">Checkbox 多选框</div>
<div class="overview-desc">多选选择框</div>
</div>
</a>
<a href="/components/entry/date-picker" class="overview-card">
<div class="overview-preview">
<span class="prev-input">📅 Pick date</span>
</div>
<div class="overview-info">
<div class="overview-title">DatePicker 日期选择器</div>
<div class="overview-desc">日期选择</div>
</div>
</a>
<a href="/components/entry/form" class="overview-card">
<div class="overview-preview" style="flex-direction:column;align-items:stretch;gap:6px">
<span class="prev-input">Username</span>
<span class="prev-input">Password</span>
<span class="prev-btn prev-btn-primary">Submit</span>
</div>
<div class="overview-info">
<div class="overview-title">Form 表单</div>
<div class="overview-desc">表单组件</div>
</div>
</a>
<a href="/components/entry/input" class="overview-card">
<div class="overview-preview">
<span class="prev-input">Type here...</span>
</div>
<div class="overview-info">
<div class="overview-title">Input 输入框</div>
<div class="overview-desc">文本输入框</div>
</div>
</a>
<a href="/components/entry/input-number" class="overview-card">
<div class="overview-preview">
<div style="display:flex;align-items:center;border:1px solid #d9d9d9;border-radius:4px;overflow:hidden;font-size:12px">
<span style="padding:4px 8px;background:#f5f5f5;border-right:1px solid #d9d9d9"></span>
<span style="padding:4px 14px">10</span>
<span style="padding:4px 8px;background:#f5f5f5;border-left:1px solid #d9d9d9">+</span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">InputNumber 数字输入框</div>
<div class="overview-desc">数字输入</div>
</div>
</a>
<a href="/components/entry/mention" class="overview-card">
<div class="overview-preview">
<span class="prev-label prev-label-blue">@username</span>
</div>
<div class="overview-info">
<div class="overview-title">Mention 提及</div>
<div class="overview-desc">@提及</div>
</div>
</a>
<a href="/components/entry/choice" class="overview-card">
<div class="overview-preview">
<span class="prev-radio"></span>
<span style="font-size:12px;margin-left:4px">Option</span>
</div>
<div class="overview-info">
<div class="overview-title">Radio 单选框</div>
<div class="overview-desc">单选选择框</div>
</div>
</a>
<a href="/components/entry/range-picker" class="overview-card">
<div class="overview-preview">
<span class="prev-input">📅 Date range</span>
</div>
<div class="overview-info">
<div class="overview-title">RangePicker 范围选择器</div>
<div class="overview-desc">日期范围选择</div>
</div>
</a>
<a href="/components/entry/rate" class="overview-card">
<div class="overview-preview">
<span class="prev-rate">★★★☆☆</span>
</div>
<div class="overview-info">
<div class="overview-title">Rate 评分</div>
<div class="overview-desc">评分组件</div>
</div>
</a>
<a href="/components/entry/select" class="overview-card">
<div class="overview-preview">
<span class="prev-input">Choose... ▾</span>
</div>
<div class="overview-info">
<div class="overview-title">Select 选择器</div>
<div class="overview-desc">下拉选择器</div>
</div>
</a>
<a href="/components/entry/slider" class="overview-card">
<div class="overview-preview">
<div class="prev-slider"></div>
</div>
<div class="overview-info">
<div class="overview-title">Slider 滑动输入条</div>
<div class="overview-desc">滑动输入</div>
</div>
</a>
<a href="/components/entry/choice" class="overview-card">
<div class="overview-preview">
<div class="prev-switch"></div>
<span style="font-size:12px;margin-left:6px;color:#666">Toggle</span>
</div>
<div class="overview-info">
<div class="overview-title">Switch 开关</div>
<div class="overview-desc">开关切换</div>
</div>
</a>
<a href="/components/entry/textarea" class="overview-card">
<div class="overview-preview">
<div style="width:100%;border:1px solid #d9d9d9;border-radius:4px;padding:6px 10px;min-height:40px;font-size:12px;color:#999">Multi-line text...</div>
</div>
<div class="overview-info">
<div class="overview-title">TextArea 文本域</div>
<div class="overview-desc">多行文本输入</div>
</div>
</a>
<a href="/components/entry/time-picker" class="overview-card">
<div class="overview-preview">
<span class="prev-input">🕐 Pick time</span>
</div>
<div class="overview-info">
<div class="overview-title">TimePicker 时间选择器</div>
<div class="overview-desc">时间选择</div>
</div>
</a>
<a href="/components/entry/transfer" class="overview-card">
<div class="overview-preview">
<div style="display:flex;gap:8px;align-items:center;font-size:12px">
<span class="prev-transfer-box">Left</span>
<span>⇄</span>
<span class="prev-transfer-box">Right</span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Transfer 穿梭框</div>
<div class="overview-desc">双栏穿梭选择</div>
</div>
</a>
<a href="/components/entry/tree-select" class="overview-card">
<div class="overview-preview">
<div class="prev-tree">
<div class="prev-tree-item prev-tree-root">Root</div>
<div class="prev-tree-item">Child 1</div>
<div class="prev-tree-item">Child 2</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">TreeSelect 树选择</div>
<div class="overview-desc">树形选择</div>
</div>
</a>
<a href="/components/entry/upload" class="overview-card">
<div class="overview-preview">
<div style="border:1px dashed #d9d9d9;border-radius:4px;padding:8px 16px;font-size:12px;color:#666;text-align:center">+ Upload</div>
</div>
<div class="overview-info">
<div class="overview-title">Upload 上传</div>
<div class="overview-desc">文件上传</div>
</div>
</a>
</div>
## 数据展示 20 个组件
<div class="overview-grid">
<a href="/components/display/avatar" class="overview-card">
<div class="overview-preview">
<div class="prev-avatar prev-avatar-32 prev-avatar-blue">U</div>
<div class="prev-avatar prev-avatar-32 prev-avatar-green">A</div>
<div class="prev-avatar prev-avatar-32 prev-avatar-gray">C</div>
</div>
<div class="overview-info">
<div class="overview-title">Avatar 头像</div>
<div class="overview-desc">用户头像</div>
</div>
</a>
<a href="/components/display/badge" class="overview-card">
<div class="overview-preview">
<div class="prev-badge-wrap">
<span class="prev-icon">📧</span>
<span class="prev-badge-dot">
<span class="prev-badge-count">5</span>
</span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Badge 徽标</div>
<div class="overview-desc">徽标数</div>
</div>
</a>
<a href="/components/display/calendar" class="overview-card">
<div class="overview-preview">
<div class="prev-calendar">
<span class="prev-calendar-header">M</span><span class="prev-calendar-header">T</span><span class="prev-calendar-header">W</span><span class="prev-calendar-header">T</span><span class="prev-calendar-header">F</span><span class="prev-calendar-header">S</span><span class="prev-calendar-header">S</span>
<span class="prev-calendar-day">1</span><span class="prev-calendar-day">2</span><span class="prev-calendar-day prev-calendar-today">3</span><span class="prev-calendar-day">4</span><span class="prev-calendar-day">5</span><span class="prev-calendar-day">6</span><span class="prev-calendar-day">7</span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Calendar 日历</div>
<div class="overview-desc">日历</div>
</div>
</a>
<a href="/components/display/card" class="overview-card">
<div class="overview-preview">
<div class="prev-card-mini">
<div class="prev-card-header">Card Title</div>
<div class="prev-card-body">Card content area</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Card 卡片</div>
<div class="overview-desc">内容容器</div>
</div>
</a>
<a href="/components/display/carousel" class="overview-card">
<div class="overview-preview" style="flex-direction:column">
<div class="prev-carousel-slide">Slide 1</div>
<div class="prev-carousel-dots">
<span class="prev-carousel-dot prev-carousel-dot-active"></span>
<span class="prev-carousel-dot prev-carousel-dot-inactive"></span>
<span class="prev-carousel-dot prev-carousel-dot-inactive"></span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Carousel 走马灯</div>
<div class="overview-desc">轮播</div>
</div>
</a>
<a href="/components/display/collapse" class="overview-card">
<div class="overview-preview">
<div class="prev-collapse">
<div class="prev-collapse-item">
<div class="prev-collapse-header">Section 1 <span>▾</span></div>
<div class="prev-collapse-content">Content here...</div>
</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Collapse 折叠面板</div>
<div class="overview-desc">可折叠内容</div>
</div>
</a>
<a href="/components/display/descriptions" class="overview-card">
<div class="overview-preview">
<div class="prev-descriptions">
<div class="prev-descriptions-row">
<span class="prev-descriptions-label">Name:</span><span>John</span>
</div>
<div class="prev-descriptions-row">
<span class="prev-descriptions-label">Age:</span><span>28</span>
</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Descriptions 描述列表</div>
<div class="overview-desc">描述列表</div>
</div>
</a>
<a href="/components/display/empty" class="overview-card">
<div class="overview-preview">
<div class="prev-empty">
<div class="prev-empty-icon">📭</div>
<div class="prev-empty-text">No Data</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Empty 空状态</div>
<div class="overview-desc">空状态占位</div>
</div>
</a>
<a href="/components/display/image" class="overview-card">
<div class="overview-preview">
<div class="prev-image-placeholder">🖼</div>
</div>
<div class="overview-info">
<div class="overview-title">Image 图片</div>
<div class="overview-desc">图片展示</div>
</div>
</a>
<a href="/components/display/list" class="overview-card">
<div class="overview-preview" style="flex-direction:column;align-items:stretch">
<div class="prev-list-item">Item 1</div>
<div class="prev-list-item">Item 2</div>
<div class="prev-list-item">Item 3</div>
</div>
<div class="overview-info">
<div class="overview-title">List 列表</div>
<div class="overview-desc">列表</div>
</div>
</a>
<a href="/components/display/popover" class="overview-card">
<div class="overview-preview">
<div class="prev-popover-wrap">
<div class="prev-popover-dot"></div>
<div class="prev-popover-card">Tip content</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Popover 气泡卡片</div>
<div class="overview-desc">气泡弹出</div>
</div>
</a>
<a href="/components/display/qrcode" class="overview-card">
<div class="overview-preview">
<div class="prev-qrcode">
<span class="prev-qrcode-w"></span><span class="prev-qrcode-w"></span><span class="prev-qrcode-b"></span><span class="prev-qrcode-w"></span><span class="prev-qrcode-w"></span>
<span class="prev-qrcode-w"></span><span class="prev-qrcode-b"></span><span class="prev-qrcode-w"></span><span class="prev-qrcode-b"></span><span class="prev-qrcode-w"></span>
<span class="prev-qrcode-b"></span><span class="prev-qrcode-w"></span><span class="prev-qrcode-w"></span><span class="prev-qrcode-w"></span><span class="prev-qrcode-b"></span>
<span class="prev-qrcode-w"></span><span class="prev-qrcode-b"></span><span class="prev-qrcode-w"></span><span class="prev-qrcode-b"></span><span class="prev-qrcode-w"></span>
<span class="prev-qrcode-w"></span><span class="prev-qrcode-w"></span><span class="prev-qrcode-b"></span><span class="prev-qrcode-w"></span><span class="prev-qrcode-w"></span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">QRCode 二维码</div>
<div class="overview-desc">二维码生成</div>
</div>
</a>
<a href="/components/display/segmented" class="overview-card">
<div class="overview-preview">
<div class="prev-segmented">
<span class="prev-segmented-item prev-segmented-active">Day</span>
<span class="prev-segmented-item prev-segmented-inactive">Week</span>
<span class="prev-segmented-item prev-segmented-inactive" style="border-right:none">Month</span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Segmented 分段控制器</div>
<div class="overview-desc">分段选择</div>
</div>
</a>
<a href="/components/display/statistic" class="overview-card">
<div class="overview-preview" style="flex-direction:column;text-align:center">
<span class="prev-stat">1,234</span>
<span class="prev-stat-label">Active Users</span>
</div>
<div class="overview-info">
<div class="overview-title">Statistic 统计数值</div>
<div class="overview-desc">统计数值展示</div>
</div>
</a>
<a href="/components/display/table" class="overview-card">
<div class="overview-preview">
<table class="prev-table">
<thead><tr><th>Name</th><th>Age</th></tr></thead>
<tbody>
<tr><td>Alice</td><td>24</td></tr>
<tr><td>Bob</td><td>28</td></tr>
</tbody>
</table>
</div>
<div class="overview-info">
<div class="overview-title">Table 表格</div>
<div class="overview-desc">数据表格</div>
</div>
</a>
<a href="/components/display/tag" class="overview-card">
<div class="overview-preview">
<span class="prev-tag prev-tag-blue">Tag 1</span>
<span class="prev-tag prev-tag-green">Tag 2</span>
<span class="prev-tag prev-tag-red">Tag 3</span>
</div>
<div class="overview-info">
<div class="overview-title">Tag 标签</div>
<div class="overview-desc">标签</div>
</div>
</a>
<a href="/components/display/timeline" class="overview-card">
<div class="overview-preview" style="flex-direction:column;align-items:flex-start">
<div class="prev-timeline">
<div class="prev-timeline-item">Event 1</div>
<div class="prev-timeline-item">Event 2</div>
<div class="prev-timeline-item">Event 3</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Timeline 时间轴</div>
<div class="overview-desc">时间轴</div>
</div>
</a>
<a href="/components/display/tooltip" class="overview-card">
<div class="overview-preview">
<div style="position:relative">
<span class="prev-tooltip-target">Hover me</span>
<div style="position:absolute;top:-20px;left:0">
<span class="prev-tooltip-bubble">Tooltip text</span>
</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Tooltip 文字提示</div>
<div class="overview-desc">文字提示</div>
</div>
</a>
<a href="/components/display/tour" class="overview-card">
<div class="overview-preview">
<div class="prev-tour-steps">
<span class="prev-tour-dot prev-tour-dot-active">1</span>
<span class="prev-tour-dot prev-tour-dot-pending">2</span>
<span class="prev-tour-dot prev-tour-dot-pending">3</span>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Tour 漫游式引导</div>
<div class="overview-desc">分步引导</div>
</div>
</a>
<a href="/components/display/tree" class="overview-card">
<div class="overview-preview">
<div class="prev-tree">
<div class="prev-tree-item prev-tree-root">Root</div>
<div class="prev-tree-item">Node 1</div>
<div class="prev-tree-item">Node 2</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Tree 树形控件</div>
<div class="overview-desc">树形结构</div>
</div>
</a>
</div>
## 反馈 10 个组件
<div class="overview-grid">
<a href="/components/feedback/alert" class="overview-card">
<div class="overview-preview" style="flex-direction:column;align-items:stretch">
<div class="prev-alert prev-alert-success">✓ Success Tips</div>
</div>
<div class="overview-info">
<div class="overview-title">Alert 警告提示</div>
<div class="overview-desc">警告提示</div>
</div>
</a>
<a href="/components/feedback/drawer" class="overview-card">
<div class="overview-preview">
<div class="prev-drawer">
<div class="prev-drawer-panel">☰</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Drawer 抽屉</div>
<div class="overview-desc">侧边抽屉</div>
</div>
</a>
<a href="/components/feedback/message" class="overview-card">
<div class="overview-preview" style="flex-direction:column;align-items:stretch">
<div class="prev-alert prev-alert-info"> This is a message</div>
</div>
<div class="overview-info">
<div class="overview-title">Message 全局提示</div>
<div class="overview-desc">全局消息提示</div>
</div>
</a>
<a href="/components/feedback/modal" class="overview-card">
<div class="overview-preview">
<div class="prev-modal">
<div class="prev-modal-header">Dialog Title</div>
<div class="prev-modal-body">Content area</div>
<div class="prev-modal-footer">
<span style="color:#999;margin-right:8px">Cancel</span>
<span style="color:#1677ff">OK</span>
</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Modal 对话框</div>
<div class="overview-desc">模态对话框</div>
</div>
</a>
<a href="/components/feedback/notification" class="overview-card">
<div class="overview-preview">
<div class="prev-notification">
<div class="prev-notification-title">🔔 Notification Title</div>
<div class="prev-notification-desc">Description text here</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Notification 通知提醒框</div>
<div class="overview-desc">通知提醒</div>
</div>
</a>
<a href="/components/feedback/popconfirm" class="overview-card">
<div class="overview-preview">
<div class="prev-popconfirm">
<span class="prev-popconfirm-trigger">Delete</span>
<div class="prev-popconfirm-bubble">Are you sure?</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Popconfirm 气泡确认框</div>
<div class="overview-desc">气泡确认</div>
</div>
</a>
<a href="/components/feedback/progress" class="overview-card">
<div class="overview-preview" style="flex-direction:column;align-items:stretch;gap:4px">
<div style="display:flex;justify-content:space-between;font-size:11px;color:#999">
<span>Progress</span><span>68%</span>
</div>
<div class="prev-progress">
<div class="prev-progress-bar" style="width:68%"></div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Progress 进度条</div>
<div class="overview-desc">进度展示</div>
</div>
</a>
<a href="/components/feedback/result" class="overview-card">
<div class="overview-preview">
<div class="prev-result">
<div class="prev-result-icon prev-result-success">✓</div>
<div style="font-size:14px;font-weight:500">Success</div>
<div style="font-size:11px;color:#999">Operation completed</div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Result 结果</div>
<div class="overview-desc">操作结果反馈</div>
</div>
</a>
<a href="/components/feedback/skeleton" class="overview-card">
<div class="overview-preview">
<div style="width:100%">
<div class="prev-skeleton-line" style="width:60%"></div>
<div class="prev-skeleton-line"></div>
<div class="prev-skeleton-line" style="width:80%"></div>
</div>
</div>
<div class="overview-info">
<div class="overview-title">Skeleton 骨架屏</div>
<div class="overview-desc">加载占位</div>
</div>
</a>
<a href="/components/feedback/spin" class="overview-card">
<div class="overview-preview">
<div class="prev-spin"></div>
</div>
<div class="overview-info">
<div class="overview-title">Spin 加载中</div>
<div class="overview-desc">加载状态</div>
</div>
</a>
</div>