Files
herolib/lib/web/ui/templates/chat.html
Mahmoud-Emad cf187d46b3 feat: improve Heroprompt UI and refactor modules
- Refactor all UI rendering logic into a single `ui` module
- Centralize static assets serving to `/static` directory
- Redesign Heroprompt page with Bootstrap 5 components
- Enhance workspace management and file tree interactions
- Add Bootstrap modal support for UI dialogs
2025-08-21 20:01:43 +03:00

200 lines
6.9 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{.title}} - Chat</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="{{.css_colors_url}}">
<link rel="stylesheet" href="{{.css_main_url}}">
<link rel="stylesheet" href="{{.css_chat_url}}">
<meta name="color-scheme" content="light dark">
</head>
<body>
<nav class="navbar navbar-dark bg-dark fixed-top header px-2">
<div class="d-flex w-100 align-items-center justify-content-between">
<div class="text-white fw-bold">{{.title}}</div>
<div class="text-white-50">Chat</div>
</div>
</nav>
<aside class="sidebar">
<div class="p-2">
<div class="menu-section">Navigation</div>
<div class="list-group list-group-flush">
{{.menu_html}}
</div>
</div>
</aside>
<main class="main">
<div class="container-fluid h-100">
<!-- Chat Section -->
<div class="chat-container">
<div class="chat-header">
<h5 class="mb-0">AI Chat Assistant</h5>
<div class="chat-controls">
<button class="btn btn-sm btn-outline-secondary" id="clearChat">
<i class="bi bi-trash"></i> Clear
</button>
<button class="btn btn-sm btn-outline-secondary" id="voiceToggle">
<i class="bi bi-mic"></i> Voice
</button>
</div>
</div>
<div class="chat-messages" id="chatMessages">
<div class="message assistant">
<div class="message-avatar">
<i class="bi bi-robot"></i>
</div>
<div class="message-content">
<div class="message-text">Hello! I'm your AI assistant. How can I help you today?</div>
<div class="message-time">Just now</div>
</div>
</div>
</div>
<div class="chat-input-container">
<div class="chat-input-wrapper">
<textarea class="form-control chat-input" id="chatInput" placeholder="Type your message here..." rows="1"></textarea>
<div class="chat-input-actions">
<button class="btn btn-outline-secondary btn-sm" id="attachFile" title="Attach file">
<i class="bi bi-paperclip"></i>
</button>
<button class="btn btn-outline-secondary btn-sm" id="voiceInput" title="Voice input">
<i class="bi bi-mic"></i>
</button>
<button class="btn btn-primary btn-sm" id="sendMessage" title="Send message">
<i class="bi bi-send"></i>
</button>
</div>
</div>
<div class="chat-status" id="chatStatus"></div>
</div>
</div>
<!-- Recorder Section -->
<div class="recorder-container">
<div class="recorder-header">
<h6 class="mb-0">Voice Recorder</h6>
<div class="recorder-controls">
<button class="btn btn-sm btn-danger" id="recordBtn">
<i class="bi bi-record-circle"></i> Record
</button>
<button class="btn btn-sm btn-secondary" id="stopBtn" disabled>
<i class="bi bi-stop-circle"></i> Stop
</button>
<button class="btn btn-sm btn-outline-secondary" id="playBtn" disabled>
<i class="bi bi-play-circle"></i> Play
</button>
</div>
</div>
<div class="recording-status" id="recordingStatus">
<div class="recording-indicator">
<span class="recording-dot"></span>
<span class="recording-time">00:00</span>
</div>
<div class="recording-level">
<div class="level-bar" id="levelBar"></div>
</div>
</div>
<div class="recordings-explorer">
<div class="explorer-header">
<h6 class="mb-2">Recordings</h6>
<div class="explorer-actions">
<button class="btn btn-sm btn-outline-secondary" id="newFolderBtn">
<i class="bi bi-folder-plus"></i>
</button>
<button class="btn btn-sm btn-outline-secondary" id="refreshBtn">
<i class="bi bi-arrow-clockwise"></i>
</button>
</div>
</div>
<div class="explorer-tree" id="explorerTree">
<div class="tree-item folder expanded" data-path="/">
<div class="tree-item-content">
<i class="bi bi-folder-open"></i>
<span class="tree-item-name">Recordings</span>
</div>
<div class="tree-item-children">
<div class="tree-item file" data-path="/sample1.mp3">
<div class="tree-item-content">
<i class="bi bi-file-earmark-music"></i>
<span class="tree-item-name">sample1.mp3</span>
<span class="tree-item-size">2.1 MB</span>
</div>
</div>
<div class="tree-item file" data-path="/sample2.wav">
<div class="tree-item-content">
<i class="bi bi-file-earmark-music"></i>
<span class="tree-item-name">sample2.wav</span>
<span class="tree-item-size">5.3 MB</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- Context Menu -->
<div class="context-menu" id="contextMenu">
<div class="context-menu-item" data-action="transcribe">
<i class="bi bi-file-text"></i> Transcribe
</div>
<div class="context-menu-item" data-action="translate">
<i class="bi bi-translate"></i> Translate
</div>
<div class="context-menu-item" data-action="open">
<i class="bi bi-folder-open"></i> Open
</div>
<div class="context-menu-item" data-action="move">
<i class="bi bi-arrow-right"></i> Move
</div>
<div class="context-menu-item" data-action="rename">
<i class="bi bi-pencil"></i> Rename
</div>
<div class="context-menu-divider"></div>
<div class="context-menu-item" data-action="export">
<i class="bi bi-download"></i> Export
</div>
</div>
<!-- File Upload Modal -->
<div class="modal fade" id="fileUploadModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Upload File</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label for="fileInput" class="form-label">Choose file</label>
<input class="form-control" type="file" id="fileInput" accept=".txt,.pdf,.doc,.docx,.md">
</div>
<div class="upload-progress" id="uploadProgress" style="display: none;">
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: 0%"></div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-primary" id="uploadBtn">Upload</button>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
<script src="{{.js_theme_url}}"></script>
<script src="{{.js_chat_url}}"></script>
</body>
</html>