.asst {
position: fixed;
right: 20px;
bottom: 20px;
z-index: 55;
font-family: var(--font);
--asst-avatar: 18px;
--asst-avatar-gap: 8px;
--asst-fila: 44px;
}
.asst-fab {
display: flex;
align-items: center;
gap: 9px;
margin-left: auto;
padding: 13px 19px;
border-radius: 999px;
border: 1px solid var(--glass-line);
background: var(--glass-head);
color: var(--ink);
font: inherit;
font-size: 0.95rem;
font-weight: 600;
cursor: pointer;
-webkit-backdrop-filter: saturate(180%) blur(20px);
backdrop-filter: saturate(180%) blur(20px);
box-shadow: var(--shadow-lg);
transition: border-color 0.15s ease, transform 0.15s ease;
}
.asst-fab:hover { border-color: var(--accent); transform: translateY(-1px); }
.asst-fab:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.asst-mark {
width: 22px;
height: 22px;
flex: none;
}
.asst-mark-core,
.asst-mark-frame {
transform-box: view-box;
transform-origin: 50% 50%;
}
.asst-fab-mark { color: var(--accent); }
.asst-fab-mark .asst-mark-core,
.asst-fab-mark .asst-mark-frame {
transition: transform 0.45s cubic-bezier(0.65, 0, 0.35, 1);
}
.asst-fab:hover .asst-mark-core,
.asst-fab:focus-visible .asst-mark-core { transform: rotate(45deg); }
.asst-fab:hover .asst-mark-frame,
.asst-fab:focus-visible .asst-mark-frame { transform: scale(1.04); }
.asst-abierto .asst-fab-mark .asst-mark-core { transform: rotate(45deg); }
.asst-pensando .asst-fab-mark .asst-mark-core {
transition: none;
animation: asst-girar 1.6s cubic-bezier(0.65, 0, 0.35, 1) infinite;
}
@keyframes asst-girar {
from { transform: rotate(45deg); }
to { transform: rotate(135deg); }
}
.asst-avatar {
width: 18px;
height: 18px;
margin-top: 7px;
color: var(--ink-3);
}
.asst .ico {
width: 20px;
height: 20px;
flex: none;
fill: none;
stroke: currentColor;
stroke-width: 1.7;
stroke-linecap: round;
stroke-linejoin: round;
}
.asst-panel {
position: absolute;
right: 0;
bottom: calc(100% + 12px);
width: min(400px, calc(100vw - 32px));
height: min(560px, calc(100vh - 140px));
display: flex;
flex-direction: column;
border-radius: var(--radius-lg);
border: 1px solid var(--glass-line);
background: var(--glass-bg);
-webkit-backdrop-filter: saturate(180%) blur(20px);
backdrop-filter: saturate(180%) blur(20px);
box-shadow: var(--shadow-lg);
overflow: hidden;
transform-origin: 100% 100%;
animation: asst-entra 0.22s ease-out;
}
@keyframes asst-entra {
from { opacity: 0; transform: translateY(8px) scale(0.98); }
}
.asst-panel.asst-cerrando {
animation: asst-sale 0.18s ease-in forwards;
}
@keyframes asst-sale {
to { opacity: 0; transform: translateY(8px) scale(0.98); }
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
.asst-panel,
.asst-fab {
background: var(--surface);
border-color: var(--line);
}
}
.asst-head {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 16px 16px 12px;
border-bottom: 1px solid var(--line);
}
.asst-head-txt {
flex: 1 1 auto;
min-width: 0;
}
.asst-head h2 {
margin: 0;
font-size: 1rem;
font-weight: 650;
color: var(--ink);
line-height: 1.3;
}
.asst-lead {
margin: 4px 0 0;
font-size: 0.8rem;
line-height: 1.45;
color: var(--ink-2);
}
.asst-empezada .asst-lead { display: none; }
.asst-close {
flex: none;
padding: 6px;
border: 0;
border-radius: 10px;
background: none;
color: var(--ink-3);
cursor: pointer;
}
.asst-close:hover { color: var(--ink); }
.asst-close:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.asst-logwrap {
position: relative;
flex: 1 1 0;
min-height: 0;
display: flex;
}
.asst-log {
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
overscroll-behavior: contain;
padding: 14px 16px;
display: flex;
flex-direction: column;
gap: 10px;
}
.asst-head,
.asst-chips,
.asst-status,
.asst-offline,
.asst-form {
flex: none;
}
.asst-log:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.asst-jump {
position: absolute;
left: 50%;
bottom: 10px;
transform: translateX(-50%);
padding: 6px 13px;
border-radius: 999px;
border: 1px solid var(--line-strong);
background: var(--surface);
color: var(--ink);
font: inherit;
font-size: 0.78rem;
cursor: pointer;
box-shadow: var(--shadow-lg);
}
.asst-jump:hover { border-color: var(--accent); }
.asst-jump:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.asst-fila {
align-self: flex-start;
display: flex;
gap: var(--asst-avatar-gap);
max-width: calc(88% + var(--asst-avatar) + var(--asst-avatar-gap));
}
.asst-fila-seguida {
padding-left: calc(var(--asst-avatar) + var(--asst-avatar-gap));
}
.asst-msg {
max-width: 100%;
padding: 9px 12px;
border-radius: var(--radius);
font-size: 0.875rem;
line-height: 1.55;
white-space: normal;
}
.asst-msg p { margin: 0 0 0.6em; }
.asst-msg p:last-child { margin-bottom: 0; }
.asst-msg ul,
.asst-msg ol { margin: 0 0 0.6em; padding-left: 1.2em; list-style: revert; }
.asst-msg li { margin: 0.15em 0; }
.asst-msg code {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 0.9em;
padding: 0.1em 0.35em;
border-radius: 4px;
background: var(--bg-tint);
}
.asst-me {
align-self: flex-end;
max-width: 88%;
background: var(--bg-tint);
border: 1px solid var(--line-strong);
color: var(--ink);
}
.asst-bot {
align-self: flex-start;
background: var(--surface);
border: 1px solid var(--line);
color: var(--ink);
}
.asst-links {
align-self: flex-start;
display: flex;
flex-wrap: wrap;
gap: 6px;
max-width: 88%;
margin-left: calc(var(--asst-avatar) + var(--asst-avatar-gap));
}
.asst-link {
padding: 5px 10px;
border-radius: 999px;
border: 1px solid var(--line-strong);
background: var(--bg-tint);
color: var(--accent-ink);
font-size: 0.78rem;
text-decoration: none;
}
.asst-link:hover { border-color: var(--accent); }
.asst-chips {
display: flex;
flex-wrap: wrap;
gap: 6px;
padding: 0 16px 12px;
}
.asst-chip {
padding: 6px 11px;
border-radius: 999px;
border: 1px solid var(--line-strong);
background: transparent;
color: var(--ink-2);
font: inherit;
font-size: 0.78rem;
cursor: pointer;
text-align: left;
}
.asst-chip:hover { border-color: var(--accent); color: var(--ink); }
.asst-chip:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.asst-status {
margin: 0;
padding: 0 16px 10px;
font-size: 0.8rem;
color: var(--ink-2);
min-height: 0;
}
.asst-status[data-tone='err'] { color: var(--danger); }
.asst-status[data-tone='warn'] { color: var(--accent-ink); }
.asst-retry {
margin-left: 8px;
padding: 3px 9px;
border-radius: 10px;
border: 1px solid var(--line-strong);
background: transparent;
color: var(--ink);
font: inherit;
font-size: 0.78rem;
cursor: pointer;
}
.asst-retry:hover { border-color: var(--accent); }
.asst-dots span {
display: inline-block;
animation: asst-blink 1.2s infinite both;
}
.asst-dots span:nth-child(2) { animation-delay: 0.18s; }
.asst-dots span:nth-child(3) { animation-delay: 0.36s; }
@keyframes asst-blink {
0%, 70%, 100% { opacity: 0.25; }
35% { opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
.asst-dots span { animation: none; opacity: 0.7; }
.asst-fab { transition: none; }
.asst-panel,
.asst-panel.asst-cerrando { animation: none; }
.asst-fab-mark .asst-mark-core,
.asst-fab-mark .asst-mark-frame { transition: none; }
.asst-pensando .asst-fab-mark .asst-mark-core { animation: none; }
.asst-fab:hover .asst-mark-core,
.asst-fab:focus-visible .asst-mark-core,
.asst-abierto .asst-fab-mark .asst-mark-core,
.asst-fab:hover .asst-mark-frame,
.asst-fab:focus-visible .asst-mark-frame { transform: none; }
}
.asst-offline {
margin: 0 16px 12px;
padding: 12px 14px;
border-radius: var(--radius);
border: 1px solid var(--line-strong);
background: var(--bg-soft);
}
.asst-offline p {
margin: 0 0 10px;
font-size: 0.85rem;
line-height: 1.5;
color: var(--ink-2);
}
.asst-offline-cta {
display: inline-block;
padding: 7px 14px;
border-radius: 10px;
border: 1px solid var(--line-strong);
color: var(--accent-ink);
font-size: 0.82rem;
font-weight: 600;
text-decoration: none;
}
.asst-offline-cta:hover { border-color: var(--accent); }
.asst-form {
display: flex;
flex-direction: column;
gap: 6px;
padding: 12px 16px;
border-top: 1px solid var(--line);
}
.asst-composer {
display: flex;
align-items: flex-end;
gap: 8px;
}
.asst-lbl {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.asst-grow {
display: grid;
flex: 1 1 auto;
min-width: 0;
}
.asst-grow > textarea,
.asst-grow::after {
grid-area: 1 / 1;
min-width: 0;
min-height: var(--asst-fila);
max-height: 120px;
padding: 10px 11px;
border: 1px solid var(--line-strong);
border-radius: var(--radius);
font: inherit;
font-size: 0.875rem;
line-height: 1.45;
white-space: pre-wrap;
overflow-wrap: break-word;
}
.asst-grow::after {
content: attr(data-value) ' ';
visibility: hidden;
}
.asst-grow > textarea {
background: var(--input-bg);
color: var(--ink);
overflow-y: auto;
resize: none;
}
.asst-grow > textarea::placeholder { color: var(--ink-3); }
.asst-grow > textarea:focus-visible {
outline: none;
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-glow);
}
.asst-count {
margin: 0;
align-self: flex-end;
font-size: 0.72rem;
color: var(--ink-3);
}
.asst-send {
flex: none;
width: var(--asst-fila);
height: var(--asst-fila);
display: grid;
place-items: center;
padding: 0;
border-radius: var(--radius);
border: 1px solid transparent;
background: var(--btn-bg);
color: var(--btn-ink);
font: inherit;
cursor: pointer;
}
.asst-send:hover { background: var(--btn-bg-hover); }
.asst-send:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.asst-send[disabled] { opacity: 0.55; cursor: default; }
.asst-send .ico { width: 20px; height: 20px; stroke-width: 2; }
.asst-trap {
position: absolute;
left: -9999px;
width: 1px;
height: 1px;
overflow: hidden;
}
.asst-clear {
flex: none;
margin-top: 2px;
padding: 4px 8px;
border: 1px solid var(--line-strong);
border-radius: 999px;
background: none;
color: var(--ink-3);
font: inherit;
font-size: 0.7rem;
line-height: 1.4;
cursor: pointer;
white-space: nowrap;
}
.asst-clear:hover { border-color: var(--accent); color: var(--ink); }
.asst-clear:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
@media (max-width: 640px) {
.asst { right: 14px; bottom: 14px; }
.asst-fab { padding: 12px 16px; }
.asst-panel {
position: fixed;
inset: 10px;
width: auto;
height: auto;
}
body.asst-open { overflow: hidden; }
}
