fix: separate HWID device renewal flows

Keep one-off device top-ups scoped to the active subscription term and move device renewal into subscription checkout.

Carry HWID renewal metadata through provider callbacks and webhooks, including YooKassa saved-card flows.

Add admin extension controls, docs, demo data, and regression coverage.
This commit is contained in:
3252a8
2026-06-03 23:51:46 +03:00
parent a06884d816
commit fbb89793cb
48 changed files with 2410 additions and 224 deletions
+31
View File
@@ -4288,6 +4288,37 @@
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 20%, transparent);
}
.admin-extend-hwid-option {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
gap: 10px;
align-items: flex-start;
padding: 10px 12px;
border: 1px solid var(--admin-border);
border-radius: 8px;
background: var(--admin-surface-2);
color: var(--admin-text);
cursor: pointer;
}
.admin-extend-hwid-option > span {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.admin-extend-hwid-option strong {
font-size: 13px;
font-weight: 600;
}
.admin-extend-hwid-option small {
color: var(--admin-muted);
font-size: 12px;
line-height: 1.35;
}
.admin-input-row {
display: grid;
grid-template-columns: minmax(72px, 1fr) auto;
+37
View File
@@ -1189,6 +1189,43 @@ a {
overflow-wrap: anywhere;
}
.hwid-renewal-option {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
gap: 10px;
align-items: flex-start;
padding: 11px 12px;
border: 1px solid color-mix(in srgb, var(--accent) 34%, var(--border));
border-radius: var(--radius);
background: color-mix(in srgb, var(--accent) 8%, var(--surface-muted));
box-shadow: inset 0 1px 0 var(--inset-highlight);
cursor: pointer;
}
.hwid-renewal-option > span {
display: grid;
min-width: 0;
gap: 4px;
}
.hwid-renewal-option strong {
color: var(--text);
font-size: 12px;
line-height: 1.35;
overflow-wrap: anywhere;
}
.hwid-renewal-option small {
color: var(--muted);
font-size: 11px;
line-height: 1.35;
overflow-wrap: anywhere;
}
.hwid-renewal-option .hwid-renewal-warning {
color: var(--warning-text, var(--warning));
}
.skeleton-row,
.skeleton-method,
.skeleton-pay-button {