feat(admin): redesign identity review with dialogs

Replace inline identity review forms with focused detail and review dialogs, improve list filters and caching, and align evidence permissions and deletion feedback. Add contract and runtime regression coverage.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
kate522andClaude Fable 5 committed 2026-10-30 20:05:21 +08:00
1 parent 5732be847e
commit bc26d62602
9 files changed
+2222 -116

No files matched your search

+212
View File
@@ -0,0 +1,212 @@
/* 认证审核原生后台页。卡片、表单与颜色令牌继承 native-ui.css。 */
.aksrt-verify-page [hidden],
.aksrt-verify-dialog [hidden] { display: none !important; }
.aksrt-verify-toolbar {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 10px 18px;
padding: 14px 20px;
border-bottom: 1px solid var(--an-border-soft);
}
.aksrt-verify-toolbar__views {
display: flex;
flex: 1 1 620px;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 10px 18px;
}
.aksrt-verify-toolbar .subsubsub { margin: 0; padding: 0; box-shadow: none; }
.aksrt-verify-toolbar .aksrt-native-filters { flex: 0 1 auto; margin: 0; }
.aksrt-verify-toolbar .aksrt-native-filters input[type="search"] { min-width: 200px; }
.aksrt-verify-page .aksrt-verify-table { min-width: 1040px; table-layout: fixed; }
.aksrt-verify-table .column-user { width: 20%; }
.aksrt-verify-table .column-profile { width: 24%; }
.aksrt-verify-table .column-evidence { width: 10%; }
.aksrt-verify-table .column-status { width: 10%; }
.aksrt-verify-table .column-time { width: 18%; }
.aksrt-verify-table .column-actions { width: 18%; }
.aksrt-verify-page .aksrt-verify-table td { vertical-align: middle; overflow-wrap: anywhere; }
.aksrt-verify-summary {
display: -webkit-box;
max-height: 3.1em;
margin-top: 4px;
color: var(--an-text-2);
font-size: 12px;
line-height: 1.55;
overflow: hidden;
overflow-wrap: anywhere;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.aksrt-verify-sub { margin-top: 4px; color: var(--an-text-2); font-size: 12px; line-height: 1.55; overflow-wrap: anywhere; }
.aksrt-verify-row-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; }
.aksrt-verify-row-actions a,
.aksrt-verify-row-actions button { white-space: nowrap; }
.aksrt-verify-row-actions .button-link-delete { color: var(--an-danger); }
.aksrt-verify-page :is(a, button):focus-visible,
.aksrt-verify-dialog :is(a, button, input, textarea):focus-visible {
outline: 2px solid var(--an-primary);
outline-offset: 2px;
}
html.aksrt-verify-modal-open { overflow: hidden; }
.aksrt-verify-dialog {
width: min(760px, calc(100vw - 32px));
max-width: none;
max-height: calc(100vh - 40px);
max-height: calc(100dvh - 40px);
margin: auto;
padding: 0;
overflow: hidden;
color: var(--an-text-2);
background: var(--an-card);
border: 1px solid var(--an-border-soft);
border-radius: var(--an-radius);
box-shadow: var(--an-shadow-hover);
}
.aksrt-verify-dialog::backdrop { background: rgba(15, 23, 42, .45); }
.aksrt-verify-dialog__frame { display: flex; flex-direction: column; max-height: inherit; min-height: 0; margin: 0; }
.aksrt-verify-dialog__head {
display: flex;
flex: none;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
padding: 19px 24px 17px;
border-bottom: 1px solid var(--an-border-soft);
}
.aksrt-verify-dialog .aksrt-verify-dialog__head h2 {
margin: 0;
padding: 0;
color: var(--an-text);
font-size: 18px;
font-weight: 600;
line-height: 1.45;
}
.aksrt-verify-dialog__head p { margin: 5px 0 0; color: var(--an-text-2); font-size: 13px; line-height: 1.6; }
.aksrt-verify-dialog__head [data-aksrt-dialog-close] {
display: inline-flex;
flex: none;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
padding: 0;
color: var(--an-text-2);
background: transparent;
border: 0;
border-radius: var(--an-radius-sm);
cursor: pointer;
}
.aksrt-verify-dialog__head [data-aksrt-dialog-close]:hover { color: var(--an-text); background: var(--an-bg-soft); }
.aksrt-verify-dialog__body { min-height: 0; padding: 20px 24px; overflow-y: auto; overscroll-behavior: contain; }
.aksrt-verify-dialog__foot {
display: flex;
flex: none;
justify-content: flex-end;
gap: 8px;
padding: 14px 24px;
background: var(--an-card);
border-top: 1px solid var(--an-border-soft);
}
.aksrt-verify-dialog__foot .button { min-width: 116px; }
.aksrt-verify-dialog__foot .button.is-danger { color: var(--an-card); background: var(--an-danger); border-color: var(--an-danger); }
.aksrt-verify-dialog__foot .button.is-danger:hover { background: var(--an-danger); border-color: var(--an-danger); }
.aksrt-verify-dialog__foot .button:disabled { cursor: not-allowed; }
.aksrt-verify-applicant { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 12px; min-width: 0; margin: 0 0 18px; color: var(--an-text); font-size: 17px; font-weight: 600; line-height: 1.45; overflow-wrap: anywhere; }
.aksrt-verify-meta {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px 18px;
margin: 0;
padding: 14px 16px;
background: var(--an-bg-soft);
border-radius: var(--an-radius-sm);
}
.aksrt-verify-meta > div { min-width: 0; }
.aksrt-verify-meta dt { color: var(--an-text-2); font-size: 12px; line-height: 1.5; }
.aksrt-verify-meta dd { margin: 3px 0 0; color: var(--an-text); overflow-wrap: anywhere; }
.aksrt-verify-section { margin-top: 20px; }
.aksrt-verify-dialog .aksrt-verify-section h3,
.aksrt-verify-review > h3 {
margin: 0 0 9px;
padding: 0;
color: var(--an-text);
font-size: 14px;
font-weight: 600;
line-height: 1.45;
}
.aksrt-verify-copy { color: var(--an-text-2); line-height: 1.75; white-space: pre-wrap; overflow-wrap: anywhere; }
.aksrt-verify-evidence { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; margin: 0; padding: 0; list-style: none; }
.aksrt-verify-evidence li { min-width: 0; }
.aksrt-verify-evidence a {
display: flex;
align-items: center;
gap: 9px;
min-height: 52px;
padding: 7px 9px;
color: var(--an-text-2);
background: var(--an-bg-soft);
border: 1px solid var(--an-border-soft);
border-radius: var(--an-radius-sm);
text-decoration: none;
}
.aksrt-verify-evidence a:hover { color: var(--an-primary); border-color: var(--an-primary); }
.aksrt-verify-evidence img { flex: none; width: 38px; height: 38px; object-fit: cover; border-radius: 5px; }
.aksrt-verify-evidence span { min-width: 0; overflow-wrap: anywhere; }
.aksrt-verify-evidence-empty { margin: 0; color: var(--an-text-2); }
.aksrt-verify-review { margin-top: 22px; padding-top: 18px; border-top: 1px solid var(--an-border-soft); }
.aksrt-verify-decisions { display: flex; flex-wrap: wrap; gap: 10px; margin: 0 0 16px; padding: 0; border: 0; }
.aksrt-verify-decisions > legend { width: 100%; margin-bottom: 8px; padding: 0; color: var(--an-text); font-weight: 600; }
.aksrt-verify-decisions label { position: relative; flex: 1 1 180px; cursor: pointer; }
.aksrt-verify-decisions input[type="radio"] { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip-path: inset(50%); }
.aksrt-verify-decisions label > span {
display: flex;
align-items: center;
min-height: 42px;
padding: 9px 12px;
color: var(--an-text-2);
background: var(--an-card);
border: 1px solid var(--an-border);
border-radius: var(--an-radius-sm);
}
.aksrt-verify-decisions label:hover > span { border-color: var(--an-primary); }
.aksrt-verify-decisions input:checked + span { color: var(--an-primary); background: var(--an-primary-soft); border-color: var(--an-primary); font-weight: 600; }
.aksrt-verify-decisions input:focus-visible + span { outline: 2px solid var(--an-primary); outline-offset: 2px; }
.aksrt-verify-profile {
min-width: 0;
margin: 0 0 16px;
padding: 14px;
border: 1px solid var(--an-border);
border-radius: var(--an-radius-sm);
}
.aksrt-verify-profile > legend { padding: 0 5px; color: var(--an-text); font-weight: 600; }
.aksrt-verify-review .aksrt-native-field { margin-top: 13px; }
.aksrt-verify-review .aksrt-native-field > input,
.aksrt-verify-review .aksrt-native-field > textarea { width: 100%; max-width: none; }
.aksrt-verify-review textarea { resize: vertical; }
@media (max-width: 782px) {
.aksrt-verify-toolbar { padding: 12px 14px; }
.aksrt-verify-toolbar__views { flex: 1 1 100%; justify-content: flex-start; }
.aksrt-verify-toolbar .aksrt-native-filters { width: 100%; }
.aksrt-verify-toolbar .aksrt-native-filters input[type="search"] { min-width: 0; flex: 1 1 220px; }
}
@media (max-width: 600px) {
.aksrt-verify-dialog { width: calc(100vw - 24px); max-height: calc(100dvh - 24px); }
.aksrt-verify-dialog__head,
.aksrt-verify-dialog__body,
.aksrt-verify-dialog__foot { padding-left: 16px; padding-right: 16px; }
.aksrt-verify-meta { grid-template-columns: 1fr; gap: 10px; }
.aksrt-verify-evidence { grid-template-columns: 1fr; }
.aksrt-verify-decisions { flex-direction: column; }
.aksrt-verify-decisions label { flex-basis: auto; }
.aksrt-verify-dialog__foot .button { flex: 1; }
}