Files
BridgeSwarm/examples/chat-advanced/index.html
T
Raven Scott a130d0c32f
CI / Build & Test (push) Successful in 8m33s
Updates
2026-07-27 01:31:58 -04:00

193 lines
8.5 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="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 &amp; 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 &amp; 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>&lt;/&gt;</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>