@geminilight/mindos 0.6.17 → 0.6.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/components/ActivityBar.tsx +8 -5
- package/app/components/JsonView.tsx +2 -5
- package/app/components/Panel.tsx +0 -1
- package/app/components/SidebarLayout.tsx +10 -0
- package/app/components/UpdateOverlay.tsx +6 -6
- package/app/components/agents/AgentDetailContent.tsx +2 -2
- package/app/components/agents/AgentsMcpSection.tsx +2 -2
- package/app/components/agents/AgentsOverviewSection.tsx +11 -11
- package/app/components/agents/AgentsPrimitives.tsx +14 -14
- package/app/components/agents/AgentsSkillsSection.tsx +1 -1
- package/app/components/agents/SkillDetailPopover.tsx +1 -1
- package/app/components/ask/MessageList.tsx +1 -1
- package/app/components/panels/EchoPanel.tsx +7 -7
- package/app/components/renderers/summary/SummaryRenderer.tsx +1 -1
- package/package.json +1 -1
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
import { useRef, useCallback, useState, useEffect } from 'react';
|
|
4
4
|
import Link from 'next/link';
|
|
5
|
-
import { FolderTree, Search, Settings, RefreshCw, Bot, Compass, HelpCircle, ChevronLeft, ChevronRight, Radio
|
|
5
|
+
import { FolderTree, Search, Settings, RefreshCw, Bot, Compass, HelpCircle, ChevronLeft, ChevronRight, Radio } from 'lucide-react';
|
|
6
6
|
import { useLocale } from '@/lib/LocaleContext';
|
|
7
7
|
import { DOT_COLORS, getStatusLevel } from './SyncStatusBar';
|
|
8
8
|
import type { SyncStatus } from './settings/SyncTab';
|
|
9
9
|
import Logo from './Logo';
|
|
10
10
|
|
|
11
|
-
export type PanelId = 'files' | 'search' | 'echo' | 'agents' | 'discover'
|
|
11
|
+
export type PanelId = 'files' | 'search' | 'echo' | 'agents' | 'discover';
|
|
12
12
|
|
|
13
13
|
export const RAIL_WIDTH_COLLAPSED = 48;
|
|
14
14
|
export const RAIL_WIDTH_EXPANDED = 180;
|
|
@@ -16,7 +16,9 @@ export const RAIL_WIDTH_EXPANDED = 180;
|
|
|
16
16
|
interface ActivityBarProps {
|
|
17
17
|
activePanel: PanelId | null;
|
|
18
18
|
onPanelChange: (id: PanelId | null) => void;
|
|
19
|
+
onEchoClick?: () => void;
|
|
19
20
|
onAgentsClick?: () => void;
|
|
21
|
+
onDiscoverClick?: () => void;
|
|
20
22
|
syncStatus: SyncStatus | null;
|
|
21
23
|
expanded: boolean;
|
|
22
24
|
onExpandedChange: (expanded: boolean) => void;
|
|
@@ -77,7 +79,9 @@ function RailButton({ icon, label, shortcut, active = false, expanded, onClick,
|
|
|
77
79
|
export default function ActivityBar({
|
|
78
80
|
activePanel,
|
|
79
81
|
onPanelChange,
|
|
82
|
+
onEchoClick,
|
|
80
83
|
onAgentsClick,
|
|
84
|
+
onDiscoverClick,
|
|
81
85
|
syncStatus,
|
|
82
86
|
expanded,
|
|
83
87
|
onExpandedChange,
|
|
@@ -188,7 +192,7 @@ export default function ActivityBar({
|
|
|
188
192
|
<div className={`flex flex-col ${expanded ? 'px-1.5' : 'items-center'} gap-1 py-2`}>
|
|
189
193
|
<RailButton icon={<FolderTree size={18} />} label={t.sidebar.files} active={activePanel === 'files'} expanded={expanded} onClick={() => toggle('files')} walkthroughId="files-panel" />
|
|
190
194
|
<RailButton icon={<Search size={18} />} label={t.sidebar.searchTitle} shortcut="⌘K" active={activePanel === 'search'} expanded={expanded} onClick={() => toggle('search')} />
|
|
191
|
-
<RailButton icon={<Radio size={18} />} label={t.sidebar.echo} active={activePanel === 'echo'} expanded={expanded} onClick={() => toggle('echo')} walkthroughId="echo-panel" />
|
|
195
|
+
<RailButton icon={<Radio size={18} />} label={t.sidebar.echo} active={activePanel === 'echo'} expanded={expanded} onClick={() => onEchoClick ? debounced(onEchoClick) : toggle('echo')} walkthroughId="echo-panel" />
|
|
192
196
|
<RailButton
|
|
193
197
|
icon={<Bot size={18} />}
|
|
194
198
|
label={t.sidebar.agents}
|
|
@@ -197,8 +201,7 @@ export default function ActivityBar({
|
|
|
197
201
|
onClick={() => onAgentsClick ? debounced(onAgentsClick) : toggle('agents')}
|
|
198
202
|
walkthroughId="agents-panel"
|
|
199
203
|
/>
|
|
200
|
-
<RailButton icon={<Compass size={18} />} label={t.sidebar.discover} active={activePanel === 'discover'} expanded={expanded} onClick={() => toggle('discover')} />
|
|
201
|
-
<RailButton icon={<History size={18} />} label={t.sidebar.history} active={activePanel === 'history'} expanded={expanded} onClick={() => toggle('history')} />
|
|
204
|
+
<RailButton icon={<Compass size={18} />} label={t.sidebar.discover} active={activePanel === 'discover'} expanded={expanded} onClick={() => onDiscoverClick ? debounced(onDiscoverClick) : toggle('discover')} />
|
|
202
205
|
</div>
|
|
203
206
|
|
|
204
207
|
{/* ── Spacer ── */}
|
|
@@ -16,11 +16,8 @@ export default function JsonView({ content }: JsonViewProps) {
|
|
|
16
16
|
}, [content]);
|
|
17
17
|
|
|
18
18
|
return (
|
|
19
|
-
<pre
|
|
20
|
-
|
|
21
|
-
suppressHydrationWarning
|
|
22
|
-
>
|
|
23
|
-
<code>{pretty}</code>
|
|
19
|
+
<pre className="rounded-xl border border-border bg-card px-4 py-3 overflow-x-auto text-sm leading-relaxed font-display">
|
|
20
|
+
<code suppressHydrationWarning>{pretty}</code>
|
|
24
21
|
</pre>
|
|
25
22
|
);
|
|
26
23
|
}
|
package/app/components/Panel.tsx
CHANGED
|
@@ -345,12 +345,22 @@ export default function SidebarLayout({ fileTree, children }: SidebarLayoutProps
|
|
|
345
345
|
<ActivityBar
|
|
346
346
|
activePanel={railActivePanel}
|
|
347
347
|
onPanelChange={lp.setActivePanel}
|
|
348
|
+
onEchoClick={() => {
|
|
349
|
+
const wasActive = lp.activePanel === 'echo';
|
|
350
|
+
lp.setActivePanel(wasActive ? null : 'echo');
|
|
351
|
+
if (!wasActive) router.push('/echo/about-you');
|
|
352
|
+
}}
|
|
348
353
|
onAgentsClick={() => {
|
|
349
354
|
const wasActive = lp.activePanel === 'agents';
|
|
350
355
|
lp.setActivePanel(wasActive ? null : 'agents');
|
|
351
356
|
if (!wasActive) router.push('/agents');
|
|
352
357
|
setAgentDetailKey(null);
|
|
353
358
|
}}
|
|
359
|
+
onDiscoverClick={() => {
|
|
360
|
+
const wasActive = lp.activePanel === 'discover';
|
|
361
|
+
lp.setActivePanel(wasActive ? null : 'discover');
|
|
362
|
+
if (!wasActive) router.push('/explore');
|
|
363
|
+
}}
|
|
354
364
|
syncStatus={syncStatus}
|
|
355
365
|
expanded={lp.railExpanded}
|
|
356
366
|
onExpandedChange={handleExpandedChange}
|
|
@@ -97,21 +97,21 @@ export default function UpdateOverlay() {
|
|
|
97
97
|
>
|
|
98
98
|
{done ? (
|
|
99
99
|
<>
|
|
100
|
-
<CheckCircle2 size={32} style={{ color: '
|
|
101
|
-
<div style={{ color: '
|
|
100
|
+
<CheckCircle2 size={32} style={{ color: 'var(--success)', marginBottom: 12 }} />
|
|
101
|
+
<div style={{ color: 'var(--foreground)', fontSize: 18, fontWeight: 600 }}>
|
|
102
102
|
{zh ? '更新成功!' : 'Update Complete!'}
|
|
103
103
|
</div>
|
|
104
|
-
<div style={{ color: '
|
|
104
|
+
<div style={{ color: 'var(--muted-foreground)', fontSize: 13, marginTop: 6 }}>
|
|
105
105
|
{zh ? '正在刷新页面...' : 'Reloading...'}
|
|
106
106
|
</div>
|
|
107
107
|
</>
|
|
108
108
|
) : (
|
|
109
109
|
<>
|
|
110
|
-
<Loader2 size={32} style={{ color: '
|
|
111
|
-
<div style={{ color: '
|
|
110
|
+
<Loader2 size={32} style={{ color: 'var(--amber)', marginBottom: 12, animation: 'spin 1s linear infinite' }} />
|
|
111
|
+
<div style={{ color: 'var(--foreground)', fontSize: 18, fontWeight: 600 }}>
|
|
112
112
|
{zh ? 'MindOS 正在更新...' : 'MindOS is Updating...'}
|
|
113
113
|
</div>
|
|
114
|
-
<div style={{ color: '
|
|
114
|
+
<div style={{ color: 'var(--muted-foreground)', fontSize: 13, marginTop: 6, textAlign: 'center', maxWidth: 300, lineHeight: 1.5 }}>
|
|
115
115
|
{zh
|
|
116
116
|
? '服务正在重启,请勿关闭此页面。完成后将自动刷新。'
|
|
117
117
|
: 'The server is restarting. Please do not close this page. It will auto-reload when ready.'}
|
|
@@ -243,9 +243,9 @@ export default function AgentDetailContent({ agentKey }: { agentKey: string }) {
|
|
|
243
243
|
<h1 className="text-lg font-semibold tracking-tight font-display text-foreground truncate">{agent.name}</h1>
|
|
244
244
|
<div className="flex flex-wrap items-center gap-x-2 gap-y-0.5 mt-0.5 text-2xs text-muted-foreground/60">
|
|
245
245
|
<span className={`font-medium px-1.5 py-px rounded-full ${
|
|
246
|
-
status === 'connected' ? 'bg-
|
|
246
|
+
status === 'connected' ? 'bg-muted text-muted-foreground'
|
|
247
247
|
: status === 'detected' ? 'bg-[var(--amber-subtle)] text-[var(--amber-text)]'
|
|
248
|
-
: 'bg-
|
|
248
|
+
: 'bg-error/10 text-error'
|
|
249
249
|
}`}>{status}</span>
|
|
250
250
|
<span className="font-mono">{agent.transport ?? agent.preferredTransport}</span>
|
|
251
251
|
<span className="text-muted-foreground/25" aria-hidden="true">·</span>
|
|
@@ -296,7 +296,7 @@ function ByAgentView({
|
|
|
296
296
|
const mcpServers = agent.configuredMcpServers ?? [];
|
|
297
297
|
const nativeSkillCount = (agent.installedSkillNames ?? []).length;
|
|
298
298
|
return (
|
|
299
|
-
<div key={agent.key} className={`rounded-xl border bg-card group hover:shadow-[0_2px_8px_rgba(0,0,0,0.04)] transition-all duration-150 ${status === '
|
|
299
|
+
<div key={agent.key} className={`rounded-xl border bg-card group hover:shadow-[0_2px_8px_rgba(0,0,0,0.04)] transition-all duration-150 ${status === 'detected' ? 'border-l-2 border-l-[var(--amber)] border-border' : status === 'notFound' ? 'border-l-2 border-l-error border-border' : 'border-border'}`}>
|
|
300
300
|
{/* Card header with avatar */}
|
|
301
301
|
<div className="flex items-center gap-3 p-3">
|
|
302
302
|
<AgentAvatar name={agent.name} status={status} />
|
|
@@ -306,7 +306,7 @@ function ByAgentView({
|
|
|
306
306
|
{agent.name}
|
|
307
307
|
</Link>
|
|
308
308
|
<span className="text-2xs text-muted-foreground font-mono shrink-0">{agent.transport ?? agent.preferredTransport}</span>
|
|
309
|
-
<span className={`text-2xs px-1.5 py-0.5 rounded shrink-0 ${status === 'connected' ? 'bg-
|
|
309
|
+
<span className={`text-2xs px-1.5 py-0.5 rounded shrink-0 ${status === 'connected' ? 'bg-muted text-muted-foreground' : status === 'detected' ? 'bg-[var(--amber-dim)] text-[var(--amber-text)]' : 'bg-error/10 text-error'}`}>
|
|
310
310
|
{copy.status[status]}
|
|
311
311
|
</span>
|
|
312
312
|
</div>
|
|
@@ -269,15 +269,15 @@ function StatCell({
|
|
|
269
269
|
: 'text-muted-foreground';
|
|
270
270
|
const iconColor =
|
|
271
271
|
tone === 'ok'
|
|
272
|
-
? 'text-
|
|
272
|
+
? 'text-[var(--success)]/70'
|
|
273
273
|
: tone === 'warn'
|
|
274
|
-
? 'text-amber
|
|
274
|
+
? 'text-[var(--amber)]/70'
|
|
275
275
|
: 'text-muted-foreground/40';
|
|
276
276
|
const hoverBg =
|
|
277
277
|
tone === 'ok'
|
|
278
|
-
? 'hover:bg-
|
|
278
|
+
? 'hover:bg-muted/20'
|
|
279
279
|
: tone === 'warn'
|
|
280
|
-
? 'hover:bg-amber
|
|
280
|
+
? 'hover:bg-[var(--amber)]/[0.04]'
|
|
281
281
|
: 'hover:bg-muted/20';
|
|
282
282
|
|
|
283
283
|
return (
|
|
@@ -335,8 +335,8 @@ function QuickNavCard({
|
|
|
335
335
|
<span
|
|
336
336
|
className={`text-2xs px-2 py-0.5 rounded-full font-medium select-none ${
|
|
337
337
|
statTone === 'ok'
|
|
338
|
-
? 'bg-
|
|
339
|
-
: 'bg-amber-
|
|
338
|
+
? 'bg-muted text-muted-foreground'
|
|
339
|
+
: 'bg-[var(--amber-dim)] text-[var(--amber-text)]'
|
|
340
340
|
}`}
|
|
341
341
|
>
|
|
342
342
|
{stat}
|
|
@@ -373,10 +373,10 @@ function AgentCard({
|
|
|
373
373
|
status === 'connected' ? copy.connected : status === 'detected' ? copy.detected : copy.notFound;
|
|
374
374
|
const statusColor =
|
|
375
375
|
status === 'connected'
|
|
376
|
-
? 'bg-
|
|
376
|
+
? 'bg-muted text-muted-foreground'
|
|
377
377
|
: status === 'detected'
|
|
378
|
-
? 'bg-amber-
|
|
379
|
-
: 'bg-
|
|
378
|
+
? 'bg-[var(--amber-dim)] text-[var(--amber-text)]'
|
|
379
|
+
: 'bg-error/10 text-error';
|
|
380
380
|
|
|
381
381
|
return (
|
|
382
382
|
<Link
|
|
@@ -410,10 +410,10 @@ function AgentCard({
|
|
|
410
410
|
<span className="flex-1 min-w-[4px]" />
|
|
411
411
|
{hasRuntime && (
|
|
412
412
|
<span
|
|
413
|
-
className="flex items-center gap-1 text-
|
|
413
|
+
className="flex items-center gap-1 text-[var(--success)]"
|
|
414
414
|
title={copy.runtimeActive}
|
|
415
415
|
>
|
|
416
|
-
<span className="w-1.5 h-1.5 rounded-full bg-
|
|
416
|
+
<span className="w-1.5 h-1.5 rounded-full bg-[var(--success)] animate-pulse" aria-hidden="true" />
|
|
417
417
|
<span className="text-2xs font-medium">{copy.runtimeActive}</span>
|
|
418
418
|
</span>
|
|
419
419
|
)}
|
|
@@ -27,7 +27,7 @@ export function StatusDot({ tone, label, count }: { tone: 'ok' | 'warn' | 'neutr
|
|
|
27
27
|
const countCls = tone === 'ok' ? 'text-foreground' : tone === 'warn' ? 'text-[var(--amber)]' : 'text-muted-foreground';
|
|
28
28
|
return (
|
|
29
29
|
<span className="inline-flex items-center gap-1.5 text-muted-foreground">
|
|
30
|
-
<span className={`w-2 h-2 rounded-full ${dotCls}
|
|
30
|
+
<span className={`w-2 h-2 rounded-full ${dotCls}`} aria-hidden="true" />
|
|
31
31
|
<span className="text-xs">{label}</span>
|
|
32
32
|
<span className={`tabular-nums font-medium ${countCls}`}>{count}</span>
|
|
33
33
|
</span>
|
|
@@ -131,20 +131,20 @@ export function EmptyState({ message, icon, className }: { message: string; icon
|
|
|
131
131
|
|
|
132
132
|
/* ────────── Agent Avatar ────────── */
|
|
133
133
|
|
|
134
|
-
/**
|
|
134
|
+
/** Dual-mode palette: soft pastels in light, muted tones in dark — [bg, border, text] */
|
|
135
135
|
const AVATAR_PALETTES: [string, string, string][] = [
|
|
136
|
-
['bg-rose-100/70',
|
|
137
|
-
['bg-violet-100/70', 'border-violet-300/50', 'text-violet-600/80'],
|
|
138
|
-
['bg-emerald-100/70',
|
|
139
|
-
['bg-sky-100/70',
|
|
140
|
-
['bg-amber-100/70',
|
|
141
|
-
['bg-teal-100/70',
|
|
142
|
-
['bg-pink-100/70',
|
|
143
|
-
['bg-indigo-100/70', 'border-indigo-300/50', 'text-indigo-600/80'],
|
|
144
|
-
['bg-lime-100/70',
|
|
145
|
-
['bg-fuchsia-100/70',
|
|
146
|
-
['bg-cyan-100/70',
|
|
147
|
-
['bg-orange-100/70', 'border-orange-300/50', 'text-orange-600/80'],
|
|
136
|
+
['bg-rose-100/70 dark:bg-rose-900/30', 'border-rose-300/50 dark:border-rose-700/40', 'text-rose-600/80 dark:text-rose-400/80'],
|
|
137
|
+
['bg-violet-100/70 dark:bg-violet-900/30', 'border-violet-300/50 dark:border-violet-700/40', 'text-violet-600/80 dark:text-violet-400/80'],
|
|
138
|
+
['bg-emerald-100/70 dark:bg-emerald-900/30', 'border-emerald-300/50 dark:border-emerald-700/40','text-emerald-600/80 dark:text-emerald-400/80'],
|
|
139
|
+
['bg-sky-100/70 dark:bg-sky-900/30', 'border-sky-300/50 dark:border-sky-700/40', 'text-sky-600/80 dark:text-sky-400/80'],
|
|
140
|
+
['bg-amber-100/70 dark:bg-amber-900/30', 'border-amber-300/50 dark:border-amber-700/40', 'text-amber-700/80 dark:text-amber-400/80'],
|
|
141
|
+
['bg-teal-100/70 dark:bg-teal-900/30', 'border-teal-300/50 dark:border-teal-700/40', 'text-teal-600/80 dark:text-teal-400/80'],
|
|
142
|
+
['bg-pink-100/70 dark:bg-pink-900/30', 'border-pink-300/50 dark:border-pink-700/40', 'text-pink-600/80 dark:text-pink-400/80'],
|
|
143
|
+
['bg-indigo-100/70 dark:bg-indigo-900/30', 'border-indigo-300/50 dark:border-indigo-700/40', 'text-indigo-600/80 dark:text-indigo-400/80'],
|
|
144
|
+
['bg-lime-100/70 dark:bg-lime-900/30', 'border-lime-300/50 dark:border-lime-700/40', 'text-lime-700/80 dark:text-lime-400/80'],
|
|
145
|
+
['bg-fuchsia-100/70 dark:bg-fuchsia-900/30', 'border-fuchsia-300/50 dark:border-fuchsia-700/40','text-fuchsia-600/80 dark:text-fuchsia-400/80'],
|
|
146
|
+
['bg-cyan-100/70 dark:bg-cyan-900/30', 'border-cyan-300/50 dark:border-cyan-700/40', 'text-cyan-600/80 dark:text-cyan-400/80'],
|
|
147
|
+
['bg-orange-100/70 dark:bg-orange-900/30', 'border-orange-300/50 dark:border-orange-700/40', 'text-orange-600/80 dark:text-orange-400/80'],
|
|
148
148
|
];
|
|
149
149
|
|
|
150
150
|
function hashName(str: string): number {
|
|
@@ -696,7 +696,7 @@ function AgentCard({
|
|
|
696
696
|
</Link>
|
|
697
697
|
{skillMode && (
|
|
698
698
|
<span className={`text-2xs px-1.5 py-0.5 rounded shrink-0 ${
|
|
699
|
-
skillMode === 'universal' ? 'bg-
|
|
699
|
+
skillMode === 'universal' ? 'bg-muted text-muted-foreground'
|
|
700
700
|
: skillMode === 'additional' ? 'bg-[var(--amber-dim)] text-[var(--amber-text)]'
|
|
701
701
|
: 'bg-muted text-muted-foreground'
|
|
702
702
|
}`}>
|
|
@@ -422,7 +422,7 @@ function MetaCard({
|
|
|
422
422
|
tone?: 'ok' | 'muted' | 'default';
|
|
423
423
|
}) {
|
|
424
424
|
const valueColor =
|
|
425
|
-
tone === 'ok' ? 'text-
|
|
425
|
+
tone === 'ok' ? 'text-[var(--success)]'
|
|
426
426
|
: tone === 'muted' ? 'text-muted-foreground'
|
|
427
427
|
: 'text-foreground';
|
|
428
428
|
return (
|
|
@@ -18,7 +18,7 @@ function UserMessageContent({ content, skillName }: { content: string; skillName
|
|
|
18
18
|
const rest = prefixMatch ? content.slice(prefixMatch[0].length) : content;
|
|
19
19
|
return (
|
|
20
20
|
<>
|
|
21
|
-
<span className="inline-flex items-center gap-1 px-1.5 py-0.5 rounded-full text-[11px] font-medium bg-[var(--amber
|
|
21
|
+
<span className="inline-flex items-center gap-1 px-1.5 py-0.5 rounded-full text-[11px] font-medium bg-[var(--amber)]/15 text-[var(--amber)] mr-1 align-middle">
|
|
22
22
|
<Zap size={10} className="shrink-0" />
|
|
23
23
|
{resolved}
|
|
24
24
|
</span>
|
|
@@ -19,12 +19,12 @@ export default function EchoPanel({ active, maximized, onMaximize }: EchoPanelPr
|
|
|
19
19
|
const e = t.panels.echo;
|
|
20
20
|
const pathname = usePathname() ?? '';
|
|
21
21
|
|
|
22
|
-
const rowBySegment: Record<EchoSegment, { icon: ReactNode; title: string
|
|
23
|
-
'about-you': { icon: <UserRound size={14} />, title: e.aboutYouTitle
|
|
24
|
-
continued: { icon: <Bookmark size={14} />, title: e.continuedTitle
|
|
25
|
-
daily: { icon: <Sun size={14} />, title: e.dailyEchoTitle
|
|
26
|
-
'past-you': { icon: <History size={14} />, title: e.pastYouTitle
|
|
27
|
-
growth: { icon: <Brain size={14} />, title: e.intentGrowthTitle
|
|
22
|
+
const rowBySegment: Record<EchoSegment, { icon: ReactNode; title: string }> = {
|
|
23
|
+
'about-you': { icon: <UserRound size={14} />, title: e.aboutYouTitle },
|
|
24
|
+
continued: { icon: <Bookmark size={14} />, title: e.continuedTitle },
|
|
25
|
+
daily: { icon: <Sun size={14} />, title: e.dailyEchoTitle },
|
|
26
|
+
'past-you': { icon: <History size={14} />, title: e.pastYouTitle },
|
|
27
|
+
growth: { icon: <Brain size={14} />, title: e.intentGrowthTitle },
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
return (
|
|
@@ -37,7 +37,7 @@ export default function EchoPanel({ active, maximized, onMaximize }: EchoPanelPr
|
|
|
37
37
|
const href = ECHO_SEGMENT_HREF[segment];
|
|
38
38
|
const isActive = pathname === href || pathname.startsWith(`${href}/`);
|
|
39
39
|
return (
|
|
40
|
-
<PanelNavRow key={segment} href={href} icon={row.icon} title={row.title}
|
|
40
|
+
<PanelNavRow key={segment} href={href} icon={row.icon} title={row.title} active={isActive} />
|
|
41
41
|
);
|
|
42
42
|
})}
|
|
43
43
|
</div>
|
|
@@ -207,7 +207,7 @@ Be specific. Reference actual content from the files. Keep the total response un
|
|
|
207
207
|
|
|
208
208
|
{/* error */}
|
|
209
209
|
{error && (
|
|
210
|
-
<div className="font-display" style={{ padding: '10px 14px', borderRadius: 8, background: '
|
|
210
|
+
<div className="font-display" style={{ padding: '10px 14px', borderRadius: 8, background: 'color-mix(in srgb, var(--error) 10%, transparent)', border: '1px solid color-mix(in srgb, var(--error) 30%, transparent)', color: 'var(--error)', fontSize: 12, marginBottom: '1rem' }}>
|
|
211
211
|
{error}
|
|
212
212
|
</div>
|
|
213
213
|
)}
|
package/package.json
CHANGED