From 38bb428bbabc66ebd4080b25ce38d432e989df29 Mon Sep 17 00:00:00 2001 From: Jason Carter Date: Sun, 21 Jun 2026 00:20:10 +0800 Subject: [PATCH 1/2] optimize for ui export for markus hub --- packages/web-ui/src/pages/Home.tsx | 59 +++++++++++++++++------- packages/web-ui/src/pages/Team.tsx | 13 +++--- packages/web-ui/src/showcase/mockData.ts | 1 + 3 files changed, 51 insertions(+), 22 deletions(-) diff --git a/packages/web-ui/src/pages/Home.tsx b/packages/web-ui/src/pages/Home.tsx index e6c178fe..7065b847 100644 --- a/packages/web-ui/src/pages/Home.tsx +++ b/packages/web-ui/src/pages/Home.tsx @@ -46,6 +46,7 @@ export interface HomePreviewData { requirements?: RequirementInfo[]; projects?: ProjectInfo[]; deliverableTotal?: number; + recentDeliverables?: DeliverableInfo[]; storageInfo?: StorageInfo | null; usageInfo?: { llmTokens: number; storageBytes: number } | null; } @@ -62,7 +63,7 @@ export function HomePage({ authUser, previewMode, previewData }: { authUser?: { const [allRequirements, setAllRequirements] = useState(previewData?.requirements ?? []); const [projects, setProjects] = useState(previewData?.projects ?? []); const [deliverableTotal, setDeliverableTotal] = useState(previewData?.deliverableTotal ?? 0); - const [recentDeliverables, setRecentDeliverables] = useState([]); + const [recentDeliverables, setRecentDeliverables] = useState(previewData?.recentDeliverables ?? []); const [storageInfo, setStorageInfo] = useState(previewData?.storageInfo ?? null); const [usageInfo, setUsageInfo] = useState<{ llmTokens: number; storageBytes: number } | null>(previewData?.usageInfo ?? null); const [showCreateMenu, setShowCreateMenu] = useState(false); @@ -94,6 +95,7 @@ export function HomePage({ authUser, previewMode, previewData }: { authUser?: { setAllRequirements(previewData.requirements ?? []); setProjects(previewData.projects ?? []); setDeliverableTotal(previewData.deliverableTotal ?? 0); + if (previewData.recentDeliverables) setRecentDeliverables(previewData.recentDeliverables); if (previewData.storageInfo) setStorageInfo(previewData.storageInfo); if (previewData.usageInfo) setUsageInfo(previewData.usageInfo); }, [previewMode, previewData]); @@ -315,16 +317,16 @@ export function HomePage({ authUser, previewMode, previewData }: { authUser?: {
{/* ── Metric Cards ── */} -
+
} pulse={workingAgents > 0} onClick={() => setShowWorkingModal(true)} /> + icon={} pulse={workingAgents > 0} onClick={() => setShowWorkingModal(true)} animateCount={previewMode} /> } badge={urgentHighActive > 0 ? `${urgentHighActive} urgent/high` : undefined} onClick={() => navBus.navigate(PAGE.WORK)} /> + icon={} badge={urgentHighActive > 0 ? `${urgentHighActive} urgent/high` : undefined} onClick={() => navBus.navigate(PAGE.WORK)} animateCount={previewMode} /> } onClick={() => navBus.navigate(PAGE.WORK)} /> + icon={} onClick={() => navBus.navigate(PAGE.WORK)} animateCount={previewMode} /> } color={llmConfigured === false ? 'green' : !ops ? undefined : ops.systemHealth.overallScore >= 80 ? 'green' : ops.systemHealth.overallScore >= 50 ? 'amber' : 'red'} - onClick={() => setShowHealthModal(true)} /> + onClick={() => setShowHealthModal(true)} animateCount={previewMode} />
{/* ── Needs Your Attention ── */} @@ -430,7 +432,7 @@ export function HomePage({ authUser, previewMode, previewData }: { authUser?: { )} {/* ── Onboarding Checklist ── */} - {!checklistDismissed && !checklistReady && ( + {!previewMode && !checklistDismissed && !checklistReady && (
@@ -438,7 +440,7 @@ export function HomePage({ authUser, previewMode, previewData }: { authUser?: {
)} - {!checklistDismissed && checklistReady && (() => { + {!previewMode && !checklistDismissed && checklistReady && (() => { const navigateToSecretary = (prompt: string) => { const secretary = agents.find(a => a.role === 'secretary') ?? agents.find(a => a.name?.toLowerCase().includes('secretary')); navBus.navigate(PAGE.TEAM, { @@ -550,7 +552,7 @@ export function HomePage({ authUser, previewMode, previewData }: { authUser?: { {/* Tasks with donut */}
- +
{sortedStatusEntries.map(({ status, count }) => ( @@ -725,16 +727,32 @@ export function HomePage({ authUser, previewMode, previewData }: { authUser?: { // Sub-components // ═════════════════════════════════════════════════════════════════════════════ -function MetricCard({ label, value, sub, icon, pulse, color, badge, onClick }: { - label: string; value: string; sub?: string; icon: React.ReactNode; pulse?: boolean; color?: 'green' | 'amber' | 'red'; badge?: string; onClick?: () => void; +function MetricCard({ label, value, sub, icon, pulse, color, badge, onClick, animateCount }: { + label: string; value: string; sub?: string; icon: React.ReactNode; pulse?: boolean; color?: 'green' | 'amber' | 'red'; badge?: string; onClick?: () => void; animateCount?: boolean; }) { const colorClass = color === 'green' ? 'text-green-500' : color === 'amber' ? 'text-amber-500' : color === 'red' ? 'text-red-500' : 'text-fg-primary'; + const numericValue = parseInt(value, 10); + const [displayValue, setDisplayValue] = useState(animateCount ? '0' : value); + useEffect(() => { + if (!animateCount || isNaN(numericValue)) { setDisplayValue(value); return; } + let frame: number; + const duration = 1200; + const start = performance.now(); + const tick = (now: number) => { + const progress = Math.min((now - start) / duration, 1); + const eased = 1 - Math.pow(1 - progress, 3); + setDisplayValue(String(Math.round(numericValue * eased))); + if (progress < 1) frame = requestAnimationFrame(tick); + }; + frame = requestAnimationFrame(tick); + return () => cancelAnimationFrame(frame); + }, [animateCount, numericValue, value]); return (
{label}
- {value} + {displayValue} {sub && {sub}}
{badge &&
{badge}
} @@ -787,8 +805,8 @@ function EntityIcon({ type }: { type: 'folder' | 'edit' | 'book' }) { // ── Donut Chart ───────────────────────────────────────────────────────────── -function DonutChart({ statusCounts, total, completionRate, completed }: { - statusCounts: Record; total: number; completionRate: number; completed: number; +function DonutChart({ statusCounts, total, completionRate, completed, animate }: { + statusCounts: Record; total: number; completionRate: number; completed: number; animate?: boolean; }) { const size = 120; const r = 42; @@ -802,14 +820,23 @@ function DonutChart({ statusCounts, total, completionRate, completed }: { offset += len; return arc; }); + const [revealed, setRevealed] = useState(!animate); + useEffect(() => { + if (!animate) return; + const t = setTimeout(() => setRevealed(true), 100); + return () => clearTimeout(t); + }, [animate]); return (
{arcs.map((arc, i) => ( navBus.navigate(PAGE.WORK, { statusFilter: arc.status })} /> ))} diff --git a/packages/web-ui/src/pages/Team.tsx b/packages/web-ui/src/pages/Team.tsx index 10d84561..116be776 100644 --- a/packages/web-ui/src/pages/Team.tsx +++ b/packages/web-ui/src/pages/Team.tsx @@ -434,6 +434,7 @@ export function TeamPage({ initialAgentId, authUser, previewMode, previewData }: type EntityMentionItem = { id: string; name: string; entityType: 'workflow' | 'project' | 'requirement' | 'task' | 'deliverable'; role?: string }; const [entityMentionItems, setEntityMentionItems] = useState([]); useEffect(() => { + if (previewMode) return; let cancelled = false; const load = async () => { const items: EntityMentionItem[] = []; @@ -460,7 +461,7 @@ export function TeamPage({ initialAgentId, authUser, previewMode, previewData }: }; void load(); return () => { cancelled = true; }; - }, []); + }, [previewMode]); const activeTeamId = chatMode === 'channel' ? groupChats.find(gc => gc.channelKey === activeChannel)?.teamId @@ -661,7 +662,7 @@ export function TeamPage({ initialAgentId, authUser, previewMode, previewData }: setHumans(previewData.humans ?? []); setTeams(previewData.teams ?? []); setGroupChats(previewData.groupChats ?? []); - if (previewData.channelMessages) { + if (previewData.channelMessages && !previewData.streamLastMessage) { const ch = previewData.activeChannel ?? 'custom:general'; setMessages(previewData.channelMessages.filter(m => m.channel === ch).map(m => channelMsgToChat(m))); } @@ -3084,8 +3085,8 @@ export function TeamPage({ initialAgentId, authUser, previewMode, previewData }:
{visibleMessages.length > 0 && ( -
- {chatVirtualizer.getVirtualItems().map(virtualRow => { +
+ {(previewMode ? (() => { const start = Math.max(0, visibleMessages.length - 6); return visibleMessages.slice(start).map((_, i) => ({ index: start + i, start: 0 })); })() : chatVirtualizer.getVirtualItems()).map(virtualRow => { const vIdx = virtualRow.index; const msg = visibleMessages[vIdx]!; const prevMsg = vIdx > 0 ? visibleMessages[vIdx - 1] : null; @@ -3102,8 +3103,8 @@ export function TeamPage({ initialAgentId, authUser, previewMode, previewData }:
{showDateSep && ( diff --git a/packages/web-ui/src/showcase/mockData.ts b/packages/web-ui/src/showcase/mockData.ts index 6510add6..4eacd15d 100644 --- a/packages/web-ui/src/showcase/mockData.ts +++ b/packages/web-ui/src/showcase/mockData.ts @@ -403,6 +403,7 @@ export function createMockData(t: TFunction) { requirements, projects, deliverableTotal: deliverables.length, + recentDeliverables: deliverables.slice(0, 6), storageInfo, usageInfo, }; From 58a15b0675f78ba4097fa3d5e6f52111392a9960 Mon Sep 17 00:00:00 2001 From: Jason Carter Date: Sun, 21 Jun 2026 00:41:55 +0800 Subject: [PATCH 2/2] optimize for ui export for markus hub, inline avatar with base64 --- packages/web-ui/src/showcase/avatars.ts | 3 +++ packages/web-ui/src/showcase/mockData.ts | 11 ++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 packages/web-ui/src/showcase/avatars.ts diff --git a/packages/web-ui/src/showcase/avatars.ts b/packages/web-ui/src/showcase/avatars.ts new file mode 100644 index 00000000..54661cdb --- /dev/null +++ b/packages/web-ui/src/showcase/avatars.ts @@ -0,0 +1,3 @@ +export const AVATAR_ALEX = 'data:image/jpeg;base64,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'; +export const AVATAR_SARAH = 'data:image/jpeg;base64,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'; +export const AVATAR_JAMES = 'data:image/jpeg;base64,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'; diff --git a/packages/web-ui/src/showcase/mockData.ts b/packages/web-ui/src/showcase/mockData.ts index 4eacd15d..cf8e3a7e 100644 --- a/packages/web-ui/src/showcase/mockData.ts +++ b/packages/web-ui/src/showcase/mockData.ts @@ -9,6 +9,11 @@ import type { TeamPreviewData } from '../pages/Team.tsx'; import type { WorkPreviewData } from '../pages/Work.tsx'; import type { DeliverablesPreviewData } from '../pages/Deliverables.tsx'; +// ═══════════════════════════════════════════════════════════════════════════ +// Inline avatar data URLs (avoids repeated network requests during demo cycling) +// ═══════════════════════════════════════════════════════════════════════════ +import { AVATAR_ALEX, AVATAR_SARAH, AVATAR_JAMES } from './avatars.ts'; + // ═══════════════════════════════════════════════════════════════════════════ // IDs // ═══════════════════════════════════════════════════════════════════════════ @@ -53,9 +58,9 @@ export function createMockData(t: TFunction) { // ── Founding Team (3 humans) ─────────────────────────────────────────── const humans: HumanUserInfo[] = [ - { id: HUMAN_IDS.alex, name: ts('humans.alex.name'), role: 'owner', orgId: ORG, avatarUrl: '/avatars/alex.jpg' }, - { id: HUMAN_IDS.sarah, name: ts('humans.sarah.name'), role: 'admin', orgId: ORG, avatarUrl: '/avatars/sarah.jpg' }, - { id: HUMAN_IDS.james, name: ts('humans.james.name'), role: 'admin', orgId: ORG, avatarUrl: '/avatars/james.jpg' }, + { id: HUMAN_IDS.alex, name: ts('humans.alex.name'), role: 'owner', orgId: ORG, avatarUrl: AVATAR_ALEX }, + { id: HUMAN_IDS.sarah, name: ts('humans.sarah.name'), role: 'admin', orgId: ORG, avatarUrl: AVATAR_SARAH }, + { id: HUMAN_IDS.james, name: ts('humans.james.name'), role: 'admin', orgId: ORG, avatarUrl: AVATAR_JAMES }, ]; // ── Digital Employees (30 agents) ──────────────────────────────────────