{showSidebarLabels
?
{t(group.labelKey)}
: idx > 0 &&
}
diff --git a/src/features/plugins/PluginsPage.tsx b/src/features/plugins/PluginsPage.tsx
index 33bb100..a6b42ab 100644
--- a/src/features/plugins/PluginsPage.tsx
+++ b/src/features/plugins/PluginsPage.tsx
@@ -31,6 +31,17 @@ interface PluginConfigDraft {
errors: Record
;
}
+function PluginCardLogo({ src }: { src: string }) {
+ const [failed, setFailed] = useState(false);
+ const showImage = Boolean(src) && !failed;
+
+ return showImage ? (
+
setFailed(true)} />
+ ) : (
+
+ );
+}
+
const isRecord = (value: unknown): value is Record =>
value !== null && typeof value === 'object' && !Array.isArray(value);
@@ -701,7 +712,7 @@ export function PluginsPage() {
{/* Logo */}
- {logo ?

:
}
+
{/* Info */}
diff --git a/src/features/plugins/pluginResources.ts b/src/features/plugins/pluginResources.ts
index e4101cb..5d69524 100644
--- a/src/features/plugins/pluginResources.ts
+++ b/src/features/plugins/pluginResources.ts
@@ -4,6 +4,7 @@ import { normalizeApiBase } from '@/utils/connection';
export interface PluginResourceEntry {
pluginID: string;
pluginTitle: string;
+ pluginLogo: string;
menuIndex: number;
menu: PluginMenu;
label: string;
@@ -31,6 +32,7 @@ export const collectPluginResourceEntries = (
): PluginResourceEntry[] =>
plugins.flatMap((plugin) => {
const pluginTitle = getPluginTitle(plugin);
+ const pluginLogo = plugin.logo || plugin.metadata?.logo || '';
return plugin.menus
.map((menu, menuIndex): PluginResourceEntry | null => {
@@ -41,6 +43,7 @@ export const collectPluginResourceEntries = (
return {
pluginID: plugin.id,
pluginTitle,
+ pluginLogo,
menuIndex,
menu: { ...menu, path },
label: menuLabel || pluginTitle,
diff --git a/src/styles/layout.scss b/src/styles/layout.scss
index ee2dc50..dd2693c 100644
--- a/src/styles/layout.scss
+++ b/src/styles/layout.scss
@@ -498,6 +498,11 @@
gap: $spacing-xs;
}
+ .nav-group-bottom {
+ margin-top: auto;
+ padding-top: 12px;
+ }
+
.nav-group-label {
padding: 0 12px 4px;
font-size: 10.5px;
@@ -590,6 +595,14 @@
height: 18px;
display: block;
}
+
+ img {
+ display: block;
+ width: 18px;
+ height: 18px;
+ border-radius: 5px;
+ object-fit: cover;
+ }
}
.nav-text {