vibe-proxy/frontend/src/features/config/components/FloatingSaveBar.module.scss
2026-08-24 00:10:41 +02:00

177 lines
3.5 KiB
SCSS
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.

@use '../../../styles/mixins' as *;
/* 悬浮保存栏:底部居中的玻璃工具栏(--content-center-x 对齐内容列中心) */
.container {
position: fixed;
bottom: calc(12px + env(safe-area-inset-bottom, 0px));
left: var(--content-center-x, 50%);
transform: translateX(-50%);
width: min(720px, calc(100vw - 24px));
z-index: $z-dropdown;
pointer-events: none;
}
.bar {
pointer-events: auto;
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 8px 16px;
padding: 10px 14px;
border-radius: 16px;
--glass-blur: 14px;
border: 1px solid var(--glass-border);
background: var(--glass-bg);
backdrop-filter: var(--glass-backdrop-filter);
box-shadow: var(--shadow-lg);
}
/* 状态文案mono 遥测 */
.status {
font-family: $font-mono;
font-size: 12px;
font-weight: 650;
font-variant-numeric: tabular-nums;
padding-right: 4px;
min-width: 0;
overflow-wrap: anywhere;
}
.statusWarning {
color: var(--amber-text);
}
.statusError {
color: var(--viz-failure);
}
.statusBusy,
.statusMuted {
color: var(--text-secondary);
}
.statusOk {
color: var(--viz-success);
}
.actionsGroup {
display: flex;
align-items: center;
gap: 6px;
flex-shrink: 0;
}
/* 保存:墨色药丸主按钮 */
.savePill {
display: inline-flex;
align-items: center;
gap: 7px;
border: 0;
cursor: pointer;
background: var(--text-primary);
color: var(--bg-secondary);
border-radius: $radius-full;
padding: 9px 16px;
font-size: 13px;
font-weight: 600;
line-height: 1;
transition:
transform var(--dur-press, 160ms) var(--ease-out-strong, ease-out),
background-color var(--dur-hover, 200ms) var(--ease-out-strong, ease-out),
box-shadow var(--dur-hover, 200ms) var(--ease-out-strong, ease-out);
&:disabled {
cursor: not-allowed;
opacity: 0.55;
}
&:active:not(:disabled) {
transform: translateY(0) scale(0.97);
}
&:focus-visible {
outline: 2px solid var(--primary-color);
outline-offset: 2px;
}
}
@media (hover: hover) and (pointer: fine) {
.savePill:hover:not(:disabled) {
transform: translateY(-1px);
background: color-mix(in srgb, var(--text-primary) 86%, var(--bg-secondary));
box-shadow: 0 12px 26px color-mix(in srgb, var(--text-primary) 22%, transparent);
}
}
/* 放弃更改:安静的文字链接 */
.ghostAction {
display: inline-flex;
align-items: center;
gap: 6px;
border: 0;
cursor: pointer;
background: none;
color: var(--text-secondary);
border-radius: $radius-full;
padding: 9px 12px;
font-size: 12.5px;
font-weight: 550;
line-height: 1;
transition:
color var(--dur-hover, 200ms) var(--ease-out-strong, ease-out),
transform var(--dur-press, 160ms) var(--ease-out-strong, ease-out);
&:disabled {
cursor: not-allowed;
opacity: 0.55;
}
&:active:not(:disabled) {
transform: scale(0.97);
}
&:focus-visible {
outline: 2px solid var(--primary-color);
outline-offset: 2px;
}
}
@media (hover: hover) and (pointer: fine) {
.ghostAction:hover:not(:disabled) {
color: var(--text-primary);
}
}
@include mobile {
.container {
width: calc(100vw - 16px);
}
.bar {
flex-direction: column;
align-items: stretch;
}
.actionsGroup {
justify-content: stretch;
> * {
flex: 1;
justify-content: center;
}
}
}
@media (prefers-reduced-motion: reduce) {
.savePill,
.ghostAction {
transition: none;
}
.savePill:active:not(:disabled),
.ghostAction:active:not(:disabled) {
transform: none;
}
}