Files
xsynergy-android/ui.html
chaoq 08e7478cd1 init version
Signed-off-by: chaoq <chaoq@gxtech.ltd>
2025-09-04 23:45:11 +08:00

1220 lines
40 KiB
HTML
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.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>XSynergy - AR远程协作APP设计原型</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Source Han Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
background: #f5f5f5;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
padding: 20px;
}
/* Color Variables */
:root {
--primary: #0A7CFF;
--secondary: #F0F8FF;
--accent: #FFD700;
--danger: #FF4D4F;
--success: #52C41A;
--text-primary: #333333;
--text-secondary: #888888;
--text-white: #FFFFFF;
}
.phone-container {
width: 375px;
height: 812px;
background: white;
border-radius: 30px;
box-shadow: 0 10px 40px rgba(0,0,0,0.15);
overflow: hidden;
position: relative;
}
.screen {
width: 100%;
height: 100%;
display: none;
flex-direction: column;
}
.screen.active {
display: flex;
}
.status-bar {
height: 44px;
background: var(--text-primary);
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px;
color: white;
font-size: 14px;
}
.nav-controls {
position: fixed;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 10px;
z-index: 1000;
background: rgba(255,255,255,0.9);
padding: 10px;
border-radius: 20px;
backdrop-filter: blur(10px);
}
.nav-btn {
padding: 8px 16px;
border: 1px solid var(--primary);
background: white;
color: var(--primary);
border-radius: 20px;
cursor: pointer;
transition: all 0.3s;
font-size: 12px;
}
.nav-btn.active {
background: var(--primary);
color: white;
}
/* Login Screen */
.login-screen {
padding: 60px 32px;
text-align: center;
}
.logo {
font-size: 32px;
font-weight: bold;
color: var(--primary);
margin-bottom: 60px;
}
.input-group {
margin-bottom: 24px;
text-align: left;
}
.input-field {
width: 100%;
height: 48px;
padding: 0 16px;
border: 1px solid #e0e0e0;
border-radius: 8px;
background: #f8f9fa;
font-size: 16px;
transition: border-color 0.3s;
}
.input-field:focus {
outline: none;
border-color: var(--primary);
}
.code-input-group {
display: flex;
gap: 12px;
align-items: center;
}
.code-input {
flex: 1;
}
.code-btn {
height: 48px;
padding: 0 16px;
background: var(--primary);
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
font-size: 14px;
}
.primary-btn {
width: 100%;
height: 48px;
background: var(--primary);
color: white;
border: none;
border-radius: 8px;
font-size: 16px;
font-weight: 500;
cursor: pointer;
margin: 32px 0;
transition: background 0.3s;
}
.primary-btn:hover {
background: #0066cc;
}
.checkbox-group {
display: flex;
align-items: center;
gap: 8px;
margin: 16px 0;
justify-content: flex-start;
}
.links {
display: flex;
justify-content: space-between;
margin-top: 16px;
}
.link {
color: var(--primary);
text-decoration: none;
font-size: 14px;
}
/* Dashboard */
.dashboard {
flex: 1;
padding: 20px;
padding-bottom: 80px;
}
.greeting {
font-size: 24px;
font-weight: bold;
color: var(--text-primary);
margin-bottom: 32px;
}
.action-section {
margin-bottom: 40px;
}
.large-btn {
width: 100%;
height: 60px;
background: var(--primary);
color: white;
border: none;
border-radius: 12px;
font-size: 18px;
font-weight: 600;
margin-bottom: 16px;
cursor: pointer;
transition: transform 0.2s;
}
.large-btn:active {
transform: scale(0.98);
}
.secondary-btn {
width: 100%;
height: 48px;
background: white;
color: var(--primary);
border: 2px solid var(--primary);
border-radius: 8px;
font-size: 16px;
margin-bottom: 16px;
cursor: pointer;
}
.text-btn {
background: none;
border: none;
color: var(--primary);
font-size: 16px;
cursor: pointer;
text-decoration: underline;
}
.section-title {
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 16px;
}
.meeting-card {
background: white;
border-radius: 12px;
padding: 16px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
margin-bottom: 12px;
position: relative;
}
.meeting-title {
font-size: 16px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 8px;
}
.meeting-meta {
color: var(--text-secondary);
font-size: 14px;
}
.status-badge {
position: absolute;
top: 16px;
right: 16px;
background: var(--accent);
color: var(--text-primary);
padding: 4px 8px;
border-radius: 12px;
font-size: 12px;
font-weight: 500;
}
.join-btn {
width: 100%;
height: 36px;
background: var(--success);
color: white;
border: none;
border-radius: 6px;
font-size: 14px;
margin-top: 12px;
cursor: pointer;
}
/* Bottom Tab Bar */
.bottom-tabs {
position: absolute;
bottom: 0;
width: 100%;
height: 80px;
background: white;
border-top: 1px solid #e0e0e0;
display: flex;
align-items: center;
justify-content: space-around;
padding-bottom: 20px;
}
.tab-item {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
cursor: pointer;
color: var(--text-secondary);
transition: color 0.3s;
}
.tab-item.active {
color: var(--primary);
}
.tab-icon {
width: 24px;
height: 24px;
background: currentColor;
mask-size: contain;
mask-repeat: no-repeat;
mask-position: center;
}
.tab-icon.home { mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m3 12 2-2m0 0 7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6'/%3E%3C/svg%3E"); }
.tab-icon.contacts { mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z'/%3E%3C/svg%3E"); }
.tab-icon.history { mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z'/%3E%3C/svg%3E"); }
.tab-icon.profile { mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z'/%3E%3C/svg%3E"); }
.tab-label {
font-size: 12px;
}
/* AR Session Screen */
.ar-session {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
position: relative;
overflow: hidden;
}
.camera-view {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(45deg, #2196f3, #21cbf3);
opacity: 0.8;
}
.ar-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
.top-bar {
position: absolute;
top: 44px;
left: 0;
right: 0;
height: 60px;
background: rgba(0,0,0,0.5);
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px;
pointer-events: all;
}
.session-info {
display: flex;
align-items: center;
gap: 12px;
color: white;
}
.timer {
font-size: 16px;
font-weight: 600;
}
.network-status {
width: 20px;
height: 20px;
background: var(--success);
border-radius: 50%;
}
.hangup-btn {
width: 48px;
height: 48px;
background: var(--danger);
border: none;
border-radius: 50%;
color: white;
font-size: 20px;
cursor: pointer;
}
.video-pip {
position: absolute;
top: 120px;
right: 20px;
width: 120px;
height: 160px;
background: rgba(0,0,0,0.8);
border-radius: 12px;
border: 2px solid white;
pointer-events: all;
cursor: pointer;
}
.bottom-controls {
position: absolute;
bottom: 40px;
left: 20px;
right: 20px;
height: 80px;
background: rgba(0,0,0,0.7);
border-radius: 40px;
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
pointer-events: all;
}
.control-btn {
width: 48px;
height: 48px;
border-radius: 50%;
border: none;
background: rgba(255,255,255,0.2);
color: white;
font-size: 20px;
cursor: pointer;
transition: background 0.3s;
}
.control-btn:hover {
background: rgba(255,255,255,0.3);
}
.control-btn.active {
background: var(--primary);
}
/* AR Annotations */
.ar-annotation {
position: absolute;
background: var(--accent);
color: var(--text-primary);
padding: 8px 12px;
border-radius: 20px;
font-size: 14px;
font-weight: 600;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.1); }
}
.annotation-1 { top: 200px; left: 50px; }
.annotation-2 { top: 400px; right: 60px; }
.annotation-3 { bottom: 200px; left: 80px; }
/* History Screen */
.history-screen {
flex: 1;
padding: 20px;
padding-bottom: 100px;
}
.search-bar {
width: 100%;
height: 40px;
padding: 0 16px;
border: 1px solid #e0e0e0;
border-radius: 20px;
background: #f8f9fa;
font-size: 14px;
margin-bottom: 24px;
}
.history-item {
background: white;
border-radius: 12px;
padding: 16px;
margin-bottom: 12px;
box-shadow: 0 2px 8px rgba(0,0,0,0.08);
}
.history-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 12px;
}
.history-title {
font-size: 16px;
font-weight: 600;
color: var(--text-primary);
}
.history-date {
font-size: 12px;
color: var(--text-secondary);
}
.participants {
display: flex;
gap: 8px;
margin: 12px 0;
}
.avatar {
width: 32px;
height: 32px;
border-radius: 50%;
background: var(--primary);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 12px;
font-weight: 600;
}
.history-actions {
display: flex;
gap: 12px;
margin-top: 12px;
}
.action-btn {
flex: 1;
height: 36px;
border: 1px solid var(--primary);
background: white;
color: var(--primary);
border-radius: 6px;
font-size: 14px;
cursor: pointer;
}
.action-btn.primary {
background: var(--primary);
color: white;
}
/* Contact Screen */
.contact-screen {
flex: 1;
padding: 20px;
padding-bottom: 100px;
}
.org-tree {
margin-top: 16px;
}
.org-item {
background: white;
border-radius: 8px;
margin-bottom: 8px;
overflow: hidden;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.org-header {
padding: 16px;
display: flex;
align-items: center;
justify-content: space-between;
cursor: pointer;
border-left: 4px solid var(--primary);
}
.org-name {
font-size: 16px;
font-weight: 600;
color: var(--text-primary);
}
.member-count {
font-size: 12px;
color: var(--text-secondary);
}
.members-list {
display: none;
background: var(--secondary);
padding: 8px 0;
}
.members-list.expanded {
display: block;
}
.member-item {
padding: 12px 20px;
display: flex;
align-items: center;
gap: 12px;
cursor: pointer;
transition: background 0.2s;
}
.member-item:hover {
background: rgba(10, 124, 255, 0.1);
}
.member-info {
flex: 1;
}
.member-name {
font-size: 14px;
font-weight: 500;
color: var(--text-primary);
}
.member-role {
font-size: 12px;
color: var(--text-secondary);
}
/* Profile Screen */
.profile-screen {
flex: 1;
padding: 20px;
padding-bottom: 100px;
}
.profile-header {
text-align: center;
padding: 40px 0;
border-bottom: 1px solid #e0e0e0;
margin-bottom: 32px;
}
.profile-avatar {
width: 80px;
height: 80px;
border-radius: 50%;
background: var(--primary);
margin: 0 auto 16px;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 32px;
font-weight: 600;
}
.profile-name {
font-size: 20px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 4px;
}
.profile-role {
font-size: 14px;
color: var(--text-secondary);
}
.profile-menu {
list-style: none;
}
.menu-item {
background: white;
border-radius: 8px;
margin-bottom: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.menu-link {
display: block;
padding: 16px;
color: var(--text-primary);
text-decoration: none;
font-size: 16px;
}
.logout-btn {
width: 100%;
height: 48px;
background: white;
color: var(--danger);
border: 2px solid var(--danger);
border-radius: 8px;
font-size: 16px;
margin-top: 32px;
cursor: pointer;
}
/* Empty State */
.empty-state {
text-align: center;
padding: 60px 20px;
color: var(--text-secondary);
}
.empty-icon {
width: 80px;
height: 80px;
background: #f0f0f0;
border-radius: 50%;
margin: 0 auto 20px;
display: flex;
align-items: center;
justify-content: center;
font-size: 32px;
}
.empty-text {
font-size: 16px;
margin-bottom: 20px;
}
.empty-action {
background: var(--primary);
color: white;
border: none;
padding: 12px 24px;
border-radius: 6px;
cursor: pointer;
}
</style>
</head>
<body>
<div class="phone-container">
<!-- Login Screen -->
<div class="screen active" id="login">
<div class="status-bar">
<span>9:41</span>
<span>100%</span>
</div>
<div class="login-screen">
<div class="logo">XSynergy</div>
<div class="input-group">
<input type="tel" class="input-field" placeholder="手机号">
</div>
<div class="input-group">
<div class="code-input-group">
<input type="text" class="input-field code-input" placeholder="验证码">
<button class="code-btn">获取验证码</button>
</div>
</div>
<button class="primary-btn" onclick="switchScreen('dashboard')">登录</button>
<div class="checkbox-group">
<input type="checkbox" id="remember">
<label for="remember">记住我</label>
</div>
<div class="links">
<a href="#" class="link">忘记密码</a>
<a href="#" class="link">SSO登录</a>
</div>
</div>
</div>
<!-- Dashboard Screen -->
<div class="screen" id="dashboard">
<div class="status-bar">
<span>9:41</span>
<span>100%</span>
</div>
<div class="dashboard">
<div class="greeting">你好,李明</div>
<div class="action-section">
<button class="large-btn" onclick="switchScreen('ar-session')">发起协作</button>
<button class="secondary-btn">加入协作</button>
<button class="text-btn">预约协作</button>
</div>
<div class="section-title">今日预约</div>
<div class="meeting-card">
<div class="status-badge">即将开始</div>
<div class="meeting-title">设备检修会议</div>
<div class="meeting-meta">14:30 - 15:30 | 发起人:王工</div>
<button class="join-btn">立即加入</button>
</div>
<div class="meeting-card">
<div class="meeting-title">项目评审会议</div>
<div class="meeting-meta">16:00 - 17:00 | 发起人:张总</div>
</div>
</div>
<div class="bottom-tabs">
<div class="tab-item active" onclick="switchTab('dashboard')">
<div class="tab-icon home"></div>
<span class="tab-label">首页</span>
</div>
<div class="tab-item" onclick="switchTab('contacts')">
<div class="tab-icon contacts"></div>
<span class="tab-label">通讯录</span>
</div>
<div class="tab-item" onclick="switchTab('history')">
<div class="tab-icon history"></div>
<span class="tab-label">历史</span>
</div>
<div class="tab-item" onclick="switchTab('profile')">
<div class="tab-icon profile"></div>
<span class="tab-label">我的</span>
</div>
</div>
</div>
<!-- AR Session Screen -->
<div class="screen" id="ar-session">
<div class="status-bar">
<span>9:41</span>
<span>100%</span>
</div>
<div class="ar-session">
<div class="camera-view"></div>
<div class="ar-overlay">
<div class="ar-annotation annotation-1">检查这里</div>
<div class="ar-annotation annotation-2">注意温度</div>
<div class="ar-annotation annotation-3">更换部件</div>
</div>
<div class="top-bar">
<div class="session-info">
<div class="timer">15:32</div>
<div class="network-status"></div>
</div>
<button class="hangup-btn" onclick="switchScreen('dashboard')"></button>
</div>
<div class="video-pip"></div>
<div class="bottom-controls">
<button class="control-btn">🎤</button>
<button class="control-btn">📹</button>
<button class="control-btn active">✏️</button>
<button class="control-btn">📤</button>
<button class="control-btn"></button>
</div>
</div>
</div>
<!-- History Screen -->
<div class="screen" id="history">
<div class="status-bar">
<span>9:41</span>
<span>100%</span>
</div>
<div class="history-screen">
<input type="text" class="search-bar" placeholder="搜索会议主题或参会人">
<div class="history-item">
<div class="history-header">
<div class="history-title">设备检修指导</div>
<div class="history-date">今天 14:30</div>
</div>
<div class="participants">
<div class="avatar"></div>
<div class="avatar"></div>
<div class="avatar"></div>
</div>
<div class="history-actions">
<button class="action-btn">回放</button>
<button class="action-btn primary">查看纪要</button>
</div>
</div>
<div class="history-item">
<div class="history-header">
<div class="history-title">新员工培训</div>
<div class="history-date">昨天 09:15</div>
</div>
<div class="participants">
<div class="avatar"></div>
<div class="avatar"></div>
</div>
<div class="history-actions">
<button class="action-btn">回放</button>
<button class="action-btn">查看纪要</button>
</div>
</div>
<div class="history-item">
<div class="history-header">
<div class="history-title">安全检查会议</div>
<div class="history-date">2天前 16:00</div>
</div>
<div class="participants">
<div class="avatar"></div>
<div class="avatar"></div>
<div class="avatar"></div>
<div class="avatar">+2</div>
</div>
<div class="history-actions">
<button class="action-btn">回放</button>
<button class="action-btn">查看纪要</button>
</div>
</div>
</div>
<div class="bottom-tabs">
<div class="tab-item" onclick="switchTab('dashboard')">
<div class="tab-icon home"></div>
<span class="tab-label">首页</span>
</div>
<div class="tab-item" onclick="switchTab('contacts')">
<div class="tab-icon contacts"></div>
<span class="tab-label">通讯录</span>
</div>
<div class="tab-item active" onclick="switchTab('history')">
<div class="tab-icon history"></div>
<span class="tab-label">历史</span>
</div>
<div class="tab-item" onclick="switchTab('profile')">
<div class="tab-icon profile"></div>
<span class="tab-label">我的</span>
</div>
</div>
</div>
<!-- Contacts Screen -->
<div class="screen" id="contacts">
<div class="status-bar">
<span>9:41</span>
<span>100%</span>
</div>
<div class="contact-screen">
<input type="text" class="search-bar" placeholder="搜索姓名/部门/职位">
<div class="org-tree">
<div class="org-item">
<div class="org-header" onclick="toggleOrgItem(this)">
<div class="org-name">技术部</div>
<div class="member-count">12人 </div>
</div>
<div class="members-list">
<div class="member-item">
<div class="avatar"></div>
<div class="member-info">
<div class="member-name">李明</div>
<div class="member-role">高级工程师</div>
</div>
</div>
<div class="member-item">
<div class="avatar"></div>
<div class="member-info">
<div class="member-name">王强</div>
<div class="member-role">技术专家</div>
</div>
</div>
<div class="member-item">
<div class="avatar"></div>
<div class="member-info">
<div class="member-name">张伟</div>
<div class="member-role">工程师</div>
</div>
</div>
</div>
</div>
<div class="org-item">
<div class="org-header" onclick="toggleOrgItem(this)">
<div class="org-name">运营部</div>
<div class="member-count">8人 </div>
</div>
<div class="members-list">
<div class="member-item">
<div class="avatar"></div>
<div class="member-info">
<div class="member-name">陈静</div>
<div class="member-role">运营经理</div>
</div>
</div>
<div class="member-item">
<div class="avatar"></div>
<div class="member-info">
<div class="member-name">赵磊</div>
<div class="member-role">运营专员</div>
</div>
</div>
</div>
</div>
<div class="org-item">
<div class="org-header" onclick="toggleOrgItem(this)">
<div class="org-name">销售部</div>
<div class="member-count">15人 </div>
</div>
<div class="members-list">
<div class="member-item">
<div class="avatar"></div>
<div class="member-info">
<div class="member-name">孙丽</div>
<div class="member-role">销售总监</div>
</div>
</div>
<div class="member-item">
<div class="avatar"></div>
<div class="member-info">
<div class="member-name">周华</div>
<div class="member-role">销售经理</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="bottom-tabs">
<div class="tab-item" onclick="switchTab('dashboard')">
<div class="tab-icon home"></div>
<span class="tab-label">首页</span>
</div>
<div class="tab-item active" onclick="switchTab('contacts')">
<div class="tab-icon contacts"></div>
<span class="tab-label">通讯录</span>
</div>
<div class="tab-item" onclick="switchTab('history')">
<div class="tab-icon history"></div>
<span class="tab-label">历史</span>
</div>
<div class="tab-item" onclick="switchTab('profile')">
<div class="tab-icon profile"></div>
<span class="tab-label">我的</span>
</div>
</div>
</div>
<!-- Profile Screen -->
<div class="screen" id="profile">
<div class="status-bar">
<span>9:41</span>
<span>100%</span>
</div>
<div class="profile-screen">
<div class="profile-header">
<div class="profile-avatar"></div>
<div class="profile-name">李明</div>
<div class="profile-role">技术部 · 高级工程师</div>
</div>
<ul class="profile-menu">
<li class="menu-item">
<a href="#" class="menu-link">个人资料</a>
</li>
<li class="menu-item">
<a href="#" class="menu-link">设置</a>
</li>
<li class="menu-item">
<a href="#" class="menu-link">帮助与反馈</a>
</li>
<li class="menu-item">
<a href="#" class="menu-link">关于我们</a>
</li>
</ul>
<button class="logout-btn" onclick="switchScreen('login')">退出登录</button>
</div>
<div class="bottom-tabs">
<div class="tab-item" onclick="switchTab('dashboard')">
<div class="tab-icon home"></div>
<span class="tab-label">首页</span>
</div>
<div class="tab-item" onclick="switchTab('contacts')">
<div class="tab-icon contacts"></div>
<span class="tab-label">通讯录</span>
</div>
<div class="tab-item" onclick="switchTab('history')">
<div class="tab-icon history"></div>
<span class="tab-label">历史</span>
</div>
<div class="tab-item active" onclick="switchTab('profile')">
<div class="tab-icon profile"></div>
<span class="tab-label">我的</span>
</div>
</div>
</div>
<!-- Empty State Example -->
<div class="screen" id="empty">
<div class="status-bar">
<span>9:41</span>
<span>100%</span>
</div>
<div class="empty-state">
<div class="empty-icon">📅</div>
<div class="empty-text">暂无预约会议,发起一个吧!</div>
<button class="empty-action">发起协作</button>
</div>
</div>
</div>
<!-- Navigation Controls -->
<div class="nav-controls">
<button class="nav-btn active" onclick="switchScreen('login')">登录</button>
<button class="nav-btn" onclick="switchScreen('dashboard')">主页</button>
<button class="nav-btn" onclick="switchScreen('ar-session')">AR协作</button>
<button class="nav-btn" onclick="switchScreen('history')">历史</button>
<button class="nav-btn" onclick="switchScreen('contacts')">通讯录</button>
<button class="nav-btn" onclick="switchScreen('profile')">我的</button>
</div>
<script>
let currentScreen = 'login';
let currentTab = 'dashboard';
function switchScreen(screenId) {
// Hide all screens
document.querySelectorAll('.screen').forEach(screen => {
screen.classList.remove('active');
});
// Show target screen
document.getElementById(screenId).classList.add('active');
currentScreen = screenId;
// Update nav buttons
document.querySelectorAll('.nav-btn').forEach(btn => {
btn.classList.remove('active');
});
document.querySelector(`[onclick="switchScreen('${screenId}')"]`).classList.add('active');
}
function switchTab(tabId) {
switchScreen(tabId);
currentTab = tabId;
// Update tab bar for the current screen
const currentScreenElement = document.getElementById(tabId);
if (currentScreenElement) {
const tabItems = currentScreenElement.querySelectorAll('.tab-item');
tabItems.forEach(item => item.classList.remove('active'));
const targetTab = currentScreenElement.querySelector(`[onclick="switchTab('${tabId}')"]`);
if (targetTab) {
targetTab.classList.add('active');
}
}
}
function toggleOrgItem(header) {
const membersList = header.nextElementSibling;
const isExpanded = membersList.classList.contains('expanded');
// Close all other items
document.querySelectorAll('.members-list').forEach(list => {
list.classList.remove('expanded');
});
// Toggle current item
if (!isExpanded) {
membersList.classList.add('expanded');
header.querySelector('.member-count').innerHTML = header.querySelector('.member-count').innerHTML.replace('', '⌄');
} else {
header.querySelector('.member-count').innerHTML = header.querySelector('.member-count').innerHTML.replace('⌄', '');
}
}
// Add some interactive animations
document.addEventListener('DOMContentLoaded', function() {
// Add click animations to buttons
document.querySelectorAll('button, .tab-item, .member-item').forEach(element => {
element.addEventListener('click', function() {
this.style.transform = 'scale(0.95)';
setTimeout(() => {
this.style.transform = 'scale(1)';
}, 150);
});
});
// Simulate AR annotations movement
setInterval(() => {
const annotations = document.querySelectorAll('.ar-annotation');
annotations.forEach(annotation => {
const randomX = Math.random() * 10 - 5;
const randomY = Math.random() * 10 - 5;
annotation.style.transform = `translate(${randomX}px, ${randomY}px)`;
});
}, 3000);
// Auto-hide AR controls demonstration
let controlsTimeout;
const arSession = document.getElementById('ar-session');
const controls = arSession.querySelector('.bottom-controls');
arSession.addEventListener('click', function() {
controls.style.opacity = '1';
clearTimeout(controlsTimeout);
controlsTimeout = setTimeout(() => {
controls.style.opacity = '0.7';
}, 5000);
});
});
// Simulate real-time updates
setInterval(() => {
const timer = document.querySelector('.timer');
if (timer && currentScreen === 'ar-session') {
const currentTime = timer.textContent.split(':');
let minutes = parseInt(currentTime[0]);
let seconds = parseInt(currentTime[1]);
seconds++;
if (seconds >= 60) {
seconds = 0;
minutes++;
}
timer.textContent = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
}
}, 1000);
</script>
</body>
</html>