193 lines
8.5 KiB
HTML
193 lines
8.5 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>BridgeSwarm – Advanced Chat</title>
|
||
<link rel="stylesheet" href="style.css">
|
||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/styles/atom-one-dark.min.css">
|
||
<script src="../shared/boot.js"></script>
|
||
<script>if (BridgeSwarmExamples.guardFileProtocol('chat-advanced/')) { /* blocked */ }</script>
|
||
</head>
|
||
<body>
|
||
<a class="bs-back-link" href="../">← Examples</a>
|
||
|
||
<div class="mobile-bar">
|
||
<button type="button" class="btn-icon" id="btnToggleLeft" aria-label="Open rooms and users" title="Rooms & users">☰</button>
|
||
<span class="mobile-title" id="mobileTitle">#lobby</span>
|
||
<button type="button" class="btn-icon" id="btnToggleRight" aria-label="Open settings and files" title="Settings & files">⚙</button>
|
||
</div>
|
||
<div class="drawer-backdrop hidden" id="drawerBackdrop" aria-hidden="true"></div>
|
||
|
||
<div class="app-container" id="appContainer">
|
||
<aside class="sidebar" id="leftSidebar">
|
||
<div class="sidebar-header">
|
||
<h2>Advanced Chat</h2>
|
||
<button type="button" class="btn-icon btn-leave" id="btnLeave" aria-label="Leave chat" title="Leave" disabled>Leave</button>
|
||
</div>
|
||
|
||
<div class="user-profile">
|
||
<div class="avatar" id="avatar" role="img" aria-label="Your avatar">?</div>
|
||
<div class="user-info">
|
||
<input type="text" id="nickname" placeholder="Nickname" maxlength="20" aria-label="Nickname" disabled>
|
||
<div class="public-key" id="publicKey" title="Click to copy">Your ID: (join to generate)</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="rooms-section">
|
||
<div class="section-header">
|
||
<h3>Rooms</h3>
|
||
<button type="button" class="btn-icon" id="btnCreateRoom" aria-label="Create room" title="Create Room" disabled>+</button>
|
||
</div>
|
||
<ul class="room-list" id="roomList" role="listbox" aria-label="Rooms"></ul>
|
||
</div>
|
||
|
||
<div class="users-section">
|
||
<div class="section-header">
|
||
<h3>Online Users <span id="userCount">(0)</span></h3>
|
||
</div>
|
||
<ul class="user-list" id="userList" aria-live="polite"></ul>
|
||
</div>
|
||
</aside>
|
||
|
||
<main class="chat-area">
|
||
<div class="chat-header">
|
||
<div class="chat-info">
|
||
<h2 id="currentRoom">#lobby</h2>
|
||
<span class="room-topic" id="roomTopic">General discussion</span>
|
||
</div>
|
||
<div class="chat-actions">
|
||
<button type="button" class="btn-icon" id="btnToggleEmoji" aria-label="Emoji picker" title="Emoji" disabled>😊</button>
|
||
<button type="button" class="btn-icon" id="btnSendFile" aria-label="Send file" title="Send File" disabled>📎</button>
|
||
<button type="button" class="btn-icon" id="btnClearChat" aria-label="Clear chat" title="Clear Chat" disabled>🗑️</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="messages" id="messages" role="log" aria-live="polite" aria-relevant="additions">
|
||
<div class="empty-state" id="messagesEmpty">Join a topic to start chatting. Open this page in a second tab to talk P2P.</div>
|
||
</div>
|
||
|
||
<div class="typing-indicator" id="typingIndicator" aria-live="polite">
|
||
<span id="typingUsers"></span> is typing…
|
||
</div>
|
||
|
||
<div class="compose-area">
|
||
<div class="compose-tools">
|
||
<button type="button" class="btn-tool" id="btnBold" aria-label="Bold" title="Bold (Ctrl+B)" disabled><strong>B</strong></button>
|
||
<button type="button" class="btn-tool" id="btnItalic" aria-label="Italic" title="Italic (Ctrl+I)" disabled><em>I</em></button>
|
||
<button type="button" class="btn-tool" id="btnStrike" aria-label="Strikethrough" title="Strikethrough" disabled><s>S</s></button>
|
||
<button type="button" class="btn-tool" id="btnCode" aria-label="Inline code" title="Inline Code" disabled></></button>
|
||
<button type="button" class="btn-tool" id="btnCodeBlock" aria-label="Code block" title="Code Block" disabled>{ }</button>
|
||
<button type="button" class="btn-tool" id="btnLink" aria-label="Insert link" title="Link" disabled>🔗</button>
|
||
<button type="button" class="btn-tool" id="btnList" aria-label="List" title="List" disabled>•</button>
|
||
<button type="button" class="btn-tool" id="btnQuote" aria-label="Quote" title="Quote" disabled>"</button>
|
||
<button type="button" class="btn-tool" id="btnEmoji2" aria-label="Emoji" title="Emoji" disabled>😀</button>
|
||
</div>
|
||
<div class="compose-input">
|
||
<textarea id="messageInput" placeholder="Type a message… (Markdown supported)" rows="1" aria-label="Message" disabled></textarea>
|
||
<button type="button" class="btn-send" id="btnSend" disabled>Send</button>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
|
||
<aside class="right-sidebar" id="rightSidebar">
|
||
<div class="sidebar-section">
|
||
<h3>Room Info</h3>
|
||
<div class="info-item">
|
||
<span class="label">Members:</span>
|
||
<span id="memberCount">0</span>
|
||
</div>
|
||
<div class="info-item">
|
||
<span class="label">Messages:</span>
|
||
<span id="messageCount">0</span>
|
||
</div>
|
||
<div class="info-item">
|
||
<span class="label">Peers:</span>
|
||
<span id="peerCount">0</span>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sidebar-section">
|
||
<h3>Shared Files</h3>
|
||
<ul class="file-list" id="fileList">
|
||
<li class="empty-hint" id="filesEmpty">No shared files yet</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="sidebar-section">
|
||
<h3>Settings</h3>
|
||
<div class="setting-item">
|
||
<label>
|
||
<input type="checkbox" id="chkNotifications">
|
||
Toast alerts
|
||
</label>
|
||
</div>
|
||
<div class="setting-item">
|
||
<label>
|
||
<input type="checkbox" id="chkSounds" checked>
|
||
Sounds
|
||
</label>
|
||
</div>
|
||
<div class="setting-item">
|
||
<label>
|
||
<input type="checkbox" id="chkAutoScroll" checked>
|
||
Auto-scroll
|
||
</label>
|
||
</div>
|
||
<div class="setting-item">
|
||
<label>
|
||
<input type="checkbox" id="chkMarkdown" checked>
|
||
Markdown
|
||
</label>
|
||
</div>
|
||
</div>
|
||
</aside>
|
||
</div>
|
||
|
||
<div class="modal hidden" id="createRoomModal" role="dialog" aria-modal="true" aria-labelledby="createRoomTitle">
|
||
<div class="modal-content">
|
||
<h3 id="createRoomTitle">Create New Room</h3>
|
||
<p class="modal-hint">Rooms are channels on the same Hyperswarm topic. Peers see rooms you create.</p>
|
||
<input type="text" id="newRoomName" placeholder="Room name" maxlength="30" aria-label="Room name">
|
||
<input type="text" id="newRoomTopic" placeholder="Room topic (optional)" maxlength="80" aria-label="Room topic">
|
||
<div class="modal-actions">
|
||
<button type="button" class="btn secondary" id="btnCancelCreate">Cancel</button>
|
||
<button type="button" class="btn primary" id="btnConfirmCreate">Create</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="modal" id="joinModal" role="dialog" aria-modal="true" aria-labelledby="joinTitle">
|
||
<div class="modal-content">
|
||
<h3 id="joinTitle">Join Chat</h3>
|
||
<p class="modal-hint join-error hidden" id="joinError" role="alert"></p>
|
||
<div class="form-group">
|
||
<label for="joinTopic">Topic / address</label>
|
||
<input type="text" id="joinTopic" placeholder="e.g. bridge-swarm-advanced" value="bridge-swarm-advanced-v1">
|
||
</div>
|
||
<div class="form-group">
|
||
<label for="joinNickname">Your nickname</label>
|
||
<input type="text" id="joinNickname" placeholder="Enter your nickname" maxlength="20">
|
||
</div>
|
||
<div class="modal-actions">
|
||
<button type="button" class="btn primary" id="btnJoinChat">Join</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="toast-container" id="toastContainer" aria-live="polite"></div>
|
||
|
||
<div class="status-bar">
|
||
<span class="status" id="status">Waiting for BridgeSwarm…</span>
|
||
<span class="connection-status offline" id="connectionStatus" aria-hidden="true">●</span>
|
||
</div>
|
||
|
||
<input type="file" id="fileInput" hidden>
|
||
|
||
<script src="https://cdn.jsdelivr.net/npm/[email protected]/marked.min.js"></script>
|
||
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/purify.min.js"></script>
|
||
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lib/highlight.min.js"></script>
|
||
<script src="app.js"></script>
|
||
</body>
|
||
</html>
|