diff --git a/assets/css/routes/commerce.css b/assets/css/routes/commerce.css deleted file mode 100644 index 8b9ca04f..00000000 --- a/assets/css/routes/commerce.css +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Commerce center shared shell (cart / revenue). - * - * @package AKSRT - */ - -.aksrt-commerce-header { - margin: 0 0 20px; -} - -.aksrt-commerce-header__title { - margin: 0 0 6px; - font-size: 24px; - font-weight: 700; - line-height: 1.25; - color: var(--color-ink, #1f2937); -} - -.aksrt-commerce-header__subtitle { - margin: 0 0 14px; - font-size: 14px; - color: var(--color-ink-3, #6b7280); -} - -.aksrt-commerce-header__nav { - display: flex; - flex-wrap: wrap; - gap: 8px; -} - -.aksrt-commerce-header__nav-item { - display: inline-flex; - align-items: center; - padding: 6px 12px; - border: 1px solid var(--color-line, rgba(0, 0, 0, 0.08)); - border-radius: 999px; - background: var(--surface-1, #fff); - color: var(--color-ink-2, #4b5563); - font-size: 13px; - text-decoration: none; - transition: color .15s, border-color .15s, background .15s; -} - -.aksrt-commerce-header__nav-item:hover { - border-color: color-mix(in srgb, var(--color-primary, #f04494) 45%, transparent); - color: var(--color-primary, #f04494); -} - -.aksrt-commerce-header__nav-item.is-active { - border-color: transparent; - background: var(--color-primary, #f04494); - color: var(--color-on-primary, #fff); -} - -/* Soften revenue dashboard cards — task-first, not ops console */ -.aksrt-revenue-page__stats { - gap: 12px !important; - margin-bottom: 18px !important; -} - -.aksrt-revenue-page__stat-card { - padding: 14px 16px !important; - border: 1px solid var(--color-line-soft, rgba(0, 0, 0, 0.06)) !important; - border-radius: 12px !important; - background: var(--surface-1, #fff) !important; - box-shadow: none !important; -} - -.aksrt-revenue-page__stat-icon { - width: 36px !important; - height: 36px !important; - background: var(--body-bg-color, #f5f6f7) !important; - color: var(--color-ink-2, #4b5563) !important; - font-size: 15px !important; -} - -.aksrt-revenue-page__stat-value { - font-size: 18px !important; - font-weight: 600 !important; -} - -.aksrt-revenue-page__stat-label { - font-size: 12px !important; -} - -.aksrt-cart-page__header > div:first-child { - margin-bottom: 0; -} diff --git a/assets/css/routes/revenue.css b/assets/css/routes/revenue.css deleted file mode 100644 index 713fd2e6..00000000 --- a/assets/css/routes/revenue.css +++ /dev/null @@ -1,231 +0,0 @@ -/** - * AKSRT Revenue Page Styles - * 收益中心页面样式 - */ - -/** - * AKSRT Revenue Page Styles - * 收益中心页面样式 — legacy-aligned, responsive - */ - -.aksrt-revenue-page { - padding: 24px 0; -} - -.aksrt-revenue-page__header h2 { - font-size: 20px; - font-weight: 600; - margin-bottom: 16px; - color: var(--color-ink); -} - -.aksrt-revenue-page__stats { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); - gap: 16px; - margin-bottom: 24px; -} - -.aksrt-revenue-page__stat-card { - display: flex; - align-items: center; - gap: 16px; - padding: 20px; - background: var(--surface-1); - border-radius: var(--radius-2xl, 16px); - border: none; - box-shadow: var(--shadow-sm); -} - -.aksrt-revenue-page__stat-icon { - width: 48px; - height: 48px; - display: flex; - align-items: center; - justify-content: center; - border-radius: var(--radius-lg); - background: var(--color-primary-1, rgba(240, 68, 148, 0.08)); - color: var(--color-primary); - font-size: 20px; -} - -.aksrt-revenue-page__stat-value { - display: block; - font-size: 22px; - font-weight: 600; - color: var(--color-ink); -} - -.aksrt-revenue-page__stat-label { - display: block; - font-size: 13px; - color: var(--color-ink-3); - margin-top: 2px; -} - -.aksrt-revenue-page__actions { - margin-bottom: 24px; -} - -.aksrt-revenue-page__withdraw-btn { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 10px 24px; - border-radius: var(--radius); - background: var(--color-primary); - color: var(--color-on-primary, #fff); - font-size: 14px; - text-decoration: none; - transition: opacity 0.2s; -} - -.aksrt-revenue-page__withdraw-btn:hover { - opacity: 0.85; - color: var(--color-on-primary, #fff); -} - -.aksrt-revenue-page__section h3 { - font-size: 16px; - font-weight: 600; - margin-bottom: 16px; - color: var(--color-ink); -} - -.aksrt-revenue-page__list { - display: flex; - flex-direction: column; - gap: 8px; - background: transparent; - border-radius: 0; - overflow: visible; -} - -.aksrt-revenue-page__item { - display: flex; - align-items: center; - gap: 12px; - padding: 14px 16px; - background: var(--surface-1); - border: none; - border-radius: var(--main-radius, var(--radius, 8px)); - box-shadow: var(--shadow-sm); -} - -.aksrt-revenue-page__item-icon { - width: 36px; - height: 36px; - display: flex; - align-items: center; - justify-content: center; - border-radius: 50%; - background: var(--surface-2); - font-size: 14px; -} - -.aksrt-revenue-page__item-info { - flex: 1; - min-width: 0; -} - -.aksrt-revenue-page__item-title { - display: block; - font-size: 14px; - color: var(--color-ink); -} - -.aksrt-revenue-page__item-time { - display: block; - font-size: 12px; - color: var(--color-ink-4); - margin-top: 2px; -} - -.aksrt-revenue-page__item-amount { - font-size: 16px; - font-weight: 600; - white-space: nowrap; -} - -.aksrt-revenue-page__pagination { - display: flex; - justify-content: center; - gap: 8px; - margin-top: 24px; -} - -.aksrt-revenue-page__page-chip { - display: inline-block; - width: 32px; - height: 32px; - line-height: 32px; - text-align: center; - border-radius: var(--radius-sm); - font-size: 13px; - background: var(--surface-4); - color: var(--color-ink-3); - text-decoration: none; - transition: background 0.15s, color 0.15s; -} - -.aksrt-revenue-page__page-chip:hover { - background: var(--color-primary-soft); - color: var(--color-primary); -} - -.aksrt-revenue-page__page-chip.is-active { - background: var(--color-primary); - color: var(--color-on-primary, #fff); -} - -.aksrt-revenue-page__empty { - text-align: center; - padding: 48px 0; - color: var(--color-ink-4); -} - -.aksrt-revenue-page__empty i { - font-size: 48px; - margin-bottom: 12px; - display: block; -} - -/* ===== Responsive ===== */ -@media (max-width: 767px) { - .aksrt-revenue-page__stats { - grid-template-columns: 1fr; - } - - .aksrt-revenue-page__stat-card { - padding: 16px; - } - - .aksrt-revenue-page__item { - padding: 12px; - gap: 10px; - } - - .aksrt-revenue-page__item-icon { - width: 32px; - height: 32px; - font-size: 12px; - } -} - -@media (max-width: 480px) { - .aksrt-revenue-page { - padding: 16px 0; - } - - .aksrt-revenue-page__header h2 { - font-size: 18px; - } - - .aksrt-revenue-page__stat-value { - font-size: 18px; - } - - .aksrt-revenue-page__item-amount { - font-size: 14px; - } -} diff --git a/assets/css/routes/user-center/revenue-earnings.css b/assets/css/routes/user-center/revenue-earnings.css index c65e9b93..4d5bc9de 100644 --- a/assets/css/routes/user-center/revenue-earnings.css +++ b/assets/css/routes/user-center/revenue-earnings.css @@ -1,93 +1,12 @@ /** - * User Center — revenue standalone tab. + * User Center — 推广收益 panel: commission summary cards + 推广详情 / 佣金明细 / 推广用户 tabs. * - * Hosts the [data-aksrt-invite] card moved out of the revenue tab. Priority - * order: 成果概览 → 分享操作 → 奖励说明 → 邀请记录. Status/feedback are text - * (data-invite-status / data-invite-copy-feedback), never colour-only. + * The 推广详情 card is a fixed-label/value row list (112px label + content), + * mirroring the reference theme's 推广中心 card. Status/feedback are text only, + * never colour-only. */ -/* Standalone panel: the uc-revenue-panel is the only card, so flatten the - * generic dashboard-panel chrome (mirrors #panel-revenue / #panel-vip). */ -.uc-content #panel-revenue.dashboard-panel { padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; } -.uc-content .uc-revenue-page { padding: 4px 0; } - .uc-content .uc-revenue-panel { display: grid; gap: 18px; padding: 22px; border: 1px solid var(--color-line-soft, rgba(0,0,0,.06)); border-radius: 14px; background: var(--surface-1); } -.uc-content .uc-revenue-card { margin: 0; } -.uc-content .uc-revenue-panel__header { display: flex; align-items: center; gap: 12px; } -.uc-content .uc-revenue-panel__icon { display: grid; width: 44px; height: 44px; place-items: center; border-radius: 12px; color: #fff; background: linear-gradient(135deg, #db2777, #f472b6); } -.uc-content .uc-revenue-panel__eyebrow { margin: 0 0 2px; color: #b8377d; font-size: 12px; font-weight: 700; } -.uc-content .uc-revenue-panel__header h3 { margin: 0; font-size: 19px; } -.uc-content .uc-revenue-panel__intro, -.uc-content .uc-revenue-section__header p { margin: 0; color: var(--color-ink-4); font-size: 13px; line-height: 1.65; } -.uc-content .uc-revenue-panel__status { margin: 0; padding: 10px 12px; border-radius: 8px; color: var(--color-ink-3); background: var(--surface-2); font-size: 13px; } -.uc-content .uc-revenue-panel__status.is-error, -.uc-content .uc-revenue-copy-feedback.is-error { color: var(--color-error, #dc2626); } -.uc-content .uc-revenue-section { padding-top: 2px; } -.uc-content .uc-revenue-section h4 { margin: 0 0 4px; font-size: 15px; } - -/* 成果概览 — the hero metric row. */ -.uc-content .uc-revenue-stats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); margin-top: 12px; border: 1px solid var(--color-line-soft, rgba(0,0,0,.06)); border-radius: 12px; overflow: hidden; } -.uc-content .uc-revenue-stat { display: grid; gap: 4px; padding: 16px; border-right: 1px solid var(--color-line-soft, rgba(0,0,0,.06)); } -.uc-content .uc-revenue-stat:last-child { border-right: 0; } -.uc-content .uc-revenue-stat span, -.uc-content .uc-revenue-stat small { color: var(--color-ink-4); font-size: 12px; } -.uc-content .uc-revenue-stat strong { color: #b8377d; font-size: 28px; font-variant-numeric: tabular-nums; line-height: 1.1; } - -/* 分享操作 — code + copyable link + primary button. */ -.uc-content .uc-revenue-share { display: grid; gap: 10px; margin-top: 12px; } -.uc-content .uc-revenue-code { display: flex; align-items: baseline; gap: 10px; color: var(--color-ink-4); font-size: 13px; } -.uc-content .uc-revenue-code strong { color: var(--color-ink); font-size: 19px; letter-spacing: .08em; } -.uc-content .uc-revenue-link-row { display: flex; gap: 10px; } -.uc-content .uc-revenue-link { flex: 1; min-width: 0; height: 42px; padding: 0 11px; border: 1px solid var(--color-line-soft, rgba(0,0,0,.1)); border-radius: 8px; background: var(--surface-2); } -.uc-content .uc-revenue-copy { min-width: 108px; } -.uc-content .uc-revenue-copy-feedback { min-height: 18px; margin: 0; color: var(--color-ink-4); font-size: 12px; } - -/* 邀请记录 — list with per-row status badge + text. */ -.uc-content .uc-revenue-records__header { display: flex; justify-content: space-between; gap: 12px; } -.uc-content .uc-revenue-record-list { display: grid; margin-top: 12px; } -.uc-content .uc-revenue-record { display: flex; align-items: center; gap: 12px; padding: 12px 0; border-top: 1px solid var(--color-line-soft, rgba(0,0,0,.06)); } -.uc-content .uc-revenue-record__avatar { display: grid; width: 40px; height: 40px; flex: 0 0 40px; place-items: center; overflow: hidden; border-radius: 50%; background: var(--surface-2); } -.uc-content .uc-revenue-record__avatar img { width: 100%; height: 100%; object-fit: cover; } -.uc-content .uc-revenue-record__main { display: grid; flex: 1; min-width: 0; gap: 3px; } -.uc-content .uc-revenue-record__main span, -.uc-content .uc-revenue-record__status small { color: var(--color-ink-4); font-size: 12px; } -.uc-content .uc-revenue-record__status { display: grid; justify-items: end; gap: 4px; } -.uc-content .uc-revenue-badge { padding: 3px 8px; border-radius: 999px; font-size: 12px; font-weight: 700; } -.uc-content .uc-revenue-badge.is-registered { color: #2563eb; background: rgba(37,99,235,.1); } -.uc-content .uc-revenue-badge.is-verified { color: #7c3aed; background: rgba(124,58,237,.1); } -.uc-content .uc-revenue-badge.is-rewarded { color: #16a34a; background: rgba(22,163,74,.1); } -.uc-content .uc-revenue-record-empty { padding: 22px; border-top: 1px solid var(--color-line-soft, rgba(0,0,0,.06)); color: var(--color-ink-4); font-size: 13px; text-align: center; } - -/* 键盘可聚焦:复制按钮与链接输入的可见焦点。 */ -.uc-content .uc-revenue-copy:focus-visible, -.uc-content .uc-revenue-link:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; } - -/* 移动端:单列、无横向溢出、复制按钮整行可点击。 */ -@media (max-width: 640px) { - .uc-content .uc-revenue-panel { padding: 18px; } - .uc-content .uc-revenue-stats { grid-template-columns: 1fr; } - .uc-content .uc-revenue-stat { border-right: 0; border-bottom: 1px solid var(--color-line-soft, rgba(0,0,0,.06)); } - .uc-content .uc-revenue-stat:last-child { border-bottom: 0; } - .uc-content .uc-revenue-link-row { flex-direction: column; } - .uc-content .uc-revenue-copy { width: 100%; } - .uc-content .uc-revenue-record { align-items: flex-start; } -} - -/* New affiliate contract cards. */ -.uc-content .aksrt-affiliate-panel { display:grid; gap:18px; padding:22px; border:1px solid var(--border,rgba(0,0,0,.08)); border-radius:var(--card-radius,16px); background:var(--surface, #fff); box-shadow:0 8px 24px rgba(15,23,42,.06); } -.uc-content .uc-panel-heading h2 { margin:0 0 4px; color:var(--text,#111827); } -.uc-content .uc-panel-heading p,.uc-content .uc-affiliate-note { margin:0; color:var(--muted,#6b7280); line-height:1.6; } -.uc-content .uc-affiliate-link-card { display:flex; align-items:end; gap:10px; padding:14px; border-radius:12px; background:var(--surface-muted,#f8fafc); } -.uc-content .uc-affiliate-link-card>div { flex:1; min-width:0; display:grid; gap:6px; } -.uc-content .uc-affiliate-link-card input { width:100%; min-width:0; height:40px; padding:0 10px; border:1px solid var(--border,#e5e7eb); border-radius:8px; background:var(--surface,#fff); color:var(--text,#111827); } -.uc-content .uc-affiliate-link-card button { white-space:nowrap; } -.uc-content .uc-affiliate-stats { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:10px; } -.uc-content .uc-affiliate-stats article { display:grid; gap:5px; padding:14px; border:1px solid var(--border,#e5e7eb); border-radius:12px; } -.uc-content .uc-affiliate-stats article:first-child strong { color:var(--danger,#dc2626); } -.uc-content .uc-affiliate-stats article strong { color:var(--primary,#2563eb); font-size:24px; font-variant-numeric:tabular-nums; } -.uc-content .uc-affiliate-link-card [data-affiliate-feedback] { grid-column:1/-1; margin:0; min-height:18px; color:var(--success,#16a34a); font-size:12px; } -.uc-content .uc-affiliate-link-card [data-affiliate-feedback].is-error { color:var(--danger,#dc2626); } -@media (max-width:640px) { .uc-content .aksrt-affiliate-panel { padding:16px; } .uc-content .uc-affiliate-link-card { align-items:stretch; flex-direction:column; } .uc-content .uc-affiliate-link-card button { width:100%; } .uc-content .uc-affiliate-stats { grid-template-columns:1fr; } } /* The revenue page itself is a layout surface, not an additional card. * Keep card styling on its inner summary/details components only. */ @@ -175,18 +94,6 @@ color: inherit; } -.uc-content .uc-commission-card__action { - align-self: center; - margin-left: auto; - padding: 10px 16px; - border: 0; - border-radius: 999px; - color: #fff; - background: rgba(255, 255, 255, .14); - font-size: 14px; - backdrop-filter: blur(4px); -} - /* 三 Tab 推广收益:佣金详细页采用紧凑的一列信息清单。 */ .uc-content .uc-reward-area { display: grid; gap: 18px; padding: 24px 28px 30px; border-radius: 18px; background: var(--surface-1, #fff); box-shadow: 0 8px 26px rgba(15, 23, 42, .06); } .uc-content .uc-commission-summary + .uc-reward-area { margin-top: 28px; } @@ -204,22 +111,13 @@ .uc-content .uc-revenue-summary-row > span { color: var(--color-ink-3); font-size: 14px; } .uc-content .uc-revenue-summary-row > strong { color: var(--color-ink); font-size: 16px; } .uc-content .uc-revenue-summary-row > em { color: var(--color-ink-4); font-style: normal; } -.uc-content .uc-revenue-count { display: flex; align-items: baseline; gap: 2px; } -.uc-content .uc-revenue-count strong { color: var(--color-ink); font-size: 16px; } -.uc-content .uc-revenue-count em { color: var(--color-ink-4); font-style: normal; } -.uc-content .uc-revenue-summary-row--link input { width: auto; max-width: 100%; min-width: 28ch; height: 38px; padding: 0 10px; border: 1px solid var(--color-line-soft, rgba(15, 23, 42, .12)); border-radius: 7px; color: var(--color-primary); background: var(--surface-2, #f8fafc); } -.uc-content .uc-revenue-summary-row--link button { min-width: 64px; height: 38px; padding: 0 12px; border-radius: 7px; } +.uc-content .uc-revenue-summary-row--link { grid-template-columns: 112px minmax(0, 1fr) auto auto; } +.uc-content .uc-revenue-summary-row--link input { width: 100%; max-width: 100%; min-width: 0; height: 38px; padding: 0 10px; border: 1px solid var(--color-line-soft, rgba(15, 23, 42, .12)); border-radius: 7px; color: var(--color-primary); background: var(--surface-2, #f8fafc); } +.uc-content .uc-revenue-summary-row--link button { min-width: 76px; height: 38px; padding: 0 12px; border-radius: 7px; white-space: nowrap; } .uc-content .uc-revenue-summary-row--link small { grid-column: 2 / -1; min-height: 16px; color: var(--color-success, #16a34a); font-size: 12px; } .uc-content .uc-revenue-summary-row--link small.is-error { color: var(--color-error, #dc2626); } +.uc-content .uc-revenue-summary-row--link button[hidden] { display: none; } -/* 推广二维码 — bundled qrcode canvas + download. */ -.uc-content .uc-revenue-summary-row--qr { align-items: flex-start; } -.uc-content .uc-revenue-qr { display: grid; justify-items: start; gap: 8px; } -.uc-content .uc-revenue-qr canvas { display: block; width: 148px; height: 148px; border: 1px solid var(--color-line-soft, rgba(15, 23, 42, .12)); border-radius: 10px; background: #fff; } -.uc-content .uc-revenue-qr__actions { display: flex; flex-wrap: wrap; gap: 8px; } -.uc-content .uc-revenue-qr__actions button { min-width: 96px; height: 32px; padding: 0 12px; border-radius: 7px; } -.uc-content .uc-revenue-qr small { min-height: 16px; color: var(--color-success, #16a34a); font-size: 12px; } -.uc-content .uc-revenue-qr small.is-error { color: var(--color-error, #dc2626); } .uc-content .uc-revenue-summary-row--total > div { display: flex; flex-wrap: wrap; gap: 12px; } .uc-content .uc-revenue-summary-row--total strong { padding: 7px 11px; border-radius: 7px; color: var(--color-primary); background: var(--surface-2, #f8fafc); font-size: 14px; } .uc-content .uc-revenue-summary-row--explain { align-items: start; padding-top: 16px; border-bottom: 0; } @@ -232,121 +130,10 @@ .uc-content .uc-revenue-user-row small { color: var(--color-ink-4); font-size: 12px; } .uc-content .uc-revenue-user-row > span { color: var(--color-success, #16a34a); font-size: 12px; } -.uc-content .uc-commission-card__action:hover { - background: rgba(255, 255, 255, .24); -} - -.uc-content .aksrt-affiliate-panel { - gap: 24px; - padding: 34px 44px 38px; - border: 0; - border-radius: 18px; - background: var(--surface-1, #fff); - box-shadow: 0 8px 26px rgba(15, 23, 42, .06); -} - -.uc-content .uc-panel-heading { - padding-bottom: 20px; - border-bottom: 1px solid var(--color-line-soft, rgba(15, 23, 42, .08)); -} - -.uc-content .uc-panel-heading h2 { - display: inline-block; - position: relative; - margin: 0 0 10px; - font-size: 20px; -} - -.uc-content .uc-panel-heading h2::after { - position: absolute; - right: 0; - bottom: -11px; - left: 0; - height: 3px; - border-radius: 999px; - background: #f1498c; - content: ""; -} - -.uc-content .uc-panel-heading p { - font-size: 16px; -} - -.uc-content .uc-affiliate-link-card { - display: grid; - grid-template-columns: auto minmax(0, 1fr) auto; - align-items: center; - gap: 12px; - padding: 0; - background: transparent; -} - -.uc-content .uc-affiliate-link-card > div { - display: contents; -} - -.uc-content .uc-affiliate-link-card > div > span { - color: var(--color-ink-4); - font-size: 15px; -} - -.uc-content .uc-affiliate-link-card input { - height: 42px; - border: 0; - border-radius: 7px; - color: #ef5370; - background: #fff0f2; - font-size: 15px; -} - -.uc-content .uc-affiliate-link-card button { - min-height: 42px; - border-radius: 7px; - white-space: nowrap; -} - -.uc-content .uc-affiliate-link-card [data-affiliate-feedback] { - grid-column: 2 / -1; -} - -.uc-content .uc-affiliate-stats { - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 12px; -} - -.uc-content .uc-affiliate-stats article { - display: flex; - align-items: center; - justify-content: space-between; - min-height: 48px; - padding: 0 14px; - border: 0; - border-radius: 8px; - background: var(--surface-2, #f7f8fa); -} - -.uc-content .uc-affiliate-stats article strong { - color: var(--color-primary); - font-size: 16px; -} - -.uc-content .uc-affiliate-stats article:first-child strong { - color: #e94568; -} - -.uc-content .uc-affiliate-note { - margin-top: -8px; - font-size: 13px; -} - @media (max-width: 720px) { .uc-content .uc-commission-summary { grid-template-columns: 1fr; } - - .uc-content .aksrt-affiliate-panel { - padding: 24px 20px 28px; - } } @media (max-width: 560px) { @@ -363,33 +150,22 @@ font-size: 28px; } - .uc-content .uc-affiliate-link-card { - grid-template-columns: 1fr; - } - - .uc-content .uc-affiliate-link-card > div { - display: grid; - gap: 6px; - } - - .uc-content .uc-affiliate-link-card [data-affiliate-feedback] { - grid-column: 1; - } - - .uc-content .uc-affiliate-stats { - grid-template-columns: 1fr; - } - .uc-content .uc-reward-area { padding: 20px 16px 24px; } .uc-content .uc-commission-summary + .uc-reward-area { margin-top: 20px; } .uc-content .uc-reward-area__heading { display: grid; gap: 4px; } .uc-content .uc-reward-tabs { gap: 16px; overflow-x: auto; } .uc-content .uc-revenue-summary-row { grid-template-columns: 92px minmax(0, 1fr) auto; gap: 8px; } - .uc-content .uc-revenue-summary-row--link { grid-template-columns: minmax(0, 1fr) auto; } - .uc-content .uc-revenue-summary-row--link input { width: 100% !important; min-width: 0; } + .uc-content .uc-revenue-summary-row--link { grid-template-columns: minmax(0, 1fr) auto auto; gap: 8px; } + .uc-content .uc-revenue-summary-row--link input { width: 100%; min-width: 0; } + .uc-content .uc-revenue-summary-row--link button { min-width: 62px; padding: 0 9px; } .uc-content .uc-revenue-summary-row--link > span { grid-column: 1 / -1; } .uc-content .uc-revenue-summary-row--link small { grid-column: 1 / -1; } .uc-content .uc-revenue-summary-row--explain { grid-template-columns: 1fr; } .uc-content .uc-revenue-summary-row--explain .uc-reward-richtext { grid-column: 1; } - .uc-content .uc-revenue-summary-row--qr { grid-template-columns: 1fr; } } + +/* 推广海报预览弹窗:舞台居中,canvas 自适应弹窗宽度。 */ +.uc-content .uc-affiliate-poster { display: grid; place-items: center; min-height: 120px; } +.uc-content .uc-affiliate-poster img, +.uc-content .uc-affiliate-poster canvas { display: block; max-width: 100%; height: auto; margin: 0 auto; border-radius: 12px; background: var(--surface-2, #f7f8fa); } +.uc-content .uc-affiliate-poster p { margin: 0; text-align: center; } diff --git a/assets/css/routes/user-center/revenue.css b/assets/css/routes/user-center/revenue.css index b7f10473..80e7f41e 100644 --- a/assets/css/routes/user-center/revenue.css +++ b/assets/css/routes/user-center/revenue.css @@ -1,5 +1,8 @@ /** * User Center - commission and revenue rewards. + * + * Structural base for the 推广收益 tab (unprefixed selectors). Layout + * overrides for the current card design live in revenue-earnings.css. */ .uc-content #panel-revenue.dashboard-panel { @@ -10,106 +13,6 @@ box-shadow: none; } -.uc-revenue-panel { - display: grid; - gap: 20px; - padding: 4px 0; -} - -.uc-commission-summary { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 16px; -} - -.uc-commission-card { - position: relative; - display: flex; - align-items: center; - gap: 15px; - min-width: 0; - min-height: 142px; - padding: 22px; - overflow: hidden; - border: 1px solid var(--color-line-soft, rgba(15, 23, 42, .08)); - border-radius: 8px; - background: var(--surface-1); - box-shadow: 0 6px 18px rgba(15, 23, 42, .05); -} - -.uc-commission-card__icon { - display: grid; - flex: 0 0 48px; - width: 48px; - height: 48px; - place-items: center; - border-radius: 8px; - color: #fff; - background: #2563a8; - font-size: 19px; -} - -.uc-commission-card--balance .uc-commission-card__icon { - background: #c95a31; -} - -.uc-commission-card__body { - min-width: 0; -} - -.uc-commission-card__body > span, -.uc-commission-card__body > p { - display: block; - color: var(--color-ink-4); - font-size: 12px; -} - -.uc-commission-card__body > span { - margin-bottom: 5px; -} - -.uc-commission-card__body strong { - display: block; - color: var(--color-ink); - font-size: 30px; - font-variant-numeric: tabular-nums; - line-height: 1.15; -} - -.uc-commission-card--ratio .uc-commission-card__body strong { - color: #2563a8; -} - -.uc-commission-card__body strong small { - margin-left: 2px; - font-size: 16px; -} - -.uc-commission-card__body p { - margin: 6px 0 0; - line-height: 1.45; -} - -.uc-commission-card__action { - display: inline-flex; - align-items: center; - gap: 7px; - flex: 0 0 auto; - margin-left: auto; - padding: 9px 13px; - border: 0; - border-radius: 7px; - color: #fff; - background: var(--color-primary); - font-size: 13px; - cursor: pointer; -} - -.uc-commission-card__action:hover { - color: #fff; - filter: brightness(.95); -} - .uc-reward-area { display: grid; gap: 16px; @@ -124,16 +27,14 @@ } .uc-reward-area__heading h3, -.uc-reward-list-heading h4, -.uc-reward-block h4 { +.uc-reward-list-heading h4 { margin: 0; color: var(--color-ink); font-size: 16px; } .uc-reward-area__heading > span, -.uc-reward-list-heading p, -.uc-reward-block__heading p { +.uc-reward-list-heading p { margin: 0; color: var(--color-ink-4); font-size: 12px; @@ -188,63 +89,8 @@ grid-template-columns: repeat(2, minmax(0, 1fr)); } -.uc-reward-block { - display: grid; - gap: 14px; - min-width: 0; - padding: 18px; - border: 1px solid var(--color-line-soft, rgba(15, 23, 42, .07)); - border-radius: 8px; - background: var(--surface-2); -} - -.uc-reward-block__heading { - display: grid; - gap: 5px; -} - -.uc-reward-block__heading p { - line-height: 1.5; -} - -.uc-invite-share { - display: grid; - gap: 10px; -} - -.uc-invite-code { - display: flex; - align-items: baseline; - gap: 10px; - color: var(--color-ink-4); - font-size: 13px; -} - -.uc-invite-code strong { - color: var(--color-ink); - font-size: 19px; - letter-spacing: .08em; -} - -.uc-invite-link-row { - display: flex; - gap: 8px; -} - -.uc-invite-link-row input { - flex: 1 1 auto; - min-width: 0; - height: 40px; - padding: 0 10px; - border: 1px solid var(--color-line-soft, rgba(15, 23, 42, .12)); - border-radius: 7px; - color: var(--color-ink); - background: var(--surface-1); -} - .uc-reward-status, .uc-reward-copy-feedback { - min-height: 17px; margin: 0; color: var(--color-ink-4); font-size: 12px; @@ -255,56 +101,6 @@ color: var(--color-error, #dc2626); } -.uc-ratio-list { - display: grid; - gap: 0; - margin: 0; -} - -.uc-ratio-list > div { - display: flex; - align-items: center; - justify-content: space-between; - padding: 10px 0; - border-bottom: 1px solid var(--color-line-soft, rgba(15, 23, 42, .07)); -} - -.uc-ratio-list > div:last-child { - border-bottom: 0; -} - -.uc-ratio-list dt { - color: var(--color-ink-3); - font-size: 13px; -} - -.uc-ratio-list dd { - margin: 0; - color: var(--color-primary); - font-weight: 700; -} - -.uc-total-commission { - display: flex; - align-items: baseline; - gap: 10px; -} - -.uc-total-commission strong { - color: var(--color-ink); - font-size: 28px; - font-variant-numeric: tabular-nums; -} - -.uc-total-commission span { - color: var(--color-ink-4); - font-size: 12px; -} - -.uc-reward-block--details { - grid-column: 1 / -1; -} - .uc-reward-richtext { color: var(--color-ink-3); font-size: 13px; @@ -337,15 +133,13 @@ font-weight: 500; } -.uc-commission-list, -.uc-invite-list { +.uc-commission-list { display: grid; gap: 0; border-top: 1px solid var(--color-line-soft, rgba(15, 23, 42, .08)); } -.uc-commission-row, -.uc-invite-record { +.uc-commission-row { display: flex; align-items: center; gap: 12px; @@ -365,16 +159,14 @@ background: rgba(201, 90, 49, .12); } -.uc-commission-row__main, -.uc-invite-record__main { +.uc-commission-row__main { display: grid; flex: 1 1 auto; min-width: 0; gap: 3px; } -.uc-commission-row__main strong, -.uc-invite-record__main strong { +.uc-commission-row__main strong { overflow: hidden; color: var(--color-ink); font-size: 13px; @@ -383,8 +175,7 @@ } .uc-commission-row__main span, -.uc-commission-row__main time, -.uc-invite-record__main span { +.uc-commission-row__main time { overflow: hidden; color: var(--color-ink-4); font-size: 12px; @@ -423,30 +214,6 @@ background: rgba(168, 109, 40, .12); } -.uc-invite-record__avatar { - display: grid; - flex: 0 0 36px; - width: 36px; - height: 36px; - place-items: center; - overflow: hidden; - border-radius: 50%; - color: var(--color-primary); - background: var(--surface-2); -} - -.uc-invite-record__avatar img { - width: 100%; - height: 100%; - object-fit: cover; -} - -.uc-invite-record__status { - flex: 0 0 auto; - color: var(--color-ink-4); - font-size: 12px; -} - .uc-reward-pagination { display: flex; justify-content: center; @@ -481,15 +248,9 @@ } @media (max-width: 720px) { - .uc-commission-summary, .uc-reward-pane--detail { grid-template-columns: 1fr; } - - .uc-commission-card { - min-height: 120px; - padding: 18px; - } } @media (max-width: 480px) { @@ -497,24 +258,6 @@ padding: 4px 0 0; } - .uc-commission-card { - align-items: flex-start; - flex-wrap: wrap; - } - - .uc-commission-card__action { - margin-left: 63px; - } - - .uc-invite-link-row { - flex-direction: column; - } - - .uc-invite-link-row .btn-primary { - width: 100%; - } - - .uc-invite-record, .uc-commission-row { align-items: flex-start; } diff --git a/assets/js/credits.js b/assets/js/credits.js index 44298ac9..87320e98 100644 --- a/assets/js/credits.js +++ b/assets/js/credits.js @@ -125,19 +125,12 @@ function setFeedback(text, error) { if (feedback) { feedback.textContent = text; feedback.classList.toggle('is-error', !!error); } } api('/revenue/me').then(function (r) { if (!r.ok) { setFeedback((r.json && r.json.message) || '推广数据加载失败。', true); return; } - var j = r.json || {}, stats = j.stats || {}; + var j = r.json || {}; if (input) { input.value = j.url || ''; - /* Keep the complete ref URL readable on desktop; mobile CSS still caps it. */ - var linkLength = String(j.url || '').length; - input.setAttribute('size', String(Math.max(28, Math.min(96, linkLength || 28)))); - input.style.width = Math.max(28, Math.min(96, linkLength || 28)) + 'ch'; } if (copy) copy.disabled = !j.url; var ratio = root.querySelector('[data-affiliate-ratio]'); if (ratio) ratio.textContent = String(j.current_ratio || 0) + '%'; - var promoters = root.querySelector('[data-affiliate-promoters]'); if (promoters) promoters.textContent = String(stats.promoters || 0); - var payers = root.querySelector('[data-affiliate-payers]'); if (payers) payers.textContent = String(stats.effective_payers || 0); - renderAffiliateQr(root, j.url || ''); initAffiliatePoster(root, j.url || '', j.poster || {}, j.site_name || document.title); }).catch(function () { setFeedback('推广数据加载失败。', true); }); if (copy) copy.addEventListener('click', function () { @@ -148,78 +141,50 @@ }); } - // ===== Referral QR code (bundled qrcode-generator, no CDN) ===== - function renderAffiliateQr(root, url) { - var row = root.querySelector('[data-affiliate-qr-row]'); - var canvas = root.querySelector('[data-affiliate-qr]'); - if (!row || !canvas) return; - if (!url || typeof window.qrcode !== 'function') { - row.hidden = true; - return; - } - var feedback = root.querySelector('[data-affiliate-qr-feedback]'); - function setQrFeedback(text, error) { if (feedback) { feedback.textContent = text; feedback.classList.toggle('is-error', !!error); } } - try { - var qr = window.qrcode(0, 'M'); - qr.addData(url); - qr.make(); - var count = qr.getModuleCount(); - var cell = 4, margin = 4; - var size = (count + margin * 2) * cell; - canvas.width = size; - canvas.height = size; - var ctx = canvas.getContext('2d'); - ctx.fillStyle = '#ffffff'; - ctx.fillRect(0, 0, size, size); - ctx.fillStyle = '#0f172a'; - for (var r = 0; r < count; r++) { - for (var c = 0; c < count; c++) { - if (qr.isDark(r, c)) { - ctx.fillRect((c + margin) * cell, (r + margin) * cell, cell, cell); - } - } - } - } catch (e) { - row.hidden = true; - return; - } - var download = root.querySelector('[data-affiliate-qr-download]'); - if (download) download.addEventListener('click', function () { - try { - var link = document.createElement('a'); - link.download = 'referral-qr.png'; - link.href = canvas.toDataURL('image/png'); - document.body.appendChild(link); - link.click(); - link.remove(); - setQrFeedback('二维码已下载。'); - } catch (err) { - setQrFeedback('二维码下载失败,请截图保存。', true); - } - }); - } - - // ===== Referral poster (canvas: hero image + copy + QR + link) ===== + // ===== Referral poster (canvas preview modal: hero image + copy + QR + link) ===== function initAffiliatePoster(root, url, poster, siteName) { var button = root.querySelector('[data-affiliate-poster]'); - if (!button) return; + var modal = document.querySelector('[data-aksrt-affiliate-poster-modal]'); + var stage = document.querySelector('[data-affiliate-poster-stage]'); + var download = document.querySelector('[data-affiliate-poster-download]'); + if (!button || !modal) return; if (!url || !poster || poster.enabled !== true) return; button.hidden = false; + [].forEach.call(modal.querySelectorAll('[data-affiliate-poster-close]'), function (closer) { + closer.addEventListener('click', function () { closeModal(modal); }); + }); + var canvas = null; + if (download) { + download.addEventListener('click', function () { + if (!canvas) return; + try { + var link = document.createElement('a'); + link.download = 'referral-poster.png'; + link.href = canvas.toDataURL('image/png'); + document.body.appendChild(link); + link.click(); + link.remove(); + } catch (err) { + /* Canvas is same-origin generated; download can only fail if the browser blocks it. */ + } + }); + } button.addEventListener('click', function () { - var feedback = root.querySelector('[data-affiliate-qr-feedback]'); - function setPosterFeedback(text, error) { if (feedback) { feedback.textContent = text; feedback.classList.toggle('is-error', !!error); } } - if (typeof window.qrcode !== 'function') { setPosterFeedback('二维码组件未加载。', true); return; } + if (typeof window.qrcode !== 'function') { + if (stage) { stage.innerHTML = '
' + '二维码组件未加载。' + '
'; } + openModal(modal); + return; + } + if (stage) { stage.innerHTML = '' + '正在生成海报…' + '
'; } + if (download) download.hidden = true; + openModal(modal); button.disabled = true; - buildPosterCanvas(url, poster, siteName).then(function (canvas) { - var link = document.createElement('a'); - link.download = 'referral-poster.png'; - link.href = canvas.toDataURL('image/png'); - document.body.appendChild(link); - link.click(); - link.remove(); - setPosterFeedback('推广海报已生成并下载。'); + buildPosterCanvas(url, poster, siteName).then(function (built) { + canvas = built; + if (stage) { stage.innerHTML = ''; stage.appendChild(built); } + if (download) download.hidden = false; }).catch(function () { - setPosterFeedback('海报生成失败,请重试。', true); + if (stage) { stage.innerHTML = '' + '海报生成失败,请重试。' + '
'; } }).finally(function () { button.disabled = false; }); diff --git a/assets/js/routes/user-center.js b/assets/js/routes/user-center.js index 9827a1b2..1f602431 100644 --- a/assets/js/routes/user-center.js +++ b/assets/js/routes/user-center.js @@ -193,7 +193,6 @@ return loadPanel(name, forceLoad, queryParams).then(function() { switchTo(name); if (updateHistory) updateUrl(name); - if (name === 'revenue' && typeof window.AKSRTRevenueCenterInit === 'function') window.AKSRTRevenueCenterInit(panels[name].panel); if (name === 'revenue' && typeof window.AKSRTAffiliateRevenueInit === 'function') window.AKSRTAffiliateRevenueInit(); if (name === 'revenue' && typeof window.AKSRTWithdrawInit === 'function') window.AKSRTWithdrawInit(); }).catch(function() { @@ -290,7 +289,6 @@ loadPanel('creator', true, pageUrl.searchParams).then(function() { switchTo('creator'); if (window.history.pushState) window.history.pushState({}, '', pageUrl.toString()); - if (typeof window.AKSRTRevenueCenterInit === 'function') window.AKSRTRevenueCenterInit(creatorPanel); }).catch(function() { notyf(i18n.networkError || '加载失败,请重试', 'danger'); }); diff --git a/inc/helpers/user-center-renderers/affiliate-poster-modal.php b/inc/helpers/user-center-renderers/affiliate-poster-modal.php new file mode 100644 index 00000000..d6407544 --- /dev/null +++ b/inc/helpers/user-center-renderers/affiliate-poster-modal.php @@ -0,0 +1,28 @@ + +