perch-design / css /overlay.css
hongcoding's picture
feat: Warm Paper 设计系统开源(48 CSS + 令牌 + 实时预览)
f402bb3 verified
Raw History Blame Contribute Delete
6.7 kB
/* 划词浮层:Warm Paper 毛玻璃卡片(颜色一律走 theme.css 令牌)。
注意:透明原生窗口上 WebKit 的 backdrop-filter 会把元素整个画没(坑位实测记录 #1),
所以模糊交给 macOS 窗口特效,CSS 只保留 85% 暖纸半透明底色。 */
/* 透明窗口本体:桌面要从圆角外透出来 */
body.overlay-surface {
background: transparent;
}
.overlay-root {
height: 100%;
display: flex;
padding: 12px;
box-sizing: border-box;
}
/* ---------- 卡片容器 ---------- */
.overlay-card {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
overflow: hidden;
border: 1px solid var(--border);
border-radius: var(--radius-float);
background: var(--glass);
box-shadow: var(--shadow-float);
animation: overlay-in 180ms var(--ease);
}
@keyframes overlay-in {
from {
opacity: 0;
transform: translateY(6px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* ---------- 顶栏 ---------- */
.overlay-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 12px;
padding: 16px 20px 8px;
}
.overlay-title {
margin: 0;
font-family: var(--font-serif);
font-size: 20px;
font-weight: 600;
letter-spacing: -0.01em;
color: var(--text);
}
.overlay-esc {
font-size: 12px;
color: var(--text-tertiary);
white-space: nowrap;
}
/* ---------- 空态 / 提示 ---------- */
.overlay-note {
margin: 0;
padding: 12px 20px 20px;
font-size: 13.5px;
line-height: 1.6;
color: var(--text-secondary);
}
.overlay-note.is-warn {
color: var(--warning);
}
/* ---------- 选中文字预览 ---------- */
.overlay-quote {
margin: 4px 20px 0;
padding: 10px 14px;
max-height: 120px;
overflow-y: auto;
border-left: 2px solid var(--accent-soft);
border-radius: 0 var(--radius-control) var(--radius-control) 0;
background: var(--bg-sunken);
color: var(--text);
font-size: 13.5px;
line-height: 1.6;
user-select: text;
white-space: pre-wrap;
word-break: break-word;
}
/* ---------- 动作 chips ---------- */
.overlay-chips {
display: flex;
flex-wrap: wrap;
gap: 8px;
padding: 12px 20px 4px;
}
.overlay-chip {
height: 30px;
padding: 0 14px;
border: 1px solid var(--border);
border-radius: var(--radius-control);
background: transparent;
color: var(--text-secondary);
font-family: inherit;
font-size: 13px;
cursor: pointer;
transition:
background-color var(--dur) var(--ease),
border-color var(--dur) var(--ease);
}
.overlay-chip:hover:not(:disabled) {
background: var(--accent-soft);
border-color: var(--accent-soft);
color: var(--text);
}
.overlay-chip:disabled {
opacity: 0.5;
cursor: default;
}
/* ---------- 自定义输入 ---------- */
.overlay-custom {
display: flex;
align-items: center;
gap: 8px;
margin: 8px 20px 0;
padding: 6px 6px 6px 12px;
border: 1px solid transparent;
border-radius: var(--radius-control);
background: var(--bg-sunken);
transition: border-color var(--dur) var(--ease);
}
.overlay-custom:focus-within {
border-color: var(--accent);
}
.overlay-input {
flex: 1;
min-width: 0;
border: none;
background: transparent;
color: var(--text);
font-family: inherit;
font-size: 13.5px;
outline: none;
cursor: text;
}
.overlay-input::placeholder {
color: var(--text-tertiary);
}
.overlay-send {
flex-shrink: 0;
height: 28px;
padding: 0 12px;
border: none;
border-radius: var(--radius-chip);
background: var(--accent);
color: var(--bg);
font-family: inherit;
font-size: 13px;
cursor: pointer;
transition: opacity var(--dur) var(--ease);
}
.overlay-send:disabled {
opacity: 0.4;
cursor: default;
}
/* ---------- 回答区 ---------- */
.overlay-answer {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
margin-top: 12px;
padding: 12px 20px 16px;
border-top: 1px solid var(--border);
}
.overlay-answer-body {
flex: 1;
min-height: 0;
overflow-y: auto;
}
.overlay-answer-text {
margin: 0;
color: var(--text);
font-size: 13.5px;
line-height: 1.65;
white-space: pre-wrap;
word-break: break-word;
user-select: text;
}
/* 流式呼吸光标(1s 透明度呼吸;reduced-motion 时 theme.css 全局降级为静止) */
.overlay-cursor {
display: inline-block;
width: 2px;
height: 1.05em;
margin-left: 3px;
border-radius: 1px;
background: var(--accent);
vertical-align: text-bottom;
animation: overlay-cursor-breathe 1s ease-in-out infinite;
}
@keyframes overlay-cursor-breathe {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.15;
}
}
.overlay-error {
margin: 8px 0 0;
color: var(--danger);
font-size: 12.5px;
}
.overlay-answer-foot {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-top: 12px;
}
.overlay-copy {
display: inline-flex;
align-items: center;
gap: 6px;
height: 30px;
padding: 0 12px;
border: 1px solid var(--border);
border-radius: var(--radius-control);
background: transparent;
color: var(--text-secondary);
font-family: inherit;
font-size: 12.5px;
cursor: pointer;
transition: background-color var(--dur) var(--ease);
}
.overlay-copy:hover:not(:disabled) {
background: var(--bg-elevated);
color: var(--text);
}
.overlay-copy:disabled {
opacity: 0.5;
cursor: default;
}
.overlay-foot-hint {
font-size: 12px;
color: var(--text-tertiary);
}
/* ---------- 授权引导态 ---------- */
.overlay-guide {
flex: 1;
display: flex;
flex-direction: column;
padding: 24px 24px 20px;
}
.overlay-guide-head {
display: flex;
align-items: center;
gap: 10px;
color: var(--accent);
}
.overlay-guide .overlay-title {
font-size: 22px;
}
.overlay-lead {
margin: 12px 0 20px;
color: var(--text-secondary);
font-size: 14px;
line-height: 1.65;
}
.overlay-primary {
align-self: flex-start;
height: 40px;
padding: 0 20px;
border: none;
border-radius: var(--radius-control);
background: var(--accent);
color: var(--bg);
font-family: inherit;
font-size: 14px;
cursor: pointer;
}
.overlay-primary:hover {
filter: brightness(0.94);
}
.overlay-why-toggle {
align-self: flex-start;
margin-top: 18px;
padding: 0;
border: none;
background: transparent;
color: var(--text-secondary);
font-family: inherit;
font-size: 13px;
text-decoration: underline;
text-underline-offset: 3px;
cursor: pointer;
}
.overlay-why-body {
margin: 10px 0 0;
color: var(--text-tertiary);
font-size: 12.5px;
line-height: 1.7;
}
.overlay-guide-hint {
margin-top: auto;
padding-top: 20px;
color: var(--text-tertiary);
font-size: 12.5px;
line-height: 1.6;
}