+ {/* Decorative. Only when expanded and the window is tall enough: the sidebar clips what does not fit,
+ and Docs and Support must stay visible */}
+ {isOpen && (
+

+ )}
{/* Separator before Support/Docs */}
diff --git a/src/locales/ar.json b/src/locales/ar.json
index 9149276..5172010 100644
--- a/src/locales/ar.json
+++ b/src/locales/ar.json
@@ -54,6 +54,10 @@
"trigger_event": "تشغيل الحدث",
"resources": "الموارد",
"no_resources": "لم يتم العثور على موارد",
+ "matching_resources": "الموارد المطابقة",
+ "matching_resources_count": "الموارد المطابقة: {{count}}",
+ "matching_resources_no_match": "لا توجد موارد مطابقة لهذه المرشحات.",
+ "matching_resources_error": "تعذّر تحميل الموارد المطابقة.",
"running": "جاري التشغيل",
"no_resource_selectors": "لم يتم تحديد محددات الموارد.",
"resource_selector": "محدد الموارد",
diff --git a/src/locales/en.json b/src/locales/en.json
index b56c4c4..c63e566 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -54,6 +54,10 @@
"trigger_event": "Trigger Event",
"resources": "Resources",
"no_resources": "No resources found",
+ "matching_resources": "Matching resources",
+ "matching_resources_count": "Matching resources: {{count}}",
+ "matching_resources_no_match": "No matching resources for the filters.",
+ "matching_resources_error": "The matching resources could not be loaded.",
"running": "Running",
"no_resource_selectors": "No resource selectors defined.",
"resource_selector": "Resource Selector",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index e6c64a2..d0abe23 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -55,6 +55,10 @@
"trigger_event": "Déclencher l'événement",
"resources": "Ressources",
"no_resources": "Aucune ressource trouvée",
+ "matching_resources": "Ressources correspondantes",
+ "matching_resources_count": "Ressources correspondantes : {{count}}",
+ "matching_resources_no_match": "Aucune ressource correspondante pour ces filtres.",
+ "matching_resources_error": "Les ressources correspondantes n'ont pas pu être chargées.",
"running": "En cours",
"no_resource_selectors": "Aucun sélecteur de ressource défini.",
"resource_selector": "Sélecteur de ressource",
diff --git a/src/modules/enterprise/EnterprisePage.tsx b/src/modules/enterprise/EnterprisePage.tsx
index 9ec57e0..e856065 100644
--- a/src/modules/enterprise/EnterprisePage.tsx
+++ b/src/modules/enterprise/EnterprisePage.tsx
@@ -8,6 +8,10 @@ import {
CheckCircle2,
Zap,
CalendarDays,
+ HeartPulse,
+ Lock,
+ PackageCheck,
+ Compass,
} from "lucide-react";
import { Button } from "@/lib/components/ui/inputs/button";
import { Logo } from "@/lib/components/assets/logo/logo";
@@ -59,6 +63,22 @@ const FEATURES: Feature[] = [
tag: "Deployment",
href: "https://projectsveltos.io/latest/deployment_order/progressive_rollout/",
},
+ {
+ title: "Job-Based Health Validation",
+ description:
+ "Run a Kubernetes Job after a deployment, such as a smoke test or a connectivity probe, and use its outcome as the health check.",
+ icon: HeartPulse,
+ tag: "Health",
+ href: "https://projectsveltos.io/latest/addons/clusterprofile/#job-based-health-validation",
+ },
+ {
+ title: "Least-Privilege Agents",
+ description:
+ "Limit drift detection and the agents to specific namespaces instead of cluster-wide access. One annotation configures both.",
+ icon: Lock,
+ tag: "Security",
+ href: "https://projectsveltos.io/latest/features/configuration_drift/#namespace-scoped-watch-mode",
+ },
{
title: "AI-Powered Management",
description:
@@ -79,6 +99,22 @@ const FEATURES: Feature[] = [
tag: "Support",
href: "https://website.projectsveltos.io/pricing/",
},
+ {
+ title: "Priority Patches & Feature Delivery",
+ description:
+ "CVE-patched images before the next release, with your bug fixes and feature requests prioritized.",
+ icon: PackageCheck,
+ tag: "Support",
+ href: "https://website.projectsveltos.io/pricing/",
+ },
+ {
+ title: "Architectural Guidance",
+ description:
+ "Expert guidance on architecture and best practices for running Sveltos in production.",
+ icon: Compass,
+ tag: "Support",
+ href: "https://website.projectsveltos.io/pricing/",
+ },
];
const TRUST_ITEMS = [
diff --git a/src/modules/events/event-details/components/ClusterMatchCard.tsx b/src/modules/events/event-details/components/ClusterMatchCard.tsx
index 6fa65f0..f3f406c 100644
--- a/src/modules/events/event-details/components/ClusterMatchCard.tsx
+++ b/src/modules/events/event-details/components/ClusterMatchCard.tsx
@@ -1,13 +1,14 @@
import { useNavigate } from "react-router-dom";
import { ExternalLink } from "lucide-react";
import { Button } from "@/lib/components/ui/inputs/button";
-import { ClusterEventMatch, Resource } from "@/types/event.types";
+import { ClusterEventMatch } from "@/types/event.types";
import { Badge } from "@/lib/components/ui/data-display/badge";
import { FailedFlag } from "@/lib/components/ui/data-display/failed-flag";
import { ReadyFlag } from "@/lib/components/ui/data-display/ready-flag";
import { useTranslation } from "react-i18next";
import { McpButton } from "@/lib/components/ui/inputs/mcp-button";
import * as React from "react";
+import { EventResourcesDialog } from "@/modules/events/event-details/components/EventResourcesDialog";
import { useEventClusterDebugMcp } from "@/modules/events/hooks/debugMcp";
import { typeFromPath } from "@/utils/GetPathFromType";
import { getClusterInfoType } from "@/utils/GetClusterInfoType";
@@ -21,6 +22,7 @@ export const ClusterMatchCard = ({
}) => {
const { t } = useTranslation();
const navigate = useNavigate();
+ const [resourcesOpen, setResourcesOpen] = React.useState(false);
const McpQuery = useEventClusterDebugMcp({
namespace: cluster.clusterNamespace,
@@ -59,27 +61,31 @@ export const ClusterMatchCard = ({