492 lines
14 KiB
CSS
492 lines
14 KiB
CSS
/**
|
|
* 提示词小助手 (PromptAssistant) 样式表
|
|
* 包含所有组件样式和动画定义
|
|
*/
|
|
|
|
/* ======== 提示词小助手样式 ======== */
|
|
|
|
/* 提示词小助手容器 */
|
|
.prompt-assistant-container {
|
|
position: absolute;
|
|
pointer-events: all;
|
|
display: none;
|
|
align-items: center;
|
|
justify-content: flex-end;
|
|
/* 始终右对齐 */
|
|
padding: 2px;
|
|
background-color: color-mix(in srgb, var(--bg-color), transparent 20%);
|
|
border: 1px solid color-mix(in srgb, var(--p-panel-border-color), transparent 60%);
|
|
border-radius: 6px;
|
|
z-index: 9999;
|
|
opacity: 0.95;
|
|
backdrop-filter: blur(4px);
|
|
transform-origin: bottom right;
|
|
user-select: none;
|
|
will-change: width, opacity, background-color, border-color, backdrop-filter, box-shadow, right, left;
|
|
width: auto;
|
|
height: 26px !important;
|
|
max-width: fit-content;
|
|
box-sizing: border-box !important;
|
|
overflow: hidden;
|
|
/* 防止内容溢出 */
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
|
|
}
|
|
|
|
/* 折叠状态的小助手容器 */
|
|
.prompt-assistant-container.collapsed {
|
|
width: 28px !important;
|
|
overflow: hidden;
|
|
justify-content: flex-end;
|
|
pointer-events: none !important;
|
|
/* 折叠时穿透鼠标事件 */
|
|
background-color: transparent !important;
|
|
border-color: transparent !important;
|
|
backdrop-filter: none !important;
|
|
box-shadow: none !important;
|
|
}
|
|
|
|
/* 折叠状态指示器图标 - 基础样式 */
|
|
.prompt-assistant-indicator {
|
|
position: absolute;
|
|
top: 50%;
|
|
right: 5px;
|
|
transform: translateY(-50%) scale(0);
|
|
width: 18px;
|
|
height: 18px;
|
|
opacity: 0;
|
|
z-index: 2;
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* 指示器图标显示动画 */
|
|
.prompt-assistant-container.collapsed .prompt-assistant-indicator {
|
|
opacity: var(--assistant-icon-opacity, 0.3);
|
|
transform: translateY(-50%) scale(0.8);
|
|
filter: drop-shadow(0 0 2px rgba(255, 255, 255, 0.6)) drop-shadow(0 0 4px rgba(100, 200, 255, 0.5));
|
|
transition: opacity 0.3s cubic-bezier(.49, 1.98, .67, .83) 0.25s,
|
|
transform 0.4s cubic-bezier(.78, 1.76, .68, .96) 0.25s;
|
|
}
|
|
|
|
/* 指示器图标创建时的动画 */
|
|
.prompt-assistant-container.collapsed .prompt-assistant-indicator.animate-creation {
|
|
animation: indicator-creation 0.4s cubic-bezier(.78, 1.76, .68, .96);
|
|
}
|
|
|
|
/* 指示器图标隐藏动画 */
|
|
.prompt-assistant-container:not(.collapsed) .prompt-assistant-indicator {
|
|
opacity: 0;
|
|
transform: translateY(-50%) scale(0);
|
|
transition: opacity 0s ease-in,
|
|
transform 0.3s ease-in;
|
|
}
|
|
|
|
/* 内部内容容器 - 使用common.css中定义的固定内容样式 */
|
|
.prompt-assistant-inner,
|
|
.image-assistant-inner {
|
|
/* 使用common.css中定义的固定内容样式 */
|
|
display: flex;
|
|
gap: 2px;
|
|
position: relative;
|
|
right: 0;
|
|
justify-content: flex-end;
|
|
width: auto;
|
|
flex-grow: 1;
|
|
transition: none;
|
|
}
|
|
|
|
/* 折叠状态下的内部容器 */
|
|
.prompt-assistant-container.collapsed .prompt-assistant-inner {
|
|
pointer-events: none !important;
|
|
}
|
|
|
|
/* 悬停区域 - 用于检测鼠标悬停 */
|
|
.prompt-assistant-hover-area {
|
|
position: absolute;
|
|
top: 2px;
|
|
right: 2px;
|
|
width: 80%;
|
|
height: 90%;
|
|
z-index: 1;
|
|
/* 降低z-index,确保在按钮下方 */
|
|
cursor: pointer;
|
|
pointer-events: auto;
|
|
/* 初始状态隐藏 */
|
|
display: none;
|
|
background-color: transparent;
|
|
}
|
|
|
|
/* 折叠状态下的悬停区域 */
|
|
.prompt-assistant-container.collapsed .prompt-assistant-hover-area {
|
|
display: block;
|
|
}
|
|
|
|
/* ======== 图像小助手样式 ======== */
|
|
|
|
/* 图像小助手容器 */
|
|
.image-assistant-container {
|
|
position: fixed;
|
|
pointer-events: all;
|
|
display: none;
|
|
align-items: center;
|
|
justify-content: flex-start;
|
|
/* 改为左对齐 */
|
|
padding: 2px;
|
|
background-color: color-mix(in srgb, var(--bg-color), transparent 20%);
|
|
border: 1px solid color-mix(in srgb, var(--p-panel-border-color), transparent 40%);
|
|
border-radius: 8px;
|
|
z-index: 9999;
|
|
opacity: 0.95;
|
|
backdrop-filter: blur(4px);
|
|
transform-origin: bottom left;
|
|
/* 改为左下角 */
|
|
user-select: none;
|
|
will-change: width, opacity, background-color, border-color, backdrop-filter, box-shadow;
|
|
width: auto;
|
|
height: 24px !important;
|
|
max-width: fit-content;
|
|
box-sizing: border-box !important;
|
|
overflow: hidden;
|
|
transform: scale(var(--assistant-scale, 1));
|
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
|
}
|
|
|
|
/* 折叠状态的图像小助手容器 */
|
|
.image-assistant-container.collapsed {
|
|
width: 28px !important;
|
|
overflow: hidden;
|
|
justify-content: flex-start;
|
|
/* 改为左对齐 */
|
|
background-color: transparent;
|
|
border-color: transparent;
|
|
backdrop-filter: blur(0px);
|
|
box-shadow: none;
|
|
}
|
|
|
|
/* 折叠状态指示器图标 - 基础样式 */
|
|
.image-assistant-indicator {
|
|
position: absolute;
|
|
top: 50%;
|
|
left: 5px;
|
|
/* 改为左侧 */
|
|
transform: translateY(-50%) scale(0);
|
|
width: 18px;
|
|
height: 18px;
|
|
opacity: 0;
|
|
z-index: 2;
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* 指示器图标显示动画 */
|
|
.image-assistant-container.collapsed .image-assistant-indicator {
|
|
opacity: var(--assistant-icon-opacity, 0.3);
|
|
transform: translateY(-50%) scale(0.8);
|
|
filter: drop-shadow(0 0 2px rgba(255, 255, 255, 0.6)) drop-shadow(0 0 4px rgba(100, 200, 255, 0.5));
|
|
transition: opacity 0.3s cubic-bezier(.49, 1.98, .67, .83) 0.25s,
|
|
transform 0.4s cubic-bezier(.78, 1.76, .68, .96) 0.25s;
|
|
}
|
|
|
|
/* 指示器图标创建时的动画 */
|
|
.image-assistant-container.collapsed .image-assistant-indicator.animate-creation {
|
|
animation: indicator-creation 0.4s cubic-bezier(.78, 1.76, .68, .96);
|
|
}
|
|
|
|
/* 指示器创建动画 - 透明度过冲效果 */
|
|
@keyframes indicator-creation {
|
|
0% {
|
|
opacity: 0;
|
|
transform: translateY(-50%) scale(0);
|
|
filter: drop-shadow(0 0 0px rgba(255, 255, 255, 0)) drop-shadow(0 0 0px rgba(100, 200, 255, 0));
|
|
}
|
|
|
|
65% {
|
|
opacity: calc(var(--assistant-icon-opacity) + 0.1);
|
|
transform: translateY(-50%) scale(0.8);
|
|
filter: drop-shadow(0 0 2px rgba(255, 255, 255, 0.6)) drop-shadow(0 0 4px rgba(100, 200, 255, 0.5));
|
|
}
|
|
|
|
100% {
|
|
opacity: var(--assistant-icon-opacity);
|
|
transform: translateY(-50%) scale(0.8);
|
|
filter: drop-shadow(0 0 2px rgba(255, 255, 255, 0.6)) drop-shadow(0 0 4px rgba(100, 200, 255, 0.5));
|
|
}
|
|
}
|
|
|
|
/* 指示器图标隐藏动画 */
|
|
.image-assistant-container:not(.collapsed) .image-assistant-indicator {
|
|
opacity: 0;
|
|
transform: translateY(-50%) scale(0);
|
|
transition: opacity 0s ease-in,
|
|
transform 0.3s ease-in;
|
|
}
|
|
|
|
/* 悬停区域 - 用于检测鼠标悬停 */
|
|
.image-assistant-hover-area {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
/* 改为左侧 */
|
|
width: 28px;
|
|
height: 100%;
|
|
z-index: 1;
|
|
cursor: pointer;
|
|
pointer-events: auto;
|
|
display: none;
|
|
background-color: transparent;
|
|
}
|
|
|
|
/* 折叠状态下的悬停区域 */
|
|
.image-assistant-container.collapsed .image-assistant-hover-area {
|
|
display: block;
|
|
}
|
|
|
|
/* 折叠状态下按钮的透明度过渡 */
|
|
.image-assistant-container.collapsed .image-assistant-button {
|
|
transition: opacity 0.3s cubic-bezier(0.11, 0, 0.5, 0);
|
|
opacity: 0;
|
|
}
|
|
|
|
/* 折叠状态下隐藏分割线 */
|
|
.image-assistant-container.collapsed .image-assistant-divider {
|
|
opacity: 0 !important;
|
|
pointer-events: none !important;
|
|
transition: opacity 0.3s cubic-bezier(0.11, 0, 0.5, 0);
|
|
}
|
|
|
|
/* 图像小助手过渡效果 */
|
|
.image-assistant-transition {
|
|
transition: width 0.3s cubic-bezier(0.25, 1, 0.5, 1),
|
|
opacity 0.3s cubic-bezier(0.25, 1, 0.5, 1),
|
|
border-color 0.5s ease-out,
|
|
backdrop-filter 0.5s ease-out,
|
|
box-shadow 0.2s ease-out,
|
|
background-color 0.5s ease-out;
|
|
}
|
|
|
|
/* 图像小助手显示动画类 */
|
|
.image-assistant-show {
|
|
display: flex !important;
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
|
|
}
|
|
|
|
/* ======== 共用组件样式 ======== */
|
|
|
|
/* 自动翻译指示器 - 黄色图标样式 */
|
|
.prompt-assistant-container.auto-translate-enabled .prompt-assistant-indicator {
|
|
color: rgb(246, 252, 163);
|
|
filter: drop-shadow(0 0 2px rgba(247, 187, 6, 0.755)) drop-shadow(0 0 4px rgba(255, 255, 0, 0.7));
|
|
}
|
|
|
|
.prompt-assistant-container.auto-translate-enabled.collapsed .prompt-assistant-indicator {
|
|
opacity: var(--assistant-icon-opacity, 0.5);
|
|
}
|
|
|
|
/* 按钮分割线样式 */
|
|
.prompt-assistant-divider,
|
|
.image-assistant-divider {
|
|
width: 1px;
|
|
height: 10px;
|
|
background-color: var(--p-content-border-color);
|
|
margin: 0 2px;
|
|
align-self: center;
|
|
flex-shrink: 0;
|
|
transform: translateZ(0);
|
|
border-radius: 0.5px;
|
|
}
|
|
|
|
/* 过渡效果类 */
|
|
.prompt-assistant-transition {
|
|
transition: width 0.3s cubic-bezier(0.25, 1, 0.5, 1),
|
|
opacity 0.3s cubic-bezier(0.25, 1, 0.5, 1),
|
|
border-color 0.5s ease-out,
|
|
backdrop-filter 0.5s ease-out,
|
|
box-shadow 0.2s ease-out,
|
|
background-color 0.5s ease-out,
|
|
right 0.2s ease-out,
|
|
left 0.2s ease-out;
|
|
}
|
|
|
|
/* 显示动画类 - 直接显示,无创建动画 */
|
|
.assistant-show {
|
|
display: flex !important;
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
|
|
}
|
|
|
|
/* 状态提示的入场和退场动画类 */
|
|
.statustip-show {
|
|
animation: tipScaleIn 0.1s ease-out forwards !important;
|
|
}
|
|
|
|
.statustip-hide {
|
|
animation: tipFloatUp 0.4s ease-out forwards !important;
|
|
}
|
|
|
|
/* 按钮样式 */
|
|
.prompt-assistant-button,
|
|
.image-assistant-button {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 18px;
|
|
height: 18px;
|
|
cursor: pointer;
|
|
opacity: 0.8;
|
|
border: none;
|
|
padding: 0;
|
|
margin: 0 1px;
|
|
background-color: transparent;
|
|
transition: transform 0.15s, opacity 0.2s, background-color 0.2s;
|
|
flex-shrink: 0;
|
|
border-radius: 3px;
|
|
color: var(--p-dialog-color);
|
|
position: relative;
|
|
/* 确保按钮相对定位 */
|
|
}
|
|
|
|
/* 展开状态下恢复按钮的透明度 */
|
|
.prompt-assistant-container:not(.collapsed) .prompt-assistant-button {
|
|
opacity: 0.8;
|
|
}
|
|
|
|
/* 折叠状态下隐藏并禁用按钮 */
|
|
.prompt-assistant-container.collapsed .prompt-assistant-button,
|
|
.prompt-assistant-container.collapsed .prompt-assistant-button.button-active,
|
|
.prompt-assistant-container.collapsed .prompt-assistant-button.button-processing {
|
|
opacity: 0 !important;
|
|
pointer-events: none !important;
|
|
transition: opacity 0.4s ease-out, pointer-events 0s 0.4s;
|
|
}
|
|
|
|
/* 折叠状态下隐藏分割线 */
|
|
.prompt-assistant-container.collapsed .prompt-assistant-divider {
|
|
opacity: 0 !important;
|
|
pointer-events: none !important;
|
|
transition: opacity 0.4s ease-out;
|
|
}
|
|
|
|
/* SVG图标样式 */
|
|
.svg-icon {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 18px;
|
|
height: 18px;
|
|
position: relative;
|
|
z-index: 1;
|
|
}
|
|
|
|
.svg-icon svg {
|
|
width: 100%;
|
|
height: 100%;
|
|
fill: currentColor;
|
|
color: inherit;
|
|
transition: all 0.2s;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
/* 按钮内部图标样式 */
|
|
.prompt-assistant-button .svg-icon,
|
|
.image-assistant-button .svg-icon {
|
|
width: 18px;
|
|
height: 18px;
|
|
color: inherit;
|
|
transition: all 0.2s;
|
|
position: relative;
|
|
z-index: 1;
|
|
vertical-align: middle;
|
|
margin: 0;
|
|
}
|
|
|
|
/* 按钮交互效果 */
|
|
.prompt-assistant-button:hover,
|
|
.image-assistant-button:hover {
|
|
opacity: 1;
|
|
transform: scale(1.15);
|
|
background-color: rgba(255, 255, 255, 0.1);
|
|
box-shadow: 0 0 5px rgba(255, 255, 255, 0.2);
|
|
}
|
|
|
|
.prompt-assistant-button:active,
|
|
.image-assistant-button:active {
|
|
transform: scale(0.95);
|
|
}
|
|
|
|
/* 按钮状态类 */
|
|
.button-processing {
|
|
animation: buttonBreathing 1.5s infinite ease-in-out;
|
|
background-color: rgba(100, 100, 255, 0.15) !important;
|
|
position: relative;
|
|
z-index: 1;
|
|
opacity: 1 !important;
|
|
}
|
|
|
|
.button-active {
|
|
opacity: 1;
|
|
transform: scale(1.15);
|
|
background-color: rgba(255, 255, 255, 0.1);
|
|
box-shadow: 0 0 5px rgba(255, 255, 255, 0.2);
|
|
color: var(--p-listbox-option-selected-color);
|
|
}
|
|
|
|
.button-disabled {
|
|
opacity: 0.4 !important;
|
|
filter: grayscale(60%);
|
|
cursor: not-allowed !important;
|
|
pointer-events: none;
|
|
transform: none !important;
|
|
color: var(--p-text-muted-color);
|
|
}
|
|
|
|
.button-disabled:hover {
|
|
transform: none !important;
|
|
background-color: transparent !important;
|
|
box-shadow: none !important;
|
|
}
|
|
|
|
.button-disabled .svg-icon svg {
|
|
filter: brightness(0.9) grayscale(100%);
|
|
}
|
|
|
|
/* 状态提示样式 */
|
|
.statustip {
|
|
transform-origin: center bottom;
|
|
font-weight: bold;
|
|
letter-spacing: 0.5px;
|
|
position: absolute;
|
|
padding: 4px 8px;
|
|
border-radius: 8px;
|
|
font-size: 14px;
|
|
z-index: 10000;
|
|
text-align: center;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
pointer-events: none;
|
|
backdrop-filter: blur(8px);
|
|
white-space: nowrap;
|
|
will-change: transform, opacity;
|
|
}
|
|
|
|
/* 状态提示颜色 */
|
|
.statustip.success {
|
|
color: color-mix(in srgb, var(--p-inputtext-color), rgb(18, 255, 18) 40%) !important;
|
|
background-color: color-mix(in srgb, var(--p-content-background), rgb(4, 58, 4)30%);
|
|
}
|
|
|
|
.statustip.error {
|
|
color: color-mix(in srgb, var(--p-inputtext-color), rgb(255, 0, 0) 60%) !important;
|
|
background-color: color-mix(in srgb, var(--p-content-background), rgb(74, 12, 12)30%);
|
|
}
|
|
|
|
.statustip.loading {
|
|
color: color-mix(in srgb, var(--p-inputtext-color), rgb(249, 255, 69) 30%) !important;
|
|
background-color: color-mix(in srgb, var(--p-content-background), rgb(114, 117, 22)30%);
|
|
}
|
|
|
|
.statustip.info {
|
|
color: color-mix(in srgb, var(--p-inputtext-color), rgb(82, 70, 255) 60%) !important;
|
|
background-color: color-mix(in srgb, var(--p-content-background), rgb(55, 8, 113)30%);
|
|
}
|
|
|
|
.prompt_assistant_container .icon_button:hover {
|
|
background-color: color-mix(in srgb, var(--p-content-background), rgb(55, 8, 113)30%);
|
|
} |