UNPKG

pulse-dashboard

Version:

A Next.js Dashboard application for real-time monitoring and historical analysis of Playwright test executions. This component provides the UI for visualizing Playwright test results and can be run as a standalone CLI tool.

21 lines 28.9 kB
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/1d575ca10212fcd8.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-e1814fc76895fd87.js"/><script src="/_next/static/chunks/4bd1b696-a153d0e435b711e5.js" async=""></script><script src="/_next/static/chunks/684-d3bb2477c35ed4c2.js" async=""></script><script src="/_next/static/chunks/main-app-6b7ceacd69285849.js" async=""></script><script src="/_next/static/chunks/437-4a63415b5905f05d.js" async=""></script><script src="/_next/static/chunks/app/layout-dc24b3638eed7b50.js" async=""></script><script src="/_next/static/chunks/920-a7f4fcc568a4b254.js" async=""></script><script src="/_next/static/chunks/80-1e55fe14c5d1a9c2.js" async=""></script><script src="/_next/static/chunks/744-08c5b0b868378007.js" async=""></script><script src="/_next/static/chunks/app/page-6b1eb3079a147c87.js" async=""></script><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><title>Pulse Dashboard</title><meta name="description" content="Real-time Playwright test execution dashboard"/><link rel="icon" href="https://i.postimg.cc/XqVn1NhF/pulse.png" sizes="48x48" type="image/x-icon"/><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&amp;display=swap" rel="stylesheet"/><script> (function() { function getInitialColorMode() { const persistedColorPreference = window.localStorage.getItem('pulse-theme'); const hasPersistedPreference = typeof persistedColorPreference === 'string'; if (hasPersistedPreference) { return persistedColorPreference; } const mql = window.matchMedia('(prefers-color-scheme: dark)'); const hasMediaQueryPreference = typeof mql.matches === 'boolean'; if (hasMediaQueryPreference) { return mql.matches ? 'dark' : 'light'; } return 'light'; } const colorMode = getInitialColorMode(); if (colorMode === 'dark') { document.documentElement.classList.add('dark'); } })(); </script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="font-body antialiased"><main class="min-h-screen flex flex-col"><div style="--sidebar-width:16rem;--sidebar-width-icon:3rem" class="group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar"><div class="group peer hidden md:block text-sidebar-foreground" data-state="expanded" data-collapsible="" data-variant="sidebar" data-side="left"><div class="duration-200 relative h-svh w-[--sidebar-width] bg-transparent transition-[width] ease-linear group-data-[collapsible=offcanvas]:w-0 group-data-[side=right]:rotate-180 group-data-[collapsible=icon]:w-[--sidebar-width-icon]"></div><div class="duration-200 fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] ease-linear md:flex left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l border-r border-sidebar-border shadow-lg"><div data-sidebar="sidebar" class="flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow"><div data-sidebar="header" class="flex-col gap-2 p-4 group-data-[collapsible=icon]:p-2 flex items-center justify-between group-data-[collapsible=icon]:justify-center border-b border-sidebar-border"><a class="flex items-center" href="/"><img alt="Pulse Dashboard Logo" data-ai-hint="pulse logo" loading="lazy" width="120" height="30" decoding="async" data-nimg="1" class="transition-all duration-200" style="color:transparent;object-fit:fill" srcSet="/_next/image?url=https%3A%2F%2Focpaxmghzmfbuhxzxzae.supabase.co%2Fstorage%2Fv1%2Fobject%2Fpublic%2Fimages%2F%2Fpulse-logo.png&amp;w=128&amp;q=75 1x, /_next/image?url=https%3A%2F%2Focpaxmghzmfbuhxzxzae.supabase.co%2Fstorage%2Fv1%2Fobject%2Fpublic%2Fimages%2F%2Fpulse-logo.png&amp;w=256&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Focpaxmghzmfbuhxzxzae.supabase.co%2Fstorage%2Fv1%2Fobject%2Fpublic%2Fimages%2F%2Fpulse-logo.png&amp;w=256&amp;q=75"/></a><button class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 hover:bg-accent hover:text-accent-foreground h-7 w-7 md:hidden" data-sidebar="trigger"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panel-left"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M9 3v18"></path></svg><span class="sr-only">Toggle Sidebar</span></button></div><div data-sidebar="content" class="flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden"><ul data-sidebar="menu" class="flex w-full min-w-0 flex-col gap-1"><li data-sidebar="menu-item" class="group/menu-item relative"><button data-sidebar="menu-button" data-size="default" data-active="true" class="peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left outline-none ring-sidebar-ring transition-[width,height,padding] active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&amp;&gt;span:last-child]:truncate [&amp;&gt;svg]:size-4 [&amp;&gt;svg]:shrink-0 hover:bg-[hsl(var(--sidebar-hover-background))] hover:text-[hsl(var(--sidebar-hover-foreground))] data-[active=true]:bg-[hsl(var(--sidebar-accent))] data-[active=true]:text-[hsl(var(--sidebar-accent-foreground))] data-[active=true]:font-medium h-8 text-sm" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-layout-dashboard h-5 w-5"><rect width="7" height="9" x="3" y="3" rx="1"></rect><rect width="7" height="5" x="14" y="3" rx="1"></rect><rect width="7" height="9" x="14" y="12" rx="1"></rect><rect width="7" height="5" x="3" y="16" rx="1"></rect></svg><span>Dashboard</span></button></li><li data-sidebar="menu-item" class="group/menu-item relative"><button data-sidebar="menu-button" data-size="default" data-active="false" class="peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left outline-none ring-sidebar-ring transition-[width,height,padding] active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&amp;&gt;span:last-child]:truncate [&amp;&gt;svg]:size-4 [&amp;&gt;svg]:shrink-0 hover:bg-[hsl(var(--sidebar-hover-background))] hover:text-[hsl(var(--sidebar-hover-foreground))] data-[active=true]:bg-[hsl(var(--sidebar-accent))] data-[active=true]:text-[hsl(var(--sidebar-accent-foreground))] data-[active=true]:font-medium h-8 text-sm" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list-checks h-5 w-5"><path d="m3 17 2 2 4-4"></path><path d="m3 7 2 2 4-4"></path><path d="M13 6h8"></path><path d="M13 12h8"></path><path d="M13 18h8"></path></svg><span style="color:hsl(var(--sidebar-tab-results-color-hsl))">Test Results</span></button></li><li data-sidebar="menu-item" class="group/menu-item relative"><button data-sidebar="menu-button" data-size="default" data-active="false" class="peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left outline-none ring-sidebar-ring transition-[width,height,padding] active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&amp;&gt;span:last-child]:truncate [&amp;&gt;svg]:size-4 [&amp;&gt;svg]:shrink-0 hover:bg-[hsl(var(--sidebar-hover-background))] hover:text-[hsl(var(--sidebar-hover-foreground))] data-[active=true]:bg-[hsl(var(--sidebar-accent))] data-[active=true]:text-[hsl(var(--sidebar-accent-foreground))] data-[active=true]:font-medium h-8 text-sm" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-trending-up h-5 w-5"><polyline points="22 7 13.5 15.5 8.5 10.5 2 17"></polyline><polyline points="16 7 22 7 22 13"></polyline></svg><span style="color:hsl(var(--sidebar-tab-trends-color-hsl))">Trend Analysis</span></button></li><li data-sidebar="menu-item" class="group/menu-item relative"><button data-sidebar="menu-button" data-size="default" data-active="false" class="peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left outline-none ring-sidebar-ring transition-[width,height,padding] active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&amp;&gt;span:last-child]:truncate [&amp;&gt;svg]:size-4 [&amp;&gt;svg]:shrink-0 hover:bg-[hsl(var(--sidebar-hover-background))] hover:text-[hsl(var(--sidebar-hover-foreground))] data-[active=true]:bg-[hsl(var(--sidebar-accent))] data-[active=true]:text-[hsl(var(--sidebar-accent-foreground))] data-[active=true]:font-medium h-8 text-sm" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-repeat h-5 w-5"><path d="m17 2 4 4-4 4"></path><path d="M3 11v-1a4 4 0 0 1 4-4h14"></path><path d="m7 22-4-4 4-4"></path><path d="M21 13v1a4 4 0 0 1-4 4H3"></path></svg><span style="color:hsl(var(--sidebar-tab-flaky-color-hsl))">Flaky Tests</span></button></li><li data-sidebar="menu-item" class="group/menu-item relative"><button data-sidebar="menu-button" data-size="default" data-active="false" class="peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left outline-none ring-sidebar-ring transition-[width,height,padding] active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&amp;&gt;span:last-child]:truncate [&amp;&gt;svg]:size-4 [&amp;&gt;svg]:shrink-0 hover:bg-[hsl(var(--sidebar-hover-background))] hover:text-[hsl(var(--sidebar-hover-foreground))] data-[active=true]:bg-[hsl(var(--sidebar-accent))] data-[active=true]:text-[hsl(var(--sidebar-accent-foreground))] data-[active=true]:font-medium h-8 text-sm" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list-x h-5 w-5"><path d="M11 12H3"></path><path d="M16 6H3"></path><path d="M16 18H3"></path><path d="m19 10-4 4"></path><path d="m15 10 4 4"></path></svg><span style="color:hsl(var(--sidebar-tab-failures-color-hsl))">Failure Categorization</span></button></li></ul></div><div data-sidebar="footer" class="flex flex-col gap-2 p-2 mt-auto border-t border-sidebar-border"><ul data-sidebar="menu" class="flex w-full min-w-0 flex-col gap-1 group-data-[collapsible=icon]:py-2"><li data-sidebar="menu-item" class="group/menu-item relative"><button data-sidebar="menu-button" data-size="default" data-active="false" class="peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left outline-none ring-sidebar-ring transition-[width,height,padding] active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&amp;&gt;span:last-child]:truncate [&amp;&gt;svg]:size-4 [&amp;&gt;svg]:shrink-0 hover:bg-[hsl(var(--sidebar-hover-background))] hover:text-[hsl(var(--sidebar-hover-foreground))] data-[active=true]:bg-[hsl(var(--sidebar-accent))] data-[active=true]:text-[hsl(var(--sidebar-accent-foreground))] data-[active=true]:font-medium h-8 text-sm" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings h-5 w-5"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path><circle cx="12" cy="12" r="3"></circle></svg><span class="group-data-[collapsible=icon]:hidden" style="color:hsl(var(--sidebar-tab-settings-color-hsl))">Settings</span></button></li></ul><div class="pt-2 group-data-[collapsible=icon]:hidden"><div data-orientation="horizontal" role="none" class="shrink-0 h-[1px] mx-2 w-auto bg-sidebar-border my-1 group-data-[collapsible=icon]:hidden" data-sidebar="separator"></div><div class="flex items-center justify-center gap-1.5 text-xs p-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield-check h-3.5 w-3.5 text-sidebar-foreground/70"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path><path d="m9 12 2 2 4-4"></path></svg><span class="font-medium text-sidebar-foreground">Pulse</span><span class="text-muted-foreground/80">v1.0</span></div></div></div></div></div></div><main class="relative flex min-h-svh flex-1 flex-col bg-background peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow"><div class="container mx-auto p-6 md:p-8 space-y-6 min-h-screen flex flex-col rounded-xl shadow-lg bg-background"><header class="mb-0"><h1 class="text-3xl font-bold font-headline text-primary tracking-tight">Dashboard</h1><p class="text-md text-muted-foreground mt-1">Real-time Playwright Test Execution Monitoring &amp; Analysis Overview</p><p class="text-sm text-muted-foreground mt-2">Latest Run Date:<!-- --> <span class="text-muted-foreground">Loading...</span></p></header><main class="flex-grow mt-6"><div class="grid gap-4 md:grid-cols-2 lg:grid-cols-5"><div class="border bg-card text-card-foreground shadow-lg rounded-xl"><div class="p-6 flex flex-row items-center justify-between space-y-0 pb-2"><div class="animate-pulse rounded-md bg-muted h-5 w-24"></div><div class="animate-pulse rounded-md bg-muted h-6 w-6"></div></div><div class="p-6 pt-0"><div class="animate-pulse rounded-md bg-muted h-8 w-16"></div><div class="animate-pulse rounded-md bg-muted h-4 w-32 mt-1"></div></div></div><div class="border bg-card text-card-foreground shadow-lg rounded-xl"><div class="p-6 flex flex-row items-center justify-between space-y-0 pb-2"><div class="animate-pulse rounded-md bg-muted h-5 w-24"></div><div class="animate-pulse rounded-md bg-muted h-6 w-6"></div></div><div class="p-6 pt-0"><div class="animate-pulse rounded-md bg-muted h-8 w-16"></div><div class="animate-pulse rounded-md bg-muted h-4 w-32 mt-1"></div></div></div><div class="border bg-card text-card-foreground shadow-lg rounded-xl"><div class="p-6 flex flex-row items-center justify-between space-y-0 pb-2"><div class="animate-pulse rounded-md bg-muted h-5 w-24"></div><div class="animate-pulse rounded-md bg-muted h-6 w-6"></div></div><div class="p-6 pt-0"><div class="animate-pulse rounded-md bg-muted h-8 w-16"></div><div class="animate-pulse rounded-md bg-muted h-4 w-32 mt-1"></div></div></div><div class="border bg-card text-card-foreground shadow-lg rounded-xl"><div class="p-6 flex flex-row items-center justify-between space-y-0 pb-2"><div class="animate-pulse rounded-md bg-muted h-5 w-24"></div><div class="animate-pulse rounded-md bg-muted h-6 w-6"></div></div><div class="p-6 pt-0"><div class="animate-pulse rounded-md bg-muted h-8 w-16"></div><div class="animate-pulse rounded-md bg-muted h-4 w-32 mt-1"></div></div></div><div class="border bg-card text-card-foreground shadow-lg rounded-xl"><div class="p-6 flex flex-row items-center justify-between space-y-0 pb-2"><div class="animate-pulse rounded-md bg-muted h-5 w-24"></div><div class="animate-pulse rounded-md bg-muted h-6 w-6"></div></div><div class="p-6 pt-0"><div class="animate-pulse rounded-md bg-muted h-8 w-16"></div><div class="animate-pulse rounded-md bg-muted h-4 w-32 mt-1"></div></div></div></div><div class="border bg-card text-card-foreground shadow-lg rounded-xl mt-6"><div class="flex flex-col space-y-1.5 p-6"><div class="animate-pulse rounded-md bg-muted h-6 w-48 mb-1"></div><div class="animate-pulse rounded-md bg-muted h-4 w-3/4"></div></div><div class="p-6 pt-0 space-y-3"><div class="flex items-center space-x-3"><div class="animate-pulse bg-muted h-5 w-5 rounded-full"></div><div class="animate-pulse rounded-md bg-muted h-4 w-1/4"></div><div class="animate-pulse rounded-md bg-muted h-4 w-1/2"></div></div><div class="flex items-center space-x-3"><div class="animate-pulse bg-muted h-5 w-5 rounded-full"></div><div class="animate-pulse rounded-md bg-muted h-4 w-1/4"></div><div class="animate-pulse rounded-md bg-muted h-4 w-1/2"></div></div><div class="flex items-center space-x-3"><div class="animate-pulse bg-muted h-5 w-5 rounded-full"></div><div class="animate-pulse rounded-md bg-muted h-4 w-1/4"></div><div class="animate-pulse rounded-md bg-muted h-4 w-1/2"></div></div><div class="flex items-center space-x-3"><div class="animate-pulse bg-muted h-5 w-5 rounded-full"></div><div class="animate-pulse rounded-md bg-muted h-4 w-1/4"></div><div class="animate-pulse rounded-md bg-muted h-4 w-1/2"></div></div></div></div><div class="grid gap-6 md:grid-cols-1 lg:grid-cols-2 mt-6"><div class="border bg-card text-card-foreground shadow-lg rounded-xl"><div class="flex flex-col space-y-1.5 p-6"><div class="animate-pulse bg-muted h-5 w-3/4 rounded-md"></div><div class="animate-pulse bg-muted h-4 w-1/2 mt-1 rounded-md"></div></div><div class="p-6 pt-0"><div class="animate-pulse bg-muted h-48 w-full rounded-lg"></div></div></div><div class="border bg-card text-card-foreground shadow-lg rounded-xl"><div class="flex flex-col space-y-1.5 p-6"><div class="animate-pulse bg-muted h-5 w-3/4 rounded-md"></div><div class="animate-pulse bg-muted h-4 w-1/2 mt-1 rounded-md"></div></div><div class="p-6 pt-0"><div class="animate-pulse bg-muted h-48 w-full rounded-lg"></div></div></div><div class="border bg-card text-card-foreground shadow-lg rounded-xl"><div class="flex flex-col space-y-1.5 p-6"><div class="animate-pulse bg-muted h-5 w-3/4 rounded-md"></div><div class="animate-pulse bg-muted h-4 w-1/2 mt-1 rounded-md"></div></div><div class="p-6 pt-0"><div class="animate-pulse bg-muted h-48 w-full rounded-lg"></div></div></div><div class="border bg-card text-card-foreground shadow-lg rounded-xl"><div class="flex flex-col space-y-1.5 p-6"><div class="animate-pulse bg-muted h-5 w-3/4 rounded-md"></div><div class="animate-pulse bg-muted h-4 w-1/2 mt-1 rounded-md"></div></div><div class="p-6 pt-0"><div class="animate-pulse bg-muted h-48 w-full rounded-lg"></div></div></div><div class="border bg-card text-card-foreground shadow-lg rounded-xl"><div class="flex flex-col space-y-1.5 p-6"><div class="animate-pulse bg-muted h-5 w-3/4 rounded-md"></div><div class="animate-pulse bg-muted h-4 w-1/2 mt-1 rounded-md"></div></div><div class="p-6 pt-0"><div class="animate-pulse bg-muted h-48 w-full rounded-lg"></div></div></div><div class="border bg-card text-card-foreground shadow-lg rounded-xl"><div class="flex flex-col space-y-1.5 p-6"><div class="animate-pulse bg-muted h-5 w-3/4 rounded-md"></div><div class="animate-pulse bg-muted h-4 w-1/2 mt-1 rounded-md"></div></div><div class="p-6 pt-0"><div class="animate-pulse bg-muted h-48 w-full rounded-lg"></div></div></div></div></main><footer style="padding:0.5rem;box-shadow:0 -2px 10px rgba(0, 0, 0, 0.05);text-align:center;font-family:&#x27;Segoe UI&#x27;, system-ui, sans-serif;margin-top:auto" class="text-foreground"><div style="display:inline-flex;align-items:center;gap:0.5rem;font-size:0.9rem;font-weight:600;letter-spacing:0.5px"><span>Created by</span><a href="https://github.com/Arghajit47" target="_blank" rel="noopener noreferrer" style="color:#7737BF;font-weight:700;font-style:italic;text-decoration:none;transition:all 0.2s ease">Arghajit Singha</a></div><div style="margin-top:0.5rem;font-size:0.75rem" class="text-muted-foreground">Crafted with precision</div></footer></div></main></div></main><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div><script src="/_next/static/chunks/webpack-e1814fc76895fd87.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[87555,[],\"\"]\n3:I[31295,[],\"\"]\n4:I[9156,[\"437\",\"static/chunks/437-4a63415b5905f05d.js\",\"177\",\"static/chunks/app/layout-dc24b3638eed7b50.js\"],\"Toaster\"]\n5:I[35974,[\"437\",\"static/chunks/437-4a63415b5905f05d.js\",\"920\",\"static/chunks/920-a7f4fcc568a4b254.js\",\"80\",\"static/chunks/80-1e55fe14c5d1a9c2.js\",\"744\",\"static/chunks/744-08c5b0b868378007.js\",\"974\",\"static/chunks/app/page-6b1eb3079a147c87.js\"],\"PulseDashboard\"]\n6:I[59665,[],\"OutletBoundary\"]\n9:I[59665,[],\"ViewportBoundary\"]\nb:I[59665,[],\"MetadataBoundary\"]\nd:I[26614,[],\"\"]\n:HL[\"/_next/static/css/1d575ca10212fcd8.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"SQ0YcJcGW6wcl29uKXCrw\",\"p\":\"\",\"c\":[\"\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/1d575ca10212fcd8.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://fonts.googleapis.com\"}],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://fonts.gstatic.com\",\"crossOrigin\":\"anonymous\"}],[\"$\",\"link\",null,{\"href\":\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700\u0026display=swap\",\"rel\":\"stylesheet\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function() {\\n function getInitialColorMode() {\\n const persistedColorPreference = window.localStorage.getItem('pulse-theme');\\n const hasPersistedPreference = typeof persistedColorPreference === 'string';\\n if (hasPersistedPreference) {\\n return persistedColorPreference;\\n }\\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\\n const hasMediaQueryPreference = typeof mql.matches === 'boolean';\\n if (hasMediaQueryPreference) {\\n return mql.matches ? 'dark' : 'light';\\n }\\n return 'light';\\n }\\n const colorMode = getInitialColorMode();\\n if (colorMode === 'dark') {\\n document.documentElement.classList.add('dark');\\n }\\n })();\\n \"}}]]}],[\"$\",\"body\",null,{\"className\":\"font-body antialiased\",\"children\":[[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$L4\",null,{}]]}]]}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"main\",null,{\"className\":\"min-h-screen flex flex-col\",\"children\":[\"$\",\"$L5\",null,{}]}],\"$undefined\",null,[\"$\",\"$L6\",null,{\"children\":[\"$L7\",\"$L8\",null]}]]}],{},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$1\",\"qz9xd5lG0cxOq6M1Ti2i9\",{\"children\":[[\"$\",\"$L9\",null,{\"children\":\"$La\"}],null]}],[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",\"$undefined\"],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n7:null\n"])</script><script>self.__next_f.push([1,"8:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"Pulse Dashboard\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Real-time Playwright test execution dashboard\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"https://i.postimg.cc/XqVn1NhF/pulse.png\",\"sizes\":\"48x48\",\"type\":\"image/x-icon\"}]]\n"])</script></body></html>