File size: 11,376 Bytes
5383ef0 4b22d21 5383ef0 4b22d21 5383ef0 4b22d21 5383ef0 4b22d21 5383ef0 4b22d21 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 | <!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>InferencePort AI</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700&family=Geist+Mono:wght@400;500&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="/css/tokens.css" />
<link rel="stylesheet" href="/css/base.css" />
<link rel="stylesheet" href="/css/sidebar.css" />
<link rel="stylesheet" href="/css/chat.css" />
<link rel="stylesheet" href="/css/modals.css" />
<link rel="stylesheet" href="/css/input.css" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css" />
</head>
<body>
<!-- Share import overlay -->
<div id="share-import-banner" class="share-banner hidden">
<div class="share-banner-inner">
<span class="share-icon">🔗</span>
<span id="share-banner-text">Importing shared session…</span>
<button id="share-import-btn" class="btn-primary">Import Session</button>
<button id="share-dismiss-btn" class="btn-ghost">Dismiss</button>
</div>
</div>
<div id="app">
<!-- Sidebar -->
<aside id="sidebar" class="sidebar collapsed">
<div class="sidebar-top">
<button id="new-chat-btn" class="sidebar-icon-btn" title="New Chat">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 5v14M5 12h14"/></svg>
</button>
<button id="toggle-sidebar-btn" class="sidebar-icon-btn" title="Toggle sidebar">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><line x1="9" y1="3" x2="9" y2="21"/></svg>
</button>
</div>
<div class="sidebar-sessions" id="sidebar-sessions">
<div class="session-list" id="session-list"></div>
</div>
<div class="sidebar-bottom" id="sidebar-bottom">
<!-- Shown when not signed in -->
<div id="guest-section" class="account-section">
<!-- Collapsed: icon-only sign-in button -->
<button id="signin-icon-btn" class="btn-signin-icon" title="Sign In">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"/><polyline points="10 17 15 12 10 7"/><line x1="15" y1="12" x2="3" y2="12"/></svg>
</button>
<!-- Expanded: full sign-in button -->
<button id="signin-btn" class="btn-signin">Sign In</button>
<button id="settings-btn-guest" class="sidebar-icon-btn" title="Settings">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>
</button>
</div>
<!-- Shown when signed in -->
<div id="user-section" class="account-section hidden">
<button id="user-profile-btn" class="user-profile-btn">
<div class="user-avatar" id="user-avatar">?</div>
<div class="user-info">
<span class="user-name" id="user-name-display">—</span>
<span class="user-plan" id="user-plan-display">Free</span>
</div>
</button>
<button id="settings-btn" class="sidebar-icon-btn" title="Settings">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>
</button>
</div>
</div>
</aside>
<!-- Main chat area -->
<main id="main">
<!-- Welcome / new chat state -->
<div id="welcome-view" class="welcome-view">
<h1 class="welcome-title">What's on your mind?</h1>
<div class="welcome-input-wrap">
<div class="center-input-container">
<div id="center-file-preview-row" class="input-file-preview-row"></div>
<div class="center-input-row">
<div class="attach-btn-wrap">
<button id="center-attach-btn" class="attach-btn" title="Attach">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
</button>
</div>
<textarea id="center-input" class="center-textarea" placeholder="Ask anything…" rows="1"></textarea>
<div class="center-input-actions">
<button id="center-tool-search" class="tool-btn" data-tool="webSearch" title="Web Search">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
</button>
<button id="center-tool-image" class="tool-btn" data-tool="imageGen" title="Image">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>
</button>
<button id="center-tool-video" class="tool-btn" data-tool="videoGen" title="Video">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="23 7 16 12 23 17 23 7"/><rect x="1" y="5" width="15" height="14" rx="2"/></svg>
</button>
<button id="center-tool-audio" class="tool-btn" data-tool="audioGen" title="Audio">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/></svg>
</button>
<button id="center-send-btn" class="send-btn-center">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2 21L23 12 2 3v7l15 2-15 2v7z"/></svg>
</button>
</div>
</div>
</div>
</div>
</div>
<!-- Active chat view -->
<div id="chat-view" class="chat-view hidden">
<div id="chat-messages" class="chat-messages"></div>
</div>
<!-- Bottom input (active during chat) -->
<div id="bottom-input-bar" class="bottom-input-bar hidden">
<div class="bottom-input-wrap">
<button id="bottom-attach-btn" class="attach-btn-bottom" title="Attach">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
</button>
<div class="bottom-textarea-wrap">
<div class="tool-row">
<button class="tool-btn-sm active" data-tool="webSearch" title="Web Search">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
<span>Search</span>
</button>
<button class="tool-btn-sm" data-tool="imageGen" title="Image">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>
<span>Image</span>
</button>
<button class="tool-btn-sm" data-tool="videoGen" title="Video">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="23 7 16 12 23 17 23 7"/><rect x="1" y="5" width="15" height="14" rx="2"/></svg>
<span>Video</span>
</button>
<button class="tool-btn-sm" data-tool="audioGen" title="Audio">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/></svg>
<span>Audio</span>
</button>
</div>
<div id="file-preview-row" class="input-file-preview-row"></div>
<textarea id="bottom-input" class="bottom-textarea" placeholder="Ask anything…" rows="1"></textarea>
</div>
<button id="bottom-send-btn" class="send-btn-bottom">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M2 21L23 12 2 3v7l15 2-15 2v7z"/></svg>
</button>
</div>
</div>
</main>
</div>
<!-- Context Menus -->
<div id="session-context-menu" class="context-menu hidden"></div>
<div id="user-context-menu" class="context-menu hidden"></div>
<div id="attach-context-menu" class="context-menu hidden"></div>
<!-- Modals -->
<div id="modal-overlay" class="modal-overlay hidden">
<div id="modal-box" class="modal-box"></div>
</div>
<!-- Notification area -->
<div id="notifications" class="notifications"></div>
<!-- Hidden file input -->
<input type="file" id="file-input" multiple style="display:none" />
<input type="file" id="image-input" accept="image/*" multiple style="display:none" />
<script src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/marked@9.1.6/marked.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.1.6/dist/purify.min.js"></script>
<script type="module" src="/js/app.js"></script>
</body>
</html> |