:root { --motion-emphasized: cubic-bezier(0.22, 1, 0.36, 1); --motion-snappy: cubic-bezier(0.34, 1.56, 0.64, 1); --motion-soft: cubic-bezier(0.25, 0.8, 0.25, 1); } .app-shell { display: flex; height: 100%; min-height: 100%; overflow: hidden; } .sidebar { width: 18rem; flex: 0 0 18rem; height: 100%; min-height: 0; display: flex; flex-direction: column; gap: 0.75rem; padding: 0.875rem; border-right: 1px solid var(--line); background: var(--sidebar); transition: width 320ms var(--motion-emphasized), flex-basis 320ms var(--motion-emphasized), padding 320ms var(--motion-emphasized), border-color 220ms var(--motion-soft); } .sidebar.is-collapsed { width: 4.5rem; flex-basis: 4.5rem; padding-inline: 0.5rem; } .sidebar-header { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; } .sidebar-title-block { min-width: 0; } .sidebar-title { margin: 0; font-size: 0.95rem; font-weight: 600; } .sidebar-caption, .panel-caption, .bubble-role, .tool-card-label, .code-line-number, .conversation-item-primary span, .conversation-item-secondary { color: var(--muted); } .sidebar-caption, .panel-caption, .conversation-item-secondary, .conversation-item-primary span, .tool-card-label { font-size: 0.78rem; } .sidebar-header-actions { display: flex; align-items: center; gap: 0.5rem; } .toolbar-button, .send-button, .download-link, .conversation-item, .rail-item, .chat-composer, .model-select select { border: 1px solid var(--line); background: var(--surface); color: var(--ink); transition: border-color 140ms ease, background-color 140ms ease; } .toolbar-button, .send-button, .rail-item { display: inline-flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; padding: 0; border-radius: 0.45rem; cursor: pointer; } .toolbar-button:hover, .send-button:hover, .download-link:hover, .conversation-item:hover, .rail-item:hover, .chat-composer:hover, .model-select select:hover, .tool-card:hover { border-color: var(--line-strong); } .toolbar-button:disabled, .send-button:disabled, .conversation-item:disabled, .rail-item:disabled { opacity: 0.55; cursor: default; } .conversation-list, .rail-list, .chat-timeline { min-height: 0; overflow: auto; } .conversation-list { display: flex; flex: 1; flex-direction: column; gap: 0.5rem; } .conversation-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0.4rem; align-items: stretch; } .conversation-item { padding: 0.75rem; border-radius: 0.55rem; text-align: left; cursor: pointer; } .conversation-delete-button { display: inline-flex; align-items: center; justify-content: center; width: 2rem; border: 1px solid var(--line); border-radius: 0.55rem; background: var(--surface); color: var(--muted); cursor: pointer; opacity: 0; transition: border-color 140ms ease, background-color 140ms ease, color 140ms ease, opacity 140ms ease; } .conversation-row:hover .conversation-delete-button, .conversation-row:focus-within .conversation-delete-button, .conversation-row.is-active .conversation-delete-button { opacity: 1; } .conversation-delete-button:hover { border-color: #6e4b49; color: #efac9e; } .conversation-delete-button:disabled { opacity: 0.55; cursor: default; } .conversation-item.is-active, .rail-item.is-active { border-color: var(--accent-line); background: var(--surface-active); } .conversation-item-primary { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; } .conversation-item-primary strong { font-size: 0.84rem; font-weight: 600; } .conversation-item-secondary { margin-top: 0.2rem; } .empty-card { padding: 0.85rem; border: 1px dashed var(--line); border-radius: 0.55rem; color: var(--muted); font-size: 0.84rem; } .rail-list { display: flex; flex: 1; flex-direction: column; gap: 0.5rem; } .rail-item { width: 100%; height: 2.25rem; font-size: 0.78rem; text-transform: uppercase; } .workspace-shell { flex: 1; min-width: 0; min-height: 0; height: 100%; padding: 0.875rem; overflow: hidden; } .workspace-panels, .main-panel-group, .workbench-group, .panel-shell, .chat-panel-shell, .workbench-panel, .workbench-content, .viewport-panel-content, .code-panel-content, .model-canvas-shell { min-height: 0; } .workspace-panels, .main-panel-group, .workbench-group, .chat-panel-shell { height: 100%; } .panel-shell { display: flex; flex-direction: column; gap: 0.75rem; height: 100%; padding: 0.875rem; border: 1px solid var(--line); background: var(--surface); } .panel-header { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; } .panel-header-actions { display: flex; align-items: center; justify-content: flex-end; gap: 0.5rem; flex-wrap: wrap; } .panel-title-group { min-width: 0; } .panel-title-group h2 { margin: 0; font-size: 0.95rem; font-weight: 600; } .panel-caption { margin: 0.1rem 0 0; } .model-select { display: flex; align-items: center; gap: 0.5rem; font-size: 0.8rem; color: var(--muted); } .artifact-picker { min-width: 0; } .model-select select { padding: 0.45rem 0.6rem; border-radius: 0.45rem; appearance: none; font: inherit; } .artifact-picker select { max-width: min(22rem, 46vw); } .download-link { display: inline-flex; align-items: center; justify-content: center; padding: 0.45rem 0.65rem; border-radius: 0.45rem; text-decoration: none; font-size: 0.8rem; } .chat-timeline { display: flex; flex: 1; flex-direction: column; gap: 1rem; padding-right: 0.1rem; } .turn { display: grid; gap: 0.65rem; } .bubble, .tool-card, .chat-composer, .error-banner, .code-scroll-shell, .empty-state { border: 1px solid var(--line); background: var(--surface-soft); } .bubble, .tool-card, .chat-composer, .error-banner, .empty-state, .code-scroll-shell { border-radius: 0.55rem; } .bubble { padding: 0.8rem 0.9rem; transition: border-color 220ms var(--motion-soft), background-color 220ms var(--motion-soft), transform 260ms var(--motion-emphasized), box-shadow 260ms var(--motion-soft); } .bubble-user { max-width: min(40rem, 84%); justify-self: end; background: #161c24; } .bubble-assistant { max-width: min(46rem, 92%); } .bubble-thinking { border-style: dashed; position: relative; overflow: hidden; background: radial-gradient(circle at top left, rgba(143, 197, 255, 0.12), transparent 46%), linear-gradient(180deg, rgba(18, 24, 31, 0.92), rgba(14, 19, 25, 0.88)); animation: thinking-breath 1800ms var(--motion-soft) infinite; } .bubble-thinking::after { content: ''; position: absolute; inset: -1px; background: linear-gradient( 105deg, transparent 0%, transparent 34%, rgba(255, 255, 255, 0.03) 48%, transparent 62%, transparent 100% ); transform: translateX(-120%); animation: thinking-sheen 2400ms var(--motion-emphasized) infinite; pointer-events: none; } .thinking-indicator { display: grid; gap: 0.45rem; } .thinking-indicator-line { display: inline-flex; align-items: center; gap: 0.5rem; } .thinking-indicator-text { font-weight: 500; letter-spacing: 0.01em; } .thinking-indicator-dots { display: inline-flex; align-items: center; gap: 0.28rem; } .thinking-indicator-dot { width: 0.38rem; height: 0.38rem; border-radius: 999px; background: rgba(184, 220, 255, 0.92); box-shadow: 0 0 0.55rem rgba(143, 197, 255, 0.35); animation: thinking-dot-pulse 960ms var(--motion-snappy) infinite; } .thinking-indicator-dot:nth-child(2) { animation-delay: 120ms; } .thinking-indicator-dot:nth-child(3) { animation-delay: 240ms; } .thinking-indicator p { margin: 0; color: var(--muted); font-size: 0.82rem; line-height: 1.6; max-width: 34rem; } .bubble-role { display: inline-block; margin-bottom: 0.4rem; text-transform: uppercase; letter-spacing: 0.08em; font-size: 0.68rem; } .bubble p { margin: 0; line-height: 1.65; } .assistant-sequence { display: flex; flex-direction: column; gap: 0.55rem; } .markdown-body { line-height: 1.7; transform-origin: left top; } .markdown-body p, .markdown-body ul, .markdown-body ol, .markdown-body pre, .markdown-body blockquote { margin: 0 0 0.85rem; } .markdown-body > :last-child { margin-bottom: 0; } .markdown-body pre, .tool-card-body pre { margin: 0; padding: 0.75rem; border: 1px solid var(--line); border-radius: 0.45rem; background: #0f141a; overflow: auto; font-family: 'IBM Plex Mono', 'SFMono-Regular', Consolas, monospace; white-space: pre-wrap; word-break: break-word; } .tool-card-body pre { font-size: 0.74rem; line-height: 1.45; } .tool-card { max-width: min(46rem, 92%); overflow: hidden; transform-origin: top left; transition: border-color 240ms var(--motion-soft), background-color 240ms var(--motion-soft), transform 300ms var(--motion-emphasized), box-shadow 300ms var(--motion-soft); } .reasoning-card { max-width: min(46rem, 92%); overflow: hidden; border: 1px dashed rgba(143, 197, 255, 0.42); border-radius: 0.55rem; background: rgba(143, 197, 255, 0.08); transform-origin: top left; transition: border-color 240ms var(--motion-soft), background-color 240ms var(--motion-soft), transform 300ms var(--motion-emphasized), box-shadow 300ms var(--motion-soft); } .reasoning-card-summary, .tool-card-summary, .tool-nested-summary { width: 100%; border: 0; background: transparent; color: inherit; font: inherit; text-align: left; } .reasoning-card-summary { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; list-style: none; cursor: pointer; padding: 0.7rem 0.85rem; transition: padding 260ms var(--motion-emphasized); } .reasoning-card-title { display: inline-flex; align-items: center; gap: 0.55rem; } .reasoning-card-title strong { font-size: 0.8rem; color: #b8dcff; } .reasoning-card-body-wrap { height: 0; opacity: 0; transform: translateY(-0.25rem) scaleY(0.985); transform-origin: top; overflow: hidden; will-change: height, opacity, transform; transition: height 420ms var(--motion-emphasized), opacity 260ms var(--motion-soft), transform 420ms var(--motion-emphasized); } .reasoning-card.is-open .reasoning-card-body-wrap { opacity: 1; transform: translateY(0) scaleY(1); } .reasoning-card-body { min-height: 0; overflow: hidden; padding: 0 0.85rem 0.85rem; } .tool-card-summary { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; list-style: none; cursor: pointer; padding: 0.75rem 0.85rem; transition: padding 280ms var(--motion-emphasized); } .tool-card.is-open { border-color: var(--line-strong); box-shadow: 0 18px 36px rgba(6, 10, 14, 0.16); transform: translateY(-0.05rem); } .tool-card-title-row, .tool-card-title { display: flex; align-items: center; gap: 0.6rem; } .tool-card-title-row { width: 100%; justify-content: space-between; } .tool-card-title strong { font-size: 0.84rem; } .tool-status-pill { display: inline-flex; align-items: center; gap: 0.35rem; padding: 0.2rem 0.45rem; border: 1px solid var(--line); border-radius: 0.4rem; font-size: 0.74rem; color: var(--muted); } .tool-status-pill.is-running, .tool-status-pill.is-pending { color: #8fc5ff; } .tool-status-pill.is-completed { color: #96d7b5; } .tool-status-pill.is-error { color: #efac9e; } .tool-card-chevron { color: var(--muted); transition: transform 260ms var(--motion-snappy), color 180ms var(--motion-soft); } .tool-card.is-open .tool-card-chevron { transform: rotate(180deg); } .tool-card-body { display: grid; gap: 0.75rem; padding: 0 0.85rem 0.85rem; } .tool-card-body-wrap { height: 0; opacity: 0; transform: translateY(-0.25rem) scaleY(0.985); transform-origin: top; overflow: hidden; will-change: height, opacity, transform; transition: height 420ms var(--motion-emphasized), opacity 240ms var(--motion-soft), transform 420ms var(--motion-emphasized); } .tool-card.is-open .tool-card-body-wrap { opacity: 1; transform: translateY(0) scaleY(1); } .tool-card-body-wrap > .tool-card-body { min-height: 0; overflow: hidden; } .tool-card-section { display: grid; gap: 0.35rem; } .tool-nested-list { display: grid; gap: 0.45rem; } .tool-card-middle-sequence { display: grid; gap: 0.55rem; } .bubble-tool-inline, .tool-inline-reasoning { max-width: 100%; } .bubble-tool-inline { background: #12171d; } .bubble-tool-inline .bubble-role { color: #96d7b5; } .bubble-tool-inline .markdown-body > :first-child, .tool-inline-reasoning .markdown-body > :first-child { margin-top: 0; } .stream-delta { display: inline; animation: stream-delta-in 900ms var(--motion-emphasized) both; will-change: opacity, filter; } .tool-nested-item { border: 1px solid var(--line); border-radius: 0.45rem; background: #12171d; overflow: hidden; } .tool-nested-item.is-response { border-color: rgba(150, 215, 181, 0.32); background: rgba(150, 215, 181, 0.08); } .tool-nested-item.is-reasoning { border-color: rgba(143, 197, 255, 0.34); background: rgba(143, 197, 255, 0.08); } .tool-nested-item.is-progress { border-color: rgba(255, 196, 107, 0.28); background: rgba(255, 196, 107, 0.07); } .tool-nested-item.is-error { border-color: rgba(239, 172, 158, 0.3); background: rgba(239, 172, 158, 0.08); } .tool-nested-item.is-result { border-color: rgba(154, 168, 183, 0.24); background: rgba(154, 168, 183, 0.05); } .tool-nested-item-topline { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; } .tool-nested-item-actions { display: inline-flex; align-items: center; gap: 0.45rem; } .tool-nested-summary { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; padding: 0.6rem 0.7rem; cursor: pointer; } .tool-nested-body-wrap { height: 0; opacity: 0; transform: translateY(-0.2rem) scaleY(0.985); transform-origin: top; overflow: hidden; will-change: height, opacity, transform; transition: height 360ms var(--motion-emphasized), opacity 220ms var(--motion-soft), transform 360ms var(--motion-emphasized); } .tool-nested-item.is-open .tool-nested-body-wrap { opacity: 1; transform: translateY(0) scaleY(1); } .tool-nested-body { min-height: 0; overflow: hidden; display: grid; gap: 0.45rem; padding: 0 0.7rem 0.7rem; } .tool-nested-chevron { color: var(--muted); transition: transform 220ms var(--motion-snappy), color 180ms var(--motion-soft); } .tool-nested-item.is-open .tool-nested-chevron { transform: rotate(180deg); } .tool-nested-item-topline strong { font-size: 0.78rem; font-weight: 600; } .tool-nested-item p { margin: 0.35rem 0 0; font-size: 0.74rem; line-height: 1.45; color: var(--muted); white-space: pre-wrap; word-break: break-word; } .tool-nested-block { display: grid; gap: 0.3rem; margin-top: 0.45rem; } .tool-nested-block.is-response .tool-card-label { color: #96d7b5; } .tool-nested-block.is-reasoning .tool-card-label { color: #8fc5ff; } .tool-nested-block.is-progress .tool-card-label { color: #ffc46b; } .tool-nested-block.is-error .tool-card-label { color: #efac9e; } .tool-nested-block pre { margin: 0; padding: 0.65rem; border: 1px solid var(--line); border-radius: 0.45rem; background: #0f141a; overflow: auto; font-family: 'IBM Plex Mono', 'SFMono-Regular', Consolas, monospace; font-size: 0.72rem; line-height: 1.45; white-space: pre-wrap; word-break: break-word; } .tool-nested-status { font-size: 0.72rem; color: var(--muted); } .tool-nested-status.is-running { color: #8fc5ff; } .tool-nested-status.is-completed { color: #96d7b5; } .tool-nested-status.is-error { color: #efac9e; } .tool-card-label { text-transform: uppercase; letter-spacing: 0.06em; } .chat-composer-shell { display: grid; gap: 0.5rem; } .chat-composer-shell.is-dragging-files { outline: 1px dashed var(--accent-line); outline-offset: 0.25rem; } .chat-composer-row { display: flex; align-items: stretch; gap: 0.5rem; } .composer-attach-button { display: inline-flex; align-items: center; justify-content: center; width: 2.75rem; border: 1px solid var(--line); border-radius: 0.55rem; background: var(--surface); color: var(--ink); cursor: pointer; transition: border-color 140ms ease, background-color 140ms ease; } .composer-attach-button:hover { border-color: var(--line-strong); } .composer-attach-button input { display: none; } .composer-image-list { display: flex; flex-wrap: wrap; gap: 0.5rem; } .composer-image-item { width: 7rem; border: 1px solid var(--line); border-radius: 0.55rem; background: var(--surface-soft); overflow: hidden; } .composer-image-item img, .user-image-preview { display: block; width: 100%; object-fit: cover; cursor: zoom-in; } .composer-image-item img { height: 5rem; } .composer-image-meta { display: flex; align-items: center; justify-content: space-between; gap: 0.35rem; padding: 0.45rem 0.5rem; } .composer-image-meta span { min-width: 0; font-size: 0.72rem; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .composer-image-remove { display: inline-flex; align-items: center; justify-content: center; width: 1.5rem; height: 1.5rem; border: 1px solid var(--line); border-radius: 0.4rem; background: var(--surface); color: var(--muted); cursor: pointer; } .composer-image-remove:hover { border-color: var(--line-strong); color: var(--ink); } .user-image-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(6.5rem, 1fr)); gap: 0.5rem; margin-bottom: 0.65rem; } .user-image-preview { max-height: 10rem; border: 1px solid var(--line); border-radius: 0.45rem; background: #10151b; } .image-lightbox { position: fixed; inset: 0; z-index: 30; display: grid; place-items: center; padding: 1.5rem; background: rgba(9, 12, 16, 0.82); backdrop-filter: blur(6px); } .image-lightbox-content { position: relative; max-width: min(92vw, 72rem); max-height: min(92vh, 56rem); display: grid; gap: 0.65rem; padding: 0.85rem; border: 1px solid var(--line-strong); border-radius: 0.75rem; background: #12161c; } .image-lightbox-close { position: absolute; top: 0.75rem; right: 0.75rem; display: inline-flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; border: 1px solid var(--line); border-radius: 999px; background: rgba(18, 22, 28, 0.92); color: var(--ink); cursor: pointer; } .image-lightbox-image { max-width: 100%; max-height: min(80vh, 48rem); border-radius: 0.45rem; object-fit: contain; } .image-lightbox-caption { margin: 0; font-size: 0.82rem; color: var(--muted); text-align: center; } .chat-composer { flex: 1; resize: none; min-height: 4.1rem; padding: 0.6rem 0.75rem; line-height: 1.45; font: inherit; color: var(--ink); } .send-button { flex: 0 0 2.75rem; width: 2.75rem; height: auto; } .error-banner { padding: 0.7rem 0.8rem; color: #f0c0b5; background: #211716; border-color: #3b2421; } .resize-handle { position: relative; background: transparent; } .resize-handle::before { content: ''; position: absolute; inset: 0; margin: auto; background: var(--line-strong); } .resize-handle-vertical { width: 0.625rem; } .resize-handle-vertical::before { width: 1px; height: 100%; } .resize-handle-horizontal { height: 0.625rem; } .resize-handle-horizontal::before { width: 100%; height: 1px; } .viewport-panel-content, .code-panel-content { flex: 1; } .code-scroll-shell { height: 100%; overflow: auto; } .code-scroll-view { margin: 0; min-height: 100%; padding: 0.75rem 0; font-size: 0.82rem; font-family: 'IBM Plex Mono', 'SFMono-Regular', Consolas, monospace; } .code-syntax-view { min-height: 100%; } .code-syntax-view pre, .code-syntax-view code { font-family: 'IBM Plex Mono', 'SFMono-Regular', Consolas, monospace !important; } .code-syntax-view .linenumber { min-width: 2.4rem !important; } .model-canvas-shell, .code-panel-content > div { height: 100%; } .viewport-empty-state, .code-empty-state, .chat-empty-state { height: 100%; } .empty-state { display: grid; place-items: center; gap: 0.4rem; padding: 1.25rem; text-align: center; } .empty-state.is-clickable { width: 100%; font: inherit; color: inherit; cursor: pointer; transition: border-color 140ms ease, background-color 140ms ease; } .empty-state.is-clickable:hover { border-color: var(--line-strong); background: var(--surface-active); } .empty-state.is-clickable h3, .empty-state.is-clickable p { pointer-events: none; } .empty-state h3 { margin: 0; font-size: 0.95rem; font-weight: 600; } .empty-state p { margin: 0; color: var(--muted); } .hidden-file-input { display: none; } .toolbar-button:focus-visible, .send-button:focus-visible, .conversation-item:focus-visible, .conversation-delete-button:focus-visible, .composer-attach-button:focus-visible, .composer-image-remove:focus-visible, .image-lightbox-close:focus-visible, .rail-item:focus-visible, .chat-composer:focus-visible, .tool-card-summary:focus-visible, .reasoning-card-summary:focus-visible, .tool-nested-summary:focus-visible, .model-select select:focus-visible, .download-link:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; } .empty-state.is-clickable:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; } .spin { animation: spin 1.1s linear infinite; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @keyframes stream-delta-in { 0% { opacity: 0; filter: blur(9px); } 18% { opacity: 0.04; filter: blur(8.4px); } 42% { opacity: 0.18; filter: blur(6.4px); } 72% { opacity: 0.64; filter: blur(2.6px); } 100% { opacity: 1; filter: blur(0); } } @keyframes thinking-breath { 0%, 100% { border-color: rgba(143, 197, 255, 0.28); box-shadow: 0 0 0 rgba(143, 197, 255, 0); } 50% { border-color: rgba(143, 197, 255, 0.5); box-shadow: 0 0 1.2rem rgba(143, 197, 255, 0.08); } } @keyframes thinking-dot-pulse { 0%, 100% { opacity: 0.28; transform: translateY(0) scale(0.82); filter: blur(0.6px); } 45% { opacity: 1; transform: translateY(-0.08rem) scale(1.08); filter: blur(0); } } @keyframes thinking-sheen { 0% { transform: translateX(-120%); opacity: 0; } 18% { opacity: 1; } 58% { transform: translateX(120%); opacity: 0.7; } 100% { transform: translateX(120%); opacity: 0; } } @media (prefers-reduced-motion: reduce) { .sidebar, .bubble, .tool-card, .reasoning-card, .tool-card-summary, .reasoning-card-summary, .tool-nested-summary, .tool-card-chevron, .tool-nested-chevron, .tool-card-body-wrap, .reasoning-card-body-wrap, .tool-nested-body-wrap, .bubble-thinking, .bubble-thinking::after, .thinking-indicator-dot, .stream-delta { transition: none !important; animation: none !important; transform: none !important; filter: none !important; } } @media (max-width: 1080px) { .app-shell { flex-direction: column; } .sidebar, .sidebar.is-collapsed { width: auto; flex-basis: auto; height: auto; } .workspace-shell { padding-top: 0; } .panel-header, .chat-composer-row { flex-direction: column; align-items: stretch; } .send-button { width: 100%; flex-basis: auto; } }