"<!DOCTYPE html>\n<html lang=\"ru\" data-theme=\"light\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <title>Вход — Рубик</title>\n  <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bulma@1.0.4/css/bulma.min.css\">\n  <link rel=\"stylesheet\" href=\"/ui/bulma.css\">\n  <script src=\"https://cdn.jsdelivr.net/npm/htmx.org@2.0.11/dist/htmx.min.js\"></script>\n<style id=\"kubiki-theme\">\n:root{--bulma-primary-h:49deg;--bulma-primary-s:100%;--bulma-primary-l:50%;--bulma-link-h:60deg;--bulma-link-s:3%;--bulma-link-l:6%;\n--bulma-success-h:144deg;--bulma-success-s:76%;--bulma-success-l:31%;--bulma-warning-h:33deg;--bulma-warning-s:100%;--bulma-warning-l:50%;\n--bulma-danger-h:11deg;--bulma-danger-s:73%;--bulma-danger-l:41%;--bulma-radius:.6rem;--bulma-radius-medium:.75rem;--bulma-radius-large:.9rem;\n--bulma-border:var(--line);--serif:\"Source Serif 4\",Georgia,serif}\nhtml{scroll-behavior:smooth}\na{color:var(--ink)} a:hover{color:var(--p-ink)}\n.title,.subtitle strong{color:var(--ink)}\n.title.is-serif,.serif{font-family:var(--serif);font-weight:500;letter-spacing:-.01em}\n.input,.textarea,.select select{border-color:#e0ddd2;box-shadow:none}\n.input:focus,.textarea:focus,.select select:focus{border-color:var(--ink);box-shadow:0 0 0 3px var(--p-soft)}\n.box{background:#fff;border:1px solid var(--line);box-shadow:0 1px 3px rgba(20,20,15,.04);border-radius:1rem}\n.notification{border:1px solid var(--line)}\n.tabs:not(.is-toggle) li.is-active a{color:var(--ink);border-bottom-color:var(--ink);font-weight:500}\n.tabs a:hover{color:var(--ink)}\n.progress.is-primary{--bulma-progress-value-background-color:var(--p)}\n.button{border-radius:999px;font-weight:500}\n.button.is-light,.button.is-small.is-light{border-color:#e0ddd2}\n.button.is-link{background:var(--ink);border-color:var(--ink);color:#fff}\n.button.is-link:hover{background:var(--k-btn-hover);color:#fff}\n.button.is-warning.is-light{background:#fff2e0;color:#c26a00;border-color:transparent}\n.button.is-danger.is-light{background:#fde8e4;color:#b4361c;border-color:transparent}\n.button.is-primary.is-light{background:var(--p-soft);color:#5c4a00;border-color:transparent}\n.button.is-primary.is-light:hover{background:var(--p);color:var(--ink)}\n.button.is-dark{background:var(--ink);border-color:var(--ink)}\n.tag{border-radius:.3rem;font-size:.75rem}\n.tag.is-success.is-light{background:#e7f8ee;color:#138a43}\n.tag.is-light:not(.is-success){background:#f1f1f1;color:#333}\n.chip{font-size:.75rem;padding:.1rem .45rem;border-radius:.3rem;background:#fff3c4;color:#7a5c00;white-space:nowrap}\n.st{font-size:.75rem;padding:.1rem .45rem;border-radius:.3rem;white-space:nowrap}\n.st.ok{background:#e7f8ee;color:#138a43}.st.wait{background:#fff2e0;color:#c26a00}.st.new{background:#f1f1f1;color:#333}.st.err{background:#fde8e4;color:#b4361c}\n.pill{display:inline-flex;align-items:center;gap:.4rem;font-size:.8rem;font-weight:500;color:#171717;padding:.2rem .7rem;border:1px solid var(--line);border-radius:999px;background:#fff}\n.pill i{color:var(--p-ink);font-size:.75rem}\n.rubik{flex:none;width:2.2rem;height:2.2rem;border-radius:.6rem;background:var(--ink);display:inline-flex;align-items:center;justify-content:center}\n.rubik svg{width:1.4rem;height:1.4rem}\n.rubik.is-small{width:1.6rem;height:1.6rem;border-radius:.45rem}.rubik.is-small svg{width:1rem;height:1rem}\n.hl{position:relative;white-space:nowrap;z-index:0}\n.hl::after{content:\"\";position:absolute;left:-.04em;right:-.04em;bottom:.08em;height:.32em;border-radius:.1em;background:var(--p);opacity:.55;z-index:-1}\n.ic{width:1.8rem;height:1.8rem;border-radius:.5rem;background:var(--p-soft);color:var(--ink);display:inline-flex;align-items:center;justify-content:center;font-size:.85rem}\n.app-nav{position:sticky;top:0;z-index:30;background:rgba(255,255,255,.92);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-bottom:1px solid var(--line)}\n.app-nav .in{max-width:64rem;margin:0 auto;padding:.6rem 1.25rem;display:flex;align-items:center;justify-content:space-between;gap:1rem}\n.app-logo{display:flex;align-items:center;gap:.5rem;font-weight:800;font-size:1.2rem;color:var(--ink)!important;letter-spacing:-.02em}\n.app-logo svg{width:1.7rem;height:1.7rem}\n.app-hero{position:relative;text-align:center;padding:2.5rem 1rem 2rem}\n.app-hero::before{content:\"\";position:absolute;inset:0;pointer-events:none;opacity:.8;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='192'%3E%3Cg fill='%23ffd202'%3E%3Crect x='0' y='0' width='64' height='40' fill-opacity='.12'/%3E%3Crect x='64' y='0' width='64' height='40' fill-opacity='.30'/%3E%3Crect x='192' y='0' width='64' height='40' fill-opacity='.18'/%3E%3Crect x='128' y='40' width='64' height='40' fill-opacity='.36'/%3E%3Crect x='256' y='40' width='64' height='40' fill-opacity='.14'/%3E%3Crect x='0' y='80' width='64' height='40' fill-opacity='.24'/%3E%3Crect x='192' y='80' width='64' height='40' fill-opacity='.32'/%3E%3Crect x='64' y='120' width='64' height='40' fill-opacity='.16'/%3E%3Crect x='256' y='120' width='64' height='40' fill-opacity='.28'/%3E%3Crect x='128' y='160' width='64' height='40' fill-opacity='.20'/%3E%3C/g%3E%3C/svg%3E\");-webkit-mask-image:radial-gradient(ellipse 80% 90% at 50% 60%,transparent 45%,#000 95%);mask-image:radial-gradient(ellipse 80% 90% at 50% 60%,transparent 45%,#000 95%)}\n.app-hero>*{position:relative}\n.app-hero h1{font-family:var(--serif);font-size:clamp(1.9rem,5vw,3rem);font-weight:500;line-height:1.08;letter-spacing:-.01em;color:var(--ink);margin:1rem 0 .75rem;text-wrap:balance}\n.app-hero .lead{color:var(--mute);max-width:32rem;margin:0 auto}\n.me-bar{display:flex;align-items:center;justify-content:space-between;gap:.6rem;font-size:.9rem;background:#fff;border:1px solid var(--line);border-radius:999px;padding:.4rem .5rem .4rem .5rem;margin-bottom:1.5rem}\n.me-bar .who{display:flex;align-items:center;gap:.6rem}\n.me-bar .ava{width:1.9rem;height:1.9rem;border-radius:50%;background:var(--p);color:var(--ink);font-weight:700;display:inline-flex;align-items:center;justify-content:center;text-transform:uppercase}\n.me-bar b{color:var(--ink);font-weight:600}\n.db{background:#fff;border:1px solid var(--line);border-radius:1rem;box-shadow:0 0 0 6px #f4f1e4;overflow:hidden;margin-bottom:2rem}\n.db-head{display:flex;align-items:center;gap:.6rem;padding:.8rem 1rem;border-bottom:1px solid var(--line)}\n.db-head b{color:var(--ink)}.db-head>span:last-child{margin-left:auto;color:var(--mute);font-size:.8rem}\n.db .table{font-size:.88rem;margin:0;background:transparent}\n.db .table th{color:#444;font-weight:500;background:#fafaf5;border-color:var(--line)}\n.db .table td{border-color:#f1efe7;vertical-align:middle}\n.db .table tbody tr:hover{background:#fffbea}\n.db-body{padding:1.25rem 1rem}\n.db-head .ic{margin:0}\n.db-bar{display:flex;flex-wrap:wrap;gap:.4rem;padding:.5rem 1rem;border-bottom:1px solid var(--line)}\n.db-bar .button{border-radius:.4rem;border-color:var(--line);font-size:.8rem;height:auto;padding:.15rem .55rem}\n.db-bar .button.is-primary.is-light{border-color:var(--p)}\n.db-foot{display:flex;align-items:center;justify-content:space-between;padding:.5rem 1rem;font-size:.8rem;color:var(--mute)}\n.db .table.is-numbered th,.db .table.is-numbered td{padding:.45rem .9rem;border-width:0 1px 1px 0;white-space:nowrap;max-width:22rem;overflow:hidden;text-overflow:ellipsis}\n.db .table.is-numbered td:first-child,.db .table.is-numbered th:first-child{color:#aaa;width:2.5rem;text-align:center}\n.db .table.is-numbered code{font-size:.8em;background:#f6f5ef;color:#555;padding:.1em .35em;border-radius:.3rem}\n.core-card{display:flex;align-items:center;justify-content:space-between;gap:1rem;background:#fff;border:1px solid var(--line);border-radius:1rem;padding:.9rem 1rem;margin-bottom:1.5rem}\n.core-card .t{display:flex;align-items:center;gap:.75rem}\n.core-card b{color:var(--ink)}.core-card small{display:block;color:var(--mute)}\n.chat-pane{background:var(--k-page)!important;box-shadow:none!important;border-right:1px solid var(--line)!important}\n.chat-header{background:#fff!important;backdrop-filter:none!important;border-bottom:1px solid var(--line)!important}\n.chat-header .title{background:none!important;-webkit-text-fill-color:var(--ink)!important;color:var(--ink)!important;font-family:var(--serif);font-weight:500!important}\n.chat-bubble{background:#fff!important;border:1px solid var(--line)!important;box-shadow:none!important;color:var(--ink)}\n.chat-msg.is-outgoing>.chat-bubble{background:var(--ink)!important;border-color:var(--ink)!important;color:#fff!important}\n.chat-tool{background:var(--p-soft)!important;border-left-color:var(--p)!important;color:#5c4a00!important}\n.chat-tool .tool-mark{color:var(--p-ink)!important}\n.chat-tool.is-failed{background:#fde8e4!important;border-left-color:#b4361c!important}\n.chat-ui{background:#fff!important;border-color:var(--line)!important;box-shadow:none!important}\n.chat-pane>.chat-composer{background:#fff!important;border:1px solid var(--line)!important;box-shadow:0 12px 32px rgba(20,20,15,.08)!important}\n.chat-composer:focus-within{border-color:#d9d5c6!important;box-shadow:0 12px 32px rgba(20,20,15,.12)!important}\n.chat-composer .chat-round{background:var(--ink)!important;color:var(--p)!important;border:0!important}\n.chat-composer .chat-round.chat-attach{background:#fff!important;color:var(--ink)!important;border:1px solid #e0ddd2!important}\n.chat-dots i{background:var(--p-ink)!important}\n.chat-live{background:var(--p)}\n.pane-resizer:hover,.pane-resizer.is-dragging{background:var(--p)!important}\n.preview-bar{background:#fff!important;border-bottom:1px solid var(--line)!important}\n.chat-model-select{border-radius:999px}\n</style></head>\n<body hx-headers='{\"Accept\": \"text/html\"}'>\n  <main class=\"section pt-6\">\n    <div class=\"container\" style=\"max-width: 26rem;\">\n      <div id=\"toast\"></div>\n      <form class=\"box\" hx-post=\"/api/rpc/login\" hx-target=\"#toast\" hx-swap=\"innerHTML\">\n        <p class=\"title is-5 is-serif\">Вход</p>\n        <div class=\"field\">\n          <input class=\"input\" type=\"email\" name=\"_email\" placeholder=\"you@example.com\"\n                 autocomplete=\"email\" required>\n        </div>\n        <div class=\"field\">\n          <input class=\"input\" type=\"password\" name=\"_password\" placeholder=\"пароль\"\n                 autocomplete=\"current-password\" required>\n        </div>\n        <button class=\"button is-primary is-fullwidth\" type=\"submit\">Войти</button>\n      </form>\n      <p class=\"has-text-centered\">Нет аккаунта? <a href=\"/signup\">Зарегистрироваться</a></p>\n    </div>\n  </main>\n  <script>\n    document.body.addEventListener('htmx:responseError', function (e) {\n      var msg = 'Не удалось выполнить запрос';\n      try { msg = JSON.parse(e.detail.xhr.responseText).message || msg; } catch (_) {}\n      var toast = document.getElementById('toast');\n      toast.innerHTML = '<div class=\"notification is-danger is-light\"></div>';\n      toast.firstElementChild.textContent = msg;\n    });\n  </script>\n</body>\n</html>\n"