{"version":3,"sources":["../src/index.ts","../src/polyfills.ts","../src/core/index.ts","../src/new-outlines/index.ts","../src/core/instrumentation.ts","../src/core/utils.ts","../src/web/utils/constants.ts","../src/web/views/inspector/timeline/utils.ts","../src/web/views/inspector/utils.ts","../src/web/views/inspector/index.tsx","../src/web/components/icon/index.tsx","../src/web/state.ts","../src/web/constants.ts","../src/web/utils/helpers.ts","../src/web/utils/preact/constant.ts","../src/web/views/inspector/components-tree/index.tsx","../src/web/hooks/use-virtual-list.ts","../src/web/utils/pin.ts","../src/web/views/inspector/states.ts","../src/web/views/inspector/flash-overlay.ts","../src/web/views/inspector/components-tree/state.ts","../src/web/views/inspector/what-changed.tsx","../src/web/components/copy-to-clipboard/index.tsx","../src/web/views/inspector/diff-value.tsx","../src/web/views/inspector/whats-changed/use-change-store.ts","../src/web/utils/log.ts","../src/new-outlines/canvas.ts","../src/web/assets/css/styles.tailwind.css","../src/web/toolbar.tsx","../src/web/components/svg-sprite/index.tsx","../src/web/widget/index.tsx","../src/web/views/index.tsx","../src/web/hooks/use-delayed-value.ts","../src/web/views/inspector/header.tsx","../src/web/widget/header.tsx","../src/web/views/toolbar/index.tsx","../src/web/components/toggle/index.tsx","../src/web/widget/fps-meter.tsx","../src/web/views/notifications/data.ts","../src/core/notifications/event-tracking.ts","../src/core/notifications/performance-utils.ts","../src/core/notifications/interaction-store.ts","../src/core/notifications/performance.ts","../src/core/notifications/performance-store.ts","../src/web/utils/create-store.ts","../src/web/views/notifications/icons.tsx","../src/web/views/notifications/notifications.tsx","../src/web/views/notifications/details-routes.tsx","../src/web/views/notifications/popover.tsx","../src/web/views/notifications/notification-tabs.tsx","../src/web/views/notifications/optimize.tsx","../src/web/views/notifications/other-visualization.tsx","../src/web/views/notifications/render-bar-chart.tsx","../src/core/notifications/outline-overlay.ts","../src/web/views/notifications/render-explanation.tsx","../src/web/views/notifications/notification-header.tsx","../src/web/views/notifications/slowdown-history.tsx","../src/web/views/notifications/collapsed-event.tsx","../src/web/views/inspector/overlay/index.tsx","../src/web/widget/helpers.ts","../src/web/widget/resize-handle.tsx","../package.json","../src/scan-facade.ts","../src/plugin.ts"],"sourcesContent":["/**\n * React DevTools Scan - Native scan engine integration\n *\n * @packageDocumentation\n */\n\nimport './polyfills'\nimport 'bippy'\n\nimport type { IntegrationMode, ReactDevtoolsScanOptions, ScanInstance } from './types'\nimport { ReactScanInternals, scan } from './core/index'\nimport { getScanInstance, resetScanInstance } from './scan-facade'\n\n/**\n * Initialize React Scan with DevTools integration\n *\n * @param options - Configuration options for React Scan\n * @returns Scan instance for further control\n *\n * @example\n * ```typescript\n * import { initScan } from '@react-devtools-plus/scan';\n *\n * // Initialize with default options\n * const scanInstance = initScan();\n *\n * // Initialize with custom options\n * const scanInstance = initScan({\n *   enabled: true,\n *   showToolbar: true,\n *   animationSpeed: 'fast',\n *   trackUnnecessaryRenders: true,\n *   integrationMode: 'overlay'\n * });\n * ```\n */\nexport function initScan(options: ReactDevtoolsScanOptions = {}): ScanInstance {\n  const defaultOptions: ReactDevtoolsScanOptions = {\n    integrationMode: 'overlay',\n    syncWithDevtools: true,\n    ...options,\n  }\n\n  if (typeof window !== 'undefined') {\n    if (window.__REACT_SCAN_INTERNALS__) {\n      window.__REACT_SCAN_INTERNALS__.runInAllEnvironments = true\n\n      window.__REACT_SCAN_INTERNALS__.options.value = {\n        ...window.__REACT_SCAN_INTERNALS__.options.value,\n        ...defaultOptions,\n      }\n\n      return getScanInstance(defaultOptions)\n    }\n\n    ;(window as any).__REACT_SCAN_INTERNALS__ = ReactScanInternals\n  }\n\n  // When `enabled` is not in options, core's setOptions() will automatically\n  // restore the user's preference from localStorage.\n  scan(defaultOptions)\n\n  return getScanInstance(defaultOptions)\n}\n\n/**\n * Get the current scan instance\n *\n * @returns Current scan instance or null if not initialized\n *\n * @example\n * ```typescript\n * import { getScan } from '@react-devtools-plus/scan';\n *\n * const scanInstance = getScan();\n * if (scanInstance) {\n *   // Check if scan is active\n *   scanInstance.isActive();\n * }\n * ```\n */\nexport function getScan(): ScanInstance | null {\n  try {\n    return getScanInstance()\n  }\n  catch {\n    return null\n  }\n}\n\n/**\n * Reset the scan instance (useful for testing)\n *\n * @example\n * ```typescript\n * import { resetScan } from '@react-devtools-plus/scan';\n *\n * // Reset for testing\n * resetScan();\n * ```\n */\nexport function resetScan(): void {\n  resetScanInstance()\n}\n\n// Re-export types\nexport type { IntegrationMode, ReactDevtoolsScanOptions, ScanInstance }\n\n// Re-export plugin\nexport { createScanPlugin, scanPlugin } from './plugin'\nexport type { ScanPluginConfig } from './plugin'\n\n// Re-export native engine exports for convenience\nexport {\n  getOptions,\n  onRender,\n  ReactScanInternals,\n  scan,\n  setOptions,\n  useScan,\n} from './core/index'\n\n// Re-export Options type from native engine\nexport type { Options } from './core/index'\n","// @ts-ignore\nif (!Array.prototype.toSorted) {\n  Object.defineProperty(Array.prototype, 'toSorted', {\n    value: function <T>(this: Array<T>, compareFn?: (a: T, b: T) => number): Array<T> {\n      return [...this].sort(compareFn);\n    },\n    writable: true,\n    configurable: true,\n  });\n}","import { type Signal, signal } from '@preact/signals';\nimport {\n  type Fiber,\n  _fiberRoots,\n  detectReactBuildType,\n  getRDTHook,\n  getType,\n  isInstrumentationActive,\n} from 'bippy';\nimport type { ComponentType } from 'preact';\nimport type { ReactNode } from 'preact/compat';\nimport type { RenderData } from 'src/core/utils';\nimport { initReactScanInstrumentation } from 'src/new-outlines';\nimport styles from '~web/assets/css/styles.css';\nimport { createToolbar } from '~web/toolbar';\nimport { IS_CLIENT } from '~web/utils/constants';\nimport { readLocalStorage, saveLocalStorage } from '~web/utils/helpers';\nimport type { States } from '~web/views/inspector/utils';\nimport type {\n  ChangeReason,\n  Render,\n  createInstrumentation,\n} from './instrumentation';\nimport { startTimingTracking } from './notifications/event-tracking';\nimport { createHighlightCanvas } from './notifications/outline-overlay';\nimport packageJson from '../../package.json';\n\nlet rootContainer: HTMLDivElement | null = null;\nlet shadowRoot: ShadowRoot | null = null;\n\ninterface RootContainer {\n  rootContainer: HTMLDivElement;\n  shadowRoot: ShadowRoot;\n}\n\nconst initRootContainer = (): RootContainer => {\n  if (rootContainer && shadowRoot) {\n    return { rootContainer, shadowRoot };\n  }\n\n  rootContainer = document.createElement('div');\n  rootContainer.id = 'react-scan-root';\n\n  shadowRoot = rootContainer.attachShadow({ mode: 'open' });\n\n  const cssStyles = document.createElement('style');\n  cssStyles.textContent = styles;\n\n  shadowRoot.appendChild(cssStyles);\n\n  document.documentElement.appendChild(rootContainer);\n\n  return { rootContainer, shadowRoot };\n};\n\nexport interface Options {\n  /**\n   * Enable/disable scanning\n   *\n   * Please use the recommended way:\n   * enabled: process.env.NODE_ENV === 'development',\n   *\n   * @default true\n   */\n  enabled?: boolean;\n\n  /**\n   * Force React Scan to run in production (not recommended)\n   *\n   * @default false\n   */\n  dangerouslyForceRunInProduction?: boolean;\n  /**\n   * Log renders to the console\n   *\n   * WARNING: This can add significant overhead when the app re-renders frequently\n   *\n   * @default false\n   */\n  log?: boolean;\n\n  /**\n   * Show toolbar bar\n   *\n   * If you set this to true, and set {@link enabled} to false, the toolbar will still show, but scanning will be disabled.\n   *\n   * @default true\n   */\n  showToolbar?: boolean;\n\n  /**\n   * Animation speed\n   *\n   * @default \"fast\"\n   */\n  animationSpeed?: 'slow' | 'fast' | 'off';\n\n  /**\n   * Track unnecessary renders, and mark their outlines gray when detected\n   *\n   * An unnecessary render is defined as the component re-rendering with no change to the component's\n   * corresponding dom subtree\n   *\n   *  @default false\n   *  @warning tracking unnecessary renders can add meaningful overhead to react-scan\n   */\n  trackUnnecessaryRenders?: boolean;\n\n  /**\n   * Should the FPS meter show in the toolbar\n   *\n   *  @default true\n   */\n  showFPS?: boolean;\n\n  /**\n   * Should the number of slowdown notifications be shown in the toolbar\n   *\n   *  @default true\n   */\n  showNotificationCount?: boolean;\n\n  /**\n   * Allow React Scan to run inside iframes\n   *\n   * @default false\n   */\n  allowInIframe?: boolean;\n\n  /**\n   * Should react scan log internal errors to the console.\n   *\n   * Useful if react scan is not behaving expected and you want to provide information to maintainers when submitting an issue https://github.com/aidenybai/react-scan/issues\n   *\n   *  @default false\n   */\n  _debug?: 'verbose' | false;\n\n  onCommitStart?: () => void;\n  onRender?: (fiber: Fiber, renders: Array<Render>) => void;\n  onCommitFinish?: () => void;\n}\n\nexport interface StoreType {\n  inspectState: Signal<States>;\n  wasDetailsOpen: Signal<boolean>;\n  lastReportTime: Signal<number>;\n  isInIframe: Signal<boolean>;\n  fiberRoots: WeakSet<Fiber>;\n  reportData: Map<number, RenderData>;\n  legacyReportData: Map<string, RenderData>;\n  changesListeners: Map<number, Array<ChangesListener>>;\n  interactionListeningForRenders:\n    | ((fiber: Fiber, renders: Array<Render>) => void)\n    | null;\n}\n\nexport type OutlineKey = `${string}-${string}`;\n\nexport interface Internals {\n  instrumentation: ReturnType<typeof createInstrumentation> | null;\n  componentAllowList: WeakMap<ComponentType<unknown>, Options> | null;\n  options: Signal<Options>;\n  onRender: ((fiber: Fiber, renders: Array<Render>) => void) | null;\n  Store: StoreType;\n  version: string;\n  runInAllEnvironments: boolean;\n  initToolbar?: (showToolbar: boolean) => void;\n  addOnRenderListener?: (cb: (fiber: Fiber, renders: Array<Render>) => void) => (() => void);\n  fiberRootsSet?: Set<any>;\n}\n\nexport type FunctionalComponentStateChange = {\n  type: ChangeReason.FunctionalState;\n  value: unknown;\n  prevValue?: unknown;\n  count?: number | undefined;\n  name: string;\n};\nexport type ClassComponentStateChange = {\n  type: ChangeReason.ClassState;\n  value: unknown;\n  prevValue?: unknown;\n  count?: number | undefined;\n  name: 'state';\n};\n\nexport type StateChange =\n  | FunctionalComponentStateChange\n  | ClassComponentStateChange;\nexport type PropsChange = {\n  type: ChangeReason.Props;\n  name: string;\n  value: unknown;\n  prevValue?: unknown;\n  count?: number | undefined;\n};\nexport type ContextChange = {\n  type: ChangeReason.Context;\n  name: string;\n  value: unknown;\n  prevValue?: unknown;\n  count?: number | undefined;\n  contextType: number;\n};\n\nexport type Change = StateChange | PropsChange | ContextChange;\n\nexport type ChangesPayload = {\n  propsChanges: Array<PropsChange>;\n  stateChanges: Array<\n    FunctionalComponentStateChange | ClassComponentStateChange\n  >;\n  contextChanges: Array<ContextChange>;\n};\nexport type ChangesListener = (changes: ChangesPayload) => void;\n\nexport const Store: StoreType = {\n  wasDetailsOpen: signal(true),\n  isInIframe: signal(IS_CLIENT && window.self !== window.top),\n  inspectState: signal<States>({\n    kind: 'uninitialized',\n  }),\n  fiberRoots: new Set<Fiber>(),\n  reportData: new Map<number, RenderData>(),\n  legacyReportData: new Map<string, RenderData>(),\n  lastReportTime: signal(0),\n  interactionListeningForRenders: null,\n  changesListeners: new Map(),\n};\n\nexport const ReactScanInternals: Internals = {\n  instrumentation: null,\n  componentAllowList: null,\n  options: signal({\n    enabled: true,\n    log: false,\n    showToolbar: true,\n    animationSpeed: 'fast',\n    dangerouslyForceRunInProduction: false,\n    showFPS: true,\n    showNotificationCount: true,\n    allowInIframe: false,\n  }),\n  runInAllEnvironments: false,\n  onRender: null,\n  Store,\n  version: packageJson.version,\n};\n\nif (IS_CLIENT && window.__REACT_SCAN_EXTENSION__) {\n  window.__REACT_SCAN_VERSION__ = ReactScanInternals.version;\n}\n\nexport type LocalStorageOptions = Omit<\n  Options,\n  'onCommitStart' | 'onRender' | 'onCommitFinish'\n>;\n\nconst applyLocalStorageOptions = (options: Options): LocalStorageOptions => {\n  const {\n    onCommitStart,\n    onRender,\n    onCommitFinish,\n    ...rest\n  } = options;\n  return rest;\n};\n\nconst validateOptions = (options: Partial<Options>): Partial<Options> => {\n  const errors: Array<string> = [];\n  const validOptions: Partial<Options> = {};\n\n  for (const key in options) {\n    const value = options[key as keyof Options];\n    switch (key) {\n      case 'enabled':\n      case 'log':\n      case 'showToolbar':\n      case 'showNotificationCount':\n      case 'dangerouslyForceRunInProduction':\n      case 'showFPS':\n      case 'allowInIframe':\n        if (typeof value !== 'boolean') {\n          errors.push(`- ${key} must be a boolean. Got \"${value}\"`);\n        } else {\n          validOptions[key] = value;\n        }\n        break;\n      case 'animationSpeed':\n        if (!['slow', 'fast', 'off'].includes(value as string)) {\n          errors.push(\n            `- Invalid animation speed \"${value}\". Using default \"fast\"`,\n          );\n        } else {\n          validOptions[key] = value as 'slow' | 'fast' | 'off';\n        }\n        break;\n      case 'onCommitStart':\n        if (typeof value !== 'function') {\n          errors.push(`- ${key} must be a function. Got \"${value}\"`);\n        } else {\n          validOptions.onCommitStart = value as () => void;\n        }\n        break;\n      case 'onCommitFinish':\n        if (typeof value !== 'function') {\n          errors.push(`- ${key} must be a function. Got \"${value}\"`);\n        } else {\n          validOptions.onCommitFinish = value as () => void;\n        }\n        break;\n      case 'onRender':\n        if (typeof value !== 'function') {\n          errors.push(`- ${key} must be a function. Got \"${value}\"`);\n        } else {\n          validOptions.onRender = value as (\n            fiber: Fiber,\n            renders: Array<Render>,\n          ) => void;\n        }\n        break;\n      default:\n        errors.push(`- Unknown option \"${key}\"`);\n    }\n  }\n\n  if (errors.length > 0) {\n    // oxlint-disable-next-line no-console\n    console.warn(`[React Scan] Invalid options:\\n${errors.join('\\n')}`);\n  }\n\n  return validOptions;\n};\n\nexport const getReport = (type?: ComponentType<unknown>) => {\n  if (type) {\n    for (const reportData of Array.from(Store.legacyReportData.values())) {\n      if (reportData.type === type) {\n        return reportData;\n      }\n    }\n    return null;\n  }\n  return Store.legacyReportData;\n};\n\nexport const setOptions = (userOptions: Partial<Options>) => {\n  try {\n    const validOptions = validateOptions(userOptions);\n\n    if (Object.keys(validOptions).length === 0) {\n      return;\n    }\n\n    const shouldInitToolbar =\n      'showToolbar' in validOptions && validOptions.showToolbar !== undefined;\n\n    const newOptions = {\n      ...ReactScanInternals.options.value,\n      ...validOptions,\n    };\n\n    const { instrumentation } = ReactScanInternals;\n    if (instrumentation && 'enabled' in validOptions) {\n      instrumentation.isPaused.value = validOptions.enabled === false;\n    }\n\n    ReactScanInternals.options.value = newOptions;\n\n    // Restore persisted `enabled` from localStorage only when the caller did\n    // NOT explicitly set it. This prevents programmatic start()/stop() from\n    // being silently overridden by a stale localStorage value.\n    try {\n      if (!('enabled' in validOptions)) {\n        const existing = readLocalStorage<undefined | Record<string, unknown>>(\n          'react-scan-options',\n        )?.enabled;\n\n        if (typeof existing === 'boolean') {\n          newOptions.enabled = existing;\n          if (instrumentation) {\n            instrumentation.isPaused.value = existing === false;\n          }\n        }\n      }\n    } catch (e) {\n      if (ReactScanInternals.options.value._debug === 'verbose') {\n        // oxlint-disable-next-line no-console\n        console.error(\n          '[React Scan Internal Error]',\n          'Failed to read localStorage options',\n          e,\n        );\n      }\n      /** */\n    }\n\n    saveLocalStorage<LocalStorageOptions>(\n      'react-scan-options',\n      applyLocalStorageOptions(newOptions),\n    );\n\n    if (shouldInitToolbar) {\n      initToolbar(!!newOptions.showToolbar);\n    }\n\n    return newOptions;\n  } catch (e) {\n    if (ReactScanInternals.options.value._debug === 'verbose') {\n      // oxlint-disable-next-line no-console\n      console.error(\n        '[React Scan Internal Error]',\n        'Failed to create notifications outline canvas',\n        e,\n      );\n    }\n    /** */\n  }\n};\n\nexport const getOptions = () => ReactScanInternals.options;\n\n// we only need to run this check once and will read the value in hot path\nlet isProduction: boolean | null = null;\nlet rdtHook: ReturnType<typeof getRDTHook>;\nexport const getIsProduction = () => {\n  if (isProduction !== null) {\n    return isProduction;\n  }\n  rdtHook ??= getRDTHook();\n  for (const renderer of rdtHook.renderers.values()) {\n    const buildType = detectReactBuildType(renderer);\n    if (buildType === 'production') {\n      isProduction = true;\n    }\n  }\n  return isProduction;\n};\n\nexport const start = () => {\n  try {\n    if (!IS_CLIENT) {\n      return;\n    }\n\n    if (\n      !ReactScanInternals.runInAllEnvironments &&\n      getIsProduction() &&\n      !ReactScanInternals.options.value.dangerouslyForceRunInProduction\n    ) {\n      return;\n    }\n\n    const localStorageOptions =\n      readLocalStorage<LocalStorageOptions>('react-scan-options');\n\n    if (localStorageOptions) {\n      const validLocalOptions = validateOptions(localStorageOptions);\n\n      if (Object.keys(validLocalOptions).length > 0) {\n        ReactScanInternals.options.value = {\n          ...ReactScanInternals.options.value,\n          ...validLocalOptions,\n        };\n      }\n    }\n\n    const options = getOptions();\n\n    initReactScanInstrumentation(() => {\n      initToolbar(!!options.value.showToolbar);\n    });\n\n    if (IS_CLIENT) {\n      setTimeout(() => {\n        if (isInstrumentationActive()) return;\n        // oxlint-disable-next-line no-console\n        console.error(\n          '[React Scan] Failed to load. Must import React Scan before React runs.',\n        );\n      }, 5000);\n    }\n  } catch (e) {\n    if (ReactScanInternals.options.value._debug === 'verbose') {\n      // oxlint-disable-next-line no-console\n      console.error(\n        '[React Scan Internal Error]',\n        'Failed to create notifications outline canvas',\n        e,\n      );\n    }\n  }\n};\n\nconst initToolbar = (showToolbar: boolean) => {\n  window.reactScanCleanupListeners?.();\n\n  const cleanupTimingTracking = startTimingTracking();\n  const cleanupOutlineCanvas = createNotificationsOutlineCanvas();\n\n  window.reactScanCleanupListeners = () => {\n    cleanupTimingTracking();\n    cleanupOutlineCanvas?.();\n  };\n\n  const windowToolbarContainer = window.__REACT_SCAN_TOOLBAR_CONTAINER__;\n\n  if (!showToolbar) {\n    windowToolbarContainer?.remove();\n    return;\n  }\n\n  windowToolbarContainer?.remove();\n  const { shadowRoot } = initRootContainer();\n  createToolbar(shadowRoot);\n};\n\n// Expose initToolbar so the DevTools facade can force-initialize the\n// toolbar (and thus ScanOverlay) even when showToolbar was originally false.\nReactScanInternals.initToolbar = initToolbar;\n\nconst createNotificationsOutlineCanvas = () => {\n  try {\n    const highlightRoot = document.documentElement;\n    return createHighlightCanvas(highlightRoot);\n  } catch (e) {\n    if (ReactScanInternals.options.value._debug === 'verbose') {\n      // oxlint-disable-next-line no-console\n      console.error(\n        '[React Scan Internal Error]',\n        'Failed to create notifications outline canvas',\n        e,\n      );\n    }\n  }\n};\n\nexport const scan = (options: Options = {}) => {\n  setOptions(options);\n  const isInIframe = Store.isInIframe.value;\n\n  if (\n    isInIframe &&\n    !ReactScanInternals.options.value.allowInIframe &&\n    !ReactScanInternals.runInAllEnvironments\n  ) {\n    return;\n  }\n\n  if (options.enabled === false && options.showToolbar !== true) {\n    return;\n  }\n\n  start();\n};\n\nexport const useScan = (options: Options = {}) => {\n  setOptions(options);\n  start();\n};\n\nexport const onRender = (\n  type: unknown,\n  _onRender: (fiber: Fiber, renders: Array<Render>) => void,\n) => {\n  const prevOnRender = ReactScanInternals.onRender;\n  ReactScanInternals.onRender = (fiber, renders) => {\n    prevOnRender?.(fiber, renders);\n    if (getType(fiber.type) === type) {\n      _onRender(fiber, renders);\n    }\n  };\n};\n\n// Render listener registry — allows multiple observers without mutating options.value\nconst renderListeners = new Set<(fiber: Fiber, renders: Array<Render>) => void>();\n\nexport const addOnRenderListener = (\n  cb: (fiber: Fiber, renders: Array<Render>) => void,\n): (() => void) => {\n  renderListeners.add(cb);\n  return () => renderListeners.delete(cb);\n};\n\n// Expose addOnRenderListener so the DevTools facade can register listeners on\n// the same Set that the active instrumentation notifies.\nReactScanInternals.addOnRenderListener = addOnRenderListener;\n\n// Expose bippy's _fiberRoots Set so the facade can access fiber roots from the\n// same bippy instance that intercepted React's DevTools hook.\nReactScanInternals.fiberRootsSet = _fiberRoots as unknown as Set<any>;\n\nexport const removeOnRenderListener = (\n  cb: (fiber: Fiber, renders: Array<Render>) => void,\n): void => {\n  renderListeners.delete(cb);\n};\n\nexport const notifyRenderListeners = (\n  fiber: Fiber,\n  renders: Array<Render>,\n): void => {\n  renderListeners.forEach((cb) => {\n    try {\n      cb(fiber, renders);\n    } catch {\n      // ignore listener errors\n    }\n  });\n};\n\nexport const getRenderCount = (fiberId: number): number => {\n  return Store.reportData.get(fiberId)?.count ?? 0;\n};\n\nexport const ignoredProps = new WeakSet<\n  Exclude<ReactNode, undefined | null | string | number | boolean | bigint>\n>();\n\nexport const ignoreScan = (node: ReactNode) => {\n  if (node && typeof node === 'object') {\n    ignoredProps.add(node);\n  }\n};\n","import {\n  type Fiber,\n  didFiberCommit,\n  getDisplayName,\n  getFiberId,\n  getNearestHostFibers,\n  getTimings,\n  getType,\n  isCompositeFiber,\n} from 'bippy';\nimport {\n  Change,\n  ContextChange,\n  PropsChange,\n  ReactScanInternals,\n  Store,\n  ignoredProps,\n  notifyRenderListeners,\n} from '~core/index';\nimport {\n  ChangeReason,\n  createInstrumentation,\n  getContextChanges,\n  getStateChanges,\n  OldRenderData,\n} from '~core/instrumentation';\nimport { log, logIntro } from '~web/utils/log';\nimport { inspectorUpdateSignal } from '~web/views/inspector/states';\nimport {\n  OUTLINE_ARRAY_SIZE,\n  drawCanvas,\n  initCanvas,\n  updateOutlines,\n  updateScroll,\n} from './canvas';\nimport type { ActiveOutline, BlueprintOutline, OutlineData } from './types';\nimport { getChangedPropsDetailed } from '~web/views/inspector/utils';\n\n// The worker code will be replaced at build time\nconst workerCode = '__WORKER_CODE__';\n\nlet worker: Worker | null = null;\nlet canvas: HTMLCanvasElement | null = null;\nlet ctx: CanvasRenderingContext2D | null = null;\nlet dpr = 1;\nlet animationFrameId: number | null = null;\nconst activeOutlines = new Map<string, ActiveOutline>();\n\nconst blueprintMap = new Map<Fiber, BlueprintOutline>();\nconst blueprintMapKeys = new Set<Fiber>();\n\nexport const outlineFiber = (fiber: Fiber) => {\n  if (!isCompositeFiber(fiber)) return;\n  const name =\n    typeof fiber.type === 'string' ? fiber.type : getDisplayName(fiber);\n  if (!name) return;\n  const blueprint = blueprintMap.get(fiber);\n  const nearestFibers = getNearestHostFibers(fiber);\n  const didCommit = didFiberCommit(fiber);\n\n  if (!blueprint) {\n    blueprintMap.set(fiber, {\n      name,\n      count: 1,\n      elements: nearestFibers.map((fiber) => fiber.stateNode),\n      didCommit: didCommit ? 1 : 0,\n    });\n    blueprintMapKeys.add(fiber);\n  } else {\n    blueprint.count++;\n  }\n};\n\nconst mergeRects = (rects: DOMRect[]) => {\n  const firstRect = rects[0];\n  if (rects.length === 1) return firstRect;\n\n  let minX: number | undefined;\n  let minY: number | undefined;\n  let maxX: number | undefined;\n  let maxY: number | undefined;\n\n  for (let i = 0, len = rects.length; i < len; i++) {\n    const rect = rects[i];\n    minX = minX == null ? rect.x : Math.min(minX, rect.x);\n    minY = minY == null ? rect.y : Math.min(minY, rect.y);\n    maxX =\n      maxX == null ? rect.x + rect.width : Math.max(maxX, rect.x + rect.width);\n    maxY =\n      maxY == null\n        ? rect.y + rect.height\n        : Math.max(maxY, rect.y + rect.height);\n  }\n\n  if (minX == null || minY == null || maxX == null || maxY == null) {\n    return rects[0];\n  }\n\n  return new DOMRect(minX, minY, maxX - minX, maxY - minY);\n};\n\ninterface IntersectionState {\n  resolveNext: ((value: IntersectionObserverEntry[]) => void) | null;\n  seenElements: Set<Element>;\n  uniqueElements: Set<Element>;\n  done: boolean;\n}\n\nfunction onIntersect(\n  this: IntersectionState,\n  entries: IntersectionObserverEntry[],\n  observer: IntersectionObserver,\n) {\n  const newEntries: IntersectionObserverEntry[] = [];\n\n  for (const entry of entries) {\n    const element = entry.target;\n    if (!this.seenElements.has(element)) {\n      this.seenElements.add(element);\n      newEntries.push(entry);\n    }\n  }\n\n  if (newEntries.length > 0 && this.resolveNext) {\n    this.resolveNext(newEntries);\n    this.resolveNext = null;\n  }\n\n  if (this.seenElements.size === this.uniqueElements.size) {\n    observer.disconnect();\n    this.done = true;\n    if (this.resolveNext) {\n      this.resolveNext([]);\n    }\n  }\n}\n\nexport const getBatchedRectMap = async function* (\n  elements: Element[],\n): AsyncGenerator<IntersectionObserverEntry[], void, unknown> {\n  const state: IntersectionState = {\n    uniqueElements: new Set(elements),\n    seenElements: new Set(),\n    resolveNext: null,\n    done: false,\n  };\n  const observer = new IntersectionObserver(onIntersect.bind(state));\n\n  for (const element of state.uniqueElements) {\n    observer.observe(element);\n  }\n\n  while (!state.done) {\n    const entries = await new Promise<IntersectionObserverEntry[]>(\n      (resolve) => {\n        state.resolveNext = resolve;\n      },\n    );\n    if (entries.length > 0) {\n      yield entries;\n    }\n  }\n};\n\nconst SupportedArrayBuffer =\n  typeof SharedArrayBuffer !== 'undefined' ? SharedArrayBuffer : ArrayBuffer;\n\nexport const flushOutlines = async () => {\n  const elements: Element[] = [];\n\n  for (const fiber of blueprintMapKeys) {\n    const blueprint = blueprintMap.get(fiber);\n    if (!blueprint) continue;\n    for (let i = 0; i < blueprint.elements.length; i++) {\n      if (!(blueprint.elements[i] instanceof Element)) {\n        // TODO: filter this at the root\n        continue;\n      }\n      elements.push(blueprint.elements[i]);\n    }\n  }\n\n  const rectsMap = new Map<Element, DOMRect>();\n\n  // TODO(Alexis): too complex, needs breakdown\n  for await (const entries of getBatchedRectMap(elements)) {\n    for (const entry of entries) {\n      const element = entry.target;\n      const rect = entry.intersectionRect;\n      if (entry.isIntersecting && rect.width && rect.height) {\n        rectsMap.set(element, rect);\n      }\n    }\n\n    const blueprints: BlueprintOutline[] = [];\n    const blueprintRects: DOMRect[] = [];\n    const blueprintIds: number[] = [];\n\n    for (const fiber of blueprintMapKeys) {\n      const blueprint = blueprintMap.get(fiber);\n      if (!blueprint) continue;\n\n      const rects: DOMRect[] = [];\n      for (let i = 0; i < blueprint.elements.length; i++) {\n        const element = blueprint.elements[i];\n        const rect = rectsMap.get(element);\n        if (!rect) continue;\n        rects.push(rect);\n      }\n\n      if (!rects.length) continue;\n\n      blueprints.push(blueprint);\n      blueprintRects.push(mergeRects(rects));\n      blueprintIds.push(getFiberId(fiber));\n    }\n\n    if (blueprints.length > 0) {\n      const arrayBuffer = new SupportedArrayBuffer(\n        blueprints.length * OUTLINE_ARRAY_SIZE * 4,\n      );\n      const sharedView = new Float32Array(arrayBuffer);\n      const blueprintNames = new Array(blueprints.length);\n      let outlineData: OutlineData[] | undefined;\n\n      for (let i = 0, len = blueprints.length; i < len; i++) {\n        const blueprint = blueprints[i];\n        const id = blueprintIds[i];\n        const { x, y, width, height } = blueprintRects[i];\n        const { count, name, didCommit } = blueprint;\n\n        if (worker) {\n          const scaledIndex = i * OUTLINE_ARRAY_SIZE;\n          sharedView[scaledIndex] = id;\n          sharedView[scaledIndex + 1] = count;\n          sharedView[scaledIndex + 2] = x;\n          sharedView[scaledIndex + 3] = y;\n          sharedView[scaledIndex + 4] = width;\n          sharedView[scaledIndex + 5] = height;\n          sharedView[scaledIndex + 6] = didCommit;\n          blueprintNames[i] = name;\n        } else {\n          outlineData ||= new Array(blueprints.length);\n          outlineData[i] = {\n            id,\n            name,\n            count,\n            x,\n            y,\n            width,\n            height,\n            didCommit: didCommit as 0 | 1,\n          };\n        }\n      }\n\n      if (worker) {\n        worker.postMessage({\n          type: 'draw-outlines',\n          data: arrayBuffer,\n          names: blueprintNames,\n        });\n      } else if (canvas && ctx && outlineData) {\n        updateOutlines(activeOutlines, outlineData);\n        if (!animationFrameId) {\n          animationFrameId = requestAnimationFrame(draw);\n        }\n      }\n    }\n  }\n\n  for (const fiber of blueprintMapKeys) {\n    blueprintMap.delete(fiber);\n    blueprintMapKeys.delete(fiber);\n  }\n};\n\nconst draw = () => {\n  if (!ctx || !canvas) return;\n\n  const shouldContinue = drawCanvas(ctx, canvas, dpr, activeOutlines);\n\n  if (shouldContinue) {\n    animationFrameId = requestAnimationFrame(draw);\n  } else {\n    animationFrameId = null;\n  }\n};\n\nconst IS_OFFSCREEN_CANVAS_WORKER_SUPPORTED =\n  typeof OffscreenCanvas !== 'undefined' && typeof Worker !== 'undefined';\n\nconst getDpr = () => {\n  return Math.min(window.devicePixelRatio || 1, 2);\n};\n\nexport const getCanvasEl = () => {\n  cleanup();\n  const host = document.createElement('div');\n  host.setAttribute('data-react-scan', 'true');\n  const shadowRoot = host.attachShadow({ mode: 'open' });\n\n  const canvasEl = document.createElement('canvas');\n  canvasEl.style.position = 'fixed';\n  canvasEl.style.top = '0';\n  canvasEl.style.left = '0';\n  canvasEl.style.pointerEvents = 'none';\n  canvasEl.style.zIndex = '2147483646';\n  canvasEl.setAttribute('aria-hidden', 'true');\n  shadowRoot.appendChild(canvasEl);\n\n  if (!canvasEl) return null;\n\n  dpr = getDpr();\n  canvas = canvasEl;\n\n  const { innerWidth, innerHeight } = window;\n  canvasEl.style.width = `${innerWidth}px`;\n  canvasEl.style.height = `${innerHeight}px`;\n  const width = innerWidth * dpr;\n  const height = innerHeight * dpr;\n  canvasEl.width = width;\n  canvasEl.height = height;\n\n  if (\n    IS_OFFSCREEN_CANVAS_WORKER_SUPPORTED &&\n    !window.__REACT_SCAN_EXTENSION__\n  ) {\n    try {\n      worker = new Worker(\n        URL.createObjectURL(\n          new Blob([workerCode], { type: 'application/javascript' }),\n        ),\n      );\n\n      const offscreenCanvas = canvasEl.transferControlToOffscreen();\n      worker?.postMessage(\n        {\n          type: 'init',\n          canvas: offscreenCanvas,\n          width: canvasEl.width,\n          height: canvasEl.height,\n          dpr,\n        },\n        [offscreenCanvas],\n      );\n    } catch (e) {\n      // oxlint-disable-next-line no-console\n      console.warn('Failed to initialize OffscreenCanvas worker:', e);\n    }\n  }\n\n  if (!worker) {\n    ctx = initCanvas(canvasEl, dpr) as CanvasRenderingContext2D;\n  }\n\n  let isResizeScheduled = false;\n  window.addEventListener('resize', () => {\n    if (!isResizeScheduled) {\n      isResizeScheduled = true;\n      // TODO(Alexis): bindable\n      setTimeout(() => {\n        const width = window.innerWidth;\n        const height = window.innerHeight;\n        dpr = getDpr();\n        canvasEl.style.width = `${width}px`;\n        canvasEl.style.height = `${height}px`;\n        if (worker) {\n          worker.postMessage({\n            type: 'resize',\n            width,\n            height,\n            dpr,\n          });\n        } else {\n          canvasEl.width = width * dpr;\n          canvasEl.height = height * dpr;\n          if (ctx) {\n            ctx.resetTransform();\n            ctx.scale(dpr, dpr);\n          }\n          draw();\n        }\n        isResizeScheduled = false;\n      });\n    }\n  });\n\n  let prevScrollX = window.scrollX;\n  let prevScrollY = window.scrollY;\n  let isScrollScheduled = false;\n\n  window.addEventListener('scroll', () => {\n    if (!isScrollScheduled) {\n      isScrollScheduled = true;\n      // TODO(Alexis): bindable\n      setTimeout(() => {\n        const { scrollX, scrollY } = window;\n        const deltaX = scrollX - prevScrollX;\n        const deltaY = scrollY - prevScrollY;\n        prevScrollX = scrollX;\n        prevScrollY = scrollY;\n        if (worker) {\n          worker.postMessage({\n            type: 'scroll',\n            deltaX,\n            deltaY,\n          });\n        } else {\n          requestAnimationFrame(\n            updateScroll.bind(null, activeOutlines, deltaX, deltaY),\n          );\n        }\n        isScrollScheduled = false;\n      }, 16 * 2);\n    }\n  });\n\n  setInterval(() => {\n    if (blueprintMapKeys.size) {\n      requestAnimationFrame(flushOutlines);\n    }\n  }, 16 * 2);\n\n  shadowRoot.appendChild(canvasEl);\n  return host;\n};\n\nexport const hasStopped = () => {\n  return globalThis.__REACT_SCAN_STOP__;\n};\n\nexport const stop = () => {\n  globalThis.__REACT_SCAN_STOP__ = true;\n  cleanup();\n};\n\nexport const cleanup = () => {\n  const host = document.querySelector('[data-react-scan]');\n  if (host) {\n    host.remove();\n  }\n};\n\nconst reportRenderToListeners = (fiber: Fiber) => {\n  if (isCompositeFiber(fiber)) {\n    // report render has a non trivial cost because it calls Date.now(), so we want to avoid the computation if possible\n    if (\n      ReactScanInternals.options.value.showToolbar !== false &&\n      Store.inspectState.value.kind === 'focused'\n    ) {\n      const reportFiber = fiber;\n      const { selfTime } = getTimings(fiber);\n      const displayName = getDisplayName(fiber.type);\n      const fiberId = getFiberId(reportFiber);\n\n      const currentData = Store.reportData.get(fiberId);\n      const existingCount = currentData?.count ?? 0;\n      const existingTime = currentData?.time ?? 0;\n\n      const changes: Array<Change> = [];\n\n      // optimization, for now only track changes on inspected prop, cleanup later when changes is used in outline drawing\n      const listeners = Store.changesListeners.get(getFiberId(fiber));\n\n      if (listeners?.length) {\n        const propsChanges: Array<PropsChange> = getChangedPropsDetailed(\n          fiber,\n        ).map((change) => ({\n          type: ChangeReason.Props,\n          name: change.name,\n          value: change.value,\n          prevValue: change.prevValue,\n          unstable: false,\n        }));\n\n        const stateChanges = getStateChanges(fiber);\n\n        // context changes are incorrect, bippy needs to tell us the context dependencies that changed and provide those values every render\n        // currently, we say every context change, regardless of the render it happened, is a change. Which requires us to hack change tracking\n        // in the whats-changed toolbar component\n        const fiberContext = getContextChanges(fiber);\n        const contextChanges: Array<ContextChange> = fiberContext.map(\n          (info) => ({\n            name: info.name,\n            type: ChangeReason.Context,\n            value: info.value,\n            contextType: info.contextType,\n          }),\n        );\n\n        listeners.forEach((listener) => {\n          listener({\n            propsChanges,\n            stateChanges,\n            contextChanges,\n          });\n        });\n      }\n      const fiberData: OldRenderData = {\n        count: existingCount + 1,\n        time: existingTime + selfTime || 0,\n        renders: [],\n        displayName,\n        type: getType(fiber.type) || null,\n        changes,\n      };\n\n      Store.reportData.set(fiberId, fiberData);\n      needsReport = true;\n    }\n  }\n};\n\nlet needsReport = false;\nlet reportInterval: ReturnType<typeof setInterval>;\nexport const startReportInterval = () => {\n  clearInterval(reportInterval);\n  reportInterval = setInterval(() => {\n    if (needsReport) {\n      Store.lastReportTime.value = Date.now();\n      needsReport = false;\n    }\n  }, 50);\n};\n\nexport const isValidFiber = (fiber: Fiber) => {\n  if (ignoredProps.has(fiber.memoizedProps)) {\n    return false;\n  }\n\n  return true;\n};\nlet isInstrumentationInitialized = false;\n\nexport const initReactScanInstrumentation = (setupToolbar: () => void) => {\n  if (hasStopped()) return;\n  if (isInstrumentationInitialized) return;\n  isInstrumentationInitialized = true;\n  // todo: don't hardcode string getting weird ref error in iife when using process.env\n  let schedule: ReturnType<typeof requestAnimationFrame>;\n  let mounted = false;\n\n  const scheduleSetup = () => {\n    if (mounted) {\n      return;\n    }\n    if (schedule) {\n      cancelAnimationFrame(schedule);\n    }\n    schedule = requestAnimationFrame(() => {\n      mounted = true;\n      const host = getCanvasEl();\n      if (host) {\n        document.documentElement.appendChild(host);\n      }\n      setupToolbar();\n    }); // TODO(Alexis): perhaps a better timing\n  };\n\n  const instrumentation = createInstrumentation('react-scan-devtools-0.1.0', {\n    onCommitStart: () => {\n      ReactScanInternals.options.value.onCommitStart?.();\n    },\n    onActive: (() => {\n      let didActivate = false;\n      return () => {\n        if (hasStopped()) return;\n        if (didActivate) return;\n        didActivate = true;\n\n        scheduleSetup();\n        if (!window.__REACT_SCAN_EXTENSION__) {\n          globalThis.__REACT_SCAN__ = {\n            ReactScanInternals,\n          };\n        }\n        startReportInterval();\n        logIntro();\n      };\n    })(),\n    onError: () => {\n      // todo: ingest errors without accidentally collecting data about user\n    },\n    isValidFiber,\n    onRender: (fiber, renders) => {\n      if (isCompositeFiber(fiber)) {\n        Store.interactionListeningForRenders?.(fiber, renders);\n      }\n      const isOverlayPaused =\n        ReactScanInternals.instrumentation?.isPaused.value;\n      const isInspectorInactive =\n        Store.inspectState.value.kind === 'inspect-off' ||\n        Store.inspectState.value.kind === 'uninitialized';\n      const shouldFullyAbort = isOverlayPaused && isInspectorInactive;\n\n      if (shouldFullyAbort) {\n        return;\n      }\n      if (!isOverlayPaused) {\n        outlineFiber(fiber);\n      }\n      if (ReactScanInternals.options.value.log) {\n        // this can be expensive given enough re-renders\n        log(renders);\n      }\n\n      if (Store.inspectState.value.kind === 'focused') {\n        inspectorUpdateSignal.value = Date.now();\n      }\n      if (!isInspectorInactive) {\n        reportRenderToListeners(fiber);\n      }\n\n      ReactScanInternals.options.value.onRender?.(fiber, renders);\n      notifyRenderListeners(fiber, renders);\n    },\n    onCommitFinish: () => {\n      scheduleSetup();\n      ReactScanInternals.options.value.onCommitFinish?.();\n    },\n    onPostCommitFiberRoot() {\n      scheduleSetup();\n    },\n    trackChanges: false,\n  });\n  ReactScanInternals.instrumentation = instrumentation;\n};\n","import { type Signal, signal } from '@preact/signals';\nimport {\n  ClassComponentTag,\n  type Fiber,\n  type FiberRoot,\n  ForwardRefTag,\n  FunctionComponentTag,\n  MemoComponentTag,\n  type MemoizedState,\n  SimpleMemoComponentTag,\n  didFiberCommit,\n  getDisplayName,\n  getFiberId,\n  getMutatedHostFibers,\n  getTimings,\n  getType,\n  hasMemoCache,\n  instrument,\n  traverseContexts,\n  traverseProps,\n  traverseRenderedFibers,\n} from 'bippy';\nimport { isValidElement } from 'preact';\nimport { isEqual } from '~core/utils';\nimport {\n  collectContextChanges,\n  collectPropsChanges,\n  collectStateChanges,\n} from '~web/views/inspector/timeline/utils';\nimport {\n  type Change,\n  type ContextChange,\n  ReactScanInternals,\n  type StateChange,\n} from './index';\n\nexport enum RenderPhase {\n  Mount = 0b001,\n  Update = 0b010,\n  Unmount = 0b100,\n}\n\nexport const RENDER_PHASE_STRING_TO_ENUM = {\n  mount: RenderPhase.Mount,\n  update: RenderPhase.Update,\n  unmount: RenderPhase.Unmount,\n} as const;\n\nexport interface AggregatedChange {\n  type: number;\n  unstable: boolean;\n}\n\nexport interface AggregatedRender {\n  name: string;\n  frame: number | null;\n  phase: number;\n  time: number | null;\n  aggregatedCount: number;\n  forget: boolean;\n  changes: AggregatedChange;\n  unnecessary: boolean | null;\n  didCommit: boolean;\n  fps: number;\n  computedKey: import('./index').OutlineKey | null;\n  computedCurrent: DOMRect | null;\n}\n\nlet fps = 0;\nlet lastTime = performance.now();\nlet frameCount = 0;\nlet initedFps = false;\n\nconst updateFPS = () => {\n  frameCount++;\n  const now = performance.now();\n  if (now - lastTime >= 1000) {\n    fps = frameCount;\n    frameCount = 0;\n    lastTime = now;\n  }\n  requestAnimationFrame(updateFPS);\n};\n\nexport const getFPS = () => {\n  if (!initedFps) {\n    initedFps = true;\n    updateFPS();\n    fps = 60;\n  }\n\n  return fps;\n};\n\nexport const isElementVisible = (el: Element) => {\n  const style = window.getComputedStyle(el);\n  return (\n    style.display !== 'none' &&\n    style.visibility !== 'hidden' &&\n    style.contentVisibility !== 'hidden' &&\n    style.opacity !== '0'\n  );\n};\n\nexport const isValueUnstable = (prevValue: unknown, nextValue: unknown) => {\n  const prevValueString = fastSerialize(prevValue);\n  const nextValueString = fastSerialize(nextValue);\n  return (\n    prevValueString === nextValueString &&\n    unstableTypes.includes(typeof prevValue) &&\n    unstableTypes.includes(typeof nextValue)\n  );\n};\n\nexport const isElementInViewport = (\n  el: Element,\n  rect = el.getBoundingClientRect(),\n) => {\n  const isVisible =\n    rect.bottom > 0 &&\n    rect.right > 0 &&\n    rect.top < window.innerHeight &&\n    rect.left < window.innerWidth;\n\n  return isVisible && rect.width && rect.height;\n};\n\nexport const enum ChangeReason {\n  Props = 0b001,\n  FunctionalState = 0b010,\n  ClassState = 0b011,\n  Context = 0b100,\n}\n\nexport interface AggregatedChange {\n  type: number; // union of AggregatedChangeReason\n  unstable: boolean;\n}\n\nexport interface Render {\n  phase: RenderPhase;\n  componentName: string | null;\n  time: number | null;\n  count: number;\n  forget: boolean;\n  changes: Array<Change>;\n  unnecessary: boolean | null;\n  didCommit: boolean;\n  fps: number;\n}\n\nconst unstableTypes = ['function', 'object'];\n\nconst cache = new WeakMap<object, string>();\n\nexport function fastSerialize(value: unknown, depth = 0): string {\n  if (depth < 0) return '…';\n\n  switch (typeof value) {\n    case 'function':\n      return value.toString();\n    case 'string':\n      return value;\n    case 'number':\n    case 'boolean':\n    case 'undefined':\n      return String(value);\n    case 'object':\n      break;\n    default:\n      return String(value);\n  }\n\n  if (value === null) return 'null';\n\n  if (cache.has(value)) {\n    const cached = cache.get(value);\n    if (cached !== undefined) {\n      return cached;\n    }\n  }\n\n  if (Array.isArray(value)) {\n    const str = value.length ? `[${value.length}]` : '[]';\n    cache.set(value, str);\n    return str;\n  }\n\n  if (isValidElement(value)) {\n    const type = getDisplayName(value.type) ?? '';\n    const propCount = value.props ? Object.keys(value.props).length : 0;\n    const str = `<${type} ${propCount}>`;\n    cache.set(value, str);\n    return str;\n  }\n\n  if (Object.getPrototypeOf(value) === Object.prototype) {\n    const keys = Object.keys(value);\n    const str = keys.length ? `{${keys.length}}` : '{}';\n    cache.set(value, str);\n    return str;\n  }\n\n  const ctor =\n    value && typeof value === 'object' ? value.constructor : undefined;\n  if (ctor && typeof ctor === 'function' && ctor.name) {\n    const str = `${ctor.name}{…}`;\n    cache.set(value, str);\n    return str;\n  }\n\n  const tagString = Object.prototype.toString.call(value).slice(8, -1);\n  const str = `${tagString}{…}`;\n  cache.set(value, str);\n  return str;\n}\n\nexport const getStateChanges = (fiber: Fiber): StateChange[] => {\n  if (!fiber) return [];\n  const changes: StateChange[] = [];\n\n  if (\n    fiber.tag === FunctionComponentTag ||\n    fiber.tag === ForwardRefTag ||\n    fiber.tag === SimpleMemoComponentTag ||\n    fiber.tag === MemoComponentTag\n  ) {\n    let memoizedState: MemoizedState | null = fiber.memoizedState;\n    let prevState: MemoizedState | null | undefined =\n      fiber.alternate?.memoizedState;\n    let index = 0;\n\n    while (memoizedState) {\n      if (memoizedState.queue && memoizedState.memoizedState !== undefined) {\n        const change: StateChange = {\n          type: ChangeReason.FunctionalState,\n          name: index.toString(),\n          value: memoizedState.memoizedState,\n          prevValue: prevState?.memoizedState,\n        };\n        if (!isEqual(change.prevValue, change.value)) {\n          changes.push(change);\n        }\n      }\n      memoizedState = memoizedState.next;\n      prevState = prevState?.next;\n      index++;\n    }\n\n    return changes;\n  }\n\n  if (fiber.tag === ClassComponentTag) {\n    // when we have class component fiber, memoizedState is the component state\n    const change: StateChange = {\n      type: ChangeReason.ClassState,\n      name: 'state',\n      value: fiber.memoizedState,\n      prevValue: fiber.alternate?.memoizedState,\n    };\n    if (!isEqual(change.prevValue, change.value)) {\n      changes.push(change);\n    }\n    return changes;\n  }\n\n  return changes;\n};\ninterface ContextFiber {\n  context: unknown; // refers to Context<T>;\n  memoizedValue: unknown;\n}\n\nlet lastContextId = 0;\nconst contextIdMap = new WeakMap<ContextFiber, number>();\nconst getContextId = (contextFiber: ContextFiber) => {\n  const existing = contextIdMap.get(contextFiber);\n  if (existing) {\n    return existing;\n  }\n  lastContextId++;\n  contextIdMap.set(contextFiber, lastContextId);\n  return lastContextId;\n};\n\nfunction getContextChangesTraversal(\n  this: Array<Change>,\n  nextValue: ContextFiber | null | undefined,\n  prevValue: ContextFiber | null | undefined,\n): void {\n  if (!nextValue || !prevValue) return;\n  // const prevMemoizedValue = prevValue.memoizedValue;\n  const nextMemoizedValue = nextValue.memoizedValue;\n\n  const change: ContextChange = {\n    type: ChangeReason.Context,\n    name:\n      (nextValue.context as { displayName: string | undefined }).displayName ??\n      'Context.Provider',\n    value: nextMemoizedValue,\n    contextType: getContextId(nextValue.context as ContextFiber),\n\n    // unstable: false,\n  };\n  this.push(change);\n\n  // const prevValueString = fastSerialize(prevMemoizedValue);\n  // const nextValueString = fastSerialize(nextMemoizedValue);\n\n  // if (\n  //   unstableTypes.includes(typeof prevMemoizedValue) &&\n  //   unstableTypes.includes(typeof nextMemoizedValue) &&\n  //   prevValueString === nextValueString\n  // ) {\n  //   change.unstable = true;\n  // }\n}\n\nexport const getContextChanges = (fiber: Fiber) => {\n  const changes: Array<ContextChange> = [];\n\n  // Alexis: we use bind functions so that the compiler doesn't produce\n  // any closures\n  traverseContexts(fiber, getContextChangesTraversal.bind(changes));\n\n  return changes;\n};\n\ntype OnRenderHandler = (fiber: Fiber, renders: Array<Render>) => void;\ntype OnCommitStartHandler = () => void;\ntype OnCommitFinishHandler = () => void;\ntype OnErrorHandler = (error: unknown) => void;\ntype IsValidFiberHandler = (fiber: Fiber) => boolean;\ntype OnActiveHandler = () => void;\n\ninterface InstrumentationConfig {\n  onCommitStart: OnCommitStartHandler;\n  isValidFiber: IsValidFiberHandler;\n  onRender: OnRenderHandler;\n  onCommitFinish: OnCommitFinishHandler;\n  onError: OnErrorHandler;\n  onActive?: OnActiveHandler;\n  onPostCommitFiberRoot: () => void;\n  // monitoring does not need to track changes, and it adds overhead to leave it on\n  trackChanges: boolean;\n  // allows monitoring to continue tracking renders even if react scan dev mode is disabled\n  forceAlwaysTrackRenders?: boolean;\n}\n\ninterface InstrumentationInstance {\n  key: string;\n  config: InstrumentationConfig;\n  instrumentation: Instrumentation;\n}\n\ninterface Instrumentation {\n  isPaused: Signal<boolean>;\n  fiberRoots: WeakSet<FiberRoot>;\n}\n\nconst instrumentationInstances = new Map<string, InstrumentationInstance>();\nlet inited = false;\n\nconst getAllInstances = () => Array.from(instrumentationInstances.values());\n\ninterface IsRenderUnnecessaryState {\n  isRequiredChange: boolean;\n}\n\nfunction isRenderUnnecessaryTraversal(\n  this: IsRenderUnnecessaryState,\n  _propsName: string,\n  prevValue: unknown,\n  nextValue: unknown,\n): void {\n  if (\n    !isEqual(prevValue, nextValue) &&\n    !isValueUnstable(prevValue, nextValue)\n  ) {\n    this.isRequiredChange = true;\n  }\n}\n\n// FIXME: calculation is slow\nexport const isRenderUnnecessary = (fiber: Fiber) => {\n  if (!didFiberCommit(fiber)) return true;\n\n  const mutatedHostFibers = getMutatedHostFibers(fiber);\n  for (const mutatedHostFiber of mutatedHostFibers) {\n    const state: IsRenderUnnecessaryState = {\n      isRequiredChange: false,\n    };\n    traverseProps(mutatedHostFiber, isRenderUnnecessaryTraversal.bind(state));\n    if (state.isRequiredChange) return false;\n  }\n  return true;\n};\n\n// // re-implement this in new-outlines\n// const shouldRunUnnecessaryRenderCheck = () => {\n//   // yes, this can be condensed into one conditional, but ifs are easier to reason/build on than long boolean expressions\n//   if (!ReactScanInternals.options.value.trackUnnecessaryRenders) {\n//     return false;\n//   }\n\n//   // only run unnecessaryRenderCheck when monitoring is active in production if the user set dangerouslyForceRunInProduction\n//   if (\n//     getIsProduction() &&\n//     Store.monitor.value &&\n//     ReactScanInternals.options.value.dangerouslyForceRunInProduction &&\n//     ReactScanInternals.options.value.trackUnnecessaryRenders\n//   ) {\n//     return true;\n//   }\n\n//   if (getIsProduction() && Store.monitor.value) {\n//     return false;\n//   }\n\n//   return ReactScanInternals.options.value.trackUnnecessaryRenders;\n// };\n\nconst TRACK_UNNECESSARY_RENDERS = false;\n\nexport interface RenderData {\n  selfTime: number;\n  totalTime: number;\n  renderCount: number;\n  lastRenderTimestamp: number;\n}\n\nexport interface OldRenderData {\n  count: number;\n  time: number;\n  renders: Array<Render>;\n  displayName: string | null;\n  // oxlint-disable-next-line typescript/no-explicit-any\n  type: any;\n  // oxlint-disable-next-line typescript/no-explicit-any\n  changes?: any;\n}\n\nconst RENDER_DEBOUNCE_MS = 16;\n\nexport const renderDataMap = new WeakMap<object, Map<string, RenderData>>();\n\nfunction getFiberIdentifier(fiber: Fiber) {\n  return String(getFiberId(fiber));\n}\n\nexport function getRenderData(fiber: Fiber) {\n  const id = getFiberIdentifier(fiber);\n  const keyMap = renderDataMap.get(getType(fiber) as object);\n\n  if (keyMap) {\n    return keyMap.get(id);\n  }\n\n  return undefined;\n}\n\nexport function setRenderData(fiber: Fiber, value: RenderData) {\n  const type = getType(fiber.type);\n  const id = getFiberIdentifier(fiber);\n  let keyMap = renderDataMap.get(type as object);\n\n  if (!keyMap) {\n    keyMap = new Map();\n    renderDataMap.set(type as object, keyMap);\n  }\n\n  keyMap.set(id, value);\n}\n\nconst trackRender = (\n  fiber: Fiber,\n  fiberSelfTime: number,\n  fiberTotalTime: number,\n  hasChanges: boolean,\n  hasDomMutations: boolean,\n) => {\n  const currentTimestamp = Date.now();\n  const existingData = getRenderData(fiber);\n\n  if (\n    (hasChanges || hasDomMutations) &&\n    (!existingData ||\n      currentTimestamp - (existingData.lastRenderTimestamp || 0) >\n        RENDER_DEBOUNCE_MS)\n  ) {\n    const renderData: RenderData = existingData || {\n      selfTime: 0,\n      totalTime: 0,\n      renderCount: 0,\n      lastRenderTimestamp: currentTimestamp,\n    };\n\n    renderData.renderCount = (renderData.renderCount || 0) + 1;\n    renderData.selfTime = fiberSelfTime || 0;\n    renderData.totalTime = fiberTotalTime || 0;\n    renderData.lastRenderTimestamp = currentTimestamp;\n\n    setRenderData(fiber, { ...renderData });\n  }\n};\n\nexport const createInstrumentation = (\n  instanceKey: string,\n  config: InstrumentationConfig,\n) => {\n  const instrumentation: Instrumentation = {\n    // this will typically be false, but in cases where a user provides showToolbar: true, this will be true\n    isPaused: signal(!ReactScanInternals.options.value.enabled),\n    fiberRoots: new WeakSet<FiberRoot>(),\n  };\n  instrumentationInstances.set(instanceKey, {\n    key: instanceKey,\n    config,\n    instrumentation,\n  });\n  if (!inited) {\n    inited = true;\n\n    instrument({\n      name: 'react-scan',\n      onActive: config.onActive,\n      onCommitFiberRoot(_rendererID, root) {\n        instrumentation.fiberRoots.add(root);\n        // for now we always track everything for notifications, it may be worth it to make this configurable\n        // if (\n        //   ReactScanInternals.instrumentation?.isPaused.value &&\n        //   (Store.inspectState.value.kind === \"inspect-off\" ||\n        //     Store.inspectState.value.kind === \"uninitialized\") &&\n        //   !config.forceAlwaysTrackRenders\n        // ) {\n        //   return;\n        // }\n        const allInstances = getAllInstances();\n        for (const instance of allInstances) {\n          instance.config.onCommitStart();\n        }\n\n        traverseRenderedFibers(\n          root.current,\n          (fiber: Fiber, phase: 'mount' | 'update' | 'unmount') => {\n            const type = getType(fiber.type);\n            if (!type) return null;\n\n            const allInstances = getAllInstances();\n            const validInstancesIndicies: Array<number> = [];\n            for (let i = 0, len = allInstances.length; i < len; i++) {\n              const instance = allInstances[i];\n              if (!instance.config.isValidFiber(fiber)) continue;\n              validInstancesIndicies.push(i);\n            }\n            if (!validInstancesIndicies.length) return null;\n\n            const changes: Array<Change> = [];\n\n            if (allInstances.some((instance) => instance.config.trackChanges)) {\n              const changesProps = collectPropsChanges(fiber).changes;\n              const changesState = collectStateChanges(fiber).changes;\n              const changesContext = collectContextChanges(fiber).changes;\n\n              changes.push.apply(\n                null,\n                changesProps.map(\n                  (change) =>\n                    ({\n                      type: ChangeReason.Props,\n                      name: change.name,\n                      value: change.value,\n                    }) as Change,\n                ),\n              );\n\n              for (const change of changesState) {\n                if (fiber.tag === ClassComponentTag) {\n                  changes.push({\n                    type: ChangeReason.ClassState,\n                    name: change.name.toString(),\n                    value: change.value,\n                  } as Change);\n                } else {\n                  changes.push({\n                    type: ChangeReason.FunctionalState,\n                    name: change.name.toString(),\n                    value: change.value,\n                  } as Change);\n                }\n              }\n\n              changes.push.apply(\n                null,\n                changesContext.map(\n                  (change) =>\n                    ({\n                      type: ChangeReason.Context,\n                      name: change.name,\n                      value: change.value,\n                      contextType: Number(change.contextType),\n                    }) as Change,\n                ),\n              );\n            }\n\n            const { selfTime: fiberSelfTime, totalTime: fiberTotalTime } =\n              getTimings(fiber);\n\n            const fps = getFPS();\n            const render: Render = {\n              phase: RENDER_PHASE_STRING_TO_ENUM[phase],\n              componentName: getDisplayName(type),\n              count: 1,\n              changes,\n              time: fiberSelfTime,\n              forget: hasMemoCache(fiber),\n              // todo: allow this to be toggle-able through toolbar\n              // todo: performance optimization: if the last fiber measure was very off screen, do not run isRenderUnnecessary\n              unnecessary: TRACK_UNNECESSARY_RENDERS\n                ? isRenderUnnecessary(fiber)\n                : null,\n              didCommit: didFiberCommit(fiber),\n              fps,\n            };\n\n            // First, determine if this is a real render we should track\n            const hasChanges = changes.length > 0;\n            const hasDomMutations = getMutatedHostFibers(fiber).length > 0;\n\n            if (phase === 'update') {\n              trackRender(\n                fiber,\n                fiberSelfTime,\n                fiberTotalTime,\n                hasChanges,\n                hasDomMutations,\n              );\n            }\n\n            for (let i = 0, len = validInstancesIndicies.length; i < len; i++) {\n              const index = validInstancesIndicies[i];\n              const instance = allInstances[index];\n              instance.config.onRender(fiber, [render]);\n            }\n          },\n        );\n\n        for (const instance of allInstances) {\n          instance.config.onCommitFinish();\n        }\n      },\n      onPostCommitFiberRoot() {\n        const allInstances = getAllInstances();\n        for (const instance of allInstances) {\n          instance.config.onPostCommitFiberRoot();\n        }\n      },\n    });\n  }\n  return instrumentation;\n};\n","// @ts-nocheck\nimport { type Fiber, getType } from 'bippy';\nimport { ReactScanInternals } from '~core/index';\nimport type { AggregatedChange, AggregatedRender, Render } from './instrumentation';\nimport { IS_CLIENT } from '~web/utils/constants';\n\nexport const aggregateChanges = (\n  changes: Array<Change>,\n  prevAggregatedChange?: AggregatedChange,\n) => {\n  const newChange = {\n    type: prevAggregatedChange?.type ?? 0,\n    unstable: prevAggregatedChange?.unstable ?? false,\n  };\n  for (const change of changes) {\n    newChange.type |= change.type;\n    newChange.unstable = newChange.unstable || (change.unstable ?? false);\n  }\n\n  return newChange;\n};\n\nexport const aggregateRender = (\n  newRender: Render,\n  prevAggregated: AggregatedRender,\n) => {\n  prevAggregated.changes = aggregateChanges(\n    newRender.changes,\n    prevAggregated.changes,\n  );\n  prevAggregated.aggregatedCount += 1;\n  prevAggregated.didCommit = prevAggregated.didCommit || newRender.didCommit;\n  prevAggregated.forget = prevAggregated.forget || newRender.forget;\n  prevAggregated.fps = prevAggregated.fps + newRender.fps;\n  prevAggregated.phase |= newRender.phase;\n  prevAggregated.time = (prevAggregated.time ?? 0) + (newRender.time ?? 0);\n\n  prevAggregated.unnecessary =\n    prevAggregated.unnecessary || newRender.unnecessary;\n};\n\nfunction descending(a: number, b: number): number {\n  return b - a;\n}\n\ninterface ComponentData {\n  name: string;\n  forget: boolean;\n  time: number;\n}\n\nfunction getComponentGroupNames(group: ComponentData[]): string {\n  let result = group[0].name;\n\n  const len = group.length;\n  const max = Math.min(4, len);\n\n  for (let i = 1; i < max; i++) {\n    result += `, ${group[i].name}`;\n  }\n\n  return result;\n}\n\nfunction getComponentGroupTotalTime(group: ComponentData[]): number {\n  let result = group[0].time;\n\n  for (let i = 1, len = group.length; i < len; i++) {\n    result += group[i].time;\n  }\n\n  return result;\n}\n\nfunction componentGroupHasForget(group: ComponentData[]): boolean {\n  for (let i = 0, len = group.length; i < len; i++) {\n    if (group[i].forget) {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport const getLabelText = (\n  groupedAggregatedRenders: Array<AggregatedRender>,\n) => {\n  let labelText = '';\n\n  const componentsByCount = new Map<\n    number,\n    Array<{ name: string; forget: boolean; time: number }>\n  >();\n\n  for (const aggregatedRender of groupedAggregatedRenders) {\n    const { forget, time, aggregatedCount, name } = aggregatedRender;\n    if (!componentsByCount.has(aggregatedCount)) {\n      componentsByCount.set(aggregatedCount, []);\n    }\n    const components = componentsByCount.get(aggregatedCount);\n    if (components) {\n      components.push({ name, forget, time: time ?? 0 });\n    }\n  }\n\n  const sortedCounts = Array.from(componentsByCount.keys()).sort(descending);\n\n  const parts: Array<string> = [];\n  let cumulativeTime = 0;\n  for (const count of sortedCounts) {\n    const componentGroup = componentsByCount.get(count);\n    if (!componentGroup) continue;\n\n    let text = getComponentGroupNames(componentGroup);\n    const totalTime = getComponentGroupTotalTime(componentGroup);\n    const hasForget = componentGroupHasForget(componentGroup);\n\n    cumulativeTime += totalTime;\n\n    if (componentGroup.length > 4) {\n      text += '…';\n    }\n\n    if (count > 1) {\n      text += ` × ${count}`;\n    }\n\n    if (hasForget) {\n      text = `✨${text}`;\n    }\n\n    parts.push(text);\n  }\n\n  labelText = parts.join(', ');\n\n  if (!labelText.length) return null;\n\n  if (labelText.length > 40) {\n    labelText = `${labelText.slice(0, 40)}…`;\n  }\n\n  if (cumulativeTime >= 0.01) {\n    labelText += ` (${Number(cumulativeTime.toFixed(2))}ms)`;\n  }\n\n  return labelText;\n};\n\nexport const updateFiberRenderData = (fiber: Fiber, renders: Array<Render>) => {\n  ReactScanInternals.options.value.onRender?.(fiber, renders);\n  const type = getType(fiber.type) || fiber.type;\n  if (type && (typeof type === 'function' || typeof type === 'object')) {\n    const renderData = (type.renderData || {\n      count: 0,\n      time: 0,\n      renders: [],\n    }) as RenderData;\n    const firstRender = renders[0];\n    renderData.count += firstRender.count;\n    renderData.time += firstRender.time ?? 0;\n    renderData.renders.push(firstRender);\n    type.renderData = renderData;\n  }\n};\n\nexport interface RenderData {\n  count: number;\n  time: number;\n  renders: Array<Render>;\n  displayName: string | null;\n  type: unknown;\n  changes?: Array<RenderChange>;\n}\n\nexport function isEqual(a: unknown, b: unknown): boolean {\n  return a === b || (a !== a && b !== b);\n}\n\nexport const not_globally_unique_generateId = () => {\n  if (!IS_CLIENT) {\n    return '0';\n  }\n\n  // @ts-expect-error\n  if (window.reactScanIdCounter === undefined) {\n    // @ts-expect-error\n    window.reactScanIdCounter = 0;\n  }\n  // @ts-expect-error\n  return `${++window.reactScanIdCounter}`;\n};\n\nexport const playNotificationSound = (audioContext: AudioContext) => {\n  const oscillator = audioContext.createOscillator();\n  const gainNode = audioContext.createGain();\n\n  oscillator.connect(gainNode);\n  gainNode.connect(audioContext.destination);\n\n  const options = {\n    type: 'sine' as OscillatorType,\n    freq: [\n      392,\n      //  523.25,\n      600,\n      //  659.25\n    ],\n    duration: 0.3,\n    gain: 0.12,\n  };\n\n  const frequencies = options.freq;\n  const timePerNote = options.duration / frequencies.length;\n\n  frequencies.forEach((freq, i) => {\n    oscillator.frequency.setValueAtTime(\n      freq,\n      audioContext.currentTime + i * timePerNote,\n    );\n  });\n\n  oscillator.type = options.type;\n  gainNode.gain.setValueAtTime(options.gain, audioContext.currentTime);\n\n  gainNode.gain.setTargetAtTime(\n    0,\n    audioContext.currentTime + options.duration * 0.7,\n    0.05,\n  );\n\n  oscillator.start();\n  oscillator.stop(audioContext.currentTime + options.duration);\n};\n","export const IS_CLIENT = typeof window !== 'undefined';\n","import {\n  ClassComponentTag,\n  type ContextDependency,\n  type Fiber,\n  ForwardRefTag,\n  FunctionComponentTag,\n  MemoComponentTag,\n  type MemoizedState,\n  SimpleMemoComponentTag,\n} from 'bippy';\nimport { isEqual } from '~core/utils';\nimport { getChangedPropsDetailed, isPromise } from '../utils';\n\ninterface ChangeTrackingInfo {\n  count: number;\n  currentValue: unknown;\n  previousValue: unknown;\n  lastUpdated: number;\n}\n\ntype ChangeKey = string | number;\n\nconst propsTracker = new Map<string, ChangeTrackingInfo>();\nconst stateTracker = new Map<ChangeKey, ChangeTrackingInfo>();\nconst contextTracker = new Map<string, ChangeTrackingInfo>();\nlet lastComponentType: unknown = null;\n\nconst STATE_NAME_REGEX = /\\[(?<name>\\w+),\\s*set\\w+\\]/g;\nconst PROPS_ORDER_REGEX = /\\(\\s*{\\s*(?<props>[^}]+)\\s*}\\s*\\)/;\n\nexport const getStateNames = (fiber: Fiber): Array<string> => {\n  const componentSource = fiber.type?.toString?.() || '';\n  return componentSource\n    ? Array.from(\n        componentSource.matchAll(STATE_NAME_REGEX),\n        (m: RegExpMatchArray) => m.groups?.name ?? '',\n      )\n    : [];\n};\n\nexport const resetTracking = () => {\n  propsTracker.clear();\n  stateTracker.clear();\n  contextTracker.clear();\n  lastComponentType = null;\n};\n\nexport const isInitialComponentUpdate = (fiber: Fiber): boolean => {\n  const isNewComponent = fiber.type !== lastComponentType;\n  lastComponentType = fiber.type;\n  return isNewComponent;\n};\n\nexport const trackChange = (\n  tracker: Map<ChangeKey, ChangeTrackingInfo>,\n  key: ChangeKey,\n  currentValue: unknown,\n  previousValue: unknown,\n): { hasChanged: boolean; count: number } => {\n  const existing = tracker.get(key);\n  const isInitialValue = tracker === propsTracker || tracker === contextTracker;\n  const hasChanged = !isEqual(currentValue, previousValue);\n\n  if (!existing) {\n    // For props and context, start with count 1 if there's a change\n    tracker.set(key, {\n      count: hasChanged && isInitialValue ? 1 : 0,\n      currentValue,\n      previousValue,\n      lastUpdated: Date.now(),\n    });\n\n    return {\n      hasChanged,\n      count: hasChanged && isInitialValue ? 1 : isInitialValue ? 0 : 1,\n    };\n  }\n\n  if (!isEqual(existing.currentValue, currentValue)) {\n    const newCount = existing.count + 1;\n    tracker.set(key, {\n      count: newCount,\n      currentValue,\n      previousValue: existing.currentValue,\n      lastUpdated: Date.now(),\n    });\n    return { hasChanged: true, count: newCount };\n  }\n\n  return { hasChanged: false, count: existing.count };\n};\n\nexport { propsTracker, stateTracker, contextTracker };\n\nexport interface SectionData {\n  current: Array<{ name: string | number; value: unknown }>;\n  changes: Set<string | number>;\n  changesCounts: Map<string | number, number>;\n}\n\nexport interface InspectorData {\n  fiberProps: SectionData;\n  fiberState: SectionData;\n  fiberContext: SectionData;\n}\n\nexport const getStateFromFiber = (\n  fiber: Fiber,\n): Record<string | number, unknown> => {\n  if (!fiber) return {};\n\n  if (\n    fiber.tag === FunctionComponentTag ||\n    fiber.tag === ForwardRefTag ||\n    fiber.tag === SimpleMemoComponentTag ||\n    fiber.tag === MemoComponentTag\n  ) {\n    let memoizedState: MemoizedState | null = fiber.memoizedState;\n    const state: Record<number, unknown> = {};\n    let index = 0;\n\n    while (memoizedState) {\n      if (memoizedState.queue && memoizedState.memoizedState !== undefined) {\n        state[index] = memoizedState.memoizedState;\n      }\n      memoizedState = memoizedState.next;\n      index++;\n    }\n\n    return state;\n  }\n\n  if (fiber.tag === ClassComponentTag) {\n    return fiber.memoizedState || {};\n  }\n\n  return {};\n};\n\n/**\n * Used to preserve the order of the fiber's props as represented in source code\n */\nexport const getPropsOrder = (fiber: Fiber): Array<string> => {\n  const componentSource = fiber.type?.toString?.() || '';\n  const match = componentSource.match(PROPS_ORDER_REGEX);\n  if (!match?.groups?.props) return [];\n\n  return match.groups.props\n    .split(',')\n    .map((prop: string) => prop.trim().split(':')[0].split('=')[0].trim())\n    .filter(Boolean);\n};\n\nexport interface InspectorDataResult {\n  data: InspectorData;\n  shouldUpdate: boolean;\n}\n\ninterface BaseChange {\n  name: string | number;\n  value: unknown;\n  prevValue: unknown;\n}\n\ninterface PropChange extends BaseChange {\n  name: string;\n}\n\ninterface StateChange extends BaseChange {\n  name: string | number;\n}\n\ninterface ContextChange extends BaseChange {\n  name: string;\n  contextType: unknown;\n}\n\ninterface CollectorResult<T extends BaseChange = BaseChange> {\n  current: Record<string | number, unknown>;\n  prev: Record<string | number, unknown>;\n  changes: Array<T>;\n}\n\nexport const collectPropsChanges = (\n  fiber: Fiber,\n): CollectorResult<PropChange> => {\n  const currentProps = fiber.memoizedProps || {};\n  const prevProps = fiber.alternate?.memoizedProps || {};\n\n  const current: Record<string, unknown> = {};\n  const prev: Record<string, unknown> = {};\n\n  const allProps = Object.keys(currentProps);\n  for (const key of allProps) {\n    if (key in currentProps) {\n      current[key] = currentProps[key];\n      prev[key] = prevProps[key];\n    }\n  }\n\n  const changes = getChangedPropsDetailed(fiber).map((change) => ({\n    name: change.name,\n    value: change.value,\n    prevValue: change.prevValue,\n  }));\n\n  return { current, prev, changes };\n};\n\nexport const collectStateChanges = (\n  fiber: Fiber,\n): CollectorResult<StateChange> => {\n  const current = getStateFromFiber(fiber);\n  const prev = fiber.alternate ? getStateFromFiber(fiber.alternate) : {};\n  const changes: Array<StateChange> = [];\n\n  for (const [index, value] of Object.entries(current)) {\n    const stateKey = fiber.tag === ClassComponentTag ? index : Number(index);\n    if (fiber.alternate && !isEqual(prev[index], value)) {\n      changes.push({\n        name: stateKey,\n        value,\n        prevValue: prev[index],\n      });\n    }\n  }\n\n  return { current, prev, changes };\n};\n\nexport const collectContextChanges = (\n  fiber: Fiber,\n): CollectorResult<ContextChange> => {\n  const currentContexts = getAllFiberContexts(fiber);\n  const prevContexts = fiber.alternate\n    ? getAllFiberContexts(fiber.alternate)\n    : new Map();\n\n  const current: Record<string, unknown> = {};\n  const prev: Record<string, unknown> = {};\n  const changes: Array<ContextChange> = [];\n\n  const seenContexts = new Set<unknown>();\n  for (const [contextType, ctx] of currentContexts) {\n    const name = ctx.displayName;\n    const contextKey = contextType;\n\n    if (seenContexts.has(contextKey)) continue;\n    seenContexts.add(contextKey);\n\n    current[name] = ctx.value;\n\n    const prevCtx = prevContexts.get(contextType);\n    if (prevCtx) {\n      prev[name] = prevCtx.value;\n      if (!isEqual(prevCtx.value, ctx.value)) {\n        changes.push({\n          name,\n          value: ctx.value,\n          prevValue: prevCtx.value,\n          contextType,\n        });\n      }\n    }\n  }\n\n  return { current, prev, changes };\n};\n\nexport const collectInspectorData = (fiber: Fiber): InspectorDataResult => {\n  const emptySection = (): SectionData => ({\n    current: [],\n    changes: new Set<string | number>(),\n    changesCounts: new Map<string | number, number>(),\n  });\n\n  if (!fiber) {\n    return {\n      data: {\n        fiberProps: emptySection(),\n        fiberState: emptySection(),\n        fiberContext: emptySection(),\n      },\n      shouldUpdate: false,\n    };\n  }\n\n  let hasNewChanges = false;\n  const isInitialUpdate = isInitialComponentUpdate(fiber);\n\n  const propsData = emptySection();\n  if (fiber.memoizedProps) {\n    const { current, changes } = collectPropsChanges(fiber);\n\n    for (const [key, value] of Object.entries(current)) {\n      propsData.current.push({\n        name: key,\n        value: isPromise(value)\n          ? { type: 'promise', displayValue: 'Promise' }\n          : value,\n      });\n    }\n\n    for (const change of changes) {\n      const { hasChanged, count } = trackChange(\n        propsTracker,\n        change.name,\n        change.value,\n        change.prevValue,\n      );\n\n      if (hasChanged) {\n        hasNewChanges = true;\n        propsData.changes.add(change.name);\n        propsData.changesCounts.set(change.name, count);\n      }\n    }\n  }\n\n  const stateData = emptySection();\n  const { current: stateCurrent, changes: stateChanges } =\n    collectStateChanges(fiber);\n\n  for (const [index, value] of Object.entries(stateCurrent)) {\n    const stateKey = fiber.tag === ClassComponentTag ? index : Number(index);\n    stateData.current.push({ name: stateKey, value });\n  }\n\n  for (const change of stateChanges) {\n    const { hasChanged, count } = trackChange(\n      stateTracker,\n      change.name,\n      change.value,\n      change.prevValue,\n    );\n\n    if (hasChanged) {\n      hasNewChanges = true;\n      stateData.changes.add(change.name);\n      stateData.changesCounts.set(change.name, count);\n    }\n  }\n\n  const contextData = emptySection();\n  const { current: contextCurrent, changes: contextChanges } =\n    collectContextChanges(fiber);\n\n  for (const [name, value] of Object.entries(contextCurrent)) {\n    contextData.current.push({ name, value });\n  }\n\n  if (!isInitialUpdate) {\n    for (const change of contextChanges) {\n      const { hasChanged, count } = trackChange(\n        contextTracker,\n        change.name,\n        change.value,\n        change.prevValue,\n      );\n\n      if (hasChanged) {\n        hasNewChanges = true;\n        contextData.changes.add(change.name);\n        contextData.changesCounts.set(change.name, count);\n      }\n    }\n  }\n\n  if (!hasNewChanges && !isInitialUpdate) {\n    propsData.changes.clear();\n    stateData.changes.clear();\n    contextData.changes.clear();\n  }\n\n  return {\n    data: {\n      fiberProps: propsData,\n      fiberState: stateData,\n      fiberContext: contextData,\n    },\n    shouldUpdate: hasNewChanges || isInitialUpdate,\n  };\n};\n\ninterface ContextInfo {\n  value: unknown;\n  displayName: string;\n  contextType: unknown;\n}\n// hm we potentially want to revalidate this if a fiber has new context's, i'm not sure how we can do that reactively\n// i suppose we can do one traversal on render (or during the existing traversal) that checks if any new context providers were mounted\n// and when that happens we revalidate this cache\n\n// i suppose a case this breaks is if a fiber changes ancestors through a key but doesn't remount\n// then it would have new parents... and that new parent may have new context\n// may be a fine trade off\n// the motivation is this fiber traversal on every rendering fiber is extremely expensive\nconst fiberContextsCache = new WeakMap<Fiber, Map<unknown, ContextInfo>>();\n\nexport const getAllFiberContexts = (\n  fiber: Fiber,\n): Map<unknown, ContextInfo> => {\n  if (!fiber) {\n    return new Map<unknown, ContextInfo>();\n  }\n\n  // todo validate this works\n\n  const cachedContexts = fiberContextsCache.get(fiber);\n  if (cachedContexts) {\n    return cachedContexts;\n  }\n\n  const contexts = new Map<unknown, ContextInfo>();\n  let currentFiber: Fiber | null = fiber;\n\n  while (currentFiber) {\n    const dependencies = currentFiber.dependencies;\n\n    if (dependencies?.firstContext) {\n      let contextItem: ContextDependency<unknown> | null =\n        dependencies.firstContext;\n\n      while (contextItem) {\n        const memoizedValue = contextItem.memoizedValue;\n        const displayName = contextItem.context?.displayName;\n\n        if (!contexts.has(memoizedValue)) {\n          contexts.set(contextItem.context, {\n            value: memoizedValue,\n            displayName: displayName ?? 'UnnamedContext',\n            contextType: null,\n          });\n        }\n\n        if (contextItem === contextItem.next) {\n          break;\n        }\n\n        contextItem = contextItem.next;\n      }\n    }\n\n    currentFiber = currentFiber.return;\n  }\n\n  // Cache the result for this fiber\n  fiberContextsCache.set(fiber, contexts);\n\n  return contexts;\n};\n\nexport const collectInspectorDataWithoutCounts = (fiber: Fiber) => {\n  const emptySection = (): SectionData => ({\n    current: [],\n    changes: new Set<string | number>(),\n    changesCounts: new Map<string | number, number>(),\n  });\n\n  if (!fiber) {\n    return {\n      fiberProps: emptySection(),\n      fiberState: emptySection(),\n      fiberContext: emptySection(),\n    };\n  }\n\n  // let hasNewChanges = false;\n\n  const propsData = emptySection();\n  if (fiber.memoizedProps) {\n    const { current, changes } = collectPropsChanges(fiber);\n\n    for (const [key, value] of Object.entries(current)) {\n      propsData.current.push({\n        name: key,\n        value: isPromise(value)\n          ? { type: 'promise', displayValue: 'Promise' }\n          : value,\n      });\n    }\n\n    for (const change of changes) {\n      // hasNewChanges = true;\n      propsData.changes.add(change.name);\n      propsData.changesCounts.set(change.name, 1);\n    }\n  }\n\n  const stateData = emptySection();\n  if (fiber.memoizedState) {\n    const { current, changes } = collectStateChanges(fiber);\n\n    for (const [key, value] of Object.entries(current)) {\n      stateData.current.push({\n        name: key,\n        value: isPromise(value)\n          ? { type: 'promise', displayValue: 'Promise' }\n          : value,\n      });\n    }\n\n    for (const change of changes) {\n      // hasNewChanges = true;\n      stateData.changes.add(change.name);\n      stateData.changesCounts.set(change.name, 1);\n    }\n  }\n\n  const contextData = emptySection();\n  const { current, changes } = collectContextChanges(fiber);\n\n  for (const [key, value] of Object.entries(current)) {\n    contextData.current.push({\n      name: key,\n      value: isPromise(value)\n        ? { type: 'promise', displayValue: 'Promise' }\n        : value,\n    });\n  }\n\n  for (const change of changes) {\n    // hasNewChanges = true;\n    contextData.changes.add(change.name);\n    contextData.changesCounts.set(change.name, 1);\n  }\n  // todo: is isInitialUpdate correct? Is this necessary:\n  // if (!hasNewChanges && !isInitialUpdate) {\n  //   propsData.changes.clear();\n  //   stateData.changes.clear();\n  //   contextData.changes.clear();\n  // }\n\n  return {\n    // data: {\n    fiberProps: propsData,\n    fiberState: stateData,\n    fiberContext: contextData,\n    // },\n  };\n};\n","import {\n  type Fiber,\n  FunctionComponentTag,\n  type MemoizedState,\n  getDisplayName,\n  getTimings,\n  isCompositeFiber,\n  isHostFiber,\n  traverseFiber,\n} from 'bippy';\nimport { type PropsChange, ReactScanInternals } from '~core/index';\nimport { ChangeReason } from '~core/instrumentation';\nimport { isEqual } from '~core/utils';\nimport { globalInspectorState } from '.';\nimport type { ExtendedReactRenderer } from '../../../types';\nimport { TIMELINE_MAX_UPDATES } from './states';\nimport type { MinimalFiberInfo } from './states';\nimport { getAllFiberContexts, getStateNames } from './timeline/utils';\n\ninterface StateItem {\n  name: string;\n  value: unknown;\n}\n\n// todo, change this to currently focused fiber\nexport type States =\n  | {\n      kind: 'inspecting';\n      hoveredDomElement: Element | null;\n    }\n  | {\n      kind: 'inspect-off';\n    }\n  | {\n      kind: 'focused';\n      focusedDomElement: Element;\n      fiber: Fiber;\n    }\n  | {\n      kind: 'uninitialized';\n    };\n\ninterface ReactRootContainer {\n  _reactRootContainer?: {\n    _internalRoot?: {\n      current?: {\n        child: Fiber;\n      };\n    };\n  };\n}\n\ninterface ReactInternalProps {\n  [key: string]: Fiber;\n}\n\nexport const getFiberFromElement = (element: Element): Fiber | null => {\n  if ('__REACT_DEVTOOLS_GLOBAL_HOOK__' in window) {\n    const hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n    if (!hook?.renderers) return null;\n\n    for (const [, renderer] of Array.from(hook.renderers)) {\n      try {\n        const fiber = renderer.findFiberByHostInstance?.(element);\n        if (fiber) return fiber;\n      } catch {\n        // If React is mid-render, references to previous nodes may disappear\n      }\n    }\n  }\n\n  if ('_reactRootContainer' in element) {\n    const elementWithRoot = element as unknown as ReactRootContainer;\n    const rootContainer = elementWithRoot._reactRootContainer;\n    return rootContainer?._internalRoot?.current?.child ?? null;\n  }\n\n  for (const key in element) {\n    if (\n      key.startsWith('__reactInternalInstance$') ||\n      key.startsWith('__reactFiber')\n    ) {\n      const elementWithFiber = element as unknown as ReactInternalProps;\n      return elementWithFiber[key];\n    }\n  }\n  return null;\n};\n\nexport const getFirstStateNode = (fiber: Fiber): Element | null => {\n  let current: Fiber | null = fiber;\n  while (current) {\n    if (current.stateNode instanceof Element) {\n      return current.stateNode;\n    }\n\n    if (!current.child) {\n      break;\n    }\n    current = current.child;\n  }\n\n  while (current) {\n    if (current.stateNode instanceof Element) {\n      return current.stateNode;\n    }\n\n    if (!current.return) {\n      break;\n    }\n    current = current.return;\n  }\n  return null;\n};\n\nexport const getNearestFiberFromElement = (\n  element: Element | null,\n): Fiber | null => {\n  if (!element) return null;\n\n  try {\n    const fiber = getFiberFromElement(element);\n    if (!fiber) return null;\n\n    const res = getParentCompositeFiber(fiber);\n    return res ? res[0] : null;\n  } catch {\n    return null;\n  }\n};\n\nexport const getParentCompositeFiber = (\n  fiber: Fiber,\n): readonly [Fiber, Fiber | null] | null => {\n  let current: Fiber | null = fiber;\n  let prevHost: Fiber | null = null;\n\n  while (current) {\n    if (isCompositeFiber(current)) return [current, prevHost] as const;\n    if (isHostFiber(current) && !prevHost) prevHost = current;\n    current = current.return;\n  }\n\n  return null;\n};\n\n\nconst isFiberInTree = (fiber: Fiber, root: Fiber): boolean => {\n  {\n    // const root= fiberRootCache.get(fiber) || (fiber.alternate && fiberRootCache.get(fiber.alternate) )\n    // if (root){\n    //   return root\n    // }\n    const res = !!traverseFiber(root, (searchFiber) => searchFiber === fiber);\n\n    return res;\n  }\n};\n\nexport const isCurrentTree = (fiber: Fiber) => {\n  let curr: Fiber | null = fiber;\n  let rootFiber: Fiber | null = null;\n\n  while (curr) {\n    // todo: make sure removing null check doesn't break\n    // todo: document that fiber stores root in stateNode\n    if (!curr.stateNode) {\n      curr = curr.return;\n      continue;\n    }\n    // if the app never rendered then fiber roots will always return false, but thats fine since we don't care which\n    // fiber we read from when there never has been a re-render\n    // todo: document that better\n    if (ReactScanInternals.instrumentation?.fiberRoots.has(curr.stateNode)) {\n      rootFiber = curr;\n\n      break;\n    }\n\n    curr = curr.return;\n  }\n\n  if (!rootFiber) {\n    return false;\n  }\n\n  const fiberRoot = rootFiber.stateNode;\n  const currentRootFiber = fiberRoot.current;\n\n  return isFiberInTree(fiber, currentRootFiber);\n};\n\nexport const getAssociatedFiberRect = async (element: Element) => {\n  const associatedFiber = getNearestFiberFromElement(element);\n\n  if (!associatedFiber) return null;\n  const stateNode = getFirstStateNode(associatedFiber);\n  if (!stateNode) return null;\n\n  const rect = await new Promise<DOMRect | null>((resolve) => {\n    const observer = new IntersectionObserver((entries) => {\n      observer.disconnect();\n      resolve(entries[0]?.boundingClientRect ?? null);\n    });\n    observer.observe(stateNode);\n  });\n  return rect;\n};\n\n// todo-before-stable(rob): refactor these\nexport const getCompositeComponentFromElement = (element: Element) => {\n  const associatedFiber = getNearestFiberFromElement(element);\n\n  if (!associatedFiber) return {};\n\n  const stateNode = getFirstStateNode(associatedFiber);\n  if (!stateNode) return {};\n  const parentCompositeFiberInfo = getParentCompositeFiber(associatedFiber);\n  if (!parentCompositeFiberInfo) {\n    return {};\n  }\n  const [parentCompositeFiber] = parentCompositeFiberInfo;\n\n  return {\n    parentCompositeFiber,\n  };\n};\n\nexport const getCompositeFiberFromElement = (\n  element: Element,\n  knownFiber?: Fiber,\n) => {\n  if (!element.isConnected) return {};\n\n  let fiber = knownFiber ?? getNearestFiberFromElement(element);\n  if (!fiber) return {};\n\n  // Find root once and cache it\n  let curr: Fiber | null = fiber;\n  let rootFiber: Fiber | null = null;\n  let currentRootFiber: Fiber | null = null;\n\n  while (curr) {\n    if (!curr.stateNode) {\n      curr = curr.return;\n      continue;\n    }\n    if (ReactScanInternals.instrumentation?.fiberRoots.has(curr.stateNode)) {\n      rootFiber = curr;\n      currentRootFiber = curr.stateNode.current;\n      break;\n    }\n    curr = curr.return;\n  }\n\n  if (!rootFiber || !currentRootFiber) return {};\n\n  // Get the current associated fiber using cached root\n  fiber = isFiberInTree(fiber, currentRootFiber)\n    ? fiber\n    : (fiber.alternate ?? fiber);\n  if (!fiber) return {};\n\n  if (!getFirstStateNode(fiber)) return {};\n\n  // Get parent composite fiber\n  const parentCompositeFiber = getParentCompositeFiber(fiber)?.[0];\n  if (!parentCompositeFiber) return {};\n\n  // Use cached root to check parent fiber\n  return {\n    parentCompositeFiber: isFiberInTree(parentCompositeFiber, currentRootFiber)\n      ? parentCompositeFiber\n      : (parentCompositeFiber.alternate ?? parentCompositeFiber),\n  };\n};\n\nexport const getChangedPropsDetailed = (fiber: Fiber): Array<PropsChange> => {\n  const currentProps = fiber.memoizedProps ?? {};\n  const previousProps = fiber.alternate?.memoizedProps ?? {};\n  const changes: Array<PropsChange> = [];\n\n  for (const key in currentProps) {\n    if (key === 'children') continue;\n\n    const currentValue = currentProps[key];\n    const prevValue = previousProps[key];\n\n    if (!isEqual(currentValue, prevValue)) {\n      changes.push({\n        name: key,\n        value: currentValue,\n        prevValue,\n        type: ChangeReason.Props,\n      });\n    }\n  }\n\n  return changes;\n};\n\nexport interface OverrideMethods {\n  overrideProps:\n    | ((fiber: Fiber, path: string[], value: unknown) => void)\n    | null;\n  overrideHookState:\n    | ((fiber: Fiber, id: string, path: string[], value: unknown) => void)\n    | null;\n  overrideContext:\n    | ((fiber: Fiber, contextType: unknown, value: unknown) => void)\n    | null;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n  return value !== null && typeof value === 'object';\n};\n\nexport const getOverrideMethods = (): OverrideMethods => {\n  let overrideProps: OverrideMethods['overrideProps'] = null;\n  let overrideHookState: OverrideMethods['overrideHookState'] = null;\n  let overrideContext: OverrideMethods['overrideContext'] = null;\n\n  if ('__REACT_DEVTOOLS_GLOBAL_HOOK__' in window) {\n    const hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n    if (!hook?.renderers) {\n      return {\n        overrideProps: null,\n        overrideHookState: null,\n        overrideContext: null,\n      };\n    }\n\n    for (const [, renderer] of Array.from(hook.renderers)) {\n      try {\n        const devToolsRenderer = renderer as ExtendedReactRenderer;\n\n        if (overrideHookState) {\n          const prevOverrideHookState = overrideHookState;\n          overrideHookState = (\n            fiber: Fiber,\n            id: string,\n            path: string[],\n            value: unknown,\n          ) => {\n            // Find the hook\n            let current = fiber.memoizedState;\n            for (let i = 0; i < Number(id); i++) {\n              if (!current?.next) break;\n              current = current.next;\n            }\n\n            if (current?.queue) {\n              // Update through React's queue mechanism\n              const queue = current.queue;\n              if (isRecord(queue) && 'dispatch' in queue) {\n                const dispatch = queue.dispatch as (value: unknown) => void;\n                dispatch(value);\n                return;\n              }\n            }\n\n            // Chain updates through all renderers to ensure consistency across different React renderers\n            // (e.g., React DOM + React Native Web in the same app)\n            prevOverrideHookState(fiber, id, path, value);\n            devToolsRenderer.overrideHookState?.(fiber, id, path, value);\n          };\n        } else if (devToolsRenderer.overrideHookState) {\n          overrideHookState = devToolsRenderer.overrideHookState;\n        }\n\n        if (overrideProps) {\n          const prevOverrideProps = overrideProps;\n          overrideProps = (\n            fiber: Fiber,\n            path: Array<string>,\n            value: unknown,\n          ) => {\n            // Chain updates through all renderers to maintain consistency\n            prevOverrideProps(fiber, path, value);\n            devToolsRenderer.overrideProps?.(fiber, path, value);\n          };\n        } else if (devToolsRenderer.overrideProps) {\n          overrideProps = devToolsRenderer.overrideProps;\n        }\n\n        // For context, we don't need the chaining pattern since we're using overrideProps internally\n        // to update the context provider's value prop, which already handles the chaining\n        overrideContext = (\n          fiber: Fiber,\n          contextType: unknown,\n          value: unknown,\n        ) => {\n          // Find the provider fiber for this context\n          let current: Fiber | null = fiber;\n          while (current) {\n            const type = current.type as { Provider?: unknown };\n            if (type === contextType || type?.Provider === contextType) {\n              // Found the provider, update both current and alternate fibers\n              if (overrideProps) {\n                overrideProps(current, ['value'], value);\n                if (current.alternate) {\n                  overrideProps(current.alternate, ['value'], value);\n                }\n              }\n              break;\n            }\n            current = current.return;\n          }\n        };\n      } catch {\n        /**/\n      }\n    }\n  }\n\n  return { overrideProps, overrideHookState, overrideContext };\n};\n\nexport const nonVisualTags = new Set([\n  'HTML',\n  'HEAD',\n  'META',\n  'TITLE',\n  'BASE',\n  'SCRIPT',\n  'SCRIPT',\n  'STYLE',\n  'LINK',\n  'NOSCRIPT',\n  'SOURCE',\n  'TRACK',\n  'EMBED',\n  'OBJECT',\n  'PARAM',\n  'TEMPLATE',\n  'PORTAL',\n  'SLOT',\n  'AREA',\n  'XML',\n  'DOCTYPE',\n  'COMMENT',\n]);\n\nexport const findComponentDOMNode = (\n  fiber: Fiber,\n  excludeNonVisualTags = true,\n): HTMLElement | null => {\n  if (fiber.stateNode && 'nodeType' in fiber.stateNode) {\n    const element = fiber.stateNode as HTMLElement;\n    if (\n      excludeNonVisualTags &&\n      element.tagName &&\n      nonVisualTags.has(element.tagName.toLowerCase())\n    ) {\n      return null;\n    }\n    return element;\n  }\n\n  let child = fiber.child;\n  while (child) {\n    const result = findComponentDOMNode(child, excludeNonVisualTags);\n    if (result) return result;\n    child = child.sibling;\n  }\n\n  return null;\n};\n\nexport interface InspectableElement {\n  element: HTMLElement;\n  depth: number;\n  name: string;\n  fiber: Fiber;\n}\n\nexport const getInspectableElements = (\n  root: HTMLElement = document.body,\n): Array<InspectableElement> => {\n  const result: Array<InspectableElement> = [];\n\n  const findInspectableFiber = (\n    element: HTMLElement | null,\n  ): HTMLElement | null => {\n    if (!element) return null;\n\n    const { parentCompositeFiber } = getCompositeComponentFromElement(element);\n    if (!parentCompositeFiber) return null;\n\n    const componentRoot = findComponentDOMNode(parentCompositeFiber);\n    return componentRoot === element ? element : null;\n  };\n\n  const traverse = (element: HTMLElement, depth = 0) => {\n    const inspectable = findInspectableFiber(element);\n    if (inspectable) {\n      const { parentCompositeFiber } =\n        getCompositeComponentFromElement(inspectable);\n\n      if (!parentCompositeFiber) return;\n\n      result.push({\n        element: inspectable,\n        depth,\n        name: getDisplayName(parentCompositeFiber.type) ?? 'Unknown',\n        fiber: parentCompositeFiber,\n      });\n    }\n\n    // Traverse children first (depth-first)\n    for (const child of Array.from(element.children)) {\n      traverse(child as HTMLElement, inspectable ? depth + 1 : depth);\n    }\n  };\n\n  traverse(root);\n  return result;\n};\n\nconst fiberMap = new WeakMap<HTMLElement, Fiber>();\n\nexport const getInspectableAncestors = (\n  element: HTMLElement,\n): Array<InspectableElement> => {\n  const result: Array<InspectableElement> = [];\n\n  const findInspectableFiber = (\n    element: HTMLElement | null,\n  ): HTMLElement | null => {\n    if (!element) return null;\n    const { parentCompositeFiber } = getCompositeComponentFromElement(element);\n    if (!parentCompositeFiber) return null;\n\n    const componentRoot = findComponentDOMNode(parentCompositeFiber);\n    if (componentRoot === element) {\n      // Store the fiber reference in WeakMap\n      fiberMap.set(element, parentCompositeFiber);\n      return element;\n    }\n    return null;\n  };\n\n  let current: HTMLElement | null = element;\n  while (current && current !== document.body) {\n    const inspectable = findInspectableFiber(current);\n    if (inspectable) {\n      // Get fiber from WeakMap\n      const fiber = fiberMap.get(inspectable);\n      if (fiber) {\n        result.unshift({\n          element: inspectable,\n          depth: 0,\n          name: getDisplayName(fiber.type) ?? 'Unknown',\n          fiber,\n        });\n      }\n    }\n    current = current.parentElement;\n  }\n\n  return result;\n};\n\ntype DiffResult = {\n  type: 'primitive' | 'reference' | 'object';\n  changes: Array<{\n    path: string[];\n    prevValue: unknown;\n    currentValue: unknown;\n    sameFunction?: boolean;\n  }>;\n  hasDeepChanges: boolean;\n};\n\ntype DiffChange = {\n  path: string[];\n  prevValue: unknown;\n  currentValue: unknown;\n  sameFunction?: boolean;\n};\n\ntype InspectableValue =\n  | Record<string, unknown>\n  | Array<unknown>\n  | Map<unknown, unknown>\n  | Set<unknown>\n  | ArrayBuffer\n  | DataView\n  | Int8Array\n  | Uint8Array\n  | Uint8ClampedArray\n  | Int16Array\n  | Uint16Array\n  | Int32Array\n  | Uint32Array\n  | Float32Array\n  | Float64Array\n  | BigInt64Array\n  | BigUint64Array;\n\nexport type AggregatedChanges = {\n  count: number;\n  // unstable: boolean;\n  currentValue: unknown;\n  previousValue: unknown;\n  // displayName?:string\n  name: string;\n};\n\nexport const isExpandable = (value: unknown): value is InspectableValue => {\n  if (value === null || typeof value !== 'object' || isPromise(value)) {\n    return false;\n  }\n\n  if (value instanceof ArrayBuffer) {\n    return true;\n  }\n\n  if (value instanceof DataView) {\n    return true;\n  }\n\n  if (ArrayBuffer.isView(value)) {\n    return true;\n  }\n\n  if (value instanceof Map || value instanceof Set) {\n    return value.size > 0;\n  }\n\n  if (Array.isArray(value)) {\n    return value.length > 0;\n  }\n\n  return Object.keys(value).length > 0;\n};\n\nexport const isEditableValue = (\n  value: unknown,\n  parentPath?: string,\n): boolean => {\n  if (value == null) return true;\n\n  if (isPromise(value)) return false;\n\n  if (typeof value === 'function') {\n    return false;\n  }\n\n  if (parentPath) {\n    const parts = parentPath.split('.');\n    let currentPath = '';\n    for (const part of parts) {\n      currentPath = currentPath ? `${currentPath}.${part}` : part;\n      const obj = globalInspectorState.lastRendered.get(currentPath);\n      if (\n        obj instanceof DataView ||\n        obj instanceof ArrayBuffer ||\n        ArrayBuffer.isView(obj)\n      ) {\n        return false;\n      }\n    }\n  }\n\n  switch (value.constructor) {\n    case Date:\n    case RegExp:\n    case Error:\n      return true;\n    default:\n      switch (typeof value) {\n        case 'string':\n        case 'number':\n        case 'boolean':\n        case 'bigint':\n          return true;\n        default:\n          return false;\n      }\n  }\n};\n\nexport const getPath = (\n  componentName: string,\n  section: string,\n  parentPath: string,\n  key: string,\n): string => {\n  if (parentPath) {\n    return `${componentName}.${parentPath}.${key}`;\n  }\n\n  if (section === 'context' && !key.startsWith('context.')) {\n    return `${componentName}.${section}.context.${key}`;\n  }\n\n  return `${componentName}.${section}.${key}`;\n};\n\nexport const sanitizeString = (value: string): string => {\n  return value\n    .replace(/[<>]/g, '')\n    .replace(/javascript:/gi, '')\n    .replace(/data:/gi, '')\n    .replace(/on\\w+=/gi, '')\n    .slice(0, 50000);\n};\n\nexport const sanitizeErrorMessage = (error: string): string => {\n  return error\n    .replace(/[<>]/g, '')\n    .replace(/&/g, '&amp;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#x27;')\n    .replace(/\\//g, '&#x2F;');\n};\n\nexport const formatValue = (value: unknown): string => {\n  const metadata = ensureRecord(value);\n  return metadata.displayValue as string;\n};\n\nexport const formatForClipboard = (value: unknown): string => {\n  try {\n    if (value === null) return 'null';\n    if (value === undefined) return 'undefined';\n    if (isPromise(value)) return 'Promise';\n\n    if (typeof value === 'function') {\n      const fnStr = value.toString();\n      try {\n        const formatted = fnStr\n          .replace(/\\s+/g, ' ') // Normalize whitespace\n          .replace(/{\\s+/g, '{\\n  ') // Add newline after {\n          .replace(/;\\s+/g, ';\\n  ') // Add newline after ;\n          .replace(/}\\s*$/g, '\\n}') // Add newline before final }\n          .replace(/\\(\\s+/g, '(') // Remove space after (\n          .replace(/\\s+\\)/g, ')') // Remove space before )\n          .replace(/,\\s+/g, ', '); // Normalize comma spacing\n\n        return formatted;\n      } catch {\n        return fnStr;\n      }\n    }\n\n    switch (true) {\n      case value instanceof Date:\n        return value.toISOString();\n      case value instanceof RegExp:\n        return value.toString();\n      case value instanceof Error:\n        return `${value.name}: ${value.message}`;\n      case value instanceof Map:\n        return JSON.stringify(Array.from(value.entries()), null, 2);\n      case value instanceof Set:\n        return JSON.stringify(Array.from(value), null, 2);\n      case value instanceof DataView:\n        return JSON.stringify(\n          Array.from(new Uint8Array(value.buffer)),\n          null,\n          2,\n        );\n      case value instanceof ArrayBuffer:\n        return JSON.stringify(Array.from(new Uint8Array(value)), null, 2);\n      case ArrayBuffer.isView(value) && 'length' in value:\n        return JSON.stringify(\n          Array.from(value as unknown as ArrayLike<number>),\n          null,\n          2,\n        );\n      case Array.isArray(value):\n        return JSON.stringify(value, null, 2);\n      case typeof value === 'object':\n        return JSON.stringify(value, null, 2);\n      default:\n        return String(value);\n    }\n  } catch {\n    return String(value);\n  }\n};\n\nexport const parseArrayValue = (value: string): Array<unknown> => {\n  if (value.trim() === '[]') return [];\n\n  const result: Array<unknown> = [];\n  let current = '';\n  let depth = 0;\n  let inString = false;\n  let escapeNext = false;\n\n  for (let i = 0; i < value.length; i++) {\n    const char = value[i];\n\n    if (escapeNext) {\n      current += char;\n      escapeNext = false;\n      continue;\n    }\n\n    if (char === '\\\\') {\n      escapeNext = true;\n    }\n\n    if (char === '\"') {\n      inString = !inString;\n      current += char;\n      continue;\n    }\n\n    if (inString) {\n      current += char;\n      continue;\n    }\n\n    if (char === '[' || char === '{') {\n      depth++;\n      current += char;\n      continue;\n    }\n\n    if (char === ']' || char === '}') {\n      depth--;\n      current += char;\n      continue;\n    }\n\n    if (char === ',' && depth === 0) {\n      if (current.trim()) {\n        result.push(parseValue(current.trim(), ''));\n      }\n      current = '';\n      continue;\n    }\n\n    current += char;\n  }\n\n  if (current.trim()) {\n    result.push(parseValue(current.trim(), ''));\n  }\n\n  return result;\n};\n\nexport const parseValue = (value: string, currentType: unknown): unknown => {\n  try {\n    switch (typeof currentType) {\n      case 'number':\n        return Number(value);\n      case 'string':\n        return value;\n      case 'boolean':\n        return value === 'true';\n      case 'bigint':\n        return BigInt(value);\n      case 'undefined':\n        return undefined;\n      case 'object': {\n        if (!currentType) {\n          return null;\n        }\n\n        if (Array.isArray(currentType)) {\n          return parseArrayValue(value.slice(1, -1));\n        }\n\n        if (currentType instanceof RegExp) {\n          try {\n            const match = /^\\/(?<pattern>.*)\\/(?<flags>[gimuy]*)$/.exec(value);\n            if (match?.groups) {\n              return new RegExp(match.groups.pattern, match.groups.flags);\n            }\n            return new RegExp(value);\n          } catch {\n            return currentType;\n          }\n        }\n\n        if (currentType instanceof Map) {\n          const entries = value\n            .slice(1, -1)\n            .split(', ')\n            .map((entry) => {\n              const [key, val] = entry.split(' => ');\n              return [parseValue(key, ''), parseValue(val, '')] as [\n                unknown,\n                unknown,\n              ];\n            });\n          return new Map(entries);\n        }\n\n        if (currentType instanceof Set) {\n          const values = value\n            .slice(1, -1)\n            .split(', ')\n            .map((v) => parseValue(v, ''));\n          return new Set(values);\n        }\n        const entries = value\n          .slice(1, -1)\n          .split(', ')\n          .map((entry) => {\n            const [key, val] = entry.split(': ');\n            return [key, parseValue(val, '')];\n          });\n        return Object.fromEntries(entries);\n      }\n    }\n\n    return value;\n  } catch {\n    return currentType;\n  }\n};\n\nexport const detectValueType = (\n  value: string,\n): {\n  type: 'string' | 'number' | 'undefined' | 'null' | 'boolean';\n  value: unknown;\n} => {\n  const trimmed = value.trim();\n\n  switch (trimmed) {\n    case 'undefined':\n      return { type: 'undefined', value: undefined };\n    case 'null':\n      return { type: 'null', value: null };\n    case 'true':\n      return { type: 'boolean', value: true };\n    case 'false':\n      return { type: 'boolean', value: false };\n  }\n\n  if (/^\".*\"$/.test(trimmed)) {\n    return { type: 'string', value: trimmed.slice(1, -1) };\n  }\n\n  if (/^-?\\d+(?:\\.\\d+)?$/.test(trimmed)) {\n    return { type: 'number', value: Number(trimmed) };\n  }\n\n  return { type: 'string', value: `\"${trimmed}\"` };\n};\n\nexport const formatInitialValue = (value: unknown): string => {\n  if (value === undefined) return 'undefined';\n  if (value === null) return 'null';\n  if (typeof value === 'string') return `\"${value}\"`;\n  return String(value);\n};\n\nexport const updateNestedValue = (\n  obj: unknown,\n  path: Array<string>,\n  value: unknown,\n): unknown => {\n  try {\n    if (path.length === 0) return value;\n\n    const [key, ...rest] = path;\n\n    // Handle our special array of {name, value} pairs\n    if (\n      Array.isArray(obj) &&\n      obj.every((item): item is StateItem => 'name' in item && 'value' in item)\n    ) {\n      const index = obj.findIndex((item) => item.name === key);\n      if (index === -1) return obj;\n\n      const newArray = [...obj];\n      if (rest.length === 0) {\n        newArray[index] = { ...newArray[index], value };\n      } else {\n        newArray[index] = {\n          ...newArray[index],\n          value: updateNestedValue(newArray[index].value, rest, value),\n        };\n      }\n      return newArray;\n    }\n\n    if (obj instanceof Map) {\n      const newMap = new Map(obj);\n      if (rest.length === 0) {\n        newMap.set(key, value);\n      } else {\n        const currentValue = newMap.get(key);\n        newMap.set(key, updateNestedValue(currentValue, rest, value));\n      }\n      return newMap;\n    }\n\n    if (Array.isArray(obj)) {\n      const index = Number.parseInt(key, 10);\n      const newArray = [...obj];\n      if (rest.length === 0) {\n        newArray[index] = value;\n      } else {\n        newArray[index] = updateNestedValue(obj[index], rest, value);\n      }\n      return newArray;\n    }\n\n    if (obj && typeof obj === 'object') {\n      if (rest.length === 0) {\n        return { ...obj, [key]: value };\n      }\n      return {\n        ...obj,\n        [key]: updateNestedValue(\n          (obj as Record<string, unknown>)[key],\n          rest,\n          value,\n        ),\n      };\n    }\n\n    return value;\n  } catch {\n    return obj;\n  }\n};\n\nexport const areFunctionsEqual = (prev: unknown, current: unknown): boolean => {\n  try {\n    // Check if both values are actually functions\n    if (typeof prev !== 'function' || typeof current !== 'function') {\n      return false;\n    }\n\n    // Now we know both are functions, we can safely call toString()\n    return prev.toString() === current.toString();\n  } catch {\n    return false;\n  }\n};\n\nexport const getObjectDiff = (\n  prev: unknown,\n  current: unknown,\n  path: string[] = [],\n  seen = new WeakSet(),\n): DiffResult => {\n  if (prev === current) {\n    return { type: 'primitive', changes: [], hasDeepChanges: false };\n  }\n\n  if (typeof prev === 'function' && typeof current === 'function') {\n    const isSameFunction = areFunctionsEqual(prev, current);\n    return {\n      type: 'primitive',\n      changes: [\n        {\n          path,\n          prevValue: prev,\n          currentValue: current,\n          sameFunction: isSameFunction,\n        },\n      ],\n      hasDeepChanges: !isSameFunction,\n    };\n  }\n\n  if (\n    prev === null ||\n    current === null ||\n    prev === undefined ||\n    current === undefined ||\n    typeof prev !== 'object' ||\n    typeof current !== 'object'\n  ) {\n    return {\n      type: 'primitive',\n      changes: [{ path, prevValue: prev, currentValue: current }],\n      hasDeepChanges: true,\n    };\n  }\n\n  if (seen.has(prev) || seen.has(current)) {\n    return {\n      type: 'object',\n      changes: [{ path, prevValue: '[Circular]', currentValue: '[Circular]' }],\n      hasDeepChanges: false,\n    };\n  }\n\n  seen.add(prev);\n  seen.add(current);\n\n  const prevObj = prev as Record<string, unknown>;\n  const currentObj = current as Record<string, unknown>;\n  const allKeys = new Set([\n    ...Object.keys(prevObj),\n    ...Object.keys(currentObj),\n  ]);\n  const changes: Array<DiffChange> = [];\n  let hasDeepChanges = false;\n\n  for (const key of allKeys) {\n    const prevValue = prevObj[key];\n    const currentValue = currentObj[key];\n\n    if (prevValue !== currentValue) {\n      if (\n        typeof prevValue === 'object' &&\n        typeof currentValue === 'object' &&\n        prevValue !== null &&\n        currentValue !== null\n      ) {\n        const nestedDiff = getObjectDiff(\n          prevValue,\n          currentValue,\n          [...path, key],\n          seen,\n        );\n        changes.push(...nestedDiff.changes);\n        if (nestedDiff.hasDeepChanges) {\n          hasDeepChanges = true;\n        }\n      } else {\n        changes.push({\n          path: [...path, key],\n          prevValue,\n          currentValue,\n        });\n        hasDeepChanges = true;\n      }\n    }\n  }\n\n  return {\n    type: 'object',\n    changes,\n    hasDeepChanges,\n  };\n};\n\nexport const formatPath = (path: string[]): string => {\n  if (path.length === 0) return '';\n\n  return path.reduce((acc, segment, i) => {\n    // Check if segment is a number (array index)\n    if (/^\\d+$/.test(segment)) {\n      return `${acc}[${segment}]`;\n    }\n    // Add dot separator only if not first segment and previous segment wasn't an array index\n    return i === 0 ? segment : `${acc}.${segment}`;\n  }, '');\n};\n\nexport const formatFunctionBody = (body: string): string => {\n  // Remove newlines and extra spaces\n  let formatted = body.replace(/\\s+/g, ' ').trim();\n\n  // Add newlines after {, ; and before }\n  formatted = formatted\n    .replace(/{/g, '{\\n  ')\n    .replace(/;/g, ';\\n  ')\n    .replace(/}/g, '\\n}')\n    .replace(/{\\s+}/g, '{ }'); // Clean up empty blocks\n\n  // Clean up arrow functions\n  formatted = formatted.replace(/=> {\\n/g, '=> {').replace(/\\n\\s*}\\s*$/g, ' }');\n\n  return formatted;\n};\n\nexport function hackyJsFormatter(code: string) {\n  //\n  // 1) Collapse runs of whitespace to single spaces\n  //\n  const normalizedCode = code.replace(/\\s+/g, ' ').trim();\n\n  //\n  // 2) Tokenize\n  //    We'll separate out:\n  //    - parentheses: ( )\n  //    - braces: { }\n  //    - brackets: [ ]\n  //    - angle brackets: < >\n  //    - semicolon: ;\n  //    - comma: ,\n  //    - arrow =>\n  //    - colon :\n  //    - question mark ?\n  //    - exclamation mark ! (for TS non-null etc.)\n  //\n  //    We'll also try to combine () or [] or {} or <> if they appear empty.\n  //\n  const rawTokens: string[] = [];\n  let current = '';\n  for (let i = 0; i < normalizedCode.length; i++) {\n    const c = normalizedCode[i];\n\n    // Detect arrow =>\n    if (c === '=' && normalizedCode[i + 1] === '>') {\n      if (current.trim()) rawTokens.push(current.trim());\n      rawTokens.push('=>');\n      current = '';\n      i++;\n      continue;\n    }\n\n    // Single/double char punctuation\n    if (/[(){}[\\];,<>:\\?!]/.test(c)) {\n      // If we had something in current, push it\n      if (current.trim()) {\n        rawTokens.push(current.trim());\n      }\n      rawTokens.push(c);\n      current = '';\n    } else if (/\\s/.test(c)) {\n      // whitespace ends the current token\n      if (current.trim()) {\n        rawTokens.push(current.trim());\n      }\n      current = '';\n    } else {\n      current += c;\n    }\n  }\n  if (current.trim()) {\n    rawTokens.push(current.trim());\n  }\n\n  //\n  // 3) Combine immediate pairs of empty brackets, e.g. '(' + ')' => '()'\n  //    This helps keep arrow param empty parens on one line, etc.\n  //\n  const merged: Array<string> = [];\n  for (let i = 0; i < rawTokens.length; i++) {\n    const t = rawTokens[i];\n    const n = rawTokens[i + 1];\n    if (\n      (t === '(' && n === ')') ||\n      (t === '[' && n === ']') ||\n      (t === '{' && n === '}') ||\n      (t === '<' && n === '>')\n    ) {\n      merged.push(t + (n as string)); // '()', '[]', '{}', '<>'\n      i++;\n    } else {\n      merged.push(t);\n    }\n  }\n\n  //\n  // 4) We want to detect arrow param lists:\n  //    i.e. \"(\" ... \")\" immediately followed by \"=>\"\n  //    so we can keep them on one line.\n  //\n  //    Also, detect generic param lists:\n  //    i.e. identifier \"<\" ... \">\" (then maybe \"(\" ) for function calls or type declarations\n  //\n  //    We'll store indexes in sets: arrowParamSet, genericSet\n  //\n  const arrowParamSet = new Set(); // indexes inside arrow param lists\n  const genericSet = new Set(); // indexes inside generics <...>\n\n  function findMatchingPair(\n    openTok: string,\n    closeTok: string,\n    startIndex: number,\n  ) {\n    // e.g. openTok = '(', closeTok = ')'\n    let depth = 0;\n    for (let j = startIndex; j < merged.length; j++) {\n      const token = merged[j];\n      if (token === openTok) depth++;\n      else if (token === closeTok) {\n        depth--;\n        if (depth === 0) return j;\n      }\n    }\n    return -1;\n  }\n\n  // Detect arrow param sets\n  for (let i = 0; i < merged.length; i++) {\n    const t = merged[i];\n    if (t === '(') {\n      const closeIndex = findMatchingPair('(', ')', i);\n      if (closeIndex !== -1 && merged[closeIndex + 1] === '=>') {\n        // Mark all tokens from i..closeIndex as arrow param\n        for (let k = i; k <= closeIndex; k++) {\n          arrowParamSet.add(k);\n        }\n      }\n    }\n  }\n\n  // Detect generics, e.g. foo<...> or MyType<...>\n  // We do a naive approach: if we see something that looks like an identifier\n  // followed immediately by '<', we assume it's a generic.\n  for (let i = 1; i < merged.length; i++) {\n    const prev = merged[i - 1];\n    const t = merged[i];\n    // If prev is an identifier and t is '<', find matching '>'\n    if (/^[a-zA-Z0-9_$]+$/.test(prev) && t === '<') {\n      const closeIndex = findMatchingPair('<', '>', i);\n      if (closeIndex !== -1) {\n        // Mark i..closeIndex as generic\n        for (let k = i; k <= closeIndex; k++) {\n          genericSet.add(k);\n        }\n      }\n    }\n  }\n\n  //\n  // 5) Build lines with indentation. We maintain a stack for open brackets.\n  //\n  let indentLevel = 0;\n  const indentStr = '  '; // 2 spaces\n  const lines: Array<string> = [];\n  let line = '';\n\n  function pushLine() {\n    if (line.trim()) {\n      lines.push(line.replace(/\\s+$/, ''));\n    }\n    line = '';\n  }\n  function newLine() {\n    pushLine();\n    line = indentStr.repeat(indentLevel);\n  }\n\n  const stack: Array<string> = [];\n  function stackTop() {\n    return stack.length ? stack[stack.length - 1] : null;\n  }\n\n  function placeToken(tok: string, noSpaceBefore = false) {\n    if (!line.trim()) {\n      // line is empty aside from indentation\n      line += tok;\n    } else {\n      if (noSpaceBefore || /^[),;:\\].}>]$/.test(tok)) {\n        line += tok;\n      } else {\n        line += ` ${tok}`;\n      }\n    }\n  }\n\n  for (let i = 0; i < merged.length; i++) {\n    const tok = merged[i];\n    const next = merged[i + 1] || '';\n\n    // Open brackets\n    if (['(', '{', '[', '<'].includes(tok)) {\n      placeToken(tok);\n      stack.push(tok);\n\n      // If '{', definitely newline + indent\n      if (tok === '{') {\n        indentLevel++;\n        newLine();\n      } else if (tok === '(' || tok === '[' || tok === '<') {\n        // If we are in arrowParamSet or genericSet, keep it on one line\n        if (\n          (arrowParamSet.has(i) && tok === '(') ||\n          (genericSet.has(i) && tok === '<')\n        ) {\n          // Don't break lines after commas etc.\n          // We won't do multiline logic for these.\n        } else {\n          // If next is not a direct close, go multiline\n          const directClose = {\n            '(': ')',\n            '[': ']',\n            '<': '>',\n          }[tok];\n          if (\n            next !== directClose &&\n            next !== '()' &&\n            next !== '[]' &&\n            next !== '<>'\n          ) {\n            indentLevel++;\n            newLine();\n          }\n        }\n      }\n    }\n\n    // Close brackets\n    else if ([')', '}', ']', '>'].includes(tok)) {\n      // pop stack\n      const opening = stackTop();\n      if (\n        (tok === ')' && opening === '(') ||\n        (tok === ']' && opening === '[') ||\n        (tok === '>' && opening === '<')\n      ) {\n        // if not arrowParamSet or genericSet, multiline\n        if (\n          !(arrowParamSet.has(i) && tok === ')') &&\n          !(genericSet.has(i) && tok === '>')\n        ) {\n          indentLevel = Math.max(indentLevel - 1, 0);\n          newLine();\n        }\n      } else if (tok === '}' && opening === '{') {\n        indentLevel = Math.max(indentLevel - 1, 0);\n        newLine();\n      }\n      stack.pop();\n      placeToken(tok);\n      if (tok === '}') {\n        // break line after }\n        newLine();\n      }\n    }\n\n    // Combined empty pairs like '()', '[]', '{}', '<>'\n    else if (/^\\(\\)|\\[\\]|\\{\\}|\\<\\>$/.test(tok)) {\n      placeToken(tok);\n\n      // Arrow =>\n    } else if (tok === '=>') {\n      placeToken(tok);\n      // We'll let the next token (maybe '{') handle line breaks.\n\n      // Semicolon\n    } else if (tok === ';') {\n      placeToken(tok, true);\n      newLine();\n\n      // Comma\n    } else if (tok === ',') {\n      placeToken(tok, true);\n      // If inside an arrow param set or generic set, don't break\n      // Otherwise, if top is {, (, [ or <, break line\n      const top = stackTop();\n      if (\n        !(arrowParamSet.has(i) && top === '(') &&\n        !(genericSet.has(i) && top === '<')\n      ) {\n        if (top && ['{', '[', '(', '<'].includes(top)) {\n          newLine();\n        }\n      }\n\n      // Everything else (identifiers, operators, colons, question marks, etc.)\n    } else {\n      placeToken(tok);\n    }\n  }\n\n  pushLine();\n\n  // Remove extra blank lines\n  return lines\n    .join('\\n')\n    .replace(/\\n\\s*\\n+/g, '\\n')\n    .trim();\n}\n\n// Update the formatFunctionPreview to use the new formatter\nexport const formatFunctionPreview = (\n  fn: { toString(): string },\n  expanded = false,\n): string => {\n  try {\n    const fnStr = fn.toString();\n    const match = fnStr.match(\n      /(?:function\\s*)?(?:\\(([^)]*)\\)|([^=>\\s]+))\\s*=>?/,\n    );\n    if (!match) return 'ƒ';\n\n    const params = match[1] || match[2] || '';\n    const cleanParams = params.replace(/\\s+/g, '');\n\n    if (!expanded) {\n      return `ƒ (${cleanParams}) => ...`;\n    }\n\n    // For expanded view, use the new formatter\n    return hackyJsFormatter(fnStr);\n  } catch {\n    return 'ƒ';\n  }\n};\n\nexport const formatValuePreview = (value: unknown): string => {\n  if (value === null) return 'null';\n  if (value === undefined) return 'undefined';\n  if (typeof value === 'string')\n    return `\"${value.length > 150 ? `${value.slice(0, 20)}...` : value}\"`;\n  if (typeof value === 'number' || typeof value === 'boolean')\n    return String(value);\n  if (typeof value === 'function') return formatFunctionPreview(value);\n  if (Array.isArray(value)) return `Array(${value.length})`;\n  if (value instanceof Map) return `Map(${value.size})`;\n  if (value instanceof Set) return `Set(${value.size})`;\n  if (value instanceof Date) return value.toISOString();\n  if (value instanceof RegExp) return value.toString();\n  if (value instanceof Error) return `${value.name}: ${value.message}`;\n  if (typeof value === 'object') {\n    const keys = Object.keys(value as object);\n    return `{${keys.length > 2 ? `${keys.slice(0, 2).join(', ')}, ...` : keys.join(', ')}}`;\n  }\n  return String(value);\n};\n\nexport const safeGetValue = (\n  value: unknown,\n): { value: unknown; error?: string } => {\n  if (value === null || value === undefined) return { value };\n  if (typeof value === 'function') return { value };\n  if (typeof value !== 'object') return { value };\n\n  if (isPromise(value)) {\n    return { value: 'Promise' };\n  }\n\n  try {\n    const proto = Object.getPrototypeOf(value);\n    if (proto === Promise.prototype || proto?.constructor?.name === 'Promise') {\n      return { value: 'Promise' };\n    }\n\n    return { value };\n  } catch {\n    return { value: null, error: 'Error accessing value' };\n  }\n};\n\nexport interface TimelineSliderValues {\n  leftValue: number;\n  min: number;\n  max: number;\n  value: number;\n  rightValue: number;\n}\n\nexport const calculateSliderValues = (\n  totalUpdates: number,\n  currentIndex: number,\n): TimelineSliderValues => {\n  if (totalUpdates <= TIMELINE_MAX_UPDATES) {\n    return {\n      leftValue: 0,\n      min: 0,\n      max: totalUpdates - 1,\n      value: currentIndex,\n      rightValue: totalUpdates - 1,\n    };\n  }\n\n  return {\n    leftValue: totalUpdates - TIMELINE_MAX_UPDATES,\n    min: 0,\n    max: TIMELINE_MAX_UPDATES - 1,\n    value: currentIndex,\n    rightValue: totalUpdates - 1,\n  };\n};\n\n// be careful, this is an implementation detail is not stable or reliable across all react versions https://github.com/facebook/react/pull/15124\n// type UpdateQueue<S, A> = {\n//   last: Update<S, A> | null,\n//   dispatch: (A => mixed) | null,\n//   eagerReducer: ((S, A) => S) | null,\n//   eagerState: S | null,\n// };\n\ninterface ExtendedMemoizedState extends MemoizedState {\n  queue?: {\n    lastRenderedState: unknown;\n  } | null;\n  element?: unknown;\n}\n\nexport const isDirectComponent = (fiber: Fiber): boolean => {\n  if (!fiber || !fiber.type) return false;\n\n  const isFunctionalComponent = typeof fiber.type === 'function';\n  const isClassComponent = fiber.type?.prototype?.isReactComponent ?? false;\n\n  if (!(isFunctionalComponent || isClassComponent)) return false;\n\n  if (isClassComponent) {\n    return true;\n  }\n\n  let memoizedState = fiber.memoizedState;\n  while (memoizedState) {\n    if (memoizedState.queue) {\n      return true;\n    }\n    const nextState: ExtendedMemoizedState | null = memoizedState.next;\n    if (!nextState) break;\n    memoizedState = nextState;\n  }\n\n  return false;\n};\n\nexport const isPromise = (value: unknown): value is Promise<unknown> => {\n  return (\n    !!value &&\n    (value instanceof Promise || (typeof value === 'object' && 'then' in value))\n  );\n};\n\nexport const ensureRecord = (\n  value: unknown,\n  maxDepth = 2,\n  seen = new WeakSet<object>(),\n): Record<string, unknown> => {\n  if (isPromise(value)) {\n    return { type: 'promise', displayValue: 'Promise' };\n  }\n\n  if (value === null) {\n    return { type: 'null', displayValue: 'null' };\n  }\n\n  if (value === undefined) {\n    return { type: 'undefined', displayValue: 'undefined' };\n  }\n\n  switch (typeof value) {\n    case 'object': {\n      if (seen.has(value)) {\n        return { type: 'circular', displayValue: '[Circular Reference]' };\n      }\n\n      if (!value) return { type: 'null', displayValue: 'null' };\n\n      seen.add(value);\n\n      try {\n        const result: Record<string, unknown> = {};\n\n        if (value instanceof Element) {\n          result.type = 'Element';\n          result.tagName = value.tagName.toLowerCase();\n          result.displayValue = value.tagName.toLowerCase();\n          return result;\n        }\n\n        if (value instanceof Map) {\n          result.type = 'Map';\n          result.size = value.size;\n          result.displayValue = `Map(${value.size})`;\n\n          if (maxDepth > 0) {\n            const entries: Record<string, unknown> = {};\n            let index = 0;\n            for (const [key, val] of value.entries()) {\n              if (index >= 50) break;\n              try {\n                entries[String(key)] = ensureRecord(val, maxDepth - 1, seen);\n              } catch {\n                entries[String(index)] = {\n                  type: 'error',\n                  displayValue: 'Error accessing Map entry',\n                };\n              }\n              index++;\n            }\n            result.entries = entries;\n          }\n          return result;\n        }\n\n        if (value instanceof Set) {\n          result.type = 'Set';\n          result.size = value.size;\n          result.displayValue = `Set(${value.size})`;\n\n          if (maxDepth > 0) {\n            const items: Array<Record<string, unknown>> = [];\n            let count = 0;\n            for (const item of value) {\n              if (count >= 50) break;\n              items.push(ensureRecord(item, maxDepth - 1, seen));\n              count++;\n            }\n            result.items = items;\n          }\n          return result;\n        }\n\n        if (value instanceof Date) {\n          result.type = 'Date';\n          result.value = value.toISOString();\n          result.displayValue = value.toLocaleString();\n          return result;\n        }\n\n        if (value instanceof RegExp) {\n          result.type = 'RegExp';\n          result.value = value.toString();\n          result.displayValue = value.toString();\n          return result;\n        }\n\n        if (value instanceof Error) {\n          result.type = 'Error';\n          result.name = value.name;\n          result.message = value.message;\n          result.displayValue = `${value.name}: ${value.message}`;\n          return result;\n        }\n\n        if (value instanceof ArrayBuffer) {\n          result.type = 'ArrayBuffer';\n          result.byteLength = value.byteLength;\n          result.displayValue = `ArrayBuffer(${value.byteLength})`;\n          return result;\n        }\n\n        if (value instanceof DataView) {\n          result.type = 'DataView';\n          result.byteLength = value.byteLength;\n          result.displayValue = `DataView(${value.byteLength})`;\n          return result;\n        }\n\n        if (ArrayBuffer.isView(value)) {\n          const typedArray = value as unknown as {\n            length: number;\n            constructor: { name: string };\n            buffer: ArrayBuffer;\n          };\n          result.type = typedArray.constructor.name;\n          result.length = typedArray.length;\n          result.byteLength = typedArray.buffer.byteLength;\n          result.displayValue = `${typedArray.constructor.name}(${typedArray.length})`;\n          return result;\n        }\n\n        if (Array.isArray(value)) {\n          result.type = 'array';\n          result.length = value.length;\n          result.displayValue = `Array(${value.length})`;\n\n          if (maxDepth > 0) {\n            result.items = value\n              .slice(0, 50)\n              .map((item) => ensureRecord(item, maxDepth - 1, seen));\n          }\n          return result;\n        }\n\n        const keys = Object.keys(value);\n        result.type = 'object';\n        result.size = keys.length;\n        result.displayValue =\n          keys.length <= 5\n            ? `{${keys.join(', ')}}`\n            : `{${keys.slice(0, 5).join(', ')}, ...${keys.length - 5}}`;\n\n        if (maxDepth > 0) {\n          const entries: Record<string, unknown> = {};\n          for (const key of keys.slice(0, 50)) {\n            try {\n              entries[key] = ensureRecord(\n                (value as Record<string, unknown>)[key],\n                maxDepth - 1,\n                seen,\n              );\n            } catch {\n              entries[key] = {\n                type: 'error',\n                displayValue: 'Error accessing property',\n              };\n            }\n          }\n          result.entries = entries;\n        }\n        return result;\n      } finally {\n        seen.delete(value);\n      }\n    }\n    case 'string':\n      return {\n        type: 'string',\n        value,\n        displayValue: `\"${value}\"`,\n      };\n    case 'function':\n      return {\n        type: 'function',\n        displayValue: 'ƒ()',\n        name: value.name || 'anonymous',\n      };\n    default:\n      return {\n        type: typeof value,\n        value,\n        displayValue: String(value),\n      };\n  }\n};\n\nexport const getCurrentFiberState = (\n  fiber: Fiber,\n): Record<string, unknown> | null => {\n  if (fiber.tag !== FunctionComponentTag || !isDirectComponent(fiber)) {\n    return null;\n  }\n\n  const currentIsNewer = fiber.alternate\n    ? (fiber.actualStartTime ?? 0) > (fiber.alternate.actualStartTime ?? 0)\n    : true;\n\n  const memoizedState: ExtendedMemoizedState | null = currentIsNewer\n    ? fiber.memoizedState\n    : (fiber.alternate?.memoizedState ?? fiber.memoizedState);\n\n  if (!memoizedState) return null;\n\n  return memoizedState;\n};\n\nexport const replayComponent = async (fiber: Fiber): Promise<void> => {\n  const { overrideProps, overrideHookState, overrideContext } =\n    getOverrideMethods();\n  if (!overrideProps || !overrideHookState || !fiber) return;\n\n  try {\n    // Handle props updates\n    const currentProps = fiber.memoizedProps || {};\n    const propKeys = Object.keys(currentProps).filter((key) => {\n      const value = currentProps[key];\n      if (Array.isArray(value) || typeof value === 'string') {\n        return !Number.isInteger(Number(key)) && key !== 'length';\n      }\n      return true;\n    });\n\n    for (const key of propKeys) {\n      try {\n        const value = currentProps[key];\n        // For arrays and objects, we need to clone to trigger updates\n        const propValue = Array.isArray(value)\n          ? [...value]\n          : typeof value === 'object' && value !== null\n            ? { ...value }\n            : value;\n        overrideProps(fiber, [key], propValue);\n      } catch {}\n    }\n\n    // Handle state updates\n    const currentState = getCurrentFiberState(fiber);\n    if (currentState) {\n      const stateNames = getStateNames(fiber);\n\n      // First, handle named state hooks\n      for (const [key, value] of Object.entries(currentState)) {\n        try {\n          const namedStateIndex = stateNames.indexOf(key);\n          if (namedStateIndex !== -1) {\n            const hookId = namedStateIndex.toString();\n            // For arrays and objects, we need to clone to trigger updates\n            const stateValue = Array.isArray(value)\n              ? [...value]\n              : typeof value === 'object' && value !== null\n                ? { ...value }\n                : value;\n            overrideHookState(fiber, hookId, [], stateValue);\n          }\n        } catch {}\n      }\n\n      // Then handle unnamed state hooks\n      let hookIndex = 0;\n      let currentHook = fiber.memoizedState;\n      while (currentHook !== null) {\n        try {\n          const hookId = hookIndex.toString();\n          const value = currentHook.memoizedState;\n\n          // Only update if this hook isn't already handled by named states\n          if (!stateNames.includes(hookId)) {\n            // For arrays and objects, we need to clone to trigger updates\n            const stateValue = Array.isArray(value)\n              ? [...value]\n              : typeof value === 'object' && value !== null\n                ? { ...value }\n                : value;\n            overrideHookState(fiber, hookId, [], stateValue);\n          }\n        } catch {}\n\n        currentHook = currentHook.next as typeof currentHook;\n        hookIndex++;\n      }\n    }\n\n    // Handle context updates\n    if (overrideContext) {\n      const contexts = getAllFiberContexts(fiber);\n      if (contexts) {\n        for (const [contextType, ctx] of contexts) {\n          try {\n            // Find the provider fiber for this context\n            let current: Fiber | null = fiber;\n            while (current) {\n              const type = current.type as { Provider?: unknown };\n              if (type === contextType || type?.Provider === contextType) {\n                // Get the value we want to update to\n                const newValue = ctx.value;\n                if (newValue === undefined || newValue === null) break;\n\n                // Only update if the value has actually changed\n                const currentValue = current.memoizedProps?.value;\n                if (isEqual(currentValue, newValue)) break;\n\n                // Update the provider's value prop\n                overrideProps(current, ['value'], newValue);\n                if (current.alternate) {\n                  overrideProps(current.alternate, ['value'], newValue);\n                }\n                break;\n              }\n              current = current.return;\n            }\n          } catch {}\n        }\n      }\n    }\n\n    // Recursively handle children\n    let child = fiber.child;\n    while (child) {\n      await replayComponent(child);\n      child = child.sibling;\n    }\n  } catch {}\n};\n\nexport const extractMinimalFiberInfo = (fiber: Fiber): MinimalFiberInfo => {\n  const timings = getTimings(fiber);\n  return {\n    displayName: getDisplayName(fiber) || 'Unknown',\n    type: fiber.type,\n    key: fiber.key,\n    id: fiber.index,\n    selfTime: timings?.selfTime ?? null,\n    totalTime: timings?.totalTime ?? null,\n  };\n};\n","import { computed, untracked, useSignalEffect } from '@preact/signals';\nimport type { Fiber } from 'bippy';\nimport { Component } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\nimport { Store } from '~core/index';\nimport { Icon } from '~web/components/icon';\nimport { signalIsSettingsOpen, signalWidgetViews } from '~web/state';\nimport { cn } from '~web/utils/helpers';\nimport { constant } from '~web/utils/preact/constant';\nimport { ComponentsTree } from './components-tree';\nimport { flashManager } from './flash-overlay';\nimport {\n  type TimelineUpdate,\n  inspectorUpdateSignal,\n  timelineActions,\n} from './states';\nimport {\n  collectInspectorData,\n  getStateNames,\n  resetTracking,\n} from './timeline/utils';\nimport { extractMinimalFiberInfo, getCompositeFiberFromElement } from './utils';\nimport { WhatChanged } from './what-changed';\n\nexport const globalInspectorState = {\n  lastRendered: new Map<string, unknown>(),\n  expandedPaths: new Set<string>(),\n  cleanup: () => {\n    globalInspectorState.lastRendered.clear();\n    globalInspectorState.expandedPaths.clear();\n    flashManager.cleanupAll();\n    resetTracking();\n    timelineActions.reset();\n  },\n};\n\n// todo: add reset button and error message\nclass InspectorErrorBoundary extends Component {\n  state: { error: Error | null; hasError: boolean } = {\n    hasError: false,\n    error: null,\n  };\n\n  static getDerivedStateFromError(e: Error) {\n    return { hasError: true, error: e };\n  }\n\n  handleReset = () => {\n    this.setState({ hasError: false, error: null });\n    globalInspectorState.cleanup();\n  };\n\n  render() {\n    if (this.state.hasError) {\n      return (\n        <div className=\"p-4 bg-red-950/50 h-screen backdrop-blur-sm\">\n          <div className=\"flex items-center gap-2 mb-3 text-red-400 font-medium\">\n            <Icon name=\"icon-flame\" className=\"text-red-500\" size={16} />\n            Something went wrong in the inspector\n          </div>\n          <div className=\"p-3 bg-black/40 rounded font-mono text-xs text-red-300 mb-4 break-words\">\n            {this.state.error?.message || JSON.stringify(this.state.error)}\n          </div>\n          <button\n            type=\"button\"\n            onClick={this.handleReset}\n            className=\"px-4 py-2 bg-red-500 hover:bg-red-600 text-white rounded-md text-sm font-medium transition-colors flex items-center justify-center gap-2\"\n          >\n            Reset Inspector\n          </button>\n        </div>\n      );\n    }\n\n    return this.props.children;\n  }\n}\n\nconst inspectorContainerClassName = computed(() =>\n  cn(\n    'react-scan-inspector',\n    'flex-1',\n    'opacity-0',\n    'overflow-y-auto overflow-x-hidden',\n    'transition-opacity delay-0',\n    'pointer-events-none',\n    !signalIsSettingsOpen.value && 'opacity-100 delay-300 pointer-events-auto',\n  ),\n);\n\nconst Inspector = /* @__PURE__ */ constant(() => {\n  const refLastInspectedFiber = useRef<Fiber | null>(null);\n\n  // NOTE(Alexis): no need for useCallback\n  const processUpdate = (fiber: Fiber) => {\n    if (!fiber) return;\n\n    refLastInspectedFiber.current = fiber;\n    const { data: inspectorData, shouldUpdate } = collectInspectorData(fiber);\n\n    if (shouldUpdate) {\n      const update: TimelineUpdate = {\n        timestamp: Date.now(),\n        fiberInfo: extractMinimalFiberInfo(fiber),\n        props: inspectorData.fiberProps,\n        state: inspectorData.fiberState,\n        context: inspectorData.fiberContext,\n        stateNames: getStateNames(fiber),\n      };\n\n      timelineActions.addUpdate(update, fiber);\n    }\n  };\n\n  useSignalEffect(() => {\n    const state = Store.inspectState.value;\n    untracked(() => {\n      if (state.kind !== 'focused' || !state.focusedDomElement) {\n        refLastInspectedFiber.current = null;\n        globalInspectorState.cleanup();\n        return;\n      }\n\n      if (state.kind === 'focused') {\n        signalIsSettingsOpen.value = false;\n      }\n\n      const { parentCompositeFiber } = getCompositeFiberFromElement(\n        state.focusedDomElement,\n        state.fiber,\n      );\n\n      if (!parentCompositeFiber) {\n        Store.inspectState.value = {\n          kind: 'inspect-off',\n        };\n        signalWidgetViews.value = {\n          view: 'none',\n        };\n        return;\n      }\n\n      const isNewComponent =\n        refLastInspectedFiber.current?.type !== parentCompositeFiber.type;\n\n      if (isNewComponent) {\n        refLastInspectedFiber.current = parentCompositeFiber;\n        globalInspectorState.cleanup();\n        processUpdate(parentCompositeFiber);\n      }\n    });\n  });\n\n  useSignalEffect(() => {\n    // NOTE(Alexis): just track\n    inspectorUpdateSignal.value;\n    untracked(() => {\n      const inspectState = Store.inspectState.value;\n      if (inspectState.kind !== 'focused' || !inspectState.focusedDomElement) {\n        refLastInspectedFiber.current = null;\n        globalInspectorState.cleanup();\n        return;\n      }\n\n      const { parentCompositeFiber } = getCompositeFiberFromElement(\n        inspectState.focusedDomElement,\n        inspectState.fiber,\n      );\n\n      if (!parentCompositeFiber) {\n        Store.inspectState.value = {\n          kind: 'inspect-off',\n        };\n        signalWidgetViews.value = {\n          view: 'none',\n        };\n        return;\n      }\n\n      processUpdate(parentCompositeFiber);\n\n      if (!inspectState.focusedDomElement.isConnected) {\n        refLastInspectedFiber.current = null;\n        globalInspectorState.cleanup();\n        Store.inspectState.value = {\n          kind: 'inspecting',\n          hoveredDomElement: null,\n        };\n      }\n    });\n  });\n\n  useEffect(() => {\n    return () => {\n      globalInspectorState.cleanup();\n    };\n  }, []);\n\n  return (\n    <InspectorErrorBoundary>\n      <div className={inspectorContainerClassName}>\n        <div className=\"w-full h-full\">\n          <WhatChanged />\n        </div>\n      </div>\n    </InspectorErrorBoundary>\n  );\n});\n\nexport const ViewInspector = /* @__PURE__ */ constant(() => {\n  if (Store.inspectState.value.kind !== 'focused') return null;\n  return (\n    <InspectorErrorBoundary>\n      <Inspector />\n      <ComponentsTree />\n    </InspectorErrorBoundary>\n  );\n});\n","import type { JSX } from 'preact';\nimport { type ForwardedRef, forwardRef } from 'preact/compat';\n\nexport interface SVGIconProps {\n  size?: number | Array<number>;\n  name: string;\n  fill?: string;\n  stroke?: string;\n  className?: string;\n  externalURL?: string;\n  style?: JSX.CSSProperties;\n}\n\nexport const Icon = forwardRef(({\n  size = 15,\n  name,\n  fill = 'currentColor',\n  stroke = 'currentColor',\n  className,\n  externalURL = '',\n  style,\n}: SVGIconProps, ref: ForwardedRef<SVGSVGElement>) => {\n  const width = Array.isArray(size) ? size[0] : size;\n  const height = Array.isArray(size) ? size[1] || size[0] : size;\n\n  const path = `${externalURL}#${name}`;\n\n  return (\n    <svg\n      ref={ref}\n      width={`${width}px`}\n      height={`${height}px`}\n      fill={fill}\n      stroke={stroke}\n      className={className}\n      style={{\n        ...style,\n        minWidth: `${width}px`,\n        maxWidth: `${width}px`,\n        minHeight: `${height}px`,\n        maxHeight: `${height}px`,\n      }}\n    >\n      <title>{name}</title>\n      <use href={path} />\n    </svg>\n  );\n});\n","import { signal } from \"@preact/signals\";\nimport {\n  LOCALSTORAGE_KEY,\n  MIN_CONTAINER_WIDTH,\n  MIN_SIZE,\n  SAFE_AREA,\n  LOCALSTORAGE_COLLAPSED_KEY,\n} from \"./constants\";\nimport { IS_CLIENT } from \"./utils/constants\";\nimport { readLocalStorage, saveLocalStorage } from \"./utils/helpers\";\nimport type { Corner, WidgetConfig, WidgetSettings } from \"./widget/types\";\nimport type { CollapsedPosition } from \"./widget/types\";\n\nexport const signalIsSettingsOpen = /* @__PURE__ */ signal(false);\nexport const signalRefWidget = /* @__PURE__ */ signal<HTMLDivElement | null>(\n  null\n);\n\nexport const defaultWidgetConfig = {\n  corner: \"bottom-right\" as Corner,\n  dimensions: {\n    isFullWidth: false,\n    isFullHeight: false,\n    width: MIN_SIZE.width,\n    height: MIN_SIZE.height,\n    position: { x: SAFE_AREA, y: SAFE_AREA },\n  },\n  lastDimensions: {\n    isFullWidth: false,\n    isFullHeight: false,\n    width: MIN_SIZE.width,\n    height: MIN_SIZE.height,\n    position: { x: SAFE_AREA, y: SAFE_AREA },\n  },\n  componentsTree: {\n    width: MIN_CONTAINER_WIDTH,\n  },\n} as WidgetConfig;\n\nexport const getInitialWidgetConfig = (): WidgetConfig => {\n  const stored = readLocalStorage<WidgetSettings>(LOCALSTORAGE_KEY);\n  if (!stored) {\n    saveLocalStorage(LOCALSTORAGE_KEY, {\n      corner: defaultWidgetConfig.corner,\n      dimensions: defaultWidgetConfig.dimensions,\n      lastDimensions: defaultWidgetConfig.lastDimensions,\n      componentsTree: defaultWidgetConfig.componentsTree,\n    });\n\n    return defaultWidgetConfig;\n  }\n\n  return {\n    corner: stored.corner ?? defaultWidgetConfig.corner,\n    dimensions: stored.dimensions ?? defaultWidgetConfig.dimensions,\n\n    lastDimensions:\n      stored.lastDimensions ??\n      stored.dimensions ??\n      defaultWidgetConfig.lastDimensions,\n    componentsTree: stored.componentsTree ?? defaultWidgetConfig.componentsTree,\n  };\n};\n\nexport const signalWidget = signal<WidgetConfig>(getInitialWidgetConfig());\n\nexport const updateDimensions = (): void => {\n  if (!IS_CLIENT) return;\n\n  const { dimensions } = signalWidget.value;\n  const { width, height, position } = dimensions;\n\n  signalWidget.value = {\n    ...signalWidget.value,\n    dimensions: {\n      isFullWidth: width >= window.innerWidth - SAFE_AREA * 2,\n      isFullHeight: height >= window.innerHeight - SAFE_AREA * 2,\n      width,\n      height,\n      position,\n    },\n  };\n};\n\nexport interface SlowDowns {\n  slowDowns: number;\n  hideNotification: boolean;\n}\n\nexport type WidgetStates =\n  | {\n      view: \"none\";\n    }\n  | {\n      view: \"inspector\";\n      // extra params\n    }\n  // | {\n  //     view: 'settings';\n  //     // extra params\n  //   }\n  | {\n      view: \"notifications\";\n      // extra params\n    };\n// | {\n//     view: 'summary';\n//     // extra params\n//   };\nexport const signalWidgetViews = signal<WidgetStates>({\n  view: \"none\",\n});\n\nconst storedCollapsed = readLocalStorage<CollapsedPosition | null>(\n  LOCALSTORAGE_COLLAPSED_KEY\n);\nexport const signalWidgetCollapsed =\n  /* @__PURE__ */ signal<CollapsedPosition | null>(storedCollapsed ?? null);\n","export const SAFE_AREA = 24;\nexport const MIN_SIZE = {\n  width: 550,\n  height: 350,\n  initialHeight: 400,\n} as const;\n\nexport const MIN_CONTAINER_WIDTH = 240;\n\nexport const LOCALSTORAGE_KEY = \"react-scan-widget-settings-v2\";\nexport const LOCALSTORAGE_COLLAPSED_KEY = \"react-scan-widget-collapsed-v1\";\nexport const LOCALSTORAGE_LAST_VIEW_KEY = \"react-scan-widget-last-view-v1\";\n","import {\n  type Fiber,\n  MemoComponentTag,\n  SimpleMemoComponentTag,\n  SuspenseComponentTag,\n  getDisplayName,\n  hasMemoCache,\n} from 'bippy';\nimport { type ClassValue, clsx } from 'clsx';\nimport { IS_CLIENT } from './constants';\nimport { twMerge } from 'tailwind-merge';\n\nexport const cn = (...inputs: Array<ClassValue>): string => {\n  return twMerge(clsx(inputs));\n};\n\nexport const isFirefox =\n  /* @__PURE__ */ typeof navigator !== 'undefined' &&\n  navigator.userAgent.includes('Firefox');\n\nexport const onIdle = (callback: () => void) => {\n  if ('scheduler' in globalThis) {\n    return globalThis.scheduler.postTask(callback, {\n      priority: 'background',\n    });\n  }\n  if ('requestIdleCallback' in window) {\n    return requestIdleCallback(callback);\n  }\n  return setTimeout(callback, 0);\n};\n\nexport const throttle = <E>(\n  callback: (e?: E) => void,\n  delay: number,\n): ((e?: E) => void) => {\n  let lastCall = 0;\n  return (e?: E) => {\n    const now = Date.now();\n    if (now - lastCall >= delay) {\n      lastCall = now;\n      return callback(e);\n    }\n    return undefined;\n  };\n};\n\nexport const tryOrElse = <T>(fn: () => T, defaultValue: T): T => {\n  try {\n    return fn();\n  } catch {\n    return defaultValue;\n  }\n};\n\nexport const readLocalStorage = <T>(storageKey: string): T | null => {\n  if (!IS_CLIENT) return null;\n\n  try {\n    const stored = localStorage.getItem(storageKey);\n    return stored ? JSON.parse(stored) : null;\n  } catch {\n    return null;\n  }\n};\n\nexport const saveLocalStorage = <T>(storageKey: string, state: T): void => {\n  if (!IS_CLIENT) return;\n\n  try {\n    window.localStorage.setItem(storageKey, JSON.stringify(state));\n  } catch {}\n};\nexport const removeLocalStorage = (storageKey: string): void => {\n  if (!IS_CLIENT) return;\n\n  try {\n    window.localStorage.removeItem(storageKey);\n  } catch {}\n};\n\ninterface WrapperBadge {\n  type: 'memo' | 'forwardRef' | 'lazy' | 'suspense' | 'profiler' | 'strict';\n  title: string;\n  compiler?: boolean;\n}\n\nexport interface ExtendedDisplayName {\n  name: string | null;\n  wrappers: Array<string>;\n  wrapperTypes: Array<WrapperBadge>;\n}\n\n// React internal tags not exported by bippy\nconst LazyComponentTag = 24;\nconst ProfilerTag = 12;\n\nexport const getExtendedDisplayName = (fiber: Fiber): ExtendedDisplayName => {\n  if (!fiber) {\n    return {\n      name: 'Unknown',\n      wrappers: [],\n      wrapperTypes: [],\n    };\n  }\n\n  const { tag, type, elementType } = fiber;\n  let name = getDisplayName(type);\n  const wrappers: Array<string> = [];\n  const wrapperTypes: Array<WrapperBadge> = [];\n\n  if (\n    hasMemoCache(fiber) ||\n    tag === SimpleMemoComponentTag ||\n    tag === MemoComponentTag ||\n    (type as { $$typeof?: symbol })?.$$typeof === Symbol.for('react.memo') ||\n    (elementType as { $$typeof?: symbol })?.$$typeof ===\n      Symbol.for('react.memo')\n  ) {\n    const compiler = hasMemoCache(fiber);\n    wrapperTypes.push({\n      type: 'memo',\n      title: compiler\n        ? 'This component has been auto-memoized by the React Compiler.'\n        : 'Memoized component that skips re-renders if props are the same',\n      compiler,\n    });\n  }\n\n  if (tag === LazyComponentTag) {\n    wrapperTypes.push({\n      type: 'lazy',\n      title: 'Lazily loaded component that supports code splitting',\n    });\n  }\n\n  if (tag === SuspenseComponentTag) {\n    wrapperTypes.push({\n      type: 'suspense',\n      title: 'Component that can suspend while content is loading',\n    });\n  }\n\n  if (tag === ProfilerTag) {\n    wrapperTypes.push({\n      type: 'profiler',\n      title: 'Component that measures rendering performance',\n    });\n  }\n\n  if (typeof name === 'string') {\n    const wrapperRegex = /^(\\w+)\\((.*)\\)$/;\n    let currentName = name;\n    while (wrapperRegex.test(currentName)) {\n      const match = currentName.match(wrapperRegex);\n      if (match?.[1] && match?.[2]) {\n        wrappers.unshift(match[1]);\n        currentName = match[2];\n      } else {\n        break;\n      }\n    }\n    name = currentName;\n  }\n\n  return {\n    name: name || 'Unknown',\n    wrappers,\n    wrapperTypes,\n  };\n};\n","import {\n  type Attributes,\n  type Component,\n  type FunctionComponent,\n  createElement,\n} from 'preact';\n\nfunction CONSTANT_UPDATE() {\n  return false;\n}\n\nexport function constant<P extends Attributes>(\n  Component: FunctionComponent<P>,\n) {\n  function Memoed(this: Component<P>, props: P) {\n    this.shouldComponentUpdate = CONSTANT_UPDATE;\n    return createElement<P>(Component, props);\n  }\n  Memoed.displayName = `Memo(${Component.displayName || Component.name})`;\n  Memoed.prototype.isReactComponent = true;\n  Memoed._forwarded = true;\n  return Memoed;\n}\n","import {\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'preact/hooks';\nimport { Store } from '~core/index';\nimport { getRenderData } from '~core/instrumentation';\nimport { Icon } from '~web/components/icon';\nimport {\n  LOCALSTORAGE_KEY,\n  MIN_CONTAINER_WIDTH,\n} from '~web/constants';\nimport { useVirtualList } from '~web/hooks/use-virtual-list';\nimport { signalWidget } from '~web/state';\nimport {\n  cn,\n  getExtendedDisplayName,\n  saveLocalStorage,\n} from '~web/utils/helpers';\nimport { getFiberPath } from '~web/utils/pin';\nimport { inspectorUpdateSignal } from '../states';\nimport {\n  type InspectableElement,\n  getCompositeComponentFromElement,\n  getInspectableElements,\n} from '../utils';\nimport {\n  type FlattenedNode,\n  type TreeNode,\n  searchState,\n  signalSkipTreeUpdate,\n} from './state';\n\nconst flattenTree = (\n  nodes: TreeNode[],\n  depth = 0,\n  parentPath: string | null = null,\n): FlattenedNode[] => {\n  return nodes.reduce<FlattenedNode[]>((acc, node, index) => {\n    const nodePath = node.element\n      ? getFiberPath(node.fiber)\n      : `${parentPath}-${index}`;\n\n    const renderData = node.fiber?.type\n      ? getRenderData(node.fiber)\n      : undefined;\n\n    const flatNode: FlattenedNode = {\n      ...node,\n      depth,\n      nodeId: nodePath,\n      parentId: parentPath,\n      fiber: node.fiber,\n      renderData,\n    };\n    acc.push(flatNode);\n\n    if (node.children?.length) {\n      acc.push(...flattenTree(node.children, depth + 1, nodePath));\n    }\n\n    return acc;\n  }, []);\n};\n\nconst getMaxDepth = (nodes: FlattenedNode[]): number => {\n  return nodes.reduce((max, node) => Math.max(max, node.depth), 0);\n};\n\nconst calculateIndentSize = (containerWidth: number, maxDepth: number) => {\n  const MIN_INDENT = 0;\n  const MAX_INDENT = 24;\n  const MIN_TOTAL_INDENT = 24;\n\n  if (maxDepth <= 0) return MAX_INDENT;\n\n  const availableSpace = Math.max(0, containerWidth - MIN_CONTAINER_WIDTH);\n\n  if (availableSpace < MIN_TOTAL_INDENT) return MIN_INDENT;\n\n  const targetTotalIndent = Math.min(\n    availableSpace * 0.3,\n    maxDepth * MAX_INDENT,\n  );\n  const baseIndent = targetTotalIndent / maxDepth;\n\n  return Math.max(MIN_INDENT, Math.min(MAX_INDENT, baseIndent));\n};\n\ninterface TreeNodeItemProps {\n  node: FlattenedNode;\n  nodeIndex: number;\n  hasChildren: boolean;\n  isCollapsed: boolean;\n  handleTreeNodeClick: (e: Event) => void;\n  handleTreeNodeToggle: (e: Event) => void;\n  searchValue: typeof searchState.value;\n}\n\nconst VALID_TYPES = ['memo', 'forwardRef', 'lazy', 'suspense'];\n\nconst parseTypeSearch = (query: string) => {\n  const typeMatch = query.match(/\\[(.*?)\\]/);\n  if (!typeMatch) return null;\n\n  const typeSearches: string[] = [];\n  const parts = typeMatch[1].split(',');\n  for (const part of parts) {\n    const trimmed = part.trim().toLowerCase();\n    if (trimmed) typeSearches.push(trimmed);\n  }\n\n  return typeSearches;\n};\n\nconst isValidTypeSearch = (typeSearches: string[]) => {\n  if (typeSearches.length === 0) return false;\n\n  for (const search of typeSearches) {\n    let isValid = false;\n    for (const validType of VALID_TYPES) {\n      if (validType.toLowerCase().includes(search)) {\n        isValid = true;\n        break;\n      }\n    }\n    if (!isValid) return false;\n  }\n  return true;\n};\n\nconst matchesTypeSearch = (\n  typeSearches: string[],\n  wrapperTypes: Array<{ type: string }>,\n) => {\n  if (typeSearches.length === 0) return true;\n  if (!wrapperTypes.length) return false;\n\n  for (const search of typeSearches) {\n    let foundMatch = false;\n    for (const wrapper of wrapperTypes) {\n      if (wrapper.type.toLowerCase().includes(search)) {\n        foundMatch = true;\n        break;\n      }\n    }\n    if (!foundMatch) return false;\n  }\n  return true;\n};\n\nconst useNodeHighlighting = (\n  node: FlattenedNode,\n  searchValue: typeof searchState.value,\n) => {\n  return useMemo(() => {\n    const { query, matches } = searchValue;\n    const isMatch = matches.some((match) => match.nodeId === node.nodeId);\n    const typeSearches = parseTypeSearch(query) || [];\n    const searchQuery = query ? query.replace(/\\[.*?\\]/, '').trim() : '';\n\n    if (!query || !isMatch) {\n      return {\n        highlightedText: <span className=\"truncate\">{node.label}</span>,\n        typeHighlight: false,\n      };\n    }\n\n    let matchesType = true;\n    if (typeSearches.length > 0) {\n      if (!node.fiber) {\n        matchesType = false;\n      } else {\n        const { wrapperTypes } = getExtendedDisplayName(node.fiber);\n        matchesType = matchesTypeSearch(typeSearches, wrapperTypes);\n      }\n    }\n\n    let textContent = <span className=\"truncate\">{node.label}</span>;\n    if (searchQuery) {\n      try {\n        if (searchQuery.startsWith('/') && searchQuery.endsWith('/')) {\n          const pattern = searchQuery.slice(1, -1);\n          const regex = new RegExp(`(${pattern})`, 'i');\n          const parts = node.label.split(regex);\n\n          textContent = (\n            <span className=\"tree-node-search-highlight\">\n              {parts.map((part, index) =>\n                regex.test(part) ? (\n                  <span\n                    key={`${node.nodeId}-${part}`}\n                    className={cn('regex', {\n                      start: regex.test(part) && index === 0,\n                      middle: regex.test(part) && index % 2 === 1,\n                      end: regex.test(part) && index === parts.length - 1,\n                      '!ml-0': index === 1,\n                    })}\n                  >\n                    {part}\n                  </span>\n                ) : (\n                  part\n                ),\n              )}\n            </span>\n          );\n        } else {\n          const lowerLabel = node.label.toLowerCase();\n          const lowerQuery = searchQuery.toLowerCase();\n          const index = lowerLabel.indexOf(lowerQuery);\n\n          if (index >= 0) {\n            textContent = (\n              <span className=\"tree-node-search-highlight\">\n                {node.label.slice(0, index)}\n                <span className=\"single\">\n                  {node.label.slice(index, index + searchQuery.length)}\n                </span>\n                {node.label.slice(index + searchQuery.length)}\n              </span>\n            );\n          }\n        }\n      } catch {}\n    }\n\n    return {\n      highlightedText: textContent,\n      typeHighlight: matchesType && typeSearches.length > 0,\n    };\n  }, [node.label, node.nodeId, node.fiber, searchValue]);\n};\n\nconst formatTime = (time: number) => {\n  if (time > 0) {\n    if (time < 0.1 - Number.EPSILON) {\n      return '< 0.1';\n    }\n    if (time < 1000) {\n      return Number(time.toFixed(1)).toString();\n    }\n    return `${(time / 1000).toFixed(1)}k`;\n  }\n  return '0';\n};\n\nconst TreeNodeItem = ({\n  node,\n  nodeIndex,\n  hasChildren,\n  isCollapsed,\n  handleTreeNodeClick,\n  handleTreeNodeToggle,\n  searchValue,\n}: TreeNodeItemProps) => {\n  const refRenderCount = useRef<HTMLSpanElement>(null);\n  const refPrevRenderCount = useRef(node.renderData?.renderCount ?? 0);\n\n  const { highlightedText, typeHighlight } = useNodeHighlighting(\n    node,\n    searchValue,\n  );\n\n  useEffect(() => {\n    const currentRenderCount = node.renderData?.renderCount;\n    const element = refRenderCount.current;\n    if (\n      !element ||\n      !refPrevRenderCount.current ||\n      !currentRenderCount ||\n      refPrevRenderCount.current === currentRenderCount\n    ) {\n      return;\n    }\n\n    element.classList.remove('count-flash');\n    void element.offsetWidth;\n    element.classList.add('count-flash');\n\n    refPrevRenderCount.current = currentRenderCount;\n  }, [node.renderData?.renderCount]);\n\n  const renderTimeInfo = useMemo(() => {\n    if (!node.renderData) return null;\n    const { selfTime, totalTime, renderCount } = node.renderData;\n\n    if (!renderCount) {\n      return null;\n    }\n\n    return (\n      <span\n        className={cn(\n          'flex items-center gap-x-0.5 ml-1.5',\n          'text-[10px] text-neutral-400',\n        )}\n      >\n        <span\n          ref={refRenderCount}\n          title={`Self time: ${formatTime(selfTime)}ms\\nTotal time: ${formatTime(totalTime)}ms`}\n          className=\"count-badge\"\n        >\n          ×{renderCount}\n        </span>\n      </span>\n    );\n  }, [node.renderData]);\n\n  const componentTypes = useMemo(() => {\n    if (!node.fiber) return null;\n    const { wrapperTypes } = getExtendedDisplayName(node.fiber);\n    const firstWrapperType = wrapperTypes[0];\n\n    return (\n      <span\n        className={cn(\n          'flex items-center gap-x-1',\n          'text-[10px] text-neutral-400 tracking-wide',\n          'overflow-hidden',\n        )}\n      >\n        {firstWrapperType && (\n          <>\n            <span\n              key={firstWrapperType.type}\n              title={firstWrapperType?.title}\n              className={cn(\n                'rounded py-[1px] px-1',\n                'bg-neutral-700 text-neutral-300',\n                'truncate',\n                firstWrapperType.type === 'memo' && 'bg-[#8e61e3] text-white',\n                typeHighlight && 'bg-yellow-300 text-black',\n              )}\n            >\n              {firstWrapperType.type}\n            </span>\n            {firstWrapperType.compiler && (\n              <span className=\"text-yellow-300 ml-1\">✨</span>\n            )}\n          </>\n        )}\n        {wrapperTypes.length > 1 && `×${wrapperTypes.length}`}\n        {renderTimeInfo}\n      </span>\n    );\n  }, [node.fiber, typeHighlight, renderTimeInfo]);\n\n  return (\n    <button\n      type=\"button\"\n      title={node.title}\n      data-index={nodeIndex}\n      className={cn(\n        'flex items-center gap-x-1',\n        'pl-1 pr-2',\n        'w-full h-7',\n        'text-left',\n        'rounded',\n        'cursor-pointer select-none',\n      )}\n      onClick={handleTreeNodeClick}\n    >\n      <button\n        type=\"button\"\n        data-index={nodeIndex}\n        onClick={handleTreeNodeToggle}\n        className={cn('w-6 h-6 flex items-center justify-center', 'text-left')}\n      >\n        {hasChildren && (\n          <Icon\n            name=\"icon-chevron-right\"\n            size={12}\n            className={cn('transition-transform', !isCollapsed && 'rotate-90')}\n          />\n        )}\n      </button>\n      {highlightedText}\n      {componentTypes}\n    </button>\n  );\n};\n\nexport const ComponentsTree = () => {\n  const refContainer = useRef<HTMLDivElement>(null);\n  const refMainContainer = useRef<HTMLDivElement>(null);\n  const refSearchInputContainer = useRef<HTMLDivElement>(null);\n  const refSearchInput = useRef<HTMLInputElement>(null);\n  const refSelectedElement = useRef<HTMLElement | null>(null);\n  const refMaxTreeDepth = useRef(0);\n  const refIsHovering = useRef(false);\n  const refIsResizing = useRef(false);\n  const refResizeHandle = useRef<HTMLDivElement>(null);\n\n  const [flattenedNodes, setFlattenedNodes] = useState<FlattenedNode[]>([]);\n  const [collapsedNodes, setCollapsedNodes] = useState<Set<string>>(new Set());\n  const [selectedIndex, setSelectedIndex] = useState<number | undefined>(\n    undefined,\n  );\n  const [searchValue, setSearchValue] = useState(searchState.value);\n\n  const visibleNodes = useMemo(() => {\n    const visible: FlattenedNode[] = [];\n    const nodes = flattenedNodes;\n    const nodeMap = new Map(nodes.map((node) => [node.nodeId, node]));\n\n    for (const node of nodes) {\n      let isVisible = true;\n\n      let currentNode = node;\n      while (currentNode.parentId) {\n        const parent = nodeMap.get(currentNode.parentId);\n        if (!parent) break;\n\n        if (collapsedNodes.has(parent.nodeId)) {\n          isVisible = false;\n          break;\n        }\n        currentNode = parent;\n      }\n\n      if (isVisible) {\n        visible.push(node);\n      }\n    }\n\n    return visible;\n  }, [collapsedNodes, flattenedNodes]);\n\n  const ITEM_HEIGHT = 28;\n\n  const { virtualItems, totalSize } = useVirtualList({\n    count: visibleNodes.length,\n    getScrollElement: () => refContainer.current,\n    estimateSize: () => ITEM_HEIGHT,\n    overscan: 5,\n  });\n\n  const handleElementClick = useCallback(\n    (element: HTMLElement) => {\n      refIsHovering.current = true;\n      refSearchInput.current?.blur();\n      signalSkipTreeUpdate.value = true;\n\n      const { parentCompositeFiber } =\n        getCompositeComponentFromElement(element);\n      if (!parentCompositeFiber) return;\n\n      Store.inspectState.value = {\n        kind: 'focused',\n        focusedDomElement: element,\n        fiber: parentCompositeFiber,\n      };\n\n      const nodeIndex = visibleNodes.findIndex(\n        (node) => node.element === element,\n      );\n      if (nodeIndex !== -1) {\n        setSelectedIndex(nodeIndex);\n        const itemTop = nodeIndex * ITEM_HEIGHT;\n        const container = refContainer.current;\n        if (container) {\n          const containerHeight = container.clientHeight;\n          const scrollTop = container.scrollTop;\n\n          if (\n            itemTop < scrollTop ||\n            itemTop + ITEM_HEIGHT > scrollTop + containerHeight\n          ) {\n            container.scrollTo({\n              top: Math.max(0, itemTop - containerHeight / 2),\n              behavior: 'instant',\n            });\n          }\n        }\n      }\n    },\n    [visibleNodes],\n  );\n\n  const handleTreeNodeClick = useCallback(\n    (e: Event) => {\n      const target = e.currentTarget as HTMLElement;\n      const index = Number(target.dataset.index);\n      if (Number.isNaN(index)) return;\n      const element = visibleNodes[index].element;\n      if (!element) return;\n      handleElementClick(element);\n    },\n    [visibleNodes, handleElementClick],\n  );\n\n  const handleToggle = useCallback((nodeId: string) => {\n    setCollapsedNodes((prev) => {\n      const next = new Set(prev);\n      if (next.has(nodeId)) {\n        next.delete(nodeId);\n      } else {\n        next.add(nodeId);\n      }\n      return next;\n    });\n  }, []);\n\n  const handleTreeNodeToggle = useCallback(\n    (e: Event) => {\n      e.stopPropagation();\n      const target = e.target as HTMLElement;\n      const index = Number(target.dataset.index);\n      if (Number.isNaN(index)) return;\n      const nodeId = visibleNodes[index].nodeId;\n      handleToggle(nodeId);\n    },\n    [visibleNodes, handleToggle],\n  );\n\n  const handleOnChangeSearch = useCallback(\n    (query: string) => {\n      refSearchInputContainer.current?.classList.remove('!border-red-500');\n      const matches: FlattenedNode[] = [];\n\n      if (!query) {\n        searchState.value = { query, matches, currentMatchIndex: -1 };\n        return;\n      }\n\n      if (query.includes('[') && !query.includes(']')) {\n        if (query.length > query.indexOf('[') + 1) {\n          refSearchInputContainer.current?.classList.add('!border-red-500');\n          return;\n        }\n      }\n\n      const typeSearches = parseTypeSearch(query) || [];\n      if (query.includes('[')) {\n        if (!isValidTypeSearch(typeSearches)) {\n          refSearchInputContainer.current?.classList.add('!border-red-500');\n          return;\n        }\n      }\n\n      const searchQuery = query.replace(/\\[.*?\\]/, '').trim();\n      const isRegex = /^\\/.*\\/$/.test(searchQuery);\n      let matchesLabel = (_label: string) => false;\n\n      if (searchQuery.startsWith('/') && !isRegex) {\n        if (searchQuery.length > 1) {\n          refSearchInputContainer.current?.classList.add('!border-red-500');\n          return;\n        }\n      }\n\n      if (isRegex) {\n        try {\n          const pattern = searchQuery.slice(1, -1);\n          const regex = new RegExp(pattern, 'i');\n          matchesLabel = (label: string) => regex.test(label);\n        } catch {\n          refSearchInputContainer.current?.classList.add('!border-red-500');\n          return;\n        }\n      } else if (searchQuery) {\n        const lowerQuery = searchQuery.toLowerCase();\n        matchesLabel = (label: string) =>\n          label.toLowerCase().includes(lowerQuery);\n      }\n\n      for (const node of flattenedNodes) {\n        let matchesSearch = true;\n\n        if (searchQuery) {\n          matchesSearch = matchesLabel(node.label);\n        }\n\n        if (matchesSearch && typeSearches.length > 0) {\n          if (!node.fiber) {\n            matchesSearch = false;\n          } else {\n            const { wrapperTypes } = getExtendedDisplayName(node.fiber);\n            matchesSearch = matchesTypeSearch(typeSearches, wrapperTypes);\n          }\n        }\n\n        if (matchesSearch) {\n          matches.push(node);\n        }\n      }\n\n      searchState.value = {\n        query,\n        matches,\n        currentMatchIndex: matches.length > 0 ? 0 : -1,\n      };\n\n      if (matches.length > 0) {\n        const firstMatch = matches[0];\n        const nodeIndex = visibleNodes.findIndex(\n          (node) => node.nodeId === firstMatch.nodeId,\n        );\n        if (nodeIndex !== -1) {\n          const itemTop = nodeIndex * ITEM_HEIGHT;\n          const container = refContainer.current;\n          if (container) {\n            const containerHeight = container.clientHeight;\n            container.scrollTo({\n              top: Math.max(0, itemTop - containerHeight / 2),\n              behavior: 'instant',\n            });\n          }\n        }\n      }\n    },\n    [flattenedNodes, visibleNodes],\n  );\n\n  const handleInputChange = useCallback(\n    (e: Event) => {\n      const target = e.currentTarget as HTMLInputElement;\n      if (!target) return;\n      handleOnChangeSearch(target.value);\n    },\n    [handleOnChangeSearch],\n  );\n\n  const navigateSearch = useCallback(\n    (direction: 'next' | 'prev') => {\n      const { matches, currentMatchIndex } = searchState.value;\n      if (matches.length === 0) return;\n\n      const newIndex =\n        direction === 'next'\n          ? (currentMatchIndex + 1) % matches.length\n          : (currentMatchIndex - 1 + matches.length) % matches.length;\n\n      searchState.value = {\n        ...searchState.value,\n        currentMatchIndex: newIndex,\n      };\n\n      const currentMatch = matches[newIndex];\n      const nodeIndex = visibleNodes.findIndex(\n        (node) => node.nodeId === currentMatch.nodeId,\n      );\n      if (nodeIndex !== -1) {\n        setSelectedIndex(nodeIndex);\n        const itemTop = nodeIndex * ITEM_HEIGHT;\n        const container = refContainer.current;\n        if (container) {\n          const containerHeight = container.clientHeight;\n          container.scrollTo({\n            top: Math.max(0, itemTop - containerHeight / 2),\n            behavior: 'instant',\n          });\n        }\n      }\n    },\n    [visibleNodes],\n  );\n\n  const updateContainerWidths = useCallback((width: number) => {\n    if (refMainContainer.current) {\n      refMainContainer.current.style.width = `${width}px`;\n    }\n    if (refContainer.current) {\n      refContainer.current.style.width = `${width}px`;\n      const indentSize = calculateIndentSize(width, refMaxTreeDepth.current);\n      refContainer.current.style.setProperty(\n        '--indentation-size',\n        `${indentSize}px`,\n      );\n    }\n  }, []);\n\n  const updateResizeDirection = useCallback((width: number) => {\n    if (!refResizeHandle.current) return;\n\n    const parentWidth = signalWidget.value.dimensions.width;\n    const maxWidth = Math.floor(parentWidth - (MIN_CONTAINER_WIDTH / 2));\n\n    refResizeHandle.current.classList.remove(\n      'cursor-ew-resize',\n      'cursor-w-resize',\n      'cursor-e-resize',\n    );\n\n    if (width <= MIN_CONTAINER_WIDTH) {\n      refResizeHandle.current.classList.add('cursor-w-resize');\n    } else if (width >= maxWidth) {\n      refResizeHandle.current.classList.add('cursor-e-resize');\n    } else {\n      refResizeHandle.current.classList.add('cursor-ew-resize');\n    }\n  }, []);\n\n  const handleResize = useCallback(\n    (e: MouseEvent) => {\n      e.preventDefault();\n      e.stopPropagation();\n\n      if (!refContainer.current) return;\n      refContainer.current.style.setProperty('pointer-events', 'none');\n\n      refIsResizing.current = true;\n\n      const startX = e.clientX;\n      const startWidth = refContainer.current.offsetWidth;\n      const parentWidth = signalWidget.value.dimensions.width;\n      const maxWidth = Math.floor(parentWidth - (MIN_CONTAINER_WIDTH / 2));\n\n      updateResizeDirection(startWidth);\n\n      const handlePointerMove = (e: PointerEvent) => {\n        const delta = startX - e.clientX;\n        const newWidth = startWidth + delta;\n        updateResizeDirection(newWidth);\n\n        const clampedWidth = Math.min(\n          maxWidth,\n          Math.max(MIN_CONTAINER_WIDTH, newWidth),\n        );\n        updateContainerWidths(clampedWidth);\n      };\n\n      const handlePointerUp = () => {\n        if (!refContainer.current) return;\n        refContainer.current.style.removeProperty('pointer-events');\n        document.removeEventListener('pointermove', handlePointerMove);\n        document.removeEventListener('pointerup', handlePointerUp);\n\n        signalWidget.value = {\n          ...signalWidget.value,\n          componentsTree: {\n            ...signalWidget.value.componentsTree,\n            width: refContainer.current.offsetWidth,\n          },\n        };\n\n        saveLocalStorage(LOCALSTORAGE_KEY, signalWidget.value);\n        refIsResizing.current = false;\n      };\n\n      document.addEventListener('pointermove', handlePointerMove);\n      document.addEventListener('pointerup', handlePointerUp);\n    },\n    [updateContainerWidths, updateResizeDirection],\n  );\n\n  useEffect(() => {\n    if (!refContainer.current) return;\n    const currentWidth = refContainer.current.offsetWidth;\n    updateResizeDirection(currentWidth);\n\n    return signalWidget.subscribe(() => {\n      if (!refContainer.current) return;\n      updateResizeDirection(refContainer.current.offsetWidth);\n    });\n  }, [updateResizeDirection]);\n\n  const onPointerLeave = useCallback(() => {\n    refIsHovering.current = false;\n  }, []);\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    let isInitialTreeBuild = true;\n    const buildTreeFromElements = (elements: Array<InspectableElement>) => {\n      const nodeMap = new Map<HTMLElement, TreeNode>();\n      const rootNodes: TreeNode[] = [];\n\n      for (const { element, name, fiber } of elements) {\n        if (!element) continue;\n\n        let title = name;\n        const { name: componentName, wrappers } = getExtendedDisplayName(fiber);\n        if (componentName) {\n          if (wrappers.length > 0) {\n            title = `${wrappers.join('(')}(${componentName})${')'.repeat(wrappers.length)}`;\n          } else {\n            title = componentName;\n          }\n        }\n\n        nodeMap.set(element, {\n          label: componentName || name,\n          title,\n          children: [],\n          element,\n          fiber,\n        });\n      }\n\n      for (const { element, depth } of elements) {\n        if (!element) continue;\n        const node = nodeMap.get(element);\n        if (!node) continue;\n\n        if (depth === 0) {\n          rootNodes.push(node);\n        } else {\n          let parent = element.parentElement;\n          while (parent) {\n            const parentNode = nodeMap.get(parent);\n            if (parentNode) {\n              parentNode.children = parentNode.children || [];\n              parentNode.children.push(node);\n              break;\n            }\n            parent = parent.parentElement;\n          }\n        }\n      }\n\n      return rootNodes;\n    };\n\n    const updateTree = () => {\n      const element = refSelectedElement.current;\n      if (!element) return;\n\n      const inspectableElements = getInspectableElements();\n      const tree = buildTreeFromElements(inspectableElements);\n\n      if (tree.length > 0) {\n        const flattened = flattenTree(tree);\n        const newMaxDepth = getMaxDepth(flattened);\n        refMaxTreeDepth.current = newMaxDepth;\n\n        updateContainerWidths(signalWidget.value.componentsTree.width);\n        setFlattenedNodes(flattened);\n\n        if (isInitialTreeBuild) {\n          isInitialTreeBuild = false;\n          const focusedIndex = flattened.findIndex(\n            (node) => node.element === element,\n          );\n          if (focusedIndex !== -1) {\n            const itemTop = focusedIndex * ITEM_HEIGHT;\n            const container = refContainer.current;\n            if (container) {\n              setTimeout(() => {\n                container.scrollTo({\n                  top: itemTop,\n                  behavior: 'instant',\n                });\n              }, 96);\n            }\n          }\n        }\n      }\n    };\n\n    const unsubscribeStore = Store.inspectState.subscribe((state) => {\n      if (state.kind === 'focused') {\n        if (signalSkipTreeUpdate.value) {\n          return;\n        }\n\n        handleOnChangeSearch('');\n        refSelectedElement.current = state.focusedDomElement as HTMLElement;\n        updateTree();\n      }\n    });\n\n    let rafId = 0;\n    const unsubscribeUpdates = inspectorUpdateSignal.subscribe(() => {\n      if (Store.inspectState.value.kind === 'focused') {\n        cancelAnimationFrame(rafId);\n        if (refIsResizing.current) return;\n\n        rafId = requestAnimationFrame(() => {\n          signalSkipTreeUpdate.value = false;\n          updateTree();\n        });\n      }\n    });\n\n    return () => {\n      unsubscribeStore();\n      unsubscribeUpdates();\n\n      searchState.value = {\n        query: '',\n        matches: [],\n        currentMatchIndex: -1,\n      };\n    };\n  }, []);\n\n  useEffect(() => {\n    const handleKeyDown = (e: KeyboardEvent) => {\n      if (!refIsHovering.current) return;\n\n      if (!selectedIndex) return;\n\n      switch (e.key) {\n        case 'ArrowUp': {\n          e.preventDefault();\n          e.stopPropagation();\n\n          if (selectedIndex > 0) {\n            const currentNode = visibleNodes[selectedIndex - 1];\n            if (currentNode?.element) {\n              handleElementClick(currentNode.element);\n            }\n          }\n          return;\n        }\n        case 'ArrowDown': {\n          e.preventDefault();\n          e.stopPropagation();\n\n          if (selectedIndex < visibleNodes.length - 1) {\n            const currentNode = visibleNodes[selectedIndex + 1];\n            if (currentNode?.element) {\n              handleElementClick(currentNode.element);\n            }\n          }\n          return;\n        }\n        case 'ArrowLeft': {\n          e.preventDefault();\n          e.stopPropagation();\n\n          const currentNode = visibleNodes[selectedIndex];\n          if (currentNode?.nodeId) {\n            handleToggle(currentNode.nodeId);\n          }\n          return;\n        }\n        case 'ArrowRight': {\n          e.preventDefault();\n          e.stopPropagation();\n\n          const currentNode = visibleNodes[selectedIndex];\n          if (currentNode?.nodeId) {\n            handleToggle(currentNode.nodeId);\n          }\n          return;\n        }\n      }\n    };\n\n    document.addEventListener('keydown', handleKeyDown);\n    return () => {\n      document.removeEventListener('keydown', handleKeyDown);\n    };\n  }, [selectedIndex, visibleNodes, handleElementClick, handleToggle]);\n\n  useEffect(() => {\n    return searchState.subscribe(setSearchValue);\n  }, []);\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    const unsubscribe = signalWidget.subscribe((state) => {\n      refMainContainer.current?.style.setProperty('transition', 'width 0.1s');\n      updateContainerWidths(state.componentsTree.width);\n\n      setTimeout(() => {\n        refMainContainer.current?.style.removeProperty('transition');\n      }, 500);\n    });\n    return unsubscribe;\n  }, []);\n\n  return (\n    <div className=\"react-scan-components-tree flex\">\n      <div\n        ref={refResizeHandle}\n        onPointerDown={handleResize}\n        className=\"relative resize-v-line\"\n      >\n        <span>\n          <Icon name=\"icon-ellipsis\" size={18} />\n        </span>\n      </div>\n      <div ref={refMainContainer} className=\"flex flex-col h-full\">\n        <div className=\"p-2 border-b border-[#1e1e1e]\">\n          <div\n            ref={refSearchInputContainer}\n            title={`Search components by:\n\n• Name (e.g., \"Button\") — Case insensitive, matches any part\n\n• Regular Expression (e.g., \"/^Button/\") — Use forward slashes\n\n• Wrapper Type (e.g., \"[memo,forwardRef]\"):\n   - Available types: memo, forwardRef, lazy, suspense\n   - Matches any part of type name (e.g., \"mo\" matches \"memo\")\n   - Use commas for multiple types\n\n• Combined Search:\n   - Mix name/regex with type: \"button [for]\"\n   - Will match components satisfying both conditions\n\n• Navigation:\n   - Enter → Next match\n   - Shift + Enter → Previous match\n   - Cmd/Ctrl + Enter → Select and focus match\n`}\n            className={cn(\n              'relative',\n              'flex items-center gap-x-1 px-2',\n              'rounded',\n              'border border-transparent',\n              'focus-within:border-[#454545]',\n              'bg-[#1e1e1e] text-neutral-300',\n              'transition-colors',\n              'whitespace-nowrap',\n              'overflow-hidden',\n            )}\n          >\n            <Icon name=\"icon-search\" size={12} className=\" text-neutral-500\" />\n            <div className=\"relative flex-1 h-7 overflow-hidden\">\n              <input\n                ref={refSearchInput}\n                type=\"text\"\n                value={searchState.value.query}\n                onClick={(e) => {\n                  e.stopPropagation();\n                  e.currentTarget.focus();\n                }}\n                onPointerDown={(e) => {\n                  e.stopPropagation();\n                }}\n                onKeyDown={(e) => {\n                  if (e.key === 'Escape') {\n                    e.currentTarget.blur();\n                  }\n                  if (searchState.value.matches.length) {\n                    if (e.key === 'Enter' && e.shiftKey) {\n                      navigateSearch('prev');\n                    } else if (e.key === 'Enter') {\n                      if (e.metaKey || e.ctrlKey) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        handleElementClick(\n                          searchState.value.matches[\n                            searchState.value.currentMatchIndex\n                          ].element as HTMLElement,\n                        );\n\n                        e.currentTarget.focus();\n                      } else {\n                        navigateSearch('next');\n                      }\n                    }\n                  }\n                }}\n                onChange={handleInputChange}\n                className=\"absolute inset-y-0 inset-x-1\"\n                placeholder=\"Component name, /regex/, or [type]\"\n              />\n            </div>\n            {searchState.value.query ? (\n              <>\n                <span className=\"flex items-center gap-x-0.5 text-xs text-neutral-500\">\n                  {searchState.value.currentMatchIndex + 1}\n                  {'|'}\n                  {searchState.value.matches.length}\n                </span>\n                {!!searchState.value.matches.length && (\n                  <>\n                    <button\n                      type=\"button\"\n                      onClick={(e) => {\n                        e.stopPropagation();\n                        navigateSearch('prev');\n                      }}\n                      className=\"button rounded w-4 h-4 flex items-center justify-center text-neutral-400 hover:text-neutral-300\"\n                    >\n                      <Icon\n                        name=\"icon-chevron-right\"\n                        className=\"-rotate-90\"\n                        size={12}\n                      />\n                    </button>\n                    <button\n                      type=\"button\"\n                      onClick={(e) => {\n                        e.stopPropagation();\n                        navigateSearch('next');\n                      }}\n                      className=\"button rounded w-4 h-4 flex items-center justify-center text-neutral-400 hover:text-neutral-300\"\n                    >\n                      <Icon\n                        name=\"icon-chevron-right\"\n                        className=\"rotate-90\"\n                        size={12}\n                      />\n                    </button>\n                  </>\n                )}\n                <button\n                  type=\"button\"\n                  onClick={(e) => {\n                    e.stopPropagation();\n                    handleOnChangeSearch('');\n                  }}\n                  className=\"button rounded w-4 h-4 flex items-center justify-center text-neutral-400 hover:text-neutral-300\"\n                >\n                  <Icon name=\"icon-close\" size={12} />\n                </button>\n              </>\n            ) : (\n              !!flattenedNodes.length && (\n                <span className=\"text-xs text-neutral-500\">\n                  {flattenedNodes.length}\n                </span>\n              )\n            )}\n          </div>\n        </div>\n        <div className=\"flex-1 overflow-hidden\">\n          <div\n            ref={refContainer}\n            onPointerLeave={onPointerLeave}\n            className=\"tree h-full overflow-auto will-change-transform\"\n          >\n            <div\n              className=\"relative w-full\"\n              style={{\n                height: totalSize,\n              }}\n            >\n              {virtualItems.map((virtualItem) => {\n                const node = visibleNodes[virtualItem.index];\n                if (!node) return null;\n\n                const isSelected =\n                  Store.inspectState.value.kind === 'focused' &&\n                  node.element === Store.inspectState.value.focusedDomElement;\n                const isKeyboardSelected = virtualItem.index === selectedIndex;\n\n                return (\n                  <div\n                    key={node.nodeId}\n                    className={cn(\n                      'absolute left-0 w-full overflow-hidden',\n                      'text-neutral-400 hover:text-neutral-300',\n                      'bg-transparent hover:bg-[#5f3f9a]/20',\n                      (isSelected || isKeyboardSelected) &&\n                        'text-neutral-300 bg-[#5f3f9a]/40 hover:bg-[#5f3f9a]/40',\n                    )}\n                    style={{\n                      top: virtualItem.start,\n                      height: ITEM_HEIGHT,\n                    }}\n                  >\n                    <div\n                      className=\"w-full h-full\"\n                      style={{\n                        paddingLeft: `calc(${node.depth} * var(--indentation-size))`,\n                      }}\n                    >\n                      <TreeNodeItem\n                        node={node}\n                        nodeIndex={virtualItem.index}\n                        hasChildren={!!node.children?.length}\n                        isCollapsed={collapsedNodes.has(node.nodeId)}\n                        handleTreeNodeClick={handleTreeNodeClick}\n                        handleTreeNodeToggle={handleTreeNodeToggle}\n                        searchValue={searchValue}\n                      />\n                    </div>\n                  </div>\n                );\n              })}\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n","import {\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'preact/hooks';\n\nexport interface VirtualItem {\n  key: number;\n  index: number;\n  start: number;\n}\n\nexport const useVirtualList = (options: {\n  count: number;\n  getScrollElement: () => HTMLElement | null;\n  estimateSize: () => number;\n  overscan?: number;\n}) => {\n  const { count, getScrollElement, estimateSize, overscan = 5 } = options;\n  const [scrollTop, setScrollTop] = useState(0);\n  const [containerHeight, setContainerHeight] = useState(0);\n  const refResizeObserver = useRef<ResizeObserver>();\n  const refScrollElement = useRef<HTMLElement | null>(null);\n  const refRafId = useRef<number | null>(null);\n  const itemHeight = estimateSize();\n\n  const updateContainer = useCallback((entries?: ResizeObserverEntry[]) => {\n    if (!refScrollElement.current) return;\n\n    const height =\n      entries?.[0]?.contentRect.height ??\n      refScrollElement.current.getBoundingClientRect().height;\n    setContainerHeight(height);\n  }, []);\n\n  const debouncedUpdateContainer = useCallback(() => {\n    if (refRafId.current !== null) {\n      cancelAnimationFrame(refRafId.current);\n    }\n    refRafId.current = requestAnimationFrame(() => {\n      updateContainer();\n      refRafId.current = null;\n    });\n  }, [updateContainer]);\n\n  useEffect(() => {\n    const element = getScrollElement();\n    if (!element) return;\n\n    refScrollElement.current = element;\n\n    const handleScroll = () => {\n      if (!refScrollElement.current) return;\n      setScrollTop(refScrollElement.current.scrollTop);\n    };\n\n    updateContainer();\n\n    if (!refResizeObserver.current) {\n      refResizeObserver.current = new ResizeObserver(() => {\n        debouncedUpdateContainer();\n      });\n    }\n    refResizeObserver.current.observe(element);\n\n    element.addEventListener('scroll', handleScroll, { passive: true });\n\n    const mutationObserver = new MutationObserver(debouncedUpdateContainer);\n    mutationObserver.observe(element, {\n      attributes: true,\n      childList: true,\n      subtree: true,\n    });\n\n    return () => {\n      element.removeEventListener('scroll', handleScroll);\n      if (refResizeObserver.current) {\n        refResizeObserver.current.disconnect();\n      }\n      mutationObserver.disconnect();\n      if (refRafId.current !== null) {\n        cancelAnimationFrame(refRafId.current);\n      }\n    };\n  }, [getScrollElement, updateContainer, debouncedUpdateContainer]);\n\n  const visibleRange = useMemo(() => {\n    const start = Math.floor(scrollTop / itemHeight);\n    const visibleCount = Math.ceil(containerHeight / itemHeight);\n\n    return {\n      start: Math.max(0, start - overscan),\n      end: Math.min(count, start + visibleCount + overscan),\n    };\n  }, [scrollTop, itemHeight, containerHeight, count, overscan]);\n\n  const items = useMemo(() => {\n    const virtualItems: VirtualItem[] = [];\n    for (let index = visibleRange.start; index < visibleRange.end; index++) {\n      virtualItems.push({\n        key: index,\n        index,\n        start: index * itemHeight,\n      });\n    }\n    return virtualItems;\n  }, [visibleRange, itemHeight]);\n\n  return {\n    virtualItems: items,\n    totalSize: count * itemHeight,\n    scrollTop,\n    containerHeight,\n  };\n};\n","import type { Fiber } from 'bippy';\n\nexport const getFiberPath = (fiber: Fiber): string => {\n  const pathSegments: string[] = [];\n  let currentFiber: Fiber | null = fiber;\n\n  while (currentFiber) {\n    const elementType = currentFiber.elementType;\n    const name =\n      typeof elementType === 'function'\n        ? elementType.displayName || elementType.name\n        : typeof elementType === 'string'\n          ? elementType\n          : 'Unknown';\n\n    const index =\n      currentFiber.index !== undefined ? `[${currentFiber.index}]` : '';\n    pathSegments.unshift(`${name}${index}`);\n\n    currentFiber = currentFiber.return ?? null;\n  }\n\n  return pathSegments.join('::');\n};\n","import { signal } from '@preact/signals';\nimport type { Fiber } from 'bippy';\nimport type { ComponentType } from 'preact';\nimport { flashManager } from './flash-overlay';\nimport { type SectionData, resetTracking } from './timeline/utils';\n\nexport interface MinimalFiberInfo {\n  id?: string | number;\n  key: string | null;\n  type: ComponentType<unknown> | string;\n  displayName: string;\n  selfTime: number;\n  totalTime: number;\n}\n\nexport interface TimelineUpdate {\n  timestamp: number;\n  fiberInfo: MinimalFiberInfo;\n  props: SectionData;\n  state: SectionData;\n  context: SectionData;\n  stateNames: string[];\n}\n\nexport interface TimelineState {\n  updates: Array<TimelineUpdate>;\n  currentFiber: Fiber | null;\n  totalUpdates: number;\n  windowOffset: number;\n  currentIndex: number;\n  isViewingHistory: boolean;\n  latestFiber: Fiber | null;\n  isVisible: boolean;\n  playbackSpeed: 1 | 2 | 4;\n}\n\nexport const TIMELINE_MAX_UPDATES = 1000;\n\nexport const timelineStateDefault: TimelineState = {\n  updates: [],\n  currentFiber: null,\n  totalUpdates: 0,\n  windowOffset: 0,\n  currentIndex: 0,\n  isViewingHistory: false,\n  latestFiber: null,\n  isVisible: false,\n  playbackSpeed: 1,\n};\n\nexport const timelineState = signal<TimelineState>(timelineStateDefault);\n\nexport const inspectorUpdateSignal = signal<number>(0);\n\nlet pendingUpdates: Array<{ update: TimelineUpdate; fiber: Fiber | null }> = [];\nlet batchTimeout: ReturnType<typeof setTimeout> | null = null;\n\nconst batchUpdates = () => {\n  if (pendingUpdates.length === 0) return;\n\n  const batchedUpdates = [...pendingUpdates];\n\n  const { updates, totalUpdates, currentIndex, isViewingHistory } =\n    timelineState.value;\n  const newUpdates = [...updates];\n  let newTotalUpdates = totalUpdates;\n\n  for (const { update } of batchedUpdates) {\n    if (newUpdates.length >= TIMELINE_MAX_UPDATES) {\n      newUpdates.shift();\n    }\n    newUpdates.push(update);\n    newTotalUpdates++;\n  }\n\n  const newWindowOffset = Math.max(0, newTotalUpdates - TIMELINE_MAX_UPDATES);\n\n  let newCurrentIndex: number;\n  if (isViewingHistory) {\n    if (currentIndex === totalUpdates - 1) {\n      newCurrentIndex = newUpdates.length - 1;\n    } else if (currentIndex === 0) {\n      newCurrentIndex = 0;\n    } else {\n      if (newWindowOffset === 0) {\n        newCurrentIndex = currentIndex;\n      } else {\n        newCurrentIndex = currentIndex - 1;\n      }\n    }\n  } else {\n    newCurrentIndex = newUpdates.length - 1;\n  }\n\n  const lastUpdate = batchedUpdates[batchedUpdates.length - 1];\n\n  timelineState.value = {\n    ...timelineState.value,\n    latestFiber: lastUpdate.fiber,\n    updates: newUpdates,\n    totalUpdates: newTotalUpdates,\n    windowOffset: newWindowOffset,\n    currentIndex: newCurrentIndex,\n    isViewingHistory,\n  };\n\n  // Only after signal is updated, remove the processed updates\n  pendingUpdates = pendingUpdates.slice(batchedUpdates.length);\n};\n\nexport const timelineActions = {\n  showTimeline: () => {\n    timelineState.value = {\n      ...timelineState.value,\n      isVisible: true,\n    };\n  },\n\n  hideTimeline: () => {\n    timelineState.value = {\n      ...timelineState.value,\n      isVisible: false,\n      currentIndex: timelineState.value.updates.length - 1,\n    };\n  },\n\n  updateFrame: (index: number, isViewingHistory: boolean) => {\n    timelineState.value = {\n      ...timelineState.value,\n      currentIndex: index,\n      isViewingHistory,\n    };\n  },\n\n  updatePlaybackSpeed: (speed: TimelineState['playbackSpeed']) => {\n    timelineState.value = {\n      ...timelineState.value,\n      playbackSpeed: speed,\n    };\n  },\n\n  addUpdate: (update: TimelineUpdate, latestFiber: Fiber | null) => {\n    pendingUpdates.push({ update, fiber: latestFiber });\n\n    if (!batchTimeout) {\n      const processBatch = () => {\n        batchUpdates();\n\n        batchTimeout = null;\n\n        if (pendingUpdates.length > 0) {\n          batchTimeout = setTimeout(processBatch, 96);\n        }\n      };\n\n      batchTimeout = setTimeout(processBatch, 96);\n    }\n  },\n\n  reset: () => {\n    if (batchTimeout) {\n      clearTimeout(batchTimeout);\n      batchTimeout = null;\n    }\n    pendingUpdates = [];\n    timelineState.value = timelineStateDefault;\n  },\n};\n\nexport const globalInspectorState = {\n  lastRendered: new Map<string, unknown>(),\n  expandedPaths: new Set<string>(),\n  cleanup: () => {\n    globalInspectorState.lastRendered.clear();\n    globalInspectorState.expandedPaths.clear();\n    flashManager.cleanupAll();\n    resetTracking();\n    timelineState.value = timelineStateDefault;\n  },\n};\n","interface FlashEntry {\n  element: HTMLElement;\n  overlay: HTMLElement;\n  scrollCleanup?: () => void;\n}\n\nconst fadeOutTimers = new WeakMap<HTMLElement, ReturnType<typeof setTimeout>>();\n\nconst trackElementPosition = (\n  element: Element,\n  callback: (element: Element) => void,\n): (() => void) => {\n  const handleScroll = callback.bind(null, element);\n\n  document.addEventListener('scroll', handleScroll, {\n    passive: true,\n    capture: true,\n  });\n\n  return () => {\n    document.removeEventListener('scroll', handleScroll, { capture: true });\n  };\n};\n\nexport const flashManager = {\n  activeFlashes: new Map<HTMLElement, FlashEntry>(),\n\n  create(container: HTMLElement) {\n    const existingOverlay = container.querySelector(\n      '.react-scan-flash-overlay',\n    );\n\n    const overlay =\n      existingOverlay instanceof HTMLElement\n        ? existingOverlay\n        : (() => {\n            const newOverlay = document.createElement('div');\n            newOverlay.className = 'react-scan-flash-overlay';\n            container.appendChild(newOverlay);\n\n            const scrollCleanup = trackElementPosition(container, () => {\n              if (container.querySelector('.react-scan-flash-overlay')) {\n                this.create(container);\n              }\n            });\n\n            this.activeFlashes.set(container, {\n              element: container,\n              overlay: newOverlay,\n              scrollCleanup,\n            });\n\n            return newOverlay;\n          })();\n\n    const existingTimer = fadeOutTimers.get(overlay);\n    if (existingTimer) {\n      clearTimeout(existingTimer);\n      fadeOutTimers.delete(overlay);\n    }\n\n    requestAnimationFrame(() => {\n      overlay.style.transition = 'none';\n      overlay.style.opacity = '0.9';\n\n      const timerId = setTimeout(() => {\n        overlay.style.transition = 'opacity 150ms ease-out';\n        overlay.style.opacity = '0';\n\n        const cleanupTimer = setTimeout(() => {\n          if (overlay.parentNode) {\n            overlay.parentNode.removeChild(overlay);\n          }\n          const entry = this.activeFlashes.get(container);\n          if (entry?.scrollCleanup) {\n            entry.scrollCleanup();\n          }\n          this.activeFlashes.delete(container);\n          fadeOutTimers.delete(overlay);\n        }, 150);\n\n        fadeOutTimers.set(overlay, cleanupTimer);\n      }, 300);\n\n      fadeOutTimers.set(overlay, timerId);\n    });\n  },\n\n  cleanup(container: HTMLElement) {\n    const entry = this.activeFlashes.get(container);\n    if (entry) {\n      const existingTimer = fadeOutTimers.get(entry.overlay);\n      if (existingTimer) {\n        clearTimeout(existingTimer);\n        fadeOutTimers.delete(entry.overlay);\n      }\n      if (entry.overlay.parentNode) {\n        entry.overlay.parentNode.removeChild(entry.overlay);\n      }\n      if (entry.scrollCleanup) {\n        entry.scrollCleanup();\n      }\n      this.activeFlashes.delete(container);\n    }\n  },\n\n  cleanupAll() {\n    for (const [, entry] of this.activeFlashes) {\n      this.cleanup(entry.element);\n    }\n  },\n};\n","import { signal } from '@preact/signals';\nimport type { Fiber } from 'bippy';\nimport type { RenderData } from '~core/instrumentation';\n\nexport interface TreeNode {\n  label: string;\n  title?: string;\n  fiber: Fiber;\n  element?: HTMLElement;\n  children?: TreeNode[];\n  renderData?: RenderData;\n}\n\nexport interface FlattenedNode extends TreeNode {\n  depth: number;\n  nodeId: string;\n  parentId: string | null;\n  fiber: Fiber;\n}\n\nexport const searchState = signal<{\n  query: string;\n  matches: FlattenedNode[];\n  currentMatchIndex: number;\n}>({\n  query: '',\n  matches: [],\n  currentMatchIndex: -1,\n});\n\nexport interface TreeItem {\n  name: string;\n  depth: number;\n  element: HTMLElement;\n  fiber: Fiber;\n}\n\nexport const signalSkipTreeUpdate = /* @__PURE__ */ signal(false);\n","import { type ReactNode, memo } from 'preact/compat';\nimport {\n  type Dispatch,\n  type StateUpdater,\n  useEffect,\n  useRef,\n  useState,\n} from 'preact/hooks';\nimport { CopyToClipboard } from '~web/components/copy-to-clipboard';\nimport { Icon } from '~web/components/icon';\nimport { cn, throttle } from '~web/utils/helpers';\nimport { DiffValueView } from './diff-value';\nimport { timelineState } from './states';\nimport {\n  AggregatedChanges,\n  formatFunctionPreview,\n  formatPath,\n  getObjectDiff,\n  safeGetValue,\n} from './utils';\nimport {\n  calculateTotalChanges,\n  useInspectedFiberChangeStore,\n} from './whats-changed/use-change-store';\nimport { getDisplayName, getType } from 'bippy';\nimport { Store } from '~core/index';\n\nexport type Setter<T> = Dispatch<StateUpdater<T>>;\n\nexport const WhatChanged = /* @__PURE__ */ memo(() => {\n  const [isExpanded, setIsExpanded] = useState(true);\n  const aggregatedChanges = useInspectedFiberChangeStore();\n\n  const [hasInitialized, setHasInitialized] = useState(false);\n  const hasAnyChanges = calculateTotalChanges(aggregatedChanges) > 0;\n  useEffect(() => {\n    if (!hasInitialized && hasAnyChanges) {\n      const timer = setTimeout(() => {\n        setHasInitialized(true);\n        requestAnimationFrame(() => {\n          setIsExpanded(true);\n        });\n      }, 0);\n      return () => clearTimeout(timer);\n    }\n  }, [hasInitialized, hasAnyChanges]);\n\n  const initializedContextChanges = new Map(\n    Array.from(aggregatedChanges.contextChanges.entries())\n      .filter(([, value]) => value.kind === 'initialized')\n      .map(([key, value]) => [\n        key,\n        // oxlint-disable-next-line typescript/no-non-null-assertion\n        value.kind === 'partially-initialized' ? null! : value.changes,\n      ]),\n  );\n\n  const fiber =\n    Store.inspectState.value.kind === 'focused'\n      ? Store.inspectState.value.fiber\n      : null;\n\n  if (!fiber) {\n    // invariant\n    return;\n  }\n  return (\n    <>\n      <WhatsChangedHeader />\n\n      <div className=\"overflow-hidden h-full flex flex-col gap-y-2\">\n        <div className=\"flex flex-col gap-2 px-3 pt-2\">\n          <span className=\"text-sm font-medium text-[#888]\">\n            Why did{' '}\n            <span className=\"text-[#A855F7]\">{getDisplayName(fiber)}</span>{' '}\n            render?\n          </span>\n          {!hasAnyChanges && (\n            <div className=\"text-sm text-[#737373] bg-[#1E1E1E] rounded-md p-4 flex flex-col gap-4\">\n              <div>No changes detected since selecting</div>\n              <div>\n                The props, state, and context changes within your component will\n                be reported here\n              </div>\n            </div>\n          )}\n        </div>\n        <div\n          className={cn(\n            'flex flex-col gap-y-2 pl-3 relative overflow-y-auto h-full',\n          )}\n        >\n          <Section\n            changes={aggregatedChanges.propsChanges}\n            title=\"Changed Props\"\n            isExpanded={isExpanded}\n          />\n          <Section\n            renderName={(name) =>\n              renderStateName(\n                name,\n                getDisplayName(getType(fiber)) ?? 'Unknown Component',\n              )\n            }\n            changes={aggregatedChanges.stateChanges}\n            title=\"Changed State\"\n            isExpanded={isExpanded}\n          />\n          <Section\n            changes={initializedContextChanges}\n            title=\"Changed Context\"\n            isExpanded={isExpanded}\n          />\n        </div>\n      </div>\n    </>\n  );\n});\n\nconst renderStateName = (key: string, componentName: string) => {\n  if (Number.isNaN(Number(key))) {\n    return key;\n  }\n\n  const n = Number.parseInt(key);\n  const getOrdinalSuffix = (num: number) => {\n    const lastDigit = num % 10;\n    const lastTwoDigits = num % 100;\n    if (lastTwoDigits >= 11 && lastTwoDigits <= 13) {\n      return 'th';\n    }\n    switch (lastDigit) {\n      case 1:\n        return 'st';\n      case 2:\n        return 'nd';\n      case 3:\n        return 'rd';\n      default:\n        return 'th';\n    }\n  };\n\n  return (\n    <span className=\"truncate\">\n      <span className=\"text-white\">\n        {n}\n        {getOrdinalSuffix(n)} hook{' '}\n      </span>\n      <span style={{ color: '#666' }}>\n        called in <i className=\"text-[#A855F7] truncate\">{componentName}</i>\n      </span>\n    </span>\n  );\n};\n\nconst WhatsChangedHeader = memo(() => {\n  const refProps = useRef<HTMLDivElement>(null);\n  const refState = useRef<HTMLDivElement>(null);\n  const refContext = useRef<HTMLDivElement>(null);\n\n  const refStats = useRef<{\n    isPropsChanged: boolean;\n    isStateChanged: boolean;\n    isContextChanged: boolean;\n  }>({\n    isPropsChanged: false,\n    isStateChanged: false,\n    isContextChanged: false,\n  });\n\n  useEffect(() => {\n    const flash = throttle(() => {\n      const flashElements = [];\n      if (refProps.current?.dataset.flash === 'true') {\n        flashElements.push(refProps.current);\n      }\n      if (refState.current?.dataset.flash === 'true') {\n        flashElements.push(refState.current);\n      }\n      if (refContext.current?.dataset.flash === 'true') {\n        flashElements.push(refContext.current);\n      }\n\n      for (const element of flashElements) {\n        element.classList.remove('count-flash-white');\n        void element.offsetWidth;\n        element.classList.add('count-flash-white');\n      }\n    }, 400);\n\n    const unsubscribe = timelineState.subscribe((state) => {\n      if (!refProps.current || !refState.current || !refContext.current) {\n        return;\n      }\n\n      const { currentIndex, updates } = state;\n      const currentUpdate = updates[currentIndex];\n\n      if (!currentUpdate || currentIndex === 0) {\n        return;\n      }\n\n      flash();\n\n      refStats.current = {\n        isPropsChanged: (currentUpdate.props?.changes?.size ?? 0) > 0,\n        isStateChanged: (currentUpdate.state?.changes?.size ?? 0) > 0,\n        isContextChanged: (currentUpdate.context?.changes?.size ?? 0) > 0,\n      };\n\n      if (refProps.current.dataset.flash !== 'true') {\n        refProps.current.dataset.flash =\n          refStats.current.isPropsChanged.toString();\n      }\n      if (refState.current.dataset.flash !== 'true') {\n        refState.current.dataset.flash =\n          refStats.current.isStateChanged.toString();\n      }\n      if (refContext.current.dataset.flash !== 'true') {\n        refContext.current.dataset.flash =\n          refStats.current.isContextChanged.toString();\n      }\n    });\n\n    return unsubscribe;\n  }, []);\n\n  return (\n    <button\n      type=\"button\"\n      className={cn(\n        'react-section-header',\n        'overflow-hidden',\n        'max-h-0',\n        'transition-[max-height]',\n      )}\n    >\n      <div className={cn('flex-1 react-scan-expandable')}>\n        <div className=\"overflow-hidden\">\n          <div className=\"flex items-center whitespace-nowrap\">\n            <div className=\"flex items-center gap-x-2\">What changed?</div>\n\n            <div\n              className={cn(\n                'ml-auto',\n                'change-scope',\n                'transition-opacity duration-300 delay-150',\n              )}\n            >\n              <div ref={refProps}>props</div>\n              <div ref={refState}>state</div>\n              <div ref={refContext}>context</div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </button>\n  );\n});\n\ninterface SectionProps {\n  title: string;\n  isExpanded: boolean;\n  // oxlint-disable-next-line typescript/no-explicit-any\n  changes: Map<any, AggregatedChanges>;\n  renderName?: (name: string) => ReactNode;\n}\nconst identity = <T,>(x: T) => x;\nconst Section = /* @__PURE__ */ memo(\n  ({ title, changes, renderName = identity }: SectionProps) => {\n    const [expandedFns, setExpandedFns] = useState(new Set<string>());\n    const [expandedEntries, setExpandedEntries] = useState(new Set<string>());\n\n    const entries = Array.from(changes.entries());\n\n    if (changes.size === 0) {\n      return null;\n    }\n    return (\n      <div>\n        <div className=\"text-xs text-[#888] mb-1.5\">{title}</div>\n        <div className=\"flex flex-col gap-2\">\n          {entries.map(([entryKey, change]) => {\n            const isEntryExpanded = expandedEntries.has(String(entryKey));\n            const { value: prevValue, error: prevError } = safeGetValue(\n              change.previousValue,\n            );\n            const { value: currValue, error: currError } = safeGetValue(\n              change.currentValue,\n            );\n\n            const diff = getObjectDiff(prevValue, currValue);\n\n            return (\n              <div key={entryKey}>\n                <button\n                  onClick={() => {\n                    setExpandedEntries((prev) => {\n                      const next = new Set(prev);\n                      if (next.has(String(entryKey))) {\n                        next.delete(String(entryKey));\n                      } else {\n                        next.add(String(entryKey));\n                      }\n                      return next;\n                    });\n                  }}\n                  className=\"flex items-center gap-2 w-full bg-transparent border-none p-0 cursor-pointer text-white text-xs\"\n                >\n                  <div className=\"flex items-center gap-1.5 flex-1\">\n                    <Icon\n                      name=\"icon-chevron-right\"\n                      size={12}\n                      className={cn(\n                        'text-[#666] transition-transform duration-200 ease-[cubic-bezier(0.25,0.1,0.25,1)]',\n                        {\n                          'rotate-90': isEntryExpanded,\n                        },\n                      )}\n                    />\n                    <div className=\"whitespace-pre-wrap break-words text-left font-medium flex items-center gap-x-1.5\">\n                      {renderName(change.name)}\n\n                      <CountBadge\n                        count={change.count}\n                        isFunction={typeof change.currentValue === 'function'}\n                        showWarning={diff.changes.length === 0}\n                        forceFlash\n                        // showFlame={diff.changes.length === 0}\n                        // showFn={typeof change.currentValue === 'function'}\n                      />\n                    </div>\n                  </div>\n                </button>\n                <div\n                  className={cn('react-scan-expandable', {\n                    'react-scan-expanded': isEntryExpanded,\n                  })}\n                >\n                  <div className=\"pl-3 text-xs font-mono border-l-1 border-[#333]\">\n                    <div className=\"flex flex-col gap-0.5\">\n                      {prevError || currError ? (\n                        <AccessError\n                          currError={currError}\n                          prevError={prevError}\n                        />\n                      ) : diff.changes.length > 0 ? (\n                        <DiffChange\n                          change={change}\n                          diff={diff}\n                          expandedFns={expandedFns}\n                          renderName={renderName}\n                          setExpandedFns={setExpandedFns}\n                          title={title}\n                        />\n                      ) : (\n                        <ReferenceOnlyChange\n                          currValue={currValue}\n                          entryKey={entryKey}\n                          expandedFns={expandedFns}\n                          prevValue={prevValue}\n                          setExpandedFns={setExpandedFns}\n                        />\n                      )}\n                    </div>\n                  </div>\n                </div>\n              </div>\n            );\n          })}\n        </div>\n      </div>\n    );\n  },\n);\n\nconst AccessError = ({\n  prevError,\n  currError,\n}: {\n  prevError?: string;\n  currError?: string;\n}) => {\n  return (\n    <>\n      {prevError && (\n        <div className=\"text-[#f87171] bg-[#2a1515] pr-1.5 py-[3px] rounded italic\">\n          {prevError}\n        </div>\n      )}\n      {currError && (\n        <div className=\"text-[#4ade80] bg-[#1a2a1a] pr-1.5 py-[3px] rounded italic mt-0.5\">\n          {currError}\n        </div>\n      )}\n    </>\n  );\n};\n\nconst DiffChange = ({\n  diff,\n  title,\n  renderName,\n  change,\n  expandedFns,\n  setExpandedFns,\n}: {\n  diff: {\n    changes: {\n      path: string[];\n      prevValue: unknown;\n      currentValue: unknown;\n    }[];\n  };\n  title: string;\n  renderName: (name: string) => ReactNode;\n  change: { name: string };\n  expandedFns: Set<string>;\n  setExpandedFns: (updater: (prev: Set<string>) => Set<string>) => void;\n}) => {\n  return diff.changes.map((diffChange, i) => {\n    const { value: prevDiffValue, error: prevDiffError } = safeGetValue(\n      diffChange.prevValue,\n    );\n    const { value: currDiffValue, error: currDiffError } = safeGetValue(\n      diffChange.currentValue,\n    );\n\n    const isFunction =\n      typeof prevDiffValue === 'function' ||\n      typeof currDiffValue === 'function';\n\n    let path: string | undefined;\n\n    if (title === 'Props') {\n      path =\n        diffChange.path.length > 0\n          ? `${renderName(String(change.name))}.${formatPath(diffChange.path)}`\n          : undefined;\n    }\n    if (title === 'State' && diffChange.path.length > 0) {\n      path = `state.${formatPath(diffChange.path)}`;\n    }\n\n    if (!path) {\n      path = formatPath(diffChange.path);\n    }\n\n    return (\n      <div\n        key={`${path}-${change.name}-${i}`}\n        className={cn(\n          'flex flex-col gap-y-1',\n          i < diff.changes.length - 1 && 'mb-4',\n        )}\n      >\n        {path && <div className=\"text-[#666] text-[10px]\">{path}</div>}\n        <button\n          type=\"button\"\n          className={cn(\n            'group',\n            'flex items-start',\n            'py-[3px] px-1.5',\n            'text-left text-[#f87171] bg-[#2a1515]',\n            'rounded',\n            'overflow-hidden break-all',\n            isFunction && 'cursor-pointer',\n          )}\n          onClick={\n            isFunction\n              ? () => {\n                  const fnKey = `${formatPath(diffChange.path)}-prev`;\n                  setExpandedFns((prev) => {\n                    const next = new Set(prev);\n                    if (next.has(fnKey)) {\n                      next.delete(fnKey);\n                    } else {\n                      next.add(fnKey);\n                    }\n                    return next;\n                  });\n                }\n              : undefined\n          }\n        >\n          <span className=\"w-3 flex items-center justify-center opacity-50\">\n            -\n          </span>\n          <span className=\"flex-1 whitespace-nowrap font-mono\">\n            {prevDiffError ? (\n              <span className=\"italic text-[#f87171]\">{prevDiffError}</span>\n            ) : isFunction ? (\n              <div className=\"flex gap-1 items-start flex-col\">\n                <div className=\"flex gap-1 items-start w-full\">\n                  <span className=\"flex-1 max-h-40\">\n                    {formatFunctionPreview(\n                      prevDiffValue as (...args: unknown[]) => unknown,\n                      expandedFns.has(`${formatPath(diffChange.path)}-prev`),\n                    )}\n                  </span>\n                  {typeof prevDiffValue === 'function' && (\n                    <CopyToClipboard\n                      text={prevDiffValue.toString()}\n                      className=\"opacity-0 transition-opacity group-hover:opacity-100\"\n                    >\n                      {({ ClipboardIcon }) => <>{ClipboardIcon}</>}\n                    </CopyToClipboard>\n                  )}\n                </div>\n                {prevDiffValue?.toString() === currDiffValue?.toString() && (\n                  <div className=\"text-[10px] text-[#666] italic\">\n                    Function reference changed\n                  </div>\n                )}\n              </div>\n            ) : (\n              <DiffValueView\n                value={prevDiffValue}\n                expanded={expandedFns.has(\n                  `${formatPath(diffChange.path)}-prev`,\n                )}\n                onToggle={() => {\n                  const key = `${formatPath(diffChange.path)}-prev`;\n                  setExpandedFns((prev) => {\n                    const next = new Set(prev);\n                    if (next.has(key)) {\n                      next.delete(key);\n                    } else {\n                      next.add(key);\n                    }\n                    return next;\n                  });\n                }}\n                isNegative={true}\n              />\n            )}\n          </span>\n        </button>\n        <button\n          type=\"button\"\n          className={cn(\n            'group',\n            'flex items-start',\n            'py-[3px] px-1.5',\n            'text-left text-[#4ade80] bg-[#1a2a1a]',\n            'rounded',\n            'overflow-hidden break-all',\n            isFunction && 'cursor-pointer',\n          )}\n          onClick={\n            isFunction\n              ? () => {\n                  const fnKey = `${formatPath(diffChange.path)}-current`;\n                  setExpandedFns((prev) => {\n                    const next = new Set(prev);\n                    if (next.has(fnKey)) {\n                      next.delete(fnKey);\n                    } else {\n                      next.add(fnKey);\n                    }\n                    return next;\n                  });\n                }\n              : undefined\n          }\n        >\n          <span className=\"w-3 flex items-center justify-center opacity-50\">\n            +\n          </span>\n          <span className=\"flex-1 whitespace-pre-wrap font-mono\">\n            {currDiffError ? (\n              <span className=\"italic text-[#4ade80]\">{currDiffError}</span>\n            ) : isFunction ? (\n              <div className=\"flex gap-1 items-start flex-col\">\n                <div className=\"flex gap-1 items-start w-full\">\n                  <span className=\"flex-1\">\n                    {formatFunctionPreview(\n                      currDiffValue as (...args: unknown[]) => unknown,\n                      expandedFns.has(`${formatPath(diffChange.path)}-current`),\n                    )}\n                  </span>\n                  {typeof currDiffValue === 'function' && (\n                    <CopyToClipboard\n                      text={currDiffValue.toString()}\n                      className=\"opacity-0 transition-opacity group-hover:opacity-100\"\n                    >\n                      {({ ClipboardIcon }) => <>{ClipboardIcon}</>}\n                    </CopyToClipboard>\n                  )}\n                </div>\n                {prevDiffValue?.toString() === currDiffValue?.toString() && (\n                  <div className=\"text-[10px] text-[#666] italic\">\n                    Function reference changed\n                  </div>\n                )}\n              </div>\n            ) : (\n              <DiffValueView\n                value={currDiffValue}\n                expanded={expandedFns.has(\n                  `${formatPath(diffChange.path)}-current`,\n                )}\n                onToggle={() => {\n                  const key = `${formatPath(diffChange.path)}-current`;\n                  setExpandedFns((prev) => {\n                    const next = new Set(prev);\n                    if (next.has(key)) {\n                      next.delete(key);\n                    } else {\n                      next.add(key);\n                    }\n                    return next;\n                  });\n                }}\n                isNegative={false}\n              />\n            )}\n          </span>\n        </button>\n      </div>\n    );\n  });\n};\n\nconst ReferenceOnlyChange = ({\n  prevValue,\n  currValue,\n  entryKey,\n  expandedFns,\n  setExpandedFns,\n}: {\n  prevValue: unknown;\n  currValue: unknown;\n  entryKey: string | number;\n  expandedFns: Set<string>;\n  setExpandedFns: (updater: (prev: Set<string>) => Set<string>) => void;\n}) => {\n  return (\n    <>\n      <div className=\"group flex gap-0.5 items-start text-[#f87171] bg-[#2a1515] py-[3px] px-1.5 rounded\">\n        <span className=\"w-3 flex items-center justify-center opacity-50\">\n          -\n        </span>\n        <span className=\"flex-1 overflow-hidden whitespace-pre-wrap font-mono\">\n          <DiffValueView\n            value={prevValue}\n            expanded={expandedFns.has(`${String(entryKey)}-prev`)}\n            onToggle={() => {\n              const key = `${String(entryKey)}-prev`;\n              setExpandedFns((prev) => {\n                const next = new Set(prev);\n                if (next.has(key)) {\n                  next.delete(key);\n                } else {\n                  next.add(key);\n                }\n                return next;\n              });\n            }}\n            isNegative={true}\n          />\n        </span>\n      </div>\n      <div className=\"group flex gap-0.5 items-start text-[#4ade80] bg-[#1a2a1a] py-[3px] px-1.5 rounded mt-0.5\">\n        <span className=\"w-3 flex items-center justify-center opacity-50\">\n          +\n        </span>\n        <span className=\"flex-1 overflow-hidden whitespace-pre-wrap font-mono\">\n          <DiffValueView\n            value={currValue}\n            expanded={expandedFns.has(`${String(entryKey)}-current`)}\n            onToggle={() => {\n              const key = `${String(entryKey)}-current`;\n              setExpandedFns((prev) => {\n                const next = new Set(prev);\n                if (next.has(key)) {\n                  next.delete(key);\n                } else {\n                  next.add(key);\n                }\n                return next;\n              });\n            }}\n            isNegative={false}\n          />\n        </span>\n      </div>\n      {typeof currValue === 'object' && currValue !== null && (\n        <div className=\"text-[#666] text-[10px] italic mt-1 flex items-center gap-x-1\">\n          <Icon\n            name=\"icon-triangle-alert\"\n            className=\"text-yellow-500 mb-px\"\n            size={14}\n          />\n          <span>Reference changed but objects are structurally the same</span>\n        </div>\n      )}\n    </>\n  );\n};\n\nconst CountBadge = ({\n  count,\n  forceFlash,\n  isFunction,\n  showWarning,\n}: {\n  count: number;\n  forceFlash: boolean;\n  isFunction: boolean;\n  showWarning: boolean;\n}) => {\n  const refIsFirstRender = useRef(true);\n  const refBadge = useRef<HTMLDivElement>(null);\n  const refPrevCount = useRef(count);\n\n  useEffect(() => {\n    const element = refBadge.current;\n    if (!element || refPrevCount.current === count) {\n      return;\n    }\n\n    element.classList.remove('count-flash');\n    void element.offsetWidth;\n    element.classList.add('count-flash');\n\n    refPrevCount.current = count;\n  }, [count]);\n\n  useEffect(() => {\n    if (refIsFirstRender.current) {\n      refIsFirstRender.current = false;\n      return;\n    }\n\n    if (forceFlash) {\n      let timer = setTimeout(() => {\n        refBadge.current?.classList.add('count-flash-white');\n        timer = setTimeout(() => {\n          refBadge.current?.classList.remove('count-flash-white');\n        }, 300);\n      }, 500);\n      return () => {\n        clearTimeout(timer);\n      };\n    }\n  }, [forceFlash]);\n\n  return (\n    <div ref={refBadge} className=\"count-badge\">\n      {showWarning && (\n        <Icon\n          name=\"icon-triangle-alert\"\n          className=\"text-yellow-500 mb-px\"\n          size={14}\n        />\n      )}\n      {isFunction && (\n        <Icon name=\"icon-function\" className=\"text-[#A855F7] mb-px\" size={14} />\n      )}\n      x{count}\n    </div>\n  );\n};\n","import { memo } from 'preact/compat';\nimport { useCallback, useEffect, useState } from 'preact/hooks';\nimport { cn } from '~web/utils/helpers';\nimport { Icon } from '../icon';\n\ninterface CopyToClipboardProps {\n  text: string;\n  children?: (props: {\n    ClipboardIcon: JSX.Element;\n    onClick: (e: MouseEvent) => void;\n  }) => JSX.Element;\n  onCopy?: (success: boolean, text: string) => void;\n  className?: string;\n  iconSize?: number;\n}\n\nexport const CopyToClipboard = /* @__PURE__ */ memo(\n  ({\n    text,\n    children,\n    onCopy,\n    className,\n    iconSize = 14,\n  }: CopyToClipboardProps): JSX.Element => {\n    const [isCopied, setIsCopied] = useState(false);\n\n    useEffect(() => {\n      if (isCopied) {\n        const timeout = setTimeout(() => setIsCopied(false), 600);\n        return () => {\n          clearTimeout(timeout);\n        };\n      }\n    }, [isCopied]);\n\n    const copyToClipboard = useCallback(\n      (e: MouseEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        navigator.clipboard.writeText(text).then(\n          () => {\n            setIsCopied(true);\n            onCopy?.(true, text);\n          },\n          () => {\n            onCopy?.(false, text);\n          },\n        );\n      },\n      [text, onCopy],\n    );\n\n    const ClipboardIcon = (\n      <button\n        onClick={copyToClipboard}\n        type=\"button\"\n        className={cn(\n          'z-10',\n          'flex items-center justify-center',\n          'hover:text-dev-pink-400',\n          'transition-colors duration-200 ease-in-out',\n          'cursor-pointer',\n          `size-[${iconSize}px]`,\n          className,\n        )}\n      >\n        <Icon\n          name={`icon-${isCopied ? 'check' : 'copy'}`}\n          size={[iconSize]}\n          className={cn(isCopied && 'text-green-500')}\n        />\n      </button>\n    );\n\n    if (!children) {\n      return ClipboardIcon;\n    }\n\n    return children({\n      ClipboardIcon,\n      onClick: copyToClipboard,\n    });\n  },\n);\n","import { useState } from 'preact/hooks';\nimport { CopyToClipboard } from '~web/components/copy-to-clipboard';\nimport { Icon } from '~web/components/icon';\nimport { cn } from '~web/utils/helpers';\nimport { formatForClipboard, formatValuePreview, safeGetValue } from './utils';\n\nconst ArrayHeader = ({\n  length,\n  expanded,\n  onToggle,\n  isNegative,\n}: {\n  length: number;\n  expanded: boolean;\n  onToggle: () => void;\n  isNegative: boolean;\n}) => (\n  <div className=\"flex items-center gap-1\">\n    <button\n      type=\"button\"\n      onClick={onToggle}\n      className=\"flex items-center p-0 opacity-50\"\n    >\n      <Icon\n        name=\"icon-chevron-right\"\n        size={12}\n        className={cn(\n          'transition-[color,transform]',\n          isNegative ? 'text-[#f87171]' : 'text-[#4ade80]',\n          expanded && 'rotate-90',\n        )}\n      />\n    </button>\n    <span>Array({length})</span>\n  </div>\n);\n\nconst TreeNode = ({\n  value,\n  path,\n  isNegative,\n}: {\n  value: unknown;\n  path: string;\n  isNegative: boolean;\n}) => {\n  const [isExpanded, setIsExpanded] = useState(false);\n  const canExpand = value !== null &&\n    typeof value === 'object' &&\n    !(value instanceof Date);\n\n  if (!canExpand) {\n    return (\n      <div className=\"flex items-center gap-1\">\n        <span className=\"text-gray-500\">{path}:</span>\n        <span className=\"truncate\">{formatValuePreview(value)}</span>\n      </div>\n    );\n  }\n\n  const entries = Object.entries(value as object);\n\n  return (\n    <div className=\"flex flex-col\">\n      <div className=\"flex items-center gap-1\">\n        <button\n          type=\"button\"\n          onClick={() => setIsExpanded(!isExpanded)}\n          className=\"flex items-center p-0 opacity-50\"\n        >\n          <Icon\n            name=\"icon-chevron-right\"\n            size={12}\n            className={cn(\n              'transition-[color,transform]',\n              isNegative ? 'text-[#f87171]' : 'text-[#4ade80]',\n              isExpanded && 'rotate-90',\n            )}\n          />\n        </button>\n        <span className=\"text-gray-500\">{path}:</span>\n        {!isExpanded && (\n          <span className=\"truncate\">\n            {value instanceof Date ? formatValuePreview(value) : `{${Object.keys(value).join(', ')}}`}\n          </span>\n        )}\n      </div>\n      {isExpanded && (\n        <div className=\"pl-5 border-l border-[#333] mt-0.5 ml-1 flex flex-col gap-0.5\">\n          {entries.map(([key, val]) => (\n            <TreeNode\n              key={key}\n              value={val}\n              path={key}\n              isNegative={isNegative}\n            />\n          ))}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport const DiffValueView = ({\n  value,\n  expanded,\n  onToggle,\n  isNegative,\n}: {\n  value: unknown;\n  expanded: boolean;\n  onToggle: () => void;\n  isNegative: boolean;\n}) => {\n  const { value: safeValue, error } = safeGetValue(value);\n\n  if (error) {\n    return <span className=\"text-gray-500 font-italic\">{error}</span>;\n  }\n\n  const isExpandable =\n    safeValue !== null &&\n    typeof safeValue === 'object' &&\n    !(safeValue instanceof Promise);\n\n  if (!isExpandable) {\n    return <span>{formatValuePreview(safeValue)}</span>;\n  }\n\n  if (Array.isArray(safeValue)) {\n    return (\n      <div className=\"flex flex-col gap-1 relative\">\n        <ArrayHeader\n          length={safeValue.length}\n          expanded={expanded}\n          onToggle={onToggle}\n          isNegative={isNegative}\n        />\n        {expanded && (\n          <div className=\"pl-2 border-l border-[#333] mt-0.5 ml-1 flex flex-col gap-0.5\">\n            {safeValue.map((item, index) => (\n              <TreeNode\n                key={index.toString()}\n                value={item}\n                path={index.toString()}\n                isNegative={isNegative}\n              />\n            ))}\n          </div>\n        )}\n        <CopyToClipboard\n          text={formatForClipboard(safeValue)}\n          className=\"absolute top-0.5 right-0.5 opacity-0 transition-opacity group-hover:opacity-100 self-end\"\n        >\n          {({ ClipboardIcon }) => <>{ClipboardIcon}</>}\n        </CopyToClipboard>\n      </div>\n    );\n  }\n\n  // Handle objects\n  return (\n    <div className=\"flex items-start gap-1 relative\">\n      <button\n        type=\"button\"\n        onClick={onToggle}\n        className={cn('flex items-center', 'p-0 mt-0.5 mr-1', 'opacity-50')}\n      >\n        <Icon\n          name=\"icon-chevron-right\"\n          size={12}\n          className={cn(\n            'transition-[color,transform]',\n            isNegative ? 'text-[#f87171]' : 'text-[#4ade80]',\n            expanded && 'rotate-90',\n          )}\n        />\n      </button>\n      <div className=\"flex-1\">\n        {!expanded ? (\n          <span>{formatValuePreview(safeValue)}</span>\n        ) : (\n            <div className=\"pl-2 border-l border-[#333] mt-0.5 ml-1 flex flex-col gap-0.5\">\n              {Object.entries(safeValue as object).map(([key, val]) => (\n                <TreeNode\n                  key={key}\n                  value={val}\n                  path={key}\n                  isNegative={isNegative}\n                />\n              ))}\n            </div>\n        )}\n      </div>\n      <CopyToClipboard\n        text={formatForClipboard(safeValue)}\n        className=\"absolute top-0.5 right-0.5 opacity-0 transition-opacity group-hover:opacity-100 self-end\"\n      >\n        {({ ClipboardIcon }) => <>{ClipboardIcon}</>}\n      </CopyToClipboard>\n    </div>\n  );\n};\n","import { useEffect, useRef, useState } from 'preact/hooks';\nimport {\n  ChangesListener,\n  ChangesPayload,\n  ContextChange,\n  Store,\n} from '~core/index';\nimport { Fiber, getFiberId } from 'bippy';\nimport { isEqual } from '~core/utils';\nimport { signal } from '@preact/signals';\n\nconst CHANGES_QUEUE_INTERVAL = 50;\n\ninterface SectionData {\n  current: Array<{ name: string; value: unknown }>;\n  changes: Set<string>;\n}\n\nexport interface InspectorData {\n  fiberProps: SectionData;\n  fiberState: SectionData;\n  fiberContext: SectionData;\n}\ninterface InspectorState extends InspectorData {\n  fiber: Fiber | null;\n}\n\nexport const inspectorState = signal<InspectorState>({\n  fiber: null,\n  fiberProps: { current: [], changes: new Set() },\n  fiberState: { current: [], changes: new Set() },\n  fiberContext: { current: [], changes: new Set() },\n});\n\nexport type AggregatedChanges = {\n  count: number;\n  currentValue: unknown;\n  previousValue: unknown;\n  name: string;\n  lastUpdated: number;\n  id: string;\n};\n\nexport type AllAggregatedChanges = {\n  // oxlint-disable-next-line typescript/no-explicit-any\n  propsChanges: Map<any, AggregatedChanges>;\n  // oxlint-disable-next-line typescript/no-explicit-any\n  stateChanges: Map<any, AggregatedChanges>;\n  contextChanges: Map<\n    // oxlint-disable-next-line typescript/no-explicit-any\n    any,\n    | { changes: AggregatedChanges; kind: 'initialized' }\n    | {\n        // this looks weird, because it is\n        // its a work around to allow context changes to be sent impotently\n        // (react-scan internals do not yet handle sending context changes the render they change)\n        kind: 'partially-initialized';\n        value: unknown;\n        name: string;\n        lastUpdated: number;\n        id: string;\n      }\n  >;\n};\n\nconst getContextChangesValue = (\n  discriminated:\n    | { kind: 'partially-initialized'; value: unknown }\n    | { kind: 'initialized'; changes: AggregatedChanges },\n) => {\n  switch (discriminated.kind) {\n    case 'initialized': {\n      return discriminated.changes.currentValue;\n    }\n    case 'partially-initialized': {\n      return discriminated.value;\n    }\n  }\n};\nconst processChanges = (\n  changes: Array<{ name: string; value: unknown; prevValue?: unknown }>,\n  // oxlint-disable-next-line typescript/no-explicit-any\n  targetMap: Map<any, AggregatedChanges>,\n) => {\n  for (const change of changes) {\n    const existing = targetMap.get(change.name);\n\n    if (existing) {\n      targetMap.set(existing.name, {\n        count: existing.count + 1,\n        currentValue: change.value,\n        id: existing.name,\n        lastUpdated: Date.now(),\n        name: existing.name,\n        previousValue: change.prevValue,\n      });\n      continue;\n    }\n\n    targetMap.set(change.name, {\n      count: 1,\n      currentValue: change.value,\n      id: change.name,\n      lastUpdated: Date.now(),\n      name: change.name,\n      previousValue: change.prevValue,\n    });\n  }\n};\n\nconst processContextChanges = (\n  contextChanges: Array<ContextChange>,\n  aggregatedChanges: AllAggregatedChanges,\n) => {\n  for (const change of contextChanges) {\n    const existing = aggregatedChanges.contextChanges.get(change.contextType);\n\n    if (existing) {\n      if (isEqual(getContextChangesValue(existing), change.value)) {\n        continue;\n      }\n      if (existing.kind === 'partially-initialized') {\n        aggregatedChanges.contextChanges.set(change.contextType, {\n          kind: 'initialized',\n          changes: {\n            count: 1,\n            currentValue: change.value,\n            id: change.contextType.toString(), // come back to this why was this ever expected to be a number?\n            lastUpdated: Date.now(),\n            name: change.name,\n            previousValue: existing.value,\n          },\n        });\n        continue;\n      }\n\n      aggregatedChanges.contextChanges.set(change.contextType, {\n        kind: 'initialized',\n        changes: {\n          count: existing.changes.count + 1,\n          currentValue: change.value,\n          id: change.contextType.toString(),\n          lastUpdated: Date.now(),\n          name: change.name,\n          previousValue: existing.changes.currentValue,\n        },\n      });\n\n      continue;\n    }\n\n    aggregatedChanges.contextChanges.set(change.contextType, {\n      kind: 'partially-initialized',\n      id: change.contextType.toString(),\n      lastUpdated: Date.now(),\n      name: change.name,\n      value: change.value,\n    });\n  }\n};\n\nconst collapseQueue = (queue: Array<ChangesPayload>) => {\n  const localAggregatedChanges: AllAggregatedChanges = {\n    contextChanges: new Map(),\n    propsChanges: new Map(),\n    stateChanges: new Map(),\n  };\n\n  queue.forEach((changes) => {\n    // context is a special case since we don't send precise diffs and need to be idempotent\n    processContextChanges(changes.contextChanges, localAggregatedChanges);\n\n    processChanges(changes.stateChanges, localAggregatedChanges.stateChanges);\n\n    processChanges(changes.propsChanges, localAggregatedChanges.propsChanges);\n  });\n\n  return localAggregatedChanges;\n};\nconst mergeSimpleChanges = <\n  T extends\n    | AllAggregatedChanges['propsChanges']\n    | AllAggregatedChanges['stateChanges'],\n>(\n  existingChanges: T,\n  incomingChanges: T,\n): T => {\n  const mergedChanges = new Map();\n\n  existingChanges.forEach((value, key) => {\n    mergedChanges.set(key, value);\n  });\n\n  incomingChanges.forEach((incomingChange, key) => {\n    const existing = mergedChanges.get(key);\n\n    if (!existing) {\n      mergedChanges.set(key, incomingChange);\n      return;\n    }\n\n    mergedChanges.set(key, {\n      count: existing.count + incomingChange.count,\n      currentValue: incomingChange.currentValue,\n      id: incomingChange.id,\n      lastUpdated: incomingChange.lastUpdated,\n      name: incomingChange.name,\n      previousValue: incomingChange.previousValue,\n    });\n  });\n\n  return mergedChanges as T;\n};\n\nconst mergeContextChanges = (\n  existing: AllAggregatedChanges,\n  incoming: AllAggregatedChanges,\n) => {\n  const contextChanges: AllAggregatedChanges['contextChanges'] = new Map();\n\n  existing.contextChanges.forEach((value, key) => {\n    contextChanges.set(key, value);\n  });\n\n  incoming.contextChanges.forEach((incomingChange, key) => {\n    const existingChange = contextChanges.get(key);\n\n    if (!existingChange) {\n      contextChanges.set(key, incomingChange);\n      return;\n    }\n    if (\n      getContextChangesValue(incomingChange) ===\n      getContextChangesValue(existingChange)\n    ) {\n      // we do this for a second time just in context merge to handle the partial initialization case (the collapsed queue will not have the information to remove the partially initialized set of changes)\n      return;\n    }\n\n    switch (existingChange.kind) {\n      case 'initialized': {\n        switch (incomingChange.kind) {\n          case 'initialized': {\n            const preInitEntryOffset = 1;\n            contextChanges.set(key, {\n              kind: 'initialized',\n              changes: {\n                ...incomingChange.changes,\n                // if existing was initialized, the pre-initialization done by the collapsed queue was not necessary, so we need to increment count to account for the preInit entry\n                count:\n                  incomingChange.changes.count +\n                  existingChange.changes.count +\n                  preInitEntryOffset,\n                currentValue: incomingChange.changes.currentValue,\n\n                previousValue: incomingChange.changes.previousValue, // we always want to show this value, since this will be the true state transition (if you make the previousValue the last seen currentValue, u will have weird behavior with primitive state updates)\n              },\n            });\n            return;\n          }\n          case 'partially-initialized': {\n            contextChanges.set(key, {\n              kind: 'initialized',\n              changes: {\n                count: existingChange.changes.count + 1,\n                currentValue: incomingChange.value,\n                id: incomingChange.id,\n                lastUpdated: incomingChange.lastUpdated,\n                name: incomingChange.name,\n                previousValue: existingChange.changes.currentValue,\n              },\n            });\n            return;\n          }\n        }\n      }\n      case 'partially-initialized': {\n        switch (incomingChange.kind) {\n          case 'initialized': {\n            contextChanges.set(key, {\n              kind: 'initialized',\n              changes: {\n                count: incomingChange.changes.count + 1,\n                currentValue: incomingChange.changes.currentValue,\n                id: incomingChange.changes.id,\n                lastUpdated: incomingChange.changes.lastUpdated,\n                name: incomingChange.changes.name,\n                previousValue: existingChange.value,\n              },\n            });\n            return;\n          }\n          case 'partially-initialized': {\n            contextChanges.set(key, {\n              kind: 'initialized',\n              changes: {\n                count: 1,\n                currentValue: incomingChange.value,\n                id: incomingChange.id,\n                lastUpdated: incomingChange.lastUpdated,\n                name: incomingChange.name,\n                previousValue: existingChange.value,\n              },\n            });\n            return;\n          }\n        }\n      }\n    }\n  });\n\n  return contextChanges;\n};\n\nconst mergeChanges = (\n  existing: AllAggregatedChanges,\n  incoming: AllAggregatedChanges,\n): AllAggregatedChanges => {\n  const contextChanges = mergeContextChanges(existing, incoming);\n\n  const propChanges = mergeSimpleChanges(\n    existing.propsChanges,\n    incoming.propsChanges,\n  );\n  const stateChanges = mergeSimpleChanges(\n    existing.stateChanges,\n    incoming.stateChanges,\n  );\n\n  return {\n    contextChanges,\n    propsChanges: propChanges,\n    stateChanges,\n  };\n};\n\n/**\n * Calculate total count of changes across props, state and context\n */\nexport const calculateTotalChanges = (changes: AllAggregatedChanges) => {\n  return (\n    Array.from(changes.propsChanges.values()).reduce(\n      (acc, change) => acc + change.count,\n      0,\n    ) +\n    Array.from(changes.stateChanges.values()).reduce(\n      (acc, change) => acc + change.count,\n      0,\n    ) +\n    Array.from(changes.contextChanges.values())\n      .filter(\n        (change): change is Extract<typeof change, { kind: 'initialized' }> =>\n          change.kind === 'initialized',\n      )\n      .reduce((acc, change) => acc + change.changes.count, 0)\n  );\n};\n\nexport const useInspectedFiberChangeStore = (opts?: {\n  onChangeUpdate?: (countUpdated: number) => void;\n}) => {\n  const pendingChanges = useRef<{ queue: ChangesPayload[] }>({ queue: [] });\n  // flushed state read from queue stream\n  const [aggregatedChanges, setAggregatedChanges] =\n    useState<AllAggregatedChanges>({\n      propsChanges: new Map(),\n      stateChanges: new Map(),\n      contextChanges: new Map(),\n    });\n\n  const fiber =\n    Store.inspectState.value.kind === 'focused'\n      ? Store.inspectState.value.fiber\n      : null;\n  const fiberId = fiber ? getFiberId(fiber) : null;\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    const interval = setInterval(() => {\n      // optimization to avoid unconditional renders\n      if (pendingChanges.current.queue.length === 0) return;\n\n      setAggregatedChanges((prevAggregatedChanges) => {\n        const queueChanges = collapseQueue(pendingChanges.current.queue);\n        const merged = mergeChanges(prevAggregatedChanges, queueChanges);\n        const prevTotal = calculateTotalChanges(prevAggregatedChanges);\n        const newTotal = calculateTotalChanges(merged);\n        const changeCount = newTotal - prevTotal;\n        opts?.onChangeUpdate?.(changeCount);\n\n        return merged;\n      });\n\n      pendingChanges.current.queue = [];\n    }, CHANGES_QUEUE_INTERVAL);\n\n    return () => {\n      clearInterval(interval);\n    };\n  }, [fiber]);\n\n  // un-throttled subscription\n  useEffect(() => {\n    if (!fiberId) {\n      return;\n    }\n    const listener: ChangesListener = (change) => {\n      pendingChanges.current?.queue.push(change);\n    };\n\n    let listeners = Store.changesListeners.get(fiberId);\n\n    if (!listeners) {\n      listeners = [];\n      Store.changesListeners.set(fiberId, listeners);\n    }\n\n    listeners.push(listener);\n\n    return () => {\n      setAggregatedChanges({\n        propsChanges: new Map(),\n        stateChanges: new Map(),\n        contextChanges: new Map(),\n      });\n      pendingChanges.current.queue = [];\n      Store.changesListeners.set(\n        fiberId,\n        Store.changesListeners.get(fiberId)?.filter((l) => l !== listener) ??\n          [],\n      );\n    };\n  }, [fiberId]);\n\n  // cleanup\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    return () => {\n      setAggregatedChanges({\n        propsChanges: new Map(),\n        stateChanges: new Map(),\n        contextChanges: new Map(),\n      });\n      pendingChanges.current.queue = [];\n    };\n  }, [fiberId]);\n\n  return aggregatedChanges;\n};\n","// @ts-nocheck\nimport { ChangeReason, type Render } from '~core/instrumentation';\nimport { getLabelText } from '~core/utils';\n\nexport const log = (renders: Array<Render>) => {\n  const logMap = new Map<\n    string,\n    Array<{ prev: unknown; next: unknown; type: string; unstable?: boolean }>\n  >();\n  for (let i = 0, len = renders.length; i < len; i++) {\n    const render = renders[i];\n\n    if (!render.componentName) continue;\n\n    const changeLog = logMap.get(render.componentName) ?? [];\n    renders;\n    const labelText = getLabelText([\n      {\n        aggregatedCount: 1,\n\n        computedKey: null,\n        name: render.componentName,\n        frame: null,\n        ...render,\n        changes: {\n          // TODO(Alexis): use a faster reduction method\n          type: render.changes.reduce((set, change) => set | change.type, 0),\n          unstable: render.changes.some((change) => change.unstable),\n        },\n        phase: render.phase,\n        computedCurrent: null,\n      },\n    ]);\n    if (!labelText) continue;\n\n    let prevChangedProps: Record<string, unknown> | null = null;\n    let nextChangedProps: Record<string, unknown> | null = null;\n\n    if (render.changes) {\n      for (let i = 0, len = render.changes.length; i < len; i++) {\n        const { name, prevValue, nextValue, unstable, type } =\n          render.changes[i];\n        if (type === ChangeReason.Props) {\n          prevChangedProps ??= {};\n          nextChangedProps ??= {};\n          prevChangedProps[`${unstable ? '⚠️' : ''}${name} (prev)`] = prevValue;\n          nextChangedProps[`${unstable ? '⚠️' : ''}${name} (next)`] = nextValue;\n        } else {\n          changeLog.push({\n            prev: prevValue,\n            next: nextValue,\n            type: type === ChangeReason.Context ? 'context' : 'state',\n            unstable: unstable ?? false,\n          });\n        }\n      }\n    }\n\n    if (prevChangedProps && nextChangedProps) {\n      changeLog.push({\n        prev: prevChangedProps,\n        next: nextChangedProps,\n        type: 'props',\n        unstable: false,\n      });\n    }\n\n    logMap.set(labelText, changeLog);\n  }\n  for (const [name, changeLog] of Array.from(logMap.entries())) {\n    // oxlint-disable-next-line no-console\n    console.group(\n      `%c${name}`,\n      'background: hsla(0,0%,70%,.3); border-radius:3px; padding: 0 2px;',\n    );\n    for (const { type, prev, next, unstable } of changeLog) {\n      // oxlint-disable-next-line no-console\n      console.log(`${type}:`, unstable ? '⚠️' : '', prev, '!==', next);\n    }\n    // oxlint-disable-next-line no-console\n    console.groupEnd();\n  }\n};\n\nexport const logIntro = () => {\n  if (window.hideIntro) {\n    window.hideIntro = undefined;\n    return;\n  }\n  // oxlint-disable-next-line no-console\n  console.log(\n    '%c[·] %cReact Scan',\n    'font-weight:bold;color:#7a68e8;font-size:20px;',\n    'font-weight:bold;font-size:14px;',\n  );\n};\n","import type { ActiveOutline, OutlineData } from './types';\n\nexport const OUTLINE_ARRAY_SIZE = 7;\nconst MONO_FONT =\n  'Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace';\n\nconst INTERPOLATION_SPEED = 0.2;\nconst SNAP_THRESHOLD = 0.5;\nconst lerp = (start: number, end: number) => {\n  const delta = end - start;\n  if (Math.abs(delta) < SNAP_THRESHOLD) return end;\n  return start + delta * INTERPOLATION_SPEED;\n};\n\nconst MAX_PARTS_LENGTH = 4;\nconst MAX_LABEL_LENGTH = 40;\nconst TOTAL_FRAMES = 45;\n\nconst PRIMARY_COLOR = '115,97,230';\n\nfunction sortEntry(prev: [number, string[]], next: [number, string[]]): number {\n  return next[0] - prev[0];\n}\n\nfunction getSortedEntries(\n  countByNames: Map<number, string[]>,\n): [number, string[]][] {\n  const entries = [...countByNames.entries()];\n  return entries.sort(sortEntry);\n}\n\nfunction getLabelTextPart([count, names]: [number, string[]]): string {\n  let part = `${names.slice(0, MAX_PARTS_LENGTH).join(', ')} ×${count}`;\n  if (part.length > MAX_LABEL_LENGTH) {\n    part = `${part.slice(0, MAX_LABEL_LENGTH)}…`;\n  }\n  return part;\n}\n\nexport const getLabelText = (outlines: ActiveOutline[]): string => {\n  const nameByCount = new Map<string, number>();\n  for (const { name, count } of outlines) {\n    nameByCount.set(name, (nameByCount.get(name) || 0) + count);\n  }\n\n  const countByNames = new Map<number, string[]>();\n  for (const [name, count] of nameByCount) {\n    const names = countByNames.get(count);\n    if (names) {\n      names.push(name);\n    } else {\n      countByNames.set(count, [name]);\n    }\n  }\n\n  // TODO(Alexis): Optimize\n  const partsEntries = getSortedEntries(countByNames);\n  let labelText = getLabelTextPart(partsEntries[0]);\n  for (let i = 1, len = partsEntries.length; i < len; i++) {\n    labelText += ', ' + getLabelTextPart(partsEntries[i]);\n  }\n\n  if (labelText.length > MAX_LABEL_LENGTH) {\n    return `${labelText.slice(0, MAX_LABEL_LENGTH)}…`;\n  }\n\n  return labelText;\n};\n\nexport const getAreaFromOutlines = (outlines: ActiveOutline[]) => {\n  let area = 0;\n  for (const outline of outlines) {\n    area += outline.width * outline.height;\n  }\n  return area;\n};\n\nexport const updateOutlines = (\n  activeOutlines: Map<string, ActiveOutline>,\n  outlines: OutlineData[],\n) => {\n  for (const { id, name, count, x, y, width, height, didCommit } of outlines) {\n    const outline: ActiveOutline = {\n      id,\n      name,\n      count,\n      x,\n      y,\n      width,\n      height,\n      frame: 0,\n      targetX: x,\n      targetY: y,\n      targetWidth: width,\n      targetHeight: height,\n      didCommit,\n    };\n    const key = String(outline.id);\n\n    const existingOutline = activeOutlines.get(key);\n    if (existingOutline) {\n      existingOutline.count++;\n      existingOutline.frame = 0;\n      existingOutline.targetX = x;\n      existingOutline.targetY = y;\n      existingOutline.targetWidth = width;\n      existingOutline.targetHeight = height;\n      existingOutline.didCommit = didCommit;\n    } else {\n      activeOutlines.set(key, outline);\n    }\n  }\n};\n\nexport const updateScroll = (\n  activeOutlines: Map<string, ActiveOutline>,\n  deltaX: number,\n  deltaY: number,\n) => {\n  for (const outline of activeOutlines.values()) {\n    const newX = outline.x - deltaX;\n    const newY = outline.y - deltaY;\n    outline.targetX = newX;\n    outline.targetY = newY;\n  }\n};\n\nexport const initCanvas = (\n  canvas: HTMLCanvasElement | OffscreenCanvas,\n  dpr: number,\n) => {\n  const ctx = canvas.getContext('2d', { alpha: true }) as\n    | CanvasRenderingContext2D\n    | OffscreenCanvasRenderingContext2D;\n  if (ctx) {\n    ctx.scale(dpr, dpr);\n  }\n  return ctx;\n};\n\nexport const drawCanvas = (\n  ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n  canvas: HTMLCanvasElement | OffscreenCanvas,\n  dpr: number,\n  activeOutlines: Map<string, ActiveOutline>,\n) => {\n  ctx.clearRect(0, 0, canvas.width / dpr, canvas.height / dpr);\n\n  const groupedOutlinesMap = new Map<string, ActiveOutline[]>();\n  const rectMap = new Map<\n    string,\n    {\n      x: number;\n      y: number;\n      width: number;\n      height: number;\n      alpha: number;\n    }\n  >();\n\n  for (const outline of activeOutlines.values()) {\n    const {\n      x,\n      y,\n      width,\n      height,\n      targetX,\n      targetY,\n      targetWidth,\n      targetHeight,\n      frame,\n    } = outline;\n    if (targetX !== x) {\n      outline.x = lerp(x, targetX);\n    }\n    if (targetY !== y) {\n      outline.y = lerp(y, targetY);\n    }\n\n    if (targetWidth !== width) {\n      outline.width = lerp(width, targetWidth);\n    }\n    if (targetHeight !== height) {\n      outline.height = lerp(height, targetHeight);\n    }\n\n    const labelKey = `${targetX ?? x},${targetY ?? y}`;\n    const rectKey = `${labelKey},${targetWidth ?? width},${targetHeight ?? height}`;\n\n    const outlines = groupedOutlinesMap.get(labelKey);\n    if (outlines) {\n      outlines.push(outline);\n    } else {\n      groupedOutlinesMap.set(labelKey, [outline]);\n    }\n\n    const alpha = 1 - frame / TOTAL_FRAMES;\n    outline.frame++;\n\n    const rect = rectMap.get(rectKey) || {\n      x,\n      y,\n      width,\n      height,\n      alpha,\n    };\n    if (alpha > rect.alpha) {\n      rect.alpha = alpha;\n    }\n    rectMap.set(rectKey, rect);\n  }\n\n  for (const { x, y, width, height, alpha } of rectMap.values()) {\n    ctx.strokeStyle = `rgba(${PRIMARY_COLOR},${alpha})`;\n    ctx.lineWidth = 1;\n\n    // Offset by 0.5px for crisp 1px strokes on pixel boundaries\n    const rx = Math.round(x) + 0.5;\n    const ry = Math.round(y) + 0.5;\n    const rw = Math.round(width);\n    const rh = Math.round(height);\n\n    ctx.beginPath();\n    ctx.rect(rx, ry, rw, rh);\n    ctx.stroke();\n    ctx.fillStyle = `rgba(${PRIMARY_COLOR},${alpha * 0.1})`;\n    ctx.fill();\n  }\n\n  ctx.font = `11px ${MONO_FONT}`;\n\n  const labelMap = new Map<\n    string,\n    {\n      text: string;\n      width: number;\n      height: number;\n      alpha: number;\n      x: number;\n      y: number;\n      outlines: ActiveOutline[];\n    }\n  >();\n\n  ctx.textRendering = 'optimizeSpeed';\n\n  // TODO(Alexis): optimizable?\n  for (const outlines of groupedOutlinesMap.values()) {\n    const first = outlines[0];\n    const { x, y, frame } = first;\n    const alpha = 1 - frame / TOTAL_FRAMES;\n    const text = getLabelText(outlines);\n    const { width } = ctx.measureText(text);\n    const height = 11;\n    labelMap.set(`${x},${y},${width},${text}`, {\n      text,\n      width,\n      height,\n      alpha,\n      x,\n      y,\n      outlines,\n    });\n\n    let labelY: number = y - height - 4;\n\n    if (labelY < 0) {\n      labelY = 0;\n    }\n\n    if (frame > TOTAL_FRAMES) {\n      for (const outline of outlines) {\n        activeOutlines.delete(String(outline.id));\n      }\n    }\n  }\n\n  // TODO(Alexis): optimize\n  const sortedLabels = Array.from(labelMap.entries()).sort(\n    ([_, a], [__, b]) => {\n      return getAreaFromOutlines(b.outlines) - getAreaFromOutlines(a.outlines);\n    },\n  );\n\n  for (const [labelKey, label] of sortedLabels) {\n    if (!labelMap.has(labelKey)) continue;\n\n    for (const [otherKey, otherLabel] of labelMap.entries()) {\n      if (labelKey === otherKey) continue;\n\n      const { x, y, width, height } = label;\n      const {\n        x: otherX,\n        y: otherY,\n        width: otherWidth,\n        height: otherHeight,\n      } = otherLabel;\n\n      if (\n        x + width > otherX &&\n        otherX + otherWidth > x &&\n        y + height > otherY &&\n        otherY + otherHeight > y\n      ) {\n        label.text = getLabelText(label.outlines.concat(otherLabel.outlines));\n        label.width = ctx.measureText(label.text).width;\n        labelMap.delete(otherKey);\n      }\n    }\n  }\n\n  for (const label of labelMap.values()) {\n    const { x, y, alpha, width, height, text } = label;\n\n    let labelY = y - height - 4;\n\n    if (labelY < 0) {\n      labelY = 0;\n    }\n\n    ctx.fillStyle = `rgba(${PRIMARY_COLOR},${alpha})`;\n    ctx.fillRect(x, labelY, width + 4, height + 4);\n\n    ctx.fillStyle = `rgba(255,255,255,${alpha})`;\n    ctx.fillText(text, x + 2, labelY + height);\n  }\n\n  return activeOutlines.size > 0;\n};\n","@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n* {\n  outline: none !important;\n  text-rendering: optimizeLegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n  /* WebKit (Chrome, Safari, Edge) specific scrollbar styles */\n  &::-webkit-scrollbar {\n    width: 6px;\n    height: 6px;\n  }\n\n  &::-webkit-scrollbar-track {\n    border-radius: 10px;\n    background: transparent;\n  }\n\n  &::-webkit-scrollbar-thumb {\n    border-radius: 10px;\n    background: rgba(255, 255, 255, 0.3);\n  }\n\n  &::-webkit-scrollbar-thumb:hover {\n    background: rgba(255, 255, 255, 0.4);\n  }\n\n  &::-webkit-scrollbar-corner {\n    background: transparent;\n  }\n}\n\n@-moz-document url-prefix() {\n  * {\n    scrollbar-width: thin;\n    scrollbar-color: rgba(255, 255, 255, 0.4) transparent;\n    scrollbar-width: 6px;\n  }\n}\n\nbutton {\n  @apply hover:bg-none;\n  @apply outline-none;\n  @apply border-none;\n  @apply transition-colors ease-out;\n  @apply cursor-pointer;\n}\n\ninput {\n  @apply outline-none;\n  @apply border-none;\n  @apply bg-none bg-transparent;\n  @apply placeholder:text-neutral-500 placeholder:italic placeholder:text-xs;\n  @apply placeholder-shown:truncate;\n}\n\nsvg {\n  @apply w-auto h-auto;\n  @apply pointer-events-none;\n}\n\n/*\n  Using CSS content with data attributes is more performant than:\n  1. React re-renders with JSX text content\n  2. Direct DOM manipulation methods:\n     - element.textContent (creates/updates text nodes, triggers repaint)\n     - element.innerText (triggers reflow by computing styles & layout)\n     - element.innerHTML (heavy parsing, triggers reflow, security risks)\n  3. Multiple data attributes with complex CSS concatenation\n\n  This approach:\n  - Avoids React reconciliation\n  - Uses browser's native CSS engine (optimized content updates)\n  - Minimizes main thread work\n  - Reduces DOM operations\n  - Avoids forced reflows (layout recalculation)\n  - Only triggers necessary repaints\n  - Keeps pseudo-element updates in render layer\n*/\n.with-data-text {\n  overflow: hidden;\n  &::before {\n    content: attr(data-text);\n    @apply block;\n    @apply truncate;\n  }\n}\n\n#react-scan-toolbar {\n  @apply fixed left-0 top-0;\n  @apply flex flex-col;\n  @apply shadow-lg;\n  @apply font-mono text-[13px] text-white;\n  @apply bg-black;\n  @apply select-none;\n  @apply cursor-move;\n  @apply opacity-0;\n  @apply z-[2147483678];\n  @apply animate-fade-in animation-duration-300 animation-delay-300;\n  @apply shadow-[0_4px_12px_rgba(0,0,0,0.2)];\n  @apply place-self-start;\n\n  will-change: transform;\n  backface-visibility: hidden;\n}\n\n.button {\n  &:hover {\n    background: rgba(255, 255, 255, 0.1);\n  }\n\n  &:active {\n    background: rgba(255, 255, 255, 0.15);\n  }\n}\n\n.resize-line-wrapper {\n  @apply absolute;\n  @apply overflow-hidden;\n}\n\n.resize-line {\n  @apply absolute inset-0;\n  @apply overflow-hidden;\n  @apply bg-black;\n  @apply transition-all;\n\n  svg {\n    @apply absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2;\n  }\n}\n\n.resize-right,\n.resize-left {\n  @apply inset-y-0;\n  @apply w-6;\n  @apply cursor-ew-resize;\n\n  .resize-line-wrapper {\n    @apply inset-y-0;\n    @apply w-1/2;\n  }\n\n  &:hover {\n    .resize-line {\n      @apply translate-x-0;\n    }\n  }\n}\n.resize-right {\n  @apply right-0;\n  @apply translate-x-1/2;\n\n  .resize-line-wrapper {\n    @apply right-0;\n  }\n  .resize-line {\n    @apply rounded-r-lg;\n    @apply -translate-x-full;\n  }\n}\n\n.resize-left {\n  @apply left-0;\n  @apply -translate-x-1/2;\n\n  .resize-line-wrapper {\n    @apply left-0;\n  }\n  .resize-line {\n    @apply rounded-l-lg;\n    @apply translate-x-full;\n  }\n}\n\n.resize-top,\n.resize-bottom {\n  @apply inset-x-0;\n  @apply h-6;\n  @apply cursor-ns-resize;\n\n  .resize-line-wrapper {\n    @apply inset-x-0;\n    @apply h-1/2;\n  }\n\n  &:hover {\n    .resize-line {\n      @apply translate-y-0;\n    }\n  }\n}\n.resize-top {\n  @apply top-0;\n  @apply -translate-y-1/2;\n\n  .resize-line-wrapper {\n    @apply top-0;\n  }\n  .resize-line {\n    @apply rounded-t-lg;\n    @apply translate-y-full;\n  }\n}\n\n.resize-bottom {\n  @apply bottom-0;\n  @apply translate-y-1/2;\n\n  .resize-line-wrapper {\n    @apply bottom-0;\n  }\n  .resize-line {\n    @apply rounded-b-lg;\n    @apply -translate-y-full;\n  }\n}\n\n.react-scan-header {\n  @apply flex items-center gap-x-2;\n  @apply pl-3 pr-2;\n  @apply min-h-9;\n  @apply border-b-1 border-[#222];\n  @apply whitespace-nowrap overflow-hidden;\n}\n\n.react-scan-replay-button,\n.react-scan-close-button {\n  @apply flex items-center;\n  @apply p-1;\n  @apply min-w-fit;\n  @apply rounded;\n  @apply transition-all duration-300;\n}\n\n.react-scan-replay-button {\n  @apply relative;\n  @apply overflow-hidden;\n  @apply !bg-purple-500/50;\n\n  &:hover {\n    @apply bg-purple-500/25;\n  }\n\n  &.disabled {\n    @apply opacity-50;\n    @apply pointer-events-none;\n  }\n\n  &:before {\n    content: \"\";\n    @apply absolute;\n    @apply inset-0;\n    @apply -translate-x-full;\n    animation: shimmer 2s infinite;\n    background: linear-gradient(\n      to right,\n      transparent,\n      rgba(142, 97, 227, 0.3),\n      transparent\n    );\n  }\n}\n\n.react-scan-close-button {\n  @apply bg-white/10;\n\n  &:hover {\n    @apply bg-white/15;\n  }\n}\n\n@keyframes shimmer {\n  100% {\n    @apply translate-x-full;\n  }\n}\n\n.react-section-header {\n  @apply sticky z-100;\n  @apply flex items-center gap-x-2;\n  @apply px-3;\n  @apply w-full h-7;\n  @apply text-[#888] truncate;\n  @apply bg-[#0a0a0a] border-b-1 border-[#222];\n}\n\n.react-scan-section {\n  @apply flex flex-col;\n  @apply px-2;\n  @apply text-[#888];\n  @apply before:content-[attr(data-section)] before:text-gray-500;\n  @apply text-xs;\n\n  > .react-scan-property {\n    @apply -ml-3.5;\n  }\n}\n\n.react-scan-property {\n  @apply relative;\n  @apply flex flex-col;\n  @apply pl-8;\n  @apply border-l-1 border-transparent;\n  @apply overflow-hidden;\n}\n\n.react-scan-property-content {\n  @apply flex-1 flex flex-col;\n  @apply min-h-7;\n  @apply max-w-full;\n  @apply overflow-hidden;\n}\n\n.react-scan-string {\n  color: #9ecbff;\n}\n\n.react-scan-number {\n  color: #79c7ff;\n}\n\n.react-scan-boolean {\n  color: #56b6c2;\n}\n\n.react-scan-key {\n  @apply w-fit max-w-60;\n  @apply text-white whitespace-nowrap;\n}\n\n.react-scan-input {\n  @apply text-white;\n  @apply bg-black;\n}\n\n@keyframes blink {\n  from {\n    @apply opacity-100;\n  }\n  to {\n    @apply opacity-0;\n  }\n}\n\n.react-scan-arrow {\n  @apply absolute top-0 left-7;\n  @apply flex items-center justify-center;\n  @apply cursor-pointer;\n  @apply w-6 h-7;\n  @apply -translate-x-full;\n  @apply z-10;\n\n  > svg {\n    @apply transition-transform;\n  }\n}\n\n.react-scan-nested {\n  @apply relative;\n  @apply overflow-hidden;\n\n  &:before {\n    content: \"\";\n    @apply absolute top-0 left-0;\n    @apply w-[1px] h-full;\n    @apply bg-gray-500/30;\n  }\n}\n\n.react-scan-settings {\n  @apply absolute inset-0;\n  @apply flex flex-col gap-4;\n  @apply py-2 px-4;\n  @apply text-[#888];\n\n  > div {\n    @apply flex items-center justify-between;\n    @apply transition-colors duration-300;\n  }\n}\n\n.react-scan-preview-line {\n  @apply relative;\n  @apply flex items-center min-h-7 gap-x-2;\n}\n\n.react-scan-flash-overlay {\n  @apply absolute inset-0;\n  @apply opacity-0;\n  @apply z-50;\n  @apply pointer-events-none;\n  @apply transition-opacity;\n  @apply mix-blend-multiply;\n  @apply bg-purple-500/90;\n}\n\n.react-scan-toggle {\n  @apply relative;\n  @apply inline-flex;\n  @apply w-10 h-6;\n\n  input {\n    @apply absolute inset-0;\n    @apply opacity-0 z-20;\n    @apply cursor-pointer;\n    @apply w-full h-full;\n  }\n\n  input:checked {\n    + div {\n      @apply bg-[#5f3f9a];\n\n      &::before {\n        @apply translate-x-full;\n        @apply left-auto;\n        @apply border-[#5f3f9a];\n      }\n    }\n  }\n\n  > div {\n    @apply absolute inset-1;\n    @apply bg-neutral-700;\n    @apply rounded-full;\n    @apply pointer-events-none;\n    @apply transition-colors duration-300;\n\n    &:before {\n      @apply content-[''];\n      @apply absolute top-1/2 left-0;\n      @apply -translate-y-1/2;\n      @apply w-4 h-4;\n      @apply bg-white;\n      @apply border-2 border-neutral-700;\n      @apply rounded-full;\n      @apply shadow-sm;\n      @apply transition-all duration-300;\n    }\n  }\n}\n\n.react-scan-flash-active {\n  @apply opacity-40;\n  @apply transition-opacity duration-300;\n}\n\n.react-scan-inspector-overlay {\n  @apply flex flex-col;\n  @apply opacity-0;\n  @apply transition-opacity duration-200 ease-out;\n  will-change: opacity;\n\n  &.fade-out {\n    @apply opacity-0;\n  }\n\n  &.fade-in {\n    @apply opacity-100;\n  }\n}\n\n.react-scan-what-changed {\n  ul {\n    @apply list-disc;\n    @apply pl-4;\n  }\n\n  li {\n    @apply whitespace-nowrap;\n    > div {\n      @apply flex items-center justify-between gap-x-2;\n    }\n  }\n}\n\n.count-badge {\n  @apply flex gap-x-2 items-center;\n  @apply px-1.5 py-0.5;\n  @apply text-[#a855f7] text-xs font-medium tabular-nums rounded-[4px];\n  @apply bg-[#a855f7]/10;\n  @apply origin-center;\n  @apply transition-all duration-300 delay-150;\n}\n\n.count-flash {\n  @apply animate-count-flash;\n}\n\n.count-flash-white {\n  @apply animate-count-flash-shake !delay-500;\n}\n\n.change-scope {\n  @apply flex items-center gap-x-1;\n  @apply text-[#666];\n  @apply text-xs;\n  @apply font-mono;\n\n  > div {\n    @apply px-1.5 py-0.5;\n    @apply text-xs font-medium tabular-nums rounded-[4px];\n    @apply origin-center;\n    @apply transition-all duration-300 delay-150;\n\n    &[data-flash=\"true\"] {\n      @apply bg-[#a855f7]/10 text-[#a855f7];\n    }\n  }\n}\n\n.react-scan-slider {\n  @apply relative;\n  @apply min-h-6;\n\n  > input {\n    @apply absolute inset-0;\n    @apply opacity-0;\n  }\n\n  &:before {\n    @apply content-[''];\n    @apply absolute inset-x-0 top-1/2 -translate-y-1/2;\n    @apply h-1.5;\n    @apply bg-[#8e61e3]/40;\n    @apply rounded-lg;\n    @apply pointer-events-none;\n  }\n\n  &:after {\n    @apply content-[''];\n    @apply absolute inset-x-0 -inset-y-2;\n    @apply -z-10;\n  }\n\n  span {\n    @apply absolute left-0 top-1/2 -translate-y-1/2;\n    @apply w-2.5 h-2.5;\n    @apply rounded-lg;\n    @apply bg-[#8e61e3];\n    @apply pointer-events-none;\n    @apply transition-transform duration-75;\n  }\n}\n\n.resize-v-line {\n  @apply flex items-center justify-center;\n  @apply min-w-1 max-w-1;\n  @apply w-full h-full;\n  @apply transition-colors;\n\n  &:hover,\n  &:active {\n    > span {\n      @apply bg-[#222];\n    }\n\n    svg {\n      @apply opacity-100;\n    }\n  }\n\n  &::before {\n    @apply content-[\"\"];\n    @apply absolute inset-0 left-1/2 -translate-x-1/2;\n    @apply w-[1px];\n    @apply bg-[#222];\n    @apply transition-colors;\n  }\n\n  > span {\n    @apply absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2;\n    @apply w-1.5 h-4.5;\n    @apply rounded;\n    @apply transition-colors;\n  }\n\n  svg {\n    @apply absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2;\n    @apply text-neutral-400 rotate-90;\n    @apply opacity-0;\n    @apply transition-opacity;\n    @apply z-50;\n  }\n}\n\n.tree-node-search-highlight {\n  @apply truncate;\n\n  span {\n    @apply py-[1px];\n    @apply font-medium bg-yellow-300 text-black rounded-sm;\n  }\n\n  .single {\n    @apply px-[2px] mr-[1px];\n  }\n\n  .regex {\n    @apply px-[2px];\n  }\n\n  .start {\n    @apply rounded-l-sm ml-[1px];\n  }\n\n  .end {\n    @apply rounded-r-sm mr-[1px];\n  }\n\n  .middle {\n    @apply rounded-sm mx-[1px];\n  }\n}\n\n.react-scan-toolbar-notification {\n  @apply absolute inset-x-0;\n  @apply flex items-center gap-x-2;\n  @apply p-1 pl-2 text-[10px];\n  @apply text-neutral-300;\n  @apply bg-black/90;\n  @apply transition-transform;\n\n  &:before {\n    @apply content-[''];\n    @apply absolute inset-x-0;\n    @apply bg-black;\n    @apply h-2;\n  }\n\n  &.position-top {\n    @apply top-full -translate-y-full;\n    @apply rounded-b-lg;\n\n    &::before {\n      @apply top-0 -translate-y-full;\n    }\n  }\n\n  &.position-bottom {\n    @apply bottom-full translate-y-full;\n    @apply rounded-t-lg;\n\n    &::before {\n      @apply bottom-0 translate-y-full;\n    }\n  }\n\n  &.is-open {\n    @apply translate-y-0;\n  }\n}\n\n.react-scan-header-item {\n  @apply absolute inset-0 -translate-y-[200%];\n  @apply transition-transform duration-300;\n\n  &.is-visible {\n    @apply translate-y-0;\n  }\n}\n\n.react-scan-components-tree:has(.resize-v-line:hover, .resize-v-line:active)\n  .tree {\n  overflow: hidden;\n}\n\n.react-scan-expandable {\n  display: grid;\n  grid-template-rows: 0fr;\n  @apply overflow-hidden;\n  @apply transition-all duration-75;\n  transition-timing-function: ease-out;\n\n  > * {\n    min-height: 0;\n  }\n\n  &.react-scan-expanded {\n    grid-template-rows: 1fr;\n    transition-duration: 100ms;\n  }\n}\n","import { Component, render } from 'preact';\nimport { Icon } from './components/icon';\nimport { SvgSprite } from './components/svg-sprite';\nimport { Widget } from './widget';\n\n\nclass ToolbarErrorBoundary extends Component {\n  state: { hasError: boolean; error: Error | null } = { hasError: false, error: null };\n\n  static getDerivedStateFromError(error: Error) {\n    return { hasError: true, error };\n  }\n\n  handleReset = () => {\n    this.setState({ hasError: false, error: null });\n  };\n\n  render() {\n    if (this.state.hasError) {\n      return (\n        <div className=\"fixed bottom-4 right-4 z-[124124124124]\">\n          <div className=\"p-3 bg-black rounded-lg shadow-lg w-80\">\n            <div className=\"flex items-center gap-2 mb-2 text-red-400 text-sm font-medium\">\n              <Icon name=\"icon-flame\" className=\"text-red-500\" size={14} />\n              React Scan ran into a problem\n            </div>\n            <div className=\"p-2 bg-black rounded font-mono text-xs text-red-300 mb-3 break-words\">\n              {this.state.error?.message || JSON.stringify(this.state.error)}\n            </div>\n            <button\n              type=\"button\"\n              onClick={this.handleReset}\n              className=\"px-3 py-1.5 bg-red-500 hover:bg-red-600 text-white rounded text-xs font-medium transition-colors flex items-center justify-center gap-1.5\"\n            >\n              Restart\n            </button>\n          </div>\n        </div>\n      );\n    }\n\n    return this.props.children;\n  }\n}\n\nexport const createToolbar = (root: ShadowRoot): HTMLElement => {\n  const container = document.createElement('div');\n  container.id = 'react-scan-toolbar-root';\n  window.__REACT_SCAN_TOOLBAR_CONTAINER__ = container;\n  root.appendChild(container);\n\n  render(\n    <ToolbarErrorBoundary>\n      <>\n        <SvgSprite />\n        <Widget />\n      </>\n    </ToolbarErrorBoundary>,\n    container,\n  );\n\n  const originalRemove = container.remove.bind(container);\n\n  container.remove = () => {\n    window.__REACT_SCAN_TOOLBAR_CONTAINER__ = undefined;\n\n    if (container.hasChildNodes()) {\n      // Double render(null) is needed to fully unmount Preact components.\n      // The first call initiates unmounting, while the second ensures\n      // cleanup of internal VNode references and event listeners.\n      render(null, container);\n      render(null, container);\n    }\n\n    originalRemove();\n  };\n\n  return container;\n};\n","export const SvgSprite = () => {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display: none;\">\n      <title>React Scan Icons</title>\n      <symbol id=\"icon-inspect\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <path d=\"M12.034 12.681a.498.498 0 0 1 .647-.647l9 3.5a.5.5 0 0 1-.033.943l-3.444 1.068a1 1 0 0 0-.66.66l-1.067 3.443a.5.5 0 0 1-.943.033z\" />\n        <path d=\"M5 3a2 2 0 0 0-2 2\" />\n        <path d=\"M19 3a2 2 0 0 1 2 2\" />\n        <path d=\"M5 21a2 2 0 0 1-2-2\" />\n        <path d=\"M9 3h1\" />\n        <path d=\"M9 21h2\" />\n        <path d=\"M14 3h1\" />\n        <path d=\"M3 9v1\" />\n        <path d=\"M21 9v2\" />\n        <path d=\"M3 14v1\" />\n      </symbol>\n\n      <symbol id=\"icon-focus\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <path d=\"M12.034 12.681a.498.498 0 0 1 .647-.647l9 3.5a.5.5 0 0 1-.033.943l-3.444 1.068a1 1 0 0 0-.66.66l-1.067 3.443a.5.5 0 0 1-.943.033z\" />\n        <path d=\"M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6\" />\n      </symbol>\n\n      <symbol id=\"icon-next\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <path d=\"M6 9h6V5l7 7-7 7v-4H6V9z\" />\n      </symbol>\n\n      <symbol id=\"icon-previous\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <path d=\"M18 15h-6v4l-7-7 7-7v4h6v6z\" />\n      </symbol>\n\n      <symbol id=\"icon-close\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n        <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n      </symbol>\n\n      <symbol id=\"icon-replay\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <path d=\"M3 7V5a2 2 0 0 1 2-2h2\" />\n        <path d=\"M17 3h2a2 2 0 0 1 2 2v2\" />\n        <path d=\"M21 17v2a2 2 0 0 1-2 2h-2\" />\n        <path d=\"M7 21H5a2 2 0 0 1-2-2v-2\" />\n        <circle cx=\"12\" cy=\"12\" r=\"1\" />\n        <path d=\"M18.944 12.33a1 1 0 0 0 0-.66 7.5 7.5 0 0 0-13.888 0 1 1 0 0 0 0 .66 7.5 7.5 0 0 0 13.888 0\" />\n      </symbol>\n\n      <symbol id=\"icon-ellipsis\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <circle cx=\"12\" cy=\"12\" r=\"1\" />\n        <circle cx=\"19\" cy=\"12\" r=\"1\" />\n        <circle cx=\"5\" cy=\"12\" r=\"1\" />\n      </symbol>\n\n      <symbol id=\"icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n        <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n      </symbol>\n\n      <symbol id=\"icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <path d=\"M20 6 9 17l-5-5\" />\n      </symbol>\n\n      <symbol id=\"icon-chevron-right\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <path d=\"m9 18 6-6-6-6\" />\n      </symbol>\n\n      <symbol id=\"icon-settings\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" /><circle cx=\"12\" cy=\"12\" r=\"3\" />\n      </symbol>\n\n      <symbol id=\"icon-flame\" viewBox=\"0 0 24 24\">\n        <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n      </symbol>\n\n      <symbol id=\"icon-function\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" />\n        <path d=\"M9 17c2 0 2.8-1 2.8-2.8V10c0-2 1-3.3 3.2-3\" />\n        <path d=\"M9 11.2h5.7\" />\n      </symbol>\n\n      <symbol id=\"icon-triangle-alert\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n        <path d=\"M12 9v4\" />\n        <path d=\"M12 17h.01\" />\n      </symbol>\n\n      <symbol id=\"icon-gallery-horizontal-end\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <path d=\"M2 7v10\" /><path d=\"M6 5v14\" />\n        <rect width=\"12\" height=\"18\" x=\"10\" y=\"3\" rx=\"2\" />\n      </symbol>\n\n      <symbol id=\"icon-search\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <circle cx=\"11\" cy=\"11\" r=\"8\" />\n        <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n      </symbol>\n\n      <symbol id=\"icon-lock\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n        <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n      </symbol>\n\n      <symbol id=\"icon-lock-open\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n        <path d=\"M7 11V7a5 5 0 0 1 9.9-1\" />\n      </symbol>\n\n      <symbol id=\"icon-sanil\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <path d=\"M2 13a6 6 0 1 0 12 0 4 4 0 1 0-8 0 2 2 0 0 0 4 0\" />\n        <circle cx=\"10\" cy=\"13\" r=\"8\" />\n        <path d=\"M2 21h12c4.4 0 8-3.6 8-8V7a2 2 0 1 0-4 0v6\" />\n        <path d=\"M18 3 19.1 5.2\" />\n      </symbol>\n    </svg>\n  )\n};\n","import { createContext, type JSX } from \"preact\";\nimport { useCallback, useEffect, useRef, useState } from \"preact/hooks\";\nimport { Store, ReactScanInternals } from \"~core/index\";\nimport {\n  cn,\n  saveLocalStorage,\n  removeLocalStorage,\n  readLocalStorage,\n} from \"~web/utils/helpers\";\nimport { Content } from \"~web/views\";\nimport { ScanOverlay } from \"~web/views/inspector/overlay\";\nimport {\n  LOCALSTORAGE_KEY,\n  LOCALSTORAGE_COLLAPSED_KEY,\n  MIN_SIZE,\n  SAFE_AREA,\n  LOCALSTORAGE_LAST_VIEW_KEY,\n} from \"../constants\";\nimport {\n  defaultWidgetConfig,\n  signalRefWidget,\n  signalWidget,\n  signalWidgetViews,\n  updateDimensions,\n  type WidgetStates,\n} from \"../state\";\nimport {\n  calculateBoundedSize,\n  calculatePosition,\n  getBestCorner,\n} from \"./helpers\";\nimport { ResizeHandle } from \"./resize-handle\";\nimport { signalWidgetCollapsed } from \"~web/state\";\nimport { Icon } from \"~web/components/icon\";\nimport { Corner } from \"./types\";\nimport type { CollapsedPosition } from \"./types\";\n\nconst COLLAPSED_SIZE = {\n  horizontal: { width: 20, height: 48 },\n  vertical: { width: 48, height: 20 },\n} as const;\n\nexport const Widget = () => {\n  const refWidget = useRef<HTMLDivElement | null>(null);\n  const refShouldOpen = useRef<boolean>(false);\n\n  const refInitialMinimizedWidth = useRef<number>(0);\n  const refInitialMinimizedHeight = useRef<number>(0);\n  const refExpandingFromCollapsed = useRef<boolean>(false);\n\n  const updateWidgetPosition = useCallback((shouldSave = true) => {\n    if (!refWidget.current) return;\n\n    const { corner } = signalWidget.value;\n    let newWidth: number;\n    let newHeight: number;\n\n    if (signalWidgetCollapsed.value) {\n      const orientation =\n        signalWidgetCollapsed.value.orientation || \"horizontal\";\n      const size = COLLAPSED_SIZE[orientation];\n      newWidth = size.width;\n      newHeight = size.height;\n    } else if (refShouldOpen.current) {\n      const lastDims = signalWidget.value.lastDimensions;\n      newWidth = calculateBoundedSize(lastDims.width, 0, true);\n      newHeight = calculateBoundedSize(lastDims.height, 0, false);\n\n      if (refExpandingFromCollapsed.current) {\n        refExpandingFromCollapsed.current = false;\n      }\n    } else {\n      newWidth = refInitialMinimizedWidth.current;\n      newHeight = refInitialMinimizedHeight.current;\n    }\n\n    const newPosition = calculatePosition(corner, newWidth, newHeight);\n\n    // When collapsed, override position so arrow is flush against the viewport edge.\n    let finalPosition = newPosition;\n    if (signalWidgetCollapsed.value) {\n      const { corner: collapsedCorner, orientation = \"horizontal\" } =\n        signalWidgetCollapsed.value;\n      const size = COLLAPSED_SIZE[orientation];\n\n      switch (collapsedCorner) {\n        case \"top-left\":\n          finalPosition =\n            orientation === \"horizontal\"\n              ? { x: -1, y: SAFE_AREA }\n              : { x: SAFE_AREA, y: -1 };\n          break;\n        case \"bottom-left\":\n          finalPosition =\n            orientation === \"horizontal\"\n              ? { x: -1, y: window.innerHeight - size.height - SAFE_AREA }\n              : { x: SAFE_AREA, y: window.innerHeight - size.height + 1 };\n          break;\n        case \"top-right\":\n          finalPosition =\n            orientation === \"horizontal\"\n              ? { x: window.innerWidth - size.width + 1, y: SAFE_AREA }\n              : { x: window.innerWidth - size.width - SAFE_AREA, y: -1 };\n          break;\n        case \"bottom-right\":\n        default:\n          finalPosition =\n            orientation === \"horizontal\"\n              ? {\n                  x: window.innerWidth - size.width + 1,\n                  y: window.innerHeight - size.height - SAFE_AREA,\n                }\n              : {\n                  x: window.innerWidth - size.width - SAFE_AREA,\n                  y: window.innerHeight - size.height + 1,\n                };\n          break;\n      }\n    }\n\n    const isTooSmall =\n      newWidth < MIN_SIZE.width || newHeight < MIN_SIZE.initialHeight;\n    const shouldPersist = shouldSave && !isTooSmall;\n\n    const container = refWidget.current;\n    const containerStyle = container.style;\n\n    let rafId: number | null = null;\n    const onTransitionEnd = () => {\n      updateDimensions();\n      container.removeEventListener(\"transitionend\", onTransitionEnd);\n      if (rafId) {\n        cancelAnimationFrame(rafId);\n        rafId = null;\n      }\n    };\n\n    container.addEventListener(\"transitionend\", onTransitionEnd);\n    containerStyle.transition = \"all 0.25s cubic-bezier(0, 0, 0.2, 1)\";\n\n    rafId = requestAnimationFrame(() => {\n      containerStyle.width = `${newWidth}px`;\n      containerStyle.height = `${newHeight}px`;\n      containerStyle.transform = `translate3d(${finalPosition.x}px, ${finalPosition.y}px, 0)`;\n      rafId = null;\n    });\n\n    const newDimensions = {\n      isFullWidth: newWidth >= window.innerWidth - SAFE_AREA * 2,\n      isFullHeight: newHeight >= window.innerHeight - SAFE_AREA * 2,\n      width: newWidth,\n      height: newHeight,\n      position: finalPosition,\n    };\n\n    signalWidget.value = {\n      corner,\n      dimensions: newDimensions,\n      lastDimensions: refShouldOpen\n        ? signalWidget.value.lastDimensions\n        : newWidth > refInitialMinimizedWidth.current\n          ? newDimensions\n          : signalWidget.value.lastDimensions,\n      componentsTree: signalWidget.value.componentsTree,\n    };\n\n    if (shouldPersist) {\n      saveLocalStorage(LOCALSTORAGE_KEY, {\n        corner: signalWidget.value.corner,\n        dimensions: signalWidget.value.dimensions,\n        lastDimensions: signalWidget.value.lastDimensions,\n        componentsTree: signalWidget.value.componentsTree,\n      });\n    }\n\n    updateDimensions();\n  }, []);\n\n  const handleDrag = useCallback(\n    (e: JSX.TargetedPointerEvent<HTMLDivElement>) => {\n      e.preventDefault();\n\n      if (!refWidget.current || (e.target as HTMLElement).closest(\"button\"))\n        return;\n\n      const container = refWidget.current;\n      const containerStyle = container.style;\n      const { dimensions } = signalWidget.value;\n\n      const initialMouseX = e.clientX;\n      const initialMouseY = e.clientY;\n\n      const initialX = dimensions.position.x;\n      const initialY = dimensions.position.y;\n\n      let currentX = initialX;\n      let currentY = initialY;\n      let rafId: number | null = null;\n      let hasMoved = false;\n      let lastMouseX = initialMouseX;\n      let lastMouseY = initialMouseY;\n\n      const handlePointerMove = (e: globalThis.PointerEvent) => {\n        if (rafId) return;\n\n        hasMoved = true;\n        lastMouseX = e.clientX;\n        lastMouseY = e.clientY;\n\n        rafId = requestAnimationFrame(() => {\n          const deltaX = lastMouseX - initialMouseX;\n          const deltaY = lastMouseY - initialMouseY;\n\n          currentX = Number(initialX) + deltaX;\n          currentY = Number(initialY) + deltaY;\n\n          containerStyle.transition = \"none\";\n          containerStyle.transform = `translate3d(${currentX}px, ${currentY}px, 0)`;\n\n          const widgetRight = currentX + dimensions.width;\n          const widgetBottom = currentY + dimensions.height;\n\n          const outsideLeft = Math.max(0, -currentX);\n          const outsideRight = Math.max(0, widgetRight - window.innerWidth);\n          const outsideTop = Math.max(0, -currentY);\n          const outsideBottom = Math.max(0, widgetBottom - window.innerHeight);\n\n          const horizontalOutside = Math.min(\n            dimensions.width,\n            outsideLeft + outsideRight\n          );\n          const verticalOutside = Math.min(\n            dimensions.height,\n            outsideTop + outsideBottom\n          );\n          const areaOutside =\n            horizontalOutside * dimensions.height +\n            verticalOutside * dimensions.width -\n            horizontalOutside * verticalOutside;\n          const totalArea = dimensions.width * dimensions.height;\n\n          // todo: delete this doesn't do anything\n          let shouldCollapse = areaOutside > totalArea * 0.35;\n\n          if (!shouldCollapse && ReactScanInternals.options.value.showFPS) {\n            const fpsRight = currentX + dimensions.width;\n            const fpsLeft = fpsRight - 100;\n\n            const fpsFullyOutside =\n              fpsRight <= 0 ||\n              fpsLeft >= window.innerWidth ||\n              currentY + dimensions.height <= 0 ||\n              currentY >= window.innerHeight;\n\n            shouldCollapse = fpsFullyOutside;\n          }\n\n          if (shouldCollapse) {\n            const widgetCenterX = currentX + dimensions.width / 2;\n            const widgetCenterY = currentY + dimensions.height / 2;\n            const screenCenterX = window.innerWidth / 2;\n            const screenCenterY = window.innerHeight / 2;\n\n            let targetCorner: Corner;\n            if (widgetCenterX < screenCenterX) {\n              targetCorner =\n                widgetCenterY < screenCenterY ? \"top-left\" : \"bottom-left\";\n            } else {\n              targetCorner =\n                widgetCenterY < screenCenterY ? \"top-right\" : \"bottom-right\";\n            }\n\n            let orientation: \"horizontal\" | \"vertical\";\n            const horizontalOverflow = Math.max(outsideLeft, outsideRight);\n            const verticalOverflow = Math.max(outsideTop, outsideBottom);\n\n            orientation =\n              horizontalOverflow > verticalOverflow ? \"horizontal\" : \"vertical\";\n\n            signalWidget.value = {\n              ...signalWidget.value,\n              corner: targetCorner,\n              lastDimensions: {\n                ...dimensions,\n                position: calculatePosition(\n                  targetCorner,\n                  dimensions.width,\n                  dimensions.height\n                ),\n              },\n            };\n\n            const collapsedPosition: CollapsedPosition = {\n              corner: targetCorner,\n              orientation,\n            };\n\n            signalWidgetCollapsed.value = collapsedPosition;\n            saveLocalStorage(LOCALSTORAGE_COLLAPSED_KEY, collapsedPosition);\n            saveLocalStorage(LOCALSTORAGE_KEY, signalWidget.value);\n            updateWidgetPosition(false);\n\n            document.removeEventListener(\"pointermove\", handlePointerMove);\n            document.removeEventListener(\"pointerup\", handlePointerEnd);\n            if (rafId) {\n              cancelAnimationFrame(rafId);\n              rafId = null;\n            }\n          }\n\n          rafId = null;\n        });\n      };\n\n      const handlePointerEnd = () => {\n        if (!container) return;\n\n        if (rafId) {\n          cancelAnimationFrame(rafId);\n          rafId = null;\n        }\n\n        document.removeEventListener(\"pointermove\", handlePointerMove);\n        document.removeEventListener(\"pointerup\", handlePointerEnd);\n\n        // Calculate total movement distance\n        const totalDeltaX = Math.abs(lastMouseX - initialMouseX);\n        const totalDeltaY = Math.abs(lastMouseY - initialMouseY);\n        const totalMovement = Math.sqrt(\n          totalDeltaX * totalDeltaX + totalDeltaY * totalDeltaY\n        );\n\n        // Only consider it a move if we moved more than 60 pixels\n        if (!hasMoved || totalMovement < 60) return;\n\n        const newCorner = getBestCorner(\n          lastMouseX,\n          lastMouseY,\n          initialMouseX,\n          initialMouseY,\n          Store.inspectState.value.kind === \"focused\" ? 80 : 40\n        );\n\n        if (newCorner === signalWidget.value.corner) {\n          containerStyle.transition =\n            \"transform 0.25s cubic-bezier(0, 0, 0.2, 1)\";\n          const currentPosition = signalWidget.value.dimensions.position;\n          requestAnimationFrame(() => {\n            containerStyle.transform = `translate3d(${currentPosition.x}px, ${currentPosition.y}px, 0)`;\n          });\n\n          return;\n        }\n\n        const snappedPosition = calculatePosition(\n          newCorner,\n          dimensions.width,\n          dimensions.height\n        );\n\n        if (currentX === initialX && currentY === initialY) return;\n\n        const onTransitionEnd = () => {\n          containerStyle.transition = \"none\";\n          updateDimensions();\n          container.removeEventListener(\"transitionend\", onTransitionEnd);\n          if (rafId) {\n            cancelAnimationFrame(rafId);\n            rafId = null;\n          }\n        };\n\n        container.addEventListener(\"transitionend\", onTransitionEnd);\n        containerStyle.transition =\n          \"transform 0.25s cubic-bezier(0, 0, 0.2, 1)\";\n\n        requestAnimationFrame(() => {\n          containerStyle.transform = `translate3d(${snappedPosition.x}px, ${snappedPosition.y}px, 0)`;\n        });\n\n        signalWidget.value = {\n          corner: newCorner,\n          dimensions: {\n            isFullWidth: dimensions.isFullWidth,\n            isFullHeight: dimensions.isFullHeight,\n            width: dimensions.width,\n            height: dimensions.height,\n            position: snappedPosition,\n          },\n          lastDimensions: signalWidget.value.lastDimensions,\n          componentsTree: signalWidget.value.componentsTree,\n        };\n\n        saveLocalStorage(LOCALSTORAGE_KEY, {\n          corner: newCorner,\n          dimensions: signalWidget.value.dimensions,\n          lastDimensions: signalWidget.value.lastDimensions,\n          componentsTree: signalWidget.value.componentsTree,\n        });\n      };\n\n      document.addEventListener(\"pointermove\", handlePointerMove);\n      document.addEventListener(\"pointerup\", handlePointerEnd);\n    },\n    []\n  );\n\n  const handleCollapsedDrag = useCallback(\n    (e: JSX.TargetedPointerEvent<HTMLDivElement>) => {\n      e.preventDefault();\n\n      if (!refWidget.current || !signalWidgetCollapsed.value) return;\n\n      const { corner: collapsedCorner, orientation = \"horizontal\" } =\n        signalWidgetCollapsed.value;\n\n      const initialMouseX = e.clientX;\n      const initialMouseY = e.clientY;\n\n      let rafId: number | null = null;\n      let hasExpanded = false;\n\n      const DRAG_THRESHOLD = 50;\n\n      const handlePointerMove = (e: globalThis.PointerEvent) => {\n        if (hasExpanded || rafId) return;\n\n        const deltaX = e.clientX - initialMouseX;\n        const deltaY = e.clientY - initialMouseY;\n\n        let shouldExpand = false;\n\n        if (orientation === \"horizontal\") {\n          if (collapsedCorner.endsWith(\"left\") && deltaX > DRAG_THRESHOLD) {\n            shouldExpand = true;\n          } else if (\n            collapsedCorner.endsWith(\"right\") &&\n            deltaX < -DRAG_THRESHOLD\n          ) {\n            shouldExpand = true;\n          }\n        } else {\n          if (collapsedCorner.startsWith(\"top\") && deltaY > DRAG_THRESHOLD) {\n            shouldExpand = true;\n          } else if (\n            collapsedCorner.startsWith(\"bottom\") &&\n            deltaY < -DRAG_THRESHOLD\n          ) {\n            shouldExpand = true;\n          }\n        }\n\n        if (shouldExpand) {\n          hasExpanded = true;\n\n          signalWidgetCollapsed.value = null;\n          saveLocalStorage(LOCALSTORAGE_COLLAPSED_KEY, null);\n\n          if (refInitialMinimizedWidth.current === 0 && refWidget.current) {\n            requestAnimationFrame(() => {\n              if (refWidget.current) {\n                refWidget.current.style.width = \"min-content\";\n                const naturalWidth = refWidget.current.offsetWidth;\n                refInitialMinimizedWidth.current = naturalWidth || 300;\n\n                const lastDims = signalWidget.value.lastDimensions;\n                const targetWidth = calculateBoundedSize(\n                  lastDims.width,\n                  0,\n                  true\n                );\n                const targetHeight = calculateBoundedSize(\n                  lastDims.height,\n                  0,\n                  false\n                );\n\n                let newX = e.clientX - targetWidth / 2;\n                let newY = e.clientY - targetHeight / 2;\n\n                newX = Math.max(\n                  SAFE_AREA,\n                  Math.min(newX, window.innerWidth - targetWidth - SAFE_AREA)\n                );\n                newY = Math.max(\n                  SAFE_AREA,\n                  Math.min(newY, window.innerHeight - targetHeight - SAFE_AREA)\n                );\n\n                signalWidget.value = {\n                  ...signalWidget.value,\n                  dimensions: {\n                    ...signalWidget.value.dimensions,\n                    position: { x: newX, y: newY },\n                  },\n                };\n\n                updateWidgetPosition(true);\n\n                const savedView = readLocalStorage<WidgetStates>(\n                  LOCALSTORAGE_LAST_VIEW_KEY\n                );\n                signalWidgetViews.value = savedView || { view: \"none\" };\n\n                setTimeout(() => {\n                  if (refWidget.current) {\n                    const dragEvent = new PointerEvent(\"pointerdown\", {\n                      clientX: e.clientX,\n                      clientY: e.clientY,\n                      pointerId: e.pointerId,\n                      bubbles: true,\n                    });\n                    refWidget.current.dispatchEvent(dragEvent);\n                  }\n                }, 100);\n              }\n            });\n          } else {\n            updateWidgetPosition(true);\n            const savedView = readLocalStorage<WidgetStates>(\n              LOCALSTORAGE_LAST_VIEW_KEY\n            );\n            signalWidgetViews.value = savedView || { view: \"none\" };\n          }\n\n          document.removeEventListener(\"pointermove\", handlePointerMove);\n          document.removeEventListener(\"pointerup\", handlePointerEnd);\n        }\n      };\n\n      const handlePointerEnd = () => {\n        if (rafId) {\n          cancelAnimationFrame(rafId);\n          rafId = null;\n        }\n        document.removeEventListener(\"pointermove\", handlePointerMove);\n        document.removeEventListener(\"pointerup\", handlePointerEnd);\n      };\n\n      document.addEventListener(\"pointermove\", handlePointerMove);\n      document.addEventListener(\"pointerup\", handlePointerEnd);\n    },\n    []\n  );\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    if (!refWidget.current) return;\n\n    removeLocalStorage(LOCALSTORAGE_LAST_VIEW_KEY);\n\n    if (!signalWidgetCollapsed.value) {\n      refWidget.current.style.width = \"min-content\";\n      refInitialMinimizedHeight.current = 36; // height of the header\n      refInitialMinimizedWidth.current = refWidget.current.offsetWidth;\n    } else {\n      refInitialMinimizedHeight.current = 36;\n      refInitialMinimizedWidth.current = 0;\n    }\n\n    refWidget.current.style.maxWidth = `calc(100vw - ${SAFE_AREA * 2}px)`;\n    refWidget.current.style.maxHeight = `calc(100vh - ${SAFE_AREA * 2}px)`;\n\n    updateWidgetPosition();\n\n    if (\n      Store.inspectState.value.kind !== \"focused\" &&\n      !signalWidgetCollapsed.value &&\n      !refExpandingFromCollapsed.current\n    ) {\n      signalWidget.value = {\n        ...signalWidget.value,\n        dimensions: {\n          isFullWidth: false,\n          isFullHeight: false,\n          width: refInitialMinimizedWidth.current,\n          height: refInitialMinimizedHeight.current,\n          position: signalWidget.value.dimensions.position,\n        },\n      };\n    }\n\n    signalRefWidget.value = refWidget.current;\n\n    const unsubscribeSignalWidget = signalWidget.subscribe((widget) => {\n      if (!refWidget.current) return;\n\n      const { x, y } = widget.dimensions.position;\n      const { width, height } = widget.dimensions;\n      const container = refWidget.current;\n\n      requestAnimationFrame(() => {\n        container.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n        container.style.width = `${width}px`;\n        container.style.height = `${height}px`;\n      });\n    });\n\n    const unsubscribeSignalWidgetViews = signalWidgetViews.subscribe(\n      (state) => {\n        refShouldOpen.current = state.view !== \"none\";\n        updateWidgetPosition();\n\n        if (!signalWidgetCollapsed.value) {\n          if (state.view !== \"none\") {\n            saveLocalStorage(LOCALSTORAGE_LAST_VIEW_KEY, state);\n          } else {\n            removeLocalStorage(LOCALSTORAGE_LAST_VIEW_KEY);\n          }\n        }\n      }\n    );\n\n    const unsubscribeStoreInspectState = Store.inspectState.subscribe(\n      (state) => {\n        refShouldOpen.current = state.kind === \"focused\";\n        updateWidgetPosition();\n      }\n    );\n\n    const handleWindowResize = () => {\n      updateWidgetPosition(true);\n    };\n\n    window.addEventListener(\"resize\", handleWindowResize, { passive: true });\n\n    return () => {\n      window.removeEventListener(\"resize\", handleWindowResize);\n      unsubscribeSignalWidgetViews();\n      unsubscribeStoreInspectState();\n      unsubscribeSignalWidget();\n\n      saveLocalStorage(LOCALSTORAGE_KEY, {\n        ...defaultWidgetConfig,\n        corner: signalWidget.value.corner,\n      });\n    };\n  }, []);\n\n  // i don't want to put the ref in state, so this is the solution to force context to propagate it\n  const [_, setTriggerRender] = useState(false);\n  useEffect(() => {\n    setTriggerRender(true);\n  }, []);\n\n  const isCollapsed = signalWidgetCollapsed.value;\n\n  let arrowRotationClass = \"\";\n  if (isCollapsed) {\n    const { orientation = \"horizontal\", corner } = isCollapsed;\n    if (orientation === \"horizontal\") {\n      arrowRotationClass = corner?.endsWith(\"right\") ? \"rotate-180\" : \"\";\n    } else {\n      arrowRotationClass = corner?.startsWith(\"bottom\")\n        ? \"-rotate-90\"\n        : \"rotate-90\";\n    }\n  }\n\n  return (\n    <>\n      <ScanOverlay />\n      <ToolbarElementContext.Provider value={refWidget.current}>\n        <div\n          id=\"react-scan-toolbar\"\n          dir=\"ltr\"\n          ref={refWidget}\n          onPointerDown={!isCollapsed ? handleDrag : handleCollapsedDrag}\n          className={cn(\n            \"fixed inset-0\",\n            isCollapsed\n              ? (() => {\n                  const { orientation = \"horizontal\", corner } = isCollapsed;\n                  if (orientation === \"horizontal\") {\n                    return corner?.endsWith(\"right\")\n                      ? \"rounded-tl-lg rounded-bl-lg shadow-lg\"\n                      : \"rounded-tr-lg rounded-br-lg shadow-lg\";\n                  } else {\n                    return corner?.startsWith(\"bottom\")\n                      ? \"rounded-tl-lg rounded-tr-lg shadow-lg\"\n                      : \"rounded-bl-lg rounded-br-lg shadow-lg\";\n                  }\n                })()\n              : \"rounded-lg shadow-lg\",\n            \"flex flex-col\",\n            \"font-mono text-[13px]\",\n            \"user-select-none\",\n            \"opacity-0\",\n            isCollapsed ? \"cursor-pointer\" : \"cursor-move\",\n            \"z-[124124124124]\",\n            \"animate-fade-in animation-duration-300 animation-delay-300\",\n            \"will-change-transform\",\n            \"[touch-action:none]\"\n          )}\n          style={{ WebkitAppRegion: \"no-drag\" }}\n        >\n          {/* this entire feature is vibe coded don't think too hard about the code its probably very non coherent */}\n          {isCollapsed ? (\n            <button\n              type=\"button\"\n              onClick={() => {\n                signalWidgetCollapsed.value = null;\n                saveLocalStorage(LOCALSTORAGE_COLLAPSED_KEY, null);\n\n                if (\n                  refInitialMinimizedWidth.current === 0 &&\n                  refWidget.current\n                ) {\n                  requestAnimationFrame(() => {\n                    if (refWidget.current) {\n                      refWidget.current.style.width = \"min-content\";\n                      const naturalWidth = refWidget.current.offsetWidth;\n                      refInitialMinimizedWidth.current = naturalWidth || 300;\n                      updateWidgetPosition(true);\n                    }\n                  });\n                }\n\n                const savedView = readLocalStorage<WidgetStates>(\n                  LOCALSTORAGE_LAST_VIEW_KEY\n                );\n                signalWidgetViews.value = savedView || { view: \"none\" };\n              }}\n              className=\"flex items-center justify-center w-full h-full text-white\"\n              title=\"Expand toolbar\"\n            >\n              <Icon\n                name=\"icon-chevron-right\"\n                size={16}\n                className={cn(\"transition-transform\", arrowRotationClass)}\n              />\n            </button>\n          ) : (\n            <>\n              <ResizeHandle position=\"top\" />\n              <ResizeHandle position=\"bottom\" />\n              <ResizeHandle position=\"left\" />\n              <ResizeHandle position=\"right\" />\n              <Content />\n            </>\n          )}\n        </div>\n      </ToolbarElementContext.Provider>\n    </>\n  );\n};\n\nexport const ToolbarElementContext = createContext<HTMLElement | null>(null);\n","import { type ReadonlySignal, computed } from '@preact/signals';\nimport type { ReactNode } from 'preact/compat';\nimport { Store } from '~core/index';\nimport { signalWidgetViews } from '~web/state';\nimport { cn } from '~web/utils/helpers';\nimport { Header } from '~web/widget/header';\nimport { ViewInspector } from './inspector';\nimport { Toolbar } from './toolbar';\nimport { NotificationWrapper } from './notifications/notifications';\n\nconst isInspecting = computed(\n  () => Store.inspectState.value.kind === 'inspecting',\n);\n\nconst headerClassName = computed(() =>\n  cn(\n    'relative',\n    'flex-1',\n    'flex flex-col',\n    'rounded-t-lg',\n    'overflow-hidden',\n    'opacity-100',\n    'transition-[opacity]',\n    isInspecting.value && 'opacity-0 duration-0 delay-0',\n  ),\n);\n\nconst isInspectorViewOpen = computed(\n  () => signalWidgetViews.value.view === 'inspector',\n);\nconst isNotificationsViewOpen = computed(\n  () => signalWidgetViews.value.view === 'notifications',\n);\n\nexport const Content = () => {\n  return (\n    <div\n      className={cn(\n        'flex flex-1 flex-col',\n        'overflow-hidden z-10',\n        'rounded-lg',\n        'bg-black',\n        'opacity-100',\n        'transition-[border-radius]',\n        'peer-hover/left:rounded-l-none',\n        'peer-hover/right:rounded-r-none',\n        'peer-hover/top:rounded-t-none',\n        'peer-hover/bottom:rounded-b-none',\n      )}\n    >\n      <div className={headerClassName}>\n        <Header />\n        <div\n          className={cn(\n            'relative',\n            'flex-1 flex',\n            'text-white',\n            'bg-[#0A0A0A]',\n            'transition-opacity delay-150',\n            'overflow-hidden',\n            'border-b border-[#222]',\n          )}\n        >\n          <ContentView isOpen={isInspectorViewOpen}>\n            <ViewInspector />\n          </ContentView>\n\n          <ContentView isOpen={isNotificationsViewOpen}>\n            <NotificationWrapper />\n          </ContentView>\n        </div>\n      </div>\n      <Toolbar />\n    </div>\n  );\n};\n\ninterface ContentViewProps {\n  isOpen: ReadonlySignal<boolean>;\n  children: ReactNode;\n}\n\nconst ContentView = ({ isOpen, children }: ContentViewProps) => {\n  return (\n    <div\n      className={cn(\n        'flex-1',\n        'opacity-0',\n        'overflow-y-auto overflow-x-hidden',\n        'transition-opacity delay-0',\n        'pointer-events-none',\n        isOpen.value && 'opacity-100 delay-150 pointer-events-auto',\n      )}\n    >\n      <div className=\"absolute inset-0 flex\">{children}</div>\n    </div>\n  );\n};\n","import { useEffect, useState } from 'preact/hooks';\n\n/**\n * Delays a boolean value change by a specified duration.\n * Perfect for coordinating animations with state changes.\n *\n * @param {boolean} value - The boolean value to delay\n * @param {number} onDelay - Milliseconds to wait before changing to true\n * @param {number} [offDelay] - Milliseconds to wait before changing to false (defaults to onDelay)\n * @returns {boolean} The delayed value\n *\n * @example\n * // Delay both transitions by 300ms\n * const isVisible = useDelayedValue(show, 300);\n *\n * @example\n * // Quick show (100ms), slow hide (500ms)\n * const isVisible = useDelayedValue(show, 100, 500);\n *\n * @example\n * // Use with CSS transitions\n * const isVisible = useDelayedValue(show, 300);\n * return (\n *   <div\n *     className=\"transition-all duration-300\"\n *     style={{\n *       opacity: isVisible ? 1 : 0,\n *       transform: isVisible ? 'none' : 'translateY(4px)'\n *     }}\n *   >\n *     {content}\n *   </div>\n * );\n */\nexport const useDelayedValue = (\n  value: boolean,\n  onDelay: number,\n  offDelay: number = onDelay,\n): boolean => {\n  const [delayedValue, setDelayedValue] = useState(value);\n\n  /*\n   * oxlint-disable-next-line react-hooks/exhaustive-deps\n   * delayedValue is intentionally omitted to prevent unnecessary timeouts\n   * and used only in the early return check\n   */\n  useEffect(() => {\n    if (value === delayedValue) return;\n\n    const delay = value ? onDelay : offDelay;\n    const timeout = setTimeout(() => setDelayedValue(value), delay);\n\n    return () => clearTimeout(timeout);\n  }, [value, onDelay, offDelay]);\n\n  return delayedValue;\n};\n","import { computed, untracked, useSignalEffect } from '@preact/signals';\nimport type { Fiber } from 'bippy';\nimport { useMemo, useRef, useState } from 'preact/hooks';\nimport { Store } from '~core/index';\nimport { signalIsSettingsOpen } from '~web/state';\nimport { cn, getExtendedDisplayName } from '~web/utils/helpers';\nimport { timelineState } from './states';\n\nconst headerInspectClassName = computed(() =>\n  cn(\n    'absolute inset-0 flex items-center gap-x-2',\n    'translate-y-0',\n    'transition-transform duration-300',\n    signalIsSettingsOpen.value && '-translate-y-[200%]',\n  ),\n);\n\nexport const HeaderInspect = () => {\n  const refReRenders = useRef<HTMLSpanElement>(null);\n  const refTiming = useRef<HTMLSpanElement>(null);\n  const [currentFiber, setCurrentFiber] = useState<Fiber | null>(null);\n\n  useSignalEffect(() => {\n    const state = Store.inspectState.value;\n\n    if (state.kind === 'focused') {\n      setCurrentFiber(state.fiber);\n    }\n  });\n\n  useSignalEffect(() => {\n    const state = timelineState.value;\n    untracked(() => {\n      if (Store.inspectState.value.kind !== 'focused') return;\n      if (!refReRenders.current || !refTiming.current) return;\n\n      const { totalUpdates, currentIndex, updates, isVisible, windowOffset } =\n        state;\n\n      const reRenders = Math.max(0, totalUpdates - 1);\n      const headerText = isVisible\n        ? `#${windowOffset + currentIndex} Re-render`\n        : reRenders > 0\n          ? `×${reRenders}`\n          : '';\n\n      let formattedTime: string | undefined;\n      if (reRenders > 0 && currentIndex >= 0 && currentIndex < updates.length) {\n        const time = updates[currentIndex]?.fiberInfo?.selfTime;\n        formattedTime =\n          time > 0\n            ? time < 0.1 - Number.EPSILON\n              ? '< 0.1ms'\n              : `${Number(time.toFixed(1))}ms`\n            : undefined;\n      }\n\n      // TODO(Alexis): can be computed signal\n      refReRenders.current.dataset.text = headerText ? ` • ${headerText}` : '';\n      refTiming.current.dataset.text = formattedTime\n        ? ` • ${formattedTime}`\n        : '';\n    });\n  });\n\n  const componentName = useMemo(() => {\n    if (!currentFiber) return null;\n    const { name, wrappers, wrapperTypes } =\n      getExtendedDisplayName(currentFiber);\n\n    const title = wrappers.length\n      ? `${wrappers.join('(')}(${name})${')'.repeat(wrappers.length)}`\n      : (name ?? '');\n\n    const firstWrapperType = wrapperTypes[0];\n    return (\n      <span title={title} className=\"flex items-center gap-x-1\">\n        {name ?? 'Unknown'}\n        <span\n          title={firstWrapperType?.title}\n          className=\"flex items-center gap-x-1 text-[10px] text-purple-400\"\n        >\n          {!!firstWrapperType && (\n            <>\n              <span\n                key={firstWrapperType.type}\n                className={cn(\n                  'rounded py-[1px] px-1',\n                  'truncate',\n                  firstWrapperType.compiler && 'bg-purple-800 text-neutral-400',\n                  !firstWrapperType.compiler &&\n                    'bg-neutral-700 text-neutral-300',\n                  firstWrapperType.type === 'memo' && 'bg-[#5f3f9a] text-white',\n                )}\n              >\n                {firstWrapperType.type}\n              </span>\n              {firstWrapperType.compiler && (\n                <span className=\"text-yellow-300\">✨</span>\n              )}\n            </>\n          )}\n        </span>\n        {wrapperTypes.length > 1 && (\n          <span className=\"text-[10px] text-neutral-400\">\n            ×{wrapperTypes.length - 1}\n          </span>\n        )}\n      </span>\n    );\n  }, [currentFiber]);\n\n  return (\n    <div className={headerInspectClassName}>\n      {componentName}\n      {/* useless info */}\n      <div className=\"flex items-center gap-x-2 mr-auto text-xs text-[#888]\">\n        <span\n          ref={refReRenders}\n          className=\"with-data-text cursor-pointer !overflow-visible\"\n          title=\"Click to toggle between rerenders and total renders\"\n        />\n        <span ref={refTiming} className=\"with-data-text !overflow-visible\" />\n      </div>\n    </div>\n  );\n};\n","import { Store } from '~core/index';\nimport { Icon } from '~web/components/icon';\nimport { useDelayedValue } from '~web/hooks/use-delayed-value';\nimport { signalWidgetViews } from '~web/state';\nimport { cn } from '~web/utils/helpers';\nimport { HeaderInspect } from '~web/views/inspector/header';\n\nexport const Header = () => {\n  const isInitialView = useDelayedValue(\n    Store.inspectState.value.kind === 'focused',\n    150,\n    0,\n  );\n  const handleClose = () => {\n    signalWidgetViews.value = {\n      view: 'none',\n    };\n    Store.inspectState.value = {\n      kind: 'inspect-off',\n    };\n  };\n\n  const isHeaderIsNotifications =\n    signalWidgetViews.value.view === 'notifications';\n\n  if (isHeaderIsNotifications) {\n    return;\n  }\n\n  return (\n    <div className=\"react-scan-header\">\n      <div className=\"relative flex-1 h-full\">\n        <div\n          className={cn(\n            'react-scan-header-item is-visible',\n            !isInitialView && '!duration-0',\n          )}\n        >\n          <HeaderInspect />\n        </div>\n      </div>\n\n      <button\n        type=\"button\"\n        title=\"Close\"\n        className=\"react-scan-close-button\"\n        onClick={handleClose}\n      >\n        <Icon name=\"icon-close\" />\n      </button>\n    </div>\n  );\n};\n","import { useSignalEffect } from '@preact/signals';\nimport {\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useState,\n} from 'preact/hooks';\nimport {\n  type LocalStorageOptions,\n  ReactScanInternals,\n  Store,\n} from '~core/index';\nimport { Icon } from '~web/components/icon';\nimport { Toggle } from '~web/components/toggle';\nimport { signalWidgetViews } from '~web/state';\nimport { cn, readLocalStorage, saveLocalStorage } from '~web/utils/helpers';\nimport { constant } from '~web/utils/preact/constant';\nimport { FPSMeter } from '~web/widget/fps-meter';\nimport { getEventSeverity } from '../notifications/data';\nimport { Notification } from '../notifications/icons';\nimport { useAppNotifications } from '../notifications/notifications';\n\nexport const Toolbar = constant(() => {\n  const events = useAppNotifications();\n  const [laggedEvents, setLaggedEvents] = useState(events);\n\n  useEffect(() => {\n    const timeout = setTimeout(() => {\n      setLaggedEvents(events);\n      // 500 + buffer to never see intermediary state\n      // todo: check if we still need this large of buffer\n    }, 500 + 100);\n    return () => {\n      clearTimeout(timeout);\n    };\n  }, [events]);\n\n  const inspectState = Store.inspectState;\n  const isInspectActive = inspectState.value.kind === 'inspecting';\n  const isInspectFocused = inspectState.value.kind === 'focused';\n\n  const [seenEvents, setSeenEvents] = useState<Array<string>>([]);\n\n  const onToggleInspect = useCallback(() => {\n    const currentState = Store.inspectState.value;\n\n    switch (currentState.kind) {\n      case 'inspecting': {\n        signalWidgetViews.value = {\n          view: 'none',\n        };\n        Store.inspectState.value = {\n          kind: 'inspect-off',\n        };\n        return;\n      }\n\n      case 'focused': {\n        signalWidgetViews.value = {\n          view: 'inspector',\n        };\n        Store.inspectState.value = {\n          kind: 'inspecting',\n          hoveredDomElement: null,\n        };\n        return;\n      }\n      // todo: auto select the root fibers first stateNode, and tell the user to select the element\n      case 'inspect-off': {\n        signalWidgetViews.value = {\n          view: 'none',\n        };\n        Store.inspectState.value = {\n          kind: 'inspecting',\n          hoveredDomElement: null,\n        };\n        return;\n      }\n      case 'uninitialized': {\n        return;\n      }\n    }\n  }, []);\n\n  const onToggleActive = useCallback((e: Event) => {\n    e.preventDefault();\n    e.stopPropagation();\n\n    if (!ReactScanInternals.instrumentation) {\n      return;\n    }\n    // todo: set a single source of truth\n    const isPaused = !ReactScanInternals.instrumentation.isPaused.value;\n    ReactScanInternals.instrumentation.isPaused.value = isPaused;\n    const existingLocalStorageOptions =\n      readLocalStorage<LocalStorageOptions>('react-scan-options');\n    saveLocalStorage('react-scan-options', {\n      ...existingLocalStorageOptions,\n      enabled: !isPaused,\n    });\n  }, []);\n\n  useSignalEffect(() => {\n    const state = Store.inspectState.value;\n    if (state.kind === 'uninitialized') {\n      Store.inspectState.value = {\n        kind: 'inspect-off',\n      };\n    }\n  });\n\n  let inspectIcon = null;\n  let inspectColor = '#999';\n\n  if (isInspectActive) {\n    inspectIcon = <Icon name=\"icon-inspect\" />;\n    inspectColor = '#8e61e3';\n  } else if (isInspectFocused) {\n    inspectIcon = <Icon name=\"icon-focus\" />;\n    inspectColor = '#8e61e3';\n  } else {\n    inspectIcon = <Icon name=\"icon-inspect\" />;\n    inspectColor = '#999';\n  }\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useLayoutEffect(() => {\n    if (signalWidgetViews.value.view !== 'notifications') {\n      return;\n    }\n    const ids = new Set(events.map((event) => event.id));\n    setSeenEvents([...ids.values()]);\n  }, [events.length, signalWidgetViews.value.view]);\n\n  return (\n    <div className=\"flex max-h-9 min-h-9 flex-1 items-stretch overflow-hidden\">\n      <div className=\"h-full flex items-center min-w-fit\">\n        <button\n          type=\"button\"\n          id=\"react-scan-inspect-element\"\n          title=\"Inspect element\"\n          onClick={onToggleInspect}\n          className=\"button flex items-center justify-center h-full w-full pl-3 pr-2.5\"\n          style={{ color: inspectColor }}\n        >\n          {inspectIcon}\n        </button>\n      </div>\n\n      <div className=\"h-full flex items-center justify-center\">\n        <button\n          type=\"button\"\n          id=\"react-scan-notifications\"\n          title=\"Notifications\"\n          onClick={() => {\n            if (Store.inspectState.value.kind !== 'inspect-off') {\n              Store.inspectState.value = {\n                kind: 'inspect-off',\n              };\n            }\n            switch (signalWidgetViews.value.view) {\n              case 'inspector': {\n                Store.inspectState.value = {\n                  kind: 'inspect-off',\n                };\n\n                const ids = new Set(events.map((event) => event.id));\n                setSeenEvents([...ids.values()]);\n                signalWidgetViews.value = {\n                  view: 'notifications',\n                };\n                return;\n              }\n              case 'notifications': {\n                signalWidgetViews.value = {\n                  view: 'none',\n                };\n                return;\n              }\n              case 'none': {\n                const ids = new Set(events.map((event) => event.id));\n                setSeenEvents([...ids.values()]);\n                signalWidgetViews.value = {\n                  view: 'notifications',\n                };\n                return;\n              }\n            }\n          }}\n          className=\"button flex items-center justify-center h-full pl-2.5 pr-2.5\"\n          style={{ color: inspectColor }}\n        >\n          <Notification\n            events={laggedEvents\n              .filter((event) => !seenEvents.includes(event.id))\n              .map((event) => getEventSeverity(event) === 'high')}\n            size={16}\n            className={cn([\n              'text-[#999]',\n              signalWidgetViews.value.view === 'notifications' &&\n                'text-[#8E61E3]',\n            ])}\n          />\n        </button>\n      </div>\n\n      <Toggle\n        checked={!ReactScanInternals.instrumentation?.isPaused.value}\n        onChange={onToggleActive}\n        className=\"place-self-center\"\n        title=\"Outline Re-renders\"\n      />\n\n      {/* todo add back showFPS*/}\n      {ReactScanInternals.options.value.showFPS && <FPSMeter />}\n    </div>\n  );\n});\n","import type { JSX } from 'preact';\nimport { cn } from '~web/utils/helpers';\n\ninterface ToggleProps extends JSX.HTMLAttributes<HTMLInputElement> {\n  checked: boolean;\n  onChange: ((e: Event) => void);\n  className?: string;\n};\n\nexport const Toggle = ({\n  className,\n  ...props\n}: ToggleProps) => {\n  return (\n    <div className={cn('react-scan-toggle', className)}>\n      <input\n        type=\"checkbox\"\n        {...props}\n      />\n      <div />\n    </div>\n  );\n};\n","import { useEffect, useState } from 'preact/hooks';\nimport { getFPS } from '~core/instrumentation';\nimport { cn } from '~web/utils/helpers';\n\nexport const FpsMeterInner = ({fps}:{fps: number}) => {\n\n\n  const getColor = (fps: number) => {\n    if (fps < 30) return '#EF4444';\n    if (fps < 50) return '#F59E0B';\n    return 'rgb(214,132,245)';\n  };\n\n  return (\n    <div\n      className={cn(\n        'flex items-center gap-x-1 px-2 w-full',\n        'h-6',\n        'rounded-md',\n        'font-mono leading-none',\n        'bg-[#141414]',\n        'ring-1 ring-white/[0.08]',\n      )}\n    >\n      <div\n        style={{ color: getColor(fps) }}\n        className=\"text-sm font-semibold tracking-wide transition-colors ease-in-out w-full flex justify-center items-center\"\n      >\n        {fps}\n      </div>\n      <span className=\"text-white/30 text-[11px] font-medium tracking-wide ml-auto min-w-fit\">\n        FPS\n      </span>\n    </div>\n  );\n};\n\n\nexport const FPSMeter = () => {\n  const [fps, setFps] = useState<null | number>(null);\n\n  useEffect(() => {\n    const intervalId = setInterval(() => {\n      setFps(getFPS());\n    }, 200);\n\n    return () => clearInterval(intervalId);\n  }, []);\n\n  return (\n    <div\n      className={cn(\n        'flex items-center justify-end gap-x-2 px-1 ml-1 w-[72px]',\n        'whitespace-nowrap text-sm text-white',\n      )}\n    >\n      {/* fixme: default fps state*/}\n      {fps === null ? <>️</> : <FpsMeterInner fps={fps} />}\n    </div>\n  );\n};\n\n\n","import { createContext } from 'preact';\nimport { SetStateAction } from 'preact/compat';\nimport { Dispatch, useContext } from 'preact/hooks';\nimport { HIGH_SEVERITY_FPS_DROP_TIME } from '~core/notifications/event-tracking';\nimport { getFiberFromElement } from '../inspector/utils';\nimport { hasMemoCache } from 'bippy';\n\nexport type GroupedFiberRender = {\n  id: string;\n  name: string;\n  count: number;\n  changes: {\n    props: Array<{ name: string; count: number }>;\n    state: Array<{ index: number; count: number }>;\n    context: Array<{ name: string; count: number }>;\n  };\n  // fixme: incorrect assumption, make this nullable\n  /** Not available when running in production, but we will not render notifications in production */\n  totalTime: number;\n  elements: Array<Element>; // can't do a weak set because need to iterate over them......\n  deletedAll: boolean;\n  parents: Set<string>;\n  hasMemoCache: boolean;\n  wasFiberRenderMount: boolean;\n};\nexport const getComponentName = (path: Array<string>) => {\n  const filteredPath = path.filter((item) => item.length > 2);\n  // in production, all names can be minified\n  if (filteredPath.length === 0) {\n    return path.at(-1) ?? 'Unknown';\n  }\n  // oxlint-disable-next-line typescript/no-non-null-assertion\n  return filteredPath.at(-1)!;\n};\n\nexport const getTotalTime = (\n  timing: InteractionTiming | DroppedFramesTiming,\n) => {\n  switch (timing.kind) {\n    case 'interaction': {\n      const {\n        renderTime,\n        otherJSTime,\n        framePreparation,\n        frameConstruction,\n        frameDraw,\n      } = timing;\n      return (\n        renderTime +\n        otherJSTime +\n        framePreparation +\n        frameConstruction +\n        (frameDraw ?? 0)\n      );\n    }\n    case 'dropped-frames': {\n      return timing.otherTime + timing.renderTime;\n    }\n  }\n};\n\nexport type DroppedFramesTiming = {\n  kind: 'dropped-frames';\n  renderTime: number;\n  otherTime: number;\n};\nexport type InteractionTiming = {\n  kind: 'interaction';\n  renderTime: number;\n  otherJSTime: number;\n  /** After JS, before paint. Things like layerize, css style recalcs */\n  framePreparation: number;\n  /** paint/commit. This is where the browser constructs the data structure that represents what will be drawn to screen */\n  frameConstruction: number;\n  /** GPU/compositing/rasterization. This is where, off the main thread, the data structure built is used to draw the next frame. This value is not available on safari due to lack of PerformanceEntry API */\n  frameDraw: number | null;\n};\n\nexport const isRenderMemoizable = (\n  groupedFiberRender: GroupedFiberRender,\n): boolean => {\n  if (groupedFiberRender.wasFiberRenderMount) {\n    // no amount of memoization can prevent a mount render\n    return false;\n  }\n  // this shouldn't be needed, it implies we either are tracking renders wrong, are tracking changes wrong, or are not tracking some other \"state\" that can cause re-renders, but its a better fallback than failing\n  if (groupedFiberRender.hasMemoCache) {\n    return false;\n  }\n\n  return (\n    groupedFiberRender.changes.context.length === 0 &&\n    groupedFiberRender.changes.props.length === 0 &&\n    groupedFiberRender.changes.state.length === 0\n  );\n};\n\nexport const getTimeSplit = (\n  timing: DroppedFramesTiming | InteractionTiming,\n) => {\n  switch (timing.kind) {\n    case 'dropped-frames': {\n      return {\n        render: timing.renderTime,\n        other: timing.otherTime,\n      };\n    }\n    case 'interaction': {\n      return {\n        render: timing.renderTime,\n        other: getTotalTime(timing) + timing.renderTime,\n      };\n    }\n  }\n};\n\nexport type InteractionEvent = {\n  kind: 'interaction';\n  type: 'click' | 'keyboard';\n  id: string;\n  componentPath: Array<string>;\n  groupedFiberRenders: Array<GroupedFiberRender>;\n  timing: InteractionTiming;\n  /** Not available in safari, and API used to get value is not stable on chrome */\n  memory: number | null;\n  timestamp: number;\n};\nexport type DroppedFramesEvent = {\n  kind: 'dropped-frames';\n  id: string;\n  groupedFiberRenders: Array<GroupedFiberRender>;\n  timing: DroppedFramesTiming;\n  /** Not available in safari, and API used to get value is not stable on chrome */\n  memory: number | null;\n  timestamp: number;\n  fps: number;\n};\nexport type NotificationEvent = InteractionEvent | DroppedFramesEvent;\n\nexport type NotificationsState = {\n  events: Array<NotificationEvent>;\n  // todo: discriminated union this all, i don't want to do it yet till i stabilize the data i need/ implement it all\n  selectedEvent: NotificationEvent | null;\n  filterBy: 'severity' | 'latest';\n  selectedFiber: NotificationEvent['groupedFiberRenders'][number] | null;\n  detailsExpanded: boolean;\n  moreInfoExpanded: boolean;\n  route:\n    | 'render-visualization'\n    | 'other-visualization'\n    // | \"render-guide\"\n    | 'render-explanation'\n    // | \"other-guide\"\n    | 'optimize';\n  /**\n   * Conceptually a synthetic query parameter\n   */\n  routeMessage: null | {\n    kind: 'auto-open-overview-accordion';\n    name:\n      | 'other-not-javascript'\n      | 'other-javascript'\n      | 'render'\n      | 'other-frame-drop';\n  };\n  audioNotificationsOptions:\n    | {\n        audioContext: null;\n        enabled: false;\n      }\n    | {\n        enabled: true;\n        audioContext: AudioContext;\n      };\n};\n\nexport const getEventSeverity = (event: NotificationEvent) => {\n  const totalTime = getTotalTime(event.timing);\n  switch (event.kind) {\n    case 'interaction': {\n      if (totalTime < 200) return 'low';\n      if (totalTime < 500) return 'needs-improvement';\n      return 'high';\n    }\n    case 'dropped-frames': {\n      if (totalTime < 50) return 'low';\n      if (totalTime < HIGH_SEVERITY_FPS_DROP_TIME) return 'needs-improvement';\n      return 'high';\n    }\n  }\n};\n\nexport const getReadableSeverity = (\n  severity: 'low' | 'needs-improvement' | 'high',\n) => {\n  switch (severity) {\n    case 'high': {\n      return 'Poor';\n    }\n    case 'needs-improvement': {\n      return 'Laggy';\n    }\n    case 'low': {\n      return 'Good';\n    }\n  }\n};\nexport const NOTIFICATIONS_BORDER = '#27272A';\nexport const useNotificationsContext = () =>\n  useContext(NotificationStateContext);\n\nexport const NotificationStateContext = createContext<{\n  notificationState: NotificationsState;\n  setNotificationState: Dispatch<SetStateAction<NotificationsState>>;\n  setRoute: ({\n    route,\n    routeMessage,\n  }: {\n    route: NotificationsState['route'];\n    routeMessage: NotificationsState['routeMessage'] | null;\n  }) => void;\n  // oxlint-disable-next-line typescript/no-non-null-assertion\n}>(null!);\n","import { useSyncExternalStore } from 'preact/compat';\nimport { not_globally_unique_generateId } from '~core/utils';\nimport { MAX_INTERACTION_BATCH, interactionStore } from './interaction-store';\nimport {\n  FiberRenders,\n  PerformanceEntryChannelEvent,\n  TimeoutStage,\n  listenForPerformanceEntryInteractions,\n  listenForRenders,\n  setupDetailedPointerTimingListener,\n  setupPerformancePublisher,\n} from './performance';\nimport {\n  MAX_CHANNEL_SIZE,\n  performanceEntryChannels,\n} from './performance-store';\nimport { BoundedArray } from './performance-utils';\nimport { createStore } from '~web/utils/create-store';\n\nlet profileListeners: Array<(interaction: FinalInteraction) => void> = [];\n\ntype FinalInteraction = {\n  detailedTiming: TimeoutStage;\n  latency: number;\n  completedAt: number;\n};\n\nexport const listenForProfile = (\n  listener: (interaction: FinalInteraction) => void,\n) => {\n  profileListeners.push(listener);\n\n  return () => {\n    profileListeners = profileListeners.filter(\n      (existingListener) => existingListener !== listener,\n    );\n  };\n};\n\nexport let interactionStatus:\n  | { kind: 'started'; startedAt: number }\n  | { kind: 'completed'; startedAt: number; endedAt: number }\n  | { kind: 'no-interaction' } = {\n  kind: 'no-interaction',\n};\n\ntype NewInteractionStoreState = {\n  /**\n   * problem definition: we need to store bounds but how do we handle uninitialized bounds\n   *\n   * i guess what we said before, we just have one active bounds and that's all that matters chat\n   */\n\n  startAt: number;\n  endAt: number;\n};\n\nexport const interactionStatusStore: {\n  state: NewInteractionStoreState | null;\n  listeners: Array<(state: NewInteractionStoreState) => void>;\n  addListener: (cb: (state: NewInteractionStoreState) => void) => () => void;\n} = {\n  state: null,\n  addListener: (cb) => {\n    interactionStatusStore.listeners.push(cb);\n    return () => {\n      interactionStatusStore.listeners =\n        interactionStatusStore.listeners.filter((l) => l !== cb);\n    };\n  },\n  listeners: [],\n};\n\nlet accumulatedFiberRendersOverTask: null | FiberRenders = null;\ntype InteractionEvent = {\n  kind: 'interaction';\n  data: {\n    startAt: number;\n    endAt: number;\n    meta: {\n      detailedTiming: TimeoutStage;\n      latency: number;\n      kind: PerformanceEntryChannelEvent['kind'];\n    };\n  };\n};\n\ntype LongRenderPipeline = {\n  kind: 'long-render';\n  data: {\n    startAt: number;\n    endAt: number;\n    meta: {\n      latency: number;\n      fiberRenders: FiberRenders;\n      fps: number;\n    };\n  };\n};\n\nexport type SlowdownEvent = (InteractionEvent | LongRenderPipeline) & {\n  id: string;\n};\n\ntype ToolbarEventStoreState = {\n  state: {\n    events: BoundedArray<SlowdownEvent>;\n  };\n  actions: {\n    addEvent: (event: SlowdownEvent) => void;\n    addListener: (listener: (event: SlowdownEvent) => void) => () => void;\n    clear: () => void;\n  };\n};\n\ntype DebugEvent = {\n  kind: string;\n  at: number;\n  meta?: unknown;\n};\nexport const debugEventStore = createStore<{\n  state: {\n    events: Array<DebugEvent>;\n  };\n  actions: {\n    // oxlint-disable-next-line typescript/no-explicit-any\n    addEvent: (event: any) => void;\n    clear: () => void;\n  };\n}>()((set) => ({\n  state: {\n    events: [],\n  },\n  actions: {\n    addEvent: (event: DebugEvent) => {\n      set((store) => ({\n        state: {\n          events: [...store.state.events, event],\n        },\n      }));\n    },\n    clear: () => {\n      set({\n        state: {\n          events: [],\n        },\n      });\n    },\n  },\n}));\n\nconst EVENT_STORE_CAPACITY = 200;\n\nexport const toolbarEventStore = createStore<ToolbarEventStoreState>()(\n  (set, get) => {\n    const listeners = new Set<(event: SlowdownEvent) => void>();\n\n    return {\n      state: {\n        events: new BoundedArray(EVENT_STORE_CAPACITY),\n      },\n\n      actions: {\n        addEvent: (event: SlowdownEvent) => {\n          listeners.forEach((listener) => listener(event));\n\n          const events = [...get().state.events, event];\n          const applyOverlapCheckToLongRenderEvent = (\n            longRenderEvent: LongRenderPipeline & { id: string },\n            onOverlap: (\n              overlapsWith: InteractionEvent & { id: string },\n            ) => void,\n          ) => {\n            const overlapsWith = events.find((event) => {\n              if (event.kind === 'long-render') {\n                return;\n              }\n\n              if (event.id === longRenderEvent.id) {\n                return;\n              }\n\n              /**\n               * |---x-----------x------ (interaction)\n               * |x-----------x          (long-render)\n               */\n\n              if (\n                longRenderEvent.data.startAt <= event.data.startAt &&\n                longRenderEvent.data.endAt <= event.data.endAt &&\n                longRenderEvent.data.endAt >= event.data.startAt\n              ) {\n                return true;\n              }\n\n              /**\n             * |x-----------x---- (interaction)\n             * |--x------------x  (long-render)\n             *\n\n             */\n\n              if (\n                event.data.startAt <= longRenderEvent.data.startAt &&\n                event.data.endAt >= longRenderEvent.data.startAt\n              ) {\n                return true;\n              }\n\n              /**\n               *\n               * |--x-------------x    (interaction)\n               * |x------------------x (long-render)\n               *\n               */\n\n              if (\n                longRenderEvent.data.startAt <= event.data.startAt &&\n                longRenderEvent.data.endAt >= event.data.endAt\n              ) {\n                return true;\n              }\n            }) as undefined | (InteractionEvent & { id: string }); // invariant: because we early check the typechecker does not know it must be the case that when it finds something, it will be an interaction it overlaps with\n\n            if (overlapsWith) {\n              onOverlap(overlapsWith);\n            }\n          };\n\n          const toRemove = new Set<string>();\n\n          events.forEach((event) => {\n            if (event.kind === 'interaction') return;\n            applyOverlapCheckToLongRenderEvent(event, () => {\n              toRemove.add(event.id);\n            });\n          });\n\n          const withRemovedEvents = events.filter(\n            (event) => !toRemove.has(event.id),\n          );\n\n          set(() => ({\n            state: {\n              events: BoundedArray.fromArray(\n                withRemovedEvents,\n                EVENT_STORE_CAPACITY,\n              ),\n            },\n          }));\n        },\n\n        addListener: (listener: (event: SlowdownEvent) => void) => {\n          listeners.add(listener);\n          return () => {\n            listeners.delete(listener);\n          };\n        },\n\n        clear: () => {\n          set({\n            state: {\n              events: new BoundedArray(EVENT_STORE_CAPACITY),\n            },\n          });\n        },\n      },\n    };\n  },\n);\n\nexport const useToolbarEventLog = () => {\n  return useSyncExternalStore(\n    toolbarEventStore.subscribe,\n    toolbarEventStore.getState,\n  );\n};\n\nlet taskDirtyAt: null | number = null;\nlet taskDirtyOrigin: null | number = null;\n\nlet previousTrackCurrentMouseOverElementCallback:\n  | ((e: MouseEvent) => void)\n  | null = null;\n\nlet overToolbar: boolean | null;\n\nconst trackCurrentMouseOverToolbar = () => {\n  const callback = (e: MouseEvent) => {\n    overToolbar = e\n      .composedPath()\n      .map((path) => (path as Element).id)\n      .filter(Boolean)\n      .includes('react-scan-toolbar');\n  };\n\n  document.addEventListener('mouseover', callback);\n  previousTrackCurrentMouseOverElementCallback = callback;\n\n  return () => {\n    if (previousTrackCurrentMouseOverElementCallback) {\n      document.removeEventListener(\n        'mouseover',\n        previousTrackCurrentMouseOverElementCallback,\n      );\n    }\n  };\n};\n\n// stops long tasks b/c backgrounded from being reported\nexport const startDirtyTaskTracking = () => {\n  const onVisibilityChange = () => {\n    taskDirtyAt = performance.now();\n    taskDirtyOrigin = performance.timeOrigin;\n  };\n\n  document.addEventListener('visibilitychange', onVisibilityChange);\n\n  return () => {\n    document.removeEventListener('visibilitychange', onVisibilityChange);\n  };\n};\n\nexport const HIGH_SEVERITY_FPS_DROP_TIME = 150;\n\nlet framesDrawnInTheLastSecond: Array<number> = [];\n\nexport function startLongPipelineTracking() {\n  let rafHandle: number;\n  let timeoutHandle: ReturnType<typeof setTimeout>;\n\n  function measure() {\n    let unSub: (() => void) | null = null;\n    accumulatedFiberRendersOverTask = null;\n    accumulatedFiberRendersOverTask = {};\n    unSub = listenForRenders(accumulatedFiberRendersOverTask);\n    const startOrigin = performance.timeOrigin;\n    const startTime = performance.now();\n    rafHandle = requestAnimationFrame(() => {\n      // very low overhead, on the order of dozens of microseconds to run\n      timeoutHandle = setTimeout(() => {\n        const endNow = performance.now();\n        const duration = endNow - startTime;\n        const endOrigin = performance.timeOrigin;\n        framesDrawnInTheLastSecond.push(endNow + endOrigin);\n\n        const framesInTheLastSecond = framesDrawnInTheLastSecond.filter(\n          (frameAt) => endNow + endOrigin - frameAt <= 1000,\n        );\n\n        const fps = framesInTheLastSecond.length;\n        framesDrawnInTheLastSecond = framesInTheLastSecond;\n\n        const taskConsideredDirty =\n          taskDirtyAt !== null && taskDirtyOrigin !== null\n            ? endNow + endOrigin - (taskDirtyOrigin + taskDirtyAt) < 100\n            : null;\n        // not useful to report slowdowns caused by things like outlines (can get expensive not fully optimized)\n        const wasTaskInfluencedByToolbar = overToolbar !== null && overToolbar;\n\n        if (\n          duration > HIGH_SEVERITY_FPS_DROP_TIME &&\n          !taskConsideredDirty &&\n          document.visibilityState === 'visible' &&\n          !wasTaskInfluencedByToolbar\n        ) {\n          const endAt = endOrigin + endNow;\n          const startAt = startTime + startOrigin;\n\n          toolbarEventStore.getState().actions.addEvent({\n            kind: 'long-render',\n            id: not_globally_unique_generateId(),\n            data: {\n              endAt: endAt,\n              startAt: startAt,\n              meta: {\n                // oxlint-disable-next-line typescript/no-non-null-assertion\n                fiberRenders: accumulatedFiberRendersOverTask!,\n                latency: duration,\n                fps,\n              },\n            },\n          });\n        }\n\n        taskDirtyAt = null;\n        taskDirtyOrigin = null;\n\n        unSub?.();\n        measure();\n      }, 0);\n    });\n    return unSub;\n  }\n\n  const measureUnSub = measure();\n\n  return () => {\n    measureUnSub();\n    cancelAnimationFrame(rafHandle);\n    clearTimeout(timeoutHandle);\n  };\n}\nexport const startTimingTracking = () => {\n  const unSubPerformance = setupPerformancePublisher();\n  const unSubMouseOver = trackCurrentMouseOverToolbar();\n  const unSubDirtyTaskTracking = startDirtyTaskTracking();\n  const unSubLongPipelineTracking = startLongPipelineTracking();\n\n  const onComplete = async (\n    _: string,\n    finalInteraction: FinalInteraction,\n    event: PerformanceEntryChannelEvent,\n  ) => {\n    toolbarEventStore.getState().actions.addEvent({\n      kind: 'interaction',\n      id: not_globally_unique_generateId(),\n      data: {\n        startAt: finalInteraction.detailedTiming.blockingTimeStart,\n        endAt: performance.now() + performance.timeOrigin,\n        meta: { ...finalInteraction, kind: event.kind }, // TODO, will need interaction specific metadata here\n      },\n    });\n\n    const existingCompletedInteractions =\n      performanceEntryChannels.getChannelState('recording');\n\n    finalInteraction.detailedTiming.stopListeningForRenders();\n\n    if (existingCompletedInteractions.length) {\n      // then performance entry and our detailed timing handlers are out of sync, we disregard that entry\n      // it may be possible the performance entry returned before detailed timing. If that's the case we should update\n      // assumptions and deal with mapping the entry back to the detailed timing here\n      performanceEntryChannels.updateChannelState(\n        'recording',\n        () => new BoundedArray(MAX_CHANNEL_SIZE),\n      );\n    }\n  };\n  const unSubDetailedPointerTiming = setupDetailedPointerTimingListener(\n    'pointer',\n    {\n      onComplete,\n    },\n  );\n  const unSubDetailedKeyboardTiming = setupDetailedPointerTimingListener(\n    'keyboard',\n    {\n      onComplete,\n    },\n  );\n\n  const unSubInteractions = listenForPerformanceEntryInteractions(\n    (completedInteraction) => {\n      interactionStore.setState(\n        BoundedArray.fromArray(\n          interactionStore.getCurrentState().concat(completedInteraction),\n          MAX_INTERACTION_BATCH,\n        ),\n      );\n    },\n  );\n\n  return () => {\n    unSubMouseOver();\n    unSubDirtyTaskTracking();\n    unSubLongPipelineTracking();\n    unSubPerformance();\n    unSubDetailedPointerTiming();\n    unSubInteractions();\n    unSubDetailedKeyboardTiming();\n  };\n};\n","import { Fiber } from 'bippy';\nexport const getChildrenFromFiberLL = (fiber: Fiber) => {\n  const children: Array<Fiber> = [];\n\n  let curr: typeof fiber.child = fiber.child;\n\n  while (curr) {\n    children.push(curr);\n\n    curr = curr.sibling;\n  }\n\n  return children;\n};\n\ntype Node = Map<\n  Fiber,\n  {\n    children: Array<Fiber>;\n    parent: Fiber | null;\n    isRoot: boolean;\n    isSVG: boolean;\n  }\n>;\n\nexport const createChildrenAdjacencyList = (root: Fiber, limit: number) => {\n  const tree: Node = new Map([]);\n\n  const queue: Array<[node: Fiber, parent: Fiber | null]> = [];\n  const visited = new Set<Fiber>();\n\n  queue.push([root, root.return]);\n  let traversed = 1;\n\n  while (queue.length) {\n    if (traversed >= limit) {\n      return tree;\n    }\n    // oxlint-disable-next-line typescript/no-non-null-assertion\n    const [node, parent] = queue.pop()!;\n    const children = getChildrenFromFiberLL(node);\n\n    tree.set(node, {\n      children: [],\n      parent,\n      isRoot: node === root,\n      isSVG: node.type === 'svg',\n    });\n\n    for (const child of children) {\n      traversed += 1;\n      // this isn't needed since the fiber tree is a TREE, not a graph, but it makes me feel safer\n      if (visited.has(child)) {\n        continue;\n      }\n      visited.add(child);\n      tree.get(node)?.children.push(child);\n      queue.push([child, node]);\n    }\n  }\n  return tree;\n};\n\nconst THROW_INVARIANTS = false;\n\nexport const invariantError = (message: string | undefined) => {\n  if (THROW_INVARIANTS) {\n    throw new Error(message);\n  }\n};\n\nexport const iife = <T>(fn: () => T): T => fn();\n\nexport class BoundedArray<T> extends Array<T> {\n  constructor(private capacity: number = 25) {\n    super();\n  }\n\n  push(...items: T[]): number {\n    const result = super.push(...items);\n    while (this.length > this.capacity) {\n      this.shift();\n    }\n    return result;\n  }\n  // do not couple capacity with a default param, it must be explicit\n  static fromArray<T>(array: Array<T>, capacity: number) {\n    const arr = new BoundedArray<T>(capacity);\n    arr.push(...array);\n    return arr;\n  }\n}\n","import { BoundedArray } from \"~core/notifications/performance-utils\";\nimport { CompletedInteraction } from \"./performance\";\n\ntype Subscriber<T> = (data: T) => void;\n\nexport class Store<T> {\n  private subscribers: Set<Subscriber<T>> = new Set();\n  private currentValue: T;\n\n  constructor(initialValue: T) {\n    this.currentValue = initialValue;\n  }\n\n  subscribe(subscriber: Subscriber<T>): () => void {\n    this.subscribers.add(subscriber);\n\n    subscriber(this.currentValue);\n\n    return () => {\n      this.subscribers.delete(subscriber);\n    };\n  }\n\n  setState(data: T) {\n    this.currentValue = data;\n    this.subscribers.forEach((subscriber) => subscriber(data));\n  }\n\n  getCurrentState(): T {\n    return this.currentValue;\n  }\n}\nexport const MAX_INTERACTION_BATCH = 150;\nexport const interactionStore = new Store<BoundedArray<CompletedInteraction>>(\n  new BoundedArray(MAX_INTERACTION_BATCH)\n);\n","import {\n  Fiber,\n  getDisplayName,\n  getTimings,\n  hasMemoCache,\n  isHostFiber,\n  traverseFiber,\n} from 'bippy';\nimport { Store } from '../index';\n\nimport {\n  BoundedArray,\n  invariantError,\n} from '~core/notifications/performance-utils';\nimport {\n  SectionData,\n  collectInspectorDataWithoutCounts,\n} from '~web/views/inspector/timeline/utils';\nimport {\n  getFiberFromElement,\n  getParentCompositeFiber,\n} from '~web/views/inspector/utils';\nimport { performanceEntryChannels } from './performance-store';\nimport type {\n  PerformanceInteraction,\n  PerformanceInteractionEntry,\n} from './types';\nimport { not_globally_unique_generateId } from '~core/utils';\n\ninterface PathFilters {\n  skipProviders: boolean;\n  skipHocs: boolean;\n  skipContainers: boolean;\n  skipMinified: boolean;\n  skipUtilities: boolean;\n  skipBoundaries: boolean;\n}\n\nconst DEFAULT_PATH_FILTERS: PathFilters = {\n  skipProviders: true,\n  skipHocs: true,\n  skipContainers: true,\n  skipMinified: true,\n  skipUtilities: true,\n  skipBoundaries: true,\n};\n\nconst PATH_FILTER_PATTERNS = {\n  providers: [/Provider$/, /^Provider$/, /^Context$/],\n  hocs: [/^with[A-Z]/, /^forward(?:Ref)?$/i, /^Forward(?:Ref)?\\(/],\n  containers: [/^(?:App)?Container$/, /^Root$/, /^ReactDev/],\n  utilities: [\n    /^Fragment$/,\n    /^Suspense$/,\n    /^ErrorBoundary$/,\n    /^Portal$/,\n    /^Consumer$/,\n    /^Layout$/,\n    /^Router/,\n    /^Hydration/,\n  ],\n  boundaries: [/^Boundary$/, /Boundary$/, /^Provider$/, /Provider$/],\n};\n\nconst shouldIncludeInPath = (\n  name: string,\n  filters: PathFilters = DEFAULT_PATH_FILTERS,\n): boolean => {\n  const patternsToCheck: Array<RegExp> = [];\n  if (filters.skipProviders) patternsToCheck.push(...PATH_FILTER_PATTERNS.providers);\n  if (filters.skipHocs) patternsToCheck.push(...PATH_FILTER_PATTERNS.hocs);\n  if (filters.skipContainers) patternsToCheck.push(...PATH_FILTER_PATTERNS.containers);\n  if (filters.skipUtilities) patternsToCheck.push(...PATH_FILTER_PATTERNS.utilities);\n  if (filters.skipBoundaries) patternsToCheck.push(...PATH_FILTER_PATTERNS.boundaries);\n  return !patternsToCheck.some((pattern) => pattern.test(name));\n};\n\nconst minifiedPatterns = [\n  /^[a-z]$/,\n  /^[a-z][0-9]$/,\n  /^_+$/,\n  /^[A-Za-z][_$]$/,\n  /^[a-z]{1,2}$/,\n];\n\nconst isMinified = (name: string): boolean => {\n  for (let i = 0; i < minifiedPatterns.length; i++) {\n    if (minifiedPatterns[i].test(name)) return true;\n  }\n  const hasNoVowels = !/[aeiou]/i.test(name);\n  const hasMostlyNumbers = (name.match(/\\d/g)?.length ?? 0) > name.length / 2;\n  const isSingleWordLowerCase = /^[a-z]+$/.test(name);\n  const hasRandomLookingChars = /[$_]{2,}/.test(name);\n  return (\n    Number(hasNoVowels) +\n      Number(hasMostlyNumbers) +\n      Number(isSingleWordLowerCase) +\n      Number(hasRandomLookingChars) >=\n    2\n  );\n};\n\ninterface FiberType {\n  displayName?: string;\n  name?: string;\n  [key: string]: unknown;\n}\n\nconst getCleanComponentName = (component: FiberType): string => {\n  const name = getDisplayName(component);\n  if (!name) return '';\n  return name.replace(\n    /^(?:Memo|Forward(?:Ref)?|With.*?)\\((?<inner>.*?)\\)$/,\n    '$<inner>',\n  );\n};\n\nconst getInteractionPath = (\n  initialFiber: Fiber | null,\n  filters: PathFilters = DEFAULT_PATH_FILTERS,\n): Array<string> => {\n  if (!initialFiber) return [];\n\n  const currentName = getDisplayName(initialFiber.type);\n  if (!currentName) return [];\n\n  const stack = new Array<string>();\n  let fiber = initialFiber;\n  while (fiber.return) {\n    const name = getCleanComponentName(fiber.type);\n    if (name && !isMinified(name) && shouldIncludeInPath(name, filters) && name.toLowerCase() !== name) {\n      stack.push(name);\n    }\n    fiber = fiber.return;\n  }\n  const fullPath = new Array<string>(stack.length);\n  for (let i = 0; i < stack.length; i++) {\n    fullPath[i] = stack[stack.length - i - 1];\n  }\n  return fullPath;\n};\n\nconst getFirstNameFromAncestor = (\n  fiber: Fiber,\n  accept: (name: string) => boolean = () => true,\n) => {\n  let curr: Fiber | null = fiber;\n\n  while (curr) {\n    const currName = getDisplayName(curr.type);\n    if (currName && accept(currName)) {\n      return currName;\n    }\n\n    curr = curr.return;\n  }\n  return null;\n};\n\nlet unsubscribeTrackVisibilityChange: (() => void) | undefined;\n// fixme: compress me if this stays here for bad interaction time checks\nlet lastVisibilityHiddenAt: number | 'never-hidden' = 'never-hidden';\n\nconst trackVisibilityChange = () => {\n  unsubscribeTrackVisibilityChange?.();\n  const onVisibilityChange = () => {\n    if (document.hidden) {\n      lastVisibilityHiddenAt = Date.now();\n    }\n  };\n  document.addEventListener('visibilitychange', onVisibilityChange);\n\n  unsubscribeTrackVisibilityChange = () => {\n    document.removeEventListener('visibilitychange', onVisibilityChange);\n  };\n};\nexport type FiberRenders = Record<\n  string,\n  {\n    renderCount: number;\n    parents: Set<string>;\n    selfTime: number;\n    totalTime: number;\n    hasMemoCache: boolean;\n    wasFiberRenderMount: boolean;\n    nodeInfo: Array<{\n      selfTime: number;\n      element: Element;\n      name: string;\n    }>;\n    changes: ReturnType<typeof collectInspectorDataWithoutCounts>;\n  }\n>;\n\n/**\n * we need to fix:\n * - if there's a tab switch during a task being tracked, then u disregard that task (i hope this doesn't make tab switches hard to debug that cause slowdowns, ug i suppose it probably would, right? Depends how the browser queues it but i suppose u can think of a scenario. It would be most optimal to subtract the timing but not sure how reliable that would be)\n * - we need to see why the tracking is just off\n * - we need to correctly implement the precise activation this time\n */\n\ntype InteractionStartStage = {\n  kind: 'interaction-start';\n  interactionType: 'pointer' | 'keyboard';\n  interactionUUID: string;\n  interactionStartDetail: number;\n  blockingTimeStart: number;\n  componentPath: Array<string>;\n  componentName: string;\n  childrenTree: Record<\n    string,\n    { children: Array<string>; firstNamedAncestor: string; isRoot: boolean }\n  >;\n  fiberRenders: FiberRenders;\n  stopListeningForRenders: () => void;\n};\n\ntype JSEndStage = Omit<InteractionStartStage, 'kind'> & {\n  kind: 'js-end-stage';\n  jsEndDetail: number;\n};\n\ntype RAFStage = Omit<JSEndStage, 'kind'> & {\n  kind: 'raf-stage';\n  rafStart: number;\n};\n\nexport type TimeoutStage = Omit<RAFStage, 'kind'> & {\n  kind: 'timeout-stage';\n  commitEnd: number;\n  blockingTimeEnd: number;\n};\n\nexport type PerformanceEntryChannelEvent =\n  | {\n      kind: 'entry-received';\n      entry: PerformanceInteraction;\n    }\n  | {\n      kind: 'auto-complete-race';\n      interactionUUID: string;\n      detailedTiming: TimeoutStage;\n    };\n\nexport type CompletedInteraction = {\n  detailedTiming: TimeoutStage;\n  latency: number;\n  completedAt: number;\n  flushNeeded: boolean;\n};\n\ntype UnInitializedStage = {\n  kind: 'uninitialized-stage';\n  // todo: no longer a uuid\n  interactionUUID: string;\n  interactionType: 'pointer' | 'keyboard';\n};\n\ntype CurrentInteraction = {\n  kind: 'pointer' | 'keyboard';\n  interactionUUID: string;\n  pointerUpStart: number;\n  // needed for when inputs that can be clicked and trigger on change (like checkboxes)\n  clickChangeStart: number | null;\n  clickHandlerMicroTaskEnd: number | null;\n  rafStart: number | null;\n  commmitEnd: number | null;\n  timeorigin: number;\n\n  // for now i don't trust performance now timing for UTC time...\n  blockingTimeStart: number;\n  blockingTimeEnd: number | null;\n  fiberRenders: Map<\n    string,\n    {\n      renderCount: number;\n      parents: Set<string>;\n      selfTime: number;\n    }\n  >;\n  componentPath: Array<string>;\n  componentName: string;\n  childrenTree: Record<\n    string,\n    { children: Array<string>; firstNamedAncestor: string; isRoot: boolean }\n  >;\n};\n\nexport let currentInteractions: Array<CurrentInteraction> = [];\nconst getInteractionType = (\n  eventName: string,\n): 'pointer' | 'keyboard' | null => {\n  // todo: track pointer down, but tends to not house expensive logic so not very high priority\n  if (['pointerup', 'click'].includes(eventName)) {\n    return 'pointer';\n  }\n  if (eventName.includes('key')) {\n  }\n  if (['keydown', 'keyup'].includes(eventName)) {\n    return 'keyboard';\n  }\n  return null;\n};\nlet onEntryAnimationId: number | null = null;\nconst setupPerformanceListener = (\n  onEntry: (interaction: PerformanceInteraction) => void,\n) => {\n  trackVisibilityChange();\n  const interactionMap = new Map<string, PerformanceInteraction>();\n  const interactionTargetMap = new Map<string, Element>();\n\n  const processInteractionEntry = (entry: PerformanceInteractionEntry) => {\n    if (!entry.interactionId) return;\n\n    if (\n      entry.interactionId &&\n      entry.target &&\n      !interactionTargetMap.has(entry.interactionId)\n    ) {\n      interactionTargetMap.set(entry.interactionId, entry.target);\n    }\n    if (entry.target) {\n      let current: Element | null = entry.target;\n      while (current) {\n        if (\n          current.id === 'react-scan-toolbar-root' ||\n          current.id === 'react-scan-root'\n        ) {\n          return;\n        }\n        current = current.parentElement;\n      }\n    }\n\n    const existingInteraction = interactionMap.get(entry.interactionId);\n\n    if (existingInteraction) {\n      if (entry.duration > existingInteraction.latency) {\n        existingInteraction.entries = [entry];\n        existingInteraction.latency = entry.duration;\n      } else if (\n        entry.duration === existingInteraction.latency &&\n        entry.startTime === existingInteraction.entries[0].startTime\n      ) {\n        existingInteraction.entries.push(entry);\n      }\n    } else {\n      const interactionType = getInteractionType(entry.name);\n      if (!interactionType) {\n        return;\n      }\n\n      const interaction: PerformanceInteraction = {\n        id: entry.interactionId,\n        latency: entry.duration,\n        entries: [entry],\n        target: entry.target,\n        type: interactionType,\n        startTime: entry.startTime,\n        endTime: Date.now(),\n        processingStart: entry.processingStart,\n        processingEnd: entry.processingEnd,\n        duration: entry.duration,\n        inputDelay: entry.processingStart - entry.startTime,\n        processingDuration: entry.processingEnd - entry.processingStart,\n        presentationDelay:\n          entry.duration - (entry.processingEnd - entry.startTime),\n        // componentPath:\n        timestamp: Date.now(),\n        timeSinceTabInactive:\n          lastVisibilityHiddenAt === 'never-hidden'\n            ? 'never-hidden'\n            : Date.now() - lastVisibilityHiddenAt,\n        visibilityState: document.visibilityState,\n        timeOrigin: performance.timeOrigin,\n        referrer: document.referrer,\n      };\n      //\n      interactionMap.set(interaction.id, interaction);\n\n      /**\n       * This seems odd, but it gives us determinism that we will receive an entry AFTER our detailed timing collection\n       * runs because browser semantics (raf(() => setTimeout) will always run before a doubleRaf)\n       *\n       * this also handles the case where multiple entries are dispatched for semantically the same interaction,\n       * they will get merged into a single interaction, where the largest latency is recorded, which is what\n       * we are interested in this application\n       */\n\n      if (!onEntryAnimationId) {\n        onEntryAnimationId = requestAnimationFrame(() => {\n          requestAnimationFrame(() => {\n            // oxlint-disable-next-line typescript/no-non-null-assertion\n            onEntry(interactionMap.get(interaction.id)!);\n            onEntryAnimationId = null;\n          });\n        });\n      }\n    }\n  };\n\n  const po = new PerformanceObserver((list) => {\n    const entries = list.getEntries();\n    for (let i = 0, len = entries.length; i < len; i++) {\n      const entry = entries[i];\n      processInteractionEntry(entry as PerformanceInteractionEntry);\n    }\n  });\n\n  try {\n    po.observe({\n      type: 'event',\n      buffered: true,\n      durationThreshold: 16,\n    } as PerformanceObserverInit);\n    po.observe({\n      type: 'first-input',\n      buffered: true,\n    });\n  } catch {\n    /* Should collect error logs*/\n  }\n\n  return () => po.disconnect();\n};\n\nexport const setupPerformancePublisher = () => {\n  return setupPerformanceListener((entry) => {\n    performanceEntryChannels.publish(\n      {\n        kind: 'entry-received',\n        entry,\n      },\n      'recording',\n    );\n  });\n};\n\n// we should actually only feed it the information it needs to complete so we can support safari\ntype Task = {\n  completeInteraction: (\n    entry: PerformanceEntryChannelEvent,\n  ) => CompletedInteraction;\n  startDateTime: number;\n  endDateTime: number;\n  type: 'keyboard' | 'pointer';\n  interactionUUID: string;\n};\nexport const MAX_INTERACTION_TASKS = 25;\n\nlet tasks = new BoundedArray<Task>(MAX_INTERACTION_TASKS);\n\nconst getAssociatedDetailedTimingInteraction = (\n  entry: PerformanceInteraction,\n  activeTasks: Array<Task>,\n) => {\n  let closestTask: Task | null = null;\n  for (const task of activeTasks) {\n    if (task.type !== entry.type) {\n      continue;\n    }\n\n    if (closestTask === null) {\n      closestTask = task;\n      continue;\n    }\n\n    const getAbsoluteDiff = (task: Task, entry: PerformanceInteraction) =>\n      Math.abs(task.startDateTime) - (entry.startTime + entry.timeOrigin);\n\n    if (getAbsoluteDiff(task, entry) < getAbsoluteDiff(closestTask, entry)) {\n      closestTask = task;\n    }\n  }\n\n  return closestTask;\n};\n\n// this would be cool if it listened for merge, so it had to be after\nexport const listenForPerformanceEntryInteractions = (\n  onComplete: (completedInteraction: CompletedInteraction) => void,\n) => {\n  // we make the assumption that the detailed timing will be ready before the performance timing\n  const unsubscribe = performanceEntryChannels.subscribe(\n    'recording',\n    (event) => {\n      const associatedDetailedInteraction =\n        event.kind === 'auto-complete-race'\n          ? tasks.find((task) => task.interactionUUID === event.interactionUUID)\n          : getAssociatedDetailedTimingInteraction(event.entry, tasks);\n\n      // REMINDME: this likely means we clicked a non interactable thing but our handler still ran\n      // so we shouldn't treat this as an invariant, but instead use it to verify if we clicked\n      // something interactable\n      if (!associatedDetailedInteraction) {\n        return;\n      }\n\n      const completedInteraction =\n        associatedDetailedInteraction.completeInteraction(event);\n      onComplete(completedInteraction);\n    },\n  );\n\n  return unsubscribe;\n};\n\ntype ShouldContinue = boolean;\nconst trackDetailedTiming = ({\n  onMicroTask,\n  onRAF,\n  onTimeout,\n  abort,\n}: {\n  onMicroTask: () => ShouldContinue;\n  onRAF: () => ShouldContinue;\n  onTimeout: () => void;\n  abort?: () => boolean;\n}) => {\n  queueMicrotask(() => {\n    if (abort?.() === true) {\n      return;\n    }\n\n    if (!onMicroTask()) {\n      return;\n    }\n    requestAnimationFrame(() => {\n      if (abort?.() === true) {\n        return;\n      }\n      if (!onRAF()) {\n        return;\n      }\n      setTimeout(() => {\n        if (abort?.() === true) {\n          return;\n        }\n        onTimeout();\n      }, 0);\n    });\n  });\n};\n\nconst getTargetInteractionDetails = (target: Element) => {\n  const associatedFiber = getFiberFromElement(target);\n  if (!associatedFiber) {\n    return;\n  }\n\n  // TODO: if element is minified, squash upwards till first non minified ancestor, and set name as ChildOf(<parent-name>)\n  let componentName = associatedFiber\n    ? getDisplayName(associatedFiber?.type)\n    : 'N/A';\n\n  if (!componentName) {\n    componentName =\n      getFirstNameFromAncestor(associatedFiber, (name) => name.length > 2) ??\n      'N/A';\n  }\n\n  if (!componentName) {\n    return;\n  }\n\n  const componentPath = getInteractionPath(associatedFiber);\n\n  return {\n    componentPath,\n    childrenTree: {},\n    componentName,\n    elementFiber: associatedFiber,\n  };\n};\n\ntype LastInteractionRef = {\n  current: (\n    | InteractionStartStage\n    | JSEndStage\n    | RAFStage\n    | TimeoutStage\n    | UnInitializedStage\n  ) & { stageStart: number };\n};\n\n/**\n *\n * handles tracking event timings for arbitrarily overlapping handlers with cancel logic\n */\nexport const setupDetailedPointerTimingListener = (\n  kind: 'pointer' | 'keyboard',\n  options: {\n    onStart?: (interactionUUID: string) => void;\n    onComplete?: (\n      interactionUUID: string,\n      finalInteraction: {\n        detailedTiming: TimeoutStage;\n        latency: number;\n        completedAt: number;\n        flushNeeded: boolean;\n      },\n      entry: PerformanceEntryChannelEvent,\n    ) => void;\n    onError?: (interactionUUID: string) => void;\n  },\n) => {\n  let instrumentationIdInControl: string | null = null;\n\n  const getEvent = (\n    info: { phase: 'start' } | { phase: 'end'; target: Element },\n  ) => {\n    switch (kind) {\n      case 'pointer': {\n        if (info.phase === 'start') {\n          return 'pointerup';\n        }\n        if (\n          info.target instanceof HTMLInputElement ||\n          info.target instanceof HTMLSelectElement\n        ) {\n          return 'change';\n        }\n        return 'click';\n      }\n      case 'keyboard': {\n        if (info.phase === 'start') {\n          return 'keydown';\n        }\n\n        return 'change';\n      }\n    }\n  };\n\n  const lastInteractionRef: LastInteractionRef = {\n    current: {\n      kind: 'uninitialized-stage',\n      interactionUUID: not_globally_unique_generateId(), // the first interaction uses this\n      stageStart: Date.now(),\n      interactionType: kind,\n    },\n  };\n\n  const onInteractionStart = (e: Event) => {\n    const path = e.composedPath();\n    if (\n      path.some(\n        (el) => el instanceof Element && el.id === 'react-scan-toolbar-root',\n      )\n    ) {\n      return;\n    }\n    if (Date.now() - lastInteractionRef.current.stageStart > 2000) {\n      lastInteractionRef.current = {\n        kind: 'uninitialized-stage',\n        interactionUUID: not_globally_unique_generateId(),\n        stageStart: Date.now(),\n        interactionType: kind,\n      };\n    }\n\n    if (lastInteractionRef.current.kind !== 'uninitialized-stage') {\n      return;\n    }\n\n    const pointerUpStart = performance.now();\n\n    options?.onStart?.(lastInteractionRef.current.interactionUUID);\n    const details = getTargetInteractionDetails(e.target as HTMLElement);\n\n    if (!details) {\n      options?.onError?.(lastInteractionRef.current.interactionUUID);\n      return;\n    }\n\n    const fiberRenders: InteractionStartStage['fiberRenders'] = {};\n    const stopListeningForRenders = listenForRenders(fiberRenders);\n    lastInteractionRef.current = {\n      ...lastInteractionRef.current,\n      interactionType: kind,\n      blockingTimeStart: Date.now(),\n      childrenTree: details.childrenTree,\n      componentName: details.componentName,\n      componentPath: details.componentPath,\n      fiberRenders,\n      kind: 'interaction-start',\n      interactionStartDetail: pointerUpStart,\n      stopListeningForRenders,\n    };\n\n    const event = getEvent({ phase: 'end', target: e.target as Element });\n    // oxlint-disable-next-line typescript/no-explicit-any\n    document.addEventListener(event, onLastJS as any, {\n      once: true,\n    });\n\n    // this is an edge case where a click event is not fired after a pointerdown\n    // im not sure why this happens, but it seems to only happen on non intractable elements\n    // it causes the event handler to stay alive until a future interaction, which can break timing (looks super long)\n    // or invariants (the start metadata was removed, so now its an end metadata with no start)\n    requestAnimationFrame(() => {\n      // oxlint-disable-next-line typescript/no-explicit-any\n      document.removeEventListener(event as any, onLastJS as any);\n    });\n  };\n\n  document.addEventListener(\n    getEvent({ phase: 'start' }),\n    // oxlint-disable-next-line typescript/no-explicit-any\n    onInteractionStart as any,\n    {\n      capture: true,\n    },\n  );\n\n  /**\n   *\n   * TODO: IF WE DETECT RENDERS DURING THIS PERIOD WE CAN INCLUDE THAT IN THE RESULT AND THEN BACK THAT OUT OF COMPUTED STYLE TIME AND ADD IT BACK INTO JS TIME\n   */\n  const onLastJS = (\n    e: { target: Element },\n    instrumentationId: string,\n    abort: () => boolean,\n  ) => {\n    if (\n      lastInteractionRef.current.kind !== 'interaction-start' &&\n      instrumentationId === instrumentationIdInControl\n    ) {\n      if (kind === 'pointer' && e.target instanceof HTMLSelectElement) {\n        lastInteractionRef.current = {\n          kind: 'uninitialized-stage',\n          interactionUUID: not_globally_unique_generateId(),\n          stageStart: Date.now(),\n          interactionType: kind,\n        };\n        return;\n      }\n\n      options?.onError?.(lastInteractionRef.current.interactionUUID);\n      lastInteractionRef.current = {\n        kind: 'uninitialized-stage',\n        interactionUUID: not_globally_unique_generateId(),\n        stageStart: Date.now(),\n        interactionType: kind,\n      };\n      invariantError('pointer -> click');\n      return;\n    }\n\n    instrumentationIdInControl = instrumentationId;\n\n    trackDetailedTiming({\n      abort,\n      onMicroTask: () => {\n        if (lastInteractionRef.current.kind === 'uninitialized-stage') {\n          return false;\n        }\n\n        lastInteractionRef.current = {\n          ...lastInteractionRef.current,\n          kind: 'js-end-stage',\n          jsEndDetail: performance.now(),\n        };\n        return true;\n      },\n      onRAF: () => {\n        if (\n          lastInteractionRef.current.kind !== 'js-end-stage' &&\n          lastInteractionRef.current.kind !== 'raf-stage'\n        ) {\n          options?.onError?.(lastInteractionRef.current.interactionUUID);\n          invariantError('bad transition to raf');\n          lastInteractionRef.current = {\n            kind: 'uninitialized-stage',\n            interactionUUID: not_globally_unique_generateId(),\n            stageStart: Date.now(),\n            interactionType: kind,\n          };\n          return false;\n        }\n\n        lastInteractionRef.current = {\n          ...lastInteractionRef.current,\n          kind: 'raf-stage',\n          rafStart: performance.now(),\n        };\n\n        return true;\n      },\n      onTimeout: () => {\n        if (lastInteractionRef.current.kind !== 'raf-stage') {\n          options?.onError?.(lastInteractionRef.current.interactionUUID);\n          lastInteractionRef.current = {\n            kind: 'uninitialized-stage',\n            interactionUUID: not_globally_unique_generateId(),\n            stageStart: Date.now(),\n            interactionType: kind,\n          };\n          invariantError('raf->timeout');\n          return;\n        }\n        const now = Date.now();\n        const timeoutStage: TimeoutStage = Object.freeze({\n          ...lastInteractionRef.current,\n          kind: 'timeout-stage',\n          blockingTimeEnd: now,\n          commitEnd: performance.now(),\n        });\n\n        lastInteractionRef.current = {\n          kind: 'uninitialized-stage',\n          interactionUUID: not_globally_unique_generateId(),\n          stageStart: now,\n          interactionType: kind,\n        };\n        let completed = false;\n        const completeInteraction = (event: PerformanceEntryChannelEvent) => {\n          completed = true;\n\n          const latency =\n            event.kind === 'auto-complete-race'\n              ? event.detailedTiming.commitEnd -\n                event.detailedTiming.interactionStartDetail\n              : event.entry.latency;\n          const finalInteraction = {\n            detailedTiming: timeoutStage,\n            latency,\n            completedAt: Date.now(),\n            flushNeeded: true,\n          };\n\n          options?.onComplete?.(\n            timeoutStage.interactionUUID,\n            finalInteraction,\n            event,\n          );\n          const newTasks = tasks.filter(\n            (task) => task.interactionUUID !== timeoutStage.interactionUUID,\n          );\n          tasks = BoundedArray.fromArray(newTasks, MAX_INTERACTION_TASKS);\n\n          return finalInteraction;\n        };\n\n        const task = {\n          completeInteraction,\n          endDateTime: Date.now(),\n          startDateTime: timeoutStage.blockingTimeStart,\n          type: kind,\n          interactionUUID: timeoutStage.interactionUUID,\n        };\n        tasks.push(task);\n\n        if (!isPerformanceEventAvailable()) {\n          const newTasks = tasks.filter(\n            (task) => task.interactionUUID !== timeoutStage.interactionUUID,\n          );\n          tasks = BoundedArray.fromArray(newTasks, MAX_INTERACTION_TASKS);\n          completeInteraction({\n            kind: 'auto-complete-race',\n            // redundant\n            detailedTiming: timeoutStage,\n            interactionUUID: timeoutStage.interactionUUID,\n          });\n        } else {\n          setTimeout(() => {\n            if (completed) {\n              return;\n            }\n            completeInteraction({\n              kind: 'auto-complete-race',\n              // redundant\n              detailedTiming: timeoutStage,\n              interactionUUID: timeoutStage.interactionUUID,\n            });\n            const newTasks = tasks.filter(\n              (task) => task.interactionUUID !== timeoutStage.interactionUUID,\n            );\n            tasks = BoundedArray.fromArray(newTasks, MAX_INTERACTION_TASKS);\n            // this means the max frame presentation delta we can observe is 300ms, but this should catch >99% of cases, the trade off is to not accidentally miss slowdowns if the user quickly clicked something else while this race was happening\n          }, 1000);\n        }\n      },\n    });\n  };\n\n  const onKeyPress = (e: { target: Element }) => {\n    const id = not_globally_unique_generateId();\n    onLastJS(e, id, () => id !== instrumentationIdInControl);\n  };\n\n  if (kind === 'keyboard') {\n    // oxlint-disable-next-line typescript/no-explicit-any\n    document.addEventListener('keypress', onKeyPress as any);\n  }\n\n  return () => {\n    document.removeEventListener(\n      getEvent({ phase: 'start' }),\n      // oxlint-disable-next-line typescript/no-explicit-any\n      onInteractionStart as any,\n      {\n        capture: true,\n      },\n    );\n    // oxlint-disable-next-line typescript/no-explicit-any\n    document.removeEventListener('keypress', onKeyPress as any);\n  };\n};\n\nconst getHostFromFiber = (fiber: Fiber) => {\n  return traverseFiber(fiber, (node) => {\n    // shouldn't be too slow\n    if (isHostFiber(node)) {\n      return true;\n    }\n  })?.stateNode;\n};\n\nconst isPerformanceEventAvailable = () => {\n  return 'PerformanceEventTiming' in globalThis;\n};\n\nexport const listenForRenders = (\n  fiberRenders: InteractionStartStage['fiberRenders'],\n) => {\n  const listener = (fiber: Fiber) => {\n    const displayName = getDisplayName(fiber.type);\n    if (!displayName) {\n      return;\n    }\n    const existing = fiberRenders[displayName];\n    if (!existing) {\n      const parents = new Set<string>();\n      const res = fiber.return && getParentCompositeFiber(fiber.return);\n      const parentCompositeName = res && getDisplayName(res[0]);\n      if (parentCompositeName) {\n        parents.add(parentCompositeName);\n      }\n      const { selfTime, totalTime } = getTimings(fiber);\n\n      const newChanges = collectInspectorDataWithoutCounts(fiber);\n      const emptySection: SectionData = {\n        current: [],\n        changes: new Set<string | number>(),\n        changesCounts: new Map<string | number, number>(),\n      };\n      const changes = {\n        fiberProps: newChanges.fiberProps || emptySection,\n        fiberState: newChanges.fiberState || emptySection,\n        fiberContext: newChanges.fiberContext || emptySection,\n      };\n      fiberRenders[displayName] = {\n        renderCount: 1,\n        hasMemoCache: hasMemoCache(fiber),\n        wasFiberRenderMount: wasFiberRenderMount(fiber),\n        parents: parents,\n        selfTime,\n        totalTime,\n        nodeInfo: [\n          {\n            element: getHostFromFiber(fiber),\n            name: getDisplayName(fiber.type) ?? 'Unknown',\n            selfTime: getTimings(fiber).selfTime,\n          },\n        ],\n        changes,\n      };\n\n      return;\n    }\n    const parentType = getParentCompositeFiber(fiber)?.[0]?.type;\n    if (parentType) {\n      const res = fiber.return && getParentCompositeFiber(fiber.return);\n      const parentCompositeName = res && getDisplayName(res[0]);\n      if (parentCompositeName) {\n        existing.parents.add(parentCompositeName);\n      }\n    }\n    const { selfTime, totalTime } = getTimings(fiber);\n\n    const newChanges = collectInspectorDataWithoutCounts(fiber);\n\n    if (!newChanges) return;\n\n    const emptySection: SectionData = {\n      current: [],\n      changes: new Set<string | number>(),\n      changesCounts: new Map<string | number, number>(),\n    };\n\n    existing.wasFiberRenderMount =\n      existing.wasFiberRenderMount || wasFiberRenderMount(fiber);\n    existing.hasMemoCache = existing.hasMemoCache || hasMemoCache(fiber);\n    existing.changes = {\n      fiberProps: mergeSectionData(\n        existing.changes?.fiberProps || emptySection,\n        newChanges.fiberProps || emptySection,\n      ),\n      fiberState: mergeSectionData(\n        existing.changes?.fiberState || emptySection,\n        newChanges.fiberState || emptySection,\n      ),\n      fiberContext: mergeSectionData(\n        existing.changes?.fiberContext || emptySection,\n        newChanges.fiberContext || emptySection,\n      ),\n    };\n\n    existing.renderCount += 1;\n    existing.selfTime += selfTime;\n    existing.totalTime += totalTime;\n    existing.nodeInfo.push({\n      element: getHostFromFiber(fiber),\n      name: getDisplayName(fiber.type) ?? 'Unknown',\n      selfTime: getTimings(fiber).selfTime,\n    });\n  };\n  Store.interactionListeningForRenders = listener;\n\n  return () => {\n    if (Store.interactionListeningForRenders === listener) {\n      Store.interactionListeningForRenders = null;\n    }\n  };\n};\n\nconst mergeSectionData = (\n  existing: SectionData,\n  newData: SectionData,\n): SectionData => {\n  const mergedSection: SectionData = {\n    current: [...existing.current],\n    changes: new Set<string | number>(),\n    changesCounts: new Map<string | number, number>(),\n  };\n\n  for (const value of newData.current) {\n    if (!mergedSection.current.some((item) => item.name === value.name)) {\n      mergedSection.current.push(value);\n    }\n  }\n\n  for (const change of newData.changes) {\n    if (typeof change === 'string' || typeof change === 'number') {\n      mergedSection.changes.add(change);\n      const existingCount = existing.changesCounts.get(change) || 0;\n      const newCount = newData.changesCounts.get(change) || 0;\n      mergedSection.changesCounts.set(change, existingCount + newCount);\n    }\n  }\n\n  return mergedSection;\n};\n\nconst wasFiberRenderMount = (fiber: Fiber) => {\n  if (!fiber.alternate) {\n    return true;\n  }\n\n  const prevFiber = fiber.alternate;\n\n  const wasMounted =\n    prevFiber &&\n    prevFiber.memoizedState != null &&\n    prevFiber.memoizedState.element != null &&\n    prevFiber.memoizedState.isDehydrated !== true;\n\n  const isMounted =\n    fiber.memoizedState != null &&\n    fiber.memoizedState.element != null &&\n    fiber.memoizedState.isDehydrated !== true;\n\n  return !wasMounted && isMounted;\n};\n","import { BoundedArray } from \"./performance-utils\";\nimport { PerformanceEntryChannelEvent } from \"./performance\";\n\ntype UnSubscribe = () => void;\ntype Callback<T> = (item: T) => void;\ntype Updater<T> = (state: BoundedArray<T>) => BoundedArray<T>;\ntype ChanelName = string;\n\ntype PerformanceEntryChannelsType<T> = {\n  subscribe: (to: ChanelName, cb: Callback<T>) => UnSubscribe;\n  publish: (\n    item: T,\n    to: ChanelName,\n    dropFirst: boolean,\n    createIfNoChannel: boolean\n  ) => void;\n  channels: Record<\n    ChanelName,\n    { callbacks: BoundedArray<Callback<T>>; state: BoundedArray<T> }\n  >;\n  getAvailableChannels: () => BoundedArray<string>;\n  updateChannelState: (\n    channel: ChanelName,\n    updater: Updater<T>,\n    createIfNoChannel: boolean\n  ) => void;\n};\n\nexport const MAX_CHANNEL_SIZE = 50;\n// a set of entities communicate to each other through channels\n// the state in the channel is persisted until the receiving end consumes it\n// multiple subscribes to the same channel will likely lead to unintended behavior if the subscribers are separate entities\nclass PerformanceEntryChannels<T> implements PerformanceEntryChannelsType<T> {\n  channels: PerformanceEntryChannelsType<T>[\"channels\"] = {};\n  publish(item: T, to: ChanelName, createIfNoChannel = true) {\n    const existingChannel = this.channels[to];\n    if (!existingChannel) {\n      if (!createIfNoChannel) {\n        return;\n      }\n      this.channels[to] = {\n        callbacks: new BoundedArray<Callback<T>>(MAX_CHANNEL_SIZE),\n        state: new BoundedArray<T>(MAX_CHANNEL_SIZE),\n      };\n      this.channels[to].state.push(item);\n      return;\n    }\n\n    existingChannel.state.push(item);\n    existingChannel.callbacks.forEach((cb) => cb(item));\n  }\n\n  getAvailableChannels() {\n    return BoundedArray.fromArray(Object.keys(this.channels), MAX_CHANNEL_SIZE);\n  }\n  subscribe(to: ChanelName, cb: Callback<T>, dropFirst: boolean = false) {\n    const defer = () => {\n      if (!dropFirst) {\n        this.channels[to].state.forEach((item) => {\n          cb(item);\n        });\n      }\n      return () => {\n        const filtered = this.channels[to].callbacks.filter(\n          (subscribed) => subscribed !== cb\n        );\n        this.channels[to].callbacks = BoundedArray.fromArray(\n          filtered,\n          MAX_CHANNEL_SIZE\n        );\n      };\n    };\n    const existing = this.channels[to];\n    if (!existing) {\n      this.channels[to] = {\n        callbacks: new BoundedArray<Callback<T>>(MAX_CHANNEL_SIZE),\n        state: new BoundedArray<T>(MAX_CHANNEL_SIZE),\n      };\n      this.channels[to].callbacks.push(cb);\n      return defer();\n    }\n\n    existing.callbacks.push(cb);\n    return defer();\n  }\n  updateChannelState(\n    channel: ChanelName,\n    updater: Updater<T>,\n    createIfNoChannel = true\n  ) {\n    const existingChannel = this.channels[channel];\n    if (!existingChannel) {\n      if (!createIfNoChannel) {\n        return;\n      }\n\n      const state = new BoundedArray<T>(MAX_CHANNEL_SIZE);\n      const newChannel = {\n        callbacks: new BoundedArray<Callback<T>>(MAX_CHANNEL_SIZE),\n        state,\n      };\n\n      this.channels[channel] = newChannel;\n      newChannel.state = updater(state);\n      return;\n    }\n\n    existingChannel.state = updater(existingChannel.state);\n  }\n\n  getChannelState(channel: ChanelName) {\n    return (\n      this.channels[channel].state ?? new BoundedArray<T>(MAX_CHANNEL_SIZE)\n    );\n  }\n}\n// todo: discriminated union the events when we start using multiple channels\n// we used to use multiple channels, but now we only use 1. This is still a useful abstraction incase we ever need more channels again\nexport const performanceEntryChannels =\n  new PerformanceEntryChannels<PerformanceEntryChannelEvent>();\n","/**\n * Adapted from zustand v5.0.3\n *\n * https://github.com/pmndrs/zustand\n *\n * Do not modify unless you know what you are doing\n */\ntype SetStateInternal<T> = {\n  _(\n    partial: T | Partial<T> | { _(state: T): T | Partial<T> }['_'],\n    replace?: false,\n  ): void;\n  _(state: T | { _(state: T): T }['_'], replace: true): void;\n}['_'];\n\nexport interface StoreApi<T> {\n  setState: SetStateInternal<T>;\n  getState: () => T;\n  getInitialState: () => T;\n  subscribe: {\n    (listener: (state: T, prevState: T) => void): () => void;\n    <U>(\n      selector: (state: T) => U,\n      listener: (selectedState: U, prevSelectedState: U) => void,\n    ): () => void;\n  };\n}\n\nexport type ExtractState<S> = S extends { getState: () => infer T } ? T : never;\n\ntype Get<T, K, F> = K extends keyof T ? T[K] : F;\n\nexport type Mutate<S, Ms> = number extends Ms['length' & keyof Ms]\n  ? S\n  : Ms extends []\n    ? S\n    : Ms extends [[infer Mi, infer Ma], ...infer Mrs]\n      ? Mutate<StoreMutators<S, Ma>[Mi & StoreMutatorIdentifier], Mrs>\n      : never;\n\nexport type StateCreator<\n  T,\n  Mis extends [StoreMutatorIdentifier, unknown][] = [],\n  Mos extends [StoreMutatorIdentifier, unknown][] = [],\n  U = T,\n> = ((\n  setState: Get<Mutate<StoreApi<T>, Mis>, 'setState', never>,\n  getState: Get<Mutate<StoreApi<T>, Mis>, 'getState', never>,\n  store: Mutate<StoreApi<T>, Mis>,\n) => U) & { $$storeMutators?: Mos };\n\n// oxlint-disable-next-line no-unused-vars\nexport interface StoreMutators<S, A> {}\nexport type StoreMutatorIdentifier = keyof StoreMutators<unknown, unknown>;\n\ntype CreateStore = {\n  <T, Mos extends [StoreMutatorIdentifier, unknown][] = []>(\n    initializer: StateCreator<T, [], Mos>,\n  ): Mutate<StoreApi<T>, Mos>;\n\n  <T>(): <Mos extends [StoreMutatorIdentifier, unknown][] = []>(\n    initializer: StateCreator<T, [], Mos>,\n  ) => Mutate<StoreApi<T>, Mos>;\n};\n\ntype CreateStoreImpl = <\n  T,\n  Mos extends [StoreMutatorIdentifier, unknown][] = [],\n>(\n  initializer: StateCreator<T, [], Mos>,\n) => Mutate<StoreApi<T>, Mos>;\n\nconst createStoreImpl: CreateStoreImpl = (createState) => {\n  type TState = ReturnType<typeof createState>;\n  type Listener = (state: TState, prevState: TState) => void;\n  let state: TState;\n  const listeners: Set<Listener> = new Set();\n\n  const setState: StoreApi<TState>['setState'] = (partial, replace) => {\n    const nextState =\n      typeof partial === 'function'\n        ? (partial as (state: TState) => TState)(state)\n        : partial;\n    if (!Object.is(nextState, state)) {\n      const previousState = state;\n      state =\n        (replace ?? (typeof nextState !== 'object' || nextState === null))\n          ? (nextState as TState)\n          : Object.assign({}, state, nextState);\n      listeners.forEach((listener) => listener(state, previousState));\n    }\n  };\n\n  const getState: StoreApi<TState>['getState'] = () => state;\n\n  const getInitialState: StoreApi<TState>['getInitialState'] = () =>\n    initialState;\n\n  const subscribe: StoreApi<TState>['subscribe'] = (\n    selectorOrListener:\n      | ((state: TState, prevState: TState) => void)\n      // oxlint-disable-next-line typescript/no-explicit-any\n      | ((state: TState) => any),\n    // oxlint-disable-next-line typescript/no-explicit-any\n    listener?: (selectedState: any, prevSelectedState: any) => void,\n  ) => {\n    // oxlint-disable-next-line typescript/no-explicit-any\n    let selector: ((state: TState) => any) | undefined;\n    // oxlint-disable-next-line typescript/no-explicit-any\n    let actualListener: (state: any, prevState: any) => void;\n\n    if (listener) {\n      // Selector subscription case\n      // oxlint-disable-next-line typescript/no-explicit-any\n      selector = selectorOrListener as (state: TState) => any;\n      actualListener = listener;\n    } else {\n      // Regular subscription case\n      actualListener = selectorOrListener as (\n        state: TState,\n        prevState: TState,\n      ) => void;\n    }\n\n    let currentSlice = selector ? selector(state) : undefined;\n\n    const wrappedListener = (newState: TState, previousState: TState) => {\n      if (selector) {\n        const nextSlice = selector(newState);\n        const prevSlice = selector(previousState);\n        if (!Object.is(currentSlice, nextSlice)) {\n          currentSlice = nextSlice;\n          actualListener(nextSlice, prevSlice);\n        }\n      } else {\n        actualListener(newState, previousState);\n      }\n    };\n\n    listeners.add(wrappedListener);\n    // Unsubscribe\n    return () => listeners.delete(wrappedListener);\n  };\n\n  const api = { setState, getState, getInitialState, subscribe };\n  const initialState = (state = createState(setState, getState, api));\n  // oxlint-disable-next-line typescript/no-explicit-any\n  return api as any;\n};\n\nexport const createStore = ((createState) =>\n  createState ? createStoreImpl(createState) : createStoreImpl) as CreateStore;\n","import { ReactScanInternals } from '~core/index';\nimport { cn } from '~web/utils/helpers';\n\nexport const ChevronRight = ({\n  size = 24,\n  className,\n}: {\n  size?: number;\n  className?: string;\n}) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={size}\n    height={size}\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-width=\"2\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n    className={cn(['lucide lucide-chevron-right', className])}\n  >\n    <path d=\"m9 18 6-6-6-6\" />\n  </svg>\n);\nexport const CopyX = ({\n  size = 24,\n  className,\n}: {\n  size?: number;\n  className?: string;\n}) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={size}\n    height={size}\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    strokeWidth=\"2\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n    className={cn(['lucide lucide-copy-x', className])}\n  >\n    <line x1=\"12\" x2=\"18\" y1=\"12\" y2=\"18\" />\n    <line x1=\"12\" x2=\"18\" y1=\"18\" y2=\"12\" />\n    <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n    <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n  </svg>\n);\n\nexport const Notification = ({\n  className = '',\n  size = 24,\n  events = [],\n}: {\n  className?: string;\n  size?: number;\n  events: boolean[];\n}) => {\n  const hasHighSeverity = events.includes(true);\n  const totalSevere = events.filter((e) => e).length;\n  const displayCount = totalSevere > 99 ? '>99' : totalSevere;\n  const badgeSize = hasHighSeverity\n    ? Math.max(size * 0.6, 14)\n    : Math.max(size * 0.4, 6);\n\n\n  return (\n    <div className=\"relative\">\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        width={size}\n        height={size}\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        stroke-width=\"2\"\n        stroke-linecap=\"round\"\n        stroke-linejoin=\"round\"\n        className={`lucide lucide-bell ${className}`}\n      >\n        <path d=\"M10.268 21a2 2 0 0 0 3.464 0\" />\n        <path d=\"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\" />\n      </svg>\n      {events.length > 0 &&\n        totalSevere > 0 &&\n        ReactScanInternals.options.value.showNotificationCount && (\n          <div\n            className={cn([\n              'absolute',\n              hasHighSeverity ? '-top-2.5 -right-2.5' : '-top-1 -right-1',\n              'rounded-full',\n              'flex items-center justify-center',\n              'text-[8px] font-medium text-white',\n              'aspect-square',\n              hasHighSeverity ? 'bg-red-500/90' : 'bg-purple-500/90',\n            ])}\n            style={{\n              width: `${badgeSize}px`,\n              height: `${badgeSize}px`,\n              padding: hasHighSeverity ? '0.5px' : '0',\n            }}\n          >\n            {hasHighSeverity && displayCount}\n          </div>\n        )}\n    </div>\n  );\n};\n\nexport const CloseIcon = ({\n  className = '',\n  size = 24,\n}: { className?: string; size?: number }) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={size}\n    height={size}\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-width=\"2\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n    className={className}\n  >\n    <path d=\"M18 6 6 18\" />\n    <path d=\"m6 6 12 12\" />\n  </svg>\n);\nexport const VolumeOnIcon = ({\n  className = '',\n  size = 24,\n}: { className?: string; size?: number }) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={size}\n    height={size}\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-width=\"2\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n    className={className}\n  >\n    <path d=\"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z\" />\n    <path d=\"M16 9a5 5 0 0 1 0 6\" />\n    <path d=\"M19.364 18.364a9 9 0 0 0 0-12.728\" />\n  </svg>\n);\n\nexport const VolumeOffIcon = ({\n  className = '',\n  size = 24,\n}: { className?: string; size?: number }) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={size}\n    height={size}\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-width=\"2\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n    className={className}\n  >\n    <path d=\"M16 9a5 5 0 0 1 .95 2.293\" />\n    <path d=\"M19.364 5.636a9 9 0 0 1 1.889 9.96\" />\n    <path d=\"m2 2 20 20\" />\n    <path d=\"m7 7-.587.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298V11\" />\n    <path d=\"M9.828 4.172A.686.686 0 0 1 11 4.657v.686\" />\n  </svg>\n);\n\nexport const ArrowLeft = ({\n  size = 24,\n  className,\n}: {\n  size?: number;\n  className?: string;\n}) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={size}\n    height={size}\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-width=\"2\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n    className={cn(['lucide lucide-arrow-left', className])}\n  >\n    <path d=\"m12 19-7-7 7-7\" />\n    <path d=\"M19 12H5\" />\n  </svg>\n);\n\nexport const PointerIcon = ({\n  className = '',\n  size = 24,\n}: { className?: string; size?: number }) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={size}\n    height={size}\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-width=\"2\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n    className={className}\n  >\n    <path d=\"M14 4.1 12 6\" />\n    <path d=\"m5.1 8-2.9-.8\" />\n    <path d=\"m6 12-1.9 2\" />\n    <path d=\"M7.2 2.2 8 5.1\" />\n    <path d=\"M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z\" />\n  </svg>\n);\n\nexport const KeyboardIcon = ({\n  className = '',\n  size = 24,\n}: { className?: string; size?: number }) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={size}\n    height={size}\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-width=\"2\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n    className={className}\n  >\n    <path d=\"M10 8h.01\" />\n    <path d=\"M12 12h.01\" />\n    <path d=\"M14 8h.01\" />\n    <path d=\"M16 12h.01\" />\n    <path d=\"M18 8h.01\" />\n    <path d=\"M6 8h.01\" />\n    <path d=\"M7 16h10\" />\n    <path d=\"M8 12h.01\" />\n    <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n  </svg>\n);\nexport const ClearIcon = ({\n  className = '',\n  size = 24,\n}: { className?: string; size?: number }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width={size}\n      height={size}\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      stroke-width=\"2\"\n      stroke-linecap=\"round\"\n      stroke-linejoin=\"round\"\n      className={className}\n      style={{ transform: 'rotate(180deg)' }}\n    >\n      <circle cx=\"12\" cy=\"12\" r=\"10\" />\n      <path d=\"m4.9 4.9 14.2 14.2\" />\n    </svg>\n  );\n};\nexport const TrendingDownIcon = ({\n  className = '',\n  size = 24,\n}: { className?: string; size?: number }) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width={size}\n    height={size}\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    strokeWidth=\"2\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n    className={className}\n  >\n    <polyline points=\"22 17 13.5 8.5 8.5 13.5 2 7\" />\n    <polyline points=\"16 17 22 17 22 11\" />\n  </svg>\n);\n","import { forwardRef } from 'preact/compat';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { not_globally_unique_generateId } from '~core/utils';\nimport { useToolbarEventLog } from '~core/notifications/event-tracking';\nimport { FiberRenders } from '~core/notifications/performance';\nimport { iife, invariantError } from '~core/notifications/performance-utils';\nimport { playNotificationSound } from '~core/utils';\nimport { cn } from '~web/utils/helpers';\nimport {\n  NotificationStateContext,\n  NotificationsState,\n  getEventSeverity,\n  getTotalTime,\n  useNotificationsContext,\n} from './data';\nimport { DetailsRoutes } from './details-routes';\nimport { NotificationHeader } from './notification-header';\nimport { fadeOutHighlights } from './render-bar-chart';\nimport { SlowdownHistory, useLaggedEvents } from './slowdown-history';\n\nconst getGroupedFiberRenders = (fiberRenders: FiberRenders) => {\n  const res = Object.values(fiberRenders).map((render) => ({\n    id: not_globally_unique_generateId(),\n    totalTime: render.nodeInfo.reduce((prev, curr) => prev + curr.selfTime, 0),\n    count: render.nodeInfo.length,\n    name: render.nodeInfo[0].name, // invariant, at least one exists,\n    deletedAll: false,\n    parents: render.parents,\n    hasMemoCache: render.hasMemoCache,\n    wasFiberRenderMount: render.wasFiberRenderMount,\n    // it would be nice if we calculated the % of components memoizable, but this would have to be calculated downstream before it got aggregated\n    elements: render.nodeInfo.map((node) => node.element),\n    changes: {\n      context: render.changes.fiberContext.current\n        .filter((change) =>\n          render.changes.fiberContext.changesCounts.get(change.name),\n        )\n        .map((change) => ({\n          name: String(change.name),\n          count:\n            render.changes.fiberContext.changesCounts.get(change.name) ?? 0,\n        })),\n      props: render.changes.fiberProps.current\n        .filter((change) =>\n          render.changes.fiberProps.changesCounts.get(change.name),\n        )\n        .map((change) => ({\n          name: String(change.name),\n          count: render.changes.fiberProps.changesCounts.get(change.name) ?? 0,\n        })),\n      state: render.changes.fiberState.current\n        .filter((change) =>\n          render.changes.fiberState.changesCounts.get(Number(change.name)),\n        )\n        .map((change) => ({\n          index: change.name as number,\n          count:\n            render.changes.fiberState.changesCounts.get(Number(change.name)) ??\n            0,\n        })),\n    },\n  }));\n\n  return res;\n};\n\nconst useGarbageCollectElements = (\n  notificationEvents: NotificationsState['events'],\n) => {\n  useEffect(() => {\n    const checkElementsExistence = () => {\n      notificationEvents.forEach((event) => {\n        if (!event.groupedFiberRenders) return;\n\n        event.groupedFiberRenders.forEach((render) => {\n          if (render.deletedAll) return;\n\n          if (!render.elements || render.elements.length === 0) {\n            render.deletedAll = true;\n            return;\n          }\n\n          const initialLength = render.elements.length;\n          render.elements = render.elements.filter((element) => {\n            return element && element.isConnected;\n          });\n\n          if (render.elements.length === 0 && initialLength > 0) {\n            render.deletedAll = true;\n          }\n        });\n      });\n    };\n\n    const intervalId = setInterval(checkElementsExistence, 5000);\n\n    return () => {\n      clearInterval(intervalId);\n    };\n  }, [notificationEvents]);\n};\n\nexport const useAppNotifications = () => {\n  const log = useToolbarEventLog();\n\n  const notificationEvents: NotificationsState['events'] = [];\n\n  useGarbageCollectElements(notificationEvents);\n\n  log.state.events.forEach((event) => {\n    const fiberRenders =\n      event.kind === 'interaction'\n        ? event.data.meta.detailedTiming.fiberRenders\n        : event.data.meta.fiberRenders;\n    const groupedFiberRenders = getGroupedFiberRenders(fiberRenders);\n    const renderTime = groupedFiberRenders.reduce(\n      (prev, curr) => prev + curr.totalTime,\n      0,\n    );\n    switch (event.kind) {\n      case 'interaction': {\n        const { commitEnd, jsEndDetail, interactionStartDetail, rafStart } =\n          event.data.meta.detailedTiming;\n\n        // this is a known bug, js time doesn't backfill render time from async renders (or async js in general)\n        // the current impl is a close enough approximation so will leave as is until there is a dedicated effort to fix it\n        if (jsEndDetail - interactionStartDetail - renderTime < 0) {\n          invariantError('js time must be longer than render time');\n        }\n        const otherJSTime = Math.max(\n          0,\n          jsEndDetail - interactionStartDetail - renderTime,\n        );\n\n        const frameDraw = Math.max(\n          event.data.meta.latency - (commitEnd - interactionStartDetail),\n          0,\n        );\n        notificationEvents.push({\n          componentPath: event.data.meta.detailedTiming.componentPath,\n          groupedFiberRenders,\n          id: event.id,\n          kind: 'interaction',\n          memory: null,\n          timestamp: event.data.startAt,\n          type:\n            event.data.meta.detailedTiming.interactionType === 'keyboard'\n              ? 'keyboard'\n              : 'click',\n          timing: {\n            renderTime: renderTime,\n            kind: 'interaction',\n            otherJSTime,\n            framePreparation: rafStart - jsEndDetail,\n            frameConstruction: commitEnd - rafStart,\n            frameDraw,\n          },\n        });\n        return;\n      }\n      case 'long-render': {\n        notificationEvents.push({\n          kind: 'dropped-frames',\n          id: event.id,\n          memory: null,\n          timing: {\n            kind: 'dropped-frames',\n            renderTime: renderTime,\n            otherTime: event.data.meta.latency,\n          },\n          groupedFiberRenders,\n          timestamp: event.data.startAt,\n          fps: event.data.meta.fps,\n        });\n        return;\n      }\n    }\n  });\n  return notificationEvents;\n};\nconst timeout = 1000;\nexport const NotificationAudio = () => {\n  const { notificationState, setNotificationState } = useNotificationsContext();\n  const playedFor = useRef<number | null>(null);\n  const debounceTimeout = useRef<NodeJS.Timeout | null>(null);\n  const lastPlayedTime = useRef<number>(0);\n\n  const [laggedEvents] = useLaggedEvents();\n\n  const alertEventsCount = laggedEvents.filter(\n    // todo: make this configurable\n    (event) => getEventSeverity(event) === 'high',\n  ).length;\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    // todo: sync with options\n    const audioEnabledString = localStorage.getItem(\n      'react-scan-notifications-audio',\n    );\n\n    if (audioEnabledString !== 'false' && audioEnabledString !== 'true') {\n      localStorage.setItem('react-scan-notifications-audio', 'false');\n      return;\n    }\n\n    const audioEnabled = audioEnabledString === 'false' ? false : true;\n\n    if (audioEnabled) {\n      setNotificationState((prev) => {\n        if (prev.audioNotificationsOptions.enabled) {\n          return prev;\n        }\n        return {\n          ...prev,\n          audioNotificationsOptions: {\n            enabled: true,\n            audioContext: new AudioContext(),\n          },\n        };\n      });\n      return;\n    }\n  }, []);\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    const { audioNotificationsOptions } = notificationState;\n    if (!audioNotificationsOptions.enabled) {\n      return;\n    }\n    if (alertEventsCount === 0) {\n      return;\n    }\n    if (playedFor.current && playedFor.current >= alertEventsCount) {\n      return;\n    }\n\n    if (debounceTimeout.current) {\n      clearTimeout(debounceTimeout.current);\n    }\n\n    const now = Date.now();\n    const timeSinceLastPlay = now - lastPlayedTime.current;\n    const remainingDebounceTime = Math.max(0, timeout - timeSinceLastPlay);\n\n    debounceTimeout.current = setTimeout(() => {\n      playNotificationSound(audioNotificationsOptions.audioContext);\n      playedFor.current = alertEventsCount;\n      lastPlayedTime.current = Date.now();\n      debounceTimeout.current = null;\n    }, remainingDebounceTime);\n  }, [alertEventsCount]);\n\n  useEffect(() => {\n    if (alertEventsCount !== 0) {\n      return;\n    }\n    playedFor.current = null;\n  }, [alertEventsCount]);\n\n  useEffect(() => {\n    return () => {\n      if (debounceTimeout.current) {\n        clearTimeout(debounceTimeout.current);\n      }\n    };\n  }, []);\n\n  return null;\n};\n\nexport const NotificationWrapper = forwardRef<HTMLDivElement>((_, ref) => {\n  const events = useAppNotifications();\n  const [notificationState, setNotificationState] =\n    useState<NotificationsState>({\n      detailsExpanded: false,\n      events,\n      filterBy: 'latest',\n      moreInfoExpanded: false,\n      route: 'render-visualization',\n      selectedEvent:\n        events.toSorted((a, b) => a.timestamp - b.timestamp).at(-1) ?? null,\n      selectedFiber: null,\n      routeMessage: null,\n      audioNotificationsOptions: {\n        enabled: false,\n        audioContext: null,\n      },\n    });\n\n  notificationState.events = events;\n  return (\n    <NotificationStateContext.Provider\n      value={{\n        notificationState,\n        setNotificationState,\n        setRoute: ({ route, routeMessage }) => {\n          setNotificationState((prev) => {\n            const newState = { ...prev, route, routeMessage };\n            switch (route) {\n              case 'render-visualization': {\n                fadeOutHighlights();\n                return {\n                  ...newState,\n                  selectedFiber: null,\n                };\n              }\n              case 'optimize': {\n                fadeOutHighlights();\n                return {\n                  ...newState,\n                  selectedFiber: null,\n                };\n              }\n              case 'other-visualization': {\n                fadeOutHighlights();\n                return {\n                  ...newState,\n                  selectedFiber: null,\n                };\n              }\n              case 'render-explanation': {\n                // it would be ideal not to fade this out, but need to spend the time to sync the outline positions as they change in a performant (this was solved in react scan just need to follow same semantics)\n                fadeOutHighlights();\n\n                return newState;\n              }\n            }\n            route satisfies never;\n          });\n        },\n      }}\n    >\n      <NotificationAudio />\n      <Notifications ref={ref} />\n    </NotificationStateContext.Provider>\n  );\n});\nexport const Notifications = forwardRef<HTMLDivElement>((_, ref) => {\n  const { notificationState } = useNotificationsContext();\n\n  return (\n    <div ref={ref} className={cn(['h-full w-full flex flex-col'])}>\n      {notificationState.selectedEvent && (\n        <div\n          className={cn([\n            'w-full h-[48px] flex flex-col',\n            notificationState.moreInfoExpanded && 'h-[235px]',\n            notificationState.moreInfoExpanded &&\n              notificationState.selectedEvent.kind === 'dropped-frames' &&\n              'h-[150px]',\n          ])}\n        >\n          <NotificationHeader selectedEvent={notificationState.selectedEvent} />\n          {notificationState.moreInfoExpanded && <MoreInfo />}\n        </div>\n      )}\n      <div\n        className={cn([\n          'flex ',\n          notificationState.selectedEvent ? 'h-[calc(100%-48px)]' : 'h-full',\n          notificationState.moreInfoExpanded && 'h-[calc(100%-200px)]',\n          notificationState.moreInfoExpanded &&\n            notificationState.selectedEvent?.kind === 'dropped-frames' &&\n            'h-[calc(100%-150px)]',\n        ])}\n      >\n        <div className={cn(['h-full min-w-[200px]'])}>\n          <SlowdownHistory />\n        </div>\n        <div className={cn(['w-[calc(100%-200px)] h-full overflow-y-auto'])}>\n          <DetailsRoutes />\n        </div>\n      </div>\n    </div>\n  );\n});\n\nconst MoreInfo = () => {\n  const { notificationState } = useNotificationsContext();\n\n  if (!notificationState.selectedEvent) {\n    throw new Error('Invariant must have selected event for more info');\n  }\n\n  const event = notificationState.selectedEvent;\n\n  return (\n    <div\n      className={cn([\n        'px-4 py-2 border-b border-[#27272A] bg-[#18181B]/50 h-[calc(100%-40px)]',\n        event.kind === 'dropped-frames' && `h-[calc(100%-25px)]`,\n      ])}\n    >\n      <div className={cn(['flex flex-col gap-y-4 h-full'])}>\n        {iife(() => {\n          switch (event.kind) {\n            case 'interaction': {\n              return (\n                <>\n                  <div className={cn(['flex items-center gap-x-3'])}>\n                    <span className=\"text-[#6F6F78] text-xs font-medium\">\n                      {event.type === 'click'\n                        ? 'Clicked component location'\n                        : 'Typed in component location'}\n                    </span>\n                    <div className=\"font-mono text-[#E4E4E7] flex items-center bg-[#27272A] pl-2 py-1 rounded-sm overflow-x-auto\">\n                      {event.componentPath.toReversed().map((part, i) => (\n                        <>\n                          <span\n                            style={{\n                              lineHeight: '14px',\n                            }}\n                            key={part}\n                            className=\"text-[10px] whitespace-nowrap\"\n                          >\n                            {part}\n                          </span>\n                          {i < event.componentPath.length - 1 && (\n                            <span className=\"text-[#6F6F78] mx-0.5\">‹</span>\n                          )}\n                        </>\n                      ))}\n                    </div>\n                  </div>\n\n                  <div className={cn(['flex items-center gap-x-3'])}>\n                    <span className=\"text-[#6F6F78] text-xs font-medium\">\n                      Total Time\n                    </span>\n                    <span className=\"text-[#E4E4E7] bg-[#27272A] px-1.5 py-1 rounded-sm text-xs\">\n                      {getTotalTime(event.timing).toFixed(0)}ms\n                    </span>\n                  </div>\n                  <div className={cn(['flex items-center gap-x-3'])}>\n                    <span className=\"text-[#6F6F78] text-xs font-medium\">\n                      Occurred\n                    </span>\n                    <span className=\"text-[#E4E4E7] bg-[#27272A] px-1.5 py-1 rounded-sm text-xs\">\n                      {`${((Date.now() - event.timestamp) / 1000).toFixed(0)}s ago`}\n                    </span>\n                  </div>\n                </>\n              );\n            }\n            case 'dropped-frames': {\n              return (\n                <>\n                  <div className={cn(['flex items-center gap-x-3'])}>\n                    <span className=\"text-[#6F6F78] text-xs font-medium\">\n                      Total Time\n                    </span>\n                    <span className=\"text-[#E4E4E7] bg-[#27272A] px-1.5 py-1 rounded-sm text-xs\">\n                      {getTotalTime(event.timing).toFixed(0)}ms\n                    </span>\n                  </div>\n\n                  <div className={cn(['flex items-center gap-x-3'])}>\n                    <span className=\"text-[#6F6F78] text-xs font-medium\">\n                      Occurred\n                    </span>\n                    <span className=\"text-[#E4E4E7] bg-[#27272A] px-1.5 py-1 rounded-sm text-xs\">\n                      {`${((Date.now() - event.timestamp) / 1000).toFixed(0)}s ago`}\n                    </span>\n                  </div>\n                </>\n              );\n            }\n          }\n        })}\n      </div>\n    </div>\n  );\n};\n","import { ReactNode, useEffect, useRef, useState } from 'preact/compat';\nimport { playNotificationSound } from '~core/utils';\nimport { cn } from '~web/utils/helpers';\nimport { useNotificationsContext } from './data';\nimport { CloseIcon } from './icons';\nimport { NotificationTabs } from './notification-tabs';\nimport { Optimize } from './optimize';\nimport { OtherVisualization } from './other-visualization';\nimport { RenderBarChart } from './render-bar-chart';\nimport { RenderExplanation } from './render-explanation';\nimport { signalWidgetViews } from '~web/state';\n\nexport const DetailsRoutes = () => {\n  const { notificationState, setNotificationState } = useNotificationsContext();\n  const [dots, setDots] = useState('...');\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    const interval = setInterval(() => {\n      setDots((prev) => {\n        if (prev === '...') return '';\n        return prev + '.';\n      });\n    }, 500);\n\n    return () => clearInterval(interval);\n  }, []);\n\n  if (!notificationState.selectedEvent) {\n    return (\n      <div\n        ref={containerRef}\n        className={cn([\n          'h-full w-full flex flex-col items-center justify-center relative py-2 px-4',\n        ])}\n      >\n        <div\n          className={cn([\n            'p-2 flex justify-center items-center border-[#27272A] absolute top-0 right-0',\n          ])}\n        >\n          <button\n            onClick={() => {\n              signalWidgetViews.value = {\n                view: 'none',\n              };\n            }}\n          >\n            <CloseIcon size={18} className=\"text-[#6F6F78]\" />\n          </button>\n        </div>\n        <div\n          className={cn([\n            'flex flex-col items-start pt-5 bg-[#0A0A0A] p-5 rounded-sm max-w-md',\n            ' shadow-lg',\n          ])}\n        >\n          <div className={cn(['flex flex-col items-start gap-y-4'])}>\n            <div className={cn(['flex items-center'])}>\n              <span className={cn(['text-zinc-400 font-medium text-[17px]'])}>\n                Scanning for slowdowns\n                {dots}\n              </span>\n            </div>\n            {notificationState.events.length !== 0 && (\n              <p className={cn(['text-xs'])}>\n                Click on an item in the{' '}\n                <span className={cn(['text-purple-400'])}>History</span> list to\n                get started\n              </p>\n            )}\n            <p className={cn(['text-zinc-600 text-xs'])}>\n              You don't need to keep this panel open for React Scan to record\n              slowdowns\n            </p>\n            <p className={cn(['text-zinc-600 text-xs'])}>\n              Enable audio alerts to hear a delightful ding every time a large\n              slowdown is recorded\n            </p>\n            <button\n              onClick={() => {\n                if (notificationState.audioNotificationsOptions.enabled) {\n                  setNotificationState((prev) => {\n                    if (\n                      prev.audioNotificationsOptions.audioContext?.state !==\n                      'closed'\n                    ) {\n                      prev.audioNotificationsOptions.audioContext?.close();\n                    }\n                    localStorage.setItem('react-scan-notifications-audio', 'false');\n                    return {\n                      ...prev,\n                      audioNotificationsOptions: {\n                        audioContext: null,\n                        enabled: false,\n                      },\n                    };\n                  });\n                  return;\n                }\n                localStorage.setItem('react-scan-notifications-audio', 'true');\n                const audioContext = new AudioContext();\n                playNotificationSound(audioContext);\n                setNotificationState((prev) => ({\n                  ...prev,\n                  audioNotificationsOptions: {\n                    enabled: true,\n                    audioContext,\n                  },\n                }));\n              }}\n              className={cn([\n                'px-4 py-2 bg-zinc-800 hover:bg-zinc-700 rounded-sm w-full',\n                ' text-sm flex items-center gap-x-2 justify-center',\n              ])}\n            >\n              {notificationState.audioNotificationsOptions.enabled ? (\n                <>\n                  <span className=\"flex items-center gap-x-1\">\n                    Disable audio alerts\n                  </span>\n                </>\n              ) : (\n                <>\n                  <span className=\"flex items-center gap-x-1\">\n                    Enable audio alerts\n                  </span>\n                </>\n              )}\n            </button>\n          </div>\n        </div>\n      </div>\n    );\n  }\n\n  switch (notificationState.route) {\n    case 'render-visualization': {\n      return (\n        <TabLayout>\n          <RenderBarChart selectedEvent={notificationState.selectedEvent} />\n        </TabLayout>\n      );\n    }\n    case 'render-explanation': {\n      if (!notificationState.selectedFiber) {\n        // todo: dev only\n        throw new Error(\n          'Invariant: must have selected fiber when viewing render explanation',\n        );\n      }\n      return (\n        <TabLayout>\n          <RenderExplanation\n            selectedFiber={notificationState.selectedFiber}\n            selectedEvent={notificationState.selectedEvent}\n          />\n        </TabLayout>\n      );\n    }\n\n    case 'other-visualization': {\n      return (\n        <TabLayout>\n          <div\n            className={cn(['flex w-full h-full flex-col overflow-y-auto'])}\n            id=\"overview-scroll-container\"\n          >\n            <OtherVisualization\n              selectedEvent={notificationState.selectedEvent}\n            />\n          </div>\n        </TabLayout>\n      );\n    }\n    case 'optimize': {\n      return (\n        <TabLayout>\n          <Optimize selectedEvent={notificationState.selectedEvent} />\n        </TabLayout>\n      );\n    }\n  }\n  // exhaustive verification\n  notificationState.route satisfies never;\n};\n\nconst TabLayout = ({ children }: { children: ReactNode }) => {\n  const { notificationState } = useNotificationsContext();\n  if (!notificationState.selectedEvent) {\n    // todo: dev only\n    throw new Error(\n      'Invariant: d must have selected event when viewing render explanation',\n    );\n  }\n  return (\n    <div className={cn([`w-full h-full flex flex-col gap-y-2`])}>\n      <div className={cn(['h-[50px] w-full'])}>\n        <NotificationTabs selectedEvent={notificationState.selectedEvent} />\n      </div>\n      <div\n        className={cn(['h-calc(100%-50px) flex flex-col overflow-y-auto px-3'])}\n      >\n        {children}\n      </div>\n    </div>\n  );\n};\n","import {\n  ComponentProps,\n  ReactNode,\n  createPortal,\n  useContext,\n  useEffect,\n  useRef,\n  useState,\n} from 'preact/compat';\nimport { cn } from '~web/utils/helpers';\nimport { ToolbarElementContext } from '~web/widget';\n\ntype PopoverState = 'closed' | 'opening' | 'open' | 'closing';\n\n/**\n *\n * fixme: very hacky and suboptimal popover (api and implementation)\n */\nexport const Popover = ({\n  children,\n  triggerContent,\n  wrapperProps,\n}: {\n  children: ReactNode;\n  triggerContent: ReactNode;\n  wrapperProps?: ComponentProps<'div'>;\n}) => {\n  const [popoverState, setPopoverState] = useState<PopoverState>('closed');\n  const [elBoundingRect, setElBoundingRect] = useState<DOMRect | null>(null);\n  const [viewportSize, setViewportSize] = useState({\n    width: window.innerWidth,\n    height: window.innerHeight,\n  });\n  const triggerRef = useRef<HTMLDivElement | null>(null);\n  const popoverRef = useRef<HTMLDivElement | null>(null);\n  const portalEl = useContext(ToolbarElementContext);\n  const isHoveredRef = useRef(false);\n\n  useEffect(() => {\n    const handleResize = () => {\n      setViewportSize({\n        width: window.innerWidth,\n        height: window.innerHeight,\n      });\n      updateRect();\n    };\n\n    window.addEventListener('resize', handleResize);\n    return () => window.removeEventListener('resize', handleResize);\n  }, []);\n\n  const updateRect = () => {\n    if (triggerRef.current && portalEl) {\n      const triggerRect = triggerRef.current.getBoundingClientRect();\n      const portalRect = portalEl.getBoundingClientRect();\n\n      const centerX = triggerRect.left + triggerRect.width / 2;\n      const centerY = triggerRect.top;\n\n      const rect = new DOMRect(\n        centerX - portalRect.left,\n        centerY - portalRect.top,\n        triggerRect.width,\n        triggerRect.height,\n      );\n      setElBoundingRect(rect);\n    }\n  };\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    updateRect();\n  }, [triggerRef.current]);\n\n  useEffect(() => {\n    if (popoverState === 'opening') {\n      const timer = setTimeout(() => setPopoverState('open'), 120);\n      return () => clearTimeout(timer);\n    } else if (popoverState === 'closing') {\n      const timer = setTimeout(() => setPopoverState('closed'), 120);\n      return () => clearTimeout(timer);\n    }\n  }, [popoverState]);\n\n  // just incase we didn't capture the mouse leave event because the underlying container moved\n  useEffect(() => {\n    const interval = setInterval(() => {\n      if (!isHoveredRef.current && popoverState !== 'closed') {\n        setPopoverState('closing');\n      }\n    }, 1000);\n\n    return () => clearInterval(interval);\n  }, [popoverState]);\n\n  const handleMouseEnter = () => {\n    isHoveredRef.current = true;\n    updateRect();\n    setPopoverState('opening');\n  };\n\n  const handleMouseLeave = () => {\n    isHoveredRef.current = false;\n    updateRect();\n    setPopoverState('closing');\n  };\n\n  const getPopoverPosition = () => {\n    if (!elBoundingRect || !portalEl) return { top: 0, left: 0 };\n\n    const portalRect = portalEl.getBoundingClientRect();\n    const popoverWidth = 175;\n    const popoverHeight = popoverRef.current?.offsetHeight || 40;\n    const safeArea = 5;\n\n    const viewportX = elBoundingRect.x + portalRect.left;\n    const viewportY = elBoundingRect.y + portalRect.top;\n\n    let left = viewportX;\n    let top = viewportY - 4;\n\n    if (left - popoverWidth / 2 < safeArea) {\n      left = safeArea + popoverWidth / 2;\n    } else if (left + popoverWidth / 2 > viewportSize.width - safeArea) {\n      left = viewportSize.width - safeArea - popoverWidth / 2;\n    }\n\n    if (top - popoverHeight < safeArea) {\n      top = viewportY + elBoundingRect.height + 4;\n    }\n\n    return {\n      top: top - portalRect.top,\n      left: left - portalRect.left,\n    };\n  };\n\n  const popoverPosition = getPopoverPosition();\n\n  return (\n    <>\n      {portalEl &&\n        elBoundingRect &&\n        popoverState !== 'closed' &&\n        createPortal(\n          <div\n            ref={popoverRef}\n            className={cn([\n              'absolute z-100 bg-white text-black rounded-lg px-3 py-2 shadow-lg',\n              'transition-[opacity] duration-120 ease-out',\n              'after:content-[\"\"] after:absolute after:top-[100%]',\n              'after:left-1/2 after:-translate-x-1/2',\n              'after:w-[10px] after:h-[6px]',\n              'after:border-l-[5px] after:border-l-transparent',\n              'after:border-r-[5px] after:border-r-transparent',\n              'after:border-t-[6px] after:border-t-white',\n              'pointer-events-none',\n              popoverState === 'opening' || popoverState === 'closing'\n                ? 'opacity-0'\n                : 'opacity-100',\n            ])}\n            style={{\n              top: popoverPosition.top + 'px',\n              left: popoverPosition.left + 'px',\n              transform: `translate(-50%, calc(-100% - 4px)) scale(${popoverState === 'open' ? 1 : 0.97})`,\n              minWidth: '175px',\n              willChange: 'opacity, transform',\n            }}\n          >\n            {children}\n          </div>,\n          portalEl,\n        )}\n\n      <div\n        ref={triggerRef}\n        onMouseEnter={handleMouseEnter}\n        onMouseLeave={handleMouseLeave}\n        {...wrapperProps}\n      >\n        {triggerContent}\n      </div>\n    </>\n  );\n};\n","import { cn } from '~web/utils/helpers';\nimport { NotificationEvent, useNotificationsContext } from './data';\nimport { Popover } from './popover';\nimport { VolumeOffIcon, VolumeOnIcon } from './icons';\nimport { playNotificationSound } from '~core/utils';\n\nexport const NotificationTabs = ({\n  selectedEvent: _,\n}: {\n  selectedEvent: NotificationEvent;\n}) => {\n  const { notificationState, setNotificationState, setRoute } =\n    useNotificationsContext();\n  return (\n    <div\n      className={cn([\n        'flex w-full justify-between items-center px-3 py-2 text-xs',\n      ])}\n    >\n      <div\n        className={cn([\n          'bg-[#18181B] flex items-center gap-x-1 p-1 rounded-sm',\n        ])}\n      >\n        <button\n          onClick={() => {\n            setRoute({\n              route: 'render-visualization',\n              routeMessage: null,\n            });\n          }}\n          className={cn([\n            'w-1/2 flex items-center justify-center whitespace-nowrap py-[5px] px-1 gap-x-1',\n            notificationState.route === 'render-visualization' ||\n            notificationState.route === 'render-explanation'\n              ? 'text-white bg-[#7521c8] rounded-sm'\n              : 'text-[#6E6E77] bg-[#18181B] rounded-sm',\n          ])}\n        >\n          Ranked\n        </button>\n        <button\n          onClick={() => {\n            setRoute({\n              route: 'other-visualization',\n              routeMessage: null,\n            });\n          }}\n          className={cn([\n            'w-1/2 flex items-center justify-center whitespace-nowrap py-[5px] px-1 gap-x-1',\n            notificationState.route === 'other-visualization'\n              ? 'text-white bg-[#7521c8] rounded-sm'\n              : 'text-[#6E6E77] bg-[#18181B] rounded-sm',\n          ])}\n        >\n          Overview\n        </button>\n        <button\n          onClick={() => {\n            setRoute({\n              route: 'optimize',\n              routeMessage: null,\n            });\n          }}\n          className={cn([\n            'w-1/2 flex items-center justify-center whitespace-nowrap py-[5px] px-1 gap-x-1',\n            notificationState.route === 'optimize'\n              ? 'text-white bg-[#7521c8] rounded-sm'\n              : 'text-[#6E6E77] bg-[#18181B] rounded-sm',\n          ])}\n        >\n          <span>Prompts</span>\n        </button>\n      </div>\n      <Popover\n        triggerContent={\n          <button\n            onClick={() => {\n              setNotificationState((prev) => {\n                if (\n                  prev.audioNotificationsOptions.enabled &&\n                  prev.audioNotificationsOptions.audioContext.state !== 'closed'\n                ) {\n                  prev.audioNotificationsOptions.audioContext.close();\n                }\n                const prevEnabledState = prev.audioNotificationsOptions.enabled;\n                localStorage.setItem(\n                  'react-scan-notifications-audio',\n                  String(!prevEnabledState),\n                );\n\n                const audioContext = new AudioContext();\n                if (!prev.audioNotificationsOptions.enabled) {\n                  playNotificationSound(audioContext);\n                }\n                if (prevEnabledState) {\n                  audioContext.close();\n                }\n                return {\n                  ...prev,\n                  audioNotificationsOptions: prevEnabledState\n                    ? {\n                        audioContext: null,\n                        enabled: false,\n                      }\n                    : {\n                        audioContext,\n                        enabled: true,\n                      },\n                };\n              });\n            }}\n            className=\"ml-auto\"\n          >\n            <div\n              className={cn([\n                'flex gap-x-2 justify-center items-center text-[#6E6E77]',\n              ])}\n            >\n              <span>Alerts</span>\n              {notificationState.audioNotificationsOptions.enabled ? (\n                <VolumeOnIcon size={16} className=\"text-[#6E6E77]\" />\n              ) : (\n                <VolumeOffIcon size={16} className=\"text-[#6E6E77]\" />\n              )}\n            </div>\n          </button>\n        }\n      >\n        <>Play a chime when a slowdown is recorded</>\n      </Popover>\n    </div>\n  );\n};\n","import { useState } from 'preact/hooks';\nimport { cn } from '~web/utils/helpers';\nimport {\n  GroupedFiberRender,\n  NotificationEvent,\n  getComponentName,\n  getTotalTime,\n} from './data';\nimport { iife } from '~core/notifications/performance-utils';\n\nconst formatReactData = (groupedFiberRenders: Array<GroupedFiberRender>) => {\n  let text = '';\n\n  const filteredFibers = groupedFiberRenders\n    .toSorted((a, b) => b.totalTime - a.totalTime)\n    .slice(0, 30)\n    .filter((fiber) => fiber.totalTime > 5);\n\n  filteredFibers.forEach((fiberRender) => {\n    let localText = '';\n\n    localText += 'Component Name:';\n    localText += fiberRender.name;\n    localText += '\\n';\n\n    localText += `Rendered: ${fiberRender.count} times\\n`;\n    localText += `Sum of self times for ${fiberRender.name} is ${fiberRender.totalTime.toFixed(0)}ms\\n`;\n    if (fiberRender.changes.props.length > 0) {\n      localText += `Changed props for all ${fiberRender.name} instances (\"name:count\" pairs)\\n`;\n      fiberRender.changes.props.forEach((change) => {\n        localText += `${change.name}:${change.count}x\\n`;\n      });\n    }\n\n    if (fiberRender.changes.state.length > 0) {\n      localText += `Changed state for all ${fiberRender.name} instances (\"hook index:count\" pairs)\\n`;\n      fiberRender.changes.state.forEach((change) => {\n        localText += `${change.index}:${change.count}x\\n`;\n      });\n    }\n\n    if (fiberRender.changes.context.length > 0) {\n      localText += `Changed context for all ${fiberRender.name} instances (\"context display name (if exists):count\" pairs)\\n`;\n      fiberRender.changes.context.forEach((change) => {\n        localText += `${change.name}:${change.count}x\\n`;\n      });\n    }\n\n    text += localText;\n    text += '\\n';\n  });\n\n  return text;\n};\n\nexport const generateInteractionDataPrompt = ({\n  renderTime,\n  eHandlerTimeExcludingRenders,\n  toRafTime,\n  commitTime,\n  framePresentTime,\n  formattedReactData,\n}: {\n  renderTime: number;\n  eHandlerTimeExcludingRenders: number;\n  toRafTime: number;\n  commitTime: number;\n  framePresentTime: number | null;\n  formattedReactData: string;\n}) => {\n  return `I will provide you with a set of high level, and low level performance data about an interaction in a React App:\n### High level\n- react component render time: ${renderTime.toFixed(0)}ms\n- how long it took to run javascript event handlers (EXCLUDING REACT RENDERS): ${eHandlerTimeExcludingRenders.toFixed(0)}ms\n- how long it took from the last event handler time, to the last request animation frame: ${toRafTime.toFixed(0)}ms\n\t- things like prepaint, style recalculations, layerization, async web API's like observers may occur during this time\n- how long it took from the last request animation frame to when the dom was committed: ${commitTime.toFixed(0)}ms\n\t- during this period you will see paint, commit, potential style recalcs, and other misc browser activity. Frequently high times here imply css that makes the browser do a lot of work, or mutating expensive dom properties during the event handler stage. This can be many things, but it narrows the problem scope significantly when this is high\n${framePresentTime === null ? '' : `- how long it took from dom commit for the frame to be presented: ${framePresentTime.toFixed(0)}ms. This is when information about how to paint the next frame is sent to the compositor threads, and when the GPU does work. If this is high, look for issues that may be a bottleneck for operations occurring during this time`}\n\n### Low level\nWe also have lower level information about react components, such as their render time, and which props/state/context changed when they re-rendered.\n${formattedReactData}`;\n};\n\nconst generateInteractionOptimizationPrompt = ({\n  interactionType,\n  name,\n  componentPath,\n  time,\n  renderTime,\n  eHandlerTimeExcludingRenders,\n  toRafTime,\n  commitTime,\n  framePresentTime,\n  formattedReactData,\n}: {\n  interactionType: string;\n  name: string;\n  componentPath: string;\n\n  time: number;\n  renderTime: number;\n  eHandlerTimeExcludingRenders: number;\n  toRafTime: number;\n  commitTime: number;\n  framePresentTime: number | null;\n  formattedReactData: string;\n}) => `You will attempt to implement a performance improvement to a user interaction in a React app. You will be provided with data about the interaction, and the slow down.\n\nYour should split your goals into 2 parts:\n- identifying the problem\n- fixing the problem\n\t- it is okay to implement a fix even if you aren't 100% sure the fix solves the performance problem. When you aren't sure, you should tell the user to try repeating the interaction, and feeding the \"Formatted Data\" in the React Scan notifications optimize tab. This allows you to start a debugging flow with the user, where you attempt a fix, and observe the result. The user may make a mistake when they pass you the formatted data, so must make sure, given the data passed to you, that the associated data ties to the same interaction you were trying to debug.\n\n\nMake sure to check if the user has the react compiler enabled (project dependent, configured through build tool), so you don't unnecessarily memoize components. If it is, you do not need to worry about memoizing user components\n\nOne challenge you may face is the performance problem lies in a node_module, not in user code. If you are confident the problem originates because of a node_module, there are multiple strategies, which are context dependent:\n- you can try to work around the problem, knowing which module is slow\n- you can determine if its possible to resolve the problem in the node_module by modifying non node_module code\n- you can monkey patch the node_module to experiment and see if it's really the problem (you can modify a functions properties to hijack the call for example)\n- you can determine if it's feasible to replace whatever node_module is causing the problem with a performant option (this is an extreme)\n\nThe interaction was a ${interactionType} on the component named ${name}. This component has the following ancestors ${componentPath}. This is the path from the component, to the root. This should be enough information to figure out where this component is in the user's code base\n\nThis path is the component that was clicked, so it should tell you roughly where component had an event handler that triggered a state change.\n\nPlease note that the leaf node of this path might not be user code (if they use a UI library), and they may contain many wrapper components that just pass through children that aren't relevant to the actual click. So make you sure analyze the path and understand what the user code is doing\n\nWe have a set of high level, and low level data about the performance issue.\n\nThe click took ${time.toFixed(0)}ms from interaction start, to when a new frame was presented to a user.\n\nWe also provide you with a breakdown of what the browser spent time on during the period of interaction start to frame presentation.\n\n- react component render time: ${renderTime.toFixed(0)}ms\n- how long it took to run javascript event handlers (EXCLUDING REACT RENDERS): ${eHandlerTimeExcludingRenders.toFixed(0)}ms\n- how long it took from the last event handler time, to the last request animation frame: ${toRafTime.toFixed(0)}ms\n\t- things like prepaint, style recalculations, layerization, async web API's like observers may occur during this time\n- how long it took from the last request animation frame to when the dom was committed: ${commitTime.toFixed(0)}ms\n\t- during this period you will see paint, commit, potential style recalcs, and other misc browser activity. Frequently high times here imply css that makes the browser do a lot of work, or mutating expensive dom properties during the event handler stage. This can be many things, but it narrows the problem scope significantly when this is high\n${framePresentTime === null ? '' : `- how long it took from dom commit for the frame to be presented: ${framePresentTime.toFixed(0)}ms. This is when information about how to paint the next frame is sent to the compositor threads, and when the GPU does work. If this is high, look for issues that may be a bottleneck for operations occurring during this time`}\n\n\nWe also have lower level information about react components, such as their render time, and which props/state/context changed when they re-rendered.\n\n${formattedReactData}\n\nYou may notice components have many renders, but much fewer props/state/context changes. This normally implies most of the components could of been memoized to avoid computation\n\nIt's also important to remember if a component had no props/state/context change, and it was memoized, it would not render. So the flow should be:\n- find the most expensive components\n- see what's causing them to render\n- determine how you can make those state/props/context not change for a large set of the renders\n- once there are no more changes left, you can memoize the component so it no longer unnecessarily re-renders. \n\nAn important thing to note is that if you see a lot of react renders (some components with very high render counts), but javascript excluding renders is much higher than render time, it is possible that the components with lots of renders run hooks like useEffect/useLayoutEffect, which run during the JS event handler period.\n\nIt's also good to note that react profiles hook times in development, and if many hooks are called (lets say 5,000 components all called a useEffect), it will have to profile every single one. And it may also be the case the comparison of the hooks dependency can be expensive, and that would not be tracked in render time.\n\nIf a node_module is the component with high renders, you can experiment to see if that component is the root issue (because of hooks). You should use the same instructions for node_module debugging mentioned previously.\n\n`;\nconst generateFrameDropOptimizationPrompt = ({\n  renderTime,\n  otherTime,\n  formattedReactData,\n}: {\n  renderTime: number;\n\n  otherTime: number;\n  formattedReactData: string;\n}) => `You will attempt to implement a performance improvement to a large slowdown in a react app\n\nYour should split your goals into 2 parts:\n- identifying the problem\n- fixing the problem\n\t- it is okay to implement a fix even if you aren't 100% sure the fix solves the performance problem. When you aren't sure, you should tell the user to try repeating the interaction, and feeding the \"Formatted Data\" in the React Scan notifications optimize tab. This allows you to start a debugging flow with the user, where you attempt a fix, and observe the result. The user may make a mistake when they pass you the formatted data, so must make sure, given the data passed to you, that the associated data ties to the same interaction you were trying to debug.\n\nMake sure to check if the user has the react compiler enabled (project dependent, configured through build tool), so you don't unnecessarily memoize components. If it is, you do not need to worry about memoizing user components\n\nOne challenge you may face is the performance problem lies in a node_module, not in user code. If you are confident the problem originates because of a node_module, there are multiple strategies, which are context dependent:\n- you can try to work around the problem, knowing which module is slow\n- you can determine if its possible to resolve the problem in the node_module by modifying non node_module code\n- you can monkey patch the node_module to experiment and see if it's really the problem (you can modify a functions properties to hijack the call for example)\n- you can determine if it's feasible to replace whatever node_module is causing the problem with a performant option (this is an extreme)\n\n\nWe have the high level time of how much react spent rendering, and what else the browser spent time on during this slowdown\n\n- react component render time: ${renderTime.toFixed(0)}ms\n- other time: ${otherTime}ms\n\n\nWe also have lower level information about react components, such as their render time, and which props/state/context changed when they re-rendered.\n\n${formattedReactData}\n\nYou may notice components have many renders, but much fewer props/state/context changes. This normally implies most of the components could of been memoized to avoid computation\n\nIt's also important to remember if a component had no props/state/context change, and it was memoized, it would not render. So the flow should be:\n- find the most expensive components\n- see what's causing them to render\n- determine how you can make those state/props/context not change for a large set of the renders\n- once there are no more changes left, you can memoize the component so it no longer unnecessarily re-renders. \n\nAn important thing to note is that if you see a lot of react renders (some components with very high render counts), but other time is much higher than render time, it is possible that the components with lots of renders run hooks like useEffect/useLayoutEffect, which run outside of what we profile (just react render time).\n\nIt's also good to note that react profiles hook times in development, and if many hooks are called (lets say 5,000 components all called a useEffect), it will have to profile every single one. And it may also be the case the comparison of the hooks dependency can be expensive, and that would not be tracked in render time.\n\nIf a node_module is the component with high renders, you can experiment to see if that component is the root issue (because of hooks). You should use the same instructions for node_module debugging mentioned previously.\n\nIf renders don't seem to be the problem, see if there are any expensive CSS properties being added/mutated, or any expensive DOM Element mutations/new elements being created that could cause this slowdown. \n`;\n\nexport const generateFrameDropExplanationPrompt = ({\n  renderTime,\n  otherTime,\n  formattedReactData,\n}: {\n  renderTime: number;\n\n  otherTime: number;\n  formattedReactData: string;\n}) => `Your goal will be to help me find the source of a performance problem in a React App. I collected a large dataset about this specific performance problem.\n\nWe have the high level time of how much react spent rendering, and what else the browser spent time on during this slowdown\n\n- react component render time: ${renderTime.toFixed(0)}ms\n- other time (other JavaScript, hooks like useEffect, style recalculations, layerization, paint & commit and everything else the browser might do to draw a new frame after javascript mutates the DOM): ${otherTime}ms\n\n\nWe also have lower level information about react components, such as their render time, and which props/state/context changed when they re-rendered.\n\n${formattedReactData}\n\nYou may notice components have many renders, but much fewer props/state/context changes. This normally implies most of the components could of been memoized to avoid computation\n\nIt's also important to remember if a component had no props/state/context change, and it was memoized, it would not render. So a flow we can go through is:\n- find the most expensive components\n- see what's causing them to render\n- determine how you can make those state/props/context not change for a large set of the renders\n- once there are no more changes left, you can memoize the component so it no longer unnecessarily re-renders. \n\n\nAn important thing to note is that if you see a lot of react renders (some components with very high render counts), but other time is much higher than render time, it is possible that the components with lots of renders run hooks like useEffect/useLayoutEffect, which run outside of what we profile (just react render time).\n\nIt's also good to note that react profiles hook times in development, and if many hooks are called (lets say 5,000 components all called a useEffect), it will have to profile every single one, and this can add significant overhead when thousands of effects ran.\n\nIf it's not possible to explain the root problem from this data, please ask me for more data explicitly, and what we would need to know to find the source of the performance problem.\n`;\n\nconst generateFrameDropDataPrompt = ({\n  renderTime,\n  otherTime,\n  formattedReactData,\n}: {\n  renderTime: number;\n\n  otherTime: number;\n  formattedReactData: string;\n}) => `I will provide you with a set of high level, and low level performance data about a large frame drop in a React App:\n### High level\n- react component render time: ${renderTime.toFixed(0)}ms\n- how long it took to run everything else (other JavaScript, hooks like useEffect, style recalculations, layerization, paint & commit and everything else the browser might do to draw a new frame after javascript mutates the DOM): ${otherTime}ms\n\n### Low level\nWe also have lower level information about react components, such as their render time, and which props/state/context changed when they re-rendered.\n${formattedReactData}`;\n\nexport const generateInteractionExplanationPrompt = ({\n  interactionType,\n  name,\n  time,\n  renderTime,\n  eHandlerTimeExcludingRenders,\n  toRafTime,\n  commitTime,\n  framePresentTime,\n  formattedReactData,\n}: {\n  interactionType: string;\n  name: string;\n  time: number;\n  renderTime: number;\n  eHandlerTimeExcludingRenders: number;\n  toRafTime: number;\n  commitTime: number;\n  framePresentTime: number | null;\n  formattedReactData: string;\n}) => `Your goal will be to help me find the source of a performance problem. I collected a large dataset about this specific performance problem.\n\nThere was a ${interactionType} on a component named ${name}. This means, roughly, the component that handled the ${interactionType} event was named ${name}.\n\nWe have a set of high level, and low level data about the performance issue.\n\nThe click took ${time.toFixed(0)}ms from interaction start, to when a new frame was presented to a user.\n\nWe also provide you with a breakdown of what the browser spent time on during the period of interaction start to frame presentation.\n\n- react component render time: ${renderTime.toFixed(0)}ms\n- how long it took to run javascript event handlers (EXCLUDING REACT RENDERS): ${eHandlerTimeExcludingRenders.toFixed(0)}ms\n- how long it took from the last event handler time, to the last request animation frame: ${toRafTime.toFixed(0)}ms\n\t- things like prepaint, style recalculations, layerization, async web API's like observers may occur during this time\n- how long it took from the last request animation frame to when the dom was committed: ${commitTime.toFixed(0)}ms\n\t- during this period you will see paint, commit, potential style recalcs, and other misc browser activity. Frequently high times here imply css that makes the browser do a lot of work, or mutating expensive dom properties during the event handler stage. This can be many things, but it narrows the problem scope significantly when this is high\n${framePresentTime === null ? '' : `- how long it took from dom commit for the frame to be presented: ${framePresentTime.toFixed(0)}ms. This is when information about how to paint the next frame is sent to the compositor threads, and when the GPU does work. If this is high, look for issues that may be a bottleneck for operations occurring during this time`}\n\nWe also have lower level information about react components, such as their render time, and which props/state/context changed when they re-rendered.\n\n${formattedReactData}\n\n\nYou may notice components have many renders, but much fewer props/state/context changes. This normally implies most of the components could of been memoized to avoid computation\n\nIt's also important to remember if a component had no props/state/context change, and it was memoized, it would not render. So a flow we can go through is:\n- find the most expensive components\n- see what's causing them to render\n- determine how you can make those state/props/context not change for a large set of the renders\n- once there are no more changes left, you can memoize the component so it no longer unnecessarily re-renders. \n\n\nAn important thing to note is that if you see a lot of react renders (some components with very high render counts), but javascript excluding renders is much higher than render time, it is possible that the components with lots of renders run hooks like useEffect/useLayoutEffect, which run during the JS event handler period.\n\nIt's also good to note that react profiles hook times in development, and if many hooks are called (lets say 5,000 components all called a useEffect), it will have to profile every single one. And it may also be the case the comparison of the hooks dependency can be expensive, and that would not be tracked in render time.\n\nIf it's not possible to explain the root problem from this data, please ask me for more data explicitly, and what we would need to know to find the source of the performance problem.\n`;\nexport const getLLMPrompt = (\n  activeTab: 'fix' | 'data' | 'explanation',\n  selectedEvent: NotificationEvent,\n) =>\n  iife(() => {\n    switch (activeTab) {\n      case 'data': {\n        switch (selectedEvent.kind) {\n          case 'dropped-frames': {\n            return generateFrameDropDataPrompt({\n              formattedReactData: formatReactData(\n                selectedEvent.groupedFiberRenders,\n              ),\n              renderTime: selectedEvent.groupedFiberRenders.reduce(\n                (prev, curr) => prev + curr.totalTime,\n                0,\n              ),\n              otherTime: selectedEvent.timing.otherTime,\n            });\n          }\n          case 'interaction': {\n            return generateInteractionDataPrompt({\n              commitTime: selectedEvent.timing.frameConstruction,\n              eHandlerTimeExcludingRenders: selectedEvent.timing.otherJSTime,\n              formattedReactData: formatReactData(\n                selectedEvent.groupedFiberRenders,\n              ),\n              framePresentTime: selectedEvent.timing.frameDraw,\n              renderTime: selectedEvent.groupedFiberRenders.reduce(\n                (prev, curr) => prev + curr.totalTime,\n                0,\n              ),\n              toRafTime: selectedEvent.timing.framePreparation,\n            });\n          }\n        }\n      }\n      case 'explanation': {\n        switch (selectedEvent.kind) {\n          case 'dropped-frames': {\n            return generateFrameDropExplanationPrompt({\n              formattedReactData: formatReactData(\n                selectedEvent.groupedFiberRenders,\n              ),\n              renderTime: selectedEvent.groupedFiberRenders.reduce(\n                (prev, curr) => prev + curr.totalTime,\n                0,\n              ),\n              otherTime: selectedEvent.timing.otherTime,\n            });\n          }\n          case 'interaction': {\n            return generateInteractionExplanationPrompt({\n              commitTime: selectedEvent.timing.frameConstruction,\n              eHandlerTimeExcludingRenders: selectedEvent.timing.otherJSTime,\n              formattedReactData: formatReactData(\n                selectedEvent.groupedFiberRenders,\n              ),\n              framePresentTime: selectedEvent.timing.frameDraw,\n              interactionType: selectedEvent.type,\n              name: getComponentName(selectedEvent.componentPath),\n              renderTime: selectedEvent.groupedFiberRenders.reduce(\n                (prev, curr) => prev + curr.totalTime,\n                0,\n              ),\n              time: getTotalTime(selectedEvent.timing),\n              toRafTime: selectedEvent.timing.framePreparation,\n            });\n          }\n        }\n      }\n      case 'fix': {\n        switch (selectedEvent.kind) {\n          case 'dropped-frames': {\n            return generateFrameDropOptimizationPrompt({\n              formattedReactData: formatReactData(\n                selectedEvent.groupedFiberRenders,\n              ),\n\n              renderTime: selectedEvent.groupedFiberRenders.reduce(\n                (prev, curr) => prev + curr.totalTime,\n                0,\n              ),\n              otherTime: selectedEvent.timing.otherTime,\n            });\n          }\n          case 'interaction': {\n            return generateInteractionOptimizationPrompt({\n              commitTime: selectedEvent.timing.frameConstruction,\n              componentPath: selectedEvent.componentPath.join('>'),\n              eHandlerTimeExcludingRenders: selectedEvent.timing.otherJSTime,\n              formattedReactData: formatReactData(\n                selectedEvent.groupedFiberRenders,\n              ),\n              framePresentTime: selectedEvent.timing.frameDraw,\n              interactionType: selectedEvent.type,\n              name: getComponentName(selectedEvent.componentPath),\n              renderTime: selectedEvent.groupedFiberRenders.reduce(\n                (prev, curr) => prev + curr.totalTime,\n                0,\n              ),\n              time: getTotalTime(selectedEvent.timing),\n              toRafTime: selectedEvent.timing.framePreparation,\n            });\n          }\n        }\n      }\n    }\n  });\n\nexport const Optimize = ({\n  selectedEvent,\n}: { selectedEvent: NotificationEvent }) => {\n  const [activeTab, setActiveTab] = useState<'fix' | 'explanation' | 'data'>(\n    'fix',\n  );\n  const [copying, setCopying] = useState(false);\n\n  return (\n    <div className={cn(['w-full h-full'])}>\n      <div\n        className={cn([\n          'border border-[#27272A] rounded-sm h-4/5 text-xs overflow-hidden',\n        ])}\n      >\n        <div className={cn(['bg-[#18181B] p-1 rounded-t-sm'])}>\n          <div className={cn(['flex items-center gap-x-1'])}>\n            <button\n              onClick={() => setActiveTab('fix')}\n              className={cn([\n                'flex items-center justify-center whitespace-nowrap py-1.5 px-3 rounded-sm',\n                activeTab === 'fix'\n                  ? 'text-white bg-[#7521c8]'\n                  : 'text-[#6E6E77] hover:text-white',\n              ])}\n            >\n              Fix\n            </button>\n\n            <button\n              onClick={() => setActiveTab('explanation')}\n              className={cn([\n                'flex items-center justify-center whitespace-nowrap py-1.5 px-3 rounded-sm',\n                activeTab === 'explanation'\n                  ? 'text-white bg-[#7521c8]'\n                  : 'text-[#6E6E77] hover:text-white',\n              ])}\n            >\n              Explanation\n            </button>\n            <button\n              onClick={() => setActiveTab('data')}\n              className={cn([\n                'flex items-center justify-center whitespace-nowrap py-1.5 px-3 rounded-sm',\n                activeTab === 'data'\n                  ? 'text-white bg-[#7521c8]'\n                  : 'text-[#6E6E77] hover:text-white',\n              ])}\n            >\n              Data\n            </button>\n          </div>\n        </div>\n        <div className={cn(['overflow-y-auto h-full'])}>\n          <pre\n            className={cn([\n              'p-2 h-full',\n              'whitespace-pre-wrap break-words',\n              'text-gray-300 font-mono ',\n            ])}\n          >\n            {getLLMPrompt(activeTab, selectedEvent)}\n          </pre>\n        </div>\n      </div>\n      <button\n        onClick={async () => {\n          const text = getLLMPrompt(activeTab, selectedEvent);\n\n          await navigator.clipboard.writeText(text);\n          setCopying(true);\n          setTimeout(() => setCopying(false), 1000);\n        }}\n        className={cn([\n          'mt-4 px-4 py-2 bg-[#18181B] text-[#6E6E77] rounded-sm',\n          'hover:text-white transition-colors duration-200',\n          'flex items-center justify-center gap-x-2 text-xs',\n        ])}\n      >\n        <span>{copying ? 'Copied!' : 'Copy Prompt'}</span>\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          width=\"16\"\n          height=\"16\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth=\"2\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          className={cn([\n            'transition-transform duration-200',\n            copying && 'scale-110',\n          ])}\n        >\n          {copying ? (\n            <path d=\"M20 6L9 17l-5-5\" />\n          ) : (\n            <>\n              <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n              <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n            </>\n          )}\n        </svg>\n      </button>\n    </div>\n  );\n};\n","import { ReactNode } from 'preact/compat';\nimport { useContext, useEffect, useState } from 'preact/hooks';\nimport { getIsProduction } from '~core/index';\nimport { iife } from '~core/notifications/performance-utils';\nimport { cn } from '~web/utils/helpers';\nimport {\n  InteractionEvent,\n  NotificationEvent,\n  getTotalTime,\n  useNotificationsContext,\n} from './data';\nimport { getLLMPrompt } from './optimize';\nimport { ToolbarElementContext } from '~web/widget';\ntype BaseTimeDataItem = {\n  name: string;\n  time: number;\n  color: string;\n  kind:\n    | 'other-not-javascript'\n    | 'other-javascript'\n    | 'render'\n    | 'other-frame-drop'\n    | 'total-processing-time';\n};\n\ntype TimeData = Array<BaseTimeDataItem>;\n\nconst getTimeData = (\n  selectedEvent: NotificationEvent,\n  isProduction: boolean,\n) => {\n  switch (selectedEvent.kind) {\n    // todo: push instead of conditional spread\n    case 'dropped-frames': {\n      const timeData: TimeData = [\n        ...(isProduction\n          ? [\n              {\n                name: 'Total Processing Time',\n                time: getTotalTime(selectedEvent.timing),\n                color: 'bg-red-500',\n                kind: 'total-processing-time' as const,\n              },\n            ]\n          : [\n              {\n                name: 'Renders',\n                time: selectedEvent.timing.renderTime,\n                color: 'bg-purple-500',\n                kind: 'render' as const,\n              },\n              {\n                name: 'JavaScript, DOM updates, Draw Frame',\n                time: selectedEvent.timing.otherTime,\n                color: 'bg-[#4b4b4b]',\n                kind: 'other-frame-drop' as const,\n              },\n            ]),\n      ];\n      return timeData;\n    }\n    case 'interaction': {\n      const timeData: TimeData = [\n        ...(!isProduction\n          ? [\n              {\n                name: 'Renders',\n                time: selectedEvent.timing.renderTime,\n                color: 'bg-purple-500',\n                kind: 'render' as const,\n              },\n            ]\n          : []),\n        {\n          name: isProduction\n            ? 'React Renders, Hooks, Other JavaScript'\n            : 'JavaScript/React Hooks ',\n          time: selectedEvent.timing.otherJSTime,\n          color: 'bg-[#EFD81A]',\n\n          kind: 'other-javascript',\n        },\n\n        {\n          name: 'Update DOM and Draw New Frame',\n          time:\n            getTotalTime(selectedEvent.timing) -\n            selectedEvent.timing.renderTime -\n            selectedEvent.timing.otherJSTime,\n          color: 'bg-[#1D3A66]',\n          kind: 'other-not-javascript',\n        },\n      ];\n\n      return timeData;\n    }\n  }\n};\n\nexport const OtherVisualization = ({\n  selectedEvent,\n}: {\n  selectedEvent: NotificationEvent;\n}) => {\n  const [isProduction] = useState(getIsProduction() ?? false);\n  const { notificationState } = useNotificationsContext();\n  const [expandedItems, setExpandedItems] = useState<string[]>(\n    notificationState.routeMessage?.name\n      ? [notificationState.routeMessage.name]\n      : [],\n  );\n  const timeData = getTimeData(selectedEvent, isProduction);\n  const root = useContext(ToolbarElementContext);\n\n  // for when a user clicks a bar of a non render, and gets sent to the other visualization and passes a route message on the way\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    if (notificationState.routeMessage?.name) {\n      const container = root?.querySelector('#overview-scroll-container');\n      const element = root?.querySelector(\n        `#react-scan-overview-bar-${notificationState.routeMessage.name}`,\n      ) as HTMLElement;\n\n      if (container && element) {\n        const elementTop = element.getBoundingClientRect().top;\n        const containerTop = container.getBoundingClientRect().top;\n        const scrollOffset = elementTop - containerTop;\n        container.scrollTop = container.scrollTop + scrollOffset;\n      }\n    }\n  }, [notificationState.route]);\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    if (notificationState.route === 'other-visualization') {\n      setExpandedItems((prev) =>\n        notificationState.routeMessage?.name\n          ? [notificationState.routeMessage.name]\n          : prev,\n      );\n    }\n  }, [notificationState.route]);\n\n  const totalTime = timeData.reduce((acc, item) => acc + item.time, 0);\n\n  return (\n    <div className=\"rounded-sm border border-zinc-800 text-xs\">\n      <div className=\"p-2 border-b border-zinc-800 bg-zinc-900/50\">\n        <div className=\"flex items-center justify-between\">\n          <h3 className=\"text-xs font-medium\">What was time spent on?</h3>\n          <span className=\"text-xs text-zinc-400\">\n            Total: {totalTime.toFixed(0)}ms\n          </span>\n        </div>\n      </div>\n      <div className=\"divide-y divide-zinc-800\">\n        {timeData.map((entry) => {\n          const isExpanded = expandedItems.includes(entry.kind);\n          return (\n            <div key={entry.kind} id={`react-scan-overview-bar-${entry.kind}`}>\n              <button\n                onClick={() =>\n                  setExpandedItems((prev) =>\n                    prev.includes(entry.kind)\n                      ? prev.filter((item) => item !== entry.kind)\n                      : [...prev, entry.kind],\n                  )\n                }\n                className=\"w-full px-3 py-2 flex items-center gap-4 hover:bg-zinc-800/50 transition-colors\"\n              >\n                <div className=\"flex-1\">\n                  <div className=\"flex items-center justify-between mb-2\">\n                    <div className=\"flex items-center gap-0.5\">\n                      <svg\n                        className={`h-4 w-4 text-zinc-400 transition-transform ${isExpanded ? 'rotate-90' : ''}`}\n                        fill=\"none\"\n                        stroke=\"currentColor\"\n                        viewBox=\"0 0 24 24\"\n                      >\n                        <path\n                          strokeLinecap=\"round\"\n                          strokeLinejoin=\"round\"\n                          strokeWidth={2}\n                          d=\"M9 5l7 7-7 7\"\n                        />\n                      </svg>\n                      <span className=\"font-medium flex items-center text-left\">\n                        {entry.name}\n                      </span>\n                    </div>\n                    <span className=\" text-zinc-400\">\n                      {entry.time.toFixed(0)}ms\n                    </span>\n                  </div>\n                  <div className=\"h-1 bg-zinc-800 rounded-full overflow-hidden\">\n                    <div\n                      className={`h-full ${entry.color} transition-all`}\n                      style={{\n                        width: `${(entry.time / totalTime) * 100}%`,\n                      }}\n                    />\n                  </div>\n                </div>\n              </button>\n              {isExpanded && (\n                <div className=\"bg-zinc-900/30 border-t border-zinc-800 px-2.5 py-3\">\n                  <p className=\" text-zinc-400 mb-4 text-xs\">\n                    {iife(() => {\n                      switch (selectedEvent.kind) {\n                        case 'interaction': {\n                          switch (entry.kind) {\n                            case 'render': {\n                              return (\n                                <Explanation\n                                  input={getRenderInput(selectedEvent)}\n                                />\n                              );\n                            }\n\n                            case 'other-javascript': {\n                              return (\n                                <Explanation\n                                  input={getJSInput(selectedEvent)}\n                                />\n                              );\n                            }\n\n                            case 'other-not-javascript': {\n                              return (\n                                <Explanation\n                                  input={getDrawInput(selectedEvent)}\n                                />\n                              );\n                            }\n                          }\n                        }\n                        case 'dropped-frames': {\n                          switch (entry.kind) {\n                            case 'total-processing-time': {\n                              return (\n                                <Explanation\n                                  input={{\n                                    kind: 'total-processing',\n                                    data: {\n                                      time: getTotalTime(selectedEvent.timing),\n                                    },\n                                  }}\n                                />\n                              );\n                            }\n                            case 'render': {\n                              return (\n                                <>\n                                  <Explanation\n                                    input={{\n                                      kind: 'render',\n                                      data: {\n                                        topByTime:\n                                          selectedEvent.groupedFiberRenders\n                                            .toSorted(\n                                              (a, b) =>\n                                                b.totalTime - a.totalTime,\n                                            )\n                                            .slice(0, 3)\n                                            .map((render) => ({\n                                              name: render.name,\n                                              percentage:\n                                                render.totalTime /\n                                                getTotalTime(\n                                                  selectedEvent.timing,\n                                                ),\n                                            })),\n                                      },\n                                    }}\n                                  />\n                                </>\n                              );\n                            }\n                            case 'other-frame-drop': {\n                              return (\n                                <Explanation\n                                  input={{\n                                    kind: 'other',\n                                  }}\n                                />\n                              );\n                            }\n                          }\n                        }\n                      }\n                    })}\n                  </p>\n                </div>\n              )}\n            </div>\n          );\n        })}\n      </div>\n    </div>\n  );\n};\n\ntype OverviewInput =\n  | {\n      kind: 'js-explanation-base';\n    }\n  | {\n      kind: 'total-processing';\n      data: {\n        time: number;\n      };\n    }\n  | {\n      kind: 'high-render-count-high-js';\n      data: {\n        renderCount: number;\n        topByCount: Array<{ name: string; count: number }>;\n      };\n    }\n  | {\n      kind: 'low-render-count-high-js';\n      data: {\n        renderCount: number;\n      };\n    }\n  | {\n      kind: 'high-render-count-update-dom-draw-frame';\n      data: {\n        count: number;\n        percentageOfTotal: number;\n        copyButton: ReactNode;\n      };\n    }\n  | {\n      kind: 'update-dom-draw-frame';\n      data: {\n        copyButton: ReactNode;\n      };\n    }\n  | {\n      kind: 'render';\n      data: { topByTime: Array<{ name: string; percentage: number }> };\n    }\n  | {\n      kind: 'other';\n    };\n\nexport const getTotalProcessingTimeInput = (event: NotificationEvent) => {\n  return {\n    kind: 'total-processing',\n    data: {\n      time: getTotalTime(event.timing),\n    },\n  } satisfies OverviewInput;\n};\n\nconst getDrawInput = (event: InteractionEvent): OverviewInput => {\n  const renderCount = event.groupedFiberRenders.reduce(\n    (prev, curr) => prev + curr.count,\n    0,\n  );\n\n  const renderTime = event.timing.renderTime;\n  const totalTime = getTotalTime(event.timing);\n  const renderPercentage = (renderTime / totalTime) * 100;\n\n  if (renderCount > 100) {\n    return {\n      kind: 'high-render-count-update-dom-draw-frame',\n      data: {\n        count: renderCount,\n        percentageOfTotal: renderPercentage,\n        copyButton: <CopyPromptButton />,\n      },\n    };\n  }\n\n  return {\n    kind: 'update-dom-draw-frame',\n    data: {\n      copyButton: <CopyPromptButton />,\n    },\n  };\n};\n\nconst CopyPromptButton = () => {\n  const [copying, setCopying] = useState(false);\n  const { notificationState } = useNotificationsContext();\n\n  return (\n    <button\n      onClick={async () => {\n        if (!notificationState.selectedEvent) {\n          return;\n        }\n\n        await navigator.clipboard.writeText(\n          getLLMPrompt('explanation', notificationState.selectedEvent),\n        );\n        setCopying(true);\n        setTimeout(() => setCopying(false), 1000);\n      }}\n      className=\"bg-zinc-800 flex hover:bg-zinc-700 text-zinc-200 px-2 py-1 rounded gap-x-3\"\n    >\n      <span>{copying ? 'Copied!' : 'Copy Prompt'}</span>\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        width=\"16\"\n        height=\"16\"\n        viewBox=\"0 0 24 24\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        className={cn([\n          'transition-transform duration-200',\n          copying && 'scale-110',\n        ])}\n      >\n        {copying ? (\n          <path d=\"M20 6L9 17l-5-5\" />\n        ) : (\n          <>\n            <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n            <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n          </>\n        )}\n      </svg>\n    </button>\n  );\n};\n\nconst getRenderInput = (event: InteractionEvent): OverviewInput => {\n  if (event.timing.renderTime / getTotalTime(event.timing) > 0.3) {\n    return {\n      kind: 'render',\n      data: {\n        topByTime: event.groupedFiberRenders\n          .toSorted((a, b) => b.totalTime - a.totalTime)\n          .slice(0, 3)\n          .map((e) => ({\n            percentage: e.totalTime / getTotalTime(event.timing),\n            name: e.name,\n          })),\n      },\n    };\n  }\n\n  return {\n    kind: 'other',\n  };\n};\n\nconst getJSInput = (event: InteractionEvent): OverviewInput => {\n  const renderCount = event.groupedFiberRenders.reduce(\n    (prev, curr) => prev + curr.count,\n    0,\n  );\n  if (event.timing.otherJSTime / getTotalTime(event.timing) < 0.2) {\n    return {\n      kind: 'js-explanation-base',\n    };\n  }\n  if (\n    event.groupedFiberRenders.find((render) => render.count > 200) ||\n    event.groupedFiberRenders.reduce((prev, curr) => prev + curr.count, 0) > 500\n  ) {\n    // not sure a great heuristic for picking the render count\n    return {\n      kind: 'high-render-count-high-js',\n      data: {\n        renderCount,\n        topByCount: event.groupedFiberRenders\n          .filter((groupedRender) => groupedRender.count > 100)\n          .toSorted((a, b) => b.count - a.count)\n          .slice(0, 3),\n      },\n    };\n  }\n  if (event.timing.otherJSTime / getTotalTime(event.timing) > 0.3) {\n    if (event.timing.renderTime > 0.2) {\n      return {\n        kind: 'js-explanation-base',\n      };\n    }\n\n    return {\n      kind: 'low-render-count-high-js',\n      data: {\n        renderCount,\n      },\n    };\n  }\n\n  return {\n    kind: 'js-explanation-base',\n  };\n};\n\nconst Explanation = ({ input }: { input: OverviewInput }) => {\n  switch (input.kind) {\n    case 'total-processing': {\n      return (\n        <div\n          className={cn([\n            'text-[#E4E4E7] text-[10px] leading-6 flex flex-col gap-y-2',\n          ])}\n        >\n          <p>\n            This is the time it took to draw the entire frame that was presented\n            to the user. To be at 60FPS, this number needs to be {'<=16ms'}\n          </p>\n\n          <p>\n            To debug the issue, check the \"Ranked\" tab to see if there are\n            significant component renders\n          </p>\n          <p>\n            On a production React build, React Scan can't access the time it\n            took for component to render. To get that information, run React\n            Scan on a development build\n          </p>\n\n          <p>\n            To understand precisely what caused the slowdown while in\n            production, use the <strong>Chrome profiler</strong> and analyze the\n            function call times.\n          </p>\n\n          <p></p>\n        </div>\n      );\n    }\n    case 'render': {\n      return (\n        <div\n          className={cn([\n            'text-[#E4E4E7] text-[10px] leading-6 flex flex-col gap-y-2',\n          ])}\n        >\n          <p>\n            This is the time it took React to run components, and internal logic\n            to handle the output of your component.\n          </p>\n\n          <div className={cn(['flex flex-col'])}>\n            <p>The slowest components for this time period were:</p>\n            {input.data.topByTime.map((item) => (\n              <div key={item.name}>\n                <strong>{item.name}</strong>:{' '}\n                {(item.percentage * 100).toFixed(0)}% of total\n              </div>\n            ))}\n          </div>\n          <p>\n            To view the render times of all your components, and what caused\n            them to render, go to the \"Ranked\" tab\n          </p>\n          <p>The \"Ranked\" tab shows the render times of every component.</p>\n          <p>\n            The render times of the same components are grouped together into\n            one bar.\n          </p>\n          <p>\n            Clicking the component will show you what props, state, or context\n            caused the component to re-render.\n          </p>\n        </div>\n      );\n    }\n    case 'js-explanation-base': {\n      return (\n        <div\n          className={cn([\n            'text-[#E4E4E7] text-[10px] leading-6 flex flex-col gap-y-2',\n          ])}\n        >\n          <p>\n            This is the period when JavaScript hooks and other JavaScript\n            outside of React Renders run.\n          </p>\n          <p>\n            The most common culprit for high JS time is expensive hooks, like\n            expensive callbacks inside of <code>useEffect</code>'s or a large\n            number of useEffect's called, but this can also be JavaScript event\n            handlers (<code>'onclick'</code>, <code>'onchange'</code>) that\n            performed expensive computation.\n          </p>\n          <p>\n            If you have lots of components rendering that call hooks, like\n            useEffect, it can add significant overhead even if the callbacks are\n            not expensive. If this is the case, you can try optimizing the\n            renders of those components to avoid the hook from having to run.\n          </p>\n          <p>\n            You should profile your app using the{' '}\n            <strong>Chrome DevTools profiler</strong> to learn exactly which\n            functions took the longest to execute.\n          </p>\n        </div>\n      );\n    }\n    case 'high-render-count-high-js': {\n      return (\n        <div\n          className={cn([\n            'text-[#E4E4E7] text-[10px] leading-6 flex flex-col gap-y-2',\n          ])}\n        >\n          <p>\n            This is the period when JavaScript hooks and other JavaScript\n            outside of React Renders run.\n          </p>\n          {input.data.renderCount === 0 ? (\n            <>\n              <p>\n                There were no renders, which means nothing related to React\n                caused this slowdown. The most likely cause of the slowdown is a\n                slow JavaScript event handler, or code related to a Web API\n              </p>\n              <p>\n                You should try to reproduce the slowdown while profiling your\n                website with the\n                <strong>Chrome DevTools profiler</strong> to see exactly what\n                functions took the longest to execute.\n              </p>\n            </>\n          ) : (\n            <>\n              {' '}\n              <p>\n                There were <strong>{input.data.renderCount}</strong> renders,\n                which could have contributed to the high JavaScript/Hook time if\n                they ran lots of hooks, like <code>useEffects</code>.\n              </p>\n              <div className={cn(['flex flex-col'])}>\n                <p>You should try optimizing the renders of:</p>\n                {input.data.topByCount.map((item) => (\n                  <div key={item.name}>\n                    - <strong>{item.name}</strong> (rendered {item.count}x)\n                  </div>\n                ))}\n              </div>\n              and then checking if the problem still exists.\n              <p>\n                You can also try profiling your app using the{' '}\n                <strong>Chrome DevTools profiler</strong> to see exactly what\n                functions took the longest to execute.\n              </p>\n            </>\n          )}\n        </div>\n      );\n    }\n    case 'low-render-count-high-js': {\n      return (\n        <div\n          className={cn([\n            'text-[#E4E4E7] text-[10px] leading-6 flex flex-col gap-y-2',\n          ])}\n        >\n          <p>\n            This is the period when JavaScript hooks and other JavaScript\n            outside of React Renders run.\n          </p>\n          <p>\n            There were only <strong>{input.data.renderCount}</strong> renders\n            detected, which means either you had very expensive hooks like{' '}\n            <code>useEffect</code>/<code>useLayoutEffect</code>, or there is\n            other JavaScript running during this interaction that took up the\n            majority of the time.\n          </p>\n          <p>\n            To understand precisely what caused the slowdown, use the{' '}\n            <strong>Chrome profiler</strong> and analyze the function call\n            times.\n          </p>\n        </div>\n      );\n    }\n    case 'high-render-count-update-dom-draw-frame': {\n      return (\n        <div\n          className={cn([\n            'text-[#E4E4E7] text-[10px] leading-6 flex flex-col gap-y-2',\n          ])}\n        >\n          <p>\n            These are the calculations the browser is forced to do in response\n            to the JavaScript that ran during the interaction.\n          </p>\n          <p>\n            This can be caused by CSS updates/CSS recalculations, or new DOM\n            elements/DOM mutations.\n          </p>\n          <p>\n            During this interaction, there were{' '}\n            <strong>{input.data.count}</strong> renders, which was{' '}\n            <strong>{input.data.percentageOfTotal.toFixed(0)}%</strong> of the\n            time spent processing\n          </p>\n          <p>\n            The work performed as a result of the renders may have forced the\n            browser to spend a lot of time to draw the next frame.\n          </p>\n          <p>\n            You can try optimizing the renders to see if the performance problem\n            still exists using the \"Ranked\" tab.\n          </p>\n          <p>\n            If you use an AI-based code editor, you can export the performance\n            data collected as a prompt.\n          </p>\n\n          <p>{input.data.copyButton}</p>\n          <p>\n            Provide this formatted data to the model and ask it to find, or fix,\n            what could be causing this performance problem.\n          </p>\n          <p>For a larger selection of prompts, try the \"Prompts\" tab</p>\n        </div>\n      );\n    }\n    case 'update-dom-draw-frame': {\n      return (\n        <div\n          className={cn([\n            'text-[#E4E4E7] text-[10px] leading-6 flex flex-col gap-y-2',\n          ])}\n        >\n          <p>\n            These are the calculations the browser is forced to do in response\n            to the JavaScript that ran during the interaction.\n          </p>\n          <p>\n            This can be caused by CSS updates/CSS recalculations, or new DOM\n            elements/DOM mutations.\n          </p>\n          <p>\n            If you use an AI-based code editor, you can export the performance\n            data collected as a prompt.\n          </p>\n\n          <p>{input.data.copyButton}</p>\n          <p>\n            Provide this formatted data to the model and ask it to find, or fix,\n            what could be causing this performance problem.\n          </p>\n          <p>For a larger selection of prompts, try the \"Prompts\" tab</p>\n        </div>\n      );\n    }\n    case 'other': {\n      return (\n        <div\n          className={cn([\n            'text-[#E4E4E7] text-[10px] leading-6 flex flex-col gap-y-2',\n          ])}\n        >\n          <p>\n            This is the time it took to run everything other than React renders.\n            This can be hooks like <code>useEffect</code>, other JavaScript not\n            part of React, or work the browser has to do to update the DOM and\n            draw the next frame.\n          </p>\n          <p>\n            To get a better picture of what happened, profile your app using the{' '}\n            <strong>Chrome profiler</strong> when the performance problem\n            arises.\n          </p>\n        </div>\n      );\n    }\n  }\n};\n","import { useRef, useState } from 'preact/hooks';\nimport { getBatchedRectMap } from 'src/new-outlines';\nimport { getIsProduction } from '~core/index';\nimport { iife } from '~core/notifications/performance-utils';\nimport { cn } from '~web/utils/helpers';\nimport {\n  GroupedFiberRender,\n  NotificationEvent,\n  getTotalTime,\n  isRenderMemoizable,\n  useNotificationsContext,\n} from './data';\nimport {\n  HighlightStore,\n  drawHighlights,\n} from '~core/notifications/outline-overlay';\nimport { ChevronRight } from './icons';\n\n// todo: cleanup, convoluted ternaries\nexport const fadeOutHighlights = () => {\n  const curr = HighlightStore.value.current\n    ? HighlightStore.value.current\n    : HighlightStore.value.kind === 'transition'\n      ? HighlightStore.value.transitionTo\n      : null;\n  if (!curr) {\n    return;\n  }\n\n  if (HighlightStore.value.kind === 'transition') {\n    HighlightStore.value = {\n      kind: 'move-out',\n      // because we want to dynamically fade this value\n      current:\n        HighlightStore.value.current?.alpha === 0\n          ? // we want to only start fading from transition if current is done animating out\n            HighlightStore.value.transitionTo\n          : // if current doesn't exist then transition must exist\n            (HighlightStore.value.current ?? HighlightStore.value.transitionTo),\n    };\n    return;\n  }\n\n  HighlightStore.value = {\n    kind: 'move-out',\n    current: {\n      alpha: 0,\n      ...curr,\n    },\n  };\n};\n\ntype Bars = Array<\n  | { kind: 'other-frame-drop'; totalTime: number }\n  | { kind: 'other-not-javascript'; totalTime: number }\n  | { kind: 'other-javascript'; totalTime: number }\n  | { kind: 'render'; event: GroupedFiberRender; totalTime: number }\n>;\n\nexport const NO_PURGE = ['hover:bg-[#0f0f0f]'];\n\nexport const RenderBarChart = ({\n  selectedEvent,\n}: { selectedEvent: NotificationEvent }) => {\n  const totalInteractionTime = getTotalTime(selectedEvent.timing);\n  const nonRender = totalInteractionTime - selectedEvent.timing.renderTime;\n  const [isProduction] = useState(getIsProduction());\n  const events = selectedEvent.groupedFiberRenders;\n  const bars: Bars = events.map((event) => ({\n    event,\n    kind: 'render',\n    totalTime: isProduction ? event.count : event.totalTime,\n  }));\n\n  const isShowingExtraInfo = iife(() => {\n    switch (selectedEvent.kind) {\n      case 'dropped-frames': {\n        return selectedEvent.timing.renderTime / totalInteractionTime < 0.1;\n      }\n      case 'interaction': {\n        return (\n          (selectedEvent.timing.otherJSTime + selectedEvent.timing.renderTime) /\n            totalInteractionTime <\n          0.2\n        );\n      }\n    }\n  });\n  /**\n   * We don't add the extra bars in production because we can't compare them to the renders, so the bar is useless, user can use overview tab to see times\n   */\n  if (selectedEvent.kind === 'interaction' && !isProduction) {\n    bars.push({\n      kind: 'other-javascript',\n      totalTime: selectedEvent.timing.otherJSTime,\n    });\n  }\n\n  if (isShowingExtraInfo && !isProduction) {\n    if (selectedEvent.kind === 'interaction') {\n      bars.push({\n        kind: 'other-not-javascript',\n        totalTime:\n          getTotalTime(selectedEvent.timing) -\n          selectedEvent.timing.renderTime -\n          selectedEvent.timing.otherJSTime,\n      });\n    } else {\n      bars.push({\n        kind: 'other-frame-drop',\n        totalTime: nonRender,\n      });\n    }\n  }\n\n  const debouncedMouseEnter = useRef<{\n    timer: ReturnType<typeof setTimeout> | null;\n    lastCallAt: number | null;\n  }>({\n    lastCallAt: null,\n    timer: null,\n  });\n\n  const totalBarTime = bars.reduce((prev, curr) => prev + curr.totalTime, 0);\n\n  return (\n    <div className={cn(['flex flex-col h-full w-full gap-y-1'])}>\n      {iife(() => {\n        if (isProduction && bars.length === 0) {\n          return (\n            <div className=\"flex flex-col items-center justify-center h-full text-zinc-400\">\n              <p className=\"text-sm w-full text-left text-white mb-1.5\">\n                No data available\n              </p>\n              <p className=\"text-x w-full text-lefts\">\n                No data was collected during this period\n              </p>\n            </div>\n          );\n        }\n        if (bars.length === 0) {\n          return (\n            <div className=\"flex flex-col items-center justify-center h-full text-zinc-400\">\n              <p className=\"text-sm w-full text-left text-white mb-1.5\">\n                No renders collected\n              </p>\n              <p className=\"text-x w-full text-lefts\">\n                There were no renders during this period\n              </p>\n            </div>\n          );\n        }\n      })}\n\n      {bars\n        .toSorted((a, b) => b.totalTime - a.totalTime)\n        .map((bar) => (\n          <RenderBar\n            key={bar.kind === 'render' ? bar.event.id : bar.kind}\n            bars={bars}\n            bar={bar}\n            debouncedMouseEnter={debouncedMouseEnter}\n            totalBarTime={totalBarTime}\n            isProduction={isProduction}\n          />\n        ))}\n    </div>\n  );\n};\n\nconst getTransitionState = (state: {\n  current: { alpha: number } | null;\n  transitionTo: { alpha: number };\n}) => {\n  if (!state.current) {\n    return 'fading-in';\n  }\n  if (state.current.alpha > 0) {\n    return 'fading-out' as const;\n  }\n  return 'fading-in' as const;\n};\n\nconst RenderBar = ({\n  bar,\n  debouncedMouseEnter,\n  totalBarTime,\n  isProduction,\n  bars,\n  depth = 0,\n}: {\n  depth?: number;\n  bars: Bars;\n  bar: Bars[number];\n  debouncedMouseEnter: {\n    current: {\n      timer: ReturnType<typeof setTimeout> | null;\n      lastCallAt: number | null;\n    };\n  };\n  totalBarTime: number;\n  isProduction: boolean | null;\n}) => {\n  const { setNotificationState, setRoute } = useNotificationsContext();\n  const [isExpanded, setIsExpanded] = useState(false);\n\n  const isLeaf = bar.kind === 'render' ? bar.event.parents.size === 0 : true;\n\n  const parentBars = bars.filter((otherBar) =>\n    otherBar.kind === 'render' && bar.kind === 'render'\n      ? bar.event.parents.has(otherBar.event.name) &&\n        otherBar.event.name !== bar.event.name\n      : false,\n  );\n\n  const missingParentNames =\n    bar.kind === 'render'\n      ? Array.from(bar.event.parents).filter(\n          (parentName) =>\n            !bars.some(\n              (b) => b.kind === 'render' && b.event.name === parentName,\n            ),\n        )\n      : [];\n\n  const handleBarClick = () => {\n    if (bar.kind === 'render') {\n      setNotificationState((prev) => ({\n        ...prev,\n        selectedFiber: bar.event,\n      }));\n\n      setRoute({\n        route: 'render-explanation',\n        routeMessage: null,\n      });\n    } else {\n      setRoute({\n        route: 'other-visualization',\n        routeMessage: {\n          kind: 'auto-open-overview-accordion',\n          name: bar.kind,\n        },\n      });\n    }\n  };\n\n  return (\n    <div className=\"w-full\">\n      <div\n        className={cn(['w-full flex items-center relative text-xs min-w-0'])}\n      >\n        <button\n          onMouseLeave={() => {\n            debouncedMouseEnter.current.timer &&\n              clearTimeout(debouncedMouseEnter.current.timer);\n            fadeOutHighlights();\n          }}\n          onMouseEnter={async () => {\n            const highlightBars = async () => {\n              debouncedMouseEnter.current.lastCallAt = Date.now();\n              if (bar.kind !== 'render') {\n                const curr = HighlightStore.value.current\n                  ? HighlightStore.value.current\n                  : HighlightStore.value.kind === 'transition'\n                    ? HighlightStore.value.transitionTo\n                    : null;\n\n                if (!curr) {\n                  HighlightStore.value = {\n                    kind: 'idle',\n                    current: null,\n                  };\n                  return;\n                }\n                HighlightStore.value = {\n                  kind: 'move-out',\n                  current: {\n                    alpha: 0,\n                    ...curr,\n                  },\n                };\n                return;\n              }\n              const state = HighlightStore.value;\n              const currentState = iife(() => {\n                switch (state.kind) {\n                  case 'transition': {\n                    return state.transitionTo;\n                  }\n                  case 'idle':\n                  case 'move-out': {\n                    return state.current;\n                  }\n                }\n              });\n              const stateRects: Array<DOMRect> = [];\n\n              if (state.kind === 'transition') {\n                const transitionState = getTransitionState(state);\n                iife(() => {\n                  switch (transitionState) {\n                    case 'fading-in': {\n                      HighlightStore.value = {\n                        kind: 'transition',\n                        current: state.transitionTo,\n                        transitionTo: {\n                          rects: stateRects,\n                          alpha: 0,\n                          name: bar.event.name,\n                        },\n                      };\n                      return;\n                    }\n                    case 'fading-out': {\n                      HighlightStore.value = {\n                        kind: 'transition',\n                        current: HighlightStore.value.current\n                          ? {\n                              alpha: 0,\n                              ...HighlightStore.value.current,\n                            }\n                          : null,\n                        transitionTo: {\n                          rects: stateRects,\n                          alpha: 0,\n                          name: bar.event.name,\n                        },\n                      };\n                      return;\n                    }\n                  }\n                });\n              } else {\n                HighlightStore.value = {\n                  kind: 'transition',\n                  transitionTo: {\n                    rects: stateRects,\n                    alpha: 0,\n                    name: bar.event.name,\n                  },\n                  current: currentState\n                    ? {\n                        alpha: 0,\n                        ...currentState,\n                      }\n                    : null,\n                };\n              }\n\n              const trueElements = bar.event.elements.filter(\n                (element) => element instanceof Element,\n              );\n\n              for await (const entries of getBatchedRectMap(trueElements)) {\n                entries.forEach(({ boundingClientRect }) => {\n                  stateRects.push(boundingClientRect);\n                });\n                drawHighlights();\n              }\n            };\n\n            if (\n              debouncedMouseEnter.current.lastCallAt &&\n              Date.now() - debouncedMouseEnter.current.lastCallAt < 200\n            ) {\n              debouncedMouseEnter.current.timer &&\n                clearTimeout(debouncedMouseEnter.current.timer);\n              debouncedMouseEnter.current.timer = setTimeout(() => {\n                highlightBars();\n              }, 200);\n              return;\n            }\n\n            highlightBars();\n          }}\n          onClick={handleBarClick}\n          className={cn([\n            'h-full w-[90%] flex items-center hover:bg-[#0f0f0f] rounded-l-md min-w-0 relative',\n          ])}\n        >\n          <div\n            style={{\n              minWidth: 'fit-content',\n              width: `${(bar.totalTime / totalBarTime) * 100}%`,\n            }}\n            className={cn([\n              'flex items-center rounded-sm text-white text-xs h-[28px] shrink-0',\n              bar.kind === 'render' && 'bg-[#412162] group-hover:bg-[#5b2d89]',\n              bar.kind === 'other-frame-drop' &&\n                'bg-[#44444a] group-hover:bg-[#6a6a6a]',\n              bar.kind === 'other-javascript' &&\n                'bg-[#efd81a6b] group-hover:bg-[#efda1a2f]',\n              bar.kind === 'other-not-javascript' &&\n                'bg-[#214379d4] group-hover:bg-[#21437982]',\n            ])}\n          />\n          <div\n            className={cn([\n              'absolute inset-0 flex items-center px-2',\n              'min-w-0',\n            ])}\n          >\n            <div className=\"flex items-center gap-x-2 min-w-0 w-full\">\n              <span className={cn(['truncate'])}>\n                {iife(() => {\n                  switch (bar.kind) {\n                    case 'other-frame-drop': {\n                      return 'JavaScript, DOM updates, Draw Frame';\n                    }\n                    case 'other-javascript': {\n                      return 'JavaScript/React Hooks';\n                    }\n                    case 'other-not-javascript': {\n                      return 'Update DOM and Draw New Frame';\n                    }\n                    case 'render': {\n                      return bar.event.name;\n                    }\n                  }\n                })}\n              </span>\n              {bar.kind === 'render' && isRenderMemoizable(bar.event) && (\n                <div\n                  style={{\n                    lineHeight: '10px',\n                  }}\n                  className={cn([\n                    'px-1 py-0.5 bg-[#6a369e] flex items-center rounded-sm font-semibold text-[8px] shrink-0',\n                  ])}\n                >\n                  Memoizable\n                </div>\n              )}\n            </div>\n          </div>\n        </button>\n\n        <button\n          onClick={() =>\n            bar.kind === 'render' && !isLeaf && setIsExpanded(!isExpanded)\n          }\n          className={cn([\n            'flex items-center min-w-fit shrink-0 rounded-r-md h-[28px]',\n            !isLeaf && 'hover:bg-[#0f0f0f]',\n            bar.kind === 'render' && !isLeaf\n              ? 'cursor-pointer'\n              : 'cursor-default',\n          ])}\n        >\n          <div className=\"w-[20px] flex items-center justify-center\">\n            {bar.kind === 'render' && !isLeaf && (\n              <ChevronRight\n                className={cn(\n                  'transition-transform',\n                  isExpanded && 'rotate-90',\n                )}\n                size={16}\n              />\n            )}\n          </div>\n\n          <div\n            style={{\n              minWidth: isLeaf ? 'fit-content' : isProduction ? '30px' : '60px',\n            }}\n            className=\"flex items-center justify-end gap-x-1\"\n          >\n            {bar.kind === 'render' && (\n              <span className={cn(['text-[10px]'])}>x{bar.event.count}</span>\n            )}\n\n            {(bar.kind !== 'render' || !isProduction) && (\n              <span className=\"text-[10px] text-[#7346a0] pr-1\">\n                {bar.totalTime < 1 ? '<1' : bar.totalTime.toFixed(0)}\n                ms\n              </span>\n            )}\n          </div>\n        </button>\n\n        {depth === 0 && (\n          <div\n            className={cn([\n              'absolute right-0 top-1/2 transition-none -translate-y-1/2 bg-white text-black px-2 py-1 rounded text-xs opacity-0 group-hover:opacity-100 transition-opacity mr-16',\n              'pointer-events-none',\n            ])}\n          >\n            Click to learn more\n          </div>\n        )}\n      </div>\n\n      {isExpanded &&\n        (parentBars.length > 0 || missingParentNames.length > 0) && (\n          <div className=\"pl-3 flex flex-col gap-y-1 mt-1\">\n            {parentBars\n              .toSorted((a, b) => b.totalTime - a.totalTime)\n              .map((parentBar, i) => (\n                <RenderBar\n                  depth={depth + 1}\n                  key={i}\n                  bar={parentBar}\n                  debouncedMouseEnter={debouncedMouseEnter}\n                  totalBarTime={totalBarTime}\n                  isProduction={isProduction}\n                  bars={bars}\n                />\n              ))}\n            {missingParentNames.map((parentName) => (\n              <div key={parentName} className=\"w-full\">\n                <div className=\"w-full flex items-center relative text-xs\">\n                  <div className=\"h-full w-full flex items-center relative\">\n                    <div className=\"flex items-center rounded-sm text-white text-xs h-[28px] w-full\" />\n                    <div className=\"absolute inset-0 flex items-center px-2\">\n                      <span className=\"truncate whitespace-nowrap text-white/70 w-full\">\n                        {parentName}\n                      </span>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            ))}\n          </div>\n        )}\n    </div>\n  );\n};\n","import { signal } from '@preact/signals';\nimport { iife } from './performance-utils';\n\nexport let highlightCanvas: HTMLCanvasElement | null = null;\nexport let highlightCtx: CanvasRenderingContext2D | null = null;\n\nlet animationFrame: number | null = null;\n\ntype TransitionHighlightState = {\n  kind: 'transition';\n  transitionTo: {\n    name: string;\n    rects: Array<DOMRect>;\n    alpha: number;\n  };\n  current: {\n    name: string;\n    rects: Array<DOMRect>;\n    alpha: number;\n  } | null;\n};\ntype HighlightState =\n  | TransitionHighlightState\n  | {\n      kind: 'move-out';\n      current: {\n        name: string;\n        rects: Array<DOMRect>;\n        alpha: number;\n      };\n    }\n  | {\n      kind: 'idle';\n      current: {\n        name: string;\n        rects: Array<DOMRect>;\n      } | null;\n    };\n\nexport const HighlightStore = signal<HighlightState>({\n  kind: 'idle',\n  current: null,\n});\n\nlet currFrame: ReturnType<typeof requestAnimationFrame> | null = null;\nlet lastFrameTime = 0;\nconst FADE_SPEED = 1.8;\nconst MAX_DELTA = 0.05;\nconst DEFAULT_DELTA = 1 / 60;\n\nexport const drawHighlights = () => {\n  if (currFrame) {\n    cancelAnimationFrame(currFrame);\n  }\n  currFrame = requestAnimationFrame((timestamp) => {\n    if (!highlightCanvas || !highlightCtx) {\n      return;\n    }\n\n    const dt = lastFrameTime\n      ? Math.min((timestamp - lastFrameTime) / 1000, MAX_DELTA)\n      : DEFAULT_DELTA;\n    lastFrameTime = timestamp;\n    const step = FADE_SPEED * dt;\n\n    highlightCtx.clearRect(0, 0, highlightCanvas.width, highlightCanvas.height);\n\n    const color = 'hsl(271, 76%, 53%)';\n    const state = HighlightStore.value;\n    const { alpha, current } = iife(() => {\n      switch (state.kind) {\n        case 'transition': {\n          const current =\n            state.current?.alpha && state.current.alpha > 0\n              ? state.current\n              : state.transitionTo;\n          return {\n            alpha: current ? current.alpha : 0,\n            current,\n          };\n        }\n        case 'move-out': {\n          return { alpha: state.current?.alpha ?? 0, current: state.current };\n        }\n        case 'idle': {\n          return { alpha: 1, current: state.current };\n        }\n      }\n      // exhaustive check\n      state satisfies never;\n    });\n\n    current?.rects.forEach((rect) => {\n      if (!highlightCtx) {\n        // typescript cant tell this closure is synchronous/non-escaping\n        return;\n      }\n      highlightCtx.shadowColor = color;\n      highlightCtx.shadowBlur = 6;\n      highlightCtx.strokeStyle = color;\n      highlightCtx.lineWidth = 2;\n\n      highlightCtx.globalAlpha = alpha;\n\n      highlightCtx.beginPath();\n      highlightCtx.rect(rect.left, rect.top, rect.width, rect.height);\n      highlightCtx.stroke();\n\n      highlightCtx.shadowBlur = 0;\n      highlightCtx.beginPath();\n      highlightCtx.rect(rect.left, rect.top, rect.width, rect.height);\n      highlightCtx.stroke();\n    });\n\n    switch (state.kind) {\n      case 'move-out': {\n        if (state.current.alpha === 0) {\n          HighlightStore.value = {\n            kind: 'idle',\n            current: null,\n          };\n          lastFrameTime = 0;\n          return;\n        }\n        if (state.current.alpha <= 0.01) {\n          state.current.alpha = 0;\n        }\n        state.current.alpha = Math.max(0, state.current.alpha - step);\n        drawHighlights();\n        return;\n      }\n      case 'transition': {\n        if (state.current && state.current.alpha > 0) {\n          state.current.alpha = Math.max(0, state.current.alpha - step);\n          drawHighlights();\n          return;\n        }\n\n        // invariant, state.current.alpha === 0\n        if (state.transitionTo.alpha === 1) {\n          HighlightStore.value = {\n            kind: 'idle',\n            current: state.transitionTo,\n          };\n          lastFrameTime = 0;\n          return;\n        }\n\n        state.transitionTo.alpha = Math.min(state.transitionTo.alpha + step, 1);\n\n        drawHighlights();\n      }\n      case 'idle': {\n        // no-op\n        lastFrameTime = 0;\n        return;\n      }\n    }\n  });\n};\n\nlet handleResizeListener: (() => void) | null = null;\nexport const createHighlightCanvas = (root: HTMLElement) => {\n  highlightCanvas = document.createElement('canvas');\n  highlightCtx = highlightCanvas.getContext('2d', { alpha: true });\n  if (!highlightCtx) return null;\n\n  const dpr = window.devicePixelRatio || 1;\n  const { innerWidth, innerHeight } = window;\n\n  highlightCanvas.style.width = `${innerWidth}px`;\n  highlightCanvas.style.height = `${innerHeight}px`;\n  highlightCanvas.width = innerWidth * dpr;\n  highlightCanvas.height = innerHeight * dpr;\n  highlightCanvas.style.position = 'fixed';\n  highlightCanvas.style.left = '0';\n  highlightCanvas.style.top = '0';\n  highlightCanvas.style.pointerEvents = 'none';\n  highlightCanvas.style.zIndex = '2147483600';\n\n  highlightCtx.scale(dpr, dpr);\n\n  root.appendChild(highlightCanvas);\n\n  if (handleResizeListener) {\n    window.removeEventListener('resize', handleResizeListener);\n  }\n\n  const handleResize = () => {\n    if (!highlightCanvas || !highlightCtx) return;\n    const dpr = window.devicePixelRatio || 1;\n    const { innerWidth, innerHeight } = window;\n\n    highlightCanvas.style.width = `${innerWidth}px`;\n    highlightCanvas.style.height = `${innerHeight}px`;\n    highlightCanvas.width = innerWidth * dpr;\n    highlightCanvas.height = innerHeight * dpr;\n    highlightCtx.scale(dpr, dpr);\n\n    drawHighlights();\n  };\n  handleResizeListener = handleResize;\n\n  window.addEventListener('resize', handleResize);\n\n  HighlightStore.subscribe(() => {\n    requestAnimationFrame(() => {\n      drawHighlights();\n    });\n  });\n\n  return cleanup;\n};\n\nexport function cleanup() {\n  if (animationFrame) {\n    cancelAnimationFrame(animationFrame);\n    animationFrame = null;\n  }\n  if (highlightCanvas?.parentNode) {\n    highlightCanvas.parentNode.removeChild(highlightCanvas);\n  }\n  highlightCanvas = null;\n  highlightCtx = null;\n}\n","import { cn } from '~web/utils/helpers';\nimport { NotificationEvent, useNotificationsContext } from './data';\nimport { useLayoutEffect, useState } from 'preact/hooks';\nimport { ArrowLeft, CloseIcon } from './icons';\nimport { getIsProduction } from '~core/index';\n\nexport const RenderExplanation = ({\n  selectedEvent: _,\n  selectedFiber,\n}: {\n  selectedFiber: NotificationEvent['groupedFiberRenders'][number];\n  selectedEvent: NotificationEvent;\n}) => {\n  const { setRoute } = useNotificationsContext();\n  const [tipisShown, setTipIsShown] = useState(true);\n  const [isProduction] = useState(getIsProduction());\n\n  useLayoutEffect(() => {\n    const res = localStorage.getItem('react-scan-tip-shown');\n    const asBool = res === 'true' ? true : res === 'false' ? false : null;\n    if (asBool === null) {\n      setTipIsShown(true);\n      localStorage.setItem('react-scan-tip-is-shown', 'true');\n      return;\n    }\n    if (!asBool) {\n      setTipIsShown(false);\n    }\n  }, []);\n  const isMemoizable =\n    selectedFiber.changes.context.length === 0 &&\n    selectedFiber.changes.props.length === 0 &&\n    selectedFiber.changes.state.length === 0;\n  return (\n    <div\n      className={cn([\n        'w-full min-h-fit h-full flex flex-col py-4 pt-0 rounded-sm',\n      ])}\n    >\n      <div className={cn(['flex items-start gap-x-4 '])}>\n        <button\n          onClick={() => {\n            setRoute({\n              route: 'render-visualization',\n              routeMessage: null,\n            });\n          }}\n          className={cn([\n            'text-white hover:bg-[#34343b] flex gap-x-1 justify-center items-center mb-4 w-fit px-2.5 py-1.5 text-xs rounded-sm bg-[#18181B]',\n          ])}\n        >\n          <ArrowLeft size={14} /> <span>Overview</span>\n        </button>\n        <div className={cn(['flex flex-col gap-y-1'])}>\n          <div\n            className={cn(['text-sm font-bold text-white overflow-x-hidden'])}\n          >\n            <div className=\"flex items-center gap-x-2 truncate\">\n              {selectedFiber.name}\n            </div>\n          </div>\n          <div className={cn(['flex gap-x-2'])}>\n            {!isProduction && (\n              <>\n                <div className={cn(['text-xs text-gray-400'])}>\n                  • Render time: {selectedFiber.totalTime.toFixed(0)}ms\n                </div>\n              </>\n            )}\n            <div className={cn(['text-xs text-gray-400 mb-4'])}>\n              • Renders: {selectedFiber.count}x\n            </div>\n          </div>\n        </div>\n      </div>\n      {tipisShown && !isMemoizable && (\n        <div\n          className={cn([\n            'w-full mb-4 bg-[#0A0A0A] border border-[#27272A] rounded-sm overflow-hidden flex relative',\n          ])}\n        >\n          <button\n            onClick={() => {\n              setTipIsShown(false);\n\n              localStorage.setItem('react-scan-tip-shown', 'false');\n            }}\n            className={cn([\n              'absolute right-2 top-2 rounded-sm p-1 hover:bg-[#18181B]',\n            ])}\n          >\n            <CloseIcon size={12} />\n          </button>\n          <div className={cn(['w-1 bg-[#d36cff]'])} />\n          <div className={cn(['flex-1'])}>\n            <div\n              className={cn(['px-3 py-2 text-gray-100 text-xs font-semibold'])}\n            >\n              How to stop renders\n            </div>\n            <div className={cn(['px-3 pb-2 text-gray-400 text-[10px]'])}>\n              Stop the following props, state and context from changing between\n              renders, and wrap the component in React.memo if not already\n            </div>\n          </div>\n        </div>\n      )}\n\n      {isMemoizable && (\n        <div\n          className={cn([\n            'w-full mb-4 bg-[#0A0A0A] border border-[#27272A] rounded-sm overflow-hidden flex',\n          ])}\n        >\n          <div className={cn(['w-1 bg-[#d36cff]'])} />\n          <div className={cn(['flex-1'])}>\n            <div\n              className={cn(['px-3 py-2 text-gray-100 text-sm font-semibold'])}\n            >\n              No changes detected\n            </div>\n            <div className={cn(['px-3 pb-2 text-gray-400 text-xs'])}>\n              This component would not have rendered if it was memoized\n            </div>\n          </div>\n        </div>\n      )}\n      <div className={cn(['flex w-full'])}>\n        <div\n          className={cn([\n            'flex flex-col border border-[#27272A] rounded-l-sm overflow-hidden w-1/3',\n          ])}\n        >\n          <div\n            className={cn([\n              'text-[14px] font-semibold px-2 py-2 bg-[#18181B] text-white flex justify-center',\n            ])}\n          >\n            Changed Props\n          </div>\n          {selectedFiber.changes.props.length > 0 ? (\n            selectedFiber.changes.props\n              .toSorted((a, b) => b.count - a.count)\n              .map((change) => (\n                <div\n                  key={change.name}\n                  className={cn([\n                    'flex flex-col justify-between items-center border-t overflow-x-auto border-[#27272A] px-1 py-1 text-wrap bg-[#0A0A0A] text-[10px]',\n                  ])}\n                >\n                  <span className={cn(['text-white '])}>{change.name}</span>\n                  <div\n                    className={cn([' text-[8px]  text-[#d36cff] pl-1 py-1 '])}\n                  >\n                    {change.count}/{selectedFiber.count}x\n                  </div>\n                </div>\n              ))\n          ) : (\n            <div\n              className={cn([\n                'flex items-center justify-center h-full bg-[#0A0A0A] text-[#A1A1AA] border-t border-[#27272A]',\n              ])}\n            >\n              No changes\n            </div>\n          )}\n        </div>\n        <div\n          className={cn([\n            'flex flex-col border border-[#27272A] border-l-0 overflow-hidden w-1/3',\n          ])}\n        >\n          <div\n            className={cn([\n              ' text-[14px] font-semibold px-2 py-2 bg-[#18181B] text-white flex justify-center',\n            ])}\n          >\n            Changed State\n          </div>\n          {selectedFiber.changes.state.length > 0 ? (\n            selectedFiber.changes.state\n              .toSorted((a, b) => b.count - a.count)\n              .map((change) => (\n                <div\n                  key={change.index}\n                  className={cn([\n                    'flex flex-col justify-between items-center border-t overflow-x-auto border-[#27272A] px-1 py-1 text-wrap bg-[#0A0A0A] text-[10px]',\n                  ])}\n                >\n                  <span className={cn(['text-white '])}>\n                    index {change.index}\n                  </span>\n                  <div\n                    className={cn([\n                      'rounded-full  text-[#d36cff] pl-1 py-1 text-[8px]',\n                    ])}\n                  >\n                    {change.count}/{selectedFiber.count}x\n                  </div>\n                </div>\n              ))\n          ) : (\n            <div\n              className={cn([\n                'flex items-center justify-center h-full bg-[#0A0A0A] text-[#A1A1AA] border-t border-[#27272A]',\n              ])}\n            >\n              No changes\n            </div>\n          )}\n        </div>\n        <div\n          className={cn([\n            'flex flex-col border border-[#27272A] border-l-0 rounded-r-sm overflow-hidden w-1/3',\n          ])}\n        >\n          <div\n            className={cn([\n              ' text-[14px] font-semibold px-2 py-2 bg-[#18181B] text-white flex justify-center',\n            ])}\n          >\n            Changed Context\n          </div>\n          {selectedFiber.changes.context.length > 0 ? (\n            selectedFiber.changes.context\n\n              .toSorted((a, b) => b.count - a.count)\n              .map((change) => (\n                <div\n                  key={change.name}\n                  className={cn([\n                    'flex flex-col justify-between items-center border-t  border-[#27272A] px-1 py-1 bg-[#0A0A0A] text-[10px] overflow-x-auto',\n                  ])}\n                >\n                  <span className={cn(['text-white '])}>{change.name}</span>\n                  <div\n                    className={cn([\n                      'rounded-full text-[#d36cff] pl-1 py-1 text-[8px] text-wrap',\n                    ])}\n                  >\n                    {change.count}/{selectedFiber.count}x\n                  </div>\n                </div>\n              ))\n          ) : (\n            <div\n              className={cn([\n                'flex items-center justify-center h-full bg-[#0A0A0A] text-[#A1A1AA] border-t border-[#27272A] py-2',\n              ])}\n            >\n              No changes\n            </div>\n          )}\n        </div>\n      </div>\n    </div>\n  );\n};\n","import { cn } from '~web/utils/helpers';\nimport {\n  NotificationEvent,\n  getComponentName,\n  getEventSeverity,\n  getTotalTime,\n} from './data';\nimport { CloseIcon } from './icons';\nimport { signalWidgetViews } from '~web/state';\n\nexport const NotificationHeader = ({\n  selectedEvent,\n}: {\n  selectedEvent: NotificationEvent;\n}) => {\n  const severity = getEventSeverity(selectedEvent);\n  switch (selectedEvent.kind) {\n    case 'interaction': {\n      return (\n        // h-[48px] is a hack to adjust for header size\n        <div\n          className={cn([`w-full flex border-b border-[#27272A] min-h-[48px]`])}\n        >\n          {/* todo: make css variables for colors */}\n          <div\n            className={cn([\n              'min-w-fit w-full justify-start flex items-center border-r border-[#27272A] pl-5 pr-2 text-sm gap-x-4',\n            ])}\n          >\n            <div className={cn(['flex items-center gap-x-2 '])}>\n              <span className={cn(['text-[#5a5a5a] mr-0.5'])}>\n                {selectedEvent.type === 'click' ? 'Clicked ' : 'Typed in '}\n              </span>\n              <span>{getComponentName(selectedEvent.componentPath)}</span>\n              <div\n                className={cn([\n                  'w-fit flex items-center justify-center h-fit text-white px-1 rounded-sm font-semibold text-[10px] whitespace-nowrap',\n                  severity === 'low' && 'bg-green-500/50',\n                  severity === 'needs-improvement' && 'bg-[#b77116]',\n                  severity === 'high' && 'bg-[#b94040]',\n                ])}\n              >\n                {getTotalTime(selectedEvent.timing).toFixed(0)}ms processing\n                time\n              </div>\n            </div>\n            <div\n              className={cn(['flex items-center gap-x-2  justify-end ml-auto'])}\n            >\n              <div\n                className={cn([\n                  'p-2 flex justify-center items-center border-[#27272A]',\n                ])}\n              >\n                <button\n                  onClick={() => {\n                    signalWidgetViews.value = {\n                      view: 'none',\n                    };\n                  }}\n                  title=\"Close\"\n                >\n                  <CloseIcon size={18} className=\"text-[#6F6F78]\" />\n                </button>\n              </div>\n            </div>\n          </div>\n        </div>\n      );\n    }\n    case 'dropped-frames': {\n      return (\n        <div\n          className={cn([`w-full flex border-b border-[#27272A] min-h-[48px]`])}\n        >\n          <div\n            className={cn([\n              'min-w-fit w-full justify-start flex items-center border-r border-[#27272A] pl-5 pr-2 text-sm gap-x-4',\n            ])}\n          >\n            <div className={cn(['flex items-center gap-x-2 '])}>\n              FPS Drop\n              <div\n                className={cn([\n                  'w-fit flex items-center justify-center h-fit text-white px-1 rounded-sm font-semibold text-[10px] whitespace-nowrap',\n                  severity === 'low' && 'bg-green-500/50',\n                  severity === 'needs-improvement' && 'bg-[#b77116]',\n                  severity === 'high' && 'bg-[#b94040]',\n                ])}\n              >\n                dropped to {selectedEvent.fps} FPS\n              </div>\n            </div>\n\n            <div\n              className={cn([\n                'flex items-center gap-x-2 w-2/4 justify-end ml-auto',\n              ])}\n            >\n              <div\n                className={cn([\n                  'p-2 flex justify-center items-center border-[#27272A]',\n                ])}\n              >\n                <button\n                  onClick={() => {\n                    signalWidgetViews.value = {\n                      view: 'none',\n                    };\n                  }}\n                >\n                  <CloseIcon size={18} className=\"text-[#6F6F78]\" />\n                </button>\n              </div>\n            </div>\n          </div>\n        </div>\n      );\n    }\n  }\n};\n","import { useEffect, useRef, useState } from 'preact/compat';\nimport { cn } from '~web/utils/helpers';\nimport {\n  InteractionEvent,\n  NotificationEvent,\n  getComponentName,\n  getEventSeverity,\n  getTotalTime,\n  useNotificationsContext,\n} from './data';\nimport {\n  ClearIcon,\n  KeyboardIcon,\n  PointerIcon,\n  TrendingDownIcon,\n} from './icons';\nimport { Popover } from './popover';\nimport { iife } from '~core/notifications/performance-utils';\nimport { toolbarEventStore } from '~core/notifications/event-tracking';\nimport { CollapsedDroppedFrame, CollapsedItem } from './collapsed-event';\n\nconst useFlashManager = (events: NotificationEvent[]) => {\n  const prevEventsRef = useRef<NotificationEvent[]>([]);\n  const [newEventIds, setNewEventIds] = useState<Set<string>>(new Set());\n  const isInitialMount = useRef(true);\n\n  useEffect(() => {\n    if (isInitialMount.current) {\n      isInitialMount.current = false;\n      prevEventsRef.current = events;\n      return;\n    }\n\n    const currentIds = new Set(events.map((e) => e.id));\n    const prevIds = new Set(prevEventsRef.current.map((e) => e.id));\n\n    const newIds = new Set<string>();\n    currentIds.forEach((id) => {\n      if (!prevIds.has(id)) {\n        newIds.add(id);\n      }\n    });\n\n    if (newIds.size > 0) {\n      setNewEventIds(newIds);\n      setTimeout(() => {\n        setNewEventIds(new Set());\n      }, 2000);\n    }\n\n    prevEventsRef.current = events;\n  }, [events]);\n\n  return (id: string) => newEventIds.has(id);\n};\n\nconst useFlash = ({ shouldFlash }: { shouldFlash: boolean }) => {\n  const [isFlashing, setIsFlashing] = useState(shouldFlash);\n  useEffect(() => {\n    if (shouldFlash) {\n      setIsFlashing(true);\n      const timer = setTimeout(() => {\n        setIsFlashing(false);\n      }, 1000);\n      return () => clearTimeout(timer);\n    }\n  }, [shouldFlash]);\n\n  return isFlashing;\n};\n\nexport const SlowdownHistoryItem = ({\n  event,\n  shouldFlash,\n}: {\n  event: NotificationEvent;\n  shouldFlash: boolean;\n}) => {\n  const { notificationState, setNotificationState } = useNotificationsContext();\n\n  const severity = getEventSeverity(event);\n\n  const isFlashing = useFlash({ shouldFlash });\n\n  switch (event.kind) {\n    case 'interaction': {\n      return (\n        <button\n          onClick={() => {\n            setNotificationState((prev) => ({\n              ...prev,\n              selectedEvent: event,\n              route: 'render-visualization',\n              selectedFiber: null,\n            }));\n          }}\n          className={cn([\n            'pl-2 py-1.5  text-sm flex w-full items-center rounded-sm hover:bg-[#18181B] relative overflow-hidden',\n            event.id === notificationState.selectedEvent?.id && 'bg-[#18181B]',\n            isFlashing &&\n              'after:absolute after:inset-0 after:bg-purple-500/30 after:animate-[fadeOut_1s_ease-out_forwards]',\n          ])}\n        >\n          <div\n            className={cn([\n              'w-4/5 flex items-center justify-start h-full gap-x-1.5',\n            ])}\n          >\n            <span className={cn(['min-w-fit text-xs'])}>\n              {iife(() => {\n                switch (event.type) {\n                  case 'click': {\n                    return <PointerIcon size={14} />;\n                  }\n                  case 'keyboard': {\n                    return <KeyboardIcon size={14} />;\n                  }\n                }\n              })}\n            </span>\n\n            <span className={cn(['text-xs pr-1 truncate'])}>\n              {getComponentName(event.componentPath)}\n            </span>\n          </div>\n          <div\n            className={cn([' min-w-fit flex justify-end items-center ml-auto'])}\n          >\n            <div\n              style={{\n                lineHeight: '10px',\n              }}\n              className={cn([\n                'gap-x-0.5 w-fit flex items-end justify-center h-full text-white px-1 py-1 rounded-sm font-semibold text-[10px]',\n                severity === 'low' && 'bg-green-500/50',\n                severity === 'needs-improvement' && 'bg-[#b77116] text-[10px]',\n                severity === 'high' && 'bg-[#b94040]',\n              ])}\n            >\n              <div\n                style={{\n                  lineHeight: '10px',\n                }}\n                className={cn(['text-[10px] text-white flex items-end'])}\n              >\n                {getTotalTime(event.timing).toFixed(0)}ms\n              </div>\n            </div>\n          </div>\n        </button>\n      );\n    }\n    case 'dropped-frames': {\n      return (\n        <button\n          onClick={() => {\n            setNotificationState((prev) => ({\n              ...prev,\n              selectedEvent: event,\n              // explicitly force back to render-visualization since the user might get confused when they don't see the detailed view immediately when clicking the view\n              route: 'render-visualization',\n              selectedFiber: null,\n            }));\n          }}\n          className={cn([\n            'pl-2 py-1.5  w-full text-sm flex items-center rounded-sm hover:bg-[#18181B] relative overflow-hidden',\n            event.id === notificationState.selectedEvent?.id && 'bg-[#18181B]',\n            isFlashing &&\n              'after:absolute after:inset-0 after:bg-purple-500/30 after:animate-[fadeOut_1s_ease-out_forwards]',\n          ])}\n        >\n          <div\n            className={cn([\n              'w-4/5 flex items-center justify-start h-full text-xs truncate',\n            ])}\n          >\n            <TrendingDownIcon size={14} className=\"mr-1.5\" /> FPS Drop\n          </div>\n          <div\n            className={cn([' min-w-fit flex justify-end items-center ml-auto'])}\n          >\n            <div\n              style={{\n                lineHeight: '10px',\n              }}\n              className={cn([\n                'w-fit flex items-center justify-center h-full text-white px-1 py-1 rounded-sm text-[10px] font-bold',\n                severity === 'low' && 'bg-green-500/60',\n                severity === 'needs-improvement' && 'bg-[#b77116] text-[10px]',\n                severity === 'high' && 'bg-[#b94040]',\n              ])}\n            >\n              {event.fps} FPS\n            </div>\n          </div>\n        </button>\n      );\n    }\n  }\n};\n\ntype CollapsedKeyboardInput = {\n  kind: 'collapsed-keyboard';\n  events: Array<InteractionEvent>;\n  timestamp: number;\n};\n\ntype HistoryEvent =\n  | {\n      kind: 'single';\n      event: NotificationEvent;\n      timestamp: number;\n    }\n  | CollapsedKeyboardInput\n  | CollapsedDroppedFrame;\n\nconst collapseEvents = (events: Array<NotificationEvent>) => {\n  const newEvents = events.reduce<Array<HistoryEvent>>((prev, curr) => {\n    const lastEvent = prev.at(-1);\n    if (!lastEvent) {\n      return [\n        {\n          kind: 'single',\n          event: curr,\n          timestamp: curr.timestamp,\n        },\n      ];\n    }\n\n    switch (lastEvent.kind) {\n      case 'collapsed-keyboard': {\n        if (\n          curr.kind === 'interaction' &&\n          curr.type === 'keyboard' &&\n          // must be on the same semantic component, it would be ideal to compare on fiberId, but i digress\n          curr.componentPath.join('-') ===\n            lastEvent.events[0].componentPath.join('-')\n        ) {\n          const eventsWithoutLast = prev.filter((e) => e !== lastEvent);\n\n          return [\n            ...eventsWithoutLast,\n            {\n              kind: 'collapsed-keyboard',\n              events: [...lastEvent.events, curr],\n              timestamp: Math.max(\n                ...[...lastEvent.events, curr].map((e) => e.timestamp),\n              ),\n            },\n          ];\n        }\n\n        return [\n          ...prev,\n          {\n            kind: 'single',\n            event: curr,\n            timestamp: curr.timestamp,\n          },\n        ];\n      }\n      case 'single': {\n        // if its a keyboard input on the same element\n        if (\n          lastEvent.event.kind === 'interaction' &&\n          lastEvent.event.type === 'keyboard' &&\n          curr.kind === 'interaction' &&\n          curr.type === 'keyboard' &&\n          lastEvent.event.componentPath.join('-') ===\n            curr.componentPath.join('-')\n        ) {\n          const eventsWithoutLast = prev.filter((e) => e !== lastEvent);\n          return [\n            ...eventsWithoutLast,\n            {\n              kind: 'collapsed-keyboard',\n              events: [lastEvent.event, curr],\n              timestamp: Math.max(lastEvent.event.timestamp, curr.timestamp),\n            },\n          ];\n        }\n        if (\n          lastEvent.event.kind === 'dropped-frames' &&\n          curr.kind === 'dropped-frames'\n        ) {\n          const eventsWithoutLast = prev.filter((e) => e !== lastEvent);\n\n          return [\n            ...eventsWithoutLast,\n            {\n              kind: 'collapsed-frame-drops',\n              events: [lastEvent.event, curr],\n              timestamp: Math.max(lastEvent.event.timestamp, curr.timestamp),\n            },\n          ];\n        }\n        return [\n          ...prev,\n          {\n            kind: 'single',\n            event: curr,\n            timestamp: curr.timestamp,\n          },\n        ];\n      }\n      case 'collapsed-frame-drops': {\n        if (curr.kind === 'dropped-frames') {\n          const eventsWithoutLast = prev.filter((e) => e !== lastEvent);\n          return [\n            ...eventsWithoutLast,\n            {\n              kind: 'collapsed-frame-drops',\n              events: [...lastEvent.events, curr],\n              timestamp: Math.max(\n                ...[...lastEvent.events, curr].map((e) => e.timestamp),\n              ),\n            },\n          ];\n        }\n        return [\n          ...prev,\n          {\n            kind: 'single',\n            event: curr,\n            timestamp: curr.timestamp,\n          },\n        ];\n      }\n    }\n  }, []);\n  return newEvents;\n};\n\nexport const useLaggedEvents = (lagMs = 150) => {\n  const { notificationState } = useNotificationsContext();\n  const [laggedEvents, setLaggedEvents] = useState(notificationState.events);\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    setTimeout(() => {\n      setLaggedEvents(notificationState.events);\n    }, lagMs);\n  }, [notificationState.events]);\n  return [laggedEvents, setLaggedEvents] as const;\n};\n\nexport const SlowdownHistory = () => {\n  const { notificationState, setNotificationState } = useNotificationsContext();\n  const shouldFlash = useFlashManager(notificationState.events);\n  const [laggedEvents, setLaggedEvents] = useLaggedEvents();\n  // this is to avoid a flicker from our overlapping events deduping logic. This should be handled downstream, but this simplifies logic for now\n  const collapsedEvents = collapseEvents(laggedEvents).toSorted(\n    (a, b) => b.timestamp - a.timestamp,\n  );\n\n  return (\n    <div\n      className={cn([\n        `w-full h-full gap-y-2 flex flex-col border-r border-[#27272A] overflow-y-auto`,\n      ])}\n    >\n      <div\n        className={cn([\n          'text-sm text-[#65656D] pl-3 pr-1 w-full flex items-center justify-between',\n        ])}\n      >\n        <span>History</span>\n        <Popover\n          wrapperProps={{\n            className: 'h-full flex items-center justify-center ml-auto',\n          }}\n          triggerContent={\n            <button\n              className={cn(['hover:bg-[#18181B] rounded-full p-2'])}\n              title=\"Clear all events\"\n              onClick={() => {\n                toolbarEventStore.getState().actions.clear();\n                setNotificationState((prev) => ({\n                  ...prev,\n                  selectedEvent: null,\n                  selectedFiber: null,\n                  route:\n                    prev.route === 'other-visualization'\n                      ? 'other-visualization'\n                      : 'render-visualization',\n                }));\n                setLaggedEvents([]);\n              }}\n            >\n              <ClearIcon className={cn([''])} size={16} />\n            </button>\n          }\n        >\n          <div className={cn(['w-full flex justify-center'])}>\n            Clear all events\n          </div>\n        </Popover>\n      </div>\n      <div className={cn(['flex flex-col px-1 gap-y-1'])}>\n        {collapsedEvents.length === 0 && (\n          <div\n            className={cn([\n              'flex items-center justify-center text-zinc-500 text-sm py-4',\n            ])}\n          >\n            No Events\n          </div>\n        )}\n        {collapsedEvents.map((historyItem) =>\n          iife(() => {\n            switch (historyItem.kind) {\n              case 'collapsed-keyboard': {\n                return (\n                  <CollapsedItem shouldFlash={shouldFlash} item={historyItem} />\n                );\n              }\n              case 'single': {\n                return (\n                  <SlowdownHistoryItem\n                    key={historyItem.event.id}\n                    event={historyItem.event}\n                    shouldFlash={shouldFlash(historyItem.event.id)}\n                  />\n                );\n              }\n              case 'collapsed-frame-drops': {\n                return (\n                  <CollapsedItem shouldFlash={shouldFlash} item={historyItem} />\n                );\n              }\n            }\n          }),\n        )}\n      </div>\n    </div>\n  );\n};\n","import { useEffect, useRef, useState } from 'preact/hooks';\nimport {\n  DroppedFramesEvent,\n  getComponentName,\n  getEventSeverity,\n  InteractionEvent,\n} from './data';\nimport { SlowdownHistoryItem } from './slowdown-history';\nimport { ChevronRight } from './icons';\nimport { cn } from '~web/utils/helpers';\n\nexport type CollapsedDroppedFrame = {\n  kind: 'collapsed-frame-drops';\n  events: Array<DroppedFramesEvent>;\n  timestamp: number;\n};\n\ntype CollapsedKeyboardInput = {\n  kind: 'collapsed-keyboard';\n  events: Array<InteractionEvent>;\n  timestamp: number;\n};\nconst useNestedFlash = ({\n  flashingItemsCount,\n  totalEvents,\n}: {\n  totalEvents: number; // this breaks if you have constant 1 item flashing, but the actual item is different over time (it's fine for now)\n  flashingItemsCount: number;\n}) => {\n  const [newFlash, setNewFlash] = useState(false);\n  const flashedFor = useRef(0);\n  const lastFlashTime = useRef<number>(0);\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    if (flashedFor.current >= totalEvents) {\n      return;\n    }\n\n    const now = Date.now();\n    const debounceTime = 250;\n    const timeSinceLastFlash = now - lastFlashTime.current;\n\n    if (timeSinceLastFlash >= debounceTime) {\n      setNewFlash(false);\n      const timeout = setTimeout(() => {\n        flashedFor.current = totalEvents;\n        lastFlashTime.current = Date.now();\n        setNewFlash(true);\n        // horrible, don't look at this, move along\n        setTimeout(() => {\n          setNewFlash(false);\n        }, 2000);\n      }, 50);\n      return () => clearTimeout(timeout);\n    } else {\n      const delayNeeded = debounceTime - timeSinceLastFlash;\n      const timeout = setTimeout(() => {\n        setNewFlash(false);\n        setTimeout(() => {\n          flashedFor.current = totalEvents;\n          lastFlashTime.current = Date.now();\n          setNewFlash(true);\n          // horrible, don't look at this, move along\n          setTimeout(() => {\n            setNewFlash(false);\n          }, 2000);\n        }, 50);\n      }, delayNeeded);\n      return () => clearTimeout(timeout);\n    }\n  }, [flashingItemsCount]);\n\n  return newFlash;\n};\n\nexport const CollapsedItem = ({\n  item,\n  shouldFlash,\n}: {\n  item: CollapsedDroppedFrame | CollapsedKeyboardInput;\n  shouldFlash: (id: string) => boolean;\n}) => {\n  const [expanded, setExpanded] = useState(false);\n\n  const severity = item.events.map(getEventSeverity).reduce((prev, curr) => {\n    switch (curr) {\n      case 'high': {\n        return 'high';\n      }\n      case 'needs-improvement': {\n        return prev === 'high' ? 'high' : 'needs-improvement';\n      }\n      case 'low': {\n        return prev;\n      }\n    }\n  }, 'low');\n  const flashingItemsCount = item.events.reduce(\n    (prev, curr) => (shouldFlash(curr.id) ? prev + 1 : prev),\n    0,\n  );\n\n  const shouldFlashAgain = useNestedFlash({\n    flashingItemsCount,\n    totalEvents: item.events.length,\n  });\n\n  return (\n    <div className={cn(['flex flex-col gap-y-0.5'])}>\n      <button\n        onClick={() => setExpanded((expanded) => !expanded)}\n        className={cn([\n          'pl-2 py-1.5  text-sm flex items-center rounded-sm hover:bg-[#18181B] relative overflow-hidden',\n          shouldFlashAgain &&\n            !expanded &&\n            'after:absolute after:inset-0 after:bg-purple-500/30 after:animate-[fadeOut_1s_ease-out_forwards]',\n        ])}\n      >\n        <div\n          className={cn([\n            'w-4/5 flex items-center justify-start h-full text-xs truncate gap-x-1.5',\n          ])}\n        >\n          <span className={cn(['min-w-fit'])}>\n            <ChevronRight\n              key={`chevron-${item.timestamp}`}\n              className={cn([\n                'text-[#A1A1AA] transition-transform',\n                expanded ? 'rotate-90' : '',\n              ])}\n              size={14}\n            />\n          </span>\n\n          <span className={cn(['text-xs'])}>\n            {item.kind === 'collapsed-frame-drops'\n              ? 'FPS Drops'\n              : getComponentName(item.events.at(0)?.componentPath ?? [])}\n          </span>\n        </div>\n        <div\n          className={cn(['ml-auto min-w-fit flex justify-end items-center'])}\n        >\n          <div\n            style={{\n              lineHeight: '10px',\n            }}\n            className={cn([\n              'w-fit flex items-center text-[10px] justify-center h-full text-white px-1 py-1 rounded-sm font-semibold',\n              severity === 'low' && 'bg-green-500/60',\n              severity === 'needs-improvement' && 'bg-[#b77116] text-[10px]',\n              severity === 'high' && 'bg-[#b94040]',\n            ])}\n          >\n            x{item.events.length}\n          </div>\n        </div>\n      </button>\n      {expanded && (\n        <IndentedContent>\n          {item.events\n            .toSorted((a, b) => b.timestamp - a.timestamp)\n            .map((event) => (\n              <SlowdownHistoryItem\n                event={event}\n                shouldFlash={shouldFlash(event.id)}\n              />\n            ))}\n        </IndentedContent>\n      )}\n    </div>\n  );\n};\n\nconst IndentedContent = ({\n  children,\n}: { children: JSX.Element | JSX.Element[] }) => (\n  <div className=\"relative pl-6 flex flex-col gap-y-1\">\n    <div className=\"absolute left-3 top-0 bottom-0 w-px bg-[#27272A]\" />\n    {children}\n  </div>\n);\n","import { type Fiber, getDisplayName } from 'bippy';\nimport { useEffect, useRef } from 'preact/hooks';\nimport { ReactScanInternals, Store } from '~core/index';\n\nimport { signalIsSettingsOpen, signalWidgetViews } from '~web/state';\nimport { IS_CLIENT } from '~web/utils/constants';\nimport { cn, throttle } from '~web/utils/helpers';\nconst lerp = (start: number, end: number, t: number) => start + (end - start) * t;\nimport {\n  type States,\n  findComponentDOMNode,\n  getAssociatedFiberRect,\n  getCompositeComponentFromElement,\n  nonVisualTags,\n} from '../utils';\n\ntype DrawKind = 'locked' | 'inspecting';\n\ninterface Rect {\n  left: number;\n  top: number;\n  width: number;\n  height: number;\n}\n\ninterface LockIconRect {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\nconst ANIMATION_CONFIG = {\n  frameInterval: 1000 / 60,\n  speeds: {\n    fast: 0.51,\n    slow: 0.1,\n    off: 0,\n  },\n} as const;\n\nexport const OVERLAY_DPR = IS_CLIENT\n  ? /* @__PURE__ */ window.devicePixelRatio || 1\n  : 1;\n\nexport const currentLockIconRect: LockIconRect | null = null;\n\nexport const ScanOverlay = () => {\n  const refCanvas = useRef<HTMLCanvasElement>(null);\n  const refEventCatcher = useRef<HTMLDivElement>(null);\n  const refCurrentRect = useRef<Rect | null>(null);\n  const refCurrentLockIconRect = useRef<LockIconRect | null>(null);\n  const refLastHoveredElement = useRef<Element | null>(null);\n  const refRafId = useRef<number>(0);\n  const refTimeout = useRef<TTimer>();\n  const refCleanupMap = useRef(\n    new Map<States['kind'] | 'fade-out', () => void>(),\n  );\n  const refIsFadingOut = useRef(false);\n  const refLastFrameTime = useRef<number>(0);\n\n  const drawLockIcon = (\n    ctx: CanvasRenderingContext2D,\n    x: number,\n    y: number,\n    size: number,\n  ) => {\n    ctx.save();\n    ctx.strokeStyle = 'white';\n    ctx.fillStyle = 'white';\n    ctx.lineWidth = 1.5;\n\n    const shackleWidth = size * 0.6;\n    const shackleHeight = size * 0.5;\n    const shackleX = x + (size - shackleWidth) / 2;\n    const shackleY = y;\n\n    ctx.beginPath();\n    ctx.arc(\n      shackleX + shackleWidth / 2,\n      shackleY + shackleHeight / 2,\n      shackleWidth / 2,\n      Math.PI,\n      0,\n      false,\n    );\n    ctx.stroke();\n\n    const bodyWidth = size * 0.8;\n    const bodyHeight = size * 0.5;\n    const bodyX = x + (size - bodyWidth) / 2;\n    const bodyY = y + shackleHeight / 2;\n\n    ctx.fillRect(bodyX, bodyY, bodyWidth, bodyHeight);\n    ctx.restore();\n  };\n\n  const drawStatsPill = (\n    ctx: CanvasRenderingContext2D,\n    rect: Rect,\n    kind: 'locked' | 'inspecting',\n    fiber: Fiber | null,\n  ) => {\n    if (!fiber) return;\n\n    const pillHeight = 24;\n    const pillPadding = 8;\n    const componentName =\n      (fiber?.type && getDisplayName(fiber.type)) ?? 'Unknown';\n    const text = componentName;\n\n    ctx.save();\n    ctx.font = '12px system-ui, -apple-system, sans-serif';\n    const textMetrics = ctx.measureText(text);\n    const textWidth = textMetrics.width;\n    const lockIconSize = kind === 'locked' ? 14 : 0;\n    const lockIconPadding = kind === 'locked' ? 6 : 0;\n    const pillWidth =\n      textWidth + pillPadding * 2 + lockIconSize + lockIconPadding;\n\n    const pillX = rect.left;\n    const pillY = rect.top - pillHeight - 4;\n\n    ctx.fillStyle = 'rgb(37, 37, 38, .75)';\n    ctx.beginPath();\n    ctx.roundRect(pillX, pillY, pillWidth, pillHeight, 3);\n    ctx.fill();\n\n    if (kind === 'locked') {\n      const lockX = pillX + pillPadding;\n      const lockY = pillY + (pillHeight - lockIconSize) / 2 + 2;\n      drawLockIcon(ctx, lockX, lockY, lockIconSize);\n      refCurrentLockIconRect.current = {\n        x: lockX,\n        y: lockY,\n        width: lockIconSize,\n        height: lockIconSize,\n      };\n    } else {\n      refCurrentLockIconRect.current = null;\n    }\n\n    ctx.fillStyle = 'white';\n    ctx.textBaseline = 'middle';\n    const textX =\n      pillX +\n      pillPadding +\n      (kind === 'locked' ? lockIconSize + lockIconPadding : 0);\n    ctx.fillText(text, textX, pillY + pillHeight / 2);\n    ctx.restore();\n  };\n\n  const drawRect = (\n    canvas: HTMLCanvasElement,\n    ctx: CanvasRenderingContext2D,\n    kind: DrawKind,\n    fiber: Fiber | null,\n  ) => {\n    if (!refCurrentRect.current) return;\n    const rect = refCurrentRect.current;\n    ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n    ctx.strokeStyle = 'rgba(142, 97, 227, 0.5)';\n    ctx.fillStyle = 'rgba(173, 97, 230, 0.10)';\n\n    if (kind === 'locked') {\n      ctx.setLineDash([]);\n    } else {\n      ctx.setLineDash([4]);\n    }\n\n    ctx.lineWidth = 1;\n    ctx.fillRect(rect.left, rect.top, rect.width, rect.height);\n    ctx.strokeRect(rect.left, rect.top, rect.width, rect.height);\n\n    drawStatsPill(ctx, rect, kind, fiber);\n  };\n\n  const animate = (\n    canvas: HTMLCanvasElement,\n    ctx: CanvasRenderingContext2D,\n    targetRect: Rect,\n    kind: DrawKind,\n    parentCompositeFiber: Fiber,\n    onComplete?: () => void,\n  ) => {\n    const speed = ReactScanInternals.options.value\n      .animationSpeed as keyof typeof ANIMATION_CONFIG.speeds;\n    const t = ANIMATION_CONFIG.speeds[speed] ?? ANIMATION_CONFIG.speeds.off;\n\n    const animationFrame = (timestamp: number) => {\n      if (\n        timestamp - refLastFrameTime.current <\n        ANIMATION_CONFIG.frameInterval\n      ) {\n        refRafId.current = requestAnimationFrame(animationFrame);\n        return;\n      }\n      refLastFrameTime.current = timestamp;\n\n      if (!refCurrentRect.current) {\n        cancelAnimationFrame(refRafId.current);\n        return;\n      }\n\n      refCurrentRect.current = {\n        left: lerp(refCurrentRect.current.left, targetRect.left, t),\n        top: lerp(refCurrentRect.current.top, targetRect.top, t),\n        width: lerp(refCurrentRect.current.width, targetRect.width, t),\n        height: lerp(refCurrentRect.current.height, targetRect.height, t),\n      };\n\n      drawRect(canvas, ctx, kind, parentCompositeFiber);\n\n      const stillMoving =\n        Math.abs(refCurrentRect.current.left - targetRect.left) > 0.1 ||\n        Math.abs(refCurrentRect.current.top - targetRect.top) > 0.1 ||\n        Math.abs(refCurrentRect.current.width - targetRect.width) > 0.1 ||\n        Math.abs(refCurrentRect.current.height - targetRect.height) > 0.1;\n\n      if (stillMoving) {\n        refRafId.current = requestAnimationFrame(animationFrame);\n      } else {\n        refCurrentRect.current = targetRect;\n        drawRect(canvas, ctx, kind, parentCompositeFiber);\n        cancelAnimationFrame(refRafId.current);\n        ctx.restore();\n        onComplete?.();\n      }\n    };\n\n    cancelAnimationFrame(refRafId.current);\n    clearTimeout(refTimeout.current);\n\n    refRafId.current = requestAnimationFrame(animationFrame);\n\n    refTimeout.current = setTimeout(() => {\n      cancelAnimationFrame(refRafId.current);\n      refCurrentRect.current = targetRect;\n      drawRect(canvas, ctx, kind, parentCompositeFiber);\n      ctx.restore();\n      onComplete?.();\n    }, 1000);\n  };\n\n  const setupOverlayAnimation = (\n    canvas: HTMLCanvasElement,\n    ctx: CanvasRenderingContext2D,\n    targetRect: Rect,\n    kind: DrawKind,\n    parentCompositeFiber: Fiber,\n  ) => {\n    ctx.save();\n\n    if (!refCurrentRect.current) {\n      refCurrentRect.current = targetRect;\n      drawRect(canvas, ctx, kind, parentCompositeFiber);\n      ctx.restore();\n      return;\n    }\n\n    animate(canvas, ctx, targetRect, kind, parentCompositeFiber);\n  };\n\n  const drawHoverOverlay = async (\n    overlayElement: Element | null,\n    canvas: HTMLCanvasElement | null,\n    ctx: CanvasRenderingContext2D | null,\n    kind: DrawKind,\n  ) => {\n    if (!overlayElement || !canvas || !ctx) return;\n\n    const { parentCompositeFiber } =\n      getCompositeComponentFromElement(overlayElement);\n    const targetRect = await getAssociatedFiberRect(overlayElement);\n\n    if (!parentCompositeFiber || !targetRect) return;\n\n    setupOverlayAnimation(canvas, ctx, targetRect, kind, parentCompositeFiber);\n  };\n\n  const unsubscribeAll = () => {\n    for (const cleanup of refCleanupMap.current.values()) {\n      cleanup?.();\n    }\n  };\n\n  const cleanupCanvas = (canvas: HTMLCanvasElement) => {\n    const ctx = canvas.getContext('2d');\n    if (ctx) {\n      ctx.clearRect(0, 0, canvas.width, canvas.height);\n    }\n    refCurrentRect.current = null;\n    refCurrentLockIconRect.current = null;\n    refLastHoveredElement.current = null;\n    canvas.classList.remove('fade-in');\n    refIsFadingOut.current = false;\n  };\n\n  const startFadeOut = (onComplete?: () => void) => {\n    if (!refCanvas.current || refIsFadingOut.current) return;\n\n    const handleTransitionEnd = (e: TransitionEvent) => {\n      if (\n        !refCanvas.current ||\n        e.propertyName !== 'opacity' ||\n        !refIsFadingOut.current\n      ) {\n        return;\n      }\n      refCanvas.current.removeEventListener(\n        'transitionend',\n        handleTransitionEnd,\n      );\n      cleanupCanvas(refCanvas.current);\n      onComplete?.();\n    };\n    const existingListener = refCleanupMap.current.get('fade-out');\n    if (existingListener) {\n      existingListener();\n      refCleanupMap.current.delete('fade-out');\n    }\n\n    refCanvas.current.addEventListener('transitionend', handleTransitionEnd);\n    refCleanupMap.current.set('fade-out', () => {\n      refCanvas.current?.removeEventListener(\n        'transitionend',\n        handleTransitionEnd,\n      );\n    });\n\n    refIsFadingOut.current = true;\n    refCanvas.current.classList.remove('fade-in');\n    requestAnimationFrame(() => {\n      refCanvas.current?.classList.add('fade-out');\n    });\n  };\n\n  const startFadeIn = () => {\n    if (!refCanvas.current) return;\n    refIsFadingOut.current = false;\n    refCanvas.current.classList.remove('fade-out');\n    requestAnimationFrame(() => {\n      refCanvas.current?.classList.add('fade-in');\n    });\n  };\n\n  const handleHoverableElement = (componentElement: Element) => {\n    if (componentElement === refLastHoveredElement.current) return;\n\n    refLastHoveredElement.current = componentElement;\n\n    if (nonVisualTags.has(componentElement.tagName)) {\n      startFadeOut();\n    } else {\n      startFadeIn();\n    }\n\n    Store.inspectState.value = {\n      kind: 'inspecting',\n      hoveredDomElement: componentElement,\n    };\n  };\n\n  const handleNonHoverableArea = () => {\n    if (\n      !refCurrentRect.current ||\n      !refCanvas.current ||\n      refIsFadingOut.current\n    ) {\n      return;\n    }\n\n    startFadeOut();\n  };\n\n  const handlePointerMove = throttle((e?: PointerEvent) => {\n    const state = Store.inspectState.peek();\n    if (state.kind !== 'inspecting' || !refEventCatcher.current) return;\n\n    refEventCatcher.current.style.pointerEvents = 'none';\n    const element = document.elementFromPoint(e?.clientX ?? 0, e?.clientY ?? 0);\n\n    refEventCatcher.current.style.removeProperty('pointer-events');\n\n    clearTimeout(refTimeout.current);\n\n    if (element && element !== refCanvas.current) {\n      const { parentCompositeFiber } = getCompositeComponentFromElement(\n        element as Element,\n      );\n      if (parentCompositeFiber) {\n        const componentElement = findComponentDOMNode(parentCompositeFiber);\n        if (componentElement) {\n          handleHoverableElement(componentElement);\n          return;\n        }\n      }\n    }\n\n    handleNonHoverableArea();\n  }, 32);\n\n  const isClickInLockIcon = (e: MouseEvent, canvas: HTMLCanvasElement) => {\n    const currentRect = refCurrentLockIconRect.current;\n    if (!currentRect) return false;\n\n    const rect = canvas.getBoundingClientRect();\n    const scaleX = canvas.width / rect.width;\n    const scaleY = canvas.height / rect.height;\n    const x = (e.clientX - rect.left) * scaleX;\n    const y = (e.clientY - rect.top) * scaleY;\n    const adjustedX = x / OVERLAY_DPR;\n    const adjustedY = y / OVERLAY_DPR;\n\n    return (\n      adjustedX >= currentRect.x &&\n      adjustedX <= currentRect.x + currentRect.width &&\n      adjustedY >= currentRect.y &&\n      adjustedY <= currentRect.y + currentRect.height\n    );\n  };\n\n  const handleLockIconClick = (state: States) => {\n    if (state.kind === 'focused') {\n      Store.inspectState.value = {\n        kind: 'inspecting',\n        hoveredDomElement: state.focusedDomElement,\n      };\n    }\n  };\n\n  const handleElementClick = (e: MouseEvent) => {\n    const clickableElements = [\n      'react-scan-inspect-element',\n      'react-scan-power',\n    ];\n    // avoid capturing the synthetic event sent back to the toolbar, we don't want to block click events on it ever\n    if (\n      e.target instanceof HTMLElement &&\n      clickableElements.includes(e.target.id)\n    ) {\n      return;\n    }\n\n    const tagName = refLastHoveredElement.current?.tagName;\n    if (tagName && nonVisualTags.has(tagName)) {\n      return;\n    }\n\n    e.preventDefault();\n    e.stopPropagation();\n\n    const element =\n      refLastHoveredElement.current ??\n      document.elementFromPoint(e.clientX, e.clientY);\n    if (!element) return;\n\n    const clickedEl = e.composedPath().at(0);\n\n    if (\n      clickedEl instanceof HTMLElement &&\n      clickableElements.includes(clickedEl.id)\n    ) {\n      const syntheticEvent = new MouseEvent(e.type, e);\n      // @ts-ignore - this allows to know to not re-process this event when this event handler captures it\n      syntheticEvent.__reactScanSyntheticEvent = true;\n      clickedEl.dispatchEvent(syntheticEvent);\n      return;\n    }\n    const { parentCompositeFiber } = getCompositeComponentFromElement(\n      element as Element,\n    );\n    if (!parentCompositeFiber) return;\n\n    const componentElement = findComponentDOMNode(parentCompositeFiber);\n\n    if (!componentElement) {\n      refLastHoveredElement.current = null;\n      Store.inspectState.value = {\n        kind: 'inspect-off',\n      };\n      return;\n    }\n\n    Store.inspectState.value = {\n      kind: 'focused',\n      focusedDomElement: componentElement,\n      fiber: parentCompositeFiber,\n    };\n  };\n\n  const handleClick = (e: MouseEvent) => {\n    // @ts-ignore - metadata added to toolbar button events we create and dispatch\n    if (e.__reactScanSyntheticEvent) {\n      return;\n    }\n\n    const state = Store.inspectState.peek();\n    const canvas = refCanvas.current;\n    if (!canvas || !refEventCatcher.current) return;\n\n    if (isClickInLockIcon(e, canvas)) {\n      e.preventDefault();\n      e.stopPropagation();\n      handleLockIconClick(state);\n      return;\n    }\n\n    if (state.kind === 'inspecting') {\n      handleElementClick(e);\n    }\n  };\n\n  const handleKeyDown = (e: KeyboardEvent) => {\n    if (e.key !== 'Escape') return;\n\n    const state = Store.inspectState.peek();\n    const canvas = refCanvas.current;\n    if (!canvas) return;\n\n    if (document.activeElement?.id === 'react-scan-root') {\n      return;\n    }\n\n    signalWidgetViews.value = {\n      view: 'none',\n    };\n\n    if (state.kind === 'focused' || state.kind === 'inspecting') {\n      e.preventDefault();\n      e.stopPropagation();\n\n      switch (state.kind) {\n        case 'focused': {\n          startFadeIn();\n          refCurrentRect.current = null;\n          refLastHoveredElement.current = state.focusedDomElement;\n          Store.inspectState.value = {\n            kind: 'inspecting',\n            hoveredDomElement: state.focusedDomElement,\n          };\n          break;\n        }\n        case 'inspecting': {\n          startFadeOut(() => {\n            signalIsSettingsOpen.value = false;\n            Store.inspectState.value = {\n              kind: 'inspect-off',\n            };\n          });\n          break;\n        }\n      }\n    }\n  };\n\n  const handleStateChange = (\n    state: States,\n    canvas: HTMLCanvasElement,\n    ctx: CanvasRenderingContext2D,\n  ) => {\n    refCleanupMap.current.get(state.kind)?.();\n\n    if (refEventCatcher.current) {\n      if (state.kind !== 'inspecting') {\n        refEventCatcher.current.style.pointerEvents = 'none';\n      }\n    }\n\n    if (refRafId.current) {\n      cancelAnimationFrame(refRafId.current);\n    }\n\n    let unsubReport: (() => void) | undefined;\n\n    switch (state.kind) {\n      case 'inspect-off':\n        startFadeOut();\n        return;\n\n      case 'inspecting':\n        drawHoverOverlay(state.hoveredDomElement, canvas, ctx, 'inspecting');\n        break;\n\n      case 'focused':\n        if (!state.focusedDomElement) return;\n\n        if (refLastHoveredElement.current !== state.focusedDomElement) {\n          refLastHoveredElement.current = state.focusedDomElement;\n        }\n\n        signalWidgetViews.value = {\n          view: 'inspector',\n        };\n\n        drawHoverOverlay(state.focusedDomElement, canvas, ctx, 'locked');\n\n        unsubReport = Store.lastReportTime.subscribe(() => {\n          if (refRafId.current && refCurrentRect.current) {\n            const { parentCompositeFiber } = getCompositeComponentFromElement(\n              state.focusedDomElement,\n            );\n            if (parentCompositeFiber) {\n              drawHoverOverlay(state.focusedDomElement, canvas, ctx, 'locked');\n            }\n          }\n        });\n\n        if (unsubReport) {\n          refCleanupMap.current.set(state.kind, unsubReport);\n        }\n        break;\n    }\n  };\n\n  const updateCanvasSize = (\n    canvas: HTMLCanvasElement,\n    ctx: CanvasRenderingContext2D,\n  ) => {\n    const rect = canvas.getBoundingClientRect();\n    canvas.width = rect.width * OVERLAY_DPR;\n    canvas.height = rect.height * OVERLAY_DPR;\n    ctx.scale(OVERLAY_DPR, OVERLAY_DPR);\n    ctx.save();\n  };\n\n  const handleResizeOrScroll = () => {\n    const state = Store.inspectState.peek();\n    const canvas = refCanvas.current;\n    if (!canvas) return;\n    const ctx = canvas?.getContext('2d');\n    if (!ctx) return;\n\n    cancelAnimationFrame(refRafId.current);\n    clearTimeout(refTimeout.current);\n\n    updateCanvasSize(canvas, ctx);\n    refCurrentRect.current = null;\n\n    if (state.kind === 'focused' && state.focusedDomElement) {\n      drawHoverOverlay(state.focusedDomElement, canvas, ctx, 'locked');\n    } else if (state.kind === 'inspecting' && state.hoveredDomElement) {\n      drawHoverOverlay(state.hoveredDomElement, canvas, ctx, 'inspecting');\n    }\n  };\n\n  const handlePointerDown = (e: PointerEvent) => {\n    const state = Store.inspectState.peek();\n    const canvas = refCanvas.current;\n    if (!canvas) return;\n\n    if (\n      state.kind === 'inspecting' ||\n      isClickInLockIcon(e as unknown as MouseEvent, canvas)\n    ) {\n      e.preventDefault();\n      e.stopPropagation();\n      e.stopImmediatePropagation();\n    }\n  };\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    const canvas = refCanvas.current;\n    if (!canvas) return;\n    const ctx = canvas?.getContext('2d');\n    if (!ctx) return;\n\n    updateCanvasSize(canvas, ctx);\n\n    const unSubState = Store.inspectState.subscribe((state) => {\n      handleStateChange(state, canvas, ctx);\n    });\n\n    window.addEventListener('scroll', handleResizeOrScroll, { passive: true });\n    window.addEventListener('resize', handleResizeOrScroll, { passive: true });\n    document.addEventListener('pointermove', handlePointerMove, {\n      passive: true,\n      capture: true,\n    });\n    document.addEventListener('pointerdown', handlePointerDown, {\n      capture: true,\n    });\n    document.addEventListener('click', handleClick, { capture: true });\n    document.addEventListener('keydown', handleKeyDown, { capture: true });\n\n    return () => {\n      unsubscribeAll();\n      unSubState();\n      window.removeEventListener('scroll', handleResizeOrScroll);\n      window.removeEventListener('resize', handleResizeOrScroll);\n      document.removeEventListener('pointermove', handlePointerMove, {\n        capture: true,\n      });\n      document.removeEventListener('click', handleClick, { capture: true });\n      document.removeEventListener('pointerdown', handlePointerDown, {\n        capture: true,\n      });\n      document.removeEventListener('keydown', handleKeyDown, { capture: true });\n\n      if (refRafId.current) {\n        cancelAnimationFrame(refRafId.current);\n      }\n      clearTimeout(refTimeout.current);\n    };\n  }, []);\n\n  return (\n    <>\n      <div\n        ref={refEventCatcher}\n        className={cn('fixed top-0 left-0 w-screen h-screen', 'z-[214748365]')}\n        // DO NOT DO NOT DO NOT REMOVE THE STYLE IT WILL CAUSE MASSIVE PERFORMANCE ISSUES https://x.com/RobKnight__/status/1897524145157439558\n        style={{\n          pointerEvents: 'none',\n        }}\n      />\n      <canvas\n        ref={refCanvas}\n        dir=\"ltr\"\n        className={cn(\n          'react-scan-inspector-overlay',\n          'fixed top-0 left-0 w-screen h-screen',\n          'pointer-events-none',\n          'z-[214748367]',\n        )}\n      />\n    </>\n  );\n};\n","import { MIN_SIZE, SAFE_AREA } from '../constants';\nimport type { Corner, Position, ResizeHandleProps, Size } from './types';\n\nclass WindowDimensions {\n  maxWidth: number;\n  maxHeight: number;\n\n  constructor(\n    public width: number,\n    public height: number,\n  ) {\n    this.maxWidth = width - SAFE_AREA * 2;\n    this.maxHeight = height - SAFE_AREA * 2;\n  }\n\n  rightEdge(width: number): number {\n    return this.width - width - SAFE_AREA;\n  }\n\n  bottomEdge(height: number): number {\n    return this.height - height - SAFE_AREA;\n  }\n\n  isFullWidth(width: number): boolean {\n    return width >= this.maxWidth;\n  }\n\n  isFullHeight(height: number): boolean {\n    return height >= this.maxHeight;\n  }\n}\n\nlet cachedWindowDimensions: WindowDimensions | undefined;\n\nexport const getWindowDimensions = () => {\n  const currentWidth = window.innerWidth;\n  const currentHeight = window.innerHeight;\n\n  if (\n    cachedWindowDimensions &&\n    cachedWindowDimensions.width === currentWidth &&\n    cachedWindowDimensions.height === currentHeight\n  ) {\n    return cachedWindowDimensions;\n  }\n\n  cachedWindowDimensions = new WindowDimensions(currentWidth, currentHeight);\n\n  return cachedWindowDimensions;\n};\n\nexport const getOppositeCorner = (\n  position: ResizeHandleProps['position'],\n  currentCorner: Corner,\n  isFullScreen: boolean,\n  isFullWidth?: boolean,\n  isFullHeight?: boolean,\n): Corner => {\n  // For full screen mode\n  if (isFullScreen) {\n    if (position === 'top-left') return 'bottom-right';\n    if (position === 'top-right') return 'bottom-left';\n    if (position === 'bottom-left') return 'top-right';\n    if (position === 'bottom-right') return 'top-left';\n\n    const [vertical, horizontal] = currentCorner.split('-');\n    if (position === 'left') return `${vertical}-right` as Corner;\n    if (position === 'right') return `${vertical}-left` as Corner;\n    if (position === 'top') return `bottom-${horizontal}` as Corner;\n    if (position === 'bottom') return `top-${horizontal}` as Corner;\n  }\n\n  // For full width mode\n  if (isFullWidth) {\n    if (position === 'left')\n      return `${currentCorner.split('-')[0]}-right` as Corner;\n    if (position === 'right')\n      return `${currentCorner.split('-')[0]}-left` as Corner;\n  }\n\n  // For full height mode\n  if (isFullHeight) {\n    if (position === 'top')\n      return `bottom-${currentCorner.split('-')[1]}` as Corner;\n    if (position === 'bottom')\n      return `top-${currentCorner.split('-')[1]}` as Corner;\n  }\n\n  return currentCorner;\n};\n\nexport const calculatePosition = (\n  corner: Corner,\n  width: number,\n  height: number,\n): Position => {\n  const isRTL = getComputedStyle(document.body).direction === 'rtl';\n\n  const windowWidth = window.innerWidth;\n  const windowHeight = window.innerHeight;\n\n  // Check if widget is minimized\n  const isMinimized = width === MIN_SIZE.width;\n\n  // Only bound dimensions if minimized\n  const effectiveWidth = isMinimized\n    ? width\n    : Math.min(width, windowWidth - SAFE_AREA * 2);\n  const effectiveHeight = isMinimized\n    ? height\n    : Math.min(height, windowHeight - SAFE_AREA * 2);\n\n  // Calculate base positions\n  let x: number;\n  let y: number;\n\n  let leftBound = SAFE_AREA;\n  let rightBound =  windowWidth - effectiveWidth - SAFE_AREA;\n  let topBound = SAFE_AREA;\n  let bottomBound = windowHeight - effectiveHeight - SAFE_AREA;\n\n  switch (corner) {\n    case 'top-right':\n      x = isRTL ? -leftBound : rightBound;\n      y = topBound;\n      break;\n    case 'bottom-right':\n      x = isRTL ? -leftBound : rightBound;\n      y = bottomBound;\n      break;\n    case 'bottom-left':\n      x = isRTL ? -rightBound : leftBound;\n      y = bottomBound;\n      break;\n    case 'top-left':\n      x = isRTL ? -rightBound : leftBound;\n      y = topBound;\n      break;\n    default:\n      x = leftBound;\n      y = topBound;\n      break;\n  }\n\n  // Only ensure positions are within bounds if minimized\n  if (isMinimized) {\n    if (isRTL) {\n      // For RTL\n      x = Math.min(\n        -leftBound,\n        Math.max(x, -rightBound)\n      );\n    } else {\n      // For LTR\n      x = Math.max(\n        leftBound,\n        Math.min(x, rightBound),\n      );\n    }\n    y = Math.max(\n      topBound,\n      Math.min(y, bottomBound),\n    );\n  }\n\n  return { x, y };\n};\n\nconst positionMatchesCorner = (\n  position: ResizeHandleProps['position'],\n  corner: Corner,\n): boolean => {\n  const [vertical, horizontal] = corner.split('-');\n  return position !== vertical && position !== horizontal;\n};\n\nexport const getHandleVisibility = (\n  position: ResizeHandleProps['position'],\n  corner: Corner,\n  isFullWidth: boolean,\n  isFullHeight: boolean,\n): boolean => {\n  if (isFullWidth && isFullHeight) {\n    return true;\n  }\n\n  // Normal state\n  if (!isFullWidth && !isFullHeight) {\n    return positionMatchesCorner(position, corner);\n  }\n\n  // Full width state\n  if (isFullWidth) {\n    return position !== corner.split('-')[0];\n  }\n\n  // Full height state\n  if (isFullHeight) {\n    return position !== corner.split('-')[1];\n  }\n\n  return false;\n};\n\nexport const calculateBoundedSize = (\n  currentSize: number,\n  delta: number,\n  isWidth: boolean,\n): number => {\n  const min = isWidth ? MIN_SIZE.width : MIN_SIZE.initialHeight;\n  const max = isWidth\n    ? getWindowDimensions().maxWidth\n    : getWindowDimensions().maxHeight;\n\n  const newSize = currentSize + delta;\n  return Math.min(Math.max(min, newSize), max);\n};\n\nexport const calculateNewSizeAndPosition = (\n  position: ResizeHandleProps['position'],\n  initialSize: Size,\n  initialPosition: Position,\n  deltaX: number,\n  deltaY: number,\n): { newSize: Size; newPosition: Position } => {\n  const isRTL = getComputedStyle(document.body).direction === 'rtl';\n\n  const maxWidth = window.innerWidth - SAFE_AREA * 2;\n  const maxHeight = window.innerHeight - SAFE_AREA * 2;\n\n  let newWidth = initialSize.width;\n  let newHeight = initialSize.height;\n  let newX = initialPosition.x;\n  let newY = initialPosition.y;\n\n  // horizontal resize for RTL\n  if (isRTL && position.includes('right')) {\n    // Check if we have enough space on the right\n    const availableWidth = -initialPosition.x + initialSize.width - SAFE_AREA;\n    const proposedWidth = Math.min(initialSize.width + deltaX, availableWidth);\n    newWidth = Math.min(maxWidth, Math.max(MIN_SIZE.width, proposedWidth));\n    newX = initialPosition.x + (newWidth - initialSize.width);\n  }\n  if (isRTL && position.includes('left')) {\n    // Check if we have enough space on the left\n    const availableWidth = window.innerWidth - initialPosition.x - SAFE_AREA;\n    const proposedWidth = Math.min(initialSize.width - deltaX, availableWidth);\n    newWidth = Math.min(maxWidth, Math.max(MIN_SIZE.width, proposedWidth));\n  }\n  // horizontal resize for LTR\n  if (!isRTL && position.includes('right')) {\n    // Check if we have enough space on the right\n    const availableWidth = window.innerWidth - initialPosition.x - SAFE_AREA;\n    const proposedWidth = Math.min(initialSize.width + deltaX, availableWidth);\n    newWidth = Math.min(maxWidth, Math.max(MIN_SIZE.width, proposedWidth));\n  }\n  if (!isRTL && position.includes('left')) {\n    // Check if we have enough space on the left\n    const availableWidth = initialPosition.x + initialSize.width - SAFE_AREA;\n    const proposedWidth = Math.min(initialSize.width - deltaX, availableWidth);\n    newWidth = Math.min(maxWidth, Math.max(MIN_SIZE.width, proposedWidth));\n    newX = initialPosition.x - (newWidth - initialSize.width);\n  }\n\n  // vertical resize\n  if (position.includes('bottom')) {\n    // Check if we have enough space at the bottom\n    const availableHeight = window.innerHeight - initialPosition.y - SAFE_AREA;\n    const proposedHeight = Math.min(\n      initialSize.height + deltaY,\n      availableHeight,\n    );\n    newHeight = Math.min(\n      maxHeight,\n      Math.max(MIN_SIZE.initialHeight, proposedHeight),\n    );\n  }\n  if (position.includes('top')) {\n    // Check if we have enough space at the top\n    const availableHeight = initialPosition.y + initialSize.height - SAFE_AREA;\n    const proposedHeight = Math.min(\n      initialSize.height - deltaY,\n      availableHeight,\n    );\n    newHeight = Math.min(\n      maxHeight,\n      Math.max(MIN_SIZE.initialHeight, proposedHeight),\n    );\n    newY = initialPosition.y - (newHeight - initialSize.height);\n  }\n\n  let leftBound = SAFE_AREA;\n  let rightBound = window.innerWidth - SAFE_AREA - newWidth;\n  let topBound = SAFE_AREA;\n  let bottomBound = window.innerHeight - SAFE_AREA - newHeight;\n\n  // Ensure position stays within bounds\n  if (isRTL) {\n    // for RTL\n    newX = Math.min(\n      -leftBound,\n      Math.max(newX, -rightBound)\n    );\n  } else {\n    // for LTR\n    newX = Math.max(\n      leftBound,\n      Math.min(newX, rightBound),\n    );\n  }\n\n  newY = Math.max(\n    topBound,\n    Math.min(newY, bottomBound),\n  );\n\n  return {\n    newSize: { width: newWidth, height: newHeight },\n    newPosition: { x: newX, y: newY },\n  };\n};\n\nexport const getClosestCorner = (position: Position): Corner => {\n  const windowDims = getWindowDimensions();\n\n  const distances: Record<Corner, number> = {\n    'top-left': Math.hypot(position.x, position.y),\n    'top-right': Math.hypot(windowDims.maxWidth - position.x, position.y),\n    'bottom-left': Math.hypot(position.x, windowDims.maxHeight - position.y),\n    'bottom-right': Math.hypot(\n      windowDims.maxWidth - position.x,\n      windowDims.maxHeight - position.y,\n    ),\n  };\n\n  let closest: Corner = 'top-left';\n\n  for (const key in distances) {\n    if (distances[key as Corner] < distances[closest]) {\n      closest = key as Corner;\n    }\n  }\n\n  return closest;\n};\n\n// Helper to determine best corner based on cursor position, widget size, and movement\nexport const getBestCorner = (\n  mouseX: number,\n  mouseY: number,\n  initialMouseX?: number,\n  initialMouseY?: number,\n  threshold = 100,\n): Corner => {\n  const deltaX = initialMouseX !== undefined ? mouseX - initialMouseX : 0;\n  const deltaY = initialMouseY !== undefined ? mouseY - initialMouseY : 0;\n\n  const windowCenterX = window.innerWidth / 2;\n  const windowCenterY = window.innerHeight / 2;\n\n  // Determine movement direction\n  const movingRight = deltaX > threshold;\n  const movingLeft = deltaX < -threshold;\n  const movingDown = deltaY > threshold;\n  const movingUp = deltaY < -threshold;\n\n  // If horizontal movement\n  if (movingRight || movingLeft) {\n    const isBottom = mouseY > windowCenterY;\n    return movingRight\n      ? isBottom\n        ? 'bottom-right'\n        : 'top-right'\n      : isBottom\n        ? 'bottom-left'\n        : 'top-left';\n  }\n\n  // If vertical movement\n  if (movingDown || movingUp) {\n    const isRight = mouseX > windowCenterX;\n    return movingDown\n      ? isRight\n        ? 'bottom-right'\n        : 'bottom-left'\n      : isRight\n        ? 'top-right'\n        : 'top-left';\n  }\n\n  // If no significant movement, use quadrant-based position\n  return mouseX > windowCenterX\n    ? mouseY > windowCenterY\n      ? 'bottom-right'\n      : 'top-right'\n    : mouseY > windowCenterY\n      ? 'bottom-left'\n      : 'top-left';\n};\n","import type { JSX } from 'preact';\nimport { useCallback, useEffect, useRef } from 'preact/hooks';\nimport { Store } from '~core/index';\nimport { Icon } from '~web/components/icon';\nimport {\n  LOCALSTORAGE_KEY,\n  MIN_CONTAINER_WIDTH,\n  MIN_SIZE,\n} from '~web/constants';\nimport {\n  signalRefWidget,\n  signalWidget,\n  signalWidgetViews,\n} from '~web/state';\nimport { cn, saveLocalStorage } from '~web/utils/helpers';\nimport {\n  calculateNewSizeAndPosition,\n  calculatePosition,\n  getClosestCorner,\n  getHandleVisibility,\n  getOppositeCorner,\n  getWindowDimensions,\n} from './helpers';\nimport type { Corner, ResizeHandleProps } from './types';\n\nexport const ResizeHandle = ({ position }: ResizeHandleProps) => {\n  const refContainer = useRef<HTMLDivElement>(null);\n\n  const prevWidth = useRef<number | null>(null);\n  const prevHeight = useRef<number | null>(null);\n  const prevCorner = useRef<Corner | null>(null);\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  useEffect(() => {\n    const container = refContainer.current;\n    if (!container) return;\n\n    const updateVisibility = () => {\n      container.classList.remove('pointer-events-none');\n\n      const isFocused = Store.inspectState.value.kind === 'focused';\n      const shouldShow = signalWidgetViews.value.view !== 'none';\n      const isVisible =\n        (isFocused || shouldShow) &&\n        getHandleVisibility(\n          position,\n          signalWidget.value.corner,\n          signalWidget.value.dimensions.isFullWidth,\n          signalWidget.value.dimensions.isFullHeight,\n        );\n\n      if (isVisible) {\n        container.classList.remove(\n          'hidden',\n          'pointer-events-none',\n          'opacity-0',\n        );\n      } else {\n        container.classList.add('hidden', 'pointer-events-none', 'opacity-0');\n      }\n    };\n\n    const unsubscribeSignalWidget = signalWidget.subscribe((state) => {\n      if (\n        prevWidth.current !== null &&\n        prevHeight.current !== null &&\n        prevCorner.current !== null &&\n        state.dimensions.width === prevWidth.current &&\n        state.dimensions.height === prevHeight.current &&\n        state.corner === prevCorner.current\n      ) {\n        return;\n      }\n\n      updateVisibility();\n\n      prevWidth.current = state.dimensions.width;\n      prevHeight.current = state.dimensions.height;\n      prevCorner.current = state.corner;\n    });\n\n    const unsubscribeInspectState = Store.inspectState.subscribe(() => {\n      updateVisibility();\n    });\n\n    return () => {\n      unsubscribeSignalWidget();\n      unsubscribeInspectState();\n      prevWidth.current = null;\n      prevHeight.current = null;\n      prevCorner.current = null;\n    };\n  }, []);\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  const handleResize = useCallback(\n    (e: JSX.TargetedPointerEvent<HTMLDivElement>) => {\n      e.preventDefault();\n      e.stopPropagation();\n\n      const widget = signalRefWidget.value;\n      if (!widget) return;\n\n      const containerStyle = widget.style;\n      const { dimensions } = signalWidget.value;\n      const initialX = e.clientX;\n      const initialY = e.clientY;\n\n      const initialWidth = dimensions.width;\n      const initialHeight = dimensions.height;\n      const initialPosition = dimensions.position;\n\n      signalWidget.value = {\n        ...signalWidget.value,\n        dimensions: {\n          ...dimensions,\n          isFullWidth: false,\n          isFullHeight: false,\n          width: initialWidth,\n          height: initialHeight,\n          position: initialPosition,\n        },\n      };\n\n      let rafId: number | null = null;\n\n      const handlePointerMove = (e: PointerEvent) => {\n        if (rafId) return;\n\n        containerStyle.transition = 'none';\n\n        rafId = requestAnimationFrame(() => {\n          const { newSize, newPosition } = calculateNewSizeAndPosition(\n            position,\n            { width: initialWidth, height: initialHeight },\n            initialPosition,\n            e.clientX - initialX,\n            e.clientY - initialY,\n          );\n\n          containerStyle.transform = `translate3d(${newPosition.x}px, ${newPosition.y}px, 0)`;\n          containerStyle.width = `${newSize.width}px`;\n          containerStyle.height = `${newSize.height}px`;\n\n          // Adjust components tree width when widget is resized\n          const maxTreeWidth = Math.floor(newSize.width - (MIN_CONTAINER_WIDTH / 2));\n          const currentTreeWidth = signalWidget.value.componentsTree.width;\n          const newTreeWidth = Math.min(\n            maxTreeWidth,\n            Math.max(MIN_CONTAINER_WIDTH, currentTreeWidth),\n          );\n\n          signalWidget.value = {\n            ...signalWidget.value,\n            dimensions: {\n              isFullWidth: false,\n              isFullHeight: false,\n              width: newSize.width,\n              height: newSize.height,\n              position: newPosition,\n            },\n            componentsTree: {\n              ...signalWidget.value.componentsTree,\n              width: newTreeWidth,\n            },\n          };\n\n          rafId = null;\n        });\n      };\n\n      const handlePointerUp = () => {\n        if (rafId) {\n          cancelAnimationFrame(rafId);\n          rafId = null;\n        }\n        document.removeEventListener('pointermove', handlePointerMove);\n        document.removeEventListener('pointerup', handlePointerUp);\n\n        const { dimensions, corner } = signalWidget.value;\n        const windowDims = getWindowDimensions();\n        const isCurrentFullWidth = windowDims.isFullWidth(dimensions.width);\n        const isCurrentFullHeight = windowDims.isFullHeight(dimensions.height);\n        const isFullScreen = isCurrentFullWidth && isCurrentFullHeight;\n\n        let newCorner = corner;\n        if (isFullScreen || isCurrentFullWidth || isCurrentFullHeight) {\n          newCorner = getClosestCorner(dimensions.position);\n        }\n\n        const newPosition = calculatePosition(\n          newCorner,\n          dimensions.width,\n          dimensions.height,\n        );\n\n        const onTransitionEnd = () => {\n          widget.removeEventListener('transitionend', onTransitionEnd);\n        };\n\n        widget.addEventListener('transitionend', onTransitionEnd);\n        containerStyle.transform = `translate3d(${newPosition.x}px, ${newPosition.y}px, 0)`;\n\n        signalWidget.value = {\n          ...signalWidget.value,\n          corner: newCorner,\n          dimensions: {\n            isFullWidth: isCurrentFullWidth,\n            isFullHeight: isCurrentFullHeight,\n            width: dimensions.width,\n            height: dimensions.height,\n            position: newPosition,\n          },\n          lastDimensions: {\n            isFullWidth: isCurrentFullWidth,\n            isFullHeight: isCurrentFullHeight,\n            width: dimensions.width,\n            height: dimensions.height,\n            position: newPosition,\n          },\n        };\n\n        saveLocalStorage(LOCALSTORAGE_KEY, {\n          corner: newCorner,\n          dimensions: signalWidget.value.dimensions,\n          lastDimensions: signalWidget.value.lastDimensions,\n          componentsTree: signalWidget.value.componentsTree,\n        });\n      };\n\n      document.addEventListener('pointermove', handlePointerMove, {\n        passive: true,\n      });\n      document.addEventListener('pointerup', handlePointerUp);\n    },\n    [],\n  );\n\n  // oxlint-disable-next-line react-hooks/exhaustive-deps\n  const handleDoubleClick = useCallback(\n    (e: JSX.TargetedMouseEvent<HTMLDivElement>) => {\n      e.preventDefault();\n      e.stopPropagation();\n\n      const widget = signalRefWidget.value;\n      if (!widget) return;\n\n      const containerStyle = widget.style;\n      const { dimensions, corner } = signalWidget.value;\n      const windowDims = getWindowDimensions();\n\n      const isCurrentFullWidth = windowDims.isFullWidth(dimensions.width);\n      const isCurrentFullHeight = windowDims.isFullHeight(dimensions.height);\n      const isFullScreen = isCurrentFullWidth && isCurrentFullHeight;\n      const isPartiallyMaximized =\n        (isCurrentFullWidth || isCurrentFullHeight) && !isFullScreen;\n\n      let newWidth = dimensions.width;\n      let newHeight = dimensions.height;\n      const newCorner = getOppositeCorner(\n        position,\n        corner,\n        isFullScreen,\n        isCurrentFullWidth,\n        isCurrentFullHeight,\n      );\n\n      if (position === 'left' || position === 'right') {\n        newWidth = isCurrentFullWidth ? dimensions.width : windowDims.maxWidth;\n        if (isPartiallyMaximized) {\n          newWidth = isCurrentFullWidth ? MIN_SIZE.width : windowDims.maxWidth;\n        }\n      } else {\n        newHeight = isCurrentFullHeight\n          ? dimensions.height\n          : windowDims.maxHeight;\n        if (isPartiallyMaximized) {\n          newHeight = isCurrentFullHeight\n            ? MIN_SIZE.initialHeight\n            : windowDims.maxHeight;\n        }\n      }\n\n      if (isFullScreen) {\n        if (position === 'left' || position === 'right') {\n          newWidth = MIN_SIZE.width;\n        } else {\n          newHeight = MIN_SIZE.initialHeight;\n        }\n      }\n\n      const newPosition = calculatePosition(newCorner, newWidth, newHeight);\n      const newDimensions = {\n        isFullWidth: windowDims.isFullWidth(newWidth),\n        isFullHeight: windowDims.isFullHeight(newHeight),\n        width: newWidth,\n        height: newHeight,\n        position: newPosition,\n      };\n\n      // Adjust components tree width when widget is resized\n      const maxTreeWidth = Math.floor(newWidth - MIN_SIZE.width / 2);\n      const currentTreeWidth = signalWidget.value.componentsTree.width;\n      const defaultWidth = Math.floor(newWidth * 0.3); // Use 30% of window width as default\n\n      const newTreeWidth = isCurrentFullWidth\n        ? MIN_CONTAINER_WIDTH\n        : (position === 'left' || position === 'right') && !isCurrentFullWidth\n          ? Math.min(maxTreeWidth, Math.max(MIN_CONTAINER_WIDTH, defaultWidth))\n          : Math.min(\n              maxTreeWidth,\n              Math.max(MIN_CONTAINER_WIDTH, currentTreeWidth),\n            );\n\n      requestAnimationFrame(() => {\n        signalWidget.value = {\n          corner: newCorner,\n          dimensions: newDimensions,\n          lastDimensions: dimensions,\n          componentsTree: {\n            ...signalWidget.value.componentsTree,\n            width: newTreeWidth,\n          },\n        };\n\n        containerStyle.transition = 'all 0.25s cubic-bezier(0, 0, 0.2, 1)';\n        containerStyle.width = `${newWidth}px`;\n        containerStyle.height = `${newHeight}px`;\n        containerStyle.transform = `translate3d(${newPosition.x}px, ${newPosition.y}px, 0)`;\n      });\n\n      saveLocalStorage(LOCALSTORAGE_KEY, {\n        corner: newCorner,\n        dimensions: newDimensions,\n        lastDimensions: dimensions,\n        componentsTree: {\n          ...signalWidget.value.componentsTree,\n          width: newTreeWidth,\n        },\n      });\n    },\n    [],\n  );\n\n  return (\n    <div\n      ref={refContainer}\n      onPointerDown={handleResize}\n      onDblClick={handleDoubleClick}\n      className={cn(\n        'absolute z-50',\n        'flex items-center justify-center',\n        'group',\n        'transition-colors select-none',\n        'peer',\n        {\n          'resize-left peer/left': position === 'left',\n          'resize-right peer/right z-10': position === 'right',\n          'resize-top peer/top': position === 'top',\n          'resize-bottom peer/bottom': position === 'bottom',\n        },\n      )}\n    >\n      <span className=\"resize-line-wrapper\">\n        <span className=\"resize-line\">\n          <Icon\n            name=\"icon-ellipsis\"\n            size={18}\n            className={cn(\n              'text-neutral-400',\n              (position === 'left' || position === 'right') && 'rotate-90',\n            )}\n          />\n        </span>\n      </span>\n    </div>\n  );\n};\n","{\n  \"name\": \"@react-devtools-plus/scan\",\n  \"type\": \"module\",\n  \"version\": \"0.10.2\",\n  \"description\": \"React Scan integration for React DevTools\",\n  \"keywords\": [\n    \"react\",\n    \"react-devtools-plus\",\n    \"react-scan\",\n    \"performance\",\n    \"profiler\"\n  ],\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"require\": \"./dist/index.cjs\",\n      \"default\": \"./dist/index.js\"\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"main\": \"./dist/index.cjs\",\n  \"module\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"dev\": \"tsup --watch\",\n    \"stub\": \"tsup --watch\",\n    \"prepare:type\": \"tsc --declaration --emitDeclarationOnly --outDir dist\"\n  },\n  \"peerDependencies\": {\n    \"@react-devtools-plus/core\": \"workspace:*\",\n    \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\",\n    \"react-dom\": \"^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0\"\n  },\n  \"peerDependenciesMeta\": {\n    \"@react-devtools-plus/core\": {\n      \"optional\": true\n    }\n  },\n  \"dependencies\": {\n    \"@preact/signals\": \"^1.3.1\",\n    \"bippy\": \"^0.3.34\",\n    \"clsx\": \"^2.1.1\",\n    \"preact\": \"^10.25.1\",\n    \"tailwind-merge\": \"^3.5.0\"\n  },\n  \"devDependencies\": {\n    \"@types/react\": \"^18.2.72\",\n    \"@types/react-dom\": \"^18.2.23\",\n    \"esbuild\": \"^0.25.0\",\n    \"tsup\": \"^8.0.0\",\n    \"typescript\": \"^5.9.3\"\n  }\n}\n","/**\n * Scan Facade — direct integration with the local scan engine.\n *\n * Replaces the old adapter.ts that bridged the DevTools to an external\n * react-scan package via window globals. All engine access is now through\n * direct ES-module imports.\n */\n\nimport type {\n  AggregatedChanges,\n  ComponentPerformanceData,\n  ComponentTreeNode,\n  FocusedComponentRenderInfo,\n  PerformanceSummary,\n  ReactDevtoolsScanOptions,\n  ScanInstance,\n} from './types'\nimport { _fiberRoots, getDisplayName, getFiberId, isCompositeFiber } from 'bippy'\nimport {\n  ReactScanInternals as _ReactScanInternals,\n  Store as _Store,\n  addOnRenderListener,\n  getRenderCount,\n  scan,\n  setOptions as setScanOptions,\n} from './core/index'\n\n// When the Vite plugin injects a pre-built scan.js bundle AND the overlay loads\n// scan from source, two separate module instances of Store/ReactScanInternals\n// exist. The pre-built bundle sets window.__REACT_SCAN_INTERNALS__ during\n// initScan(). We always prefer that global instance so the facade operates on\n// the same objects the toolbar/ScanOverlay already subscribe to.\nfunction getInternals(): typeof _ReactScanInternals {\n  if (typeof window !== 'undefined' && (window as any).__REACT_SCAN_INTERNALS__) {\n    return (window as any).__REACT_SCAN_INTERNALS__\n  }\n  return _ReactScanInternals\n}\n\nfunction getStore(): typeof _Store {\n  return getInternals().Store\n}\n\n// Proxies that always access the runtime-global instances\nconst ReactScanInternals = new Proxy({} as typeof _ReactScanInternals, {\n  get(_target, prop, receiver) {\n    return Reflect.get(getInternals(), prop, receiver)\n  },\n  set(_target, prop, value, receiver) {\n    return Reflect.set(getInternals(), prop, value, receiver)\n  },\n})\n\nconst Store = new Proxy({} as typeof _Store, {\n  get(_target, prop, receiver) {\n    return Reflect.get(getStore(), prop, receiver)\n  },\n  set(_target, prop, value, receiver) {\n    return Reflect.set(getStore(), prop, value, receiver)\n  },\n})\n\n/**\n * Inject positioning CSS for ScanOverlay into a shadow root.\n * The pre-built scan.js CSS may lack compiled Tailwind utilities,\n * so we ensure the critical layout rules are present.\n */\nfunction ensureOverlayCSS(sr: ShadowRoot): void {\n  const id = '__react-scan-overlay-css__'\n  if (sr.querySelector(`#${id}`)) return\n  const style = document.createElement('style')\n  style.id = id\n  style.textContent = `\n    .fixed { position: fixed !important; }\n    .top-0 { top: 0 !important; }\n    .left-0 { left: 0 !important; }\n    .w-screen { width: 100vw !important; }\n    .h-screen { height: 100vh !important; }\n    .pointer-events-none { pointer-events: none !important; }\n    .z-\\\\[214748365\\\\] { z-index: 214748365 !important; }\n    .z-\\\\[214748367\\\\] { z-index: 214748367 !important; }\n    .inset-0 { inset: 0 !important; }\n  `\n  sr.appendChild(style)\n}\n\nconst STORAGE_KEY = 'react-scan-options'\n\nfunction persistEnabledState(enabled: boolean): void {\n  try {\n    const existing = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}')\n    localStorage.setItem(STORAGE_KEY, JSON.stringify({ ...existing, enabled }))\n  }\n  catch {}\n}\n\n// ─── Serialisation ──────────────────────────────────────────────────────────\n\nfunction serializeValue(value: unknown): unknown {\n  if (value === undefined) return undefined\n  if (value === null) return null\n  if (typeof value === 'function') return `[Function: ${(value as Function).name || 'anonymous'}]`\n  if (typeof value === 'symbol') return `[Symbol: ${(value as symbol).description || ''}]`\n  if (value instanceof Element) return `[Element: ${value.tagName}]`\n  if (typeof value === 'object') {\n    if (Array.isArray(value)) {\n      if (value.length > 10) return `[Array(${value.length})]`\n      return value.map(serializeValue)\n    }\n    if ((value as any).$$typeof) return '[React Element]'\n    try {\n      const keys = Object.keys(value as object)\n      if (keys.length > 20) return `[Object with ${keys.length} keys]`\n      const out: Record<string, unknown> = {}\n      for (const k of keys.slice(0, 20)) {\n        out[k] = serializeValue((value as any)[k])\n      }\n      return out\n    } catch {\n      return '[Object]'\n    }\n  }\n  return value\n}\n\n// ─── Component tree ─────────────────────────────────────────────────────────\n\nfunction getFiberRenderCount(fiber: any): number {\n  try {\n    return getRenderCount(getFiberId(fiber))\n  } catch {\n    return 0\n  }\n}\n\nfunction collectCompositeDescendants(\n  fiber: any,\n  depth: number,\n  maxDepth: number,\n  results: ComponentTreeNode[],\n): void {\n  if (!fiber || depth > maxDepth) return\n  try {\n    const name = getDisplayName(fiber.type)\n    if (isCompositeFiber(fiber) && name) {\n      const node = buildTreeNode(fiber, depth, maxDepth)\n      if (node) results.push(node)\n    } else {\n      let child = fiber.child\n      while (child) {\n        collectCompositeDescendants(child, depth, maxDepth, results)\n        child = child.sibling\n      }\n    }\n  } catch {\n    // ignore\n  }\n}\n\nfunction buildTreeNode(fiber: any, depth = 0, maxDepth = 50): ComponentTreeNode | null {\n  if (!fiber || depth > maxDepth) return null\n  try {\n    const name = getDisplayName(fiber.type)\n    if (isCompositeFiber(fiber) && name) {\n      const node: ComponentTreeNode = {\n        id: String(getFiberId(fiber)),\n        name,\n        type: typeof fiber.type === 'function' ? 'function' : 'class',\n        renderCount: getFiberRenderCount(fiber),\n        lastRenderTime: 0,\n        children: [],\n      }\n      let child = fiber.child\n      while (child) {\n        collectCompositeDescendants(child, depth + 1, maxDepth, node.children)\n        child = child.sibling\n      }\n      return node\n    }\n    // Non-composite: collect composite descendants\n    const compositeChildren: ComponentTreeNode[] = []\n    let child = fiber.child\n    while (child) {\n      collectCompositeDescendants(child, depth, maxDepth, compositeChildren)\n      child = child.sibling\n    }\n    return compositeChildren.length === 1 ? compositeChildren[0] : null\n  } catch {\n    return null\n  }\n}\n\nfunction findFiberRootsFromDOM(): any[] {\n  const roots: any[] = []\n  if (typeof document === 'undefined') return roots\n  const candidates = [\n    document.getElementById('root'),\n    document.getElementById('app'),\n    document.getElementById('__next'),\n  ]\n  for (const el of candidates) {\n    if (!el) continue\n    // React 18+ container key\n    const fiberKey = Object.keys(el).find(k => k.startsWith('__reactContainer$'))\n    if (fiberKey) {\n      let fiber = (el as any)[fiberKey]\n      while (fiber) {\n        if (fiber.stateNode?.current) {\n          roots.push(fiber.stateNode)\n          break\n        }\n        fiber = fiber.return\n      }\n    }\n    // React 16-17\n    const legacy = (el as any)._reactRootContainer?._internalRoot\n    if (legacy) roots.push(legacy)\n  }\n  return roots\n}\n\nfunction extractComponentTree(): ComponentTreeNode[] {\n  const trees: ComponentTreeNode[] = []\n  try {\n    // Try bippy _fiberRoots first (global > local), fall back to DOM walking\n    const bippyRoots = (getInternals().fiberRootsSet ?? _fiberRoots) as unknown as Set<any>\n    let hasRoots = false\n    if (typeof (bippyRoots as any).forEach === 'function' && (bippyRoots as any).size > 0) {\n      hasRoots = true\n      bippyRoots.forEach((root: any) => {\n        const rootFiber = root.current || root\n        if (!rootFiber) return\n        let child = rootFiber.child\n        while (child) {\n          const node = buildTreeNode(child, 0)\n          if (node) trees.push(node)\n          child = child.sibling\n        }\n      })\n    }\n\n    if (!hasRoots) {\n      const domRoots = findFiberRootsFromDOM()\n      for (const root of domRoots) {\n        const rootFiber = root.current || root\n        if (!rootFiber) continue\n        let child = rootFiber.child\n        while (child) {\n          const node = buildTreeNode(child, 0)\n          if (node) trees.push(node)\n          child = child.sibling\n        }\n      }\n    }\n  } catch {\n    // ignore\n  }\n  return trees\n}\n\n// ─── Performance data ────────────────────────────────────────────────────────\n\nfunction extractPerformanceData(): ComponentPerformanceData[] {\n  const performanceData: ComponentPerformanceData[] = []\n  try {\n    if (!Store.reportData) return performanceData\n\n    const componentStats = new Map<string, {\n      renderCount: number\n      totalTime: number\n      unnecessaryRenders: number\n      lastRenderTime: number | null\n    }>()\n\n    Store.reportData.forEach((renderData) => {\n      const componentName = renderData.componentName || 'Unknown'\n      const existing = componentStats.get(componentName) ?? {\n        renderCount: 0,\n        totalTime: 0,\n        unnecessaryRenders: 0,\n        lastRenderTime: null,\n      }\n      existing.renderCount += renderData.count || 0\n      existing.totalTime += renderData.time || 0\n      if (renderData.unnecessary) existing.unnecessaryRenders++\n      if (renderData.time != null) existing.lastRenderTime = renderData.time\n      componentStats.set(componentName, existing)\n    })\n\n    componentStats.forEach((stats, componentName) => {\n      performanceData.push({\n        componentName,\n        renderCount: stats.renderCount,\n        totalTime: stats.totalTime,\n        averageTime: stats.renderCount > 0 ? stats.totalTime / stats.renderCount : 0,\n        unnecessaryRenders: stats.unnecessaryRenders,\n        lastRenderTime: stats.lastRenderTime,\n      })\n    })\n\n    performanceData.sort((a, b) => b.totalTime - a.totalTime)\n  } catch {\n    // ignore\n  }\n  return performanceData\n}\n\nfunction calculatePerformanceSummary(data: ComponentPerformanceData[]): PerformanceSummary {\n  const totalRenders = data.reduce((s, i) => s + i.renderCount, 0)\n  const totalTime = data.reduce((s, i) => s + i.totalTime, 0)\n  return {\n    totalRenders,\n    totalComponents: data.length,\n    unnecessaryRenders: data.reduce((s, i) => s + i.unnecessaryRenders, 0),\n    averageRenderTime: totalRenders > 0 ? totalTime / totalRenders : 0,\n    slowestComponents: data.slice(0, 10),\n  }\n}\n\n// ─── FPS counter ─────────────────────────────────────────────────────────────\n\nlet fps = 60\nlet frameCount = 0\nlet lastFpsTime = typeof performance !== 'undefined' ? performance.now() : Date.now()\n\nconst updateFPS = () => {\n  if (typeof performance === 'undefined' || typeof requestAnimationFrame === 'undefined') return\n  frameCount++\n  const now = performance.now()\n  if (now - lastFpsTime >= 1000) {\n    fps = frameCount\n    frameCount = 0\n    lastFpsTime = now\n  }\n  requestAnimationFrame(updateFPS)\n}\nif (typeof requestAnimationFrame !== 'undefined') {\n  requestAnimationFrame(updateFPS)\n}\n\n// ─── Focused component tracking ──────────────────────────────────────────────\n\ninterface FocusedComponentTracker {\n  componentName: string\n  renderCount: number\n  changes: AggregatedChanges\n  timestamp: number\n}\n\nlet focusedComponentTracker: FocusedComponentTracker | null = null\nconst focusedComponentChangeCallbacks = new Set<(info: FocusedComponentRenderInfo) => void>()\n\nfunction notifyFocusedComponentCallbacks(): void {\n  if (!focusedComponentTracker) return\n  const info: FocusedComponentRenderInfo = {\n    componentName: focusedComponentTracker.componentName,\n    renderCount: focusedComponentTracker.renderCount,\n    changes: focusedComponentTracker.changes,\n    timestamp: focusedComponentTracker.timestamp,\n  }\n  focusedComponentChangeCallbacks.forEach((cb) => {\n    try { cb(info) } catch { /* ignore */ }\n  })\n}\n\n// Single persistent render listener registered once\nlet renderListenerCleanup: (() => void) | null = null\n\nfunction ensureRenderListener(): void {\n  if (renderListenerCleanup) return\n  // When the pre-built scan.js bundle is active, its instrumentation calls\n  // notifyRenderListeners on its own Set.  We must register on that Set\n  // (via the global internals) rather than the source-bundle's local Set.\n  const registerListener = getInternals().addOnRenderListener ?? addOnRenderListener\n  renderListenerCleanup = registerListener((fiber, _renders) => {\n    if (!focusedComponentTracker) return\n    const fiberName = getDisplayName(fiber.type) || 'Unknown'\n    if (fiberName !== focusedComponentTracker.componentName) return\n\n    focusedComponentTracker.renderCount++\n    focusedComponentTracker.timestamp = Date.now()\n\n    // Extract changes from fiber\n    try {\n      const currentProps = fiber.memoizedProps || {}\n      const prevProps = fiber.alternate?.memoizedProps || {}\n      for (const key of Object.keys(currentProps)) {\n        if (key === 'children') continue\n        const prev = prevProps[key]\n        const curr = currentProps[key]\n        if (prev !== curr) {\n          const existing = focusedComponentTracker.changes.propsChanges.find(c => c.name === key)\n          if (existing) {\n            existing.count++\n            existing.previousValue = serializeValue(prev)\n            existing.currentValue = serializeValue(curr)\n          } else {\n            focusedComponentTracker.changes.propsChanges.push({\n              name: key,\n              previousValue: serializeValue(prev),\n              currentValue: serializeValue(curr),\n              count: 1,\n            })\n          }\n        }\n      }\n\n      let currentState = fiber.memoizedState\n      let prevState = fiber.alternate?.memoizedState\n      let hookIndex = 0\n      while (currentState) {\n        if (currentState.memoizedState !== undefined) {\n          const curr = currentState.memoizedState\n          const prev = prevState?.memoizedState\n          if (prev !== curr && prevState) {\n            const name = `Hook ${hookIndex + 1}`\n            const existing = focusedComponentTracker.changes.stateChanges.find(c => c.name === name)\n            if (existing) {\n              existing.count++\n              existing.previousValue = serializeValue(prev)\n              existing.currentValue = serializeValue(curr)\n            } else {\n              focusedComponentTracker.changes.stateChanges.push({\n                name,\n                previousValue: serializeValue(prev),\n                currentValue: serializeValue(curr),\n                count: 1,\n              })\n            }\n          }\n        }\n        currentState = currentState.next\n        prevState = prevState?.next\n        hookIndex++\n      }\n    } catch {\n      // ignore extraction errors\n    }\n\n    notifyFocusedComponentCallbacks()\n  })\n}\n\n// ─── ScanInstance ─────────────────────────────────────────────────────────────\n\nlet scanInstance: ScanInstance | null = null\nlet currentOptions: ReactDevtoolsScanOptions = {}\n\n// Check whether the pre-built scan.js already initialised instrumentation.\n// If so, we must NOT call scan()/start() from the source-code copy because\n// that would create a *second* bippy instrumentation instance.\nfunction isGlobalInstanceAvailable(): boolean {\n  return typeof window !== 'undefined' && !!(window as any).__REACT_SCAN_INTERNALS__\n}\n\nfunction createScanInstance(options: ReactDevtoolsScanOptions): ScanInstance {\n  currentOptions = options\n\n  return {\n    getOptions: () => currentOptions,\n\n    setOptions: (newOptions: Partial<ReactDevtoolsScanOptions>) => {\n      currentOptions = { ...currentOptions, ...newOptions }\n      // Update options on the global internals directly\n      const internals = getInternals()\n      internals.options.value = { ...internals.options.value, ...currentOptions }\n    },\n\n    start: () => {\n      const opts = { ...currentOptions, enabled: true }\n      currentOptions = opts\n\n      const internals = getInternals()\n      if (internals.instrumentation?.isPaused) {\n        internals.instrumentation.isPaused.value = false\n      }\n      internals.options.value = { ...internals.options.value, enabled: true }\n\n      persistEnabledState(true)\n\n      if (!isGlobalInstanceAvailable()) {\n        scan(opts)\n      }\n      ensureRenderListener()\n    },\n\n    stop: () => {\n      currentOptions = { ...currentOptions, enabled: false }\n\n      const internals = getInternals()\n      if (internals.instrumentation?.isPaused) {\n        internals.instrumentation.isPaused.value = true\n      }\n      internals.options.value = { ...internals.options.value, enabled: false }\n\n      persistEnabledState(false)\n    },\n\n    isActive: () => {\n      const internals = getInternals()\n      if (internals.instrumentation?.isPaused) {\n        return !internals.instrumentation.isPaused.value\n      }\n      return internals.options.value?.enabled === true\n    },\n\n    hideToolbar: () => {\n      currentOptions = { ...currentOptions, showToolbar: false }\n      // Use setScanOptions so the toolbar UI is actually torn down via initToolbar()\n      setScanOptions({ showToolbar: false })\n      getInternals().options.value = { ...getInternals().options.value, showToolbar: false }\n    },\n\n    showToolbar: () => {\n      currentOptions = { ...currentOptions, showToolbar: true }\n      setScanOptions({ showToolbar: true })\n      getInternals().options.value = { ...getInternals().options.value, showToolbar: true }\n    },\n\n    getToolbarVisibility: () => {\n      return getInternals().options.value?.showToolbar !== false\n    },\n\n    getPerformanceData: () => extractPerformanceData(),\n\n    getPerformanceSummary: () => calculatePerformanceSummary(extractPerformanceData()),\n\n    clearPerformanceData: () => {\n      Store.reportData?.clear()\n      Store.legacyReportData?.clear()\n    },\n\n    startInspecting: () => {\n      const internals = getInternals()\n      // ScanOverlay (which handles inspect highlights and click-to-select) is\n      // only rendered when the toolbar is visible.  Force-initialise the toolbar\n      // if it hasn't been created yet, then hide the widget UI so only the\n      // overlay remains active.\n      if (typeof window !== 'undefined' && !window.__REACT_SCAN_TOOLBAR_CONTAINER__) {\n        internals.initToolbar?.(true)\n        const scanRoot = document.getElementById('react-scan-root')\n        const sr = scanRoot?.shadowRoot\n        if (sr) {\n          // Hide the toolbar widget while keeping ScanOverlay rendered\n          const toolbarEl = sr.querySelector('#react-scan-toolbar') as HTMLElement | null\n          if (toolbarEl) toolbarEl.style.display = 'none'\n          // Inject critical positioning CSS for ScanOverlay since Tailwind\n          // utilities may not be compiled in the shadow root stylesheet.\n          ensureOverlayCSS(sr)\n        }\n      }\n      Store.inspectState.value = { kind: 'inspecting', hoveredDomElement: null }\n    },\n\n    stopInspecting: () => {\n      Store.inspectState.value = { kind: 'inspect-off' }\n      // If the toolbar was force-initialised for inspection and the user's\n      // original setting was showToolbar: false, tear it down.\n      if (!currentOptions.showToolbar && typeof window !== 'undefined' && window.__REACT_SCAN_TOOLBAR_CONTAINER__) {\n        const internals = getInternals()\n        internals.initToolbar?.(false)\n      }\n    },\n\n    isInspecting: () => Store.inspectState.value.kind === 'inspecting',\n\n    focusComponent: (fiber: any) => {\n      if (!fiber) return\n      const domElement = fiber.stateNode instanceof Element ? fiber.stateNode : null\n      if (domElement) {\n        Store.inspectState.value = { kind: 'focused', focusedDomElement: domElement, fiber }\n      }\n    },\n\n    getFocusedComponent: () => {\n      const state = Store.inspectState.value\n      if (state.kind !== 'focused') return null\n      return {\n        componentName: getDisplayName(state.fiber.type) || 'Unknown',\n        componentId: String(getFiberId(state.fiber)),\n        fiber: state.fiber,\n        domElement: state.focusedDomElement,\n      }\n    },\n\n    onInspectStateChange: (callback: (state: any) => void) => {\n      ensureRenderListener()\n      return Store.inspectState.subscribe((state: any) => {\n        if (state.kind === 'focused') {\n          const componentName = getDisplayName(state.fiber?.type) || 'Unknown'\n          if (!focusedComponentTracker || focusedComponentTracker.componentName !== componentName) {\n            focusedComponentTracker = {\n              componentName,\n              renderCount: 0,\n              changes: { propsChanges: [], stateChanges: [], contextChanges: [] },\n              timestamp: Date.now(),\n            }\n          }\n        }\n        callback(state)\n      })\n    },\n\n    getFPS: () => fps,\n\n    getFocusedComponentRenderInfo: () => {\n      if (!focusedComponentTracker) return null\n      return {\n        componentName: focusedComponentTracker.componentName,\n        renderCount: focusedComponentTracker.renderCount,\n        changes: focusedComponentTracker.changes,\n        timestamp: focusedComponentTracker.timestamp,\n      }\n    },\n\n    onFocusedComponentChange: (callback: (info: FocusedComponentRenderInfo) => void) => {\n      focusedComponentChangeCallbacks.add(callback)\n      return () => focusedComponentChangeCallbacks.delete(callback)\n    },\n\n    clearFocusedComponentChanges: () => {\n      if (focusedComponentTracker) {\n        focusedComponentTracker.renderCount = 0\n        focusedComponentTracker.changes = { propsChanges: [], stateChanges: [], contextChanges: [] }\n        focusedComponentTracker.timestamp = Date.now()\n      }\n    },\n\n    setFocusedComponentByName: (componentName: string) => {\n      focusedComponentTracker = {\n        componentName,\n        renderCount: 0,\n        changes: { propsChanges: [], stateChanges: [], contextChanges: [] },\n        timestamp: Date.now(),\n      }\n      ensureRenderListener()\n    },\n\n    getComponentTree: () => extractComponentTree(),\n\n    clearComponentTree: () => {\n      // No separate map to clear — render counts come from Store.reportData\n    },\n  }\n}\n\nexport function getScanInstance(options?: ReactDevtoolsScanOptions): ScanInstance {\n  if (!scanInstance && options) {\n    scanInstance = createScanInstance(options)\n  }\n  if (!scanInstance) {\n    throw new Error('Scan instance not initialized. Call initScan first.')\n  }\n  return scanInstance\n}\n\nexport function resetScanInstance(): void {\n  scanInstance = null\n  currentOptions = {}\n  focusedComponentTracker = null\n  focusedComponentChangeCallbacks.clear()\n  if (renderListenerCleanup) {\n    renderListenerCleanup()\n    renderListenerCleanup = null\n  }\n}\n","/**\n * React Scan Plugin for React DevTools\n *\n * This plugin integrates React Scan into the React DevTools plugin system,\n * providing performance monitoring and analysis capabilities.\n */\n\nimport type { ReactDevtoolsScanOptions, ScanInstance } from './types'\nimport { getDisplayName, getFiberId } from 'bippy'\nimport { getScanInstance, resetScanInstance } from './scan-facade'\n\nconst STORAGE_KEY = 'react-scan-options'\n\nfunction getPersistedEnabledState(): boolean | null {\n  if (typeof window === 'undefined') {\n    return null\n  }\n\n  try {\n    const stored = localStorage.getItem(STORAGE_KEY)\n    if (!stored) {\n      return null\n    }\n\n    const parsed = JSON.parse(stored)\n    return typeof parsed?.enabled === 'boolean' ? parsed.enabled : null\n  }\n  catch {\n    return null\n  }\n}\n\n/**\n * React Scan plugin configuration\n */\nexport interface ScanPluginConfig extends ReactDevtoolsScanOptions {\n  /**\n   * Whether to auto-start scan on plugin load\n   * @default true\n   */\n  autoStart?: boolean\n}\n\n/**\n * Create React Scan plugin\n *\n * @param config - Plugin configuration\n * @returns DevTools plugin instance\n *\n * @example\n * ```typescript\n * import { createScanPlugin } from '@react-devtools-plus/scan/plugin';\n *\n * const scanPlugin = createScanPlugin({\n *   enabled: true,\n *   showToolbar: true,\n *   autoStart: true,\n * });\n * ```\n */\nexport function createScanPlugin(config: ScanPluginConfig = {}): any {\n  let scanInstance: ScanInstance | null = null\n  let context: any = null\n\n  const {\n    autoStart = true,\n    ...scanOptions\n  } = config\n\n  // Event emitter for plugin events\n  const eventHandlers: Map<string, Set<(data: any) => void>> = new Map()\n\n  const emit = (eventName: string, data: any) => {\n    const handlers = eventHandlers.get(eventName)\n    if (handlers) {\n      handlers.forEach((handler) => {\n        if (typeof handler === 'function') {\n          try {\n            handler(data)\n          }\n          catch {\n            // Ignore event handler errors\n          }\n        }\n      })\n    }\n  }\n\n  const subscribe = (eventName: string, handler: (data: any) => void) => {\n    if (!eventHandlers.has(eventName)) {\n      eventHandlers.set(eventName, new Set())\n    }\n    eventHandlers.get(eventName)!.add(handler)\n\n    // Return unsubscribe function\n    return () => {\n      const handlers = eventHandlers.get(eventName)\n      if (handlers) {\n        handlers.delete(handler)\n      }\n    }\n  }\n\n  return {\n    id: 'react-scan',\n    name: 'React Scan',\n    description: 'Performance monitoring and analysis for React applications',\n    version: '1.0.0',\n\n    // Expose subscribe method for event subscriptions\n    subscribe,\n\n    /**\n     * Plugin setup\n     */\n    async setup(ctx: any) {\n      context = ctx\n\n      scanInstance = getScanInstance({ ...scanOptions })\n\n      const shouldStart =\n        typeof scanOptions.enabled === 'boolean'\n          ? scanOptions.enabled\n          : getPersistedEnabledState() ?? scanInstance.isActive()\n\n      if (autoStart && shouldStart) {\n        scanInstance.start()\n      }\n\n      // Set up inspect state change listener\n      try {\n        const scan = getScanInstance()\n        if (scan) {\n          // Track the last hovered component during inspection\n          let lastInspectedComponent: { componentName: string, componentId?: string } | null = null\n\n          scan.onInspectStateChange((state: any) => {\n            // Emit inspect state change event\n            // Sanitize state for RPC\n            const sanitizedState = {\n              kind: state.kind,\n              // Include component name if available\n              componentName: state.fiber ? (state.fiber.type?.displayName || state.fiber.type?.name || 'Unknown') : undefined,\n            }\n            emit('inspect-state-changed', sanitizedState)\n\n            // Track component during inspecting state - save hovered component info\n            if (state.kind === 'inspecting' && state.fiber) {\n              const componentName = getDisplayName(state.fiber.type) || 'Unknown'\n              const componentId = String(getFiberId(state.fiber))\n              lastInspectedComponent = { componentName, componentId }\n            }\n\n            // If a component is focused, emit focused component info and set up tracking\n            if (state.kind === 'focused') {\n              const focusedComponent = scan.getFocusedComponent()\n              if (focusedComponent) {\n                // Sanitize for RPC - remove non-serializable fields\n                const { fiber, domElement, ...serializableComponent } = focusedComponent as any\n                emit('component-focused', serializableComponent)\n                // Set up render tracking\n                scan.setFocusedComponentByName(focusedComponent.componentName)\n              }\n            }\n\n            // When inspection ends (inspect-off), emit the last inspected component\n            if (state.kind === 'inspect-off' && lastInspectedComponent) {\n              emit('component-focused', lastInspectedComponent)\n              scan.setFocusedComponentByName(lastInspectedComponent.componentName)\n              lastInspectedComponent = null\n            }\n          })\n\n          // Subscribe to focused component render changes\n          scan.onFocusedComponentChange((info) => {\n            emit('focused-component-render', info)\n          })\n        }\n      }\n      catch {\n        // Ignore errors setting up inspect state listener\n      }\n\n      // Listen for component tree changes if context supports it\n      // Listen to component tree changes if supported\n      if (ctx.on) {\n        ctx.on('component-tree-changed', (_event: any) => {\n          // Component tree changed, could update UI here\n        })\n      }\n\n      // Register RPC functions if context supports it\n      if (ctx.registerRPC) {\n        ctx.registerRPC('getScanOptions', () => {\n          try {\n            const scan = getScanInstance()\n            return scan?.getOptions() || null\n          }\n          catch {\n            return null\n          }\n        })\n\n        ctx.registerRPC('setScanOptions', (options: Partial<ReactDevtoolsScanOptions>) => {\n          try {\n            const scan = getScanInstance()\n            if (scan) {\n              scan.setOptions(options)\n              return true\n            }\n            return false\n          }\n          catch {\n            return false\n          }\n        })\n\n        ctx.registerRPC('startScan', () => {\n          try {\n            const scan = getScanInstance()\n            if (scan) {\n              scan.start()\n              return true\n            }\n            return false\n          }\n          catch {\n            return false\n          }\n        })\n\n        ctx.registerRPC('stopScan', () => {\n          try {\n            const scan = getScanInstance()\n            if (scan) {\n              scan.stop()\n              return true\n            }\n            return false\n          }\n          catch {\n            return false\n          }\n        })\n\n        ctx.registerRPC('isScanActive', () => {\n          try {\n            const scan = getScanInstance()\n            return scan?.isActive() || false\n          }\n          catch {\n            return false\n          }\n        })\n      }\n    },\n\n    /**\n     * Plugin teardown\n     */\n    async teardown() {\n      if (scanInstance) {\n        scanInstance.stop()\n        scanInstance = null\n      }\n\n      resetScanInstance()\n      context = null\n    },\n\n    /**\n     * RPC methods exposed to other plugins\n     */\n    rpc: {\n      /**\n       * Get current scan options\n       */\n      getOptions: () => {\n        try {\n          const scan = getScanInstance()\n          return scan?.getOptions() || null\n        }\n        catch {\n          return null\n        }\n      },\n\n      /**\n       * Set scan options\n       */\n      setOptions: (options: Partial<ReactDevtoolsScanOptions>) => {\n        try {\n          const scan = getScanInstance()\n          if (scan) {\n            scan.setOptions(options)\n            return true\n          }\n          return false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Start scan\n       */\n      start: () => {\n        try {\n          const scanInst = getScanInstance()\n          if (scanInst) {\n            scanInst.start()\n            return true\n          }\n          // Auto-initialize if not started\n          if (!scanInstance) {\n            scanInstance = getScanInstance(config)\n            scanInstance.start()\n            return true\n          }\n          return false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Stop scan\n       */\n      stop: () => {\n        try {\n          const scan = getScanInstance()\n          if (scan) {\n            scan.stop()\n            return true\n          }\n          return false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Check if scan is active\n       */\n      isActive: () => {\n        try {\n          const scan = getScanInstance()\n          return scan?.isActive() || false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Hide the React Scan toolbar\n       */\n      hideToolbar: () => {\n        try {\n          const scan = getScanInstance()\n          if (scan) {\n            scan.hideToolbar()\n            return true\n          }\n          return false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Show the React Scan toolbar\n       */\n      showToolbar: () => {\n        try {\n          const scan = getScanInstance()\n          if (scan) {\n            scan.showToolbar()\n            return true\n          }\n          return false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Get toolbar visibility state\n       */\n      getToolbarVisibility: () => {\n        try {\n          const scan = getScanInstance()\n          return scan?.getToolbarVisibility() || false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Get performance data for all components\n       */\n      getPerformanceData: () => {\n        try {\n          const scan = getScanInstance()\n          return scan?.getPerformanceData() || []\n        }\n        catch {\n          return []\n        }\n      },\n\n      /**\n       * Get aggregated performance summary\n       */\n      getPerformanceSummary: () => {\n        try {\n          const scan = getScanInstance()\n          if (!scan) {\n            return {\n              totalRenders: 0,\n              totalComponents: 0,\n              unnecessaryRenders: 0,\n              averageRenderTime: 0,\n              slowestComponents: [],\n            }\n          }\n          return scan.getPerformanceSummary()\n        }\n        catch {\n          return {\n            totalRenders: 0,\n            totalComponents: 0,\n            unnecessaryRenders: 0,\n            averageRenderTime: 0,\n            slowestComponents: [],\n          }\n        }\n      },\n\n      /**\n       * Clear all performance data\n       */\n      clearPerformanceData: () => {\n        try {\n          const scan = getScanInstance()\n          if (scan) {\n            scan.clearPerformanceData()\n            return true\n          }\n          return false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Get current FPS\n       */\n      getFPS: () => {\n        try {\n          const scan = getScanInstance()\n          return scan?.getFPS() || 0\n        }\n        catch {\n          return 0\n        }\n      },\n\n      /**\n       * Start component inspection mode\n       */\n      startInspecting: () => {\n        try {\n          const scan = getScanInstance()\n          if (scan) {\n            scan.startInspecting()\n            return true\n          }\n          return false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Stop component inspection mode\n       */\n      stopInspecting: () => {\n        try {\n          const scan = getScanInstance()\n          if (scan) {\n            scan.stopInspecting()\n            return true\n          }\n          return false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Check if inspection mode is active\n       */\n      isInspecting: () => {\n        try {\n          const scan = getScanInstance()\n          return scan?.isInspecting() || false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Focus on a specific component\n       */\n      focusComponent: (fiber: any) => {\n        try {\n          const scan = getScanInstance()\n          if (scan && fiber) {\n            scan.focusComponent(fiber)\n            return true\n          }\n          return false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Get currently focused component\n       */\n      getFocusedComponent: () => {\n        try {\n          const scan = getScanInstance()\n          const component = scan?.getFocusedComponent() || null\n          if (component) {\n            // Sanitize for RPC - remove non-serializable fields\n            const { fiber, domElement, ...serializableComponent } = component as any\n            return serializableComponent\n          }\n          return null\n        }\n        catch {\n          return null\n        }\n      },\n\n      /**\n       * Get focused component render info with changes\n       */\n      getFocusedComponentRenderInfo: () => {\n        try {\n          const scan = getScanInstance()\n          return scan?.getFocusedComponentRenderInfo() || null\n        }\n        catch {\n          return null\n        }\n      },\n\n      /**\n       * Clear focused component changes\n       */\n      clearFocusedComponentChanges: () => {\n        try {\n          const scan = getScanInstance()\n          if (scan) {\n            scan.clearFocusedComponentChanges()\n            return true\n          }\n          return false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Set focused component by name for render tracking\n       */\n      setFocusedComponentByName: (componentName: string) => {\n        try {\n          const scan = getScanInstance()\n          if (scan && componentName) {\n            scan.setFocusedComponentByName(componentName)\n            return true\n          }\n          return false\n        }\n        catch {\n          return false\n        }\n      },\n\n      /**\n       * Get the component tree with render counts\n       */\n      getComponentTree: () => {\n        try {\n          const scan = getScanInstance()\n          return scan?.getComponentTree() || []\n        }\n        catch {\n          return []\n        }\n      },\n\n      /**\n       * Clear component tree render counts\n       */\n      clearComponentTree: () => {\n        try {\n          const scan = getScanInstance()\n          if (scan) {\n            scan.clearComponentTree()\n            return true\n          }\n          return false\n        }\n        catch {\n          return false\n        }\n      },\n    },\n\n    /**\n     * Event handlers\n     */\n    on: {\n      'component-mounted': (_event: any) => {\n        // React Scan automatically tracks component mounts\n      },\n\n      'component-updated': (_event: any) => {\n        // React Scan automatically tracks component updates\n      },\n    },\n  }\n}\n\n/**\n * Default React Scan plugin instance\n */\nexport const scanPlugin = createScanPlugin()\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["import_bippy","import_signals","import_bippy","import_bippy","import_signals","import_bippy","import_preact","import_bippy","import_bippy","import_signals","import_preact","import_hooks","import_bippy","Component","import_hooks","start","import_signals","import_signals","import_jsx_runtime","_a","e","import_compat","import_hooks","import_compat","import_hooks","import_jsx_runtime","timeout","import_hooks","import_jsx_runtime","import_hooks","import_bippy","import_signals","import_bippy","import_jsx_runtime","_a","import_jsx_runtime","rootContainer","_a","_b","ctx","current","changes","str","allInstances","fps","render","render","i","len","start","getLabelText","activeOutlines","canvas","dpr","ctx","fiber","shadowRoot","width","height","import_preact","import_jsx_runtime","import_preact","import_hooks","import_signals","import_hooks","timeout","import_signals","import_hooks","import_jsx_runtime","import_jsx_runtime","import_signals","import_hooks","import_jsx_runtime","import_hooks","import_jsx_runtime","fps","import_preact","import_hooks","import_compat","Store","import_bippy","task","entry","_a","selfTime","totalTime","newChanges","emptySection","event","fps","import_jsx_runtime","import_compat","import_hooks","import_compat","import_compat","import_jsx_runtime","import_jsx_runtime","import_hooks","import_jsx_runtime","import_hooks","import_jsx_runtime","isProduction","_a","render","render","import_hooks","import_signals","current","dpr","innerWidth","innerHeight","cleanup","import_jsx_runtime","isProduction","import_hooks","import_jsx_runtime","isProduction","import_jsx_runtime","import_jsx_runtime","import_compat","import_hooks","import_jsx_runtime","timeout","expanded","import_jsx_runtime","import_jsx_runtime","render","log","import_jsx_runtime","timeout","import_jsx_runtime","import_bippy","import_hooks","import_jsx_runtime","lerp","start","ctx","canvas","animationFrame","lerp","cleanup","import_hooks","import_jsx_runtime","e","dimensions","import_jsx_runtime","e","import_jsx_runtime","onRender","shadowRoot","import_bippy","ReactScanInternals","Store","child","fps","frameCount","updateFPS","_a","import_bippy","STORAGE_KEY","scanInstance","ctx","_a","scan"]}