UNPKG

@lishangpei/nav-sidebar

Version:

企业级站点导航组件 - 基于 Web Components,真正的跨框架复用

663 lines (573 loc) 12.1 kB
/* Nav Sidebar Styles */ .nav-sidebar-container { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif; box-sizing: border-box; } .nav-sidebar-container *, .nav-sidebar-container *::before, .nav-sidebar-container *::after { box-sizing: inherit; } /* Floating Trigger Button */ .nav-sidebar-float-trigger { position: fixed; top: 20px; right: 20px; width: 56px; height: 56px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 50%; box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4); cursor: pointer; z-index: 1001; display: flex; align-items: center; justify-content: center; font-size: 24px; transition: all 0.3s ease; border: none; color: white; } .nav-sidebar-float-trigger:hover { transform: scale(1.1); box-shadow: 0 6px 16px rgba(102, 126, 234, 0.6); } .nav-sidebar-float-trigger:active { transform: scale(0.95); } /* Top Navigation Bar - Now Hidden by Default */ .nav-sidebar-topbar { position: fixed; top: 0; left: 0; right: 0; height: 60px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); z-index: 1000; display: flex; align-items: center; padding: 0 20px; gap: 20px; transform: translateY(-100%); transition: transform 0.3s ease; } .nav-sidebar-topbar.visible { transform: translateY(0); } /* Search Box */ .nav-sidebar-search-container { flex: 1; max-width: 600px; position: relative; } .nav-sidebar-search-input { width: 100%; height: 40px; padding: 0 40px 0 15px; border: none; border-radius: 20px; font-size: 14px; outline: none; background: rgba(255, 255, 255, 0.95); transition: all 0.3s ease; } .nav-sidebar-search-input:focus { background: white; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .nav-sidebar-search-input::placeholder { color: #999; } .nav-sidebar-search-icon { position: absolute; right: 15px; top: 50%; transform: translateY(-50%); color: #666; pointer-events: none; } /* Environment Switcher */ .nav-sidebar-env-switcher { display: flex; gap: 8px; background: rgba(255, 255, 255, 0.15); padding: 4px; border-radius: 20px; } .nav-sidebar-env-btn { background: transparent; border: none; color: rgba(255, 255, 255, 0.7); padding: 6px 14px; border-radius: 16px; cursor: pointer; font-size: 13px; font-weight: 500; transition: all 0.2s ease; white-space: nowrap; } .nav-sidebar-env-btn:hover { color: white; background: rgba(255, 255, 255, 0.1); } .nav-sidebar-env-btn.active { background: rgba(255, 255, 255, 0.3); color: white; } /* Toggle Button */ .nav-sidebar-toggle { background: rgba(255, 255, 255, 0.2); border: 2px solid rgba(255, 255, 255, 0.5); color: white; padding: 8px 16px; border-radius: 20px; cursor: pointer; font-size: 14px; font-weight: 500; transition: all 0.3s ease; white-space: nowrap; } .nav-sidebar-toggle:hover { background: rgba(255, 255, 255, 0.3); border-color: rgba(255, 255, 255, 0.8); } /* Sidebar */ .nav-sidebar-sidebar { position: fixed; top: 0; right: 0; width: 320px; height: 100vh; background: white; box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15); transform: translateX(100%); transition: transform 0.3s ease; z-index: 1002; overflow-y: auto; padding: 20px; } .nav-sidebar-sidebar.open { transform: translateX(0); } /* Sidebar with topbar visible */ .nav-sidebar-topbar.visible ~ .nav-sidebar-sidebar { top: 60px; height: calc(100vh - 60px); } /* Sidebar Header */ .nav-sidebar-sidebar-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; padding-bottom: 15px; border-bottom: 2px solid #f0f0f0; } .nav-sidebar-sidebar-title { font-size: 18px; font-weight: 600; color: #333; margin: 0; } .nav-sidebar-close { background: none; border: none; font-size: 24px; color: #666; cursor: pointer; padding: 0; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; border-radius: 50%; transition: all 0.2s ease; } .nav-sidebar-close:hover { background: #f0f0f0; color: #333; } /* Environment Badge in Sidebar */ .nav-sidebar-env-badge { display: inline-block; padding: 4px 10px; border-radius: 12px; font-size: 12px; font-weight: 600; margin-left: 8px; } .nav-sidebar-env-badge.env-st { background: #e3f2fd; color: #1976d2; } .nav-sidebar-env-badge.env-uat { background: #fff3e0; color: #f57c00; } .nav-sidebar-env-badge.env-prd { background: #e8f5e9; color: #388e3c; } /* Site List */ .nav-sidebar-sites-list { list-style: none; padding: 0; margin: 0; } /* Frequent Visits Section */ .nav-sidebar-frequent-section { margin-bottom: 20px; } .nav-sidebar-frequent-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; padding: 0 5px; } .nav-sidebar-frequent-title { font-size: 14px; font-weight: 600; color: #667eea; } .nav-sidebar-frequent-clear { background: none; border: none; color: #999; font-size: 12px; cursor: pointer; padding: 4px 8px; border-radius: 4px; transition: all 0.2s ease; } .nav-sidebar-frequent-clear:hover { background: #f0f0f0; color: #667eea; } .nav-sidebar-frequent-list { list-style: none; padding: 0; margin: 0; } .nav-sidebar-frequent-item { margin-bottom: 6px; } .nav-sidebar-frequent-link { display: flex; align-items: center; padding: 10px 12px; text-decoration: none; background: linear-gradient(135deg, #667eea15 0%, #764ba215 100%); border-radius: 8px; transition: all 0.2s ease; border: 1px solid transparent; } .nav-sidebar-frequent-link:hover { background: linear-gradient(135deg, #667eea25 0%, #764ba225 100%); border-color: #667eea; transform: translateX(3px); } .nav-sidebar-frequent-rank { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 50%; font-size: 12px; font-weight: bold; margin-right: 12px; flex-shrink: 0; } .nav-sidebar-frequent-info { flex: 1; min-width: 0; } .nav-sidebar-frequent-name { font-size: 14px; font-weight: 500; color: #333; margin-bottom: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .nav-sidebar-frequent-count { font-size: 11px; color: #667eea; font-weight: 500; } /* Divider */ .nav-sidebar-divider { height: 1px; background: linear-gradient(90deg, transparent, #e0e0e0, transparent); margin: 20px 0; } /* All Sites Header */ .nav-sidebar-all-sites-header { font-size: 13px; font-weight: 600; color: #999; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; padding: 0 5px; } .nav-sidebar-site-item { margin-bottom: 8px; border-radius: 8px; overflow: hidden; transition: all 0.2s ease; } .nav-sidebar-site-item.hidden { display: none; } .nav-sidebar-site-link { display: block; padding: 12px 15px; text-decoration: none; color: #333; background: #f8f9fa; transition: all 0.2s ease; border-left: 3px solid transparent; } .nav-sidebar-site-link:hover { background: #e9ecef; border-left-color: #667eea; transform: translateX(3px); } .nav-sidebar-site-name { font-weight: 500; font-size: 15px; margin-bottom: 4px; color: #333; } .nav-sidebar-site-url { font-size: 12px; color: #666; word-break: break-all; } /* Highlight Search Results */ .nav-sidebar-highlight { background-color: #fff59d; padding: 2px 0; font-weight: 600; } /* Empty State */ .nav-sidebar-empty { text-align: center; padding: 40px 20px; color: #999; } .nav-sidebar-empty-icon { font-size: 48px; margin-bottom: 15px; } .nav-sidebar-empty-text { font-size: 14px; } /* Loading State */ .nav-sidebar-loading { text-align: center; padding: 40px 20px; color: #666; } .nav-sidebar-spinner { border: 3px solid #f3f3f3; border-top: 3px solid #667eea; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 0 auto 15px; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* Body padding - No longer needed by default */ body.nav-sidebar-active { padding-top: 0; } body.nav-sidebar-active.nav-sidebar-topbar-visible { padding-top: 60px; } /* Overlay */ .nav-sidebar-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.3); z-index: 999; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; } .nav-sidebar-overlay.visible { opacity: 1; pointer-events: auto; } /* Tag Type Selector */ .nav-sidebar-tag-type-selector { margin-bottom: 16px; padding-bottom: 16px; border-bottom: 1px solid #e0e0e0; } .nav-sidebar-tag-selector-header { font-size: 12px; font-weight: 600; color: #999; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 10px; padding: 0 5px; } .nav-sidebar-tag-selector-buttons { display: flex; flex-wrap: wrap; gap: 8px; } .nav-sidebar-tag-type-btn { background: #f8f9fa; border: 2px solid #e0e0e0; color: #666; padding: 6px 14px; border-radius: 16px; cursor: pointer; font-size: 13px; font-weight: 500; transition: all 0.2s ease; white-space: nowrap; } .nav-sidebar-tag-type-btn:hover { background: #e9ecef; border-color: #667eea; color: #667eea; } .nav-sidebar-tag-type-btn.active { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-color: #667eea; color: white; box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3); } /* Tag Classification Styles */ .nav-sidebar-tag-group { margin-bottom: 12px; } .nav-sidebar-tag-value-header { display: flex; justify-content: space-between; align-items: center; padding: 10px 12px; margin-bottom: 0; background: #f8f9fa; border-radius: 6px; border-left: 3px solid #667eea; cursor: pointer; transition: all 0.2s ease; user-select: none; } .nav-sidebar-tag-value-header:hover { background: #e9ecef; border-left-width: 4px; } .nav-sidebar-tag-label { font-size: 14px; font-weight: 600; color: #333; } .nav-sidebar-tag-header-right { display: flex; align-items: center; gap: 10px; } .nav-sidebar-tag-count { font-size: 11px; font-weight: 600; color: #667eea; background: white; padding: 3px 10px; border-radius: 12px; border: 1px solid #e0e0e0; } .nav-sidebar-collapse-icon { font-size: 10px; color: #999; transition: transform 0.2s ease; display: inline-block; } .nav-sidebar-tag-sites-list { list-style: none; padding: 0; margin: 8px 0 0 0; overflow: hidden; max-height: 2000px; transition: max-height 0.3s ease, opacity 0.3s ease, margin 0.3s ease; opacity: 1; } .nav-sidebar-tag-sites-list.collapsed { max-height: 0; opacity: 0; margin: 0; } .nav-sidebar-tag-sites-list .nav-sidebar-site-item { margin-bottom: 6px; } .nav-sidebar-tag-sites-list .nav-sidebar-site-link { padding: 10px 12px; background: #fafbfc; } .nav-sidebar-tag-sites-list .nav-sidebar-site-link:hover { background: #e9ecef; } /* Responsive adjustments */ @media (max-width: 768px) { .nav-sidebar-float-trigger { width: 48px; height: 48px; font-size: 20px; top: 15px; right: 15px; } .nav-sidebar-sidebar { width: 100%; max-width: 320px; } .nav-sidebar-env-switcher { order: -1; width: 100%; } .nav-sidebar-topbar { flex-wrap: wrap; height: auto; min-height: 60px; padding: 10px 20px; } .nav-sidebar-search-container { order: 1; width: 100%; max-width: none; } .nav-sidebar-tag-selector-buttons { gap: 6px; } .nav-sidebar-tag-type-btn { font-size: 12px; padding: 5px 12px; } .nav-sidebar-tag-group { margin-bottom: 10px; } .nav-sidebar-tag-value-header { padding: 8px 10px; } .nav-sidebar-tag-label { font-size: 13px; } }