- {detail.versions.map((version) => (
-
-
-
- {version.version}
-
- {version.status}
-
- {isActiveReviewVersion(version, detail) ? (
-
- {t('review.activeReviewVersion')}
-
- ) : null}
-
- {version.changelog ? (
-
{version.changelog}
- ) : null}
-
-
- {t('skillDetail.fileCount', { count: version.fileCount })}
+
+ {documentation ? (
+
+
{documentation.path}
+
+
- ))}
-
- ) : (
-
- {t('skillDetail.noVersions')}
-
- )}
-
-
+ ) : (
+
+ {t('review.noDocumentation')}
+
+ )}
+
+
+
+ {detail.files.length > 0 ? (
+
+ ) : (
+
+ {t('skillDetail.noFiles')}
+
+ )}
+
+
+
+ {detail.versions.length > 0 ? (
+
+ {detail.versions.map((version) => (
+
+
+
+ {version.version}
+
+ {version.status}
+
+ {isActiveReviewVersion(version, detail) ? (
+
+ {t('review.activeReviewVersion')}
+
+ ) : null}
+
+ {version.changelog ? (
+
{version.changelog}
+ ) : null}
+
+
+ {t('skillDetail.fileCount', { count: version.fileCount })}
+
+
+ ))}
+
+ ) : (
+
+ {t('skillDetail.noVersions')}
+
+ )}
+
+
+
+
+
+
+
+ ) : (
+
+
+
+ )}
)
}
diff --git a/web/src/pages/dashboard/review-detail.test.tsx b/web/src/pages/dashboard/review-detail.test.tsx
index a925db1e..b6cbece2 100644
--- a/web/src/pages/dashboard/review-detail.test.tsx
+++ b/web/src/pages/dashboard/review-detail.test.tsx
@@ -110,10 +110,10 @@ describe('ReviewDetailPage', () => {
navigateMock.mockReset()
})
- it('uses a two-column desktop layout that keeps moderation controls in a sticky sidebar', () => {
+ it('keeps the page in a single-column flow and leaves the skill detail behind a collapsed section', () => {
const html = renderToStaticMarkup(
)
- expect(html).toContain('xl:grid xl:grid-cols-[minmax(0,24rem)_minmax(0,1fr)]')
- expect(html).toContain('xl:sticky xl:top-6')
+ expect(html).toContain('max-w-3xl animate-fade-up')
+ expect(html).toContain('aria-expanded="false"')
})
})
diff --git a/web/src/pages/dashboard/review-detail.tsx b/web/src/pages/dashboard/review-detail.tsx
index 5a5c1b07..4079d31d 100644
--- a/web/src/pages/dashboard/review-detail.tsx
+++ b/web/src/pages/dashboard/review-detail.tsx
@@ -62,8 +62,6 @@ export function ReviewDetailPage() {
}
const handleReject = async () => {
- // Rejections require explicit operator feedback so submitters can understand
- // what must change before the package is resubmitted.
if (!comment.trim()) {
toast.error(t('review.rejectReasonRequired'))
return
@@ -89,7 +87,7 @@ export function ReviewDetailPage() {
}
return (
-
+
{t('review.detail')}
@@ -100,129 +98,127 @@ export function ReviewDetailPage() {
-
+
+
+
+
+
{review.namespace}/{review.skillSlug}
+
+
+
+
+
+ {review.version}
+
+
+
+
+
+
+ {review.status === 'PENDING' && (
+ {t('review.statusPending')}
+ )}
+ {review.status === 'APPROVED' && (
+ {t('review.statusApproved')}
+ )}
+ {review.status === 'REJECTED' && (
+ {t('review.statusRejected')}
+ )}
+
+
+
+
+
{review.submittedByName || review.submittedBy}
+
+
+
+
{formatDate(review.submittedAt)}
+
+ {review.reviewedBy && (
+ <>
+
+
+
{review.reviewedByName || review.reviewedBy}
+
+
+
+
+ {review.reviewedAt ? formatDate(review.reviewedAt) : '—'}
+
+
+ >
+ )}
+
+
+ {review.reviewComment && (
+
+
+
{review.reviewComment}
+
+ )}
+
+
+ {review.status === 'PENDING' && (
-
-
-
-
{review.namespace}/{review.skillSlug}
-
-
-
-
-
- {review.version}
-
-
-
-
-
-
- {review.status === 'PENDING' && (
- {t('review.statusPending')}
- )}
- {review.status === 'APPROVED' && (
- {t('review.statusApproved')}
- )}
- {review.status === 'REJECTED' && (
- {t('review.statusRejected')}
- )}
-
-
-
-
-
{review.submittedByName || review.submittedBy}
-
-
-
-
{formatDate(review.submittedAt)}
-
- {review.reviewedBy && (
+
{t('review.actions')}
+
+
+
+
+
+
+
+ {!showRejectForm ? (
+
+ ) : (
<>
-
-
-
{review.reviewedByName || review.reviewedBy}
-
-
-
-
- {review.reviewedAt ? formatDate(review.reviewedAt) : '—'}
-
-
+
+
>
)}
- {review.reviewComment && (
-
-
-
{review.reviewComment}
-
+ {showRejectForm && !comment.trim() && (
+
{t('review.rejectReasonRequired')}
)}
-
- {review.status === 'PENDING' && (
-
- {t('review.actions')}
-
-
-
-
-
-
-
- {!showRejectForm ? (
-
- ) : (
- <>
-
-
- >
- )}
-
-
- {showRejectForm && !comment.trim() && (
- {t('review.rejectReasonRequired')}
- )}
-
- )}
-
+ )}