- Attachments from the file dialog, a drop on the window (Rust holds the dropped paths; the page never names one) or a paste (the bytes as the raw body of the call), sent at once to /api/v2/attachments as multipart and shown above the composer. - Edit message (rewind), Regenerate reply on the last reply, Copy on both. - The chat's menu (header and a right click in the sidebar): rename, open in the web interface, archive, delete. - The chat's model and effort in its header; effort for a new chat. Model avatars coloured as the server's stable_hue colours them (MD5 of the id, checked against Python), mixed into the theme's surface so no colour is hard-coded. - Ctrl+K palette over commands and every chat's title; Ctrl+N, Ctrl+,. - The agent's new states in the page; 34 new sentences in all eight languages, the server's own words where it has them; a Czech row that was Slovak; two untranslated strings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
126 lines
6.6 KiB
HTML
126 lines
6.6 KiB
HTML
<!doctype html>
|
|
<html lang="en" data-theme="moria" data-base="moria">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="color-scheme" content="dark light">
|
|
<title>LLeMbas</title>
|
|
<link rel="stylesheet" href="tokens.css">
|
|
<link rel="stylesheet" href="app.css">
|
|
<script src="i18n.js"></script>
|
|
<script type="module" src="js/main.js"></script>
|
|
</head>
|
|
<body>
|
|
<div class="app">
|
|
<header class="bar" data-tauri-drag-region>
|
|
<button class="bar__btn bar__side" id="side-toggle" type="button" aria-label="Chats" title="Chats" aria-expanded="false" aria-controls="side" data-i18n-aria-label data-i18n-title></button>
|
|
<img class="bar__leaf" src="logo-mark.svg" alt="" width="18" height="18" data-tauri-drag-region>
|
|
<span class="bar__name" data-tauri-drag-region><b>LL</b>e<b>M</b>bas</span>
|
|
<span class="bar__host" id="host" data-tauri-drag-region></span>
|
|
<button class="bar__update" id="update" type="button" hidden>update</button>
|
|
<button class="bar__agent" id="agent" type="button" title="Agent">
|
|
<span class="dot" aria-hidden="true"></span><span id="agent-text">agent off</span>
|
|
</button>
|
|
<button class="bar__btn" id="menu" type="button" aria-label="Menu" title="Menu" data-i18n-aria-label data-i18n-title></button>
|
|
<span class="bar__sep" aria-hidden="true"></span>
|
|
<button class="bar__btn" id="minimize" type="button" aria-label="Minimise" title="Minimise" data-i18n-aria-label data-i18n-title></button>
|
|
<button class="bar__btn" id="maximize" type="button" aria-label="Maximise" title="Maximise" data-i18n-aria-label data-i18n-title></button>
|
|
<button class="bar__btn bar__btn--close" id="close" type="button" aria-label="Close" title="Close (LLeMbas stays in the tray)" data-i18n-aria-label data-i18n-title></button>
|
|
</header>
|
|
|
|
<div class="setup" id="setup" hidden>
|
|
<main class="card" aria-labelledby="setup-title">
|
|
<header class="brand">
|
|
<img src="logo-mark.svg" alt="" width="40" height="40">
|
|
<div>
|
|
<h1 id="setup-title"><b>LL</b>e<b>M</b>bas</h1>
|
|
<p class="muted">Desktop <span id="setup-version"></span></p>
|
|
</div>
|
|
</header>
|
|
<div class="setup__body" id="setup-body"></div>
|
|
</main>
|
|
</div>
|
|
|
|
<div class="shell" id="shell" hidden data-side="false" data-viewer="false">
|
|
<nav class="side" id="side" aria-label="Chats" data-i18n-aria-label data-local="true" data-server="false">
|
|
<div class="switch" role="tablist">
|
|
<button type="button" role="tab" data-kind="agent" aria-selected="true" data-i18n>Agent</button>
|
|
<button type="button" role="tab" data-kind="chat" aria-selected="false" data-i18n>Chats</button>
|
|
</div>
|
|
<button type="button" class="btn btn--primary side__new" id="new-chat-btn"><span data-i18n>New agent chat</span></button>
|
|
<ul class="list" id="chat-list"></ul>
|
|
|
|
<section class="pane" id="pane-local" data-open="true" aria-labelledby="pane-local-h">
|
|
<div class="pane__head">
|
|
<button type="button" class="pane__toggle" aria-expanded="true" id="pane-local-h"><span data-i18n>This computer</span></button>
|
|
<button type="button" class="pane__btn" id="local-refresh" aria-label="Read again" title="Read again" data-i18n-aria-label data-i18n-title></button>
|
|
</div>
|
|
<div class="pane__body">
|
|
<div class="pane__where" id="local-where"></div>
|
|
<div class="pane__tree" id="local-tree"></div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="pane" id="pane-server" data-open="false" aria-labelledby="pane-server-h">
|
|
<div class="pane__head">
|
|
<button type="button" class="pane__toggle" aria-expanded="false" id="pane-server-h"><span data-i18n>Server files</span></button>
|
|
<button type="button" class="pane__btn" id="server-refresh" aria-label="Read again" title="Read again" data-i18n-aria-label data-i18n-title></button>
|
|
</div>
|
|
<div class="pane__body">
|
|
<div class="pane__tree" id="server-tree"></div>
|
|
</div>
|
|
</section>
|
|
|
|
<button type="button" class="side__settings" id="settings-btn"></button>
|
|
</nav>
|
|
<div class="scrim" id="scrim" aria-hidden="true"></div>
|
|
|
|
<main class="main" id="main" aria-labelledby="chat-title">
|
|
<header class="head">
|
|
<h1 class="head__title" id="chat-title"></h1>
|
|
<div class="head__place" id="chat-place"></div>
|
|
<div class="head__tools" id="chat-tools"></div>
|
|
</header>
|
|
<div class="thread" id="thread">
|
|
<p class="thread__note is-error" id="thread-note" hidden></p>
|
|
<div class="new" id="new-chat" hidden></div>
|
|
<div class="messages" id="messages"></div>
|
|
</div>
|
|
<div class="cards" id="cards" hidden></div>
|
|
<form class="composer" id="composer" hidden data-running="false" data-drag="false">
|
|
<ul class="composer__files" id="composer-files" hidden></ul>
|
|
<button type="button" class="btn composer__attach" id="attach" aria-label="Attach files" title="Attach files" data-i18n-aria-label data-i18n-title></button>
|
|
<textarea id="composer-text" rows="1" placeholder="Message" aria-label="Message" data-i18n-placeholder data-i18n-aria-label></textarea>
|
|
<p class="composer__drop" aria-hidden="true" data-i18n>Drop the files to attach them</p>
|
|
<div class="composer__actions">
|
|
<button type="button" class="btn" id="stop" hidden data-i18n>Stop</button>
|
|
<button type="submit" class="btn btn--primary" id="send" data-i18n>Send</button>
|
|
</div>
|
|
</form>
|
|
</main>
|
|
|
|
<section class="settings" id="settings" hidden aria-labelledby="settings-title">
|
|
<header class="head">
|
|
<h1 class="head__title" id="settings-title" data-i18n>Settings</h1>
|
|
<div class="head__place"></div>
|
|
<div class="head__tools"><button type="button" class="pane__btn" id="settings-close" aria-label="Close" title="Close" data-i18n-aria-label data-i18n-title></button></div>
|
|
</header>
|
|
<div class="settings__body" id="settings-body"></div>
|
|
</section>
|
|
|
|
<aside class="viewer" id="viewer" hidden aria-labelledby="viewer-name">
|
|
<header class="viewer__head">
|
|
<div class="viewer__id">
|
|
<h2 class="viewer__name" id="viewer-name"></h2>
|
|
<p class="viewer__where" id="viewer-where"></p>
|
|
</div>
|
|
<div class="viewer__modes" id="viewer-modes"></div>
|
|
<button type="button" class="pane__btn" id="viewer-close" aria-label="Close" title="Close" data-i18n-aria-label data-i18n-title></button>
|
|
</header>
|
|
<div class="viewer__body" id="viewer-body"></div>
|
|
</aside>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|