Expose gateway billing flows from the synced server baseline

The preserved local work adds PopiNewAPI billing checkout, gateway account binding, and matching web console/pricing surfaces on top of the current test-server baseline. During the merge, the start-end video helpers from the deployed baseline were kept alongside the actionGenerate prompt handling from the WIP.

Constraint: Current usable baseline is 7054436, already deployed on the test server.

Rejected: Commit the WIP before syncing the baseline | would have hidden conflicts with the deployed start-end-frame changes.

Confidence: medium

Scope-risk: broad

Directive: Do not deploy this commit to the test server without rechecking gateway credentials and billing checkout behavior in that environment.

Tested: go test ./...

Tested: make build

Tested: cd web && npm run build
This commit is contained in:
wtgoku
2026-05-21 16:53:07 +08:00
parent 7054436a99
commit baba209519
31 changed files with 6035 additions and 86 deletions
+120 -1
View File
@@ -1084,6 +1084,113 @@ code {
align-content: start;
}
.billing-purchase-stack {
display: grid;
gap: 12px;
}
.billing-purchase-actions {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.billing-purchase-result {
display: grid;
gap: 6px;
}
.billing-purchase-result a {
color: var(--accent-strong);
font-weight: 600;
}
.billing-success-links {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 6px;
}
.billing-order-detail {
border-top: 1px solid var(--line);
}
.billing-order-detail:first-child {
border-top: 0;
}
.billing-order-summary {
list-style: none;
cursor: pointer;
}
.billing-order-summary::-webkit-details-marker {
display: none;
}
.billing-order-body {
padding: 0 0 12px;
}
.billing-filter-row,
.billing-filter-group,
.billing-filter-links,
.billing-pagination {
display: flex;
}
.billing-filter-row {
justify-content: space-between;
align-items: flex-start;
gap: 20px;
padding-bottom: 16px;
border-bottom: 1px solid var(--line);
}
.billing-filter-group {
flex-direction: column;
gap: 10px;
}
.billing-filter-links {
flex-wrap: wrap;
gap: 10px;
}
.billing-pagination {
justify-content: space-between;
align-items: center;
gap: 16px;
padding-top: 16px;
}
.pill-active {
background: rgba(44, 107, 255, 0.12);
border-color: rgba(44, 107, 255, 0.18);
color: var(--accent-strong);
}
.button-disabled {
pointer-events: none;
opacity: 0.55;
}
.billing-qr-block {
display: grid;
gap: 10px;
margin-top: 8px;
}
.billing-qr-image {
width: 180px;
height: 180px;
border-radius: 18px;
border: 1px solid var(--line);
background: white;
padding: 10px;
}
.pricing-card h3 {
margin: 12px 0 8px;
font-family: var(--font-display);
@@ -1399,7 +1506,7 @@ code {
.console-metrics-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 20px;
}
@@ -1441,6 +1548,18 @@ code {
padding: 30px;
}
.gateway-bind-stack {
display: grid;
gap: 18px;
}
.billing-nested-card {
padding: 24px;
border-radius: 24px;
background: linear-gradient(180deg, rgba(250, 251, 255, 0.96) 0%, rgba(255, 255, 255, 0.98) 100%);
box-shadow: none;
}
.console-key-list {
display: grid;
gap: 0;