Files
BridgeSwarm/examples/chat-advanced/index.html
T
Raven Scott 8c95a97662
CI / Build & Test (push) Successful in 3m0s
fixes
2026-07-26 22:19:31 -04:00

193 lines
7.1 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>
if (location.protocol === 'file:') {
document.documentElement.innerHTML =
'<body style="margin:0;font:15px/1.5 Segoe UI,system-ui,sans-serif;background:#0f1419;color:#e7ecf3">' +
'<div style="max-width:36rem;margin:10vh auto;padding:24px;background:#1a2332;border:1px solid #2a3548;border-radius:14px">' +
'<h1 style="margin:0 0 10px;font-size:1.25rem">Open this demo over HTTP</h1>' +
'<p style="color:#8b9bb4">Browsers treat each <code>file://</code> URL as a unique security origin, so local demos break.</p>' +
'<p>From the BridgeSwarm repo root run:</p>' +
'<pre style="padding:12px;background:#0f1419;border-radius:10px;color:#2dd4bf">npm run examples</pre>' +
'<p style="color:#8b9bb4">Then open <code>http://127.0.0.1:4173/</code></p>' +
'</div></body>';
}
</script>
</head>
<body>
<div class="app-container">
<aside class="sidebar">
<div class="sidebar-header">
<h2>Advanced Chat</h2>
</div>
<div class="user-profile">
<div class="avatar" id="avatar">?</div>
<div class="user-info">
<input type="text" id="nickname" placeholder="Nickname" maxlength="20">
<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 class="btn-icon" id="btnCreateRoom" title="Create Room">+</button>
</div>
<ul class="room-list" id="roomList">
<li class="room active" data-room="lobby">
<span class="room-icon">#</span>
<span class="room-name">lobby</span>
<span class="room-count" id="room-lobby-count">0</span>
</li>
</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"></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 class="btn-icon" id="btnToggleEmoji" title="Emoji">😊</button>
<button class="btn-icon" id="btnSendFile" title="Send File">📎</button>
<button class="btn-icon" id="btnClearChat" title="Clear Chat">🗑️</button>
</div>
</div>
<div class="messages" id="messages"></div>
<div class="typing-indicator" id="typingIndicator">
<span id="typingUsers"></span> is typing...
</div>
<div class="compose-area">
<div class="compose-tools">
<button class="btn-tool" id="btnBold" title="Bold (Ctrl+B)"><strong>B</strong></button>
<button class="btn-tool" id="btnItalic" title="Italic (Ctrl+I)"><em>I</em></button>
<button class="btn-tool" id="btnStrike" title="Strikethrough"><s>S</s></button>
<button class="btn-tool" id="btnCode" title="Inline Code">&lt;/&gt;</button>
<button class="btn-tool" id="btnCodeBlock" title="Code Block">{ }</button>
<button class="btn-tool" id="btnLink" title="Link">🔗</button>
<button class="btn-tool" id="btnList" title="List"></button>
<button class="btn-tool" id="btnQuote" title="Quote">"</button>
<button class="btn-tool" id="btnEmoji2" title="Emoji">😀</button>
</div>
<div class="compose-input">
<textarea id="messageInput" placeholder="Type a message... (Markdown supported)" rows="1"></textarea>
<button class="btn-send" id="btnSend">Send</button>
</div>
</div>
</main>
<aside class="right-sidebar">
<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>
<div class="sidebar-section">
<h3>Shared Files</h3>
<ul class="file-list" id="fileList"></ul>
</div>
<div class="sidebar-section">
<h3>Settings</h3>
<div class="setting-item">
<label>
<input type="checkbox" id="chkNotifications">
Notifications
</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" id="createRoomModal">
<div class="modal-content">
<h3>Create New Room</h3>
<input type="text" id="newRoomName" placeholder="Room name" maxlength="30">
<input type="text" id="newRoomTopic" placeholder="Room topic (optional)">
<div class="modal-actions">
<button class="btn secondary" id="btnCancelCreate">Cancel</button>
<button class="btn primary" id="btnConfirmCreate">Create</button>
</div>
</div>
</div>
<div class="modal" id="joinModal">
<div class="modal-content">
<h3>Join Chat</h3>
<div class="form-group">
<label>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>Your Nickname</label>
<input type="text" id="joinNickname" placeholder="Enter your nickname" maxlength="20">
</div>
<div class="modal-actions">
<button class="btn primary" id="btnJoinChat">Join</button>
</div>
</div>
</div>
<div class="toast-container" id="toastContainer"></div>
<div class="status-bar">
<span class="status" id="status">Disconnected</span>
<span class="connection-status" id="connectionStatus"></span>
</div>
<input type="file" id="fileInput" hidden>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lib/highlight.min.js"></script>
<script type="module">
import { markedHighlight } from 'https://cdn.jsdelivr.net/npm/[email protected]/+esm';
window.markedHighlight = markedHighlight;
</script>
<script src="app.js"></script>
</body>
</html>