Files
xiaoxia-saas/apps/web/src/pages/subscription/UpgradeSubscription.css
T
xiaoxia 0fcb77b991
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Frontend Lint (push) Successful in 1m6s
CI Build & Deploy Pipeline / Build Staging Web Image (push) Successful in 1m49s
CI Build & Deploy Pipeline / Build Production API Image (push) Has been skipped
CI Build & Deploy Pipeline / Build Production Web Image (push) Has been skipped
CI Build & Deploy Pipeline / Build Production Worker Image (push) Has been skipped
CI Build & Deploy Pipeline / Deploy Production (push) Has been skipped
CI Build & Deploy Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Validate Code Quality And Tests (push) Successful in 3m1s
CI/CD Pipeline / Unit Tests (push) Successful in 3m20s
CI/CD Pipeline / Integration Tests (push) Successful in 1m29s
CI Build & Deploy Pipeline / Build Staging API Image (push) Successful in 7m4s
CI Build & Deploy Pipeline / Build Staging Worker Image (push) Successful in 7m54s
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 45s
CI Build & Deploy Pipeline / Staging E2E Tests (push) Failing after 2m50s
CI Build & Deploy Pipeline / Staging API Integration Tests (push) Successful in 3m28s
ci: Prettier纳入两层防御体系 (#520)
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com>
Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
2026-07-18 18:08:19 +08:00

193 lines
3.9 KiB
CSS
Executable File

/* 升级/降级页面 - V21 CSS变量体系 */
@import "../../styles/global.css";
.xx-upgrade-page {
max-width: 900px;
margin: 0 auto;
padding: var(--space-2xl) var(--space-lg);
}
/* 套餐卡片 */
.xx-upgrade-plans {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--space-lg);
margin-bottom: var(--space-2xl);
}
@media (max-width: 768px) {
.xx-upgrade-plans {
grid-template-columns: 1fr;
}
}
.xx-upgrade-card {
background: var(--bg-elevated);
border: 2px solid var(--border-color);
border-radius: var(--radius-lg);
padding: var(--space-xl) var(--space-lg);
text-align: center;
cursor: pointer;
transition: var(--transition-base);
position: relative;
}
.xx-upgrade-card:hover {
border-color: var(--primary-color);
box-shadow: 0 8px 30px color-mix(in srgb, var(--primary-color) 10%, transparent);
}
.xx-upgrade-card.selected {
border-color: var(--primary-color);
box-shadow:
0 0 0 3px color-mix(in srgb, var(--primary-color) 12%, transparent),
0 8px 30px color-mix(in srgb, var(--primary-color) 10%, transparent);
}
.xx-upgrade-card.current {
border-color: var(--secondary-color);
}
.xx-current-badge {
position: absolute;
top: -10px;
right: var(--space-md);
background: var(--secondary-color);
color: var(--text-inverse);
padding: 3px 12px;
border-radius: var(--radius-full);
font-size: var(--font-size-sm);
font-weight: var(--font-weight-bold);
}
.xx-upgrade-card h3 {
font-size: var(--font-size-xl);
font-weight: var(--font-weight-extrabold);
color: var(--text-primary);
margin: 0 0 var(--space-md);
}
.xx-price {
margin-bottom: var(--space-sm);
}
/* ── BillingCycleSwitch 组件 ──────────────────────── */
.xx-billing-cycle-switch {
display: inline-flex;
border: 1px solid var(--border-color);
border-radius: var(--radius-md);
overflow: hidden;
}
.xx-billing-cycle-btn {
padding: 6px 14px;
font-size: var(--font-size-sm);
font-weight: var(--font-weight-semibold);
border: none;
background: var(--bg-primary);
color: var(--text-secondary);
cursor: pointer;
transition: var(--transition-fast);
position: relative;
}
.xx-billing-cycle-btn:first-child {
border-right: 1px solid var(--border-color);
}
.xx-billing-cycle-btn.active {
background: var(--primary-color);
color: var(--text-inverse);
}
.xx-save {
display: inline-block;
margin-left: var(--space-xs);
font-size: var(--font-size-xs);
color: var(--secondary-color);
font-weight: var(--font-weight-semibold);
}
.xx-billing-cycle-btn.active .xx-save {
color: var(--text-inverse);
opacity: 0.85;
}
/* 操作区 */
.xx-upgrade-actions {
text-align: center;
display: flex;
flex-direction: column;
align-items: center;
gap: var(--space-md);
}
.xx-auto-renew-section {
display: flex;
align-items: center;
gap: var(--space-sm);
color: var(--text-secondary);
font-size: var(--font-size-base);
}
.xx-cancel-btn {
margin-top: var(--space-sm);
}
/* ── Spinner 组件 ───────────────────────────────── */
.xx-spinner {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-sm);
padding: var(--space-2xl) 0;
}
.xx-spinner-dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--primary-color);
animation: xx-spinner-bounce 1.2s ease-in-out infinite;
}
.xx-spinner-dot:nth-child(2) {
animation-delay: 0.15s;
}
.xx-spinner-dot:nth-child(3) {
animation-delay: 0.3s;
}
.xx-spinner--small .xx-spinner-dot {
width: 6px;
height: 6px;
}
@keyframes xx-spinner-bounce {
0%,
80%,
100% {
transform: scale(0.6);
opacity: 0.4;
}
40% {
transform: scale(1);
opacity: 1;
}
}
@media (max-width: 480px) {
.xx-upgrade-page {
padding: var(--space-md);
}
.xx-upgrade-actions {
flex-direction: column;
}
.xx-upgrade-actions button {
width: 100%;
}
}