Files

2480 lines
42 KiB
CSS
Raw Permalink Normal View History

2026-08-14 11:06:58 +07:00
:root {
--bg: #f6f5f0;
--sidebar: #edece6;
--surface: #fffefa;
--surface-2: #f1f0ea;
--text: #272621;
--muted: #77746b;
--line: #dedcd3;
--accent: #b75b3c;
--accent-hover: #9f4b30;
--accent-soft: #f1ded5;
--shadow: 0 18px 60px rgba(44, 40, 30, 0.09);
}
html[data-theme="dark"] {
--bg: #181814;
--sidebar: #21211c;
--surface: #262620;
--surface-2: #2c2c25;
--text: #efede4;
--muted: #9d9a8e;
--line: #3b3a32;
--accent: #da7856;
--accent-hover: #e48a69;
--accent-soft: #482e25;
--shadow: 0 18px 60px rgba(0, 0, 0, 0.22);
}
* {
box-sizing: border-box;
}
html,
body {
height: 100%;
overflow: hidden;
}
body {
margin: 0;
background: var(--bg);
color: var(--text);
font-family: "Manrope", system-ui, sans-serif;
font-size: 14px;
}
button,
input,
textarea,
select {
color: inherit;
font: inherit;
}
button {
cursor: pointer;
}
.app-shell {
display: grid;
grid-template-columns: 270px 1fr;
width: 100%;
height: 100%;
max-height: 100dvh;
overflow: hidden;
}
.sidebar {
position: fixed;
inset: 0 auto 0 0;
z-index: 20;
display: flex;
width: 270px;
flex-direction: column;
border-right: 1px solid var(--line);
background: var(--sidebar);
padding: 18px 12px 12px;
min-height: 0;
}
.brand {
display: flex;
flex-shrink: 0;
align-items: center;
gap: 10px;
padding: 0 8px 18px;
font-weight: 700;
letter-spacing: -0.02em;
}
.brand-mark {
display: grid;
width: 30px;
height: 30px;
place-items: center;
border-radius: 9px;
background: var(--text);
color: var(--bg);
font-family: "Playfair Display", serif;
font-size: 17px;
}
.mobile-close {
display: none;
margin-left: auto;
}
.new-chat-button {
display: flex;
flex-shrink: 0;
align-items: center;
width: 100%;
gap: 9px;
border: 1px solid var(--line);
border-radius: 10px;
background: var(--surface);
padding: 10px 11px;
text-align: left;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
}
.new-chat-button:hover {
border-color: var(--muted);
}
.plus {
font-size: 18px;
}
.shortcut {
margin-left: auto;
color: var(--muted);
font-size: 11px;
}
.sidebar-search {
position: relative;
flex-shrink: 0;
margin: 10px 0 2px;
}
.sidebar-search input {
width: 100%;
border: 1px solid var(--line);
border-radius: 10px;
background: var(--surface);
padding: 8px 11px;
outline: none;
}
.sidebar-search input:focus {
border-color: var(--accent);
}
.search-results {
position: absolute;
top: calc(100% + 4px);
right: 0;
left: 0;
z-index: 40;
display: grid;
max-height: 42vh;
overflow: auto;
border: 1px solid var(--line);
border-radius: 10px;
background: var(--surface);
padding: 6px;
box-shadow: var(--shadow);
}
.search-empty {
padding: 10px 8px;
color: var(--muted);
font-size: 12px;
}
.search-hit {
display: grid;
gap: 2px;
border: 0;
border-radius: 8px;
background: transparent;
padding: 8px 9px;
text-align: left;
}
.search-hit:hover {
background: var(--surface-2);
}
.search-hit strong {
overflow: hidden;
font-size: 13px;
text-overflow: ellipsis;
white-space: nowrap;
}
.search-hit small {
color: var(--muted);
font-size: 11px;
}
.search-hit span {
color: var(--muted);
font-size: 12px;
line-height: 1.35;
}
.main-nav {
flex-shrink: 0;
padding: 16px 0 10px;
}
.nav-item {
display: flex;
width: 100%;
align-items: center;
gap: 10px;
border: 0;
border-radius: 8px;
background: transparent;
padding: 9px 11px;
text-align: left;
}
.nav-item:hover,
.nav-item.active {
background: var(--surface-2);
}
.sidebar-section {
display: flex;
flex-direction: column;
min-height: 0;
margin-top: 12px;
}
.projects-section {
flex: 0 1 auto;
max-height: 38vh;
overflow: hidden;
}
.recents-section {
flex: 1 1 auto;
min-height: 0;
overflow: hidden;
}
.section-heading {
display: flex;
flex-shrink: 0;
align-items: center;
justify-content: space-between;
padding: 5px 8px 7px;
color: var(--muted);
font-size: 11px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.icon-button {
display: grid;
min-width: 30px;
height: 30px;
place-items: center;
border: 0;
border-radius: 8px;
background: transparent;
}
.icon-button:hover {
background: var(--surface-2);
}
.project-nav-list,
.recent-list {
display: grid;
gap: 4px;
min-height: 0;
overflow-y: auto;
align-content: start;
}
.project-nav-list {
flex: 1 1 auto;
}
.recent-list {
flex: 1 1 auto;
gap: 5px;
padding-bottom: 4px;
}
.side-row {
display: flex;
width: 100%;
align-items: center;
gap: 9px;
overflow: hidden;
border: 0;
border-radius: 8px;
background: transparent;
padding: 8px 9px;
text-align: left;
}
.side-row:hover,
.side-row.active {
background: var(--surface-2);
}
.side-row .row-icon {
color: var(--accent);
}
.side-row .row-text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.recent-list .side-row {
color: var(--muted);
font-size: 12px;
padding: 9px 10px;
}
.sidebar-empty {
padding: 8px;
color: var(--muted);
font-size: 12px;
}
.sidebar-footer {
flex-shrink: 0;
margin-top: auto;
border-top: 1px solid var(--line);
padding-top: 10px;
}
.profile-button {
display: flex;
width: 100%;
align-items: center;
gap: 9px;
border: 0;
border-radius: 9px;
background: transparent;
padding: 7px;
text-align: left;
}
.profile-button:hover {
background: var(--surface-2);
}
.profile-button > span:nth-child(2) {
display: grid;
line-height: 1.3;
}
.profile-button small {
color: var(--muted);
}
.avatar {
display: grid;
width: 31px;
height: 31px;
place-items: center;
border-radius: 50%;
background: var(--accent-soft);
color: var(--accent);
font-weight: 700;
}
.dots {
margin-left: auto;
color: var(--muted);
}
.main {
grid-column: 2;
display: flex;
min-width: 0;
min-height: 0;
height: 100%;
max-height: 100%;
flex-direction: column;
overflow: hidden;
}
.topbar {
position: sticky;
top: 0;
z-index: 10;
display: flex;
flex-shrink: 0;
height: 64px;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid var(--line);
background: color-mix(in srgb, var(--bg) 90%, transparent);
padding: 0 28px;
backdrop-filter: blur(16px);
}
.breadcrumbs {
color: var(--muted);
font-size: 13px;
}
.topbar-actions {
display: flex;
align-items: center;
gap: 8px;
}
.menu-button {
display: none;
}
.outline-button,
.primary-button {
border: 1px solid var(--line);
border-radius: 9px;
padding: 9px 14px;
background: var(--surface);
font-weight: 600;
}
.outline-button:hover {
border-color: var(--muted);
}
.primary-button {
border-color: var(--accent);
background: var(--accent);
color: white;
}
.primary-button:hover {
background: var(--accent-hover);
}
.view {
display: none;
}
.view.active {
display: block;
flex: 1;
min-height: 0;
overflow: auto;
}
#chatView.active {
display: flex;
flex: 1 1 0;
min-height: 0;
max-height: 100%;
flex-direction: column;
overflow: hidden;
}
.content-wide {
width: 100%;
max-width: 1200px;
margin: 0 auto;
padding: 70px 24px;
}
.page-title-row {
display: flex;
align-items: flex-end;
justify-content: space-between;
margin-bottom: 40px;
}
.eyebrow {
margin: 0 0 8px;
color: var(--accent);
font-size: 11px;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
}
h1,
h2,
h3,
p {
margin-top: 0;
}
h1 {
margin-bottom: 10px;
font-family: "Playfair Display", serif;
font-size: clamp(34px, 5vw, 52px);
letter-spacing: -0.035em;
line-height: 1.05;
}
.subtitle {
margin-bottom: 0;
color: var(--muted);
font-size: 15px;
}
.project-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 16px;
}
.project-card {
display: flex;
min-height: 210px;
flex-direction: column;
border: 1px solid var(--line);
border-radius: 15px;
background: var(--surface);
padding: 22px;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.02);
cursor: pointer;
transition: transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease;
}
.project-card:hover {
transform: translateY(-3px);
border-color: color-mix(in srgb, var(--accent) 50%, var(--line));
box-shadow: var(--shadow);
}
.card-icon {
display: grid;
width: 42px;
height: 42px;
margin-bottom: 27px;
place-items: center;
border-radius: 12px;
background: var(--accent-soft);
color: var(--accent);
font-size: 18px;
}
.project-card h3 {
margin-bottom: 6px;
font-size: 17px;
}
.project-card p {
display: -webkit-box;
overflow: hidden;
margin-bottom: 18px;
color: var(--muted);
font-size: 12px;
line-height: 1.6;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.card-meta {
display: flex;
gap: 14px;
margin-top: auto;
color: var(--muted);
font-size: 11px;
}
.empty-state {
display: grid;
min-height: 390px;
place-items: center;
align-content: center;
border: 1px dashed var(--line);
border-radius: 16px;
text-align: center;
}
.empty-state > * {
max-width: 380px;
}
.empty-state .empty-icon {
margin-bottom: 16px;
color: var(--accent);
font-size: 38px;
}
.empty-state h2 {
margin-bottom: 8px;
}
.empty-state p {
margin-bottom: 22px;
color: var(--muted);
}
.hidden {
display: none !important;
}
.project-layout {
display: grid;
grid-template-columns: minmax(0, 1fr) 340px;
min-height: calc(100vh - 64px);
}
.project-main {
width: 100%;
max-width: 1100px;
margin: 0 auto;
padding: 66px 24px;
}
.project-heading {
position: relative;
display: flex;
align-items: center;
gap: 18px;
margin-bottom: 36px;
}
.project-heading h1 {
margin-bottom: 6px;
font-size: 40px;
}
.project-icon-large {
display: grid;
width: 58px;
height: 58px;
flex: 0 0 auto;
place-items: center;
border-radius: 15px;
background: var(--accent-soft);
color: var(--accent);
font-size: 24px;
}
.project-menu {
margin-left: auto;
}
.composer-card {
position: relative;
margin-bottom: 44px;
border: 1px solid var(--line);
border-radius: 16px;
background: var(--surface);
padding: 16px;
box-shadow: var(--shadow);
transition: background 140ms ease, box-shadow 140ms ease, border-color 140ms ease;
}
.composer-card textarea,
.chat-composer textarea {
display: block;
width: 100%;
min-height: 24px;
max-height: 180px;
resize: none;
overflow-x: hidden;
overflow-y: hidden;
border: 0;
outline: none;
background: transparent;
line-height: 1.55;
}
.composer-card textarea {
min-height: 48px;
font-size: 16px;
}
.composer-card .composer-attachments {
margin-bottom: 10px;
}
.composer-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
border-top: 1px solid var(--line);
margin-top: 10px;
padding-top: 10px;
}
.composer-footer .attach-button {
flex: 0 0 auto;
}
.composer-hint {
flex: 1 1 auto;
min-width: 0;
color: var(--muted);
font-size: 11px;
}
.send-button {
display: grid;
width: 34px;
height: 34px;
place-items: center;
border: 0;
border-radius: 9px;
background: var(--text);
color: var(--bg);
font-size: 18px;
}
.send-button:hover {
background: var(--accent);
color: white;
}
.list-header,
.panel-title {
display: flex;
align-items: center;
justify-content: space-between;
}
.list-header {
margin-bottom: 12px;
}
.list-header h2 {
margin: 0;
font-size: 14px;
}
.text-button {
border: 0;
background: transparent;
color: var(--accent);
font-size: 12px;
font-weight: 600;
}
.text-button:hover {
text-decoration: underline;
}
.chat-list {
display: grid;
}
.chat-row {
display: grid;
grid-template-columns: 18px 32px minmax(0, 1fr) auto;
align-items: center;
gap: 10px;
border-top: 1px solid var(--line);
padding: 15px 6px;
cursor: pointer;
transition: background 120ms ease, border-color 120ms ease;
}
.chat-row:hover .chat-row-title {
color: var(--accent);
}
.chat-row.dragging {
opacity: 0.45;
}
.chat-row.drag-over {
background: color-mix(in srgb, var(--accent) 12%, transparent);
box-shadow: inset 0 2px 0 var(--accent);
}
.chat-drag-handle {
color: var(--muted);
font-size: 11px;
letter-spacing: -2px;
cursor: grab;
user-select: none;
}
.chat-row.dragging .chat-drag-handle {
cursor: grabbing;
}
.chat-bubble-icon {
color: var(--muted);
font-size: 16px;
}
.chat-row-title {
overflow: hidden;
font-weight: 600;
text-overflow: ellipsis;
white-space: nowrap;
}
.chat-row-time {
color: var(--muted);
font-size: 11px;
}
.empty-inline {
border-top: 1px solid var(--line);
padding: 28px 6px;
color: var(--muted);
font-size: 13px;
}
.details-panel {
border-left: 1px solid var(--line);
background: var(--surface);
padding: 42px 26px;
}
.panel-section {
border-bottom: 1px solid var(--line);
padding: 20px 0 28px;
}
.panel-section:first-child {
padding-top: 0;
}
.panel-title {
margin-bottom: 14px;
}
.panel-title h3 {
margin: 0;
font-size: 13px;
}
.panel-section > p {
margin: 0;
color: var(--muted);
font-size: 12px;
line-height: 1.65;
white-space: pre-wrap;
}
.upload-label input {
display: none;
}
.files-panel {
position: relative;
border-radius: 12px;
transition: background 140ms ease, box-shadow 140ms ease, border-color 140ms ease;
}
.files-panel.drop-target,
.project-layout.drop-target,
.composer-card.drop-target,
.chat-page.drop-target,
.chat-composer.drop-target {
background: color-mix(in srgb, var(--accent) 12%, var(--surface));
box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--accent) 55%, var(--line));
}
html[data-theme="dark"] .files-panel.drop-target,
html[data-theme="dark"] .project-layout.drop-target,
html[data-theme="dark"] .composer-card.drop-target,
html[data-theme="dark"] .chat-page.drop-target,
html[data-theme="dark"] .chat-composer.drop-target {
background: color-mix(in srgb, var(--accent) 20%, var(--surface));
box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--accent) 70%, transparent);
}
.project-layout.drop-target .details-panel,
.project-layout.drop-target .composer-card {
background: color-mix(in srgb, var(--accent) 10%, var(--surface));
}
.chat-page.drop-target .chat-composer,
.chat-composer.drop-target {
border-color: color-mix(in srgb, var(--accent) 55%, var(--line));
background: color-mix(in srgb, var(--accent) 14%, var(--surface));
}
.drop-hint {
display: none;
margin: 10px 0 0;
color: var(--accent);
font-size: 12px;
font-weight: 600;
text-align: center;
}
.composer-drop-hint {
margin-top: 12px;
}
.files-panel.drop-target .drop-hint,
.composer-card.drop-target .drop-hint,
.project-layout.drop-target .files-panel .drop-hint,
.project-layout.drop-target .composer-card .drop-hint {
display: block;
}
.file-list {
display: grid;
gap: 8px;
}
#fileList:not(:empty) ~ #filesEmpty {
display: none !important;
}
.file-row {
display: grid;
grid-template-columns: 34px minmax(0, 1fr) 26px 26px;
align-items: center;
gap: 6px;
border: 1px solid var(--line);
border-radius: 9px;
padding: 8px;
}
.file-type {
display: grid;
height: 34px;
place-items: center;
border-radius: 7px;
background: var(--surface-2);
color: var(--accent);
font-size: 9px;
font-weight: 700;
letter-spacing: 0.02em;
text-transform: uppercase;
}
.file-info {
min-width: 0;
color: inherit;
text-decoration: none;
}
.file-info:hover strong {
color: var(--accent);
}
.file-info strong,
.file-info small {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.file-info strong {
font-size: 11px;
}
.file-info small {
color: var(--muted);
font-size: 9px;
}
.file-action {
display: grid;
width: 26px;
height: 26px;
place-items: center;
border: 0;
border-radius: 7px;
background: transparent;
color: var(--muted);
text-decoration: none;
cursor: pointer;
}
.file-action:hover {
background: var(--surface-2);
color: var(--text);
}
.file-delete:hover {
background: color-mix(in srgb, #c44 18%, transparent);
color: var(--text);
}
.chat-page {
display: flex;
width: 100%;
max-width: min(1400px, 100% - 32px);
height: 100%;
max-height: 100%;
margin: 0 auto;
padding: 0 24px;
box-sizing: border-box;
flex: 1 1 0;
min-height: 0;
flex-direction: column;
overflow: hidden;
}
.chat-header {
display: grid;
flex-shrink: 0;
grid-template-columns: 40px minmax(0, 1fr) auto;
align-items: center;
gap: 12px;
border-bottom: 1px solid var(--line);
padding: 20px 0;
}
.chat-header-actions {
display: flex;
align-items: center;
gap: 4px;
}
.export-chat-link {
text-decoration: none;
}
.chat-header h2 {
overflow: hidden;
margin: 0;
font-size: 17px;
text-overflow: ellipsis;
white-space: nowrap;
}
.chat-header .eyebrow {
margin-bottom: 3px;
}
.back-button {
width: 36px;
height: 36px;
border: 1px solid var(--line);
border-radius: 10px;
background: var(--surface);
}
.messages {
display: flex;
flex: 1 1 0;
min-height: 0;
flex-direction: column;
gap: 22px;
overflow-x: hidden;
overflow-y: auto;
overscroll-behavior: contain;
padding: 28px 4px 28px 0;
scrollbar-width: thin;
scrollbar-color: color-mix(in srgb, var(--muted) 45%, transparent) transparent;
}
.messages::-webkit-scrollbar {
width: 8px;
}
.messages::-webkit-scrollbar-thumb {
border-radius: 999px;
background: color-mix(in srgb, var(--muted) 40%, transparent);
}
.message-row {
display: flex;
max-width: min(82%, 720px);
width: fit-content;
flex-direction: column;
gap: 6px;
}
.message-row.highlight .message {
outline: 2px solid color-mix(in srgb, var(--accent) 55%, transparent);
outline-offset: 3px;
}
.message-row.assistant {
align-self: flex-start;
align-items: flex-start;
max-width: 100%;
width: 100%;
}
.message-row.user {
align-self: flex-end;
align-items: flex-end;
max-width: min(78%, 640px);
}
.message-role {
padding: 0 4px;
color: var(--muted);
font-size: 10px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.message {
width: fit-content;
max-width: 100%;
min-height: 0;
height: auto;
border: 1px solid var(--line);
border-radius: 16px 16px 16px 5px;
background: var(--surface);
padding: 13px 16px 10px;
line-height: 1.6;
}
.message-row.assistant .message {
width: 100%;
max-width: 100%;
}
.message.assistant {
width: 100%;
}
.message.user {
border-color: transparent;
border-radius: 16px 16px 5px 16px;
background: var(--accent-soft);
color: var(--text);
}
.message-body {
min-height: 0;
height: auto;
overflow-wrap: anywhere;
word-break: break-word;
}
.message-body > :first-child {
margin-top: 0;
}
.message-body > :last-child {
margin-bottom: 0;
}
.message-body p {
margin: 0 0 0.75em;
}
.message-body p:last-child {
margin-bottom: 0;
}
.message-body .msg-h {
margin: 0.95em 0 0.4em;
color: var(--text);
font-family: "Manrope", system-ui, sans-serif;
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1.3;
}
.message-body .msg-h1 {
font-size: 1.28em;
}
.message-body .msg-h2 {
font-size: 1.14em;
}
.message-body .msg-h3,
.message-body .msg-h4,
.message-body .msg-h5,
.message-body .msg-h6 {
font-size: 1.05em;
}
.message-body .msg-h + p,
.message-body .msg-h + .msg-list,
.message-body .msg-h + .msg-table-wrap,
.message-body .msg-h + .msg-quote,
.message-body .msg-h + .msg-math-block {
margin-top: 0.35em;
}
.message-body strong {
font-weight: 700;
}
.message-body .msg-list {
margin: 0 0 0.75em;
padding: 0;
list-style: none;
}
.message-body .msg-ul > .msg-li,
.message-body .msg-ol > .msg-li {
position: relative;
margin: 0.28em 0;
padding-left: 1.15em;
}
.message-body .msg-ul > .msg-li::before {
content: "•";
position: absolute;
left: 0;
color: var(--accent);
}
.message-body .msg-ol {
counter-reset: msg-ol;
}
.message-body .msg-ol > .msg-li {
counter-increment: msg-ol;
padding-left: 1.45em;
}
.message-body .msg-ol > .msg-li::before {
content: counter(msg-ol) ".";
position: absolute;
left: 0;
color: var(--accent);
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.message-body .msg-task-list {
display: grid;
gap: 0.35em;
}
.message-body .msg-task-item {
display: flex;
align-items: flex-start;
gap: 0.55em;
margin: 0;
padding: 0;
list-style: none;
}
.message-body .msg-task-check {
margin: 0.35em 0 0;
accent-color: var(--accent);
pointer-events: none;
}
.message-body .msg-quote {
margin: 0.65em 0 0.85em;
border-left: 3px solid color-mix(in srgb, var(--accent) 70%, var(--line));
border-radius: 0 8px 8px 0;
background: color-mix(in srgb, var(--surface-2) 70%, transparent);
padding: 0.55em 0.9em;
color: color-mix(in srgb, var(--text) 88%, var(--muted));
}
.message-body .msg-hr {
margin: 1em 0;
border: 0;
border-top: 1px solid var(--line);
}
.message-body em {
font-style: italic;
}
.message-body .msg-link {
color: var(--accent);
text-decoration: underline;
text-underline-offset: 2px;
}
.message-body .msg-link:hover {
color: var(--accent-hover);
}
.message-body .msg-image {
display: block;
width: 100%;
max-width: 100%;
max-height: min(70vh, 720px);
height: auto;
margin: 0.65em 0;
border: 1px solid var(--line);
border-radius: 10px;
background: #f5f5f0;
padding: 10px;
object-fit: contain;
cursor: zoom-in;
}
.message-body .msg-image-missing {
display: inline-block;
margin: 0.35em 0;
border: 1px dashed var(--line);
border-radius: 8px;
background: color-mix(in srgb, var(--surface-2) 80%, transparent);
padding: 0.45em 0.7em;
color: var(--muted);
font-size: 12px;
}
.message-body .msg-cite {
display: inline-flex;
align-items: baseline;
gap: 0.35em;
max-width: 100%;
border: 1px solid var(--line);
border-radius: 999px;
background: color-mix(in srgb, var(--surface-2) 85%, var(--line));
padding: 0.1em 0.55em 0.15em;
color: var(--muted);
font-family: "Cascadia Code", "Consolas", "Courier New", monospace;
font-size: 0.84em;
text-decoration: none;
vertical-align: baseline;
}
a.msg-cite:hover {
border-color: var(--accent);
color: var(--text);
}
.message-body .msg-cite-line {
color: var(--accent);
font-weight: 700;
}
.message-body .msg-cite-path {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.message-body .msg-math-block {
margin: 0.75em 0;
overflow-x: auto;
border: 1px solid var(--line);
border-radius: 10px;
background: color-mix(in srgb, var(--bg) 70%, var(--surface-2));
padding: 0.85em 1em;
text-align: center;
}
.message-body .msg-math-inline {
font-style: normal;
}
.message-body .katex-display {
margin: 0.4em 0;
}
.message-body .msg-inline {
border-radius: 5px;
background: color-mix(in srgb, var(--surface-2) 80%, var(--line));
padding: 0.1em 0.4em;
font-family: "Cascadia Code", "Consolas", "Courier New", monospace;
font-size: 0.9em;
}
.message-body .msg-table-wrap {
max-width: 100%;
margin: 0.65em 0 0.85em;
overflow-x: auto;
border: 1px solid var(--line);
border-radius: 10px;
background: color-mix(in srgb, var(--bg) 55%, var(--surface));
scrollbar-width: thin;
scrollbar-color: color-mix(in srgb, var(--muted) 45%, transparent) transparent;
}
.message-body .msg-table {
width: max-content;
min-width: 100%;
border-collapse: collapse;
font-size: 12.5px;
line-height: 1.45;
}
.message-body .msg-table th,
.message-body .msg-table td {
border-bottom: 1px solid var(--line);
padding: 8px 12px;
text-align: left;
vertical-align: top;
white-space: nowrap;
}
.message-body .msg-table th {
background: color-mix(in srgb, var(--surface-2) 85%, var(--line));
color: var(--text);
font-size: 11px;
font-weight: 700;
letter-spacing: 0.02em;
}
.message-body .msg-table tbody tr:last-child td {
border-bottom: 0;
}
.message-body .msg-table tbody tr:nth-child(even) td {
background: color-mix(in srgb, var(--surface-2) 45%, transparent);
}
.message-body .msg-code {
margin: 0.75em 0;
overflow-x: auto;
border: 1px solid var(--line);
border-radius: 10px;
background: color-mix(in srgb, var(--bg) 70%, var(--surface-2));
padding: 12px 14px;
font-family: "Cascadia Code", "Consolas", "Courier New", monospace;
font-size: 12px;
line-height: 1.5;
white-space: pre;
}
.message-body .msg-code:first-child {
margin-top: 0;
}
.message-body .msg-code:last-child {
margin-bottom: 0;
}
.message-body .msg-code code {
font: inherit;
}
.message.user .message-body {
white-space: pre-wrap;
}
.assistant-loading {
color: var(--muted);
}
.loading-dots {
display: inline-block;
animation: pulse 1s ease-in-out infinite;
}
.thinking-block {
margin: 0 0 12px;
padding: 0 0 0 10px;
border-left: 2px solid color-mix(in srgb, var(--muted) 40%, transparent);
}
.thinking-block.hidden {
display: none;
}
.thinking-toggle {
display: flex;
align-items: center;
gap: 7px;
width: 100%;
margin: 0;
padding: 2px 0;
border: 0;
background: transparent;
color: var(--muted);
font: inherit;
font-size: 12px;
line-height: 1.4;
text-align: left;
cursor: pointer;
}
.thinking-toggle:hover {
color: var(--text);
}
.thinking-chevron {
display: inline-block;
flex: 0 0 auto;
font-size: 9px;
transform: rotate(0deg);
transition: transform 0.15s ease;
}
.thinking-block.open .thinking-chevron,
.thinking-block:not(.collapsed) .thinking-chevron {
transform: rotate(90deg);
}
.thinking-label {
font-weight: 600;
}
.thinking-duration {
color: color-mix(in srgb, var(--muted) 80%, transparent);
font-weight: 400;
}
.thinking-duration:not(:empty)::before {
content: "· ";
}
.thinking-content {
margin-top: 6px;
max-height: 360px;
overflow: auto;
color: var(--muted);
font-size: 12.5px;
line-height: 1.55;
white-space: pre-wrap;
overflow-wrap: anywhere;
}
.thinking-steps {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 8px;
white-space: normal;
}
.thinking-step {
padding: 0;
}
.thinking-step-title {
font-weight: 600;
font-size: 12px;
color: color-mix(in srgb, var(--muted) 88%, var(--text));
}
.thinking-step[data-type="thinking"] .thinking-step-title::before,
.thinking-step[data-type="narration"] .thinking-step-title::before {
content: "✦ ";
opacity: 0.45;
font-weight: 400;
}
.thinking-step[data-type="thinking"] .thinking-step-detail {
margin-top: 0;
}
.thinking-step:not([data-type="thinking"]):not([data-type="narration"]) .thinking-step-title::before {
content: " ";
opacity: 0.5;
font-weight: 400;
}
.thinking-step[data-status="running"] .thinking-step-title {
animation: pulse 1s ease-in-out infinite;
}
.thinking-step-detail {
margin-top: 2px;
white-space: pre-wrap;
overflow-wrap: anywhere;
opacity: 0.88;
font-size: 12px;
line-height: 1.5;
}
.thinking-step-more {
margin-top: 2px;
}
.thinking-step-more summary {
cursor: pointer;
font-size: 11px;
color: color-mix(in srgb, var(--muted) 75%, transparent);
}
.thinking-block.collapsed .thinking-content {
display: none;
}
.thinking-block.streaming .thinking-label {
animation: pulse 1s ease-in-out infinite;
}
.context-more {
display: inline-flex;
flex-wrap: wrap;
gap: 6px;
align-items: center;
}
.context-more summary {
cursor: pointer;
list-style: none;
}
.context-more summary::-webkit-details-marker {
display: none;
}
.context-more[open] summary {
color: var(--text);
}
@keyframes pulse {
50% {
opacity: 0.3;
}
}
.messages-empty {
display: grid;
flex: 1;
place-items: center;
color: var(--muted);
text-align: center;
}
.chat-composer {
display: flex;
flex: 0 0 auto;
flex-direction: column;
gap: 10px;
margin-top: 0;
margin-bottom: 16px;
border: 1px solid var(--line);
border-radius: 15px;
background: var(--surface);
padding: 12px 14px;
box-shadow: var(--shadow);
transition: background 140ms ease, box-shadow 140ms ease, border-color 140ms ease;
}
.gen-progress {
display: grid;
flex-shrink: 0;
gap: 6px;
margin: 0 0 8px;
}
.gen-progress.hidden {
display: none;
}
.gen-progress-label {
color: var(--muted);
font-size: 12px;
}
.gen-progress-track {
overflow: hidden;
height: 3px;
border-radius: 999px;
background: var(--line);
}
.gen-progress-bar {
height: 100%;
width: 0;
border-radius: inherit;
background: var(--accent);
transition: width 160ms ease;
}
.gen-progress-bar.indeterminate {
width: 32% !important;
animation: gen-progress-slide 1.15s ease-in-out infinite;
}
@keyframes gen-progress-slide {
0% { transform: translateX(-120%); }
100% { transform: translateX(380%); }
}
.composer-attachments {
display: flex;
flex-wrap: wrap;
gap: 6px;
align-items: center;
width: 100%;
min-width: 0;
}
.composer-attachments.hidden {
display: none !important;
}
.composer-file-chip {
display: inline-flex;
max-width: 100%;
align-items: center;
gap: 6px;
border: 1px solid var(--line);
border-radius: 999px;
background: var(--surface-2);
padding: 3px 8px 3px 4px;
color: var(--muted);
font-size: 11px;
}
.composer-file-badge {
display: grid;
min-width: 34px;
height: 20px;
flex: 0 0 auto;
place-items: center;
border-radius: 999px;
background: var(--accent-soft);
color: var(--accent);
font-size: 9px;
font-weight: 700;
letter-spacing: 0.02em;
text-transform: uppercase;
}
.composer-file-chip .file-chip-name,
.composer-file-chip strong.file-chip-name {
overflow: hidden;
max-width: 220px;
color: inherit;
font-weight: 600;
text-decoration: none;
text-overflow: ellipsis;
white-space: nowrap;
}
.composer-file-chip a.file-chip-name:hover {
color: var(--accent);
}
.file-chip-download {
display: grid;
width: 18px;
height: 18px;
flex: 0 0 auto;
place-items: center;
border-radius: 999px;
color: var(--muted);
text-decoration: none;
}
.file-chip-download:hover {
background: var(--surface);
color: var(--text);
}
.composer-file-remove {
display: grid;
width: 18px;
height: 18px;
flex: 0 0 auto;
place-items: center;
border: 0;
border-radius: 999px;
background: transparent;
color: var(--muted);
font-size: 14px;
line-height: 1;
cursor: pointer;
}
.composer-file-remove:hover {
background: color-mix(in srgb, #c44 18%, transparent);
color: var(--text);
}
.message-attachments {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-bottom: 8px;
}
.composer-row {
display: grid;
grid-template-columns: 36px minmax(0, 1fr) 36px;
align-items: end;
gap: 10px;
width: 100%;
min-width: 0;
}
.composer-actions {
display: grid;
width: 34px;
height: 34px;
place-items: center;
}
.composer-actions > .send-button,
.composer-actions > .stop-button {
grid-area: 1 / 1;
}
.attach-button {
display: grid;
width: 34px;
height: 34px;
place-items: center;
border: 1px solid var(--line);
border-radius: 9px;
background: var(--surface-2);
color: var(--muted);
font-size: 15px;
line-height: 1;
}
.attach-button:hover {
border-color: color-mix(in srgb, var(--accent) 45%, var(--line));
background: var(--accent-soft);
color: var(--accent);
}
.attach-button input {
display: none;
}
.chat-composer textarea {
min-width: 0;
max-height: 180px;
padding: 6px 2px;
}
.send-button:disabled {
cursor: wait;
opacity: 0.45;
}
.modal-backdrop {
position: fixed;
inset: 0;
z-index: 50;
display: grid;
place-items: center;
background: rgba(20, 19, 15, 0.48);
padding: 20px;
backdrop-filter: blur(4px);
}
.modal {
width: min(560px, 100%);
border: 1px solid var(--line);
border-radius: 17px;
background: var(--surface);
padding: 26px;
box-shadow: var(--shadow);
}
.modal-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
margin-bottom: 22px;
}
.modal-header h2 {
margin: 0;
font-family: "Playfair Display", serif;
font-size: 28px;
}
.modal label {
display: grid;
gap: 7px;
margin-top: 15px;
color: var(--muted);
font-size: 11px;
font-weight: 600;
}
.modal input,
.modal textarea {
width: 100%;
resize: vertical;
border: 1px solid var(--line);
border-radius: 9px;
outline: none;
background: var(--bg);
padding: 11px 12px;
line-height: 1.5;
}
.modal input:focus,
.modal textarea:focus {
border-color: var(--accent);
}
.modal-actions {
display: flex;
justify-content: flex-end;
gap: 9px;
margin-top: 23px;
}
.toast {
position: fixed;
right: 24px;
bottom: 24px;
z-index: 80;
max-width: 360px;
transform: translateY(20px);
border-radius: 10px;
background: var(--text);
color: var(--bg);
padding: 11px 15px;
opacity: 0;
pointer-events: none;
transition: 180ms ease;
}
.toast.visible {
transform: translateY(0);
opacity: 1;
}
.login-screen {
position: fixed;
inset: 0;
z-index: 100;
display: grid;
min-height: 100vh;
place-items: center;
padding: 24px;
background:
radial-gradient(ellipse at 20% 10%, color-mix(in srgb, var(--accent) 18%, transparent), transparent 45%),
radial-gradient(ellipse at 80% 90%, color-mix(in srgb, var(--accent-soft) 70%, transparent), transparent 40%),
var(--bg);
}
.login-card {
width: min(400px, 100%);
border: 1px solid var(--line);
border-radius: 18px;
background: var(--surface);
padding: 28px;
box-shadow: var(--shadow);
}
.login-brand {
margin-bottom: 22px;
text-align: center;
}
.login-brand .brand-mark {
margin: 0 auto 14px;
}
.login-brand h1 {
margin-bottom: 8px;
font-size: 34px;
}
.login-brand p {
margin: 0;
color: var(--muted);
}
.login-card label {
display: grid;
gap: 7px;
margin-top: 14px;
color: var(--muted);
font-size: 11px;
font-weight: 600;
}
.login-card input {
width: 100%;
border: 1px solid var(--line);
border-radius: 9px;
outline: none;
background: var(--bg);
padding: 11px 12px;
}
.login-card input:focus {
border-color: var(--accent);
}
.login-submit {
width: 100%;
margin-top: 20px;
}
.login-error {
margin: 12px 0 0;
color: #c24b3b;
font-size: 12px;
text-align: center;
}
.logout-button {
display: block;
width: 100%;
margin-top: 4px;
padding: 6px 10px;
text-align: left;
}
.agent-status {
display: flex;
align-items: center;
gap: 7px;
border: 1px solid var(--line);
border-radius: 999px;
background: var(--surface);
padding: 5px 10px;
color: var(--muted);
font-size: 11px;
font-weight: 600;
text-transform: lowercase;
}
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--muted);
}
.status-dot.idle {
background: #5f9f6b;
}
.status-dot.busy {
background: var(--accent);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 25%, transparent);
}
.status-dot.error {
background: #c24b3b;
}
.menu-wrap {
position: relative;
margin-left: auto;
}
.menu-dropdown {
position: absolute;
top: calc(100% + 4px);
right: 0;
z-index: 30;
display: grid;
min-width: 160px;
border: 1px solid var(--line);
border-radius: 10px;
background: var(--surface);
padding: 6px;
box-shadow: var(--shadow);
}
.menu-dropdown button,
.menu-dropdown a.menu-link {
border: 0;
border-radius: 7px;
background: transparent;
padding: 9px 10px;
color: inherit;
text-align: left;
text-decoration: none;
}
.menu-dropdown button:hover,
.menu-dropdown a.menu-link:hover {
background: var(--surface-2);
}
.menu-dropdown button.danger {
color: #c24b3b;
}
.model-select {
width: 100%;
color: var(--text);
border: 1px solid var(--line);
border-radius: 9px;
background-color: var(--surface);
padding: 10px 11px;
}
.model-select option,
select option {
color: var(--text);
background-color: var(--surface);
}
.panel-hint {
margin: 10px 0 0;
color: var(--muted);
font-size: 11px;
}
.stop-button {
display: grid;
width: 34px;
height: 34px;
place-items: center;
border: 0;
border-radius: 9px;
background: #c24b3b;
color: white;
font-size: 12px;
}
.stop-button:hover {
filter: brightness(1.05);
}
.context-chips {
display: flex;
flex-wrap: wrap;
gap: 6px;
align-items: center;
margin-bottom: 6px;
}
.chip-label {
color: var(--muted);
font-size: 10px;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
}
.chip {
border: 1px solid var(--line);
border-radius: 999px;
background: var(--surface-2);
padding: 3px 8px;
color: var(--muted);
font-size: 11px;
}
.chip.chip-file {
display: inline-flex;
max-width: 100%;
align-items: center;
gap: 6px;
padding: 3px 8px 3px 4px;
text-decoration: none;
}
.chip.chip-file span:last-child {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
a.chip.chip-file:hover {
color: var(--text);
border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
}
.message-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 10px;
padding-top: 8px;
border-top: 1px solid color-mix(in srgb, var(--line) 80%, transparent);
}
.message-actions button,
.code-copy {
border: 1px solid var(--line);
border-radius: 7px;
background: color-mix(in srgb, var(--surface-2) 70%, var(--surface));
color: color-mix(in srgb, var(--text) 78%, var(--muted));
padding: 4px 9px;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.01em;
transition: color 140ms ease, border-color 140ms ease, background 140ms ease;
}
.message-actions button:hover,
.code-copy:hover {
border-color: color-mix(in srgb, var(--accent) 45%, var(--line));
background: var(--accent-soft);
color: var(--accent);
}
.code-wrap {
position: relative;
margin: 0.75em 0;
}
.code-copy {
position: absolute;
top: 8px;
right: 10px;
z-index: 1;
}
.code-wrap .msg-code {
margin: 0;
padding-top: 34px;
}
.message-body .msg-mermaid-wrap {
margin: 0.75em 0;
}
.message-body .msg-mermaid {
width: 100%;
max-width: 100%;
overflow-x: auto;
border: 1px solid var(--line);
border-radius: 10px;
background: var(--surface-2);
padding: 34px 14px 14px;
scrollbar-width: thin;
scrollbar-color: color-mix(in srgb, var(--muted) 45%, transparent) transparent;
}
.message-body .msg-mermaid .mermaid,
.message-body .msg-mermaid svg {
display: block;
width: 100%;
max-width: 100%;
height: auto;
margin: 0 auto;
background: transparent;
color: var(--text);
cursor: zoom-in;
}
.message-body .msg-mermaid .mermaid {
text-align: center;
}
.message-body .msg-mermaid-source {
display: none;
}
.message-body .msg-mermaid-error {
margin: 0 0 10px;
border: 1px solid color-mix(in srgb, #b75b3c 45%, var(--line));
border-radius: 8px;
background: color-mix(in srgb, #b75b3c 12%, var(--surface-2));
padding: 10px 12px;
color: var(--accent);
font-size: 13px;
}
.message-body .msg-mermaid-fallback {
margin: 0;
overflow-x: auto;
border-radius: 8px;
background: var(--surface);
padding: 12px;
color: var(--text);
font-family: "Cascadia Code", "Consolas", "Courier New", monospace;
font-size: 12px;
white-space: pre-wrap;
word-break: break-word;
}
.diagram-lightbox {
position: fixed;
inset: 0;
z-index: 1200;
display: grid;
place-items: center;
background: rgba(12, 12, 10, 0.82);
padding: 24px;
cursor: zoom-out;
}
.diagram-lightbox.hidden {
display: none !important;
}
.diagram-lightbox-inner {
display: grid;
max-width: min(96vw, 1400px);
max-height: 92vh;
place-items: center;
overflow: auto;
cursor: default;
}
.diagram-lightbox-inner img,
.diagram-lightbox-inner svg {
display: block;
max-width: 95vw;
max-height: 90vh;
width: auto;
height: auto;
margin: 0 auto;
border-radius: 8px;
background: var(--surface-2);
padding: 16px;
object-fit: contain;
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.35);
}
.diagram-lightbox-close {
position: absolute;
top: 16px;
right: 16px;
width: 40px;
height: 40px;
border: 1px solid rgba(255, 255, 255, 0.25);
border-radius: 10px;
background: rgba(30, 30, 26, 0.85);
color: #f5f5f0;
font-size: 22px;
line-height: 1;
cursor: pointer;
}
.users-form {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr)) auto;
gap: 12px;
align-items: end;
margin-bottom: 28px;
}
.users-form label {
display: grid;
gap: 6px;
color: var(--muted);
font-size: 11px;
font-weight: 600;
}
.users-form input,
.users-form select {
width: 100%;
color: var(--text);
border: 1px solid var(--line);
border-radius: 9px;
background-color: var(--surface);
padding: 10px 11px;
}
.users-table {
border: 1px solid var(--line);
border-radius: 14px;
background: var(--surface);
overflow: hidden;
}
.users-head,
.users-row {
display: grid;
grid-template-columns: 1.2fr 1fr 0.6fr;
gap: 12px;
padding: 12px 16px;
}
.users-head {
border-bottom: 1px solid var(--line);
color: var(--muted);
font-size: 11px;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
}
.users-row + .users-row {
border-top: 1px solid var(--line);
}
.role-pill {
width: fit-content;
border-radius: 999px;
background: var(--accent-soft);
color: var(--accent);
padding: 3px 8px;
font-size: 11px;
font-weight: 700;
}
@media (max-width: 1000px) {
.project-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.project-layout {
grid-template-columns: 1fr;
}
.details-panel {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24px;
border-top: 1px solid var(--line);
border-left: 0;
padding: 30px;
}
}
@media (max-width: 720px) {
.app-shell {
display: block;
}
.sidebar {
transform: translateX(-100%);
box-shadow: var(--shadow);
transition: transform 180ms ease;
}
.sidebar.open {
transform: translateX(0);
}
.mobile-close,
.menu-button {
display: grid;
}
.main {
min-width: 0;
}
.topbar {
padding: 0 15px;
}
.breadcrumbs {
display: none;
}
.content-wide {
width: 100%;
max-width: none;
padding: 42px 16px;
}
.page-title-row {
align-items: flex-start;
flex-direction: column;
gap: 22px;
}
.project-grid {
grid-template-columns: 1fr;
}
.project-main {
width: 100%;
max-width: none;
padding: 38px 16px;
}
.project-heading {
align-items: flex-start;
}
.project-heading h1 {
font-size: 31px;
}
.details-panel {
grid-template-columns: 1fr;
padding: 28px 18px;
}
.chat-page {
height: 100%;
max-height: 100%;
max-width: none;
padding: 0 12px;
}
.app-shell {
height: 100%;
max-height: 100dvh;
}
.main {
height: 100%;
max-height: 100%;
min-height: 0;
}
.users-form {
grid-template-columns: 1fr;
}
.agent-status span:last-child {
display: none;
}
}