From 4478fb22ba832f5a0a879e130f2b88b8a7bc6b91 Mon Sep 17 00:00:00 2001
From: Jesse Merhi <79823012+jesse-merhi@users.noreply.github.com>
Date: Mon, 10 Aug 2026 15:40:35 +1000
Subject: [PATCH] perf(ui): stabilize install warning bundle
---
ui/src/i18n/locales/en.ts | 5 --
ui/src/pages/plugins/view.ts | 121 +++++++++++++----------------------
ui/src/styles/plugins.css | 65 ++++++++-----------
3 files changed, 71 insertions(+), 120 deletions(-)
diff --git a/ui/src/i18n/locales/en.ts b/ui/src/i18n/locales/en.ts
index 99a00c64e41f..a17ff5f65284 100644
--- a/ui/src/i18n/locales/en.ts
+++ b/ui/src/i18n/locales/en.ts
@@ -2798,14 +2798,9 @@ export const en: TranslationMap = {
acknowledgeRisk: "Acknowledge risk and install",
defaultRiskWarning: "Review the ClawHub warning before installing this plugin.",
policyReviewTitle: "Security review needed",
- policyReviewBodyUnknown: "Policy flagged this plugin. Not installed.",
policyReviewBodyKnown: "Policy warnings: {count}. Not installed.",
policyReviewFindings: "Findings",
policyReviewTechnicalDetails: "Details",
- policyReviewPolicyResponse: "Reason",
- policyReviewRule: "Rule {count}",
- policyReviewLocation: "Location",
- policyReviewEvidence: "Evidence",
installAnyway: "Install anyway",
connectToChange: "Connect to the gateway to change plugins.",
adminRequired: "Browsing only. Plugin changes require operator.admin access.",
diff --git a/ui/src/pages/plugins/view.ts b/ui/src/pages/plugins/view.ts
index 2d0161ce7611..42d9a4800a0d 100644
--- a/ui/src/pages/plugins/view.ts
+++ b/ui/src/pages/plugins/view.ts
@@ -389,7 +389,7 @@ function renderRowMessage(
const findings = details.findings ?? [];
const reviewBody =
findings.length === 0
- ? t("pluginsPage.policyReviewBodyUnknown")
+ ? details.reason
: t("pluginsPage.policyReviewBodyKnown", { count: String(findings.length) });
return html`
@@ -405,26 +405,15 @@ function renderRowMessage(
${findings.length > 0
? html`
-
- ${t("pluginsPage.policyReviewFindings")}
-
+ ${t("pluginsPage.policyReviewFindings")}
- ${findings.map(
- (finding) => html`
- -
-
- ${finding.message}
-
- `,
- )}
+ ${findings.map((finding) => html` - ${finding.message}
`)}
`
- : html`
-
- `}
+ : nothing}
${findings.length > 0
? html`
@@ -434,67 +423,49 @@ function renderRowMessage(
>
${t("pluginsPage.policyReviewTechnicalDetails")}
-
-
-
- ${t("pluginsPage.policyReviewPolicyResponse")}
- - ${details.reason}
-
- ${findings.map(
- (finding, index) => html`
-
-
- ${t("pluginsPage.policyReviewRule", { count: String(index + 1) })}
- ${finding.ruleId}
-
- ${finding.file
- ? html`
-
-
- ${t("pluginsPage.policyReviewLocation")}
- -
-
${finding.file}${finding.line ? `:${finding.line}` : ""}
-
-
- `
- : nothing}
- ${finding.evidence
- ? html`
-
-
- ${t("pluginsPage.policyReviewEvidence")}
- - ${finding.evidence}
-
- `
- : nothing}
- `,
- )}
-
+
+
${details.reason}
+
+ ${findings.map(
+ (finding) => html`
+ -
+
${finding.ruleId}
+ ${finding.file
+ ? html`${finding.file}${finding.line ? `:${finding.line}` : ""}`
+ : nothing}
+ ${finding.evidence ? html`${finding.evidence}` : nothing}
+
+ `,
+ )}
+
+
`
: nothing}
-
`;
diff --git a/ui/src/styles/plugins.css b/ui/src/styles/plugins.css
index 36b1a3d919b9..1f14de9fa8ca 100644
--- a/ui/src/styles/plugins.css
+++ b/ui/src/styles/plugins.css
@@ -520,10 +520,6 @@ h3.plugins-subheader {
}
.plugins-policy-review__findings-heading {
- display: flex;
- align-items: center;
- justify-content: flex-start;
- gap: var(--space-2);
color: var(--text-strong);
font-weight: 600;
}
@@ -544,21 +540,18 @@ h3.plugins-subheader {
color: var(--text);
}
-.plugins-policy-review__findings li + li {
- margin-top: var(--space-2);
-}
-
-.plugins-policy-review__finding-mark {
+.plugins-policy-review__findings li::before {
width: 7px;
height: 7px;
margin-top: 6px;
border-radius: var(--radius-full);
background: var(--warn);
+ content: "";
justify-self: center;
}
-.plugins-policy-review__reason {
- margin: 0;
+.plugins-policy-review__findings li + li {
+ margin-top: var(--space-2);
}
.plugins-policy-review__details {
@@ -612,24 +605,30 @@ h3.plugins-subheader {
box-shadow: var(--focus-ring);
}
-.plugins-policy-review__details dl {
+.plugins-policy-review__details-body {
display: grid;
- grid-template-columns: repeat(2, minmax(0, 1fr));
gap: var(--space-2);
margin: var(--space-2) 0 0;
}
-.plugins-policy-review__details dl > div {
- min-width: 0;
-}
-
-.plugins-policy-review__details dt {
- margin-bottom: 2px;
-}
-
-.plugins-policy-review__details dd {
- overflow-wrap: anywhere;
+.plugins-policy-review__details-body p,
+.plugins-policy-review__details-body ul {
margin: 0;
+}
+
+.plugins-policy-review__details-body ul {
+ display: grid;
+ gap: var(--space-2);
+ padding: 0;
+ list-style: none;
+}
+
+.plugins-policy-review__details-body li {
+ display: flex;
+ min-width: 0;
+ flex-wrap: wrap;
+ gap: var(--space-2);
+ overflow-wrap: anywhere;
color: var(--text);
}
@@ -637,22 +636,17 @@ h3.plugins-subheader {
font-size: inherit;
}
-.plugins-policy-review__footer {
+.plugins-policy-review__actions {
display: flex;
align-items: center;
- justify-content: space-between;
+ justify-content: flex-end;
gap: var(--space-3);
padding: var(--space-2) 0 0 var(--plugins-policy-review-indent);
border-top: 1px solid color-mix(in srgb, var(--warn) 20%, var(--border));
}
-.plugins-policy-review__actions {
- display: flex;
- flex: 0 0 auto;
- gap: var(--space-2);
-}
-
.plugins-policy-review__actions .btn {
+ flex: 0 0 auto;
min-height: 44px;
}
@@ -915,15 +909,6 @@ h3.plugins-subheader {
padding: var(--space-2) 0 0;
}
- .plugins-policy-review__details dl {
- grid-template-columns: minmax(0, 1fr);
- }
-
- .plugins-policy-review__footer {
- align-items: stretch;
- flex-direction: column;
- }
-
.plugins-policy-review__actions,
.plugins-policy-review__actions .btn {
flex: 1 1 0;