collin/strudel-claude
1e0d2bb35dc36fce501b08430bbe9c846b7c32dc / index.html
| 1 | <!doctype html> |
| 2 | <html lang="en"> |
| 3 | <head> |
| 4 | <meta charset="utf-8" /> |
| 5 | <meta name="viewport" content="width=device-width, initial-scale=1" /> |
| 6 | <title>Strudel × Claude</title> |
| 7 | <link rel="stylesheet" href="/src/style.css" /> |
| 8 | </head> |
| 9 | <body> |
| 10 | <div id="app"> |
| 11 | <!-- FAR LEFT: session sidebar --> |
| 12 | <aside id="sidebar"> |
| 13 | <header class="pane-header sidebar-header"> |
| 14 | <span class="logo">🌀 Strudel × Claude</span> |
| 15 | <button id="sidebar-hide" class="icon-btn" title="Hide tracks">«</button> |
| 16 | </header> |
| 17 | <button id="new-session" class="new-session">+ New track</button> |
| 18 | <nav id="session-list" class="session-list" aria-label="Tracks"></nav> |
| 19 | |
| 20 | <div class="sidebar-footer"> |
| 21 | <button id="theme-btn" class="key-btn" aria-haspopup="dialog" aria-expanded="false"> |
| 22 | <span aria-hidden="true">◐</span> |
| 23 | <span id="theme-state">Theme</span> |
| 24 | </button> |
| 25 | <div id="theme-panel" class="key-panel" role="dialog" aria-label="Theme" hidden> |
| 26 | <label class="key-label" for="site-theme">Lighting</label> |
| 27 | <select id="site-theme" class="key-select"></select> |
| 28 | <label class="key-label key-label-spaced" for="code-theme">Code colors</label> |
| 29 | <select id="code-theme" class="key-select"></select> |
| 30 | <p class="key-note"> |
| 31 | The code pane shares the site background, so a code theme sets syntax |
| 32 | colors only. |
| 33 | </p> |
| 34 | </div> |
| 35 | |
| 36 | <button id="prompt-btn" class="key-btn" aria-haspopup="dialog" aria-expanded="false"> |
| 37 | <span aria-hidden="true">📜</span> |
| 38 | <span id="prompt-state">System prompt</span> |
| 39 | </button> |
| 40 | </div> |
| 41 | </aside> |
| 42 | |
| 43 | <!-- MIDDLE: Strudel IDE --> |
| 44 | <section id="ide"> |
| 45 | <header class="pane-header"> |
| 46 | <div class="ide-title"> |
| 47 | <button id="sidebar-show" class="icon-btn" title="Show tracks" hidden>☰</button> |
| 48 | <span class="logo" aria-hidden="true">🌀</span> |
| 49 | <button id="song-title" class="song-title" type="button" title="Rename track"></button> |
| 50 | </div> |
| 51 | <div class="transport"> |
| 52 | <button id="playstop" class="btn btn-transport">▶ Play</button> |
| 53 | </div> |
| 54 | </header> |
| 55 | <div id="editor"></div> |
| 56 | <div class="status"> |
| 57 | <span id="ide-status">ready</span> |
| 58 | </div> |
| 59 | </section> |
| 60 | |
| 61 | <!-- RIGHT: Claude chat --> |
| 62 | <section id="chat"> |
| 63 | <header class="pane-header chat-header"> |
| 64 | <button id="model-btn" class="key-btn" aria-haspopup="dialog" aria-expanded="false"> |
| 65 | <span aria-hidden="true">✦</span> |
| 66 | <span id="model-state">Model</span> |
| 67 | </button> |
| 68 | <div id="model-panel" class="key-panel" role="dialog" aria-label="Model" hidden> |
| 69 | <label class="key-label" for="model-select">Claude model</label> |
| 70 | <select id="model-select" class="key-select"></select> |
| 71 | <p id="model-note" class="key-note"></p> |
| 72 | </div> |
| 73 | |
| 74 | <button id="key-btn" class="key-btn" aria-haspopup="dialog" aria-expanded="false"> |
| 75 | <span aria-hidden="true">🔑</span> |
| 76 | <span id="key-state">Add API key</span> |
| 77 | </button> |
| 78 | <div id="key-panel" class="key-panel" role="dialog" aria-label="Anthropic API key" hidden> |
| 79 | <label class="key-label" for="key-input">Anthropic API key</label> |
| 80 | <input |
| 81 | id="key-input" |
| 82 | class="key-input" |
| 83 | type="password" |
| 84 | placeholder="sk-ant-…" |
| 85 | autocomplete="off" |
| 86 | spellcheck="false" |
| 87 | /> |
| 88 | <p id="key-note" class="key-note"></p> |
| 89 | <div class="key-actions"> |
| 90 | <button id="key-save" class="btn btn-send" type="button">Save</button> |
| 91 | <button id="key-clear" class="btn" type="button" hidden>Remove</button> |
| 92 | </div> |
| 93 | </div> |
| 94 | </header> |
| 95 | <div id="messages"></div> |
| 96 | <form id="chat-form"> |
| 97 | <div class="composer"> |
| 98 | <textarea |
| 99 | id="chat-input" |
| 100 | rows="2" |
| 101 | placeholder="e.g. dark rolling techno with a deep bass and off-beat hats" |
| 102 | ></textarea> |
| 103 | <button id="send" class="btn btn-send" type="submit">Send</button> |
| 104 | </div> |
| 105 | </form> |
| 106 | </section> |
| 107 | </div> |
| 108 | |
| 109 | <!-- System prompt editor: a modal rather than a header popover, because the |
| 110 | prompt is a few hundred lines of Markdown. --> |
| 111 | <div id="prompt-modal" class="modal" hidden> |
| 112 | <div class="modal-card" role="dialog" aria-modal="true" aria-labelledby="prompt-title"> |
| 113 | <header class="modal-header"> |
| 114 | <h2 id="prompt-title">System prompt</h2> |
| 115 | <button id="prompt-close" class="icon-btn" type="button" title="Close">✕</button> |
| 116 | </header> |
| 117 | <textarea id="prompt-text" class="prompt-text" spellcheck="false"></textarea> |
| 118 | <p id="prompt-note" class="key-note"></p> |
| 119 | <div class="key-actions"> |
| 120 | <button id="prompt-save" class="btn btn-send" type="button">Save</button> |
| 121 | <button id="prompt-reset" class="btn" type="button" hidden>Reset to default</button> |
| 122 | </div> |
| 123 | </div> |
| 124 | </div> |
| 125 | |
| 126 | <script type="module" src="/src/main.js"></script> |
| 127 | </body> |
| 128 | </html> |