Files
yingqing/core/frontend/src/omni-session-page.css
T
2026-09-18 14:51:57 +08:00

3351 lines
64 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 全能创作 · 对话页(omni-session-page)
* 逐行转写自设计稿 "影擎 - 欢迎回来" 的 <style>(原始行 1452115410 + 响应式 1574215780)。
* 与 omni-create-page.css 同一套写法:沿用 --klein / --black / --text token 与设计稿的裸色值,
* 不在这里重写 design-restraint.css 的共享类。
*/
.omni-session-page {
min-height: calc(100vh - var(--topbar-height));
background: transparent;
font-size: 14px;
}
/* 进会话后顶栏换成对话信息,滚下去也还在 */
.omni-session-topbar-slot {
flex: 1 1 auto;
min-width: 0;
height: 100%;
display: flex;
align-items: center;
}
.omni-session-topbar-slot .omni-session-header {
width: min(980px, 100%);
min-height: 0;
margin: 0 auto;
padding: 0;
border-bottom: 0;
}
.omni-session-page > .omni-session-header {
width: min(980px, calc(100% - 42px));
margin: 0 auto 8px;
}
.omni-session-shell {
position: relative;
width: min(980px, calc(100% - 42px));
min-height: calc(100vh - var(--topbar-height));
display: flex;
flex-direction: column;
margin: 0 auto;
padding: 20px 0 18px;
}
.omni-session-header {
min-height: 62px;
display: grid;
grid-template-columns: 126px minmax(0, 1fr) 40px;
align-items: center;
gap: 12px;
padding-bottom: 13px;
border-bottom: 1px solid rgba(34, 42, 54, .08);
}
.omni-session-header > div {
min-width: 0;
text-align: center;
}
.omni-session-header h1 {
overflow: hidden;
margin: 0;
font-size: 16px;
text-overflow: ellipsis;
white-space: nowrap;
}
.omni-session-back {
height: 36px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 7px;
border: 1px solid rgba(34, 42, 54, .10);
border-radius: 10px;
color: #414750;
background: #fff;
font-size: 12px;
cursor: pointer;
}
.omni-session-back svg {
width: 15px;
height: 15px;
}
.omni-session-meta {
display: flex;
justify-content: center;
gap: 5px;
margin-top: 5px;
}
.omni-session-meta span {
color: #7d838c;
font-size: 11px;
}
.omni-session-meta span:not(:last-child)::after {
content: "·";
margin-left: 5px;
color: #b4b8be;
}
.omni-session-feed {
flex: 1 1 auto;
/* 底部留给 sticky composer(+确认卡高度余量),最后一条消息/确认卡滚到输入框上方,不被挡住 */
padding: 30px 0 168px;
background: transparent;
}
.omni-chat-row {
display: flex;
gap: 10px;
margin-bottom: 24px;
animation: omniMessageIn 220ms ease both;
}
/* 设计稿写的是 .omni-chat-row.user;design-restraint.css 里有个裸 .user 全局类
(侧栏用户胶囊:999 圆角 + #f3f4f7 灰底 + space-between),会把整套样式传染进来。
这里改用 .is-user 避开 —— 本文件相对设计稿唯一的类名改动。 */
.omni-chat-row.is-user {
justify-content: flex-end;
/* 用户气泡常从乐观 id 换成服务端 id;入场动画会让它闪一下,关掉 */
animation: none;
}
.omni-chat-avatar {
width: 34px;
height: 34px;
display: grid;
place-items: center;
flex: 0 0 auto;
border-radius: 10px;
color: #fff;
background: var(--klein);
box-shadow: 0 8px 18px rgba(0, 47, 167, .15);
}
.omni-chat-avatar svg {
width: 16px;
height: 16px;
}
.omni-chat-bubble {
max-width: min(670px, 82%);
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 8px;
padding: 12px 15px;
border: 1px solid rgba(34, 42, 54, .08);
border-radius: 14px;
color: #323945;
background: #f7f8fa;
font-size: 13px;
line-height: 1.7;
}
.omni-chat-text {
margin: 0;
white-space: pre-wrap;
}
.omni-chat-markdown {
width: 100%;
}
.omni-chat-markdown > :first-child {
margin-top: 0;
}
.omni-chat-markdown > :last-child {
margin-bottom: 0;
}
.omni-chat-markdown h3 {
margin: 0 0 8px;
color: var(--accent-black);
font-size: 14px;
font-weight: 600;
line-height: 1.5;
}
.omni-chat-markdown p {
margin: 0 0 8px;
}
.omni-chat-markdown ol,
.omni-chat-markdown ul {
margin: 0 0 8px;
padding-left: 20px;
}
.omni-chat-markdown li + li {
margin-top: 4px;
}
.omni-chat-markdown strong {
color: var(--accent-black);
font-weight: 600;
}
.omni-chat-markdown code {
padding: 1px 4px;
border-radius: var(--r-sm);
color: var(--accent-black);
background: var(--black-alpha-4);
font-family: var(--font-mono);
font-size: .92em;
}
.omni-reply-hint {
margin: 8px 0 0;
padding-top: 8px;
border-top: 1px dashed rgba(34, 42, 54, .12);
color: #667085;
font-size: 12px;
line-height: 1.55;
}
.omni-reply-hint-label {
display: inline-block;
margin-right: 6px;
padding: 1px 6px;
border-radius: 999px;
color: #3b5bdb;
background: rgba(59, 91, 219, .08);
font-size: 11px;
font-weight: 600;
}
.omni-chat-row.is-user .omni-reply-hint {
display: none;
}
.omni-reply-guide {
margin-top: 8px;
}
.omni-reply-guide-options {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
}
.omni-reply-guide-options button {
min-height: 30px;
padding: 0 12px;
border: 1px solid var(--border-faint);
border-radius: var(--r-md);
color: var(--accent-black);
background: var(--surface);
font: inherit;
font-size: 12px;
font-weight: 500;
cursor: pointer;
transition: background-color 160ms ease, border-color 160ms ease, color 160ms ease;
}
.omni-reply-guide-options button:hover:not(:disabled) {
border-color: var(--heat-40);
color: var(--heat);
background: var(--heat-12);
}
.omni-reply-guide-options button.primary {
border-color: var(--heat-20);
color: var(--heat);
background: var(--heat-12);
}
.omni-reply-guide-options button:disabled {
color: var(--black-alpha-48);
background: var(--black-alpha-4);
cursor: not-allowed;
}
.omni-reply-custom-input {
display: flex;
flex: 1 1 260px;
gap: 6px;
width: min(300px, 100%);
max-width: 300px;
}
.omni-reply-custom-input .input {
min-width: 0;
height: 36px;
padding: 0 12px;
font-size: 12px;
}
.omni-reply-custom-input button {
flex: 0 0 36px;
width: 36px;
padding: 0;
display: inline-flex;
align-items: center;
justify-content: center;
}
/* 小云雀式跟随追问:答案留在问题附近,尺寸不抢占对话空间。 */
.omni-chat-question-input {
display: flex;
align-items: center;
gap: 6px;
width: min(300px, 100%);
}
.omni-chat-question-input .input {
min-width: 0;
height: 36px;
padding: 0 12px;
font-size: 12px;
border-color: var(--border-faint);
background: var(--surface);
}
.omni-chat-question-input button {
flex: 0 0 36px;
width: 36px;
height: 36px;
padding: 0;
display: inline-flex;
align-items: center;
justify-content: center;
border: 1px solid var(--border-faint);
border-radius: var(--r-md);
color: var(--text-secondary);
background: var(--surface);
cursor: pointer;
}
.omni-chat-question-input button:hover:not(:disabled) {
border-color: var(--heat-40);
color: var(--heat);
background: var(--heat-12);
}
.omni-chat-question-input button:disabled {
color: var(--black-alpha-48);
background: var(--black-alpha-4);
cursor: not-allowed;
}
.omni-chat-row.is-user .omni-chat-bubble {
align-items: flex-end;
border-color: var(--black-alpha-12);
border-bottom-right-radius: 4px;
color: var(--accent-black);
background: color-mix(in srgb, var(--surface) 72%, transparent);
-webkit-backdrop-filter: blur(14px) saturate(115%);
backdrop-filter: blur(14px) saturate(115%);
}
.omni-result-card,
.omni-process-card {
box-sizing: border-box;
width: min(320px, calc(100% - 44px));
max-width: 320px;
margin: 0 0 24px 44px;
border: 1px solid rgba(34, 42, 54, .09);
border-radius: 15px;
background: #fff;
box-shadow: 0 10px 26px rgba(20, 27, 38, .06);
animation: omniMessageIn 220ms ease both;
overflow: hidden;
}
.omni-result-card.has-multiple,
.omni-process-card.has-multiple {
width: min(520px, calc(100% - 44px));
max-width: 520px;
}
.omni-result-card.has-single.is-ratio-16-9,
.omni-process-card.has-single.is-ratio-16-9 {
width: min(480px, calc(100% - 44px));
max-width: 480px;
}
.omni-result-card.has-single.is-ratio-1-1,
.omni-process-card.has-single.is-ratio-1-1 {
width: min(340px, calc(100% - 44px));
max-width: 340px;
}
.omni-strategy-card,
.omni-video-plan-card,
.omni-prompt-file-card,
.omni-elicit-card {
width: min(760px, calc(100% - 44px));
margin: 0 0 24px 44px;
border: 1px solid rgba(34, 42, 54, .09);
border-radius: 16px;
background: #fff;
box-shadow: 0 12px 30px rgba(20, 27, 38, .065);
animation: omniMessageIn 220ms ease both;
}
/* 追问/素材选择卡:关掉入场 opacity,poll 合并时即使短暂重挂也不会闪没 */
.omni-elicit-card {
animation: none;
}
.omni-elicit-slot {
width: min(760px, calc(100% - 44px));
margin: 0 0 24px 44px;
}
.omni-elicit-slot .omni-elicit-card {
width: 100%;
margin: 0;
}
/* 卖点确认与剧情方向共用追问容器,不能在容器内再次计算宽度和左缩进。 */
.omni-elicit-slot .omni-selling-point-card {
width: 100%;
margin: 0;
}
.omni-strategy-card {
overflow: hidden;
border-top: 3px solid var(--klein);
}
.omni-strategy-head,
.omni-video-plan-head,
.omni-elicit-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 15px 17px 13px;
border-bottom: 1px solid rgba(34, 42, 54, .07);
}
.omni-strategy-head strong,
.omni-video-plan-head strong {
font-size: 14px;
}
.omni-strategy-head span,
.omni-video-plan-head span {
padding: 5px 8px;
border-radius: 999px;
color: var(--klein);
background: #edf5ff;
font-size: 11px;
font-weight: 700;
}
.omni-strategy-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
padding: 14px 16px 16px;
}
.omni-strategy-grid div {
min-width: 0;
padding: 12px;
border-radius: 11px;
background: #f6f8fb;
}
.omni-strategy-grid span,
.omni-strategy-grid strong {
display: block;
}
.omni-strategy-grid span {
color: #858b94;
font-size: 11px;
}
.omni-strategy-grid strong {
margin-top: 6px;
color: #272d37;
font-size: 12px;
line-height: 1.55;
}
.omni-strategy-direction {
display: flex;
align-items: center;
gap: 8px;
margin: 0 16px 16px;
padding: 10px 12px;
border: 1px solid rgba(0, 47, 167, .10);
border-radius: 10px;
color: #39404b;
background: #f5f9ff;
font-size: 12px;
}
.omni-strategy-direction b {
color: var(--klein);
}
.omni-video-plan-card {
overflow: hidden;
border-top: 3px solid var(--black);
}
.omni-video-plan-head span {
color: #fff;
background: var(--black);
font-size: 12px;
}
.omni-video-plan-head strong {
font-size: 16px;
}
.omni-plan-section {
padding: 15px 17px;
border-bottom: 1px solid rgba(34, 42, 54, .07);
}
.omni-plan-section:last-child {
border-bottom: 0;
}
.omni-plan-section > strong {
display: block;
margin-bottom: 10px;
font-size: 14px;
line-height: 1.5;
}
.omni-plan-points {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
}
.omni-plan-points span {
padding: 10px;
border-radius: 9px;
color: #525965;
background: #f6f8fa;
font-size: 13px;
line-height: 1.65;
}
.omni-plan-points b {
display: block;
margin-bottom: 4px;
color: #252b35;
font-size: 12px;
line-height: 1.45;
}
.omni-plan-points i,
.omni-plan-points .omni-plan-point-body,
.omni-plan-summary i,
.omni-plan-summary .omni-plan-point-body {
display: block;
font-style: normal;
font-weight: 400;
color: #525965;
}
.omni-strategy-grid .omni-strategy-value {
white-space: pre-wrap;
word-break: break-word;
}
.omni-plan-timeline {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 7px;
}
.omni-plan-timeline span {
position: relative;
min-height: 78px;
padding: 11px 10px;
border: 1px solid rgba(34, 42, 54, .08);
border-radius: 10px;
color: #5b626d;
background: #fff;
font-size: 13px;
line-height: 1.65;
}
.omni-plan-timeline b {
display: block;
margin-bottom: 5px;
color: var(--klein);
font-size: 13px;
line-height: 1.45;
}
.omni-plan-summary {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 13px 17px;
color: #444b56;
background: #f6f8fb;
font-size: 13px;
line-height: 1.65;
}
.omni-plan-summary b {
color: var(--klein);
}
/* 「最终输入」是方案交给出片模型前的最后一层信息,不能和辅助说明一样小。 */
.omni-plan-summary .omni-plan-final-input {
margin-left: auto;
color: var(--accent-black);
font-size: 13px;
font-weight: 500;
}
.omni-plan-summary .omni-plan-final-input b {
font-size: 14px;
font-weight: 600;
}
.omni-plan-summary .omni-plan-final-input .omni-plan-point-body {
display: inline;
margin-left: 2px;
color: var(--black-alpha-64);
font-size: 13px;
font-weight: 400;
}
.omni-prompt-file-card {
display: grid;
grid-template-columns: 42px minmax(0, 1fr) auto;
align-items: center;
gap: 12px;
padding: 14px 16px;
border-top: 3px solid var(--klein);
}
.omni-prompt-file-icon {
width: 42px;
height: 42px;
display: grid;
place-items: center;
border-radius: 11px;
color: var(--klein);
background: #edf5ff;
}
.omni-prompt-file-icon svg {
width: 19px;
height: 19px;
}
.omni-prompt-file-copy strong,
.omni-prompt-file-copy small {
display: block;
}
.omni-prompt-file-copy strong {
font-size: 13px;
}
.omni-prompt-file-copy small {
margin-top: 4px;
color: #858b94;
font-size: 11px;
}
.omni-prompt-file-card button {
height: 34px;
padding: 0 12px;
border: 1px solid rgba(34, 42, 54, .10);
border-radius: 9px;
color: #333944;
background: #fff;
font-size: 12px;
font-weight: 650;
cursor: pointer;
}
.omni-session-choice {
display: flex;
flex-wrap: wrap;
gap: 8px;
padding: 0 0 12px 44px;
}
.omni-session-choice:empty {
display: none;
}
.omni-session-choice button {
height: 34px;
padding: 0 13px;
border: 1px solid rgba(0, 47, 167, .20);
border-radius: 9px;
color: var(--klein);
background: #fff;
font-size: 12px;
font-weight: 650;
cursor: pointer;
}
.omni-session-choice button:hover,
.omni-session-choice button.primary {
color: #fff;
background: var(--klein);
}
.omni-session-composer {
position: sticky;
bottom: 0;
z-index: 3;
padding: 13px;
border: 1px solid rgba(34, 42, 54, .11);
border-radius: 16px;
background: rgba(255, 255, 255, .96);
box-shadow: 0 15px 34px rgba(20, 27, 38, .10);
backdrop-filter: blur(14px);
transition: border-color .18s ease, box-shadow .18s ease;
}
/* 「我想改」后点亮输入区,outline:0 的 textarea 本身看不出焦点 */
.omni-session-composer.is-revise-hint {
border-color: rgba(0, 47, 167, .42);
box-shadow: 0 15px 34px rgba(20, 27, 38, .10), 0 0 0 3px rgba(0, 47, 167, .14);
}
#omniSessionPrompt {
width: 100%;
min-height: 52px;
max-height: 130px;
padding: 3px 3px 8px;
resize: vertical;
border: 0;
outline: 0;
color: var(--text);
background: transparent;
font-size: 13px;
line-height: 1.6;
}
.omni-session-composer-tools {
justify-content: space-between;
gap: 12px;
}
.omni-session-composer-options {
flex-wrap: wrap;
}
.omni-session-upload-wrap {
position: relative;
}
.omni-session-parameter {
width: 104px;
flex: 0 0 auto;
}
.omni-session-parameter-model {
width: 146px;
}
.omni-session-parameter-preset {
width: 156px;
}
.omni-session-preset-control {
position: relative;
width: 156px;
flex: 0 0 auto;
}
.omni-session-preset-control:has(.omni-session-preset-panel:not([hidden])) {
z-index: 210;
}
.omni-session-preset-trigger {
width: 100%;
height: 34px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
padding: 0 10px;
border: 1px solid rgba(34, 42, 54, .11);
border-radius: 10px;
color: #373d46;
background: #f8f9fa;
font-size: 12px;
font-weight: 650;
cursor: pointer;
}
.omni-session-preset-trigger:hover,
.omni-session-preset-trigger[aria-expanded="true"] {
border-color: rgba(0, 47, 167, .36);
color: var(--klein);
background: #fff;
}
.omni-session-preset-trigger span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.omni-session-preset-trigger svg {
width: 13px;
height: 13px;
flex: 0 0 auto;
}
.omni-session-preset-panel {
position: absolute;
bottom: calc(100% + 10px);
left: 50%;
width: min(760px, calc(100vw - var(--sidebar-width) - 56px));
overflow: hidden;
border: 1px solid rgba(34, 42, 54, .10);
border-radius: 17px;
background: #fff;
box-shadow: 0 24px 60px rgba(20, 27, 38, .18);
transform: translateX(-52%);
}
.omni-session-preset-panel[hidden] {
display: none;
}
.omni-session-preset-search {
display: flex;
align-items: center;
gap: 9px;
padding: 13px 16px;
border-bottom: 1px solid rgba(34, 42, 54, .08);
}
.omni-session-preset-search svg {
width: 16px;
height: 16px;
color: #7e858f;
}
.omni-session-preset-search input {
min-width: 0;
flex: 1;
border: 0;
outline: 0;
color: #272d36;
background: transparent;
font-size: 13px;
}
.omni-session-preset-search span {
color: #7d838c;
font-size: 12px;
}
.omni-session-preset-body {
height: 350px;
display: grid;
grid-template-columns: 142px 238px minmax(0, 1fr);
}
.omni-session-preset-categories,
.omni-session-preset-list {
min-height: 0;
overflow-y: auto;
padding: 12px;
scrollbar-width: thin;
}
.omni-session-preset-categories {
border-right: 1px solid rgba(34, 42, 54, .08);
background: #fbfbfc;
}
.omni-session-preset-categories button,
.omni-session-preset-list button {
width: 100%;
border-radius: 9px;
color: #606773;
background: transparent;
text-align: left;
cursor: pointer;
}
.omni-session-preset-categories button {
min-height: 36px;
padding: 0 10px;
font-size: 12px;
}
.omni-session-preset-categories button.active {
color: #fff;
background: var(--black);
font-weight: 650;
}
.omni-session-preset-list {
border-right: 1px solid rgba(34, 42, 54, .08);
}
.omni-session-preset-list button {
min-height: 58px;
display: grid;
align-content: center;
gap: 4px;
padding: 9px 11px;
}
.omni-session-preset-list button:hover,
.omni-session-preset-list button.active {
color: #1f2530;
background: #f2f4f7;
}
.omni-session-preset-list button.active {
box-shadow: inset 3px 0 0 var(--klein);
}
.omni-session-preset-list strong {
font-size: 13px;
}
.omni-session-preset-list small {
overflow: hidden;
color: #949aa3;
font-size: 11px;
text-overflow: ellipsis;
white-space: nowrap;
}
.omni-session-preset-preview {
min-width: 0;
display: flex;
flex-direction: column;
padding: 13px;
background: #fafbfc;
}
.omni-session-preset-preview img {
width: 100%;
aspect-ratio: 16 / 9;
display: block;
border-radius: 12px;
object-fit: cover;
background: #e9edf3;
}
.omni-session-preset-preview h3 {
margin: 12px 0 5px;
font-size: 15px;
}
.omni-session-preset-preview p {
display: -webkit-box;
overflow: hidden;
margin: 0;
color: #737a85;
font-size: 12px;
line-height: 1.55;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
}
.omni-session-preset-preview small {
margin-top: 8px;
color: #8d939c;
font-size: 11px;
}
.omni-session-preset-preview button {
height: 34px;
margin-top: auto;
border-radius: 9px;
color: #fff;
background: var(--klein);
font-size: 12px;
font-weight: 650;
cursor: pointer;
}
.omni-session-parameter .custom-select-trigger {
height: 34px;
padding: 0 9px;
font-size: 12px;
}
.omni-session-parameter .custom-select-menu {
top: auto;
bottom: calc(100% + 8px);
min-width: 132px;
max-height: 300px;
overflow-y: auto;
transform: translateY(5px);
}
.omni-session-parameter .custom-select-shell.open .custom-select-menu {
transform: translateY(0);
}
.omni-session-mention-wrap {
position: relative;
}
.omni-session-mention-menu {
position: absolute;
bottom: calc(100% + 10px);
left: 0;
z-index: 20;
width: 340px;
height: 236px;
display: flex;
padding: 6px;
overflow: hidden;
border: 1px solid rgba(34, 42, 54, .10);
border-radius: 12px;
background: #fff;
box-shadow: 0 16px 36px rgba(20, 27, 38, .15);
}
.omni-session-mention-menu[hidden] {
display: none;
}
.omni-at-cats {
width: 88px;
flex: 0 0 88px;
display: flex;
flex-direction: column;
gap: 2px;
padding: 2px 4px 2px 2px;
border-right: 1px solid rgba(34, 42, 54, .08);
}
.omni-at-cats button {
width: 100%;
height: 32px;
display: flex;
align-items: center;
gap: 6px;
padding: 0 8px;
border: 0;
border-radius: 8px;
background: transparent;
color: #5b616a;
font-size: 13px;
text-align: left;
cursor: pointer;
}
.omni-at-cats button svg {
width: 14px;
height: 14px;
flex: 0 0 auto;
color: #8b919a;
}
.omni-at-cats button:hover,
.omni-at-cats button.is-on {
background: #f3f4f6;
color: #1f2430;
}
.omni-at-cats button.is-on svg {
color: var(--klein);
}
.omni-at-list {
flex: 1;
min-width: 0;
height: 100%;
overflow-y: auto;
padding: 2px 2px 2px 6px;
}
.omni-at-list > strong {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
color: #8b919a;
font-size: 13px;
font-weight: 500;
text-align: center;
}
.omni-at-loading {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
height: 100%;
color: #8b919a;
font-size: 13px;
}
.omni-at-loading .omni-send-spinner {
border-color: rgba(0, 47, 167, .18);
border-top-color: var(--klein);
}
.omni-at-list button {
width: 100%;
display: flex;
align-items: center;
gap: 8px;
padding: 8px;
border: 0;
border-radius: 8px;
color: #303641;
background: transparent;
font-size: 13px;
text-align: left;
cursor: pointer;
}
.omni-at-list button:hover {
color: var(--klein);
background: #edf5ff;
}
.omni-at-list button svg {
width: 14px;
height: 14px;
flex: 0 0 auto;
color: var(--klein);
}
.omni-at-list button span {
min-width: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.omni-at-list button small {
color: #8b919a;
font-size: 12px;
}
.omni-session-send {
width: 36px;
height: 36px;
display: grid;
place-items: center;
border-radius: 10px;
color: #fff;
background: var(--klein);
cursor: pointer;
transition: background .15s ease, color .15s ease, box-shadow .15s ease;
}
.omni-session-send svg {
width: 16px;
height: 16px;
}
/* 整理方案中:发送钮变成终止(方块),中性深色贴合 omni 工具条 */
.omni-session-send.is-stop {
background: #2a2f38;
color: #fff;
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .08);
}
.omni-session-send.is-stop:hover:not(:disabled) {
background: #3a404a;
}
.omni-session-send.is-stop svg {
width: 12px;
height: 12px;
}
.omni-process-card {
padding: 0;
}
.omni-process-frame {
width: 100%;
height: 100%;
aspect-ratio: 9 / 16;
min-height: 200px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
background: linear-gradient(90deg, #eef1f5 0%, #f7f8fa 45%, #eef1f5 100%);
background-size: 220% 100%;
animation: omniShimmer 1.2s ease infinite;
}
.is-ratio-16-9 .omni-process-frame {
aspect-ratio: 16 / 9;
}
.is-ratio-1-1 .omni-process-frame {
aspect-ratio: 1 / 1;
}
.omni-process-frame strong {
color: #5c6570;
font-size: 14px;
font-weight: 500;
}
.omni-process-ring {
width: 28px;
height: 28px;
flex: 0 0 auto;
border: 3px solid rgba(0, 47, 167, .16);
border-top-color: var(--klein);
border-radius: 50%;
animation: omniSpin .8s linear infinite;
}
@keyframes omniSpin {
to { transform: rotate(360deg); }
}
.omni-result-card {
overflow: hidden;
}
.omni-result-media {
display: grid;
grid-template-columns: 1fr;
gap: 8px;
padding: 10px;
}
.omni-result-media.is-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
padding: 10px;
}
.omni-result-tile {
position: relative;
margin: 0;
overflow: hidden;
border-radius: var(--r-md, 12px);
background: #edf0f4;
box-shadow: 0 8px 20px rgba(20, 27, 38, .08);
aspect-ratio: 9 / 16;
width: 100%;
}
.is-ratio-16-9 .omni-result-tile {
aspect-ratio: 16 / 9;
}
.is-ratio-1-1 .omni-result-tile {
aspect-ratio: 1 / 1;
}
.omni-result-preview {
display: block;
width: 100%;
height: 100%;
padding: 0;
border: 0;
background: transparent;
cursor: zoom-in;
}
.omni-result-tile img {
width: 100%;
height: 100%;
aspect-ratio: inherit;
display: block;
object-fit: cover;
background: #edf0f4;
}
.omni-result-media.is-grid .omni-result-tile img {
height: 100%;
}
.omni-result-media.is-grid .omni-process-frame {
height: 100%;
}
.omni-result-play {
position: absolute;
inset: 0;
display: grid;
place-items: center;
color: #fff;
background: linear-gradient(180deg, transparent, rgba(16, 16, 18, .28));
pointer-events: none;
}
.omni-result-play svg {
width: 28px;
height: 28px;
filter: drop-shadow(0 4px 10px rgba(0, 0, 0, .35));
}
.omni-result-dl {
position: absolute;
right: 10px;
bottom: 10px;
z-index: 1;
width: 32px;
height: 32px;
display: grid;
place-items: center;
border-radius: 8px;
color: #fff;
background: rgba(16, 16, 18, .72);
opacity: 0;
pointer-events: none;
transition: opacity .16s ease;
}
.omni-result-tile:hover .omni-result-dl,
.omni-result-dl:focus-visible {
opacity: 1;
pointer-events: auto;
}
.omni-result-dl svg {
width: 14px;
height: 14px;
}
@media (hover: none) {
.omni-result-dl {
opacity: 1;
pointer-events: auto;
}
}
.omni-result-info {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 13px 15px;
}
.omni-result-info strong,
.omni-result-info small {
display: block;
}
.omni-result-info strong {
font-size: 13px;
}
.omni-result-info small {
margin-top: 3px;
color: #858b94;
font-size: 11px;
}
.omni-result-info button {
height: 33px;
display: inline-flex;
align-items: center;
gap: 6px;
padding: 0 12px;
border-radius: 9px;
color: #fff;
background: var(--black);
font-size: 12px;
cursor: pointer;
}
.omni-result-info button svg {
width: 13px;
height: 13px;
}
/* 对话页专用的输入区工具条:与首页 .omni-start-tools 同规则(设计稿原始 1370813716)。
.omni-icon-tool / .omni-parameter 等共享类留在 omni-create-page.css,这里不重复定义。 */
.omni-session-composer-tools,
.omni-session-composer-tools > div {
display: flex;
align-items: center;
gap: 6px;
min-width: 0;
}
/* 响应式(设计稿原始 1574115764) */
@media (max-width: 720px) {
.omni-session-shell {
width: calc(100% - 24px);
}
.omni-session-header {
grid-template-columns: 96px minmax(0, 1fr) 36px;
}
.omni-strategy-card,
.omni-video-plan-card,
.omni-prompt-file-card,
.omni-result-card,
.omni-process-card,
.omni-elicit-slot,
.omni-step-confirm-card {
width: 100%;
margin-left: 0;
}
.omni-strategy-grid,
.omni-plan-points,
.omni-plan-timeline,
.omni-direction-list {
grid-template-columns: 1fr;
}
.omni-direction-card {
width: 100%;
margin-left: 0;
}
.omni-direction-custom {
flex-direction: column;
}
.omni-direction-custom button {
width: 100%;
}
.omni-plan-summary {
align-items: flex-start;
flex-direction: column;
}
.omni-prompt-file-card {
grid-template-columns: 42px minmax(0, 1fr);
}
.omni-prompt-file-card button {
grid-column: 1 / -1;
}
}
/* ── 追问卡(.omni-elicit-card)· 设计稿没有这张卡,后端 ask_user 工具的落点。
外壳复用上面的 .omni-strategy-card 组;这里只补内部控件,不新造色值。
控件四型:single 单选 / multi 多选 / text 填空 / asset 选素材(缩略图网格)。 */
.omni-elicit-body {
display: flex;
flex-direction: column;
gap: 16px;
padding: 14px 18px 16px;
}
/* 卖点确认在策略和脚本之前出现:输入真实卖点,或把筛选权交给系统。 */
.omni-selling-point-card {
box-sizing: border-box;
width: min(760px, calc(100% - 44px));
margin: 0 0 24px 44px;
overflow: hidden;
border-radius: var(--r-md);
background: var(--surface);
box-shadow: inset 0 0 0 1px var(--border-faint);
}
.omni-selling-point-card > header {
display: flex;
align-items: center;
min-height: 58px;
padding: 12px 16px;
box-shadow: inset 0 -1px 0 var(--border-faint);
}
.omni-selling-point-card header > div {
display: flex;
flex-direction: column;
gap: 3px;
}
.omni-selling-point-card header strong {
color: var(--accent-black);
font-size: 14px;
font-weight: 600;
}
.omni-selling-point-card header span,
.omni-selling-point-selected {
color: var(--black-alpha-56);
font-size: 12px;
}
.omni-selling-point-card form {
display: flex;
flex-direction: column;
gap: 10px;
padding: 14px 16px 16px;
}
.omni-selling-point-card .input {
width: 100%;
}
.omni-selling-point-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
}
.omni-selling-point-selected {
padding: 14px 16px 16px;
}
/* 剧情反转预设的方向选择:三个完整方向直接平铺,避免只留一句「我准备了三个方向」。 */
.omni-direction-card {
box-sizing: border-box;
width: 100%;
margin: 0;
overflow: hidden;
border-radius: 8px;
background: var(--surface);
box-shadow: inset 0 0 0 1px var(--border-faint);
}
.omni-direction-head {
display: flex;
align-items: center;
min-height: 62px;
padding: 12px 16px;
box-shadow: inset 0 -1px 0 var(--border-faint);
}
.omni-direction-head > div {
display: flex;
flex-direction: column;
gap: 3px;
}
.omni-direction-head strong {
color: var(--accent-black);
font-size: 14px;
font-weight: 600;
}
.omni-direction-head span {
color: var(--black-alpha-56);
font-size: 12px;
}
.omni-direction-list {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
padding: 14px 16px;
}
.omni-direction-list > button {
min-width: 0;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 7px;
padding: 12px;
border: 0;
border-radius: 8px;
background: var(--background-base);
box-shadow: inset 0 0 0 1px var(--border-faint);
color: var(--accent-black);
text-align: left;
cursor: pointer;
transition: background 200ms ease, box-shadow 200ms ease, transform 100ms ease;
}
.omni-direction-list > button:hover:not(:disabled) {
background: var(--background-lighter);
box-shadow: inset 0 0 0 1px var(--black-alpha-24);
transform: translateY(-1px);
}
.omni-direction-list > button:focus-visible {
outline: none;
box-shadow: inset 0 0 0 1px var(--heat), 0 0 0 2px var(--heat-40);
}
.omni-direction-list > button.is-selected {
background: var(--heat-12);
box-shadow: inset 0 0 0 1px var(--heat-40);
}
.omni-direction-list > button:disabled {
cursor: default;
}
.omni-direction-index,
.omni-direction-list small {
color: var(--black-alpha-56);
font-size: 11px;
line-height: 1.4;
}
.omni-direction-list > button > strong {
font-size: 13px;
font-weight: 600;
line-height: 1.4;
}
.omni-direction-list p {
margin: 0;
color: var(--black-alpha-64);
font-size: 12px;
line-height: 1.55;
}
.omni-direction-list p b {
display: block;
margin-bottom: 2px;
color: var(--accent-black);
font-size: 11px;
font-weight: 600;
}
.omni-direction-custom {
display: flex;
gap: 8px;
padding: 0 16px 16px;
}
.omni-direction-custom .input {
min-width: 0;
flex: 1;
}
.omni-direction-custom button {
height: 36px;
flex: 0 0 auto;
padding: 0 14px;
border: 0;
border-radius: 8px;
background: var(--accent-black);
color: var(--surface);
font-size: 12px;
font-weight: 500;
cursor: pointer;
}
.omni-direction-custom button:disabled {
background: var(--black-alpha-12);
color: var(--black-alpha-48);
cursor: not-allowed;
}
.omni-direction-confirm {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 8px;
padding: 0 16px 16px;
}
.omni-direction-confirm > span {
margin-right: auto;
color: var(--black-alpha-56);
font-size: 12px;
}
.omni-elicit-field > label {
display: block;
margin-bottom: 9px;
color: var(--black);
font-size: 13px;
font-weight: 600;
}
.omni-elicit-options {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.omni-elicit-options button {
padding: 7px 13px;
border: 1px solid rgba(34, 42, 54, .10);
border-radius: 8px;
background: #fff;
color: #575d66;
font-size: 13px;
cursor: pointer;
transition: border-color .15s ease, color .15s ease, background .15s ease;
}
.omni-elicit-options button:hover {
border-color: rgba(34, 42, 54, .20);
color: var(--black);
}
.omni-elicit-options button.active {
border-color: var(--klein);
color: var(--klein);
background: #edf5ff;
}
.omni-elicit-field input[type="text"] {
width: 100%;
padding: 9px 12px;
border: 1px solid rgba(34, 42, 54, .10);
border-radius: 8px;
background: #fff;
color: var(--black);
font-size: 13px;
font-family: inherit;
}
.omni-elicit-field input[type="text"]:focus {
border-color: var(--klein);
outline: none;
}
.omni-elicit-assets {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(88px, 1fr));
gap: 8px;
}
.omni-elicit-assets button {
display: flex;
flex-direction: column;
gap: 6px;
padding: 6px;
border: 1px solid rgba(34, 42, 54, .10);
border-radius: 8px;
background: #fff;
cursor: pointer;
text-align: left;
}
.omni-elicit-assets button.active {
border-color: var(--klein);
background: #edf5ff;
}
.omni-elicit-assets img {
width: 100%;
aspect-ratio: 1 / 1;
border-radius: 6px;
object-fit: cover;
background: #f6f8fb;
}
.omni-elicit-assets span {
overflow: hidden;
color: #575d66;
font-size: 12px;
text-overflow: ellipsis;
white-space: nowrap;
}
.omni-elicit-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
padding: 12px 18px 16px;
}
.omni-elicit-actions button {
padding: 8px 16px;
border: 0;
border-radius: 8px;
background: var(--klein);
color: #fff;
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 160ms ease;
}
.omni-elicit-actions button.cancel-btn {
background: var(--surface, #fff);
color: var(--text-secondary, #606a78);
border: 1px solid var(--border-faint, #e2e8f0);
}
.omni-elicit-actions button.cancel-btn:hover:not(:disabled) {
background: var(--background-hover, #f8fafc);
color: var(--accent-black, #1a202c);
border-color: var(--border-subtle, #cbd5e1);
}
.omni-elicit-actions button:disabled {
background: rgba(34, 42, 54, .18);
color: rgba(255, 255, 255, .7);
cursor: not-allowed;
}
.omni-elicit-actions button.cancel-btn:disabled {
background: var(--surface, #fff);
color: var(--text-tertiary, #94a3b8);
border-color: var(--border-faint, #e2e8f0);
opacity: 0.6;
}
/* 已提交的追问卡变成只读回顾,不能再改 —— 重复提交后端会 409 */
.omni-elicit-card.is-submitted .omni-elicit-options button,
.omni-elicit-card.is-submitted .omni-elicit-assets button {
cursor: default;
pointer-events: none;
}
/* ── 步骤确认(.omni-step-confirm-card)· 策略/方案/Prompt 闸门
与 .omni-strategy-card 同宽同左缩进,避免策略卡下方出现一条瘦操作条 */
.omni-step-confirm-card {
box-sizing: border-box;
width: min(760px, calc(100% - 44px));
display: flex;
flex-direction: column;
align-items: stretch;
gap: 12px;
margin: 0 0 24px 44px;
padding: 14px 16px;
border: 1px solid rgba(34, 42, 54, 0.09);
border-radius: 16px;
background: #fff;
box-shadow: 0 12px 30px rgba(20, 27, 38, .065);
/* 不走入场 opacity 动画:poll 重渲染时避免「闪一下」 */
animation: none;
}
.omni-step-confirm-card.is-submitted {
opacity: 0.72;
}
.omni-step-confirm-card.is-revising {
border-color: rgba(0, 47, 167, .22);
box-shadow: 0 12px 30px rgba(20, 27, 38, .065), 0 0 0 3px rgba(0, 47, 167, .08);
}
.omni-step-confirm-top {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.omni-step-confirm-copy {
display: flex;
flex-direction: column;
gap: 4px;
min-width: 0;
flex: 1 1 180px;
}
.omni-step-confirm-copy strong {
color: #222a36;
font-size: 14px;
font-weight: 600;
}
.omni-step-confirm-copy span {
color: #575d66;
font-size: 12px;
line-height: 1.4;
}
.omni-step-confirm-actions {
display: flex;
flex-shrink: 0;
gap: 8px;
justify-content: flex-end;
}
.omni-step-confirm-actions button {
padding: 8px 16px;
border: 0;
border-radius: 8px;
background: var(--klein);
color: #fff;
font-size: 13px;
cursor: pointer;
}
.omni-step-confirm-actions button.is-secondary {
background: #fff;
border: 1px solid rgba(34, 42, 54, 0.14);
color: #222a36;
}
.omni-step-confirm-actions button:disabled {
opacity: 0.45;
cursor: not-allowed;
}
/* 「我想改」卡片内反馈区:与卡片同宽,主路径不再依赖底部 composer */
.omni-step-confirm-revise {
display: flex;
flex-direction: column;
gap: 10px;
width: 100%;
}
.omni-step-confirm-revise-input {
box-sizing: border-box;
width: 100%;
min-height: 76px;
padding: 10px 12px;
border: 1px solid rgba(34, 42, 54, 0.14);
border-radius: 10px;
background: #f7f8fa;
color: #222a36;
font-family: inherit;
font-size: 13px;
line-height: 1.55;
resize: vertical;
outline: 0;
transition: border-color .15s ease, box-shadow .15s ease, background .15s ease;
}
.omni-step-confirm-revise-input::placeholder {
color: #8b919a;
}
.omni-step-confirm-revise-input:focus {
border-color: rgba(0, 47, 167, .42);
background: #fff;
box-shadow: 0 0 0 3px rgba(0, 47, 167, .14);
}
.omni-step-confirm-revise-input:disabled {
opacity: 0.6;
cursor: not-allowed;
}
/* ── 确认闸门(.omni-confirm-card)· 设计稿里是方案卡下面那条操作行,这里独立成卡。
积分数字挂在按钮里 —— 用户按下去之前就该知道要花多少。 */
.omni-confirm-card {
position: relative;
/* 不要压过 sticky composer(z-index:3);下拉菜单自身另有更高 z-index */
z-index: 1;
/* 和其余助手卡片一样预留左侧头像对齐位。
资源面板打开时会话栏会收窄,不能再用 100% 后额外叠加 44px 左边距。 */
box-sizing: border-box;
width: min(760px, calc(100% - 44px));
display: flex;
flex-direction: column;
align-items: stretch;
gap: 12px;
margin: 0 0 24px 44px;
padding: 14px 16px;
border: 1px solid rgba(34, 42, 54, .10);
border-radius: 14px;
background: #fff;
/* 时长/参数下拉要冒出卡片,不能被裁 */
overflow: visible;
}
.omni-confirm-copy {
display: flex;
flex-direction: column;
gap: 4px;
}
.omni-confirm-copy strong {
color: #22262e;
font-size: 13px;
font-weight: 600;
}
.omni-confirm-copy span,
.omni-confirm-foot > span {
color: #6f747c;
font-size: 12px;
}
.omni-confirm-params {
position: relative;
z-index: 6;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
overflow: visible;
}
.omni-confirm-params .omni-duration-control {
position: relative;
z-index: 80;
}
.omni-confirm-params .omni-duration-control:has(.omni-duration-menu:not([hidden])) {
z-index: 120;
}
/* 确认卡贴着输入框:时长菜单向上展开,避免「超出」压到 composer */
.omni-confirm-params .omni-duration-menu {
top: auto;
bottom: calc(100% + 8px);
right: 0;
left: auto;
width: min(330px, calc(100vw - 48px));
max-height: min(360px, calc(100vh - 120px));
overflow-y: auto;
}
.omni-confirm-params .omni-parameter:has(.custom-select-shell.open) {
z-index: 40;
}
.omni-confirm-params .omni-parameter .custom-select-menu {
/* 贴底时也优先向上翻,避免被 sticky composer 挡住 */
top: auto;
bottom: calc(100% + 6px);
}
.omni-confirm-hint {
margin: 0;
padding: 8px 10px;
border-radius: 8px;
background: #fff7ed;
color: #9a3412;
font-size: 12px;
line-height: 1.45;
}
.omni-confirm-foot {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
}
/* 只染脚上的确认按钮。参数条里的 CustomSelect / 时长触发器不能吃到克莱因蓝。 */
.omni-confirm-foot > button {
display: flex;
align-items: center;
gap: 8px;
padding: 9px 18px;
border: 0;
border-radius: 8px;
background: var(--klein);
color: #fff;
font-size: 13px;
cursor: pointer;
}
.omni-confirm-foot > button:disabled {
background: rgba(34, 42, 54, .18);
cursor: not-allowed;
}
.omni-confirm-foot > button i {
color: rgba(255, 255, 255, .72);
font-size: 12px;
font-style: normal;
}
@media (max-width: 720px) {
.omni-confirm-card {
align-items: flex-start;
flex-direction: column;
margin-left: 0;
}
}
/* 流式中的临时气泡:不参与入场动画。逐字重渲染 + 220ms 动画 = 一直在闪。 */
.omni-chat-row.is-live {
animation: none;
}
.omni-mention-chips {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.omni-mention-chip {
position: relative;
display: inline-flex;
align-items: center;
gap: 6px;
max-width: 220px;
padding: 3px 8px 3px 4px;
border-radius: var(--r-pill);
font-size: 12px;
line-height: 1.2;
}
.omni-mention-chip.has-thumb {
max-width: none;
padding: 0;
border-radius: var(--r-md);
background: transparent;
border: 0;
overflow: visible;
}
.omni-mention-thumb {
display: block;
width: 52px;
height: 52px;
padding: 0;
border: 0;
border-radius: var(--r-md);
overflow: hidden;
background: var(--background-lighter);
box-shadow: inset 0 0 0 1px var(--border-faint);
cursor: zoom-in;
}
.omni-mention-thumb img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.omni-mention-chip i {
flex: 0 0 auto;
padding: 2px 6px;
border-radius: var(--r-pill);
font-style: normal;
font-size: 11px;
font-weight: 600;
}
.omni-mention-chip b {
overflow: hidden;
font-weight: 500;
text-overflow: ellipsis;
white-space: nowrap;
}
.omni-mention-chip .omni-mention-remove {
width: 16px;
height: 16px;
display: grid;
place-items: center;
margin-left: 2px;
padding: 0;
border: 0;
border-radius: var(--r-pill);
background: transparent;
cursor: pointer;
}
.omni-mention-chip.has-thumb .omni-mention-remove {
position: absolute;
top: -6px;
right: -6px;
width: 18px;
height: 18px;
color: var(--surface);
background: var(--black-alpha-72);
}
.omni-mention-chip .omni-mention-remove svg {
width: 11px;
height: 11px;
}
.omni-mention-chips.is-user .omni-mention-chip:not(.has-thumb) {
color: var(--surface);
background: var(--black-alpha-12);
}
.omni-mention-chips.is-user .omni-mention-chip i {
color: var(--heat);
background: var(--heat-12);
}
.omni-chat-stack .omni-mention-chips.is-user {
justify-content: flex-end;
margin: 0 0 8px;
}
.omni-mention-chips.is-user .omni-mention-chip.has-thumb .omni-mention-thumb {
border-color: var(--border-faint);
}
.omni-mention-chips.is-composer {
margin: 0 2px 6px;
}
.omni-mention-chips.is-composer .omni-mention-chip:not(.has-thumb) {
color: var(--accent-black);
background: var(--heat-12);
box-shadow: inset 0 0 0 1px var(--heat-20);
}
.omni-mention-chips.is-composer .omni-mention-chip i {
color: var(--surface);
background: var(--heat);
}
.omni-mention-chips.is-composer .omni-mention-chip:not(.has-thumb) .omni-mention-remove {
color: var(--black-alpha-56);
}
.omni-mention-chips.is-composer .omni-mention-thumb {
width: 28px;
height: 28px;
border-radius: var(--r-md);
cursor: zoom-in;
}
.omni-mention-chips.is-composer .omni-mention-chip.has-thumb .omni-mention-remove {
top: -5px;
right: -5px;
width: 15px;
height: 15px;
opacity: 0;
transition: opacity var(--t-base);
}
.omni-mention-chips.is-composer .omni-mention-chip.has-thumb:hover .omni-mention-remove,
.omni-mention-chips.is-composer .omni-mention-chip.has-thumb:focus-within .omni-mention-remove {
opacity: 1;
}
.omni-mention-hover-preview {
position: absolute;
bottom: calc(100% + 10px);
left: 0;
z-index: 40;
width: 244px;
display: grid;
gap: 10px;
padding: 12px;
border-radius: var(--r-md);
color: var(--accent-black);
background: var(--surface-raised);
box-shadow: var(--shadow-floating);
opacity: 0;
pointer-events: none;
text-align: left;
transform: translateY(4px);
transition: opacity var(--t-base), transform var(--t-base);
}
.omni-mention-chip.has-thumb:hover .omni-mention-hover-preview,
.omni-mention-chip.has-thumb:focus-within .omni-mention-hover-preview {
opacity: 1;
transform: translateY(0);
}
.omni-mention-chips.is-user .omni-mention-hover-preview {
right: 0;
left: auto;
}
.omni-mention-hover-head {
min-width: 0;
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
}
.omni-mention-hover-head strong {
overflow: hidden;
font-size: 13px;
font-weight: 500;
text-overflow: ellipsis;
white-space: nowrap;
}
.omni-mention-hover-head small {
flex: 0 0 auto;
color: var(--black-alpha-48);
font-family: var(--font-mono);
font-size: 10.5px;
}
.omni-mention-hover-media {
width: 100%;
aspect-ratio: 1;
display: block;
overflow: hidden;
border-radius: var(--r-md);
background: var(--background-lighter);
}
.omni-mention-hover-media img {
width: 100%;
height: 100%;
display: block;
object-fit: contain;
}
.omni-chat-stack {
position: relative;
display: flex;
flex-direction: column;
align-items: stretch;
max-width: min(670px, 82%);
}
/* 用户短消息(如「嗯」)勿被下方 time+操作条撑宽;气泡贴合文案,长文仍受 max-width 约束 */
.omni-chat-row.is-user .omni-chat-stack {
align-items: flex-end;
width: fit-content;
}
.omni-chat-stack .omni-chat-bubble {
max-width: 100%;
}
.omni-chat-row.is-user .omni-chat-stack .omni-chat-bubble {
width: fit-content;
max-width: 100%;
}
.omni-user-message-actions {
display: flex;
align-items: center;
justify-content: flex-end;
min-height: 24px;
margin-top: 2px;
color: var(--black-alpha-48);
visibility: hidden;
opacity: 0;
pointer-events: none;
transition: opacity .15s ease, visibility 0s linear .15s;
}
.omni-chat-row.is-user:hover .omni-user-message-actions,
.omni-chat-row.is-user:focus-within .omni-user-message-actions {
visibility: visible;
opacity: 1;
pointer-events: auto;
transition-delay: 0s;
}
.omni-user-message-actions time {
margin-right: 8px;
font-family: var(--font-mono);
font-size: 11px;
line-height: 1;
}
.omni-user-message-actions button {
display: grid;
width: 24px;
height: 24px;
padding: 0;
place-items: center;
border: 0;
border-radius: var(--r-md);
color: inherit;
background: transparent;
cursor: pointer;
}
.omni-user-message-actions button:hover:not(:disabled) {
color: var(--accent-black);
background: var(--black-alpha-4);
}
.omni-user-message-actions button:disabled {
cursor: not-allowed;
opacity: .45;
}
.omni-user-message-actions svg {
width: 14px;
height: 14px;
}
/* 发送中:不要文案;左侧柔和呼吸高亮,气泡本身不变形 */
.omni-chat-row.is-user .omni-chat-stack.is-pending {
padding-left: 6px;
}
.omni-chat-row.is-user .omni-chat-stack.is-pending::before {
content: "";
position: absolute;
left: 0;
top: 4px;
bottom: 4px;
width: 3px;
border-radius: 2px;
background: #5b6572;
animation: omniSendPulse 1.35s ease-in-out infinite;
pointer-events: none;
}
.omni-chat-row.is-user .omni-chat-stack.is-pending .omni-chat-bubble {
background: color-mix(in srgb, var(--surface) 84%, transparent);
border-color: var(--black-alpha-16);
}
.omni-send-spinner {
width: 10px;
height: 10px;
border-radius: 50%;
}
.omni-chat-bubble.is-thinking {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: center;
gap: 8px 10px;
color: #5c6570;
}
.omni-chat-bubble.is-reasoning {
display: flex;
flex-direction: column;
align-items: stretch;
gap: 8px;
color: #5c6570;
}
.omni-think-head {
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 13px;
color: #5c6570;
}
.omni-think-text {
margin: 0;
font-size: 12px;
line-height: 1.65;
color: #8a93a0;
white-space: pre-wrap;
word-break: break-word;
max-height: 168px;
overflow-y: auto;
border-left: 1px solid rgba(15, 23, 42, 0.08);
padding-left: 10px;
}
.omni-typing {
display: inline-flex;
align-items: center;
gap: 4px;
}
.omni-typing i {
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--klein);
opacity: .35;
animation: omniTyping 1.1s ease-in-out infinite;
}
.omni-typing i:nth-child(2) { animation-delay: .15s; }
.omni-typing i:nth-child(3) { animation-delay: .3s; }
@keyframes omniTyping {
0%, 80%, 100% { opacity: .28; transform: translateY(0); }
40% { opacity: 1; transform: translateY(-2px); }
}
@keyframes omniSendPulse {
0%, 100% {
background: #5b6572;
opacity: .45;
}
50% {
background: #8b95a3;
opacity: 1;
}
}
.omni-process-skeleton {
height: 168px;
border-radius: var(--r-md, 12px);
background: linear-gradient(90deg, #eef1f5 0%, #f7f8fa 45%, #eef1f5 100%);
background-size: 220% 100%;
animation: omniShimmer 1.2s ease infinite;
}
@keyframes omniShimmer {
0% { background-position: 100% 0; }
100% { background-position: -100% 0; }
}
.omni-session-send:disabled {
opacity: .55;
cursor: not-allowed;
}
.omni-session-mention-menu img {
width: 28px;
height: 28px;
border-radius: 7px;
object-fit: cover;
background: #eef1f5;
}
.omni-prompt-drawer-bg {
position: fixed;
inset: 0;
/* Prompt 是当前查看的内容,必须盖过右侧「资源」工作区。 */
z-index: calc(var(--z-overlay) + 10);
border: 0;
background: rgba(16, 18, 24, .28);
cursor: pointer;
}
.omni-prompt-drawer {
position: fixed;
top: 12px;
right: 12px;
bottom: 12px;
z-index: calc(var(--z-overlay) + 15);
width: min(560px, calc(100vw - 24px));
display: flex;
flex-direction: column;
overflow: hidden;
border: 1px solid rgba(34, 42, 54, .08);
border-radius: 18px;
background: #f4f6f9;
box-shadow: -8px 12px 40px rgba(20, 27, 38, .16);
}
.omni-prompt-drawer header {
display: grid;
grid-template-columns: 36px minmax(0, 1fr) 32px;
align-items: center;
gap: 10px;
padding: 14px 14px 12px;
border-bottom: 1px solid rgba(34, 42, 54, .08);
background: #fff;
}
.omni-prompt-drawer-file {
width: 36px;
height: 36px;
display: grid;
place-items: center;
border-radius: 10px;
color: var(--klein);
background: #edf5ff;
}
.omni-prompt-drawer-file svg {
width: 16px;
height: 16px;
}
.omni-prompt-drawer header div {
min-width: 0;
}
.omni-prompt-drawer header strong,
.omni-prompt-drawer header small {
display: block;
}
.omni-prompt-drawer header strong {
overflow: hidden;
font-size: 15px;
text-overflow: ellipsis;
white-space: nowrap;
}
.omni-prompt-drawer header small {
margin-top: 2px;
color: #8b919a;
font-size: 12px;
}
.omni-prompt-drawer header button {
width: 32px;
height: 32px;
display: grid;
place-items: center;
border: 0;
border-radius: 8px;
background: transparent;
color: #5c6570;
cursor: pointer;
}
.omni-prompt-drawer header button:hover {
background: #f3f4f6;
}
.omni-prompt-drawer header button svg {
width: 16px;
height: 16px;
}
.omni-prompt-doc {
flex: 1;
overflow: auto;
display: flex;
flex-direction: column;
gap: 10px;
padding: 14px;
}
.omni-prompt-block {
padding: 14px 15px;
border: 1px solid rgba(34, 42, 54, .06);
border-radius: 14px;
background: #fff;
box-shadow: 0 6px 16px rgba(20, 27, 38, .04);
}
.omni-prompt-block h3 {
margin: 0 0 8px;
color: var(--klein);
font-size: 13px;
font-weight: 650;
}
.omni-prompt-block p {
margin: 0;
color: #2b3240;
font-size: 14px;
line-height: 1.7;
white-space: pre-wrap;
word-break: break-word;
}
.omni-prompt-block.is-shot {
border-color: rgba(0, 47, 167, .10);
background: linear-gradient(180deg, #fbfcff 0%, #fff 48%);
}
.omni-prompt-meta,
.omni-prompt-shot-fields {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
margin: 0;
}
.omni-prompt-meta div,
.omni-prompt-shot-fields div {
min-width: 0;
padding: 10px 12px;
border-radius: 10px;
background: #f6f8fb;
}
.omni-prompt-shot-fields {
grid-template-columns: 1fr;
margin-bottom: 10px;
}
.omni-prompt-meta dt,
.omni-prompt-shot-fields dt {
margin: 0;
color: #858b94;
font-size: 11px;
font-weight: 650;
}
.omni-prompt-meta dd,
.omni-prompt-shot-fields dd {
margin: 4px 0 0;
color: #272d37;
font-size: 13px;
line-height: 1.55;
word-break: break-word;
}
.omni-prompt-block.is-table {
padding: 10px;
}
.omni-prompt-table-wrap {
width: 100%;
overflow-x: auto;
border-radius: 12px;
border: 1px solid rgba(34, 42, 54, .08);
background: #fff;
}
.omni-prompt-table {
width: 100%;
min-width: 420px;
border-collapse: collapse;
table-layout: fixed;
}
.omni-prompt-table th,
.omni-prompt-table td {
padding: 10px 12px;
border-bottom: 1px solid rgba(34, 42, 54, .07);
color: #2b3240;
font-size: 12px;
line-height: 1.55;
text-align: left;
vertical-align: top;
word-break: break-word;
}
.omni-prompt-table th {
position: sticky;
top: 0;
color: #5c6570;
background: #f6f8fb;
font-size: 11px;
font-weight: 700;
}
.omni-prompt-table th:first-child,
.omni-prompt-table td:first-child {
width: 72px;
color: var(--klein);
font-weight: 650;
white-space: nowrap;
}
.omni-prompt-table tbody tr:last-child td {
border-bottom: 0;
}
.omni-prompt-table tbody tr:hover td {
background: #fafbff;
}
/* 闸门气泡所在行不入场闪:5 闸门按钮需在 awaiting_user 期间保持实心可见 */
.omni-chat-row.agent:has(.omni-gate-actions),
.omni-chat-row.agent:has(.omni-gate-answered) {
animation: none;
}
.omni-gate-bubble {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 12px;
max-width: min(520px, calc(100% - 44px));
}
.omni-gate-actions {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.omni-gate-actions button {
min-height: 30px;
padding: 0 10px;
border: 1px solid var(--border-faint);
border-radius: var(--r-md);
background: var(--surface);
color: var(--accent-black);
font-size: 12px;
font-weight: 500;
cursor: pointer;
}
.omni-gate-actions button.primary {
border-color: var(--heat-20);
background: var(--heat-12);
color: var(--heat);
}
.omni-gate-actions button:disabled {
opacity: .55;
cursor: not-allowed;
}
.omni-person-generate-panel {
display: grid;
width: 100%;
gap: 8px;
margin-top: 4px;
padding: 12px;
border-radius: var(--r-md);
background: var(--background-lighter);
box-shadow: inset 0 0 0 1px var(--border-faint);
}
.omni-person-generate-panel label {
color: var(--accent-black);
font-size: 12px;
font-weight: 600;
}
.omni-person-generate-panel .textarea {
width: 100%;
min-height: 88px;
resize: vertical;
}
.omni-person-generate-panel > div {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.omni-person-generate-panel > div > span {
flex: 1 1 auto;
color: var(--black-alpha-48);
font-size: 11px;
line-height: 1.6;
}
.omni-person-generate-panel > div > button {
flex: 0 0 auto;
}
/* 单选追问直接点选即提交;长方向文案纵向铺开,避免挤成难扫读的小胶囊。 */
.omni-chat-choice-actions {
width: 100%;
flex-direction: column;
align-items: stretch;
gap: 8px;
}
.omni-chat-choice-actions button {
width: 100%;
min-height: 40px;
padding: 9px 12px;
text-align: left;
line-height: 1.55;
transition: background-color 160ms ease, border-color 160ms ease, color 160ms ease;
}
.omni-chat-choice-actions button:hover:not(:disabled) {
border-color: var(--heat-40);
color: var(--heat);
background: var(--heat-12);
}
.omni-gate-answered {
margin: 0;
font-size: 12px;
color: #8a93a0;
}
.omni-session-upload-wrap.is-uploading {
display: inline-flex;
align-items: center;
gap: 8px;
}
.omni-upload-status {
font-size: 12px;
color: #5c6570;
white-space: nowrap;
}
/* ── 对话资源:固定入口 + 右侧工作区 ── */
.omni-assets-entry {
position: fixed;
top: 50%;
right: 28px;
z-index: 40;
display: inline-flex;
align-items: center;
gap: 7px;
height: 36px;
padding: 0 14px 0 12px;
border: 1px solid var(--border-faint);
border-radius: var(--r-md);
background: var(--surface);
color: var(--black-alpha-56);
font-size: 12px;
font-weight: 500;
cursor: pointer;
transform: translateY(-50%);
transition: background var(--t-base), border-color var(--t-base), color var(--t-base), opacity var(--t-base);
}
.omni-assets-entry svg {
width: 15px;
height: 15px;
flex: 0 0 auto;
}
.omni-assets-entry:hover {
border-color: var(--border-loud);
background: var(--black-alpha-4);
color: var(--accent-black);
}
.omni-assets-entry.is-open {
opacity: 0;
pointer-events: none;
}
.omni-assets-drawer {
top: var(--topbar-height);
right: 0;
bottom: 0;
width: min(440px, 36vw);
max-width: none;
border-left: 1px solid var(--border-faint);
background: var(--surface);
box-shadow: none;
animation: none;
}
.omni-assets-drawer-head {
min-height: 64px;
gap: 20px;
padding: 14px 20px;
}
.omni-assets-drawer-head > div:first-child {
min-width: 0;
}
.omni-assets-drawer-head strong,
.omni-assets-drawer-head small {
display: block;
}
.omni-assets-drawer-head strong {
color: var(--accent-black);
font-size: 16px;
font-weight: 600;
}
.omni-assets-drawer-head small {
margin-top: 2px;
color: var(--black-alpha-48);
font-size: 11px;
}
.omni-assets-panel-tools {
display: flex;
align-items: center;
gap: 8px;
margin-left: auto;
}
.omni-assets-panel-tools .view-toggle {
flex: 0 0 auto;
}
.omni-assets-panel-tools .view-toggle button {
width: 28px;
height: 26px;
}
.omni-assets-panel-tools .view-toggle svg {
width: 14px;
height: 14px;
}
.omni-assets-search {
display: flex;
align-items: center;
width: 132px;
height: 32px;
gap: 6px;
padding: 0 9px;
border: 1px solid var(--border-faint);
border-radius: var(--r-md);
color: var(--black-alpha-48);
background: var(--background-lighter);
}
.omni-assets-search:focus-within {
border-color: var(--black-alpha-24);
background: var(--surface);
}
.omni-assets-search svg {
width: 14px;
height: 14px;
flex: 0 0 auto;
}
.omni-assets-search input {
width: 100%;
min-width: 0;
padding: 0;
border: 0;
outline: 0;
color: var(--accent-black);
background: transparent;
font: inherit;
font-size: 12px;
}
.omni-assets-search input::placeholder {
color: var(--black-alpha-40);
}
.omni-assets-drawer-head .x {
flex: 0 0 auto;
}
.omni-assets-drawer-body {
padding: 24px 20px 32px;
background: var(--surface);
}
.omni-assets-empty {
min-height: 220px;
display: grid;
place-content: center;
justify-items: center;
gap: 10px;
color: var(--black-alpha-48);
text-align: center;
}
.omni-assets-empty svg {
width: 24px;
height: 24px;
}
.omni-assets-empty p {
margin: 0;
font-size: 13px;
}
.omni-assets-group + .omni-assets-group {
margin-top: 28px;
}
.omni-assets-group h3 {
display: flex;
align-items: center;
gap: 8px;
margin: 0 0 12px;
color: var(--accent-black);
font-size: 13px;
font-weight: 600;
}
.omni-assets-group h3 em {
color: var(--black-alpha-48);
font-family: var(--font-mono);
font-size: 11px;
font-style: normal;
font-weight: 400;
}
.omni-assets-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
}
.omni-assets-grid.is-list {
grid-template-columns: 1fr;
}
.omni-assets-card {
display: flex;
flex-direction: column;
gap: 8px;
padding: 0;
border: 1px solid var(--border-faint);
border-radius: var(--r-md);
background: var(--surface);
color: var(--accent-black);
text-align: left;
cursor: pointer;
overflow: hidden;
transition: background var(--t-base), border-color var(--t-base);
}
.omni-assets-card:hover:not(:disabled) {
border-color: var(--border-loud);
background: var(--background-lighter);
}
.omni-assets-card:disabled {
cursor: default;
opacity: .72;
}
.omni-assets-card.is-doc,
.omni-assets-grid.is-list .omni-assets-card {
flex-direction: row;
align-items: center;
gap: 10px;
padding: 10px;
}
.omni-assets-thumb {
position: relative;
display: block;
width: 100%;
aspect-ratio: 1;
background: var(--background-lighter);
overflow: hidden;
}
.omni-assets-grid.is-list .omni-assets-thumb {
width: 52px;
height: 52px;
flex: 0 0 auto;
aspect-ratio: auto;
border-radius: 6px;
}
.omni-assets-thumb.is-doc,
.omni-assets-card.is-doc .omni-assets-thumb {
width: 40px;
height: 40px;
flex: 0 0 auto;
aspect-ratio: auto;
display: grid;
place-items: center;
border-radius: 6px;
color: var(--heat);
background: var(--heat-12);
}
.omni-assets-thumb img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.omni-assets-thumb > i {
position: absolute;
inset: 0;
display: grid;
place-items: center;
color: var(--black-alpha-48);
}
.omni-assets-thumb > i svg,
.omni-assets-thumb.is-doc svg {
width: 18px;
height: 18px;
}
.omni-assets-play {
position: absolute;
inset: 0;
display: grid;
place-items: center;
background: rgba(0, 0, 0, .24);
color: var(--surface);
}
.omni-assets-play svg {
width: 20px;
height: 20px;
fill: currentColor;
}
.omni-assets-meta {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
padding: 0 10px 10px;
}
.omni-assets-card.is-doc .omni-assets-meta,
.omni-assets-grid.is-list .omni-assets-meta {
padding: 0;
}
.omni-assets-meta strong,
.omni-assets-meta small {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.omni-assets-meta strong {
color: var(--accent-black);
font-size: 12px;
font-weight: 500;
}
.omni-assets-meta small {
color: var(--black-alpha-48);
font-family: var(--font-mono);
font-size: 11px;
}
.omni-model-picker-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
}
.omni-model-picker-card {
display: flex;
min-width: 0;
flex-direction: column;
gap: 8px;
padding: 8px;
border: 0;
border-radius: var(--r-md);
background: var(--surface);
color: var(--accent-black);
box-shadow: inset 0 0 0 1px var(--border-faint);
text-align: left;
cursor: pointer;
transition: background var(--t-base), box-shadow var(--t-base);
}
.omni-model-picker-card:hover,
.omni-model-picker-card.is-selected {
background: var(--background-lighter);
box-shadow: inset 0 0 0 1px var(--heat-40);
}
.omni-model-picker-card.is-selected {
color: var(--heat);
}
.omni-model-picker-media {
display: grid;
width: 100%;
aspect-ratio: 3 / 4;
place-items: center;
overflow: hidden;
border-radius: 6px;
background: var(--background-base);
color: var(--black-alpha-48);
}
.omni-model-picker-media img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
.omni-model-picker-media svg {
width: 24px;
height: 24px;
}
.omni-model-picker-copy {
display: block;
min-width: 0;
padding: 0 2px 2px;
}
.omni-model-picker-copy strong,
.omni-model-picker-copy small {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.omni-model-picker-copy strong {
font-size: 13px;
font-weight: 600;
}
.omni-model-picker-copy small {
margin-top: 2px;
color: var(--black-alpha-48);
font-family: var(--font-mono);
font-size: 10px;
}
.omni-model-picker-footer {
display: flex;
align-items: center;
gap: 8px;
padding: 12px 20px;
}
.omni-model-picker-selection {
min-width: 0;
flex: 1 1 auto;
overflow: hidden;
color: var(--black-alpha-48);
font-family: var(--font-mono);
font-size: 11px;
text-overflow: ellipsis;
white-space: nowrap;
}
@media (min-width: 1101px) {
.omni-session-page.has-assets-panel {
box-sizing: border-box;
padding-right: min(440px, 36vw);
}
.omni-session-page.has-assets-panel .omni-session-shell {
width: min(760px, calc(100% - 42px));
}
}
@media (max-width: 1100px) {
.omni-assets-drawer {
width: min(400px, calc(100vw - 16px));
}
}
@media (max-width: 720px) {
.omni-assets-entry {
right: 12px;
width: 36px;
padding: 0;
justify-content: center;
}
.omni-assets-entry span {
display: none;
}
.omni-assets-drawer {
width: calc(100vw - 8px);
}
.omni-assets-drawer-head {
align-items: flex-start;
flex-wrap: wrap;
gap: 12px;
}
.omni-assets-panel-tools {
width: 100%;
margin-left: 0;
}
.omni-assets-search {
flex: 1 1 auto;
}
.omni-assets-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.omni-person-generate-panel > div {
align-items: stretch;
flex-direction: column;
}
.omni-person-generate-panel > div > button {
width: 100%;
}
}