'use client' /** * — the one component. * * Drop it once into the app root; it installs error/console capture with * backend ingest AND renders the floating debug button + panel. Replaces the * old MonitorProvider + DebugButton + monitorBridge trio. * * @example * // app/layout.tsx (or BaseApp) * import { Devtools } from '@djangocfg/devtools' * * */ import React, { memo, useEffect } from 'react' import { devtools } from './instance' import { DevtoolsButton } from './panel/DevtoolsButton' import type { DevtoolsPanelProps } from './panel/DevtoolsPanel' import type { DevtoolsConfig } from './types' export interface DevtoolsProps extends DevtoolsConfig { /** Panel customization (custom tabs, position, size) */ panel?: DevtoolsPanelProps /** Hide the debug button entirely (capture + ingest still run). `?debug=1` overrides. */ button?: boolean children?: React.ReactNode } function DevtoolsRaw({ panel, button, children, ...config }: DevtoolsProps) { useEffect(() => { devtools.init(config) return () => devtools.destroy() // Init once per mount — config is captured in the closure. // eslint-disable-next-line react-hooks/exhaustive-deps }, []) return ( <> {children} ) } export const Devtools = memo(DevtoolsRaw)