@remcostoeten/dev-widget 0.0.1

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.
Files changed (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/dist/chunk-6OCSDLNS.mjs +16 -0
  4. package/dist/chunk-6OCSDLNS.mjs.map +1 -0
  5. package/dist/chunk-VI7WXBU2.mjs +2 -0
  6. package/dist/chunk-VI7WXBU2.mjs.map +1 -0
  7. package/dist/chunk-X3LYXERT.mjs +2 -0
  8. package/dist/chunk-X3LYXERT.mjs.map +1 -0
  9. package/dist/cli.js +104 -0
  10. package/dist/index.d.mts +18 -0
  11. package/dist/index.d.ts +18 -0
  12. package/dist/index.js +16 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/index.mjs +2 -0
  15. package/dist/index.mjs.map +1 -0
  16. package/dist/internal-Bhwt8k21.d.mts +51 -0
  17. package/dist/internal-C3TqZPIi.d.ts +51 -0
  18. package/dist/internal.d.mts +2 -0
  19. package/dist/internal.d.ts +2 -0
  20. package/dist/internal.js +2 -0
  21. package/dist/internal.js.map +1 -0
  22. package/dist/internal.mjs +1 -0
  23. package/dist/internal.mjs.map +1 -0
  24. package/dist/next.d.mts +13 -0
  25. package/dist/next.d.ts +13 -0
  26. package/dist/next.js +2 -0
  27. package/dist/next.js.map +1 -0
  28. package/dist/next.mjs +2 -0
  29. package/dist/next.mjs.map +1 -0
  30. package/dist/public-CgTT_99y.d.mts +365 -0
  31. package/dist/public-CgTT_99y.d.ts +365 -0
  32. package/dist/react.d.mts +5 -0
  33. package/dist/react.d.ts +5 -0
  34. package/dist/react.js +16 -0
  35. package/dist/react.js.map +1 -0
  36. package/dist/react.mjs +2 -0
  37. package/dist/react.mjs.map +1 -0
  38. package/dist/routeHandler-CwUVepQp.d.mts +7 -0
  39. package/dist/routeHandler-DMHcrvQO.d.ts +7 -0
  40. package/dist/tauri.d.mts +5 -0
  41. package/dist/tauri.d.ts +5 -0
  42. package/dist/tauri.js +2 -0
  43. package/dist/tauri.js.map +1 -0
  44. package/dist/tauri.mjs +2 -0
  45. package/dist/tauri.mjs.map +1 -0
  46. package/package.json +100 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/featureMap.ts","../src/core/safeRun.ts","../src/core/eventBus.ts","../src/core/registry.ts","../src/core/defaults.ts","../src/core/resolveConfig.ts","../src/core/widgetRuntime.ts","../src/domains/auth/providers/betterAuth.ts","../src/domains/auth/providers/cookieProvider.ts","../src/domains/auth/providers/jwtProvider.ts","../src/domains/auth/authDomain.ts","../src/domains/performance/fpsMeter.ts","../src/domains/performance/logger.ts","../src/domains/performance/summarizer.ts","../src/domains/performance/reactProfiler.ts","../src/domains/performance/performanceDomain.ts","../src/domains/routes/routesDomain.ts","../src/domains/performance/aiProviderFactory.ts","../src/domains/auth/ui/authTab.tsx","../src/domains/performance/ui/performanceTab.tsx","../src/domains/routes/ui/routesTab.tsx","../src/domains/monitor/consoleInterceptor.ts","../src/domains/monitor/networkInterceptor.ts","../src/domains/monitor/monitorDomain.ts","../src/domains/monitor/ui/monitorTab.tsx","../src/core/bootstrap.ts","../src/devWidget.tsx","../src/shell/shell.tsx","../src/shell/themeProvider.tsx","../src/shell/themeTokens.ts","../src/shell/header.tsx","../src/shell/footer.tsx","../src/shell/panel.tsx","../src/tabs/tabsView.tsx","../src/components/Button.tsx","../src/shell/rightRail.tsx","../src/shell/useKeyboard.ts","../src/tabs/tabsRuntime.ts"],"sourcesContent":["/** Feature identifiers for all widget domains */\nexport const FEATURE_IDS = ['auth', 'routes', 'performance', 'system', 'links', 'monitor'] as const\n\n/** Union of all feature domain identifiers */\nexport type FeatureId = (typeof FEATURE_IDS)[number]\n\ntype FeatureBase = {\n\tenabled?: boolean\n}\n\n/** Auth feature configuration */\nexport type AuthOptions = FeatureBase & {\n\tprovider?: 'better-auth' | 'cookie' | 'jwt' | 'custom'\n}\n\n/** Routes feature configuration */\nexport type RoutesOptions = FeatureBase & {\n\t/** Root of the Next.js app directory to scan (server-side). Default: 'src/app' */\n\tappRoot?: string\n\t/** API endpoint the client fetches routes from. Default: '/api/dev-widget/routes' */\n\tendpoint?: string\n\tincludeApiRoutes?: boolean\n\tincludeDynamic?: boolean\n}\n\n/** Performance feature configuration */\nexport type PerfOptions = FeatureBase & {\n\tfpsThreshold?: number\n\thourlyIssueThreshold?: number\n\tcaptureReactCommits?: boolean\n\tcaptureLongTasks?: boolean\n}\n\n/** System feature configuration */\nexport type SystemOptions = FeatureBase & {\n\tincludeUserAgent?: boolean\n\tincludeEnv?: boolean\n}\n\n/** Links feature configuration */\nexport type LinksOptions = FeatureBase & {\n\tincludeExternal?: boolean\n\tvalidateInternal?: boolean\n\textractLinks?: () => Promise<import('./internal').LinkEntry[]>\n}\n\n/** Monitor feature configuration */\nexport type MonitorOptions = FeatureBase & {\n\t// Future options\n}\n\n/** Maps feature IDs to their option types */\nexport type FeatureMap = {\n\tauth: AuthOptions\n\troutes: RoutesOptions\n\tperformance: PerfOptions\n\tsystem: SystemOptions\n\tlinks: LinksOptions\n\tmonitor: MonitorOptions\n}\n\n/** Composable feature configuration accepting boolean or options */\nexport type FeatureConfig = {\n\t[K in keyof FeatureMap]?: boolean | FeatureMap[K]\n}\n","/** Run a function and return undefined if it throws */\nexport function safeRun<T>(fn: () => T): T | undefined {\n\ttry {\n\t\treturn fn()\n\t} catch {\n\t\treturn undefined\n\t}\n}\n\n/** Run an async function and return undefined if it throws */\nexport async function safeRunAsync<T>(fn: () => Promise<T>): Promise<T | undefined> {\n\ttry {\n\t\treturn await fn()\n\t} catch {\n\t\treturn undefined\n\t}\n}\n","import type { EventMap, EventName, EventListener } from '../types/internal'\nimport { safeRun } from './safeRun'\n\ntype ListenerSet = {\n\tlisteners: Map<EventName, Set<EventListener<EventName>>>\n}\n\n/** Create a typed event bus for cross-domain communication */\nexport function createBus(): EventBus {\n\tconst state: ListenerSet = {\n\t\tlisteners: new Map()\n\t}\n\n\tfunction publish<K extends EventName>(event: K, payload: EventMap[K]): void {\n\t\tconst set = state.listeners.get(event)\n\t\tif (!set) return\n\t\tfor (const fn of set) {\n\t\t\tsafeRun(function runListener() {\n\t\t\t\t;(fn as EventListener<K>)(payload)\n\t\t\t})\n\t\t}\n\t}\n\n\tfunction subscribe<K extends EventName>(event: K, listener: EventListener<K>): () => void {\n\t\tlet set = state.listeners.get(event)\n\t\tif (!set) {\n\t\t\tset = new Set()\n\t\t\tstate.listeners.set(event, set)\n\t\t}\n\t\tset.add(listener as EventListener<EventName>)\n\t\tconst captured = set\n\t\treturn function unsubscribe() {\n\t\t\tcaptured.delete(listener as EventListener<EventName>)\n\t\t}\n\t}\n\n\tfunction clear(): void {\n\t\tstate.listeners.clear()\n\t}\n\n\treturn { publish, subscribe, clear }\n}\n\n/** Typed event bus contract */\nexport type EventBus = {\n\tpublish<K extends EventName>(event: K, payload: EventMap[K]): void\n\tsubscribe<K extends EventName>(event: K, listener: EventListener<K>): () => void\n\tclear(): void\n}\n","import type { FeatureId } from '../types/featureMap'\nimport type { WidgetDomain, TabCategory, TabPresenter, StateMap } from '../types/internal'\n\ntype DomainEntry = {\n\tdomain: WidgetDomain<unknown, unknown>\n\tstarted: boolean\n}\n\ntype CategoryEntry = {\n\tcategory: TabCategory\n\tpresenter: TabPresenter\n}\n\n/** Create a domain and category registry */\nexport function createRegistry(): DomainRegistry {\n\tconst domains = new Map<FeatureId, DomainEntry>()\n\tconst categories = new Map<string, CategoryEntry>()\n\n\tfunction registerDomain(domain: WidgetDomain<unknown, unknown>): void {\n\t\tdomains.set(domain.id, { domain, started: false })\n\t}\n\n\tfunction unregisterDomain(id: FeatureId): void {\n\t\tconst entry = domains.get(id)\n\t\tif (entry?.started) {\n\t\t\tentry.domain.stop()\n\t\t}\n\t\tdomains.delete(id)\n\t}\n\n\tfunction getDomain<K extends FeatureId>(id: K): WidgetDomain<StateMap[K], unknown> | null {\n\t\tconst entry = domains.get(id)\n\t\treturn entry ? (entry.domain as WidgetDomain<StateMap[K], unknown>) : null\n\t}\n\n\tfunction listDomains(): FeatureId[] {\n\t\treturn Array.from(domains.keys())\n\t}\n\n\tfunction markStarted(id: FeatureId): void {\n\t\tconst entry = domains.get(id)\n\t\tif (entry) {\n\t\t\tentry.started = true\n\t\t}\n\t}\n\n\tfunction isStarted(id: FeatureId): boolean {\n\t\treturn domains.get(id)?.started ?? false\n\t}\n\n\tfunction registerCategory(category: TabCategory, presenter: TabPresenter): void {\n\t\tcategories.set(category.id, { category, presenter })\n\t}\n\n\tfunction unregisterCategory(id: string): void {\n\t\tcategories.delete(id)\n\t}\n\n\tfunction getCategories(): CategoryEntry[] {\n\t\treturn Array.from(categories.values()).sort(function sortCategories(a, b) {\n\t\t\tconst orderA = a.category.order ?? 999\n\t\t\tconst orderB = b.category.order ?? 999\n\t\t\tif (orderA !== orderB) return orderA - orderB\n\t\t\treturn a.category.label.localeCompare(b.category.label)\n\t\t})\n\t}\n\n\tfunction getPresenter(id: string): TabPresenter | null {\n\t\treturn categories.get(id)?.presenter ?? null\n\t}\n\n\tfunction clear(): void {\n\t\tdomains.clear()\n\t\tcategories.clear()\n\t}\n\n\treturn {\n\t\tregisterDomain,\n\t\tunregisterDomain,\n\t\tgetDomain,\n\t\tlistDomains,\n\t\tmarkStarted,\n\t\tisStarted,\n\t\tregisterCategory,\n\t\tunregisterCategory,\n\t\tgetCategories,\n\t\tgetPresenter,\n\t\tclear\n\t}\n}\n\n/** Domain and category registry contract */\nexport type DomainRegistry = {\n\tregisterDomain(domain: WidgetDomain<unknown, unknown>): void\n\tunregisterDomain(id: FeatureId): void\n\tgetDomain<K extends FeatureId>(id: K): WidgetDomain<StateMap[K], unknown> | null\n\tlistDomains(): FeatureId[]\n\tmarkStarted(id: FeatureId): void\n\tisStarted(id: FeatureId): boolean\n\tregisterCategory(category: TabCategory, presenter: TabPresenter): void\n\tunregisterCategory(id: string): void\n\tgetCategories(): { category: TabCategory; presenter: TabPresenter }[]\n\tgetPresenter(id: string): TabPresenter | null\n\tclear(): void\n}\n","import type { ResolvedConfig } from '../types/internal'\n\n/** V1 default configuration */\nexport const DEFAULTS: ResolvedConfig = {\n\tenabled: true,\n\tmode: 'development-only',\n\ttheme: {\n\t\tmode: 'system',\n\t\taccent: '#3bb273',\n\t\tdensity: 'compact',\n\t\tradius: 'md'\n\t},\n\tfeatures: {\n\t\tauth: { enabled: true, provider: 'better-auth' },\n\t\troutes: { enabled: true, includeApiRoutes: true, includeDynamic: true },\n\t\tperformance: {\n\t\t\tenabled: true,\n\t\t\tfpsThreshold: 50,\n\t\t\thourlyIssueThreshold: 5,\n\t\t\tcaptureReactCommits: true,\n\t\t\tcaptureLongTasks: true\n\t\t},\n\t\tsystem: { enabled: true, includeUserAgent: true, includeEnv: true },\n\t\tlinks: { enabled: true, includeExternal: true, validateInternal: true },\n\t\tmonitor: { enabled: true }\n\t},\n\tkeyboard: {\n\t\ttoggleKey: '`',\n\t\tenableShortcuts: true\n\t},\n\taccessibility: {\n\t\treducedMotion: 'system',\n\t\tannounceUpdates: true\n\t},\n\trightRail: {\n\t\tenabled: false,\n\t\tdefaultPanel: null,\n\t\tcollapsible: true,\n\t\tpanels: []\n\t}\n}\n","import type { WidgetProps } from '../types/public'\nimport type { ResolvedConfig } from '../types/internal'\nimport type { FeatureId } from '../types/featureMap'\nimport { FEATURE_IDS } from '../types/featureMap'\nimport { DEFAULTS } from './defaults'\n\n/** Resolve user props into a fully normalized config */\nexport function resolveConfig(props: WidgetProps): ResolvedConfig {\n\tconst disabled = new Set<FeatureId>(props.disable ?? [])\n\n\tconst features = {} as ResolvedConfig['features']\n\tfor (const id of FEATURE_IDS) {\n\t\tconst fallback = DEFAULTS.features[id]\n\t\tconst userVal = props.features?.[id]\n\n\t\tif (userVal !== undefined) {\n\t\t\tif (typeof userVal === 'boolean') {\n\t\t\t\tfeatures[id] = { ...fallback, enabled: userVal }\n\t\t\t} else {\n\t\t\t\tfeatures[id] = {\n\t\t\t\t\t...fallback,\n\t\t\t\t\t...userVal,\n\t\t\t\t\tenabled: userVal.enabled ?? fallback.enabled\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif (disabled.has(id)) {\n\t\t\tfeatures[id] = { ...fallback, enabled: false }\n\t\t\tcontinue\n\t\t}\n\n\t\tfeatures[id] = { ...fallback }\n\t}\n\n\treturn {\n\t\tenabled: props.enabled ?? DEFAULTS.enabled,\n\t\tmode: props.mode ?? DEFAULTS.mode,\n\t\ttheme: {\n\t\t\tmode: props.theme?.mode ?? DEFAULTS.theme.mode,\n\t\t\taccent: props.theme?.accent ?? DEFAULTS.theme.accent,\n\t\t\tdensity: props.theme?.density ?? DEFAULTS.theme.density,\n\t\t\tradius: props.theme?.radius ?? DEFAULTS.theme.radius\n\t\t},\n\t\tfeatures,\n\t\tkeyboard: {\n\t\t\ttoggleKey: props.keyboard?.toggleKey ?? DEFAULTS.keyboard.toggleKey,\n\t\t\tenableShortcuts: props.keyboard?.enableShortcuts ?? DEFAULTS.keyboard.enableShortcuts\n\t\t},\n\t\taccessibility: {\n\t\t\treducedMotion: props.accessibility?.reducedMotion ?? DEFAULTS.accessibility.reducedMotion,\n\t\t\tannounceUpdates: props.accessibility?.announceUpdates ?? DEFAULTS.accessibility.announceUpdates\n\t\t},\n\t\trightRail: {\n\t\t\tenabled: props.rightRail?.enabled ?? DEFAULTS.rightRail.enabled,\n\t\t\tdefaultPanel: props.rightRail?.defaultPanel ?? DEFAULTS.rightRail.defaultPanel,\n\t\t\tcollapsible: props.rightRail?.collapsible ?? DEFAULTS.rightRail.collapsible,\n\t\t\tpanels: props.rightRail?.panels ?? DEFAULTS.rightRail.panels\n\t\t}\n\t}\n}\n","import type { WidgetProps } from '../types/public'\nimport type {\n\tResolvedConfig,\n\tWidgetDomain,\n\tWidgetPlugin,\n\tPluginContext,\n\tEventName,\n\tEventListener\n} from '../types/internal'\nimport type { FeatureId } from '../types/featureMap'\nimport { FEATURE_IDS } from '../types/featureMap'\nimport { createBus } from './eventBus'\nimport type { EventBus } from './eventBus'\nimport { createRegistry } from './registry'\nimport type { DomainRegistry } from './registry'\nimport { resolveConfig } from './resolveConfig'\nimport { safeRunAsync } from './safeRun'\n\n/** Widget runtime orchestrates domains, plugins, and lifecycle */\nexport type WidgetRuntime = {\n\tconfig: ResolvedConfig\n\tbus: EventBus\n\tregistry: DomainRegistry\n\tstart(): Promise<void>\n\tstop(): Promise<void>\n\tregisterPlugin(plugin: WidgetPlugin): Promise<void>\n}\n\n/** Create the widget runtime from user props */\nexport function createRuntime(props: WidgetProps): WidgetRuntime {\n\tconst config = resolveConfig(props)\n\tconst bus = createBus()\n\tconst registry = createRegistry()\n\tlet running = false\n\n\tfunction createPluginCtx(): PluginContext {\n\t\treturn {\n\t\t\tregisterDomain(domain: WidgetDomain<unknown, unknown>) {\n\t\t\t\tregistry.registerDomain(domain)\n\t\t\t},\n\t\t\tregisterCategory(category, presenter) {\n\t\t\t\tregistry.registerCategory(category, presenter)\n\t\t\t},\n\t\t\tonEvent<K extends EventName>(event: K, listener: EventListener<K>) {\n\t\t\t\treturn bus.subscribe(event, listener)\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function start(): Promise<void> {\n\t\tif (running) return\n\n\t\tconst enabledIds = FEATURE_IDS.filter(function isEnabled(id: FeatureId) {\n\t\t\treturn config.features[id]?.enabled !== false\n\t\t})\n\n\t\tfor (const id of enabledIds) {\n\t\t\tconst domain = registry.getDomain(id)\n\t\t\tif (!domain) continue\n\n\t\t\tawait safeRunAsync(async function runSetup() {\n\t\t\t\tawait domain.setup(config.features[id] ?? {})\n\t\t\t})\n\t\t}\n\n\t\tfor (const id of enabledIds) {\n\t\t\tconst domain = registry.getDomain(id)\n\t\t\tif (!domain) continue\n\n\t\t\tawait safeRunAsync(async function runStart() {\n\t\t\t\tawait domain.start()\n\t\t\t})\n\t\t\tregistry.markStarted(id)\n\t\t}\n\n\t\trunning = true\n\t}\n\n\tasync function stop(): Promise<void> {\n\t\tif (!running) return\n\n\t\tconst ids = registry.listDomains().reverse()\n\t\tfor (const id of ids) {\n\t\t\tif (!registry.isStarted(id)) continue\n\t\t\tconst domain = registry.getDomain(id)\n\t\t\tif (!domain) continue\n\n\t\t\tawait safeRunAsync(async function runStop() {\n\t\t\t\tawait domain.stop()\n\t\t\t})\n\t\t}\n\n\t\tbus.clear()\n\t\trunning = false\n\t}\n\n\tasync function registerPlugin(plugin: WidgetPlugin): Promise<void> {\n\t\tconst ctx = createPluginCtx()\n\t\tawait safeRunAsync(async function runPlugin() {\n\t\t\tawait plugin.register(ctx)\n\t\t})\n\t}\n\n\treturn { config, bus, registry, start, stop, registerPlugin }\n}\n","import type { AuthProvider, AuthSession } from '../../../types/public'\n\n/** Better Auth provider - primary first-class auth integration */\nexport function createBetterAuth(options?: Record<string, unknown>): AuthProvider {\n\tconst baseUrl = (options ? (options['baseUrl'] as string) : undefined) ?? '/api/auth'\n\n\tasync function getSession(): Promise<AuthSession | null> {\n\t\ttry {\n\t\t\tconst response = await fetch(`${baseUrl}/session`, {\n\t\t\t\tcredentials: 'include'\n\t\t\t})\n\t\t\tif (!response.ok) return null\n\t\t\tconst data = (await response.json()) as Record<string, unknown>\n\t\t\tif (!data || typeof data !== 'object') return null\n\n\t\t\t// BetterAuth returns { session: ..., user: ... }\n\t\t\tconst user = data['user'] as Record<string, unknown> | undefined\n\t\t\tconst sessionData = data['session'] as Record<string, unknown> | undefined\n\n\t\t\tif (!user || !sessionData) return null\n\n\t\t\tconst session: AuthSession = {\n\t\t\t\tuserId: String(user['id'] ?? '')\n\t\t\t}\n\n\t\t\tconst email = user['email']\n\t\t\tif (typeof email === 'string') session.email = email\n\n\t\t\tconst role = user['role']\n\t\t\tif (typeof role === 'string') session.role = role\n\n\t\t\tconst image = user['image']\n\t\t\tif (typeof image === 'string') session.image = image\n\n\t\t\tconst expiresAt = sessionData['expiresAt']\n\t\t\tif (typeof expiresAt === 'string') session.expiresAt = expiresAt\n\t\t\telse if (expiresAt instanceof Date) session.expiresAt = expiresAt.toISOString()\n\n\t\t\treturn session\n\t\t} catch {\n\t\t\treturn null\n\t\t}\n\t}\n\n\tasync function signOut(): Promise<void> {\n\t\tawait fetch(`${baseUrl}/sign-out`, {\n\t\t\tmethod: 'POST',\n\t\t\tcredentials: 'include'\n\t\t})\n\t}\n\n\treturn { id: 'better-auth', getSession, signOut }\n}\n","import type { AuthProvider, AuthSession } from '../../../types/public'\n\n/** Cookie-based auth fallback provider */\nexport function createCookieProvider(): AuthProvider {\n\tasync function getSession(): Promise<AuthSession | null> {\n\t\tif (typeof document === 'undefined') return null\n\n\t\tconst cookies = document.cookie.split(';').reduce(\n\t\t\tfunction parseCookie(acc, pair) {\n\t\t\t\tconst [key, val] = pair.trim().split('=')\n\t\t\t\tif (key) acc[key] = val ?? ''\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{} as Record<string, string>\n\t\t)\n\n\t\tconst sessionCookie = cookies['session'] ?? cookies['auth-token'] ?? cookies['__session']\n\n\t\tif (!sessionCookie) return null\n\n\t\treturn { userId: 'inferred' }\n\t}\n\n\treturn { id: 'cookie', getSession }\n}\n","import type { AuthProvider, AuthSession } from '../../../types/public'\n\n/** JWT-based auth fallback provider (non-validating, debug only) */\nexport function createJwtProvider(): AuthProvider {\n\tfunction decodePayload(token: string): Record<string, unknown> | null {\n\t\ttry {\n\t\t\tconst parts = token.split('.')\n\t\t\tconst payload = parts[1]\n\t\t\tif (!payload) return null\n\t\t\tconst decoded = atob(payload.replace(/-/g, '+').replace(/_/g, '/'))\n\t\t\treturn JSON.parse(decoded) as Record<string, unknown>\n\t\t} catch {\n\t\t\treturn null\n\t\t}\n\t}\n\n\tasync function getSession(): Promise<AuthSession | null> {\n\t\tif (typeof document === 'undefined') return null\n\n\t\tconst cookies = document.cookie.split(';')\n\t\tlet token: string | null = null\n\n\t\tfor (const pair of cookies) {\n\t\t\tconst trimmed = pair.trim()\n\t\t\tif (trimmed.startsWith('token=') || trimmed.startsWith('jwt=')) {\n\t\t\t\ttoken = trimmed.split('=').slice(1).join('=')\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (!token) return null\n\n\t\tconst payload = decodePayload(token)\n\t\tif (!payload) return null\n\n\t\tconst session: AuthSession = {\n\t\t\tuserId: String(payload['sub'] ?? payload['id'] ?? 'unknown')\n\t\t}\n\n\t\tconst email = payload['email']\n\t\tif (typeof email === 'string') session.email = email\n\n\t\tconst role = payload['role']\n\t\tif (typeof role === 'string') session.role = role\n\n\t\tconst exp = payload['exp']\n\t\tif (typeof exp === 'number') {\n\t\t\tsession.expiresAt = new Date(exp * 1000).toISOString()\n\t\t}\n\n\t\treturn session\n\t}\n\n\treturn { id: 'jwt', getSession }\n}\n","import type { WidgetDomain } from '../../types/internal'\nimport type { AuthState } from '../../types/internal'\nimport type { AuthOptions } from '../../types/featureMap'\nimport type { AuthProvider, AuthConfig } from '../../types/public'\nimport type { EventBus } from '../../core/eventBus'\nimport { createBetterAuth } from './providers/betterAuth'\nimport { createCookieProvider } from './providers/cookieProvider'\nimport { createJwtProvider } from './providers/jwtProvider'\n\n/** Resolve a provider instance from configuration */\nfunction resolveProvider(authConfig?: AuthConfig): AuthProvider {\n\tif (authConfig?.customProvider) return authConfig.customProvider\n\n\tswitch (authConfig?.provider) {\n\t\tcase 'cookie':\n\t\t\treturn createCookieProvider()\n\t\tcase 'jwt':\n\t\t\treturn createJwtProvider()\n\t\tcase 'better-auth':\n\t\tdefault:\n\t\t\treturn createBetterAuth(authConfig?.options)\n\t}\n}\n\n/** Create the auth domain */\nexport function createAuthDomain(\n\tbus: EventBus,\n\tauthConfig?: AuthConfig\n): WidgetDomain<AuthState, AuthOptions> {\n\tlet provider: AuthProvider\n\tlet state: AuthState = {\n\t\tprovider: 'unknown',\n\t\tauthenticated: false,\n\t\tconfidence: 'unknown',\n\t\tsession: null,\n\t\terror: null\n\t}\n\tconst listeners = new Set<(state: AuthState) => void>()\n\tlet pollTimer: ReturnType<typeof setInterval> | null = null\n\tlet signoutUnsub: (() => void) | null = null\n\n\tfunction notify(): void {\n\t\tfor (const fn of listeners) {\n\t\t\tfn(state)\n\t\t}\n\t}\n\n\tasync function refresh(): Promise<void> {\n\t\ttry {\n\t\t\tconst session = await provider.getSession()\n\t\t\tconst prevAuth = state.authenticated\n\t\t\tstate = {\n\t\t\t\tprovider: provider.id,\n\t\t\t\tauthenticated: session !== null,\n\t\t\t\tconfidence: provider.id === 'better-auth' ? 'confirmed' : 'inferred',\n\t\t\t\tsession,\n\t\t\t\terror: null\n\t\t\t}\n\t\t\tnotify()\n\t\t\tif (state.authenticated !== prevAuth) {\n\t\t\t\tbus.publish('auth/state-changed', {\n\t\t\t\t\tprovider: state.provider,\n\t\t\t\t\tauthenticated: state.authenticated\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tstate = {\n\t\t\t\t...state,\n\t\t\t\terror: err instanceof Error ? err.message : 'Session check failed'\n\t\t\t}\n\t\t\tnotify()\n\t\t}\n\t}\n\n\tfunction setup(_config: AuthOptions): void {\n\t\tprovider = resolveProvider(authConfig)\n\t\tstate = { ...state, provider: provider.id }\n\t}\n\n\tasync function start(): Promise<void> {\n\t\tawait refresh()\n\t\tpollTimer = setInterval(refresh, 30000)\n\n\t\tsignoutUnsub = bus.subscribe('auth/sign-out', async () => {\n\t\t\tif (provider.signOut) {\n\t\t\t\tawait provider.signOut()\n\t\t\t\tawait refresh()\n\t\t\t}\n\t\t})\n\t}\n\n\tfunction stop(): void {\n\t\tif (pollTimer) {\n\t\t\tclearInterval(pollTimer)\n\t\t\tpollTimer = null\n\t\t}\n\t\tif (signoutUnsub) {\n\t\t\tsignoutUnsub()\n\t\t\tsignoutUnsub = null\n\t\t}\n\t}\n\n\tfunction getState(): AuthState {\n\t\treturn state\n\t}\n\n\tfunction subscribe(listener: (s: AuthState) => void): () => void {\n\t\tlisteners.add(listener)\n\t\treturn function unsubscribe() {\n\t\t\tlisteners.delete(listener)\n\t\t}\n\t}\n\n\tfunction serializeDiagnostics(): Record<string, unknown> {\n\t\treturn {\n\t\t\tprovider: state.provider,\n\t\t\tauthenticated: state.authenticated,\n\t\t\tconfidence: state.confidence,\n\t\t\thasSession: state.session !== null,\n\t\t\terror: state.error\n\t\t}\n\t}\n\n\tfunction runHealthCheck(): boolean {\n\t\treturn state.error === null\n\t}\n\n\treturn {\n\t\tid: 'auth',\n\t\tsetup,\n\t\tstart,\n\t\tstop,\n\t\tgetState,\n\t\tsubscribe,\n\t\tserializeDiagnostics,\n\t\trunHealthCheck,\n\t\t// @ts-expect-error - Custom method not in WidgetDomain interface\n\t\tsignOut: async () => {\n\t\t\tbus.publish('auth/sign-out', {})\n\t\t}\n\t}\n}\n","/** FPS measurement callback */\nexport type FpsCallback = (fps: number) => void\n\n/** FPS meter using requestAnimationFrame for 60fps monitoring */\nexport function createFpsMeter(callback: FpsCallback): FpsMeter {\n\tlet frameCount = 0\n\tlet lastTime = 0\n\tlet rafId: number | null = null\n\tlet running = false\n\n\tfunction tick(now: number): void {\n\t\tif (!running) return\n\n\t\tframeCount++\n\n\t\tif (lastTime === 0) {\n\t\t\tlastTime = now\n\t\t}\n\n\t\tconst elapsed = now - lastTime\n\t\tif (elapsed >= 1000) {\n\t\t\tconst fps = Math.round((frameCount * 1000) / elapsed)\n\t\t\tcallback(fps)\n\t\t\tframeCount = 0\n\t\t\tlastTime = now\n\t\t}\n\n\t\trafId = requestAnimationFrame(tick)\n\t}\n\n\tfunction start(): void {\n\t\tif (running) return\n\t\trunning = true\n\t\tframeCount = 0\n\t\tlastTime = 0\n\t\trafId = requestAnimationFrame(tick)\n\t}\n\n\tfunction stop(): void {\n\t\trunning = false\n\t\tif (rafId !== null) {\n\t\t\tcancelAnimationFrame(rafId)\n\t\t\trafId = null\n\t\t}\n\t}\n\n\treturn { start, stop }\n}\n\n/** FPS meter control handle */\nexport type FpsMeter = {\n\tstart(): void\n\tstop(): void\n}\n","import type { PerfEvent } from './performanceTypes'\n\n/** Ring buffer for in-memory event storage with fixed capacity */\nexport function createRingBuffer(capacity: number): RingBuffer {\n\tconst buffer: PerfEvent[] = Array.from({ length: capacity })\n\tlet head = 0\n\tlet size = 0\n\n\tfunction push(event: PerfEvent): void {\n\t\tbuffer[head] = event\n\t\thead = (head + 1) % capacity\n\t\tif (size < capacity) size++\n\t}\n\n\tfunction getAll(): ReadonlyArray<PerfEvent> {\n\t\tif (size < capacity) {\n\t\t\treturn buffer.slice(0, size)\n\t\t}\n\t\treturn [...buffer.slice(head), ...buffer.slice(0, head)]\n\t}\n\n\tfunction getRecent(count: number): ReadonlyArray<PerfEvent> {\n\t\tconst all = getAll()\n\t\treturn all.slice(Math.max(0, all.length - count))\n\t}\n\n\tfunction count(): number {\n\t\treturn size\n\t}\n\n\tfunction clear(): void {\n\t\thead = 0\n\t\tsize = 0\n\t}\n\n\treturn { push, getAll, getRecent, count, clear }\n}\n\n/** Ring buffer contract */\nexport type RingBuffer = {\n\tpush(event: PerfEvent): void\n\tgetAll(): ReadonlyArray<PerfEvent>\n\tgetRecent(count: number): ReadonlyArray<PerfEvent>\n\tcount(): number\n\tclear(): void\n}\n\n/** Batch logger that accumulates events and flushes periodically */\nexport function createBatchLogger(\n\tflushFn: (events: PerfEvent[]) => Promise<void>,\n\tintervalMs: number\n): BatchLogger {\n\tconst pending: PerfEvent[] = []\n\tlet timer: ReturnType<typeof setInterval> | null = null\n\n\tasync function flush(): Promise<void> {\n\t\tif (pending.length === 0) return\n\t\tconst batch = pending.splice(0)\n\t\ttry {\n\t\t\tawait flushFn(batch)\n\t\t} catch {\n\t\t\t/* flush failure is non-fatal */\n\t\t}\n\t}\n\n\tfunction add(event: PerfEvent): void {\n\t\tpending.push(event)\n\t}\n\n\tfunction start(): void {\n\t\tif (timer) return\n\t\ttimer = setInterval(flush, intervalMs)\n\t}\n\n\tfunction stop(): void {\n\t\tif (timer) {\n\t\t\tclearInterval(timer)\n\t\t\ttimer = null\n\t\t}\n\t\tflush()\n\t}\n\n\treturn { add, flush, start, stop }\n}\n\n/** Batch logger contract */\nexport type BatchLogger = {\n\tadd(event: PerfEvent): void\n\tflush(): Promise<void>\n\tstart(): void\n\tstop(): void\n}\n","import type { PerfEvent, EventType, AnalysisInput, AnalysisOutput } from './performanceTypes'\nimport type { TriggerWeights } from '../../types/internal'\n\n/** Default trigger weights per event type and severity */\nexport const TRIGGER_WEIGHTS: TriggerWeights = {\n\tfps_drop: { low: 1, medium: 2, high: 3 },\n\tlong_task: { low: 1, medium: 2, high: 4 },\n\treact_commit_burst: { low: 1, medium: 2, high: 3 },\n\tdom_mutation_burst: { low: 1, medium: 2, high: 3 },\n\tscroll_pressure: { low: 0, medium: 1, high: 2 },\n\troute_transition_slow: { low: 1, medium: 2, high: 3 },\n\thydration_warning: { low: 1, medium: 2, high: 3 }\n}\n\n/** Calculate weighted score for a set of events */\nexport function calcScore(events: ReadonlyArray<PerfEvent>, weights?: TriggerWeights): number {\n\tconst w = weights ?? TRIGGER_WEIGHTS\n\tlet total = 0\n\n\tfor (const event of events) {\n\t\tconst typeWeights = w[event.eventType]\n\t\tif (!typeWeights) continue\n\t\ttotal += typeWeights[event.severity] ?? 0\n\t}\n\n\treturn total\n}\n\n/** Check if analysis should be triggered */\nexport function shouldTrigger(\n\tevents: ReadonlyArray<PerfEvent>,\n\tthreshold: number,\n\tweights?: TriggerWeights\n): boolean {\n\treturn calcScore(events, weights) >= threshold\n}\n\n/** Build an analysis input package from events */\nexport function buildInput(events: ReadonlyArray<PerfEvent>): AnalysisInput {\n\tconst suspects = new Set<string>()\n\tfor (const event of events) {\n\t\tif (event.suspects?.components) {\n\t\t\tfor (const c of event.suspects.components) {\n\t\t\t\tsuspects.add(c)\n\t\t\t}\n\t\t}\n\t}\n\n\tconst routes = new Set<string>()\n\tfor (const event of events) {\n\t\troutes.add(event.route)\n\t}\n\n\tconst result: AnalysisInput = {\n\t\tevents,\n\t\tsuspects: Array.from(suspects)\n\t}\n\tif (routes.size === 1) {\n\t\tconst singleRoute = Array.from(routes)[0]\n\t\tif (singleRoute) result.route = singleRoute\n\t}\n\treturn result\n}\n\n/** Rules-based analysis engine (no AI dependency) */\nexport function rulesAnalyze(input: AnalysisInput): AnalysisOutput {\n\tconst eventsByType = new Map<EventType, number>()\n\tfor (const event of input.events) {\n\t\teventsByType.set(event.eventType, (eventsByType.get(event.eventType) ?? 0) + 1)\n\t}\n\n\tconst highEvents = input.events.filter(function isHigh(e) {\n\t\treturn e.severity === 'high'\n\t})\n\n\tconst hotspots = input.suspects ?? []\n\n\tconst suggestions: string[] = []\n\n\tif (eventsByType.get('fps_drop')) {\n\t\tsuggestions.push('Investigate render-heavy components for unnecessary re-renders')\n\t}\n\tif (eventsByType.get('long_task')) {\n\t\tsuggestions.push('Move expensive computations to Web Workers or useMemo')\n\t}\n\tif (eventsByType.get('react_commit_burst')) {\n\t\tsuggestions.push('Check for cascading state updates causing commit bursts')\n\t}\n\tif (eventsByType.get('dom_mutation_burst')) {\n\t\tsuggestions.push('Batch DOM mutations or use virtualization for large lists')\n\t}\n\tif (eventsByType.get('scroll_pressure')) {\n\t\tsuggestions.push('Add scroll event throttling or passive listeners')\n\t}\n\tif (eventsByType.get('route_transition_slow')) {\n\t\tsuggestions.push('Lazy-load route components and preload critical data')\n\t}\n\n\tconst summary =\n\t\t`Detected ${input.events.length} performance events ` +\n\t\t`(${highEvents.length} high severity). ` +\n\t\t`${hotspots.length} suspect component(s) identified.`\n\n\treturn {\n\t\tsummary,\n\t\thotspots: Array.from(hotspots),\n\t\tsuggestions,\n\t\tconfidence: hotspots.length > 0 ? 0.7 : 0.4\n\t}\n}\n","type HookFn = (rendererId: number, root: unknown, priority?: unknown) => void\n\ntype Hook = Record<string, unknown> & {\n\tonCommitFiberRoot: HookFn | undefined\n}\n\ntype Fiber = {\n\tchild?: Fiber | null\n\tsibling?: Fiber | null\n\tactualDuration?: number\n\telementType?: unknown\n\ttype?: unknown\n\tstateNode?: unknown\n}\n\ntype NameEntry = {\n\tname: string\n\tduration: number\n}\n\nexport type CommitInfo = {\n\tduration: number\n\tcomponents: string[]\n}\n\nfunction isObj(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === 'object' && value !== null\n}\n\nfunction isFn(value: unknown): value is HookFn {\n\treturn typeof value === 'function'\n}\n\nfunction isHook(value: unknown): value is Hook {\n\treturn isObj(value)\n}\n\nfunction isFiber(value: unknown): value is Fiber {\n\treturn isObj(value)\n}\n\nfunction getHook(): Hook | null {\n\tconst globalValue = globalThis as Record<string, unknown>\n\tconst hookValue = globalValue['__REACT_DEVTOOLS_GLOBAL_HOOK__']\n\tif (!isHook(hookValue)) return null\n\treturn hookValue\n}\n\nfunction getNumber(value: unknown): number {\n\treturn typeof value === 'number' && Number.isFinite(value) ? value : 0\n}\n\nfunction isUpper(value: string): boolean {\n\tconst first = value[0]\n\tif (!first) return false\n\treturn first.toUpperCase() === first\n}\n\nfunction getName(value: unknown): string | null {\n\tif (typeof value === 'function') {\n\t\tconst named = value as ((...args: unknown[]) => unknown) & { displayName?: string }\n\t\treturn named.displayName ?? named.name ?? null\n\t}\n\n\tif (typeof value === 'string') {\n\t\treturn isUpper(value) ? value : null\n\t}\n\n\tif (isObj(value)) {\n\t\tconst display = value['displayName']\n\t\tif (typeof display === 'string' && display.length > 0) return display\n\t}\n\n\treturn null\n}\n\nfunction getNodeName(node: Fiber): string | null {\n\tconst name = getName(node.elementType) ?? getName(node.type)\n\tif (name) return name\n\n\tif (isObj(node.stateNode)) {\n\t\tconst ctor = node.stateNode['constructor']\n\t\tif (isObj(ctor)) {\n\t\t\tconst ctorName = ctor['name']\n\t\t\tif (typeof ctorName === 'string' && ctorName.length > 0) return ctorName\n\t\t}\n\t}\n\n\treturn null\n}\n\nfunction walkFiber(node: Fiber | null, list: NameEntry[]): void {\n\tif (!node) return\n\n\tconst duration = getNumber(node.actualDuration)\n\tconst name = getNodeName(node)\n\tif (name && duration > 0) {\n\t\tlist.push({ name, duration })\n\t}\n\n\tif (node.child) walkFiber(node.child, list)\n\tif (node.sibling) walkFiber(node.sibling, list)\n}\n\nfunction pickNames(list: NameEntry[], limit: number): string[] {\n\tconst sorted = list.sort(function byDuration(a, b) {\n\t\treturn b.duration - a.duration\n\t})\n\n\tconst names: string[] = []\n\tconst seen = new Set<string>()\n\n\tfor (const entry of sorted) {\n\t\tif (seen.has(entry.name)) continue\n\t\tseen.add(entry.name)\n\t\tnames.push(entry.name)\n\t\tif (names.length >= limit) break\n\t}\n\n\treturn names\n}\n\nfunction getCommit(root: unknown): CommitInfo | null {\n\tif (!isObj(root)) return null\n\tconst current = root['current']\n\tif (!isFiber(current)) return null\n\n\tconst fiber = current\n\tconst duration = getNumber(fiber.actualDuration)\n\tconst entries: NameEntry[] = []\n\twalkFiber(fiber, entries)\n\tconst components = pickNames(entries, 5)\n\n\treturn { duration, components }\n}\n\n/**\n * Hooks into React DevTools to capture commit timings.\n */\nexport function setupProfiler(onCommit: (info: CommitInfo) => void): (() => void) | null {\n\tconst hook = getHook()\n\tif (!hook) return null\n\n\tconst original = hook.onCommitFiberRoot\n\n\tfunction handle(rendererId: number, root: unknown, priority?: unknown): void {\n\t\ttry {\n\t\t\tconst info = getCommit(root)\n\t\t\tif (info) onCommit(info)\n\t\t} catch {}\n\n\t\tif (isFn(original)) {\n\t\t\toriginal(rendererId, root, priority)\n\t\t}\n\t}\n\n\thook.onCommitFiberRoot = handle\n\n\treturn function cleanup() {\n\t\thook.onCommitFiberRoot = original\n\t}\n}\n","import type { WidgetDomain } from '../../types/internal'\nimport type { PerfState } from '../../types/internal'\nimport type { PerfOptions } from '../../types/featureMap'\nimport type { PerfEvent, Severity, AiProvider } from './performanceTypes'\nimport type { EventBus } from '../../core/eventBus'\nimport { createFpsMeter } from './fpsMeter'\nimport { createRingBuffer, createBatchLogger } from './logger'\nimport { shouldTrigger, buildInput, rulesAnalyze } from './summarizer'\nimport { setupProfiler } from './reactProfiler'\nimport type { CommitInfo } from './reactProfiler'\n\nlet nextId = 0\nfunction genId(): string {\n\treturn `perf-${Date.now()}-${nextId++}`\n}\n\nfunction genSessionId(): string {\n\treturn `sess-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n}\n\nconst INTERNAL = new Set([\n\t'DevWidget',\n\t'Shell',\n\t'ThemeProvider',\n\t'Panel',\n\t'Header',\n\t'Footer',\n\t'TabsView',\n\t'RightRail',\n\t'AuthTab',\n\t'PerfTab',\n\t'RoutesTab',\n\t'MonitorTab'\n])\n\nconst GENERIC = new Set(['App', 'Root', 'Layout', 'Page', 'Provider'])\n\nfunction pickNames(names: string[]): string[] {\n\tconst list: string[] = []\n\tfor (const name of names) {\n\t\tif (INTERNAL.has(name)) continue\n\t\tlist.push(name)\n\t}\n\treturn list\n}\n\nfunction trimNames(names: string[]): string[] {\n\tconst list: string[] = []\n\tfor (const name of names) {\n\t\tif (GENERIC.has(name)) continue\n\t\tlist.push(name)\n\t}\n\treturn list\n}\n\nfunction getNames(names: string[]): string[] {\n\tconst filtered = pickNames(names)\n\tconst sharp = trimNames(filtered)\n\tif (sharp.length > 0) return sharp.slice(0, 5)\n\treturn filtered.slice(0, 5)\n}\n\n/** Create the performance monitoring domain */\nexport function createPerfDomain(\n\tbus: EventBus,\n\taiProvider?: AiProvider\n): WidgetDomain<PerfState, PerfOptions> {\n\tconst sessionId = genSessionId()\n\tconst buffer = createRingBuffer(500)\n\tconst batchLogger = createBatchLogger(async function noop() {}, 30000)\n\n\tlet config: PerfOptions = {}\n\tlet state: PerfState = {\n\t\tfps: 60,\n\t\tisScrolling: false,\n\t\tscrollFps: 60,\n\t\tevents: [],\n\t\thourlyCount: 0,\n\t\tanalysisRunning: false,\n\t\tlastReport: null\n\t}\n\tconst listeners = new Set<(s: PerfState) => void>()\n\n\tlet longTaskObserver: PerformanceObserver | null = null\n\tlet mutationObserver: MutationObserver | null = null\n\tlet hourlyTimer: ReturnType<typeof setInterval> | null = null\n\tlet analysisTimer: ReturnType<typeof setInterval> | null = null\n\tlet scrollTimer: ReturnType<typeof setTimeout> | null = null\n\tlet reactCleanup: (() => void) | null = null\n\tconst commitTimes: number[] = []\n\tlet lastBurst = 0\n\n\tfunction notify(): void {\n\t\tfor (const fn of listeners) {\n\t\t\tfn(state)\n\t\t}\n\t}\n\n\tfunction classifySeverity(fps: number, threshold: number): Severity {\n\t\tif (fps < threshold * 0.5) return 'high'\n\t\tif (fps < threshold * 0.75) return 'medium'\n\t\treturn 'low'\n\t}\n\n\tfunction getRoute(): string {\n\t\tif (typeof window !== 'undefined') {\n\t\t\treturn window.location.pathname\n\t\t}\n\t\treturn '/'\n\t}\n\n\tfunction getContext(): { userAgent?: string; viewport?: { w: number; h: number } } {\n\t\tif (typeof window === 'undefined') return {}\n\t\treturn {\n\t\t\tuserAgent: navigator.userAgent,\n\t\t\tviewport: { w: window.innerWidth, h: window.innerHeight }\n\t\t}\n\t}\n\n\tfunction recordEvent(event: PerfEvent): void {\n\t\tbuffer.push(event)\n\t\tbatchLogger.add(event)\n\t\tstate = {\n\t\t\t...state,\n\t\t\tevents: buffer.getRecent(50) as PerfEvent[],\n\t\t\thourlyCount: state.hourlyCount + 1\n\t\t}\n\t\tnotify()\n\n\t\tif (event.severity === 'high') {\n\t\t\tbus.publish('performance/drop-detected', {\n\t\t\t\tfps: event.metrics.fps ?? 0,\n\t\t\t\treasons: [event.eventType]\n\t\t\t})\n\t\t}\n\t}\n\n\tfunction createEvent(\n\t\teventType: PerfEvent['eventType'],\n\t\tseverity: Severity,\n\t\tmetrics: PerfEvent['metrics'],\n\t\tsuspects?: PerfEvent['suspects']\n\t): PerfEvent {\n\t\tconst event: PerfEvent = {\n\t\t\tid: genId(),\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tsessionId,\n\t\t\troute: getRoute(),\n\t\t\teventType,\n\t\t\tseverity,\n\t\t\tmetrics,\n\t\t\tcontext: getContext()\n\t\t}\n\t\tif (suspects) event.suspects = suspects\n\t\treturn event\n\t}\n\n\tconst fpsMeter = createFpsMeter(function onFps(fps) {\n\t\tlet newState = { ...state, fps }\n\n\t\tif (state.isScrolling) {\n\t\t\t// Weighted rolling average for scroll FPS\n\t\t\tconst currentScrollFps = state.scrollFps\n\t\t\tconst newScrollFps = Math.round(currentScrollFps * 0.7 + fps * 0.3)\n\t\t\tnewState = { ...newState, scrollFps: newScrollFps }\n\t\t}\n\n\t\tstate = newState\n\t\tnotify()\n\n\t\tconst threshold = (config.fpsThreshold as number | undefined) ?? 50\n\t\tif (fps < threshold) {\n\t\t\tconst severity = classifySeverity(fps, threshold)\n\t\t\trecordEvent(createEvent('fps_drop', severity, { fps }))\n\t\t}\n\t})\n\n\tfunction setupScrollListener(): (() => void) | undefined {\n\t\tif (typeof window === 'undefined') return\n\n\t\tconst onScroll = () => {\n\t\t\tif (!state.isScrolling) {\n\t\t\t\tstate = { ...state, isScrolling: true }\n\t\t\t\t// Don't notify immediately on every scroll event to avoid thrashing,\n\t\t\t\t// let FPS meter handle the update or notify next tick if needed.\n\t\t\t\t// But here we want UI to reflect \"scrolling\" state.\n\t\t\t\tnotify()\n\t\t\t}\n\n\t\t\tif (scrollTimer) clearTimeout(scrollTimer)\n\t\t\tscrollTimer = setTimeout(() => {\n\t\t\t\tstate = { ...state, isScrolling: false }\n\t\t\t\tnotify()\n\t\t\t\tscrollTimer = null\n\t\t\t}, 150)\n\t\t}\n\n\t\twindow.addEventListener('scroll', onScroll, { passive: true })\n\n\t\t// Return cleanup\n\t\treturn () => {\n\t\t\twindow.removeEventListener('scroll', onScroll)\n\t\t\tif (scrollTimer) clearTimeout(scrollTimer)\n\t\t}\n\t}\n\n\tlet scrollCleanup: (() => void) | null = null\n\n\tfunction setupLongTasks(): void {\n\t\tif (typeof PerformanceObserver === 'undefined') return\n\t\tif (!(config.captureLongTasks ?? true)) return\n\n\t\ttry {\n\t\t\tlongTaskObserver = new PerformanceObserver(function onLongTask(list) {\n\t\t\t\tfor (const entry of list.getEntries()) {\n\t\t\t\t\tconst duration = entry.duration\n\t\t\t\t\tlet severity: Severity = 'low'\n\t\t\t\t\tif (duration > 200) severity = 'high'\n\t\t\t\t\telse if (duration > 100) severity = 'medium'\n\n\t\t\t\t\trecordEvent(\n\t\t\t\t\t\tcreateEvent('long_task', severity, {\n\t\t\t\t\t\t\tlongTaskDurationMs: duration\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\t\t\tlongTaskObserver.observe({ type: 'longtask', buffered: false })\n\t\t} catch {\n\t\t\t/* longtask observer not supported */\n\t\t}\n\t}\n\n\tfunction setupMutationObserver(): void {\n\t\tif (typeof MutationObserver === 'undefined') return\n\t\tif (typeof document === 'undefined') return\n\n\t\tlet mutCount = 0\n\t\tlet mutTimer: ReturnType<typeof setTimeout> | null = null\n\n\t\tmutationObserver = new MutationObserver(function onMutation(mutations) {\n\t\t\tmutCount += mutations.length\n\n\t\t\tif (mutTimer) return\n\t\t\tmutTimer = setTimeout(function checkBurst() {\n\t\t\t\tif (mutCount > 50) {\n\t\t\t\t\tconst severity: Severity = mutCount > 200 ? 'high' : mutCount > 100 ? 'medium' : 'low'\n\t\t\t\t\trecordEvent(\n\t\t\t\t\t\tcreateEvent('dom_mutation_burst', severity, {\n\t\t\t\t\t\t\tmutationCount: mutCount\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tmutCount = 0\n\t\t\t\tmutTimer = null\n\t\t\t}, 1000)\n\t\t})\n\n\t\tmutationObserver.observe(document.body, {\n\t\t\tchildList: true,\n\t\t\tsubtree: true,\n\t\t\tattributes: true\n\t\t})\n\t}\n\n\tfunction handleCommit(info: CommitInfo): void {\n\t\tconst minMs = 16\n\t\tif (info.duration < minMs) return\n\n\t\tconst severity: Severity = info.duration > 80 ? 'high' : info.duration > 40 ? 'medium' : 'low'\n\t\tconst names = getNames(info.components)\n\t\tconst suspects = names.length > 0 ? { components: names } : undefined\n\n\t\trecordEvent(createEvent('react_commit_burst', severity, { commitCount: 1 }, suspects))\n\n\t\tconst now = Date.now()\n\t\tcommitTimes.push(now)\n\t\twhile (commitTimes.length > 0) {\n\t\t\tconst first = commitTimes[0]\n\t\t\tif (first === undefined) break\n\t\t\tif (now - first <= 2000) break\n\t\t\tcommitTimes.shift()\n\t\t}\n\n\t\tif (commitTimes.length >= 5 && now - lastBurst > 5000) {\n\t\t\tlastBurst = now\n\t\t\trecordEvent(\n\t\t\t\tcreateEvent('react_commit_burst', 'high', { commitCount: commitTimes.length }, suspects)\n\t\t\t)\n\t\t}\n\t}\n\n\tasync function runAnalysis(): Promise<void> {\n\t\tconst threshold = (config.hourlyIssueThreshold as number | undefined) ?? 5\n\t\tconst recentEvents = buffer.getAll()\n\n\t\tif (!shouldTrigger(recentEvents, threshold * 3)) return\n\n\t\tstate = { ...state, analysisRunning: true }\n\t\tnotify()\n\n\t\ttry {\n\t\t\tconst input = buildInput(recentEvents)\n\t\t\tlet output\n\n\t\t\tif (aiProvider) {\n\t\t\t\toutput = await aiProvider.analyze(input)\n\t\t\t} else {\n\t\t\t\toutput = rulesAnalyze(input)\n\t\t\t}\n\n\t\t\tconst reportId = `report-${Date.now()}`\n\t\t\tstate = {\n\t\t\t\t...state,\n\t\t\t\tanalysisRunning: false,\n\t\t\t\tlastReport: output.summary\n\t\t\t}\n\t\t\tnotify()\n\n\t\t\tbus.publish('performance/analysis-complete', { reportId })\n\t\t} catch {\n\t\t\tstate = { ...state, analysisRunning: false }\n\t\t\tnotify()\n\t\t}\n\t}\n\n\tfunction setup(cfg: PerfOptions): void {\n\t\tconfig = cfg\n\t}\n\n\tasync function start(): Promise<void> {\n\t\tfpsMeter.start()\n\t\tsetupLongTasks()\n\t\tsetupMutationObserver()\n\t\tscrollCleanup = setupScrollListener() || null\n\t\tbatchLogger.start()\n\t\tif (config.captureReactCommits ?? true) {\n\t\t\treactCleanup = setupProfiler(handleCommit)\n\t\t}\n\n\t\thourlyTimer = setInterval(function resetHourly() {\n\t\t\tstate = { ...state, hourlyCount: 0 }\n\t\t\tnotify()\n\t\t}, 3600000)\n\n\t\tanalysisTimer = setInterval(runAnalysis, 60000)\n\t}\n\n\tfunction stop(): void {\n\t\tfpsMeter.stop()\n\t\tbatchLogger.stop()\n\n\t\tif (longTaskObserver) {\n\t\t\tlongTaskObserver.disconnect()\n\t\t\tlongTaskObserver = null\n\t\t}\n\t\tif (mutationObserver) {\n\t\t\tmutationObserver.disconnect()\n\t\t\tmutationObserver = null\n\t\t}\n\t\tif (hourlyTimer) {\n\t\t\tclearInterval(hourlyTimer)\n\t\t\thourlyTimer = null\n\t\t}\n\t\tif (analysisTimer) {\n\t\t\tclearInterval(analysisTimer)\n\t\t\tanalysisTimer = null\n\t\t}\n\t\tif (scrollCleanup) {\n\t\t\tscrollCleanup()\n\t\t\tscrollCleanup = null\n\t\t}\n\t\tif (reactCleanup) {\n\t\t\treactCleanup()\n\t\t\treactCleanup = null\n\t\t}\n\t}\n\n\tfunction getState(): PerfState {\n\t\treturn state\n\t}\n\n\tfunction subscribe(listener: (s: PerfState) => void): () => void {\n\t\tlisteners.add(listener)\n\t\treturn function unsubscribe() {\n\t\t\tlisteners.delete(listener)\n\t\t}\n\t}\n\n\tfunction serializeDiagnostics(): Record<string, unknown> {\n\t\treturn {\n\t\t\tfps: state.fps,\n\t\t\ttotalEvents: buffer.count(),\n\t\t\thourlyCount: state.hourlyCount,\n\t\t\tanalysisRunning: state.analysisRunning,\n\t\t\tlastReport: state.lastReport\n\t\t}\n\t}\n\n\tfunction runHealthCheck(): boolean {\n\t\treturn state.fps > 0\n\t}\n\n\tfunction reset(): void {\n\t\tbuffer.clear()\n\t\tcommitTimes.length = 0\n\t\tstate = {\n\t\t\tfps: 60,\n\t\t\tisScrolling: false,\n\t\t\tscrollFps: 60,\n\t\t\tevents: [],\n\t\t\thourlyCount: 0,\n\t\t\tanalysisRunning: false,\n\t\t\tlastReport: null\n\t\t}\n\t\tnotify()\n\t}\n\n\treturn {\n\t\tid: 'performance',\n\t\tsetup,\n\t\tstart,\n\t\tstop,\n\t\tgetState,\n\t\tsubscribe,\n\t\tserializeDiagnostics,\n\t\trunHealthCheck,\n\t\treset\n\t}\n}\n","import type { WidgetDomain, RoutesState, RouteEntry } from '../../types/internal'\nimport type { RoutesOptions } from '../../types/featureMap'\nimport type { EventBus } from '../../core/eventBus'\n\nconst DEFAULT_ENDPOINT = '/api/dev-widget/routes'\n\n/** Create the routes discovery domain */\nexport function createRoutesDomain(bus: EventBus): WidgetDomain<RoutesState, RoutesOptions> {\n\tlet state: RoutesState = {\n\t\troutes: [],\n\t\tloading: false,\n\t\terror: null\n\t}\n\tconst listeners = new Set<(s: RoutesState) => void>()\n\tlet endpoint = DEFAULT_ENDPOINT\n\tlet includeApiRoutes = false\n\n\tfunction notify(): void {\n\t\tfor (const fn of listeners) {\n\t\t\tfn(state)\n\t\t}\n\t}\n\n\tfunction setup(config: RoutesOptions): void {\n\t\tendpoint = config.endpoint ?? DEFAULT_ENDPOINT\n\t\tincludeApiRoutes = config.includeApiRoutes ?? false\n\t\tstate = { ...state, loading: true }\n\t\tnotify()\n\t}\n\n\tasync function start(): Promise<void> {\n\t\ttry {\n\t\t\tconst url = new URL(endpoint, globalThis.location?.origin ?? 'http://localhost:3000')\n\t\t\tif (includeApiRoutes) {\n\t\t\t\turl.searchParams.set('includeApiRoutes', 'true')\n\t\t\t}\n\n\t\t\tconst res = await fetch(url.toString())\n\n\t\t\tif (!res.ok) {\n\t\t\t\tstate = { ...state, loading: false, error: `Route discovery failed (${res.status})` }\n\t\t\t\tnotify()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst body = (await res.json()) as { routes?: RouteEntry[]; error?: string }\n\n\t\t\tif (body.error) {\n\t\t\t\tstate = { ...state, loading: false, error: body.error }\n\t\t\t\tnotify()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst routes = body.routes ?? []\n\t\t\tstate = { routes, loading: false, error: null }\n\t\t\tnotify()\n\n\t\t\tbus.publish('routes/discovered', { count: routes.length, routes })\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : 'Route discovery failed'\n\t\t\tstate = { ...state, loading: false, error: message }\n\t\t\tnotify()\n\t\t}\n\t}\n\n\tfunction stop(): void {\n\t\tstate = { routes: [], loading: false, error: null }\n\t}\n\n\tfunction getState(): RoutesState {\n\t\treturn state\n\t}\n\n\tfunction subscribe(listener: (s: RoutesState) => void): () => void {\n\t\tlisteners.add(listener)\n\t\treturn function unsubscribe() {\n\t\t\tlisteners.delete(listener)\n\t\t}\n\t}\n\n\tfunction serializeDiagnostics(): Record<string, unknown> {\n\t\treturn {\n\t\t\trouteCount: state.routes.length,\n\t\t\tloading: state.loading,\n\t\t\terror: state.error\n\t\t}\n\t}\n\n\treturn {\n\t\tid: 'routes',\n\t\tsetup,\n\t\tstart,\n\t\tstop,\n\t\tgetState,\n\t\tsubscribe,\n\t\tserializeDiagnostics\n\t}\n}\n","import type { AiConfig, AiProvider } from '../../types/public'\n\n/** Resolve the configured AI provider */\nexport function resolveAiProvider(config?: AiConfig): AiProvider | undefined {\n\tif (!config) return undefined\n\n\tif (config.provider === 'custom') {\n\t\treturn config.customProvider\n\t}\n\n\tif (config.provider === 'rules') {\n\t\treturn undefined\n\t}\n\n\treturn undefined\n}\n","import { useState, useEffect } from 'react'\nimport type { AuthState } from '../../../types/internal'\nimport type { WidgetDomain } from '../../../types/internal'\nimport type { AuthOptions } from '../../../types/featureMap'\n\ntype Props = {\n\tdomain: WidgetDomain<AuthState, AuthOptions>\n}\n\n/** Auth tab panel rendering session info and actions */\nexport function AuthTab({ domain }: Props): React.ReactElement {\n\tconst [state, setState] = useState<AuthState>(domain.getState())\n\n\tuseEffect(\n\t\tfunction subscribeAuth() {\n\t\t\treturn domain.subscribe(setState)\n\t\t},\n\t\t[domain]\n\t)\n\n\tconst badge =\n\t\tstate.confidence === 'confirmed'\n\t\t\t? 'Confirmed'\n\t\t\t: state.confidence === 'inferred'\n\t\t\t\t? 'Inferred'\n\t\t\t\t: 'Unknown'\n\n\treturn (\n\t\t<div\n\t\t\trole=\"region\"\n\t\t\taria-label=\"Authentication status\"\n\t\t\tstyle={{ display: 'flex', flexDirection: 'column', gap: 'var(--dw-gap)' }}\n\t\t>\n\t\t\t<div\n\t\t\t\tdata-dw-section=\"auth-header\"\n\t\t\t\tstyle={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}\n\t\t\t>\n\t\t\t\t<span data-dw-label=\"provider\">Provider: {state.provider}</span>\n\t\t\t\t<div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n\t\t\t\t\t<span data-dw-badge={state.confidence}>{badge}</span>\n\t\t\t\t\t{state.authenticated && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tonClick={() => (domain as unknown as { signOut?: () => void }).signOut?.()}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\t\t\tpadding: '2px 6px',\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tcursor: 'pointer'\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdata-dw-action=\"sign-out\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSign Out\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{state.error && (\n\t\t\t\t<div\n\t\t\t\t\tdata-dw-alert=\"warning\"\n\t\t\t\t\trole=\"alert\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tcolor: 'var(--dw-warning)',\n\t\t\t\t\t\tpadding: 'var(--dw-padding)',\n\t\t\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\t\t\tborderRadius: 'var(--dw-radius)'\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{state.error}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{state.session ? (\n\t\t\t\t<dl\n\t\t\t\t\tdata-dw-section=\"auth-details\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'grid',\n\t\t\t\t\t\tgridTemplateColumns: 'auto 1fr',\n\t\t\t\t\t\tgap: 'var(--dw-gap)',\n\t\t\t\t\t\tfontSize: '11px'\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<dt style={{ color: 'var(--dw-text-muted)' }}>User ID</dt>\n\t\t\t\t\t<dd style={{ fontFamily: 'monospace' }}>{state.session.userId}</dd>\n\t\t\t\t\t{state.session.email && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<dt style={{ color: 'var(--dw-text-muted)' }}>Email</dt>\n\t\t\t\t\t\t\t<dd style={{ fontFamily: 'monospace' }}>{state.session.email}</dd>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{state.session.role && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<dt style={{ color: 'var(--dw-text-muted)' }}>Role</dt>\n\t\t\t\t\t\t\t<dd style={{ fontFamily: 'monospace' }}>{state.session.role}</dd>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{state.session.expiresAt && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<dt style={{ color: 'var(--dw-text-muted)' }}>Expires</dt>\n\t\t\t\t\t\t\t<dd style={{ fontFamily: 'monospace' }}>{state.session.expiresAt}</dd>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</dl>\n\t\t\t) : (\n\t\t\t\t<div\n\t\t\t\t\tdata-dw-empty\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\ttextAlign: 'center',\n\t\t\t\t\t\tpadding: 'var(--dw-padding)',\n\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\t\t\tborderRadius: 'var(--dw-radius)'\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<p style={{ margin: 0 }}>No active session</p>\n\t\t\t\t\t<p style={{ margin: 0, fontSize: '10px', opacity: 0.8 }}>Sign in to see session details</p>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","import { useState, useEffect, useMemo } from 'react'\nimport type { PerfState, WidgetDomain } from '../../../types/internal'\nimport type { PerfOptions } from '../../../types/featureMap'\nimport type { PerfEvent } from '../../../types/public'\n\ntype Props = {\n\tdomain: WidgetDomain<PerfState, PerfOptions>\n}\n\nfunction getDetails(event: PerfEvent): string | null {\n\tconst parts: string[] = []\n\n\tif (event.metrics.fps) {\n\t\tparts.push(`FPS ${Math.round(event.metrics.fps)}`)\n\t}\n\tif (event.metrics.longTaskDurationMs) {\n\t\tparts.push(`Long task ${Math.round(event.metrics.longTaskDurationMs)}ms`)\n\t}\n\tif (event.metrics.commitCount) {\n\t\tparts.push(`Commits ${event.metrics.commitCount}`)\n\t}\n\tif (event.metrics.mutationCount) {\n\t\tparts.push(`Mutations ${event.metrics.mutationCount}`)\n\t}\n\tif (event.metrics.scrollEventCount) {\n\t\tparts.push(`Scroll ${event.metrics.scrollEventCount}`)\n\t}\n\n\treturn parts.length > 0 ? parts.join(' | ') : null\n}\n\nfunction getSuspects(event: PerfEvent): string[] {\n\treturn event.suspects?.components?.slice(0, 5) ?? []\n}\n\nfunction isGeneric(name: string): boolean {\n\treturn (\n\t\tname === 'App' || name === 'Root' || name === 'Layout' || name === 'Page' || name === 'Provider'\n\t)\n}\n\nfunction getGuide(event: PerfEvent): { what: string; where: string; fix: string } {\n\tswitch (event.eventType) {\n\t\tcase 'fps_drop':\n\t\t\treturn {\n\t\t\t\twhat: 'Frame rate dropped under your FPS threshold.',\n\t\t\t\twhere: `Route ${event.route} at ${new Date(event.timestamp).toLocaleTimeString()}.`,\n\t\t\t\tfix: 'Reduce render work, virtualize long lists, and split heavy components.'\n\t\t\t}\n\t\tcase 'long_task':\n\t\t\treturn {\n\t\t\t\twhat: 'Main thread was blocked by a long task.',\n\t\t\t\twhere: `Detected on ${event.route} (${Math.round(event.metrics.longTaskDurationMs ?? 0)}ms).`,\n\t\t\t\tfix: 'Move heavy work to workers, chunk loops, and defer non-critical JS.'\n\t\t\t}\n\t\tcase 'react_commit_burst':\n\t\t\treturn {\n\t\t\t\twhat: 'React commit activity spiked and likely caused UI jank.',\n\t\t\t\twhere: `Commit burst on ${event.route}.`,\n\t\t\t\tfix: 'Memoize expensive trees and avoid state updates that fan out broadly.'\n\t\t\t}\n\t\tcase 'dom_mutation_burst':\n\t\t\treturn {\n\t\t\t\twhat: 'DOM mutation volume was unusually high.',\n\t\t\t\twhere: `Mutation burst on ${event.route}.`,\n\t\t\t\tfix: 'Batch DOM writes and avoid repeated mount/unmount loops.'\n\t\t\t}\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\twhat: 'A performance signal was recorded.',\n\t\t\t\twhere: `Route ${event.route}.`,\n\t\t\t\tfix: 'Inspect the latest event details and test with the same user flow.'\n\t\t\t}\n\t}\n}\n\nfunction getSeverityColor(value: PerfEvent['severity']): string {\n\tif (value === 'high') return 'var(--dw-danger)'\n\tif (value === 'medium') return 'var(--dw-warning)'\n\treturn 'var(--dw-success)'\n}\n\nfunction toToken(value: string): string {\n\treturn value.toLowerCase().replace(/[^a-z0-9_-]/g, '')\n}\n\nfunction toKebab(value: string): string {\n\treturn value\n\t\t.replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n\t\t.replace(/[^a-zA-Z0-9-]/g, '')\n\t\t.toLowerCase()\n}\n\nfunction findTargets(name: string): HTMLElement[] {\n\tif (typeof document === 'undefined') return []\n\tconst token = toToken(name)\n\tconst kebab = toKebab(name)\n\tconst selectors = [\n\t\t`[data-component=\"${name}\"]`,\n\t\t`[data-testid*=\"${token}\"]`,\n\t\t`[id*=\"${token}\"]`,\n\t\t`[class*=\"${token}\"]`,\n\t\tkebab\n\t]\n\tconst set = new Set<HTMLElement>()\n\tfor (const selector of selectors) {\n\t\ttry {\n\t\t\tconst list = document.querySelectorAll(selector)\n\t\t\tfor (const node of list) {\n\t\t\t\tif (node instanceof HTMLElement) {\n\t\t\t\t\tset.add(node)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t}\n\treturn Array.from(set).slice(0, 6)\n}\n\n/** Performance tab panel showing FPS, events, and analysis results */\nexport function PerfTab({ domain }: Props): React.ReactElement {\n\tconst [state, setState] = useState<PerfState>(domain.getState())\n\tconst [selectedId, setSelectedId] = useState<string | null>(null)\n\tconst [selectedName, setSelectedName] = useState<string | null>(null)\n\tconst [highlightNote, setHighlightNote] = useState<string | null>(null)\n\n\tuseEffect(\n\t\tfunction subscribePerf() {\n\t\t\treturn domain.subscribe(setState)\n\t\t},\n\t\t[domain]\n\t)\n\n\tconst events = useMemo(\n\t\tfunction getEvents() {\n\t\t\treturn state.events.slice(-12).reverse()\n\t\t},\n\t\t[state.events]\n\t)\n\n\tuseEffect(\n\t\tfunction syncSelected() {\n\t\t\tif (!selectedId) return\n\t\t\tconst exists = events.some(function isCurrent(event) {\n\t\t\t\treturn event.id === selectedId\n\t\t\t})\n\t\t\tif (!exists) {\n\t\t\t\tsetSelectedId(events[0]?.id ?? null)\n\t\t\t}\n\t\t},\n\t\t[selectedId, events]\n\t)\n\n\tconst selectedEvent = useMemo(\n\t\tfunction getSelected() {\n\t\t\tif (events.length === 0) return null\n\t\t\tif (!selectedId) return events[0] ?? null\n\t\t\treturn (\n\t\t\t\tevents.find(function findEvent(event) {\n\t\t\t\t\treturn event.id === selectedId\n\t\t\t\t}) ??\n\t\t\t\tevents[0] ??\n\t\t\t\tnull\n\t\t\t)\n\t\t},\n\t\t[selectedId, events]\n\t)\n\n\tfunction handleHighlight(name: string): void {\n\t\tsetSelectedName(name)\n\t\tconst targets = findTargets(name)\n\t\tif (targets.length === 0) {\n\t\t\tsetHighlightNote(\n\t\t\t\t`No DOM node matched \"${name}\". Add data-component=\"${name}\" for direct targeting.`\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\tsetHighlightNote(\n\t\t\t`Highlighted ${targets.length} node${targets.length > 1 ? 's' : ''} for \"${name}\".`\n\t\t)\n\t\tconst reset = targets.map(function snapshot(target) {\n\t\t\treturn {\n\t\t\t\ttarget,\n\t\t\t\toutline: target.style.outline,\n\t\t\t\toutlineOffset: target.style.outlineOffset,\n\t\t\t\ttransition: target.style.transition,\n\t\t\t\tboxShadow: target.style.boxShadow\n\t\t\t}\n\t\t})\n\n\t\tfor (const item of reset) {\n\t\t\titem.target.style.transition = 'outline 0.15s ease, box-shadow 0.15s ease'\n\t\t\titem.target.style.outline = '2px solid var(--dw-accent)'\n\t\t\titem.target.style.outlineOffset = '2px'\n\t\t\titem.target.style.boxShadow = '0 0 0 4px rgba(59, 130, 246, 0.2)'\n\t\t}\n\t\ttargets[0]?.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'smooth' })\n\n\t\tsetTimeout(function restore() {\n\t\t\tfor (const item of reset) {\n\t\t\t\titem.target.style.outline = item.outline\n\t\t\t\titem.target.style.outlineOffset = item.outlineOffset\n\t\t\t\titem.target.style.transition = item.transition\n\t\t\t\titem.target.style.boxShadow = item.boxShadow\n\t\t\t}\n\t\t}, 2200)\n\t}\n\n\tconst fpsColor =\n\t\tstate.fps >= 55 ? 'var(--dw-success)' : state.fps >= 40 ? 'var(--dw-warning)' : 'var(--dw-danger)'\n\tconst selectedGuide = selectedEvent ? getGuide(selectedEvent) : null\n\tconst selectedSuspects = selectedEvent ? getSuspects(selectedEvent) : []\n\tconst hasStrong = selectedSuspects.some(function hasName(name) {\n\t\treturn !isGeneric(name)\n\t})\n\n\treturn (\n\t\t<div\n\t\t\trole=\"region\"\n\t\t\taria-label=\"Performance monitor\"\n\t\t\tstyle={{ display: 'flex', flexDirection: 'column', gap: '12px' }}\n\t\t>\n\t\t\t<div\n\t\t\t\tdata-dw-section=\"perf-header\"\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: 'grid',\n\t\t\t\t\tgridTemplateColumns: '1fr auto auto',\n\t\t\t\t\talignItems: 'center',\n\t\t\t\t\tgap: '10px',\n\t\t\t\t\tpadding: '10px',\n\t\t\t\t\tborderRadius: 'var(--dw-radius)',\n\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\tbackground: 'var(--dw-bg-secondary)'\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div style={{ display: 'flex', alignItems: 'baseline', gap: '8px' }}>\n\t\t\t\t\t<span data-dw-metric=\"fps\" style={{ color: fpsColor, fontWeight: 'bold' }}>\n\t\t\t\t\t\t{state.fps} FPS\n\t\t\t\t\t</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tdata-dw-metric=\"scroll-fps\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\tcolor: state.isScrolling ? 'var(--dw-accent)' : 'var(--dw-text-muted)',\n\t\t\t\t\t\t\tfontWeight: state.isScrolling ? 'bold' : 'normal',\n\t\t\t\t\t\t\ttransition: 'color 0.2s'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{state.scrollFps} Scroll FPS\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<span data-dw-label=\"events\" style={{ color: 'var(--dw-text-muted)' }}>\n\t\t\t\t\t{state.hourlyCount} events/hr\n\t\t\t\t</span>\n\t\t\t\t{state.analysisRunning && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tdata-dw-badge=\"analyzing\"\n\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tcolor: 'var(--dw-accent)',\n\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\tpadding: '2px 6px',\n\t\t\t\t\t\t\tborderRadius: '999px',\n\t\t\t\t\t\t\tborder: '1px solid var(--dw-accent)'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tAnalyzing...\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{state.lastReport && (\n\t\t\t\t<div\n\t\t\t\t\tdata-dw-section=\"perf-report\"\n\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tpadding: 'var(--dw-padding)',\n\t\t\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\t\t\tborderRadius: 'var(--dw-radius)'\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<h4\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tmargin: '0 0 4px 0',\n\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\t\ttextTransform: 'uppercase'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tLatest Analysis\n\t\t\t\t\t</h4>\n\t\t\t\t\t<p style={{ margin: 0 }}>{state.lastReport}</p>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{selectedEvent && selectedGuide && (\n\t\t\t\t<div\n\t\t\t\t\tdata-dw-section=\"perf-guide\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'grid',\n\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\tpadding: '10px',\n\t\t\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\t\t\tborderRadius: 'var(--dw-radius)',\n\t\t\t\t\t\tborder: `1px solid ${getSeverityColor(selectedEvent.severity)}`\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<h4 style={{ margin: 0, fontSize: '11px', textTransform: 'uppercase' }}>Issue Guide</h4>\n\t\t\t\t\t<div style={{ display: 'grid', gap: '2px' }}>\n\t\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>What</span>\n\t\t\t\t\t\t<span style={{ fontSize: '11px' }}>{selectedGuide.what}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style={{ display: 'grid', gap: '2px' }}>\n\t\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>Where</span>\n\t\t\t\t\t\t<span style={{ fontSize: '11px' }}>{selectedGuide.where}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style={{ display: 'grid', gap: '2px' }}>\n\t\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>How to fix</span>\n\t\t\t\t\t\t<span style={{ fontSize: '11px' }}>{selectedGuide.fix}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{selectedSuspects.length > 0 && (\n\t\t\t\t\t\t<div style={{ display: 'grid', gap: '4px' }}>\n\t\t\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>Suspect components</span>\n\t\t\t\t\t\t\t<div style={{ display: 'flex', gap: '6px', flexWrap: 'wrap' }}>\n\t\t\t\t\t\t\t\t{selectedSuspects.map(function renderSuspect(name) {\n\t\t\t\t\t\t\t\t\tconst isActive = selectedName === name\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey={name}\n\t\t\t\t\t\t\t\t\t\t\tonClick={function clickName() {\n\t\t\t\t\t\t\t\t\t\t\t\thandleHighlight(name)\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: '999px',\n\t\t\t\t\t\t\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: '2px 8px',\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\t\t\t\tbackground: isActive ? 'var(--dw-accent)' : 'var(--dw-bg)',\n\t\t\t\t\t\t\t\t\t\t\t\tcolor: isActive ? '#fff' : 'var(--dw-text)'\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>\n\t\t\t\t\t\t\t\t{hasStrong\n\t\t\t\t\t\t\t\t\t? 'Click a suspect to highlight likely DOM nodes.'\n\t\t\t\t\t\t\t\t\t: 'Only generic names detected. Add data-component on app nodes for precise mapping.'}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{highlightNote && (\n\t\t\t\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>{highlightNote}</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tdata-dw-section=\"perf-events\"\n\t\t\t\tstyle={{ display: 'flex', flexDirection: 'column', gap: '8px' }}\n\t\t\t>\n\t\t\t\t<h4\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\ttextTransform: 'uppercase'\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\tRecent Events ({events.length})\n\t\t\t\t</h4>\n\t\t\t\t{events.length === 0 ? (\n\t\t\t\t\t<div\n\t\t\t\t\t\tdata-dw-empty\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\ttextAlign: 'center',\n\t\t\t\t\t\t\tpadding: 'var(--dw-padding)',\n\t\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\t\t\t\tborderRadius: 'var(--dw-radius)'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<p style={{ margin: 0 }}>No performance issues detected</p>\n\t\t\t\t\t\t<p style={{ margin: 0, fontSize: '10px', opacity: 0.8 }}>\n\t\t\t\t\t\t\tEvents appear when thresholds are crossed\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<ul\n\t\t\t\t\t\tdata-dw-list=\"events\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tlistStyle: 'none',\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\tgap: '4px'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{events.map(function renderEvent(event) {\n\t\t\t\t\t\t\tconst details = getDetails(event)\n\t\t\t\t\t\t\tconst suspects = getSuspects(event)\n\t\t\t\t\t\t\tconst isActive = selectedEvent?.id === event.id\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<li key={event.id}>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tonClick={function selectEvent() {\n\t\t\t\t\t\t\t\t\t\t\tsetSelectedId(event.id)\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tdata-dw-severity={event.severity}\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tdisplay: 'grid',\n\t\t\t\t\t\t\t\t\t\t\tgridTemplateColumns: '1fr auto',\n\t\t\t\t\t\t\t\t\t\t\tgap: '4px',\n\t\t\t\t\t\t\t\t\t\t\tpadding: '8px',\n\t\t\t\t\t\t\t\t\t\t\tbackground: isActive ? 'rgba(255, 255, 255, 0.06)' : 'var(--dw-bg-secondary)',\n\t\t\t\t\t\t\t\t\t\t\tborderRadius: 'var(--dw-radius)',\n\t\t\t\t\t\t\t\t\t\t\tborder: `1px solid ${isActive ? 'var(--dw-accent)' : 'var(--dw-border)'}`,\n\t\t\t\t\t\t\t\t\t\t\tborderLeft: `3px solid ${getSeverityColor(event.severity)}`,\n\t\t\t\t\t\t\t\t\t\t\ttextAlign: 'left',\n\t\t\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\t\t\twidth: '100%'\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div style={{ display: 'flex', flexDirection: 'column', gap: '2px' }}>\n\t\t\t\t\t\t\t\t\t\t\t<div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t<span data-dw-label=\"type\" style={{ fontWeight: 500 }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{event.eventType}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span data-dw-label=\"route\" style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{event.route}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{details && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>{details}</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t{suspects.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\tSuspects: {suspects.join(', ')}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<time\n\t\t\t\t\t\t\t\t\t\t\tdateTime={event.timestamp}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{new Date(event.timestamp).toLocaleTimeString()}\n\t\t\t\t\t\t\t\t\t\t</time>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</ul>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","import { useState, useEffect } from 'react'\nimport type { RoutesState, WidgetDomain, RouteEntry } from '../../../types/internal'\nimport type { RoutesOptions } from '../../../types/featureMap'\n\ntype Props = {\n\tdomain: WidgetDomain<RoutesState, RoutesOptions>\n}\n\n/** Routes tab panel showing discovered routes */\nexport function RoutesTab({ domain }: Props): React.ReactElement {\n\tconst [state, setState] = useState<RoutesState>(domain.getState())\n\n\tuseEffect(\n\t\tfunction subscribeRoutes() {\n\t\t\treturn domain.subscribe(setState)\n\t\t},\n\t\t[domain]\n\t)\n\n\tif (state.loading) {\n\t\treturn (\n\t\t\t<div role=\"region\" aria-label=\"Routes\" aria-busy=\"true\">\n\t\t\t\t<p>Discovering routes...</p>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tif (state.error) {\n\t\treturn (\n\t\t\t<div role=\"region\" aria-label=\"Routes\">\n\t\t\t\t<div data-dw-alert=\"warning\" role=\"alert\">\n\t\t\t\t\t{state.error}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tconst grouped = new Map<string, RouteEntry[]>()\n\tfor (const route of state.routes) {\n\t\tconst key = route.group ?? 'ungrouped'\n\t\tconst list = grouped.get(key) ?? []\n\t\tlist.push(route)\n\t\tgrouped.set(key, list)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\trole=\"region\"\n\t\t\taria-label=\"Routes\"\n\t\t\tstyle={{ display: 'flex', flexDirection: 'column', gap: 'var(--dw-gap)' }}\n\t\t>\n\t\t\t{state.routes.length === 0 ? (\n\t\t\t\t<div\n\t\t\t\t\tdata-dw-empty\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\ttextAlign: 'center',\n\t\t\t\t\t\tpadding: 'var(--dw-padding)',\n\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\t\t\tborderRadius: 'var(--dw-radius)'\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<p style={{ margin: 0 }}>No routes discovered</p>\n\t\t\t\t\t<p style={{ margin: 0, fontSize: '10px', opacity: 0.8 }}>\n\t\t\t\t\t\tRoutes are detected from app directory structure\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\tArray.from(grouped.entries()).map(function renderGroup([group, routes]) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={group}\n\t\t\t\t\t\t\tdata-dw-section=\"route-group\"\n\t\t\t\t\t\t\tstyle={{ display: 'flex', flexDirection: 'column', gap: '4px' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<h4\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tmargin: '8px 0 4px 0',\n\t\t\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\t\t\t\ttextTransform: 'uppercase'\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{group}\n\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t<ul\n\t\t\t\t\t\t\t\tdata-dw-list=\"routes\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tlistStyle: 'none',\n\t\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\t\t\tgap: '2px'\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{routes.map(function renderRoute(route) {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\t\tkey={route.path}\n\t\t\t\t\t\t\t\t\t\t\tdata-dw-dynamic={route.isDynamic}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: '6px 8px',\n\t\t\t\t\t\t\t\t\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: 'var(--dw-radius)',\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '11px'\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<code style={{ color: route.isDynamic ? 'var(--dw-accent)' : 'var(--dw-text)' }}>\n\t\t\t\t\t\t\t\t\t\t\t\t{route.path}\n\t\t\t\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t\t\t\t{route.sourceFile && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-dw-label=\"source\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ fontSize: '10px', color: 'var(--dw-text-muted)', opacity: 0.7 }}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{route.sourceFile.split('/').pop()}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","/* eslint-disable no-console */\nexport type ConsoleEvent = {\n\ttype: 'log' | 'warn' | 'error'\n\targs: unknown[]\n}\n\nexport function setupConsoleInterceptor(callback: (event: ConsoleEvent) => void): () => void {\n\tif (typeof console === 'undefined') return () => {}\n\n\tconst originalLog = console.log\n\tconst originalWarn = console.warn\n\tconst originalError = console.error\n\n\tfunction intercept(type: 'log' | 'warn' | 'error', args: unknown[]) {\n\t\ttry {\n\t\t\tcallback({ type, args })\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tconsole.log = (...args: unknown[]) => {\n\t\toriginalLog.apply(console, args)\n\t\tintercept('log', args)\n\t}\n\n\tconsole.warn = (...args: unknown[]) => {\n\t\toriginalWarn.apply(console, args)\n\t\tintercept('warn', args)\n\t}\n\n\tconsole.error = (...args: unknown[]) => {\n\t\toriginalError.apply(console, args)\n\t\tintercept('error', args)\n\t}\n\n\treturn () => {\n\t\tconsole.log = originalLog\n\t\tconsole.warn = originalWarn\n\t\tconsole.error = originalError\n\t}\n}\n","import type { BodyInfo, HeaderPair } from './monitorTypes'\n\nexport type NetworkEvent = {\n\trequest: {\n\t\turl: string\n\t\tmethod: string\n\t\theaders: ReadonlyArray<HeaderPair>\n\t\tbody?: BodyInfo\n\t}\n\tresponse?: {\n\t\tstatus: number\n\t\tstatusText: string\n\t\tok: boolean\n\t\theaders: ReadonlyArray<HeaderPair>\n\t\tbody?: BodyInfo\n\t}\n\tdurationMs: number\n\terror?: string\n}\n\ntype XhrInfo = {\n\tmethod: string\n\turl: string\n\theaders: HeaderPair[]\n\tbody?: BodyInfo\n\tstart: number\n}\n\ntype XhrBody = Document | XMLHttpRequestBodyInit | null\n\nfunction isTextType(contentType: string | null): boolean {\n\tif (!contentType) return false\n\treturn (\n\t\tcontentType.includes('application/json') ||\n\t\tcontentType.includes('text/') ||\n\t\tcontentType.includes('application/javascript')\n\t)\n}\n\nfunction readHeaders(headers: Headers): HeaderPair[] {\n\tconst list: HeaderPair[] = []\n\theaders.forEach(function push(value, name) {\n\t\tlist.push({ name, value })\n\t})\n\treturn list\n}\n\nfunction readBodyText(text: string, contentType: string | null, maxBytes: number): BodyInfo {\n\tconst bytes = new TextEncoder().encode(text)\n\tconst size = bytes.length\n\tconst truncated = size > maxBytes\n\tconst slice = truncated ? bytes.slice(0, maxBytes) : bytes\n\tconst preview = new TextDecoder().decode(slice)\n\treturn { text: preview, size, truncated, contentType }\n}\n\nasync function readResponseBody(res: Response, maxBytes: number): Promise<BodyInfo | undefined> {\n\tconst contentType = res.headers.get('content-type')\n\tif (!isTextType(contentType)) return undefined\n\n\ttry {\n\t\tconst text = await res.text()\n\t\treturn readBodyText(text, contentType, maxBytes)\n\t} catch {\n\t\treturn undefined\n\t}\n}\n\nasync function readRequestBody(req: Request, maxBytes: number): Promise<BodyInfo | undefined> {\n\tconst contentType = req.headers.get('content-type')\n\tif (!isTextType(contentType)) return undefined\n\n\ttry {\n\t\tconst text = await req.text()\n\t\treturn readBodyText(text, contentType, maxBytes)\n\t} catch {\n\t\treturn undefined\n\t}\n}\n\nfunction parseHeaderLines(raw: string): HeaderPair[] {\n\tconst lines = raw.split(/\\r?\\n/)\n\tconst out: HeaderPair[] = []\n\tfor (const line of lines) {\n\t\tif (!line) continue\n\t\tconst idx = line.indexOf(':')\n\t\tif (idx === -1) continue\n\t\tconst name = line.slice(0, idx).trim()\n\t\tconst value = line.slice(idx + 1).trim()\n\t\tout.push({ name, value })\n\t}\n\treturn out\n}\n\nfunction getInfo(xhr: XMLHttpRequest): XhrInfo | null {\n\tconst withInfo = xhr as XMLHttpRequest & { __dwInfo?: XhrInfo }\n\treturn withInfo.__dwInfo ?? null\n}\n\nfunction setInfo(xhr: XMLHttpRequest, info: XhrInfo): void {\n\tconst withInfo = xhr as XMLHttpRequest & { __dwInfo?: XhrInfo }\n\twithInfo.__dwInfo = info\n}\n\nfunction setBody(info: XhrInfo, body: unknown, maxBytes: number): void {\n\tif (body === undefined || body === null) return\n\tif (typeof body === 'string') {\n\t\tinfo.body = readBodyText(body, null, maxBytes)\n\t\treturn\n\t}\n\tif (body instanceof URLSearchParams) {\n\t\tinfo.body = readBodyText(body.toString(), 'application/x-www-form-urlencoded', maxBytes)\n\t\treturn\n\t}\n\tif (body instanceof FormData) {\n\t\tconst entries: string[] = []\n\t\tbody.forEach(function add(value, key) {\n\t\t\tentries.push(`${key}=${String(value)}`)\n\t\t})\n\t\tinfo.body = readBodyText(entries.join('&'), 'multipart/form-data', maxBytes)\n\t}\n}\n\nfunction createReq(\n\turl: string,\n\tmethod: string,\n\theaders: ReadonlyArray<HeaderPair>,\n\tbody?: BodyInfo\n): NetworkEvent['request'] {\n\tif (body) {\n\t\treturn { url, method, headers, body }\n\t}\n\treturn { url, method, headers }\n}\n\nfunction createRes(\n\tstatus: number,\n\tstatusText: string,\n\tok: boolean,\n\theaders: ReadonlyArray<HeaderPair>,\n\tbody?: BodyInfo\n): NonNullable<NetworkEvent['response']> {\n\tif (body) {\n\t\treturn { status, statusText, ok, headers, body }\n\t}\n\treturn { status, statusText, ok, headers }\n}\n\nexport function setupNetworkInterceptor(callback: (event: NetworkEvent) => void): () => void {\n\tif (typeof window === 'undefined') return () => {}\n\n\tconst originalFetch = window.fetch\n\tconst Xhr = window.XMLHttpRequest\n\tconst originalOpen = Xhr.prototype.open\n\tconst originalSend = Xhr.prototype.send\n\tconst originalSetHeader = Xhr.prototype.setRequestHeader\n\tconst maxBytes = 65536\n\n\tconst patchedFetch = async function (...args: Parameters<typeof fetch>): Promise<Response> {\n\t\tconst start = performance.now()\n\t\tlet req: Request | null = null\n\t\tlet requestHeaders: HeaderPair[] = []\n\t\tlet requestBody: BodyInfo | undefined\n\n\t\ttry {\n\t\t\treq = new Request(args[0], args[1])\n\t\t\trequestHeaders = readHeaders(req.headers)\n\t\t\tconst clone = req.clone()\n\t\t\trequestBody = await readRequestBody(clone, maxBytes)\n\t\t} catch {}\n\n\t\ttry {\n\t\t\tconst res = await originalFetch(...args)\n\t\t\tconst durationMs = Math.round(performance.now() - start)\n\t\t\tconst responseHeaders = readHeaders(res.headers)\n\t\t\tlet responseBody: BodyInfo | undefined\n\n\t\t\ttry {\n\t\t\t\tconst clone = res.clone()\n\t\t\t\tresponseBody = await readResponseBody(clone, maxBytes)\n\t\t\t} catch {}\n\n\t\t\tcallback({\n\t\t\t\trequest: createReq(\n\t\t\t\t\treq?.url ?? String(args[0]),\n\t\t\t\t\treq?.method ?? 'GET',\n\t\t\t\t\trequestHeaders,\n\t\t\t\t\trequestBody\n\t\t\t\t),\n\t\t\t\tresponse: createRes(res.status, res.statusText, res.ok, responseHeaders, responseBody),\n\t\t\t\tdurationMs\n\t\t\t})\n\n\t\t\treturn res\n\t\t} catch (error) {\n\t\t\tconst durationMs = Math.round(performance.now() - start)\n\t\t\tconst failEvent: NetworkEvent = {\n\t\t\t\trequest: createReq(\n\t\t\t\t\treq?.url ?? String(args[0]),\n\t\t\t\t\treq?.method ?? 'GET',\n\t\t\t\t\trequestHeaders,\n\t\t\t\t\trequestBody\n\t\t\t\t),\n\t\t\t\tdurationMs\n\t\t\t}\n\t\t\tif (error instanceof Error) {\n\t\t\t\tfailEvent.error = error.message\n\t\t\t} else {\n\t\t\t\tfailEvent.error = 'Network error'\n\t\t\t}\n\t\t\tcallback(failEvent)\n\t\t\tthrow error\n\t\t}\n\t}\n\twindow.fetch = patchedFetch as typeof window.fetch\n\n\tXhr.prototype.open = function (\n\t\tthis: XMLHttpRequest,\n\t\tmethod: string,\n\t\turl: string,\n\t\tasync?: boolean,\n\t\tuser?: string | null,\n\t\tpassword?: string | null\n\t) {\n\t\tsetInfo(this, {\n\t\t\tmethod,\n\t\t\turl,\n\t\t\theaders: [],\n\t\t\tstart: 0\n\t\t})\n\t\treturn originalOpen.call(this, method, url, async ?? true, user ?? null, password ?? null)\n\t}\n\n\tXhr.prototype.setRequestHeader = function (this: XMLHttpRequest, name: string, value: string) {\n\t\tconst info = getInfo(this)\n\t\tif (info) {\n\t\t\tinfo.headers.push({ name, value })\n\t\t}\n\t\treturn originalSetHeader.call(this, name, value)\n\t}\n\n\tXhr.prototype.send = function (this: XMLHttpRequest, body?: XhrBody) {\n\t\tconst info = getInfo(this)\n\t\tif (info) {\n\t\t\tinfo.start = performance.now()\n\t\t\tsetBody(info, body, maxBytes)\n\t\t}\n\n\t\tconst onLoadEnd = () => {\n\t\t\tthis.removeEventListener('loadend', onLoadEnd)\n\t\t\tconst data = getInfo(this)\n\t\t\tif (!data) return\n\t\t\tconst durationMs = Math.round(performance.now() - data.start)\n\t\t\tconst responseHeaders = parseHeaderLines(this.getAllResponseHeaders())\n\t\t\tconst status = this.status\n\t\t\tconst statusText = this.statusText || ''\n\t\t\tconst ok = status >= 200 && status < 300\n\t\t\tlet responseBody: BodyInfo | undefined\n\n\t\t\tif (this.responseType === '' || this.responseType === 'text') {\n\t\t\t\tif (typeof this.responseText === 'string') {\n\t\t\t\t\tresponseBody = readBodyText(\n\t\t\t\t\t\tthis.responseText,\n\t\t\t\t\t\tthis.getResponseHeader('content-type'),\n\t\t\t\t\t\tmaxBytes\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst doneEvent: NetworkEvent = {\n\t\t\t\trequest: createReq(data.url, data.method, data.headers, data.body),\n\t\t\t\tresponse: createRes(status, statusText, ok, responseHeaders, responseBody),\n\t\t\t\tdurationMs\n\t\t\t}\n\t\t\tif (!ok && this.statusText) {\n\t\t\t\tdoneEvent.error = this.statusText\n\t\t\t}\n\t\t\tcallback(doneEvent)\n\t\t}\n\n\t\tthis.addEventListener('loadend', onLoadEnd)\n\t\treturn originalSend.call(this, body ?? null)\n\t}\n\n\treturn () => {\n\t\twindow.fetch = originalFetch\n\t\tXhr.prototype.open = originalOpen\n\t\tXhr.prototype.send = originalSend\n\t\tXhr.prototype.setRequestHeader = originalSetHeader\n\t}\n}\n","import type {\n\tMonitorState,\n\tMonitorRule,\n\tMonitorMatch,\n\tConsoleDetails,\n\tNetworkDetails\n} from './monitorTypes'\nimport { setupConsoleInterceptor, type ConsoleEvent } from './consoleInterceptor'\nimport { setupNetworkInterceptor, type NetworkEvent } from './networkInterceptor'\nimport type { WidgetDomain } from '../../types/internal'\n\nimport type { MonitorOptions } from '../../types/featureMap'\nexport type { MonitorOptions }\n\ntype MonitorDomain = WidgetDomain<MonitorState, MonitorOptions> & {\n\taddRule(rule: Omit<MonitorRule, 'id' | 'enabled'>): void\n\tremoveRule(id: string): void\n\ttoggleRule(id: string): void\n\tclearMatches(): void\n}\n\nexport function createMonitorDomain() {\n\tlet state: MonitorState = {\n\t\trules: [],\n\t\tmatches: [],\n\t\tisListening: false\n\t}\n\tconst listeners = new Set<(s: MonitorState) => void>()\n\n\tlet consoleCleanup: (() => void) | null = null\n\tlet networkCleanup: (() => void) | null = null\n\n\tfunction notify() {\n\t\tfor (const fn of listeners) fn(state)\n\t}\n\n\tfunction addRule(rule: Omit<MonitorRule, 'id' | 'enabled'>): void {\n\t\tconst newRule: MonitorRule = {\n\t\t\t...rule,\n\t\t\tid: Math.random().toString(36).slice(2),\n\t\t\tenabled: true\n\t\t}\n\t\tstate = { ...state, rules: [...state.rules, newRule] }\n\t\tnotify()\n\t}\n\n\tfunction removeRule(id: string): void {\n\t\tstate = { ...state, rules: state.rules.filter((r) => r.id !== id) }\n\t\tnotify()\n\t}\n\n\tfunction clearMatches(): void {\n\t\tstate = { ...state, matches: [] }\n\t\tnotify()\n\t}\n\n\tfunction toggleRule(id: string): void {\n\t\tstate = {\n\t\t\t...state,\n\t\t\trules: state.rules.map((r) => (r.id === id ? { ...r, enabled: !r.enabled } : r))\n\t\t}\n\t\tnotify()\n\t}\n\n\tfunction matchRule(content: string, rule: MonitorRule): boolean {\n\t\tif (!rule.enabled) return false\n\t\ttry {\n\t\t\t// Check if rule.match looks like regex e.g. \"/abc/i\"\n\t\t\t// For simplicity, treat as substring unless it starts/ends with /\n\t\t\tif (rule.match.startsWith('/') && rule.match.lastIndexOf('/') > 0) {\n\t\t\t\tconst lastSlash = rule.match.lastIndexOf('/')\n\t\t\t\tconst pattern = rule.match.slice(1, lastSlash)\n\t\t\t\tconst flags = rule.match.slice(lastSlash + 1)\n\t\t\t\tconst regex = new RegExp(pattern, flags)\n\t\t\t\treturn regex.test(content)\n\t\t\t}\n\t\t\treturn content.includes(rule.match)\n\t\t} catch {\n\t\t\treturn content.includes(rule.match)\n\t\t}\n\t}\n\n\tfunction handleConsole(event: ConsoleEvent) {\n\t\tconst content = event.args\n\t\t\t.map(function toText(arg) {\n\t\t\t\tif (typeof arg === 'string') return arg\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.stringify(arg)\n\t\t\t\t} catch {\n\t\t\t\t\treturn String(arg)\n\t\t\t\t}\n\t\t\t})\n\t\t\t.join(' ')\n\n\t\tconst matchedRules = state.rules\n\t\t\t.filter(function hasType(r) {\n\t\t\t\treturn r.type === 'console'\n\t\t\t})\n\t\t\t.filter(function hasMatch(r) {\n\t\t\t\treturn matchRule(content, r)\n\t\t\t})\n\n\t\tif (matchedRules.length > 0) {\n\t\t\tconst newMatches: MonitorMatch[] = matchedRules.map(function makeMatch(r) {\n\t\t\t\tconst details: ConsoleDetails = {\n\t\t\t\t\ttype: 'console',\n\t\t\t\t\tlevel: event.type,\n\t\t\t\t\targs: event.args\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tid: Math.random().toString(36).slice(2),\n\t\t\t\t\truleId: r.id,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tcontent,\n\t\t\t\t\tdetails\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate = { ...state, matches: [...newMatches, ...state.matches].slice(0, 100) }\n\t\t\tnotify()\n\t\t}\n\t}\n\n\tfunction handleNetwork(event: NetworkEvent) {\n\t\tconst status = event.response?.status ?? 0\n\t\tconst method = event.request.method\n\t\tconst url = event.request.url\n\t\tconst content = `${method} ${url} ${status}`\n\n\t\tconst matchedRules = state.rules\n\t\t\t.filter(function hasType(r) {\n\t\t\t\treturn r.type === 'network'\n\t\t\t})\n\t\t\t.filter(function hasMatch(r) {\n\t\t\t\treturn matchRule(content, r)\n\t\t\t})\n\n\t\tif (matchedRules.length > 0) {\n\t\t\tconst newMatches: MonitorMatch[] = matchedRules.map(function makeMatch(r) {\n\t\t\t\tconst details: NetworkDetails = {\n\t\t\t\t\ttype: 'network',\n\t\t\t\t\trequest: event.request,\n\t\t\t\t\tdurationMs: event.durationMs\n\t\t\t\t}\n\t\t\t\tif (event.response) {\n\t\t\t\t\tdetails.response = event.response\n\t\t\t\t}\n\t\t\t\tif (event.error) {\n\t\t\t\t\tdetails.error = event.error\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tid: Math.random().toString(36).slice(2),\n\t\t\t\t\truleId: r.id,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tcontent,\n\t\t\t\t\tdetails\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate = { ...state, matches: [...newMatches, ...state.matches].slice(0, 100) }\n\t\t\tnotify()\n\t\t}\n\t}\n\n\tfunction setup(_config: MonitorOptions): void {\n\t\t//\n\t}\n\n\tfunction start(): void {\n\t\tif (state.isListening) return\n\n\t\tconsoleCleanup = setupConsoleInterceptor(handleConsole)\n\t\tnetworkCleanup = setupNetworkInterceptor(handleNetwork)\n\n\t\tstate = { ...state, isListening: true }\n\t\tnotify()\n\t}\n\n\tfunction stop(): void {\n\t\tif (consoleCleanup) {\n\t\t\tconsoleCleanup()\n\t\t\tconsoleCleanup = null\n\t\t}\n\t\tif (networkCleanup) {\n\t\t\tnetworkCleanup()\n\t\t\tnetworkCleanup = null\n\t\t}\n\t\tstate = { ...state, isListening: false }\n\t\tnotify()\n\t}\n\n\tconst domain: MonitorDomain = {\n\t\tid: 'monitor',\n\t\tsetup,\n\t\tstart,\n\t\tstop,\n\t\tgetState: function getState() {\n\t\t\treturn state\n\t\t},\n\t\tsubscribe: function subscribe(fn: (s: MonitorState) => void) {\n\t\t\tlisteners.add(fn)\n\t\t\treturn function unsubscribe() {\n\t\t\t\tlisteners.delete(fn)\n\t\t\t}\n\t\t},\n\t\taddRule,\n\t\tremoveRule,\n\t\ttoggleRule,\n\t\tclearMatches\n\t}\n\n\treturn domain\n}\n","import { useState, useEffect } from 'react'\nimport type { MonitorState, MonitorRule, MonitorMatch, MonitorDetails } from '../monitorTypes'\nimport type { MonitorOptions } from '../monitorDomain'\nimport type { WidgetDomain } from '../../../types/internal'\n\ntype MonitorDomain = WidgetDomain<MonitorState, MonitorOptions> & {\n\taddRule(rule: Omit<MonitorRule, 'id' | 'enabled'>): void\n\tremoveRule(id: string): void\n\ttoggleRule(id: string): void\n\tclearMatches(): void\n\tstart(): void\n\tstop(): void\n}\n\ntype Props = {\n\tdomain: MonitorDomain\n}\n\nfunction formatTime(value: number): string {\n\treturn new Date(value).toLocaleTimeString([], {\n\t\thour12: false,\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\tsecond: '2-digit'\n\t})\n}\n\nfunction stringifyValue(value: unknown): string {\n\tif (typeof value === 'string') return value\n\tif (typeof value === 'number') return String(value)\n\tif (typeof value === 'boolean') return String(value)\n\ttry {\n\t\treturn JSON.stringify(value, null, 2)\n\t} catch {\n\t\treturn String(value)\n\t}\n}\n\nfunction formatBytes(size: number): string {\n\tif (size < 1024) return `${size} B`\n\tif (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`\n\treturn `${(size / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction clearCookies(): number {\n\tif (typeof document === 'undefined') return 0\n\tconst parts = document.cookie.split(';')\n\tlet count = 0\n\tfor (const part of parts) {\n\t\tconst [name] = part.split('=')\n\t\tconst key = name?.trim()\n\t\tif (!key) continue\n\t\tdocument.cookie = `${key}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`\n\t\tcount++\n\t}\n\treturn count\n}\n\nfunction clearStores(): number {\n\tif (typeof window === 'undefined') return 0\n\tconst total = window.localStorage.length + window.sessionStorage.length\n\twindow.localStorage.clear()\n\twindow.sessionStorage.clear()\n\treturn total\n}\n\nasync function clearCaches(): Promise<number> {\n\tif (typeof window === 'undefined' || !('caches' in window)) return 0\n\tconst keys = await window.caches.keys()\n\tfor (const key of keys) {\n\t\tawait window.caches.delete(key)\n\t}\n\treturn keys.length\n}\n\nfunction reloadPage(): void {\n\tif (typeof window === 'undefined') return\n\twindow.location.reload()\n}\n\nfunction bustPage(): void {\n\tif (typeof window === 'undefined') return\n\tconst url = new URL(window.location.href)\n\turl.searchParams.set('dwcb', String(Date.now()))\n\twindow.location.assign(url.toString())\n}\n\nexport function MonitorTab({ domain }: Props): React.ReactElement {\n\tconst [state, setState] = useState<MonitorState>(domain.getState())\n\tconst [newRuleMatch, setNewRuleMatch] = useState('')\n\tconst [newRuleType, setNewRuleType] = useState<'console' | 'network'>('console')\n\tconst [isFocus, setIsFocus] = useState(false)\n\tconst [selectedId, setSelectedId] = useState<string | null>(null)\n\tconst [showReqBody, setShowReqBody] = useState(false)\n\tconst [showResBody, setShowResBody] = useState(false)\n\tconst [actionRun, setActionRun] = useState(false)\n\tconst [actionNote, setActionNote] = useState('')\n\n\tuseEffect(() => {\n\t\treturn domain.subscribe(setState)\n\t}, [domain])\n\n\tuseEffect(\n\t\tfunction syncSelection() {\n\t\t\tif (!selectedId) return\n\t\t\tconst exists = state.matches.some(function hasMatch(m) {\n\t\t\t\treturn m.id === selectedId\n\t\t\t})\n\t\t\tif (!exists) {\n\t\t\t\tsetSelectedId(null)\n\t\t\t}\n\t\t},\n\t\t[selectedId, state.matches]\n\t)\n\n\tuseEffect(\n\t\tfunction resetBody() {\n\t\t\tsetShowReqBody(false)\n\t\t\tsetShowResBody(false)\n\t\t},\n\t\t[selectedId]\n\t)\n\n\tfunction handleAdd() {\n\t\tif (!newRuleMatch.trim()) return\n\t\tdomain.addRule({\n\t\t\ttype: newRuleType,\n\t\t\tmatch: newRuleMatch\n\t\t})\n\t\tsetNewRuleMatch('')\n\t}\n\n\tfunction handleToggle() {\n\t\tif (state.isListening) domain.stop()\n\t\telse domain.start()\n\t}\n\n\tfunction handleRuleTypeChange(e: React.ChangeEvent<HTMLSelectElement>) {\n\t\tsetNewRuleType(e.target.value as MonitorRule['type'])\n\t}\n\n\tfunction handleRuleMatchChange(e: React.ChangeEvent<HTMLInputElement>) {\n\t\tsetNewRuleMatch(e.target.value)\n\t}\n\n\tfunction handleRuleInputFocus() {\n\t\tsetIsFocus(true)\n\t}\n\n\tfunction handleRuleInputBlur() {\n\t\tsetIsFocus(false)\n\t}\n\n\tfunction handleRuleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n\t\tif (e.key === 'Enter') handleAdd()\n\t}\n\n\tfunction handleClearMatches() {\n\t\tdomain.clearMatches()\n\t\tsetSelectedId(null)\n\t}\n\n\tfunction handleSelect(matchId: string) {\n\t\tsetSelectedId(matchId)\n\t}\n\n\tasync function handleClearStorage() {\n\t\tsetActionRun(true)\n\t\ttry {\n\t\t\tconst storeCount = clearStores()\n\t\t\tconst cookieCount = clearCookies()\n\t\t\tsetActionNote(`Cleared storage (${storeCount}) and cookies (${cookieCount}).`)\n\t\t} finally {\n\t\t\tsetActionRun(false)\n\t\t}\n\t}\n\n\tasync function handleClearCache() {\n\t\tsetActionRun(true)\n\t\ttry {\n\t\t\tconst cacheCount = await clearCaches()\n\t\t\tsetActionNote(`Cleared cache buckets (${cacheCount}).`)\n\t\t} finally {\n\t\t\tsetActionRun(false)\n\t\t}\n\t}\n\n\tasync function handleClearAll() {\n\t\tsetActionRun(true)\n\t\ttry {\n\t\t\tconst storeCount = clearStores()\n\t\t\tconst cookieCount = clearCookies()\n\t\t\tconst cacheCount = await clearCaches()\n\t\t\tsetActionNote(\n\t\t\t\t`Cleared storage (${storeCount}), cookies (${cookieCount}), cache (${cacheCount}).`\n\t\t\t)\n\t\t} finally {\n\t\t\tsetActionRun(false)\n\t\t}\n\t}\n\n\tasync function handleRestart() {\n\t\tsetActionRun(true)\n\t\ttry {\n\t\t\tconst response = await fetch('/api/dev-widget/restart', { method: 'POST' })\n\t\t\tif (response.ok) {\n\t\t\t\tsetActionNote('Restart request sent to /api/dev-widget/restart.')\n\t\t\t} else {\n\t\t\t\tsetActionNote('Restart endpoint found but returned non-success status.')\n\t\t\t}\n\t\t} catch {\n\t\t\tsetActionNote('No restart endpoint found. Add POST /api/dev-widget/restart to enable it.')\n\t\t} finally {\n\t\t\tsetActionRun(false)\n\t\t}\n\t}\n\n\tfunction handleToggleReqBody() {\n\t\tsetShowReqBody(function toggle(value) {\n\t\t\treturn !value\n\t\t})\n\t}\n\n\tfunction handleToggleResBody() {\n\t\tsetShowResBody(function toggle(value) {\n\t\t\treturn !value\n\t\t})\n\t}\n\n\tfunction findRule(ruleId: string): MonitorRule | undefined {\n\t\treturn state.rules.find(function match(rule) {\n\t\t\treturn rule.id === ruleId\n\t\t})\n\t}\n\n\tfunction renderHeaders(headers: ReadonlyArray<{ name: string; value: string }>) {\n\t\tif (headers.length === 0) {\n\t\t\treturn <span style={{ color: 'var(--dw-text-muted)' }}>None</span>\n\t\t}\n\n\t\treturn (\n\t\t\t<ul style={{ listStyle: 'none', margin: 0, padding: 0, display: 'grid', gap: '6px' }}>\n\t\t\t\t{headers.map(function renderHeader(header) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<li key={`${header.name}-${header.value}`} style={{ display: 'grid', gap: '2px' }}>\n\t\t\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>{header.name}</span>\n\t\t\t\t\t\t\t<code style={{ fontSize: '11px', color: 'var(--dw-text)' }}>{header.value}</code>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</ul>\n\t\t)\n\t}\n\n\tfunction renderBody(body: { text: string | null; size: number; truncated: boolean } | undefined) {\n\t\tif (!body || !body.text) {\n\t\t\treturn <span style={{ color: 'var(--dw-text-muted)' }}>No body captured</span>\n\t\t}\n\n\t\treturn (\n\t\t\t<div style={{ display: 'grid', gap: '6px' }}>\n\t\t\t\t<code style={{ whiteSpace: 'pre-wrap', fontSize: '11px', lineHeight: '1.4' }}>{body.text}</code>\n\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>\n\t\t\t\t\t{formatBytes(body.size)}\n\t\t\t\t\t{body.truncated ? ' (truncated)' : ''}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tfunction renderNetworkDemo() {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: 'grid',\n\t\t\t\t\tgap: '10px',\n\t\t\t\t\tpadding: '12px',\n\t\t\t\t\tborderRadius: 'var(--dw-radius)',\n\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\tbackground: 'var(--dw-bg-secondary)'\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div style={{ display: 'grid', gap: '2px' }}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\ttextTransform: 'uppercase',\n\t\t\t\t\t\t\tletterSpacing: '0.05em',\n\t\t\t\t\t\t\tcolor: 'var(--dw-text-muted)'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tNetwork Recorder Example\n\t\t\t\t\t</span>\n\t\t\t\t\t<span style={{ fontSize: '11px', color: 'var(--dw-text)' }}>\n\t\t\t\t\t\tType a rule, press Track, then trigger a request that matches it.\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div style={{ display: 'grid', gap: '6px' }}>\n\t\t\t\t\t<code style={{ fontSize: '11px' }}>Rule: `GET /api/orders 500`</code>\n\t\t\t\t\t<code style={{ fontSize: '11px' }}>Rule (regex): `/POST .*checkout/i`</code>\n\t\t\t\t\t<code style={{ fontSize: '11px' }}>Captured: `POST /api/checkout 502 | 784ms`</code>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tfunction renderConsole(details: MonitorDetails) {\n\t\tif (details.type !== 'console') return null\n\t\treturn (\n\t\t\t<div style={{ display: 'grid', gap: '10px' }}>\n\t\t\t\t<div style={{ display: 'grid', gap: '4px' }}>\n\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>Level</span>\n\t\t\t\t\t<code style={{ fontSize: '11px' }}>{details.level}</code>\n\t\t\t\t</div>\n\t\t\t\t<div style={{ display: 'grid', gap: '4px' }}>\n\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>Arguments</span>\n\t\t\t\t\t<code style={{ whiteSpace: 'pre-wrap', fontSize: '11px' }}>\n\t\t\t\t\t\t{details.args\n\t\t\t\t\t\t\t.map(function renderArg(arg, index) {\n\t\t\t\t\t\t\t\treturn `${index + 1}. ${stringifyValue(arg)}`\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.join('\\n')}\n\t\t\t\t\t</code>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tfunction renderNetwork(details: MonitorDetails) {\n\t\tif (details.type !== 'network') return null\n\n\t\treturn (\n\t\t\t<div style={{ display: 'grid', gap: '14px' }}>\n\t\t\t\t<div style={{ display: 'grid', gap: '6px' }}>\n\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>Summary</span>\n\t\t\t\t\t<div style={{ display: 'grid', gap: '4px' }}>\n\t\t\t\t\t\t<code style={{ fontSize: '11px' }}>\n\t\t\t\t\t\t\t{details.request.method} {details.request.url}\n\t\t\t\t\t\t</code>\n\t\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>\n\t\t\t\t\t\t\tStatus {details.response?.status ?? 0} • {details.durationMs}ms\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{details.error && (\n\t\t\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-danger)' }}>{details.error}</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div style={{ display: 'grid', gap: '8px' }}>\n\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>Request</span>\n\t\t\t\t\t{renderHeaders(details.request.headers)}\n\t\t\t\t\t{details.request.body && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tonClick={handleToggleReqBody}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\tcolor: 'var(--dw-accent)',\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\ttextAlign: 'left'\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{showReqBody ? 'Hide body' : 'Show body'}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t\t{showReqBody && renderBody(details.request.body)}\n\t\t\t\t</div>\n\n\t\t\t\t<div style={{ display: 'grid', gap: '8px' }}>\n\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>Response</span>\n\t\t\t\t\t{details.response ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t{renderHeaders(details.response.headers)}\n\t\t\t\t\t\t\t{details.response.body && (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tonClick={handleToggleResBody}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\t\tcolor: 'var(--dw-accent)',\n\t\t\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\t\t\ttextAlign: 'left'\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{showResBody ? 'Hide body' : 'Show body'}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{showResBody && renderBody(details.response.body)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span style={{ color: 'var(--dw-text-muted)' }}>No response captured</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tfunction renderMatch(match: MonitorMatch, index: number) {\n\t\tconst rule = findRule(match.ruleId)\n\t\tconst isActive = match.id === selectedId\n\t\tconst ruleType = rule?.type ?? match.details?.type ?? 'console'\n\t\tconst badge = ruleType === 'network' ? 'NET' : 'LOG'\n\n\t\treturn (\n\t\t\t<button\n\t\t\t\tkey={match.id}\n\t\t\t\tonClick={function onClick() {\n\t\t\t\t\thandleSelect(match.id)\n\t\t\t\t}}\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\tgap: '4px',\n\t\t\t\t\tpadding: '10px',\n\t\t\t\t\tborderRadius: '8px',\n\t\t\t\t\tbackground: isActive ? 'rgba(59, 130, 246, 0.15)' : 'var(--dw-bg-secondary)',\n\t\t\t\t\tborder: isActive ? '1px solid rgba(59, 130, 246, 0.4)' : '1px solid var(--dw-border)',\n\t\t\t\t\tanimation: `dw-slide-up 0.3s ease-out backwards ${index * 0.05}s relative`,\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\ttextAlign: 'left',\n\t\t\t\t\tcursor: 'pointer'\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\twidth: '3px',\n\t\t\t\t\t\tbackground: 'var(--dw-accent)'\n\t\t\t\t\t}}\n\t\t\t\t/>\n\n\t\t\t\t<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n\t\t\t\t\t<div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: '9px',\n\t\t\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\t\t\tfontFamily: 'var(--dw-font-mono)'\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{formatTime(match.timestamp)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tpadding: '2px 4px',\n\t\t\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\t\t\tfontSize: '9px',\n\t\t\t\t\t\t\t\tfontWeight: 800,\n\t\t\t\t\t\t\t\ttextTransform: 'uppercase',\n\t\t\t\t\t\t\t\tbackground:\n\t\t\t\t\t\t\t\t\truleType === 'network' ? 'rgba(59, 130, 246, 0.15)' : 'rgba(245, 158, 11, 0.15)',\n\t\t\t\t\t\t\t\tcolor: ruleType === 'network' ? '#3b82f6' : '#f59e0b'\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{badge}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{match.details?.type === 'console' && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: '9px',\n\t\t\t\t\t\t\t\tfontWeight: 800,\n\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\tmatch.details.level === 'error'\n\t\t\t\t\t\t\t\t\t\t? '#ef4444'\n\t\t\t\t\t\t\t\t\t\t: match.details.level === 'warn'\n\t\t\t\t\t\t\t\t\t\t\t? '#f59e0b'\n\t\t\t\t\t\t\t\t\t\t\t: 'var(--dw-text-muted)',\n\t\t\t\t\t\t\t\ttextTransform: 'uppercase'\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{match.details.level}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{match.details?.type === 'network' && (\n\t\t\t\t\t\t<span style={{ fontSize: '9px', color: 'var(--dw-text-muted)' }}>\n\t\t\t\t\t\t\t{match.details.response?.status ?? 0}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t<code\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twhiteSpace: 'pre-wrap',\n\t\t\t\t\t\twordBreak: 'break-all',\n\t\t\t\t\t\tfontFamily: 'var(--dw-font-mono)',\n\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\tlineHeight: '1.4',\n\t\t\t\t\t\tcolor: 'var(--dw-text)'\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{match.content}\n\t\t\t\t</code>\n\t\t\t</button>\n\t\t)\n\t}\n\n\tfunction renderDetails(match: MonitorMatch | null) {\n\t\tif (!match) {\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tpadding: '24px',\n\t\t\t\t\t\tborderRadius: '12px',\n\t\t\t\t\t\tborder: '1px dashed var(--dw-border)',\n\t\t\t\t\t\tbackground: 'rgba(255, 255, 255, 0.02)',\n\t\t\t\t\t\ttextAlign: 'center',\n\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\tfontSize: '11px'\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\tSelect an intercept to inspect full details.\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\n\t\tconst rule = findRule(match.ruleId)\n\t\tconst details = match.details\n\n\t\treturn (\n\t\t\t<div style={{ display: 'grid', gap: '14px' }}>\n\t\t\t\t<div style={{ display: 'grid', gap: '6px' }}>\n\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>Rule</span>\n\t\t\t\t\t<div style={{ display: 'grid', gap: '2px' }}>\n\t\t\t\t\t\t<code style={{ fontSize: '11px' }}>{rule?.match ?? 'unknown'}</code>\n\t\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>\n\t\t\t\t\t\t\t{rule?.type ?? 'unknown'} • {formatTime(match.timestamp)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{details ? (\n\t\t\t\t\tdetails.type === 'network' ? (\n\t\t\t\t\t\trenderNetwork(details)\n\t\t\t\t\t) : (\n\t\t\t\t\t\trenderConsole(details)\n\t\t\t\t\t)\n\t\t\t\t) : (\n\t\t\t\t\t<span style={{ color: 'var(--dw-text-muted)' }}>No details available</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\t}\n\n\tconst selectedMatch =\n\t\tselectedId === null\n\t\t\t? (state.matches[0] ?? null)\n\t\t\t: (state.matches.find(function matchSelected(m) {\n\t\t\t\t\treturn m.id === selectedId\n\t\t\t\t}) ?? null)\n\n\treturn (\n\t\t<div\n\t\t\tstyle={{\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tflexDirection: 'column',\n\t\t\t\tgap: '20px',\n\t\t\t\tanimation: 'dw-fade-in 0.3s ease-out'\n\t\t\t}}\n\t\t>\n\t\t\t<div\n\t\t\t\tdata-dw-section=\"monitor-header\"\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\t\talignItems: 'center',\n\t\t\t\t\tpadding: '12px',\n\t\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\t\tborderRadius: 'var(--dw-radius)',\n\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\tgap: '8px'\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={handleToggle}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tpadding: '6px 10px',\n\t\t\t\t\t\t\tborderRadius: '6px',\n\t\t\t\t\t\t\tbackground: state.isListening ? 'var(--dw-success)' : 'var(--dw-bg)',\n\t\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\t\tcolor: state.isListening ? '#fff' : 'var(--dw-text)',\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\tfontWeight: 600\n\t\t\t\t\t\t}}\n\t\t\t\t\t\taria-label={state.isListening ? 'Stop monitoring' : 'Start monitoring'}\n\t\t\t\t\t>\n\t\t\t\t\t\t{state.isListening ? 'Stop Recorder' : 'Start Recorder'}\n\t\t\t\t\t</button>\n\t\t\t\t\t<div style={{ display: 'flex', flexDirection: 'column' }}>\n\t\t\t\t\t\t<span style={{ fontSize: '12px', fontWeight: 600, color: 'var(--dw-text)' }}>\n\t\t\t\t\t\t\tNetwork Recorder\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\tgap: '4px'\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\twidth: '6px',\n\t\t\t\t\t\t\t\t\theight: '6px',\n\t\t\t\t\t\t\t\t\tborderRadius: '50%',\n\t\t\t\t\t\t\t\t\tbackground: state.isListening ? '#10b981' : '#6b7280'\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{state.isListening ? 'Listening' : 'Idle'}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n\t\t\t\t\t<div style={{ textAlign: 'right' }}>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\t\t\ttextTransform: 'uppercase',\n\t\t\t\t\t\t\t\tletterSpacing: '0.05em'\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tTotal Matches\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={{ fontSize: '18px', fontWeight: 700, color: 'var(--dw-accent)' }}>\n\t\t\t\t\t\t\t{state.matches.length}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: 'grid',\n\t\t\t\t\tgap: '8px',\n\t\t\t\t\tpadding: '12px',\n\t\t\t\t\tborderRadius: 'var(--dw-radius)',\n\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\tbackground: 'var(--dw-bg-secondary)'\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span style={{ fontSize: '11px', fontWeight: 600, color: 'var(--dw-text-muted)' }}>\n\t\t\t\t\tBrowser Tools\n\t\t\t\t</span>\n\t\t\t\t<div style={{ display: 'flex', flexWrap: 'wrap', gap: '6px' }}>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={reloadPage}\n\t\t\t\t\t\tdisabled={actionRun}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tpadding: '6px 10px',\n\t\t\t\t\t\t\tborderRadius: '6px',\n\t\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\t\tbackground: 'var(--dw-bg)',\n\t\t\t\t\t\t\tcolor: 'var(--dw-text)',\n\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\tcursor: 'pointer'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tRefresh\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={bustPage}\n\t\t\t\t\t\tdisabled={actionRun}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tpadding: '6px 10px',\n\t\t\t\t\t\t\tborderRadius: '6px',\n\t\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\t\tbackground: 'var(--dw-bg)',\n\t\t\t\t\t\t\tcolor: 'var(--dw-text)',\n\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\tcursor: 'pointer'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tBust + Refresh\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={handleClearCache}\n\t\t\t\t\t\tdisabled={actionRun}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tpadding: '6px 10px',\n\t\t\t\t\t\t\tborderRadius: '6px',\n\t\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\t\tbackground: 'var(--dw-bg)',\n\t\t\t\t\t\t\tcolor: 'var(--dw-text)',\n\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\tcursor: 'pointer'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tClear Cache\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={handleClearStorage}\n\t\t\t\t\t\tdisabled={actionRun}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tpadding: '6px 10px',\n\t\t\t\t\t\t\tborderRadius: '6px',\n\t\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\t\tbackground: 'var(--dw-bg)',\n\t\t\t\t\t\t\tcolor: 'var(--dw-text)',\n\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\tcursor: 'pointer'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tClear Storage\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={handleClearAll}\n\t\t\t\t\t\tdisabled={actionRun}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tpadding: '6px 10px',\n\t\t\t\t\t\t\tborderRadius: '6px',\n\t\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\t\tbackground: 'var(--dw-bg)',\n\t\t\t\t\t\t\tcolor: 'var(--dw-text)',\n\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\tcursor: 'pointer'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tClear All\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={handleRestart}\n\t\t\t\t\t\tdisabled={actionRun}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tpadding: '6px 10px',\n\t\t\t\t\t\t\tborderRadius: '6px',\n\t\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\t\tbackground: 'var(--dw-bg)',\n\t\t\t\t\t\t\tcolor: 'var(--dw-text)',\n\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\tcursor: 'pointer'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tRestart Next Dev\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t{actionNote && (\n\t\t\t\t\t<span style={{ fontSize: '10px', color: 'var(--dw-text-muted)' }}>{actionNote}</span>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\tgap: '8px',\n\t\t\t\t\tpadding: '12px',\n\t\t\t\t\tbackground: 'rgba(255, 255, 255, 0.03)',\n\t\t\t\t\tborderRadius: 'var(--dw-radius)',\n\t\t\t\t\tborder: isFocus ? '1px solid var(--dw-accent)' : '1px solid var(--dw-border)',\n\t\t\t\t\ttransition: 'all 0.2s'\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span style={{ fontSize: '11px', fontWeight: 600, color: 'var(--dw-text-muted)' }}>\n\t\t\t\t\tCreate Watch Rule\n\t\t\t\t</span>\n\t\t\t\t<div style={{ display: 'flex', gap: '8px' }}>\n\t\t\t\t\t<select\n\t\t\t\t\t\tvalue={newRuleType}\n\t\t\t\t\t\tonChange={handleRuleTypeChange}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tpadding: '6px 8px',\n\t\t\t\t\t\t\tborderRadius: '6px',\n\t\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\t\tbackground: 'var(--dw-bg)',\n\t\t\t\t\t\t\tcolor: 'var(--dw-text)',\n\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\toutline: 'none'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<option value=\"console\">Console Log</option>\n\t\t\t\t\t\t<option value=\"network\">Network Req</option>\n\t\t\t\t\t</select>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tvalue={newRuleMatch}\n\t\t\t\t\t\tonFocus={handleRuleInputFocus}\n\t\t\t\t\t\tonBlur={handleRuleInputBlur}\n\t\t\t\t\t\tonChange={handleRuleMatchChange}\n\t\t\t\t\t\tplaceholder=\"Filter string or /regex/i\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\tpadding: '6px 10px',\n\t\t\t\t\t\t\tborderRadius: '6px',\n\t\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\t\tbackground: 'var(--dw-bg)',\n\t\t\t\t\t\t\tcolor: 'var(--dw-text)',\n\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\toutline: 'none'\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonKeyDown={handleRuleKeyDown}\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={handleAdd}\n\t\t\t\t\t\tdisabled={!newRuleMatch.trim()}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tpadding: '6px 12px',\n\t\t\t\t\t\t\tborderRadius: '6px',\n\t\t\t\t\t\t\tbackground: newRuleMatch.trim() ? 'var(--dw-accent)' : 'var(--dw-bg-tertiary)',\n\t\t\t\t\t\t\tcolor: 'white',\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\ttransition: 'all 0.2s',\n\t\t\t\t\t\t\topacity: newRuleMatch.trim() ? 1 : 0.5\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tTrack\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{renderNetworkDemo()}\n\n\t\t\t{state.rules.length > 0 && (\n\t\t\t\t<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n\t\t\t\t\t<div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px' }}>\n\t\t\t\t\t\t{state.rules.map(function renderRule(rule) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={rule.id}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\t\t\t\t\tpadding: '4px 8px',\n\t\t\t\t\t\t\t\t\t\tpaddingRight: '4px',\n\t\t\t\t\t\t\t\t\t\tborderRadius: '8px',\n\t\t\t\t\t\t\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\t\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\t\t\t\t\tfontSize: '11px',\n\t\t\t\t\t\t\t\t\t\tanimation: 'dw-scale-in 0.2s ease-out'\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tpadding: '2px 4px',\n\t\t\t\t\t\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\t\t\t\t\t\tfontSize: '9px',\n\t\t\t\t\t\t\t\t\t\t\tfontWeight: 800,\n\t\t\t\t\t\t\t\t\t\t\ttextTransform: 'uppercase',\n\t\t\t\t\t\t\t\t\t\t\tbackground:\n\t\t\t\t\t\t\t\t\t\t\t\trule.type === 'console' ? 'rgba(245, 158, 11, 0.15)' : 'rgba(59, 130, 246, 0.15)',\n\t\t\t\t\t\t\t\t\t\t\tcolor: rule.type === 'console' ? '#f59e0b' : '#3b82f6'\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{rule.type === 'console' ? 'LOG' : 'NET'}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span style={{ fontFamily: 'var(--dw-font-mono)', color: 'var(--dw-text)' }}>\n\t\t\t\t\t\t\t\t\t\t{rule.match}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tonClick={function onRemove() {\n\t\t\t\t\t\t\t\t\t\t\tdomain.removeRule(rule.id)\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\twidth: '18px',\n\t\t\t\t\t\t\t\t\t\t\theight: '18px',\n\t\t\t\t\t\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\t\t\t\t\t\ttransition: 'all 0.2s',\n\t\t\t\t\t\t\t\t\t\t\tfontSize: '14px'\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tonMouseEnter={(e) => {\n\t\t\t\t\t\t\t\t\t\t\te.currentTarget.style.background = 'rgba(239, 68, 68, 0.1)'\n\t\t\t\t\t\t\t\t\t\t\te.currentTarget.style.color = '#ef4444'\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tonMouseLeave={(e) => {\n\t\t\t\t\t\t\t\t\t\t\te.currentTarget.style.background = 'transparent'\n\t\t\t\t\t\t\t\t\t\t\te.currentTarget.style.color = 'var(--dw-text-muted)'\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tx\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div\n\t\t\t\tdata-dw-section=\"monitor-main\"\n\t\t\t\tstyle={{ display: 'grid', gridTemplateColumns: '1.2fr 1fr', gap: '16px' }}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tdata-dw-section=\"matches\"\n\t\t\t\t\tstyle={{ display: 'flex', flexDirection: 'column', gap: '12px' }}\n\t\t\t\t>\n\t\t\t\t\t<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline' }}>\n\t\t\t\t\t\t<h4\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\tfontSize: '12px',\n\t\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\t\t\ttextTransform: 'uppercase'\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tIntercepted Feed\n\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t{state.matches.length > 0 && (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={handleClearMatches}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\t\tpadding: '2px 4px',\n\t\t\t\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\t\t\t\ttransition: 'color 0.2s'\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonMouseEnter={(e) => (e.currentTarget.style.color = 'var(--dw-accent)')}\n\t\t\t\t\t\t\t\tonMouseLeave={(e) => (e.currentTarget.style.color = 'var(--dw-text-muted)')}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tClear Feed\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\t\tgap: '8px',\n\t\t\t\t\t\t\tmaxHeight: '350px',\n\t\t\t\t\t\t\toverflowY: 'auto',\n\t\t\t\t\t\t\tpaddingRight: '4px'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{state.matches.length === 0 ? (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tpadding: '40px 20px',\n\t\t\t\t\t\t\t\t\ttextAlign: 'center',\n\t\t\t\t\t\t\t\t\tbackground: 'rgba(255, 255, 255, 0.02)',\n\t\t\t\t\t\t\t\t\tborderRadius: 'var(--dw-radius)',\n\t\t\t\t\t\t\t\t\tborder: '1px dashed var(--dw-border)'\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div style={{ fontSize: '12px', color: 'var(--dw-text)', fontWeight: 600 }}>\n\t\t\t\t\t\t\t\t\tNo Signals Captured\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p style={{ fontSize: '10px', color: 'var(--dw-text-muted)', margin: '4px 0 0 0' }}>\n\t\t\t\t\t\t\t\t\tSet up rules and start monitoring to see data here.\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tstate.matches.map(renderMatch)\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\tdata-dw-section=\"details\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\t\tgap: '12px',\n\t\t\t\t\t\tpadding: '12px',\n\t\t\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\tborderRadius: 'var(--dw-radius)',\n\t\t\t\t\t\tmaxHeight: '350px',\n\t\t\t\t\t\toverflowY: 'auto'\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<h4\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\tfontSize: '12px',\n\t\t\t\t\t\t\tfontWeight: 600,\n\t\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\t\ttextTransform: 'uppercase'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tDetails\n\t\t\t\t\t</h4>\n\t\t\t\t\t{renderDetails(selectedMatch)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<style>{`\n\t\t\t\t@keyframes dw-fade-in {\n\t\t\t\t\tfrom { opacity: 0; }\n\t\t\t\t\tto { opacity: 1; }\n\t\t\t\t}\n\t\t\t\t@keyframes dw-slide-up {\n\t\t\t\t\tfrom { opacity: 0; transform: translateY(10px); }\n\t\t\t\t\tto { opacity: 1; transform: translateY(0); }\n\t\t\t\t}\n\t\t\t\t@keyframes dw-scale-in {\n\t\t\t\t\tfrom { opacity: 0; transform: scale(0.95); }\n\t\t\t\t\tto { opacity: 1; transform: scale(1); }\n\t\t\t\t}\n\t\t\t`}</style>\n\t\t</div>\n\t)\n}\n","import type { WidgetRuntime } from './widgetRuntime'\nimport type { WidgetProps, AiProvider } from '../types/public'\nimport { createRuntime } from './widgetRuntime'\nimport { createAuthDomain } from '../domains/auth/authDomain'\nimport { createPerfDomain } from '../domains/performance/performanceDomain'\nimport { createRoutesDomain } from '../domains/routes/routesDomain'\nimport { resolveAiProvider } from '../domains/performance/aiProviderFactory'\nimport { AuthTab } from '../domains/auth/ui/authTab'\nimport { PerfTab } from '../domains/performance/ui/performanceTab'\nimport { RoutesTab } from '../domains/routes/ui/routesTab'\nimport { createMonitorDomain } from '../domains/monitor/monitorDomain'\nimport { MonitorTab } from '../domains/monitor/ui/monitorTab'\nimport React from 'react'\n\n/** Bootstrap the full widget runtime with all first-party domains */\nexport function bootstrap(props: WidgetProps): WidgetRuntime {\n\tconst runtime = createRuntime(props)\n\tconst { bus, registry } = runtime\n\n\tconst aiProvider: AiProvider | undefined = resolveAiProvider(props.providers?.ai)\n\n\tconst authDomain = createAuthDomain(bus, props.providers?.auth)\n\tconst perfDomain = createPerfDomain(bus, aiProvider)\n\tconst routesDomain = createRoutesDomain(bus)\n\tconst monitorDomain = createMonitorDomain()\n\n\tregistry.registerDomain(authDomain)\n\tregistry.registerDomain(perfDomain)\n\tregistry.registerDomain(routesDomain)\n\tregistry.registerDomain(monitorDomain)\n\n\tregistry.registerCategory(\n\t\t{ id: 'auth', label: 'Auth', order: 1 },\n\t\t{\n\t\t\trender() {\n\t\t\t\treturn React.createElement(AuthTab, { domain: authDomain })\n\t\t\t}\n\t\t}\n\t)\n\n\tregistry.registerCategory(\n\t\t{ id: 'performance', label: 'Perf', order: 2 },\n\t\t{\n\t\t\trender() {\n\t\t\t\treturn React.createElement(PerfTab, { domain: perfDomain })\n\t\t\t}\n\t\t}\n\t)\n\n\tregistry.registerCategory(\n\t\t{ id: 'routes', label: 'Routes', order: 3 },\n\t\t{\n\t\t\trender() {\n\t\t\t\treturn React.createElement(RoutesTab, { domain: routesDomain })\n\t\t\t}\n\t\t}\n\t)\n\n\tregistry.registerCategory(\n\t\t{ id: 'monitor', label: 'Monitor', order: 4 },\n\t\t{\n\t\t\trender() {\n\t\t\t\treturn React.createElement(MonitorTab, { domain: monitorDomain })\n\t\t\t}\n\t\t}\n\t)\n\n\treturn runtime\n}\n","import { useEffect, useRef, useMemo } from 'react'\nimport type { WidgetProps } from './types/public'\nimport { bootstrap } from './core/bootstrap'\nimport { Shell } from './shell/shell'\n\nfunction isDev(): boolean {\n\tif (typeof process !== 'undefined' && process.env) {\n\t\treturn process.env['NODE_ENV'] === 'development'\n\t}\n\treturn true\n}\n\n/**\n * DevWidget - Development-only widget with AI performance monitoring\n * @param props - Widget configuration\n */\nexport function DevWidget(props: WidgetProps = {}): React.ReactElement | null {\n\tconst { enabled = true, mode = 'development-only' } = props\n\n\tconst shouldRender = enabled && (mode === 'always' || isDev())\n\n\tconst runtime = useMemo(\n\t\tfunction initRuntime() {\n\t\t\tif (!shouldRender) return null\n\t\t\treturn bootstrap(props)\n\t\t},\n\t\t[shouldRender]\n\t)\n\n\tconst startedRef = useRef(false)\n\n\tuseEffect(\n\t\tfunction lifecycle() {\n\t\t\tif (!runtime || startedRef.current) return\n\n\t\t\tstartedRef.current = true\n\t\t\truntime.start()\n\n\t\t\treturn function cleanup() {\n\t\t\t\truntime.stop()\n\t\t\t\tstartedRef.current = false\n\t\t\t}\n\t\t},\n\t\t[runtime]\n\t)\n\n\tif (!shouldRender || !runtime) return null\n\n\treturn <Shell runtime={runtime} />\n}\n","import { useState, useCallback, useEffect, useMemo, useRef } from 'react'\nimport type { WidgetRuntime } from '../core/widgetRuntime'\nimport type { FeatureId } from '../types/featureMap'\nimport { ThemeProvider, useTheme } from './themeProvider'\nimport { tokensToStyleObject } from './themeTokens'\nimport { Header } from './header'\nimport { Footer } from './footer'\nimport { Panel } from './panel'\nimport { TabsView } from '../tabs/tabsView'\nimport { RightRail } from './rightRail'\nimport { useKeyboard } from './useKeyboard'\nimport { createTabsRuntime } from '../tabs/tabsRuntime'\nimport type { TabsRuntime } from '../tabs/tabsRuntime'\n\ntype Props = {\n\truntime: WidgetRuntime\n}\n\ntype LiveProps = {\n\tmessage: string\n}\n\ntype InnerProps = {\n\truntime: WidgetRuntime\n}\n\nfunction readMotion(mode: 'system' | 'always' | 'never'): boolean {\n\tif (mode === 'always') return true\n\tif (mode === 'never') return false\n\tif (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false\n\treturn window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/** Accessibility live region for announcing updates */\nfunction LiveRegion({ message }: LiveProps): React.ReactElement {\n\treturn (\n\t\t<div\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-atomic=\"true\"\n\t\t\tstyle={{\n\t\t\t\tposition: 'absolute',\n\t\t\t\twidth: '1px',\n\t\t\t\theight: '1px',\n\t\t\t\toverflow: 'hidden',\n\t\t\t\tclip: 'rect(0, 0, 0, 0)',\n\t\t\t\twhiteSpace: 'nowrap'\n\t\t\t}}\n\t\t>\n\t\t\t{message}\n\t\t</div>\n\t)\n}\n\n/** Main shell container orchestrating layout, tabs, rail, and keyboard */\nfunction ShellInner({ runtime }: InnerProps): React.ReactElement | null {\n\tconst { config } = runtime\n\tconst { tokens, density, radius } = useTheme()\n\tconst [visible, setVisible] = useState(true)\n\tconst [minimized, setMinimized] = useState(false)\n\tconst [announcement, setAnnouncement] = useState('')\n\tconst [reducedMotion, setReducedMotion] = useState(function initMotion() {\n\t\treturn readMotion(config.accessibility.reducedMotion)\n\t})\n\tconst [, setTabsVersion] = useState(0)\n\tconst announceCount = useRef(0)\n\tconst announceTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n\tconst tabsRuntime = useMemo(function initTabs(): TabsRuntime {\n\t\treturn createTabsRuntime()\n\t}, [])\n\n\tuseEffect(\n\t\tfunction watchMotion() {\n\t\t\tif (config.accessibility.reducedMotion !== 'system') {\n\t\t\t\tsetReducedMotion(readMotion(config.accessibility.reducedMotion))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n\t\t\t\tsetReducedMotion(false)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst media = window.matchMedia('(prefers-reduced-motion: reduce)')\n\t\t\tsetReducedMotion(media.matches)\n\t\t\tfunction onChange(event: MediaQueryListEvent): void {\n\t\t\t\tsetReducedMotion(event.matches)\n\t\t\t}\n\t\t\tmedia.addEventListener('change', onChange)\n\t\t\treturn function cleanup(): void {\n\t\t\t\tmedia.removeEventListener('change', onChange)\n\t\t\t}\n\t\t},\n\t\t[config.accessibility.reducedMotion]\n\t)\n\n\tuseEffect(\n\t\tfunction registerCategories() {\n\t\t\tconst categories = runtime.registry.getCategories()\n\t\t\tfor (const entry of categories) {\n\t\t\t\ttabsRuntime.register(entry.category, entry.presenter)\n\t\t\t}\n\t\t},\n\t\t[runtime, tabsRuntime]\n\t)\n\n\tuseEffect(\n\t\tfunction subscribeTabs() {\n\t\t\treturn tabsRuntime.subscribe(function onTabsUpdate() {\n\t\t\t\tsetTabsVersion(function bump(n) {\n\t\t\t\t\treturn n + 1\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\t[tabsRuntime]\n\t)\n\n\tuseEffect(\n\t\tfunction listenPerf() {\n\t\t\tif (!config.accessibility.announceUpdates) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst unsubscribe = runtime.bus.subscribe('performance/drop-detected', function onDrop() {\n\t\t\t\tannounceCount.current += 1\n\t\t\t\tif (announceTimer.current) {\n\t\t\t\t\tclearTimeout(announceTimer.current)\n\t\t\t\t}\n\t\t\t\tannounceTimer.current = setTimeout(function announceBatch() {\n\t\t\t\t\tconst count = announceCount.current\n\t\t\t\t\tsetAnnouncement(\n\t\t\t\t\t\t`${count} performance drop${count === 1 ? '' : 's'} detected in the last few seconds`\n\t\t\t\t\t)\n\t\t\t\t\tannounceCount.current = 0\n\t\t\t\t\tannounceTimer.current = null\n\t\t\t\t}, 2000)\n\t\t\t})\n\n\t\t\treturn function cleanup() {\n\t\t\t\tunsubscribe()\n\t\t\t\tif (announceTimer.current) {\n\t\t\t\t\tclearTimeout(announceTimer.current)\n\t\t\t\t\tannounceTimer.current = null\n\t\t\t\t}\n\t\t\t\tannounceCount.current = 0\n\t\t\t}\n\t\t},\n\t\t[runtime, config.accessibility.announceUpdates]\n\t)\n\n\tconst handleToggle = useCallback(function toggle() {\n\t\tsetVisible(function flip(v) {\n\t\t\treturn !v\n\t\t})\n\t}, [])\n\n\tconst handleMinimize = useCallback(function minimize() {\n\t\tsetMinimized(function flip(m) {\n\t\t\treturn !m\n\t\t})\n\t}, [])\n\n\tconst handleClose = useCallback(function close() {\n\t\tsetVisible(false)\n\t}, [])\n\n\tuseKeyboard({\n\t\ttoggleKey: config.keyboard.toggleKey,\n\t\tenableShortcuts: config.keyboard.enableShortcuts,\n\t\tonToggle: handleToggle,\n\t\tonEscape: handleToggle,\n\t\treducedMotion: config.accessibility.reducedMotion\n\t})\n\n\tconst currentCssVars = useMemo(\n\t\tfunction computeVars() {\n\t\t\treturn tokensToStyleObject(tokens, radius, density)\n\t\t},\n\t\t[tokens, radius, density]\n\t)\n\n\tif (!visible) return null\n\n\tconst tabs = tabsRuntime.getSorted()\n\tconst activeId = tabsRuntime.getActive()\n\n\treturn (\n\t\t<div\n\t\t\tdata-dw-shell\n\t\t\trole=\"region\"\n\t\t\taria-label=\"Development Widget\"\n\t\t\tstyle={{\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tflexDirection: 'column',\n\t\t\t\tbackground: 'var(--dw-bg)',\n\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\tborderBottom: 'none',\n\t\t\t\tborderTopLeftRadius: 'var(--dw-radius)',\n\t\t\t\tborderTopRightRadius: 'var(--dw-radius)',\n\t\t\t\tboxShadow: '0 -4px 32px rgba(0, 0, 0, 0.2)',\n\t\t\t\toverflow: 'hidden',\n\t\t\t\tzIndex: 99999,\n\t\t\t\tfontFamily: 'ui-monospace, monospace',\n\t\t\t\tfontSize: '12px',\n\t\t\t\tcolor: 'var(--dw-text)',\n\t\t\t\tposition: 'fixed',\n\t\t\t\tbottom: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\theight: minimized ? 'auto' : '400px',\n\t\t\t\tmaxHeight: '100vh',\n\t\t\t\ttransition: reducedMotion ? 'none' : 'height 0.2s ease-in-out',\n\t\t\t\t...currentCssVars\n\t\t\t}}\n\t\t>\n\t\t\t<style>{`[data-dw-shell] button:focus-visible,[data-dw-shell] [role='tab']:focus-visible{outline:2px solid var(--dw-accent);outline-offset:-2px;}[data-dw-shell] *:focus:not(:focus-visible){outline:none;}@media (prefers-reduced-motion: reduce){[data-dw-shell] *{transition:none !important;animation:none !important;}}`}</style>\n\t\t\t<Header onMinimize={handleMinimize} onClose={handleClose} />\n\t\t\t{!minimized && (\n\t\t\t\t<>\n\t\t\t\t\t<div style={{ display: 'flex', flex: 1, overflow: 'hidden' }}>\n\t\t\t\t\t\t<div style={{ flex: 1, display: 'flex', flexDirection: 'column', overflow: 'hidden' }}>\n\t\t\t\t\t\t\t<TabsView runtime={tabsRuntime} />\n\t\t\t\t\t\t\t<div style={{ flex: 1, overflow: 'auto' }}>\n\t\t\t\t\t\t\t\t{tabs.map(function renderPanel(entry) {\n\t\t\t\t\t\t\t\t\tconst isActive = entry.category.id === activeId\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<Panel key={entry.category.id} id={entry.category.id} active={isActive}>\n\t\t\t\t\t\t\t\t\t\t\t{entry.presenter.render(\n\t\t\t\t\t\t\t\t\t\t\t\truntime.registry.getDomain(entry.category.id as FeatureId)?.getState() ?? null\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</Panel>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{config.rightRail.enabled && config.rightRail.panels.length > 0 && (\n\t\t\t\t\t\t\t<RightRail\n\t\t\t\t\t\t\t\tpanels={config.rightRail.panels}\n\t\t\t\t\t\t\t\tdefaultPanel={config.rightRail.defaultPanel}\n\t\t\t\t\t\t\t\tcollapsible={config.rightRail.collapsible}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{function renderRail(panelId) {\n\t\t\t\t\t\t\t\t\tconst domain = runtime.registry.getDomain(panelId as FeatureId)\n\t\t\t\t\t\t\t\t\tif (!domain) {\n\t\t\t\t\t\t\t\t\t\treturn <span>No content for {panelId}</span>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst diagnostics = domain.serializeDiagnostics?.()\n\t\t\t\t\t\t\t\t\tif (!diagnostics) {\n\t\t\t\t\t\t\t\t\t\treturn <span>No diagnostics</span>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<pre style={{ margin: 0, whiteSpace: 'pre-wrap', fontSize: '11px' }}>\n\t\t\t\t\t\t\t\t\t\t\t{JSON.stringify(diagnostics, null, 2)}\n\t\t\t\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t</RightRail>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<Footer toggleKey={config.keyboard.toggleKey} />\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t<LiveRegion message={announcement} />\n\t\t</div>\n\t)\n}\n\n/** Main shell container orchestrating layout, tabs, rail, and keyboard */\nexport function Shell({ runtime }: Props): React.ReactElement | null {\n\tconst { config } = runtime\n\n\treturn (\n\t\t<ThemeProvider\n\t\t\tmode={config.theme.mode}\n\t\t\taccent={config.theme.accent}\n\t\t\tdensity={config.theme.density}\n\t\t\tradius={config.theme.radius}\n\t\t>\n\t\t\t<ShellInner runtime={runtime} />\n\t\t</ThemeProvider>\n\t)\n}\n","import { createContext, useContext, useState, useEffect, useMemo } from 'react'\nimport type { ThemeMode, Density, RadiusScale } from '../types/public'\nimport type { ThemeTokens } from './themeTokens'\nimport { resolveTokens, tokensToCss } from './themeTokens'\n\ntype ThemeContext = {\n\tmode: ThemeMode\n\ttokens: ThemeTokens\n\tdensity: Density\n\tradius: RadiusScale\n\tcssVars: string\n}\n\nconst Ctx = createContext<ThemeContext | null>(null)\n\ntype Props = {\n\tmode: ThemeMode\n\taccent?: string\n\tdensity: Density\n\tradius: RadiusScale\n\tchildren: React.ReactNode\n}\n\n/** Detect system color scheme preference */\nfunction useSystemMode(): 'light' | 'dark' {\n\tconst [dark, setDark] = useState(function initial() {\n\t\tif (typeof window === 'undefined') return true\n\t\treturn window.matchMedia('(prefers-color-scheme: dark)').matches\n\t})\n\n\tuseEffect(function watchScheme() {\n\t\tif (typeof window === 'undefined') return\n\t\tconst mq = window.matchMedia('(prefers-color-scheme: dark)')\n\t\tfunction onChange(e: MediaQueryListEvent): void {\n\t\t\tsetDark(e.matches)\n\t\t}\n\t\tmq.addEventListener('change', onChange)\n\t\treturn function cleanup() {\n\t\t\tmq.removeEventListener('change', onChange)\n\t\t}\n\t}, [])\n\n\treturn dark ? 'dark' : 'light'\n}\n\n/** Theme provider wrapping widget with CSS custom properties */\nexport function ThemeProvider({\n\tmode,\n\taccent,\n\tdensity,\n\tradius,\n\tchildren\n}: Props): React.ReactElement {\n\tconst systemMode = useSystemMode()\n\tconst resolvedMode = mode === 'system' ? systemMode : mode\n\n\tconst value = useMemo(\n\t\tfunction computeTheme(): ThemeContext {\n\t\t\tconst tokens = resolveTokens(resolvedMode, accent)\n\t\t\tconst cssVars = tokensToCss(tokens, radius, density)\n\t\t\treturn { mode: resolvedMode, tokens, density, radius, cssVars }\n\t\t},\n\t\t[resolvedMode, accent, density, radius]\n\t)\n\n\treturn <Ctx.Provider value={value}>{children}</Ctx.Provider>\n}\n\n/** Access current theme context */\nexport function useTheme(): ThemeContext {\n\tconst ctx = useContext(Ctx)\n\tif (!ctx) {\n\t\tthrow new Error('useTheme must be used within ThemeProvider')\n\t}\n\treturn ctx\n}\n","import type { ThemeMode, Density, RadiusScale } from '../types/public'\n\n/** Resolved theme token set */\nexport type ThemeTokens = {\n\tbg: string\n\tbgSecondary: string\n\tborder: string\n\ttext: string\n\ttextMuted: string\n\taccent: string\n\taccentSoft: string\n\tdanger: string\n\twarning: string\n\tsuccess: string\n}\n\nconst DARK_TOKENS: ThemeTokens = {\n\tbg: '#0a0a0b',\n\tbgSecondary: '#141416',\n\tborder: '#2a2a2e',\n\ttext: '#e4e4e7',\n\ttextMuted: '#71717a',\n\taccent: '#3bb273',\n\taccentSoft: 'rgba(59, 178, 115, 0.15)',\n\tdanger: '#ef4444',\n\twarning: '#f59e0b',\n\tsuccess: '#22c55e'\n}\n\nconst LIGHT_TOKENS: ThemeTokens = {\n\tbg: '#fafafa',\n\tbgSecondary: '#f4f4f5',\n\tborder: '#e4e4e7',\n\ttext: '#18181b',\n\ttextMuted: '#71717a',\n\taccent: '#16a34a',\n\taccentSoft: 'rgba(22, 163, 74, 0.1)',\n\tdanger: '#dc2626',\n\twarning: '#d97706',\n\tsuccess: '#16a34a'\n}\n\n/** Resolve theme tokens from mode and accent color */\nexport function resolveTokens(mode: ThemeMode, accent?: string): ThemeTokens {\n\tconst base = mode === 'light' ? LIGHT_TOKENS : DARK_TOKENS\n\n\tif (!accent) return base\n\n\treturn {\n\t\t...base,\n\t\taccent,\n\t\taccentSoft: `color-mix(in srgb, ${accent}, transparent 85%)`\n\t}\n}\n\n/** Radius scale to CSS value mapping */\nexport function resolveRadius(scale: RadiusScale): string {\n\tswitch (scale) {\n\t\tcase 'none':\n\t\t\treturn '0'\n\t\tcase 'sm':\n\t\t\treturn '2px'\n\t\tcase 'md':\n\t\t\treturn '4px'\n\t\tcase 'lg':\n\t\t\treturn '6px'\n\t}\n}\n\n/** Density to spacing scale mapping */\nexport function resolveSpacing(density: Density): { unit: number; gap: number; padding: number } {\n\tswitch (density) {\n\t\tcase 'compact':\n\t\t\treturn { unit: 4, gap: 4, padding: 8 }\n\t\tcase 'comfortable':\n\t\t\treturn { unit: 6, gap: 8, padding: 12 }\n\t}\n}\n\n/** Generate CSS custom property declarations */\nexport function tokensToCss(tokens: ThemeTokens, radius: RadiusScale, density: Density): string {\n\tconst spacing = resolveSpacing(density)\n\treturn [\n\t\t`--dw-bg: ${tokens.bg}`,\n\t\t`--dw-bg-secondary: ${tokens.bgSecondary}`,\n\t\t`--dw-border: ${tokens.border}`,\n\t\t`--dw-text: ${tokens.text}`,\n\t\t`--dw-text-muted: ${tokens.textMuted}`,\n\t\t`--dw-accent: ${tokens.accent}`,\n\t\t`--dw-accent-soft: ${tokens.accentSoft}`,\n\t\t`--dw-danger: ${tokens.danger}`,\n\t\t`--dw-warning: ${tokens.warning}`,\n\t\t`--dw-success: ${tokens.success}`,\n\t\t`--dw-radius: ${resolveRadius(radius)}`,\n\t\t`--dw-unit: ${spacing.unit}px`,\n\t\t`--dw-gap: ${spacing.gap}px`,\n\t\t`--dw-padding: ${spacing.padding}px`\n\t].join('; ')\n}\n\n/** Generate React style object for CSS custom properties */\nexport function tokensToStyleObject(\n\ttokens: ThemeTokens,\n\tradius: RadiusScale,\n\tdensity: Density\n): Record<string, string> {\n\tconst spacing = resolveSpacing(density)\n\treturn {\n\t\t'--dw-bg': tokens.bg,\n\t\t'--dw-bg-secondary': tokens.bgSecondary,\n\t\t'--dw-border': tokens.border,\n\t\t'--dw-text': tokens.text,\n\t\t'--dw-text-muted': tokens.textMuted,\n\t\t'--dw-accent': tokens.accent,\n\t\t'--dw-accent-soft': tokens.accentSoft,\n\t\t'--dw-danger': tokens.danger,\n\t\t'--dw-warning': tokens.warning,\n\t\t'--dw-success': tokens.success,\n\t\t'--dw-radius': resolveRadius(radius),\n\t\t'--dw-unit': `${spacing.unit}px`,\n\t\t'--dw-gap': `${spacing.gap}px`,\n\t\t'--dw-padding': `${spacing.padding}px`\n\t}\n}\n","type Props = {\n\ttitle?: string\n\tonMinimize: () => void\n\tonClose: () => void\n}\n\n/** Shell header with title and window actions */\nexport function Header({ title, onMinimize, onClose }: Props): React.ReactElement {\n\treturn (\n\t\t<div\n\t\t\tdata-dw-header\n\t\t\trole=\"banner\"\n\t\t\tstyle={{\n\t\t\t\tdisplay: 'flex',\n\t\t\t\talignItems: 'center',\n\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\tpadding: 'var(--dw-padding)',\n\t\t\t\tborderBottom: '1px solid var(--dw-border)',\n\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\tcolor: 'var(--dw-text)',\n\t\t\t\tfontSize: '12px',\n\t\t\t\tfontFamily: 'ui-monospace, monospace',\n\t\t\t\tuserSelect: 'none'\n\t\t\t}}\n\t\t>\n\t\t\t<span data-dw-title style={{ fontWeight: 600 }}>\n\t\t\t\t{title ?? 'DevWidget'}\n\t\t\t</span>\n\t\t\t<div data-dw-actions style={{ display: 'flex', gap: 'var(--dw-gap)' }}>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onMinimize}\n\t\t\t\t\taria-label=\"Minimize widget\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: 'none',\n\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\tpadding: '2px 6px',\n\t\t\t\t\t\tfontSize: '12px',\n\t\t\t\t\t\tlineHeight: 1\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t&#x2013;\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\taria-label=\"Close widget\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: 'none',\n\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\tpadding: '2px 6px',\n\t\t\t\t\t\tfontSize: '12px',\n\t\t\t\t\t\tlineHeight: 1\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t&#x2715;\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","type Props = {\n\ttoggleKey: string\n\tdiagnosticCount?: number\n}\n\n/** Shell footer with keyboard hints and diagnostics status */\nexport function Footer({ toggleKey, diagnosticCount }: Props): React.ReactElement {\n\treturn (\n\t\t<div\n\t\t\tdata-dw-footer\n\t\t\tstyle={{\n\t\t\t\tdisplay: 'flex',\n\t\t\t\talignItems: 'center',\n\t\t\t\tjustifyContent: 'space-between',\n\t\t\t\tpadding: 'var(--dw-padding)',\n\t\t\t\tborderTop: '1px solid var(--dw-border)',\n\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\tcolor: 'var(--dw-text-muted)',\n\t\t\t\tfontSize: '10px',\n\t\t\t\tfontFamily: 'ui-monospace, monospace'\n\t\t\t}}\n\t\t>\n\t\t\t<span>\n\t\t\t\t<kbd\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tpadding: '1px 4px',\n\t\t\t\t\t\tborder: '1px solid var(--dw-border)',\n\t\t\t\t\t\tborderRadius: '2px',\n\t\t\t\t\t\tfontSize: '10px',\n\t\t\t\t\t\tfontFamily: 'ui-monospace, monospace',\n\t\t\t\t\t\tbackground: 'var(--dw-bg)'\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{toggleKey}\n\t\t\t\t</kbd>{' '}\n\t\t\t\ttoggle\n\t\t\t</span>\n\t\t\t{diagnosticCount !== undefined && diagnosticCount > 0 && (\n\t\t\t\t<span data-dw-badge=\"info\">\n\t\t\t\t\t{diagnosticCount} diagnostic{diagnosticCount !== 1 ? 's' : ''}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","type Props = {\n\tid: string\n\tactive: boolean\n\tchildren: React.ReactNode\n}\n\n/** Tab panel content container */\nexport function Panel({ id, active, children }: Props): React.ReactElement {\n\treturn (\n\t\t<div\n\t\t\trole=\"tabpanel\"\n\t\t\tid={`dw-panel-${id}`}\n\t\t\taria-labelledby={`dw-tab-${id}`}\n\t\t\thidden={!active}\n\t\t\ttabIndex={active ? 0 : -1}\n\t\t\tstyle={{\n\t\t\t\tpadding: 'var(--dw-padding)',\n\t\t\t\toverflow: 'auto',\n\t\t\t\tflex: 1,\n\t\t\t\tcolor: 'var(--dw-text)',\n\t\t\t\tfontSize: '12px',\n\t\t\t\tfontFamily: 'ui-monospace, monospace',\n\t\t\t\tdisplay: active ? 'block' : 'none'\n\t\t\t}}\n\t\t>\n\t\t\t{active && children}\n\t\t</div>\n\t)\n}\n","import { useState, useEffect, useCallback, useRef } from 'react'\nimport type { TabsRuntime } from './tabsRuntime'\nimport { Button } from '../components/Button'\n\ntype Props = {\n\truntime: TabsRuntime\n}\n\n/** Accessible tab strip with keyboard navigation */\nexport function TabsView({ runtime }: Props): React.ReactElement {\n\tconst [, forceRender] = useState(0)\n\tconst tabsRef = useRef<HTMLDivElement>(null)\n\n\tuseEffect(\n\t\tfunction subscribeTabs() {\n\t\t\treturn runtime.subscribe(function onUpdate() {\n\t\t\t\tforceRender(function inc(n) {\n\t\t\t\t\treturn n + 1\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\t[runtime]\n\t)\n\n\tconst tabs = runtime.getSorted()\n\tconst activeId = runtime.getActive()\n\n\tconst handleKeyDown = useCallback(\n\t\tfunction onKeyDown(e: React.KeyboardEvent) {\n\t\t\tconst currentIdx = tabs.findIndex(function isCurrent(t) {\n\t\t\t\treturn t.category.id === activeId\n\t\t\t})\n\t\t\tif (currentIdx === -1) return\n\n\t\t\tlet nextIdx = currentIdx\n\n\t\t\tswitch (e.key) {\n\t\t\t\tcase 'ArrowRight':\n\t\t\t\t\tnextIdx = (currentIdx + 1) % tabs.length\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tbreak\n\t\t\t\tcase 'ArrowLeft':\n\t\t\t\t\tnextIdx = (currentIdx - 1 + tabs.length) % tabs.length\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tbreak\n\t\t\t\tcase 'Home':\n\t\t\t\t\tnextIdx = 0\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tbreak\n\t\t\t\tcase 'End':\n\t\t\t\t\tnextIdx = tabs.length - 1\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst nextTab = tabs[nextIdx]\n\t\t\tif (nextTab) {\n\t\t\t\truntime.setActive(nextTab.category.id)\n\t\t\t\tconst el = tabsRef.current?.querySelector(\n\t\t\t\t\t`[data-dw-tab-id=\"${nextTab.category.id}\"]`\n\t\t\t\t) as HTMLElement | null\n\t\t\t\tel?.focus()\n\t\t\t}\n\t\t},\n\t\t[tabs, activeId, runtime]\n\t)\n\n\treturn (\n\t\t<div\n\t\t\tref={tabsRef}\n\t\t\trole=\"tablist\"\n\t\t\taria-label=\"Widget tabs\"\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\tstyle={{\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tborderBottom: '1px solid var(--dw-border)',\n\t\t\t\tbackground: 'var(--dw-bg)',\n\t\t\t\toverflowX: 'auto',\n\t\t\t\tscrollbarWidth: 'none'\n\t\t\t}}\n\t\t>\n\t\t\t{tabs.map(function renderTab(entry) {\n\t\t\t\tconst isActive = entry.category.id === activeId\n\t\t\t\treturn (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tkey={entry.category.id}\n\t\t\t\t\t\tvariant=\"tab\"\n\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\tid={`dw-tab-${entry.category.id}`}\n\t\t\t\t\t\taria-controls={`dw-panel-${entry.category.id}`}\n\t\t\t\t\t\taria-selected={isActive}\n\t\t\t\t\t\ttabIndex={isActive ? 0 : -1}\n\t\t\t\t\t\tdata-dw-tab-id={entry.category.id}\n\t\t\t\t\t\tactive={isActive}\n\t\t\t\t\t\tonClick={function activate() {\n\t\t\t\t\t\t\truntime.setActive(entry.category.id)\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tposition: 'relative'\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{entry.category.label}\n\t\t\t\t\t\t{(entry.category.badgeCount ?? 0) > 0 && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tmarginLeft: '4px',\n\t\t\t\t\t\t\t\t\tpadding: '0 4px',\n\t\t\t\t\t\t\t\t\tfontSize: '9px',\n\t\t\t\t\t\t\t\t\tborderRadius: '8px',\n\t\t\t\t\t\t\t\t\tbackground: 'var(--dw-accent)',\n\t\t\t\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\t\t\t\tlineHeight: '14px',\n\t\t\t\t\t\t\t\t\tdisplay: 'inline-block',\n\t\t\t\t\t\t\t\t\tminWidth: '14px',\n\t\t\t\t\t\t\t\t\ttextAlign: 'center'\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{entry.category.badgeCount}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Button>\n\t\t\t\t)\n\t\t\t})}\n\t\t</div>\n\t)\n}\n","import { forwardRef } from 'react'\n\n/** Button variant styles */\nexport type ButtonVariant = 'ghost' | 'solid' | 'outline' | 'tab'\n\n/** Button size options */\nexport type ButtonSize = 'sm' | 'md'\n\n/**\n * Props for the Button component.\n * Extends standard HTML button attributes for full accessibility and event handling support.\n */\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n\t/**\n\t * Visual style variant.\n\t * - `ghost`: Transparent background, hover effect only.\n\t * - `solid`: Filled background with accent color.\n\t * - `outline`: Bordered with accent color.\n\t * - `tab`: Specific style for tab navigation (bottom border when active).\n\t * @default 'ghost'\n\t */\n\tvariant?: ButtonVariant\n\n\t/**\n\t * Size of the button.\n\t * @default 'sm'\n\t */\n\tsize?: ButtonSize\n\n\t/**\n\t * Active state for togglable buttons (like tabs).\n\t * Renders with accent styling when true.\n\t */\n\tactive?: boolean\n}\n\n/**\n * Enterprise-grade Button component for DevWidget.\n * Provides standardized styling, strict typing, and accessible defaults.\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n\t{\n\t\tchildren,\n\t\tvariant = 'ghost',\n\t\tsize = 'sm',\n\t\tactive = false,\n\t\tstyle,\n\t\ttype = 'button',\n\t\tdisabled,\n\t\t...props\n\t},\n\tref\n) {\n\t// Base styles that apply to all variants\n\tconst baseStyles: React.CSSProperties = {\n\t\tfontFamily: 'ui-monospace, monospace',\n\t\tcursor: disabled ? 'not-allowed' : 'pointer',\n\t\tdisplay: 'inline-flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tborder: 'none',\n\t\tbackground: 'transparent',\n\t\ttransition: 'all 0.15s ease',\n\t\twhiteSpace: 'nowrap',\n\t\topacity: disabled ? 0.5 : 1,\n\t\t...style\n\t}\n\n\t// Variant-specific style overrides\n\tconst variantStyles: Record<ButtonVariant, React.CSSProperties> = {\n\t\tghost: {\n\t\t\tcolor: active ? 'var(--dw-text)' : 'var(--dw-text-muted)',\n\t\t\tbackground: active ? 'var(--dw-bg-secondary)' : 'transparent'\n\t\t},\n\t\tsolid: {\n\t\t\tbackground: 'var(--dw-accent)',\n\t\t\tcolor: '#fff',\n\t\t\tborderRadius: 'var(--dw-radius)'\n\t\t},\n\t\toutline: {\n\t\t\tborder: `1px solid ${active ? 'var(--dw-accent)' : 'var(--dw-border)'}`,\n\t\t\tcolor: active ? 'var(--dw-accent)' : 'var(--dw-text)',\n\t\t\tborderRadius: 'var(--dw-radius)'\n\t\t},\n\t\ttab: {\n\t\t\tbackground: active ? 'var(--dw-accent-soft)' : 'transparent',\n\t\t\tborderBottom: active ? '2px solid var(--dw-accent)' : '2px solid transparent',\n\t\t\tcolor: active ? 'var(--dw-text)' : 'var(--dw-text-muted)',\n\t\t\tborderRadius: '0' // Tabs usually don't have radius\n\t\t}\n\t}\n\n\t// Size-specific style overrides\n\tconst sizeStyles: Record<ButtonSize, React.CSSProperties> = {\n\t\tsm: {\n\t\t\tfontSize: '11px',\n\t\t\tpadding: variant === 'tab' ? '6px 12px' : '4px 8px'\n\t\t},\n\t\tmd: {\n\t\t\tfontSize: '12px',\n\t\t\tpadding: '6px 12px'\n\t\t}\n\t}\n\n\treturn (\n\t\t<button\n\t\t\tref={ref}\n\t\t\ttype={type}\n\t\t\tdisabled={disabled}\n\t\t\taria-pressed={active}\n\t\t\tstyle={{\n\t\t\t\t...baseStyles,\n\t\t\t\t...variantStyles[variant],\n\t\t\t\t...sizeStyles[size],\n\t\t\t\t...style\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t)\n})\n","import { useState, useCallback } from 'react'\nimport type { PanelConfig } from '../types/public'\n\ntype Props = {\n\tpanels: PanelConfig[]\n\tdefaultPanel?: string | null\n\tcollapsible?: boolean\n\tchildren?: (activePanelId: string | null) => React.ReactNode\n}\n\n/** Hoppscotch-inspired right rail with icon strip and expandable panels */\nexport function RightRail({\n\tpanels,\n\tdefaultPanel,\n\tcollapsible,\n\tchildren\n}: Props): React.ReactElement {\n\tconst [activePanel, setActivePanel] = useState<string | null>(defaultPanel ?? null)\n\n\tconst handleToggle = useCallback(\n\t\tfunction toggle(id: string) {\n\t\t\tsetActivePanel(function update(current) {\n\t\t\t\tif (current === id && (collapsible ?? true)) return null\n\t\t\t\treturn id\n\t\t\t})\n\t\t},\n\t\t[collapsible]\n\t)\n\n\tconst handleKeyDown = useCallback(\n\t\tfunction onKeyDown(e: React.KeyboardEvent) {\n\t\t\tconst enabled = panels.filter(function isEnabled(p) {\n\t\t\t\treturn p.enabled ?? true\n\t\t\t})\n\t\t\tconst currentIdx = enabled.findIndex(function isCurrent(p) {\n\t\t\t\treturn p.id === activePanel\n\t\t\t})\n\n\t\t\tlet nextIdx = currentIdx\n\t\t\tswitch (e.key) {\n\t\t\t\tcase 'ArrowDown':\n\t\t\t\t\tnextIdx = (currentIdx + 1) % enabled.length\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tbreak\n\t\t\t\tcase 'ArrowUp':\n\t\t\t\t\tnextIdx = (currentIdx - 1 + enabled.length) % enabled.length\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tbreak\n\t\t\t\tcase 'Enter':\n\t\t\t\tcase ' ':\n\t\t\t\t\tif (currentIdx >= 0) {\n\t\t\t\t\t\tconst p = enabled[currentIdx]\n\t\t\t\t\t\tif (p) handleToggle(p.id)\n\t\t\t\t\t}\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\treturn\n\t\t\t\tdefault:\n\t\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst nextPanel = enabled[nextIdx]\n\t\t\tif (nextPanel) {\n\t\t\t\thandleToggle(nextPanel.id)\n\t\t\t}\n\t\t},\n\t\t[panels, activePanel, handleToggle]\n\t)\n\n\tconst enabledPanels = panels\n\t\t.filter(function isEnabled(p) {\n\t\t\treturn p.enabled ?? true\n\t\t})\n\t\t.sort(function sortPanels(a, b) {\n\t\t\treturn (a.order ?? 999) - (b.order ?? 999)\n\t\t})\n\n\treturn (\n\t\t<div\n\t\t\tdata-dw-right-rail\n\t\t\tstyle={{\n\t\t\t\tdisplay: 'flex',\n\t\t\t\tflexDirection: 'row',\n\t\t\t\tborderLeft: '1px solid var(--dw-border)',\n\t\t\t\theight: '100%'\n\t\t\t}}\n\t\t>\n\t\t\t{activePanel && children && (\n\t\t\t\t<div\n\t\t\t\t\tdata-dw-rail-panel\n\t\t\t\t\trole=\"complementary\"\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tenabledPanels.find(function findActive(p) {\n\t\t\t\t\t\t\treturn p.id === activePanel\n\t\t\t\t\t\t})?.label ?? 'Panel'\n\t\t\t\t\t}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\twidth: '280px',\n\t\t\t\t\t\toverflow: 'auto',\n\t\t\t\t\t\tpadding: 'var(--dw-padding)',\n\t\t\t\t\t\tborderRight: '1px solid var(--dw-border)',\n\t\t\t\t\t\tbackground: 'var(--dw-bg)',\n\t\t\t\t\t\tcolor: 'var(--dw-text)',\n\t\t\t\t\t\tfontSize: '12px',\n\t\t\t\t\t\tfontFamily: 'ui-monospace, monospace'\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{children(activePanel)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<nav\n\t\t\t\tdata-dw-rail-icons\n\t\t\t\trole=\"toolbar\"\n\t\t\t\taria-label=\"Side panels\"\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t\twidth: '40px',\n\t\t\t\t\tbackground: 'var(--dw-bg-secondary)',\n\t\t\t\t\tpadding: '4px 0',\n\t\t\t\t\tgap: '2px',\n\t\t\t\t\talignItems: 'center'\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{enabledPanels.map(function renderIcon(panel) {\n\t\t\t\t\tconst isActive = panel.id === activePanel\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={panel.id}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\taria-label={panel.label}\n\t\t\t\t\t\t\taria-pressed={isActive}\n\t\t\t\t\t\t\tonClick={function toggle() {\n\t\t\t\t\t\t\t\thandleToggle(panel.id)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: '32px',\n\t\t\t\t\t\t\t\theight: '32px',\n\t\t\t\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\t\t\t\talignItems: 'center',\n\t\t\t\t\t\t\t\tjustifyContent: 'center',\n\t\t\t\t\t\t\t\tbackground: isActive ? 'var(--dw-accent-soft)' : 'transparent',\n\t\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\t\tborderRadius: 'var(--dw-radius)',\n\t\t\t\t\t\t\t\tcolor: isActive ? 'var(--dw-accent)' : 'var(--dw-text-muted)',\n\t\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\t\tfontSize: '14px',\n\t\t\t\t\t\t\t\tposition: 'relative'\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{panel.icon}\n\t\t\t\t\t\t\t{(panel.badgeCount ?? 0) > 0 && (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\t\t\ttop: '2px',\n\t\t\t\t\t\t\t\t\t\tright: '2px',\n\t\t\t\t\t\t\t\t\t\twidth: '8px',\n\t\t\t\t\t\t\t\t\t\theight: '8px',\n\t\t\t\t\t\t\t\t\t\tborderRadius: '50%',\n\t\t\t\t\t\t\t\t\t\tbackground: 'var(--dw-accent)',\n\t\t\t\t\t\t\t\t\t\tfontSize: '0'\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{panel.badgeCount}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</nav>\n\t\t</div>\n\t)\n}\n","import { useEffect, useCallback } from 'react'\n\ntype KeyboardActions = {\n\ttoggleKey: string\n\tenableShortcuts: boolean\n\tonToggle: () => void\n\tonEscape?: () => void\n\treducedMotion: 'system' | 'always' | 'never'\n}\n\n/** Keyboard shortcuts hook for widget toggle and global bindings */\nexport function useKeyboard(actions: KeyboardActions): void {\n\tconst { toggleKey, enableShortcuts, onToggle, onEscape } = actions\n\n\tconst handleKeyDown = useCallback(\n\t\tfunction onKeyDown(e: KeyboardEvent) {\n\t\t\tif (!enableShortcuts) return\n\t\t\tif (e.repeat) return\n\n\t\t\tif (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (e.target instanceof HTMLElement && e.target.isContentEditable) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\te.preventDefault()\n\t\t\t\tif (onEscape) {\n\t\t\t\t\tonEscape()\n\t\t\t\t} else {\n\t\t\t\t\tonToggle()\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst isToggle = e.key === toggleKey || (toggleKey === '`' && e.code === 'Backquote')\n\t\t\tif (isToggle && !e.ctrlKey && !e.metaKey && !e.altKey) {\n\t\t\t\te.preventDefault()\n\t\t\t\tonToggle()\n\t\t\t}\n\t\t},\n\t\t[toggleKey, enableShortcuts, onToggle, onEscape]\n\t)\n\n\tuseEffect(\n\t\tfunction bindKeyboard() {\n\t\t\twindow.addEventListener('keydown', handleKeyDown, true)\n\t\t\treturn function unbind() {\n\t\t\t\twindow.removeEventListener('keydown', handleKeyDown, true)\n\t\t\t}\n\t\t},\n\t\t[handleKeyDown]\n\t)\n}\n","import type { TabCategory, TabPresenter } from '../types/internal'\n\ntype TabEntry = {\n\tcategory: TabCategory\n\tpresenter: TabPresenter\n}\n\n/** Create a tabs runtime for managing tab categories and state */\nexport function createTabsRuntime(): TabsRuntime {\n\tconst entries = new Map<string, TabEntry>()\n\tlet activeId: string | null = null\n\tconst listeners = new Set<() => void>()\n\n\tfunction notify(): void {\n\t\tfor (const fn of listeners) {\n\t\t\tfn()\n\t\t}\n\t}\n\n\tfunction register(category: TabCategory, presenter: TabPresenter): void {\n\t\tentries.set(category.id, { category, presenter })\n\t\tif (!activeId && (category.enabled ?? true)) {\n\t\t\tactiveId = category.id\n\t\t}\n\t\tnotify()\n\t}\n\n\tfunction unregister(id: string): void {\n\t\tentries.delete(id)\n\t\tif (activeId === id) {\n\t\t\tconst first = getSorted()[0]\n\t\t\tactiveId = first?.category.id ?? null\n\t\t}\n\t\tnotify()\n\t}\n\n\tfunction setActive(id: string): void {\n\t\tif (!entries.has(id)) return\n\t\tactiveId = id\n\t\tnotify()\n\t}\n\n\tfunction getActive(): string | null {\n\t\treturn activeId\n\t}\n\n\tfunction getSorted(): TabEntry[] {\n\t\treturn Array.from(entries.values())\n\t\t\t.filter(function isEnabled(e) {\n\t\t\t\treturn e.category.enabled ?? true\n\t\t\t})\n\t\t\t.sort(function sortTabs(a, b) {\n\t\t\t\tconst orderA = a.category.order ?? 999\n\t\t\t\tconst orderB = b.category.order ?? 999\n\t\t\t\tif (orderA !== orderB) return orderA - orderB\n\t\t\t\treturn a.category.label.localeCompare(b.category.label)\n\t\t\t})\n\t}\n\n\tfunction getPresenter(id: string): TabPresenter | null {\n\t\treturn entries.get(id)?.presenter ?? null\n\t}\n\n\tfunction subscribe(listener: () => void): () => void {\n\t\tlisteners.add(listener)\n\t\treturn function unsubscribe() {\n\t\t\tlisteners.delete(listener)\n\t\t}\n\t}\n\n\tfunction updateBadge(id: string, count: number): void {\n\t\tconst entry = entries.get(id)\n\t\tif (entry) {\n\t\t\tentry.category = { ...entry.category, badgeCount: count }\n\t\t\tnotify()\n\t\t}\n\t}\n\n\treturn {\n\t\tregister,\n\t\tunregister,\n\t\tsetActive,\n\t\tgetActive,\n\t\tgetSorted,\n\t\tgetPresenter,\n\t\tsubscribe,\n\t\tupdateBadge\n\t}\n}\n\n/** Tabs runtime contract */\nexport type TabsRuntime = {\n\tregister(category: TabCategory, presenter: TabPresenter): void\n\tunregister(id: string): void\n\tsetActive(id: string): void\n\tgetActive(): string | null\n\tgetSorted(): { category: TabCategory; presenter: TabPresenter }[]\n\tgetPresenter(id: string): TabPresenter | null\n\tsubscribe(listener: () => void): () => void\n\tupdateBadge(id: string, count: number): void\n}\n"],"mappings":"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","names":["FEATURE_IDS","safeRun","fn","safeRunAsync","createBus","state","publish","event","payload","set","fn","safeRun","subscribe","listener","captured","clear","createRegistry","domains","categories","registerDomain","domain","unregisterDomain","id","entry","getDomain","listDomains","markStarted","isStarted","registerCategory","category","presenter","unregisterCategory","getCategories","a","b","orderA","orderB","getPresenter","clear","DEFAULTS","resolveConfig","props","disabled","features","id","FEATURE_IDS","fallback","DEFAULTS","userVal","createRuntime","props","config","resolveConfig","bus","createBus","registry","createRegistry","running","createPluginCtx","domain","category","presenter","event","listener","start","enabledIds","FEATURE_IDS","id","safeRunAsync","stop","ids","registerPlugin","plugin","ctx","createBetterAuth","options","baseUrl","getSession","response","data","user","sessionData","session","email","role","image","expiresAt","signOut","createCookieProvider","getSession","cookies","acc","pair","key","val","createJwtProvider","decodePayload","token","payload","decoded","getSession","cookies","pair","trimmed","session","email","role","exp","resolveProvider","authConfig","createCookieProvider","createJwtProvider","createBetterAuth","createAuthDomain","bus","provider","state","listeners","pollTimer","signoutUnsub","notify","fn","refresh","session","prevAuth","err","setup","_config","start","stop","getState","subscribe","listener","serializeDiagnostics","runHealthCheck","createFpsMeter","callback","frameCount","lastTime","rafId","running","tick","now","elapsed","fps","start","stop","createRingBuffer","capacity","buffer","head","size","push","event","getAll","getRecent","count","all","clear","createBatchLogger","flushFn","intervalMs","pending","timer","flush","batch","add","start","stop","TRIGGER_WEIGHTS","calcScore","events","weights","w","total","event","typeWeights","shouldTrigger","threshold","buildInput","suspects","c","routes","result","singleRoute","rulesAnalyze","input","eventsByType","highEvents","e","hotspots","suggestions","isObj","value","isFn","isHook","isFiber","getHook","hookValue","getNumber","isUpper","first","getName","named","display","getNodeName","node","name","ctor","ctorName","walkFiber","list","duration","pickNames","limit","sorted","a","b","names","seen","entry","getCommit","root","current","fiber","entries","components","setupProfiler","onCommit","hook","original","handle","rendererId","priority","info","nextId","genId","genSessionId","INTERNAL","GENERIC","pickNames","names","list","name","trimNames","getNames","filtered","sharp","createPerfDomain","bus","aiProvider","sessionId","buffer","createRingBuffer","batchLogger","createBatchLogger","config","state","listeners","longTaskObserver","mutationObserver","hourlyTimer","analysisTimer","scrollTimer","reactCleanup","commitTimes","lastBurst","notify","fn","classifySeverity","fps","threshold","getRoute","getContext","recordEvent","event","createEvent","eventType","severity","metrics","suspects","fpsMeter","createFpsMeter","newState","currentScrollFps","newScrollFps","setupScrollListener","onScroll","scrollCleanup","setupLongTasks","entry","duration","setupMutationObserver","mutCount","mutTimer","mutations","handleCommit","info","now","first","runAnalysis","recentEvents","shouldTrigger","input","buildInput","output","rulesAnalyze","reportId","setup","cfg","start","setupProfiler","stop","getState","subscribe","listener","serializeDiagnostics","runHealthCheck","reset","DEFAULT_ENDPOINT","createRoutesDomain","bus","state","listeners","endpoint","includeApiRoutes","notify","fn","setup","config","start","url","res","body","routes","err","message","stop","getState","subscribe","listener","serializeDiagnostics","resolveAiProvider","config","useState","useEffect","Fragment","jsx","jsxs","AuthTab","domain","state","setState","badge","useState","useEffect","useMemo","jsx","jsxs","getDetails","event","parts","getSuspects","isGeneric","name","getGuide","getSeverityColor","value","toToken","toKebab","findTargets","token","kebab","selectors","set","selector","list","node","PerfTab","domain","state","setState","selectedId","setSelectedId","selectedName","setSelectedName","highlightNote","setHighlightNote","events","selectedEvent","handleHighlight","targets","reset","target","item","fpsColor","selectedGuide","selectedSuspects","hasStrong","isActive","details","suspects","useState","useEffect","jsx","jsxs","RoutesTab","domain","state","setState","grouped","route","key","list","group","routes","setupConsoleInterceptor","callback","originalLog","originalWarn","originalError","intercept","type","args","isTextType","contentType","readHeaders","headers","list","value","name","readBodyText","text","maxBytes","bytes","size","truncated","slice","readResponseBody","res","readRequestBody","req","parseHeaderLines","raw","lines","out","line","idx","getInfo","xhr","setInfo","info","withInfo","setBody","body","entries","key","createReq","url","method","createRes","status","statusText","ok","setupNetworkInterceptor","callback","originalFetch","Xhr","originalOpen","originalSend","originalSetHeader","patchedFetch","args","start","requestHeaders","requestBody","clone","durationMs","responseHeaders","responseBody","error","failEvent","async","user","password","onLoadEnd","data","doneEvent","createMonitorDomain","state","listeners","consoleCleanup","networkCleanup","notify","fn","addRule","rule","newRule","removeRule","id","r","clearMatches","toggleRule","matchRule","content","lastSlash","pattern","flags","handleConsole","event","arg","matchedRules","newMatches","details","handleNetwork","status","method","url","setup","_config","start","setupConsoleInterceptor","setupNetworkInterceptor","stop","useState","useEffect","Fragment","jsx","jsxs","formatTime","value","stringifyValue","formatBytes","size","clearCookies","parts","count","part","name","key","clearStores","total","clearCaches","keys","reloadPage","bustPage","url","MonitorTab","domain","state","setState","newRuleMatch","setNewRuleMatch","newRuleType","setNewRuleType","isFocus","setIsFocus","selectedId","setSelectedId","showReqBody","setShowReqBody","showResBody","setShowResBody","actionRun","setActionRun","actionNote","setActionNote","m","handleAdd","handleToggle","handleRuleTypeChange","e","handleRuleMatchChange","handleRuleInputFocus","handleRuleInputBlur","handleRuleKeyDown","handleClearMatches","handleSelect","matchId","handleClearStorage","storeCount","cookieCount","handleClearCache","cacheCount","handleClearAll","handleRestart","handleToggleReqBody","handleToggleResBody","findRule","ruleId","rule","renderHeaders","headers","header","renderBody","body","renderNetworkDemo","renderConsole","details","arg","index","renderNetwork","renderMatch","match","isActive","ruleType","badge","renderDetails","selectedMatch","React","bootstrap","props","runtime","createRuntime","bus","registry","aiProvider","resolveAiProvider","authDomain","createAuthDomain","perfDomain","createPerfDomain","routesDomain","createRoutesDomain","monitorDomain","createMonitorDomain","AuthTab","PerfTab","RoutesTab","MonitorTab","useEffect","useRef","useMemo","useState","useCallback","useEffect","useMemo","useRef","createContext","useContext","useState","useEffect","useMemo","DARK_TOKENS","LIGHT_TOKENS","resolveTokens","mode","accent","base","resolveRadius","scale","resolveSpacing","density","tokensToCss","tokens","radius","spacing","tokensToStyleObject","jsx","Ctx","createContext","useSystemMode","dark","setDark","useState","useEffect","mq","onChange","e","ThemeProvider","mode","accent","density","radius","children","systemMode","resolvedMode","value","useMemo","tokens","resolveTokens","cssVars","tokensToCss","useTheme","ctx","useContext","jsx","jsxs","Header","title","onMinimize","onClose","jsx","jsxs","Footer","toggleKey","diagnosticCount","jsx","Panel","id","active","children","useState","useEffect","useCallback","useRef","forwardRef","jsx","Button","children","variant","size","active","style","type","disabled","props","ref","baseStyles","variantStyles","sizeStyles","jsx","jsxs","TabsView","runtime","forceRender","useState","tabsRef","useRef","useEffect","n","tabs","activeId","handleKeyDown","useCallback","e","currentIdx","t","nextIdx","nextTab","entry","isActive","Button","useState","useCallback","jsx","jsxs","RightRail","panels","defaultPanel","collapsible","children","activePanel","setActivePanel","handleToggle","id","current","handleKeyDown","e","enabled","p","currentIdx","nextIdx","nextPanel","enabledPanels","b","panel","isActive","useEffect","useCallback","useKeyboard","actions","toggleKey","enableShortcuts","onToggle","onEscape","handleKeyDown","e","createTabsRuntime","entries","activeId","listeners","notify","fn","register","category","presenter","unregister","id","getSorted","setActive","getActive","e","a","orderA","orderB","getPresenter","subscribe","listener","updateBadge","count","entry","Fragment","jsx","jsxs","readMotion","mode","LiveRegion","message","ShellInner","runtime","config","tokens","density","radius","useTheme","visible","setVisible","useState","minimized","setMinimized","announcement","setAnnouncement","reducedMotion","setReducedMotion","setTabsVersion","announceCount","useRef","announceTimer","tabsRuntime","useMemo","createTabsRuntime","useEffect","media","onChange","event","categories","entry","n","unsubscribe","count","handleToggle","useCallback","v","handleMinimize","m","handleClose","useKeyboard","currentCssVars","tokensToStyleObject","tabs","activeId","Header","TabsView","isActive","Panel","RightRail","panelId","domain","diagnostics","Footer","Shell","ThemeProvider","jsx","isDev","DevWidget","props","enabled","mode","shouldRender","runtime","useMemo","bootstrap","startedRef","useRef","useEffect","Shell"]}