Smail/frontend/src/views/PasswordRecovery/PasswordRecovery.css
smail 19d1338d8a
Some checks are pending
Security Checks / security (push) Waiting to run
修复忘记密码按账号类型弹出管理员附加验证
2026-09-14 20:30:53 +08:00

536 lines
9.8 KiB
CSS

/* 密码恢复容器 */
.password-recovery-container {
width: 100%;
max-width: 760px;
min-width: 0;
margin: auto;
padding: clamp(20px, 3vw, 36px);
box-sizing: border-box;
}
/* 管理员附加验证弹窗 */
.admin-recovery-description {
margin: 0 0 20px;
color: var(--pm-text-secondary, #64748b);
line-height: 1.6;
}
.admin-recovery-dialog :deep(.el-input__wrapper) {
min-height: 42px;
border-radius: 10px;
}
.admin-recovery-dialog :deep(.el-form-item__error) {
position: static;
line-height: 1.5;
}
.admin-recovery-actions {
display: flex;
justify-content: flex-end;
gap: 12px;
margin-top: 24px;
}
.admin-recovery-actions .el-button {
min-height: 40px;
margin-left: 0;
}
/* 步骤导航条 */
.recovery-steps-bar {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
margin-bottom: 24px;
padding: 12px 18px;
background: var(--pm-surface-muted, #f8fafc);
border-radius: 14px;
border: 1px solid var(--pm-border-color, #e2e8f0);
}
.step-item {
display: flex;
align-items: center;
gap: 8px;
color: var(--pm-text-secondary, #64748b);
transition: all 0.25s ease;
}
.step-number {
width: 26px;
height: 26px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 700;
background: #e2e8f0;
color: #64748b;
transition: all 0.25s ease;
}
.step-label {
font-size: 14px;
font-weight: 500;
}
.step-item.active {
color: var(--pm-primary-color, #2563eb);
}
.step-item.active .step-number {
background: var(--pm-primary-color, #2563eb);
color: #fff;
}
.step-item.current .step-label {
font-weight: 700;
}
.step-divider {
flex: 1;
max-width: 48px;
height: 2px;
background: #e2e8f0;
transition: all 0.25s ease;
}
.step-divider.active {
background: var(--pm-primary-color, #2563eb);
}
/* 步骤内容区域 */
.step-content {
animation: fadeIn 0.3s cubic-bezier(0.16, 1, 0.3, 1);
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
.step-two-intro {
margin-bottom: 20px;
padding: 16px 20px;
background: linear-gradient(135deg, rgba(239, 246, 255, 0.95), rgba(248, 251, 255, 0.9));
border: 1px solid rgba(37, 99, 235, 0.16);
border-radius: 14px;
}
.step-two-intro h2 {
margin: 0 0 6px;
font-size: 18px;
font-weight: 700;
color: var(--pm-text-primary, #0f172a);
}
.step-two-intro p {
margin: 0;
font-size: 13px;
color: var(--pm-text-secondary, #475569);
line-height: 1.5;
}
/* 表单主体 */
.recovery-form {
width: 100%;
min-width: 0;
box-sizing: border-box;
}
.recovery-form :deep(.el-form-item) {
min-width: 0;
margin-bottom: 12px;
}
.recovery-form :deep(.el-form-item__label) {
max-width: 100%;
padding-bottom: 4px;
color: var(--pm-text-primary);
font-size: 14px;
font-weight: 600;
line-height: 1.35;
letter-spacing: 0.01em;
white-space: normal;
overflow-wrap: anywhere;
}
.recovery-form :deep(.el-input__wrapper) {
min-height: 44px;
background-color: var(--pm-surface-muted);
border: 1px solid transparent;
border-radius: 12px;
box-shadow: 0 0 0 1px var(--pm-border-color) inset !important;
transition: all 0.2s;
}
.recovery-form :deep(.el-input__wrapper:hover),
.recovery-form :deep(.el-input__wrapper.is-focus) {
border-color: var(--pm-primary-color);
background-color: var(--pm-bg-secondary);
}
.reset-boundary {
margin-top: 18px;
}
/* 方式切换栏 */
.method-switcher {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
min-width: 0;
margin: 8px 0 18px;
padding: 16px 18px;
box-sizing: border-box;
background: linear-gradient(135deg, rgba(239, 246, 255, 0.98), rgba(248, 251, 255, 0.94));
border: 1px solid rgba(37, 99, 235, 0.16);
border-radius: 16px;
box-shadow: 0 8px 22px rgba(31, 41, 55, 0.06);
}
.method-copy {
position: relative;
min-width: 0;
display: flex;
flex-direction: column;
gap: 6px;
padding-left: 12px;
}
.method-copy::before {
position: absolute;
top: 2px;
bottom: 2px;
left: 0;
width: 4px;
border-radius: 999px;
background: var(--pm-primary-color);
content: '';
}
.method-label {
color: var(--pm-text-secondary);
font-size: 12px;
font-weight: 600;
line-height: 1.35;
letter-spacing: 0.04em;
}
.method-copy strong {
color: var(--pm-text-primary);
font-size: 17px;
font-weight: 700;
line-height: 1.35;
overflow-wrap: anywhere;
}
.switch-button {
flex: 0 0 auto;
max-width: 48%;
white-space: nowrap;
}
/* 面板 */
.verification-panel {
min-width: 0;
margin-bottom: 18px;
padding: 18px 20px 20px;
box-sizing: border-box;
background: linear-gradient(180deg, rgba(252, 253, 255, 0.98), rgba(245, 249, 255, 0.94));
border: 1px solid var(--pm-border-color);
border-radius: 16px;
box-shadow: 0 8px 22px rgba(31, 41, 55, 0.06);
}
.panel-header h2 {
display: flex;
align-items: center;
gap: 10px;
margin: 0 0 8px;
color: var(--pm-text-primary);
font-size: 18px;
font-weight: 700;
line-height: 1.35;
letter-spacing: -0.01em;
overflow-wrap: anywhere;
}
.panel-header h2::before {
width: 5px;
height: 20px;
flex: 0 0 auto;
border-radius: 999px;
background: var(--pm-primary-color);
content: '';
}
.panel-header p {
margin: 0 0 16px;
color: var(--pm-text-secondary);
font-size: 13px;
line-height: 1.6;
overflow-wrap: anywhere;
}
/* 核心紧凑排列组:用户名与外部邮箱相邻 */
.compact-field-group {
display: flex;
flex-direction: column;
gap: 4px;
margin-bottom: 4px;
}
.verification-code-row {
width: 100%;
min-width: 0;
display: grid;
grid-template-columns: minmax(0, 1fr) 140px;
gap: 10px;
}
.verification-code-row > * {
min-width: 0;
}
.code-btn {
width: 100%;
font-size: 13px !important;
}
.verification-state {
display: block;
min-width: 0;
margin: 4px 0 14px;
padding: 8px 12px;
background: rgba(37, 99, 235, 0.06);
border-radius: 8px;
color: var(--pm-primary-color);
font-size: 13px;
line-height: 1.45;
overflow-wrap: anywhere;
}
.offline-grid {
min-width: 0;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
}
.offline-grid :deep(.el-form-item) {
margin-bottom: 0;
}
/* 步骤二:垂直紧凑密码输入 */
.password-grid-vertical {
display: flex;
flex-direction: column;
gap: 6px;
}
.password-error-msg {
color: #ef4444;
font-size: 13px;
font-weight: 500;
margin-top: 4px;
margin-bottom: 8px;
}
/* 步骤三:成功界面居中展示 */
.step-success {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px 20px;
text-align: center;
}
.success-icon-wrap {
width: 80px;
height: 80px;
border-radius: 50%;
background: linear-gradient(135deg, #dcfce7, #bbf7d0);
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
box-shadow: 0 10px 25px rgba(34, 197, 94, 0.2);
}
.success-emoji {
font-size: 28px;
font-weight: 800;
color: #16a34a;
letter-spacing: -1px;
}
.success-title {
font-size: 22px;
font-weight: 700;
color: var(--pm-text-primary, #0f172a);
margin: 0 0 10px;
}
.success-description {
font-size: 14px;
color: var(--pm-text-secondary, #64748b);
margin: 0 0 28px;
}
.success-action {
width: 100%;
max-width: 240px;
}
.success-action :deep(.recovery-action-btn) {
width: 100%;
}
/* 底部操作区 */
.recovery-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
min-width: 0;
padding-top: 22px;
}
.actions {
min-width: 0;
display: flex;
gap: 12px;
justify-content: flex-end;
}
.actions .el-button,
.back-button {
max-width: 100%;
white-space: normal;
line-height: 1.35;
}
.back-button {
margin: 0;
font-weight: 600;
}
.recovery-form :deep(.recovery-action-btn),
.recovery-form :deep(.switch-button) {
min-height: 44px;
padding: 0 18px;
border-radius: 12px;
font-size: 14px;
font-weight: 600;
line-height: 1.35;
white-space: normal;
transition:
transform 0.2s var(--pm-ease-out),
border-color 0.2s var(--pm-ease-out),
background-color 0.2s var(--pm-ease-out),
box-shadow 0.2s var(--pm-ease-out);
}
.recovery-form :deep(.recovery-action-btn) {
box-shadow: 0 8px 20px rgba(37, 99, 235, 0.2);
}
.recovery-form :deep(.recovery-action-btn:hover) {
transform: translateY(-1px);
box-shadow: 0 12px 24px rgba(37, 99, 235, 0.26);
}
.recovery-form :deep(.secondary-action-btn) {
color: var(--pm-text-primary);
border-color: var(--pm-border-color);
background: rgba(240, 246, 255, 0.9);
box-shadow: 0 4px 14px rgba(31, 41, 55, 0.04);
}
.recovery-form :deep(.secondary-action-btn:hover),
.recovery-form :deep(.secondary-action-btn:focus-visible) {
color: var(--pm-primary-color);
border-color: rgba(37, 99, 235, 0.36);
background: rgba(37, 99, 235, 0.07);
transform: translateY(-1px);
}
@media (max-width: 760px) {
.password-recovery-container {
padding: 16px 14px 20px;
}
.reset-boundary {
margin-top: 12px;
}
}
@media (max-width: 560px) {
.recovery-steps-bar {
padding: 8px 10px;
gap: 6px;
}
.step-label {
font-size: 12px;
}
.step-divider {
max-width: 24px;
}
.method-switcher {
gap: 8px;
padding: 12px;
}
.switch-button {
max-width: 48%;
font-size: 12px;
}
.verification-panel {
padding: 14px 12px 16px;
}
.panel-header h2 {
font-size: 16px;
}
.panel-header p {
font-size: 12px;
}
.verification-code-row {
grid-template-columns: minmax(0, 1fr) 110px;
}
.offline-grid {
grid-template-columns: minmax(0, 1fr);
gap: 0;
}
.offline-grid :deep(.el-form-item) {
margin-bottom: 10px;
}
.recovery-footer {
align-items: stretch;
flex-direction: column-reverse;
gap: 10px;
}
.actions,
.actions .el-button,
.back-button {
width: 100%;
}
}