@okyrychenko-dev/react-action-guard-devtools 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,8 +31,8 @@ pnpm add @okyrychenko-dev/react-action-guard-devtools
31
31
 
32
32
  This package requires the following peer dependencies:
33
33
 
34
- - [@okyrychenko-dev/react-action-guard](https://github.com/okyrychenko-dev/react-action-guard) ^0.5.0
35
- - [React](https://react.dev/) ^17.0.0 || ^18.0.0 || ^19.0.0
34
+ - [@okyrychenko-dev/react-action-guard](https://github.com/okyrychenko-dev/react-action-guard) ^0.7.0
35
+ - [React](https://react.dev/) ^18.0.0 || ^19.0.0
36
36
 
37
37
  ## Quick Start
38
38
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/store/devtoolsStore.constants.ts","../src/store/devtoolsStore.actions.ts","../src/store/devtoolsStore.store.ts","../src/store/devtoolsStore.selectors.ts","../src/middleware/devtoolsMiddleware.ts","../src/components/actionGuardDevtools/ActionGuardDevtools.utils.ts","../src/styles/position.module.css","../src/components/devtoolsPanel/DevtoolsPanel.module.css","../src/components/devtoolsPanel/DevtoolsPanel.utils.ts","../src/components/activeBlockers/ActiveBlockers.utils.ts","../src/icons/Icon.utils.tsx","../src/icons/Block.tsx","../src/icons/Close.tsx","../src/icons/Minimize.tsx","../src/icons/Pause.tsx","../src/icons/Play.tsx","../src/icons/Shield.tsx","../src/icons/Trash.tsx","../src/styles/tokens.ts","../src/styles/shared.module.css","../src/components/shared/Badge.tsx","../src/components/shared/Content.tsx","../src/components/shared/EmptyState.tsx","../src/components/shared/ErrorBoundary.tsx","../src/components/shared/EventBadge.tsx","../src/components/shared/IconButton.tsx","../src/components/activeBlockers/ActiveBlockers.module.css","../src/components/activeBlockers/ActiveBlockersEmptyState.tsx","../src/components/activeBlockers/ActiveBlockerItem.tsx","../src/components/activeBlockers/ActiveBlockersList.tsx","../src/components/activeBlockers/ActiveBlockers.tsx","../src/components/eventDetails/EventDetails.module.css","../src/components/eventItem/EventItem.module.css","../src/components/eventItem/EventItem.utils.ts","../src/components/eventItem/EventItemDetails.tsx","../src/components/eventItem/EventItemHeader.tsx","../src/components/eventItem/EventItem.tsx","../src/components/eventDetails/EventDetails.utils.ts","../src/components/eventDetails/EventDetailsContent.tsx","../src/components/eventDetails/EventDetailsHeader.tsx","../src/components/eventDetails/EventDetails.tsx","../src/components/timeline/Timeline.utils.ts","../src/components/timeline/Timeline.module.css","../src/components/timeline/TimelineContent.tsx","../src/components/timeline/TimelineEmptyState.tsx","../src/components/timeline/TimelineToolbar.tsx","../src/components/timeline/Timeline.tsx","../src/components/devtoolsPanel/DevtoolsPanelContent.tsx","../src/icons/Maximize.tsx","../src/components/devtoolsPanel/DevtoolsPanelHeader.utils.ts","../src/components/devtoolsPanel/DevtoolsPanelHeader.tsx","../src/components/devtoolsPanel/DevtoolsPanelTabs.utils.ts","../src/components/devtoolsPanel/DevtoolsPanelTabs.tsx","../src/components/devtoolsPanel/DevtoolsPanel.tsx","../src/components/toggleButton/ToggleButton.module.css","../src/components/toggleButton/ToggleButton.utils.ts","../src/components/toggleButton/ToggleButtonBadge.utils.ts","../src/components/toggleButton/ToggleButtonBadge.tsx","../src/components/toggleButton/ToggleButton.tsx","../src/components/actionGuardDevtools/ActionGuardDevtoolsContent.tsx","../src/components/actionGuardDevtools/ActionGuardDevtools.tsx"],"names":["createShallowStore","clsx","jsx","Component","jsxs","uiBlockingStoreApi","useStore","useMemo","ActiveBlockers_default","formatScope","EventItem_default","memo","EventDetails_default","useShallow","useEffect","useCallback","Fragment","Timeline_default","DevtoolsPanel_default","getPositionClass","ToggleButton_default","useRef","isOpen","setOpen","togglePause","clearEvents"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { DevtoolsFilter } from \"../types/devtools.types\";\n\nexport const DEFAULT_FILTER: DevtoolsFilter = {\n actions: [\"add\", \"remove\", \"update\", \"timeout\", \"clear\", \"clear_scope\"],\n scopes: [],\n search: \"\",\n};\n\nexport const createDefaultFilter = (): DevtoolsFilter => ({\n actions: [...DEFAULT_FILTER.actions],\n scopes: [...DEFAULT_FILTER.scopes],\n search: DEFAULT_FILTER.search,\n});\n\nexport const DEFAULT_MAX_EVENTS = 200;\n\nexport const DEFAULT_TAB = \"timeline\" as const;\n","import { DEFAULT_MAX_EVENTS, DEFAULT_TAB, createDefaultFilter } from \"./devtoolsStore.constants\";\nimport type { DevtoolsEvent, DevtoolsStore } from \"../types/devtools.types\";\nimport type { StateCreator } from \"zustand\";\n\n/**\n * Devtools Store Slice\n *\n * Implements the state and actions for devtools management.\n * This slice follows the Zustand slice pattern for better code organization.\n */\nexport const createDevtoolsActions: StateCreator<DevtoolsStore, [], [], DevtoolsStore> = (\n set,\n get\n) => {\n let eventCounter = 0;\n\n const createEventId = (eventData: Omit<DevtoolsEvent, \"id\">): string => {\n eventCounter += 1;\n return `${String(eventData.timestamp)}-${eventData.blockerId}-${eventCounter.toString(36)}`;\n };\n\n const trimEvents = (events: Array<DevtoolsEvent>, maxEvents: number): Array<DevtoolsEvent> => {\n if (events.length <= maxEvents) {\n return events;\n }\n\n return events.slice(0, maxEvents);\n };\n\n return {\n // Initial State\n events: [],\n maxEvents: DEFAULT_MAX_EVENTS,\n isOpen: false,\n isMinimized: false,\n activeTab: DEFAULT_TAB,\n filter: createDefaultFilter(),\n selectedEventId: null,\n isPaused: false,\n\n // Actions\n /**\n * Add a new event to history\n *\n * @param eventData - Event data without ID (auto-generated)\n */\n addEvent: (eventData): void => {\n if (get().isPaused) {\n return;\n }\n\n const event: DevtoolsEvent = {\n ...eventData,\n id: createEventId(eventData),\n };\n\n set((state) => {\n const newEvents = [event, ...state.events];\n\n return { events: trimEvents(newEvents, state.maxEvents) };\n });\n },\n\n /**\n * Clear all events from history\n */\n clearEvents: (): void => {\n set({ events: [], selectedEventId: null });\n },\n\n /**\n * Toggle panel open/closed state\n */\n toggleOpen: (): void => {\n set((state) => ({ isOpen: !state.isOpen }));\n },\n\n /**\n * Set panel open state\n *\n * @param open - Whether panel should be open\n */\n setOpen: (open): void => {\n set({ isOpen: open });\n },\n\n /**\n * Toggle minimized state\n */\n toggleMinimized: (): void => {\n set((state) => ({ isMinimized: !state.isMinimized }));\n },\n\n /**\n * Set active tab\n *\n * @param tab - Tab to activate\n */\n setActiveTab: (tab): void => {\n set({ activeTab: tab, selectedEventId: null });\n },\n\n /**\n * Update filter settings (partial update)\n *\n * @param filterUpdate - Partial filter update\n */\n setFilter: (filterUpdate): void => {\n set((state) => ({\n filter: { ...state.filter, ...filterUpdate },\n }));\n },\n\n /**\n * Reset filters to default\n */\n resetFilter: (): void => {\n set({ filter: createDefaultFilter() });\n },\n\n /**\n * Select an event for detail view\n *\n * @param eventId - Event ID to select (null to deselect)\n */\n selectEvent: (eventId): void => {\n set({ selectedEventId: eventId });\n },\n\n /**\n * Toggle pause state (stops/resumes recording)\n */\n togglePause: (): void => {\n set((state) => ({ isPaused: !state.isPaused }));\n },\n\n /**\n * Set maximum events limit\n *\n * @param max - Maximum number of events to keep\n */\n setMaxEvents: (max): void => {\n set((state) => ({\n maxEvents: max,\n events: trimEvents(state.events, max),\n }));\n },\n };\n};\n","import {\n type ShallowStoreBindings,\n createShallowStore,\n} from \"@okyrychenko-dev/react-zustand-toolkit\";\nimport { createDevtoolsActions } from \"./devtoolsStore.actions\";\nimport type { DevtoolsStore } from \"../types/devtools.types\";\n\n/**\n * Devtools Store\n *\n * Global Zustand store for managing devtools state across the application.\n *\n * Features:\n * - Event history with circular buffer\n * - Timeline filtering by action/scope/search\n * - Pause/resume recording\n * - Panel open/minimize states\n * - Automatic shallow comparison for selectors\n */\nconst {\n useStore: useDevtoolsStore,\n useStoreApi: devtoolsStoreApi,\n}: ShallowStoreBindings<DevtoolsStore> = createShallowStore<DevtoolsStore>(createDevtoolsActions);\n\nexport { useDevtoolsStore, devtoolsStoreApi };\n","import { DevtoolsEvent, DevtoolsStore } from \"../types\";\n\ntype ScopeValue = string | ReadonlyArray<string> | undefined;\n\nfunction normalizeScopes(scope: ScopeValue): ReadonlyArray<string> {\n if (!scope) {\n return [];\n }\n\n if (typeof scope === \"string\") {\n return [scope];\n }\n\n return scope;\n}\n\nfunction matchesActionFilter(\n event: DevtoolsEvent,\n actions: DevtoolsStore[\"filter\"][\"actions\"]\n): boolean {\n return actions.length === 0 || actions.includes(event.action);\n}\n\nfunction matchesScopeFilter(event: DevtoolsEvent, scopes: Array<string>): boolean {\n if (scopes.length === 0) {\n return true;\n }\n\n const eventScopes = normalizeScopes(event.config?.scope);\n if (eventScopes.length === 0) {\n return false;\n }\n\n return eventScopes.some((scope) => scopes.includes(scope));\n}\n\nfunction matchesSearchQuery(event: DevtoolsEvent, search: string): boolean {\n if (!search) {\n return true;\n }\n\n const searchLower = search.toLowerCase();\n const matchesId = event.blockerId.toLowerCase().includes(searchLower);\n const matchesReason = (event.config?.reason ?? \"\").toLowerCase().includes(searchLower);\n const matchesScope = normalizeScopes(event.config?.scope).some((scope) =>\n scope.toLowerCase().includes(searchLower)\n );\n\n return matchesId || matchesReason || matchesScope;\n}\n\n/**\n * Selector for filtered events\n */\nexport function selectFilteredEvents(state: DevtoolsStore): Array<DevtoolsEvent> {\n const { events, filter } = state;\n\n return events.filter((event) => {\n return (\n matchesActionFilter(event, filter.actions) &&\n matchesScopeFilter(event, filter.scopes) &&\n matchesSearchQuery(event, filter.search)\n );\n });\n}\n\n/**\n * Get unique scopes from all events (for filter dropdown)\n */\nexport function selectUniqueScopes(state: DevtoolsStore): Array<string> {\n const scopes = new Set<string>();\n\n state.events.forEach((event) => {\n normalizeScopes(event.config?.scope).forEach((scope) => scopes.add(scope));\n });\n\n return Array.from(scopes).sort();\n}\n\nexport function selectAllEvents(state: DevtoolsStore): Array<DevtoolsEvent> {\n return state.events;\n}\n","import { devtoolsStoreApi } from \"../store\";\nimport type { Middleware, MiddlewareContext } from \"@okyrychenko-dev/react-action-guard\";\n\nexport const DEVTOOLS_MIDDLEWARE_NAME = \"action-guard-devtools\";\n\n/**\n * Creates the devtools middleware that records events\n */\nexport function createDevtoolsMiddleware(): Middleware {\n // Track add timestamps for duration calculation\n const addTimestamps = new Map<string, number>();\n const terminalActions = new Set<MiddlewareContext[\"action\"]>([\n \"remove\",\n \"timeout\",\n \"clear\",\n \"clear_scope\",\n ]);\n\n const getDuration = (\n action: MiddlewareContext[\"action\"],\n blockerId: string,\n timestamp: number\n ): number | undefined => {\n if (!terminalActions.has(action)) {\n return undefined;\n }\n\n const addTime = addTimestamps.get(blockerId);\n if (addTime === undefined) {\n return undefined;\n }\n\n addTimestamps.delete(blockerId);\n return timestamp - addTime;\n };\n\n return (context: MiddlewareContext): void => {\n const { addEvent } = devtoolsStoreApi.getState();\n\n // Track when blockers are added\n if (context.action === \"add\") {\n addTimestamps.set(context.blockerId, context.timestamp);\n }\n\n // Calculate duration for terminal events\n const duration = getDuration(context.action, context.blockerId, context.timestamp);\n\n // Record the event\n addEvent({\n action: context.action,\n blockerId: context.blockerId,\n config: context.config,\n timestamp: context.timestamp,\n prevState: context.prevState,\n duration,\n });\n };\n}\n","export type DevtoolsKeyboardAction = \"close\" | \"togglePause\" | \"clearEvents\";\n\nexport interface DevtoolsKeyboardResult {\n action: DevtoolsKeyboardAction;\n preventDefault: boolean;\n}\n\nfunction isTypingTarget(target: EventTarget | null): boolean {\n return target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement;\n}\n\nexport function getDevtoolsKeyboardAction(\n event: KeyboardEvent,\n isOpen: boolean\n): DevtoolsKeyboardResult | null {\n if (!isOpen) {\n return null;\n }\n\n if (isTypingTarget(event.target)) {\n return null;\n }\n\n switch (event.key) {\n case \"Escape\":\n return { action: \"close\", preventDefault: false };\n case \" \":\n return { action: \"togglePause\", preventDefault: true };\n case \"c\":\n case \"C\":\n if (!event.metaKey && !event.ctrlKey) {\n return { action: \"clearEvents\", preventDefault: false };\n }\n return null;\n default:\n return null;\n }\n}\n",".positionBase {\n position: fixed;\n}\n\n.positionLeft {\n bottom: 16px;\n left: 16px;\n}\n\n.positionRight {\n bottom: 16px;\n right: 16px;\n}\n\n.overlayLayer {\n z-index: 100000;\n}\n",".panel {\n width: 420px;\n background: var(--ag-bg);\n border: 1px solid var(--ag-border);\n border-radius: 8px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Monaco, Consolas, monospace;\n font-size: 12px;\n color: var(--ag-text);\n}\n\n.panelExpanded {\n top: 16px;\n}\n\n.panelMinimized {\n height: auto;\n top: auto;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--ag-bg-light);\n border-bottom: 1px solid var(--ag-border);\n}\n\n.headerTitle {\n font-weight: 600;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.headerCount {\n margin-left: 4px;\n}\n\n.headerActions {\n display: flex;\n gap: 4px;\n}\n\n.pauseButtonActive {\n color: var(--ag-warning);\n}\n\n.tabs {\n display: flex;\n border-bottom: 1px solid var(--ag-border);\n}\n\n.tab {\n flex: 1;\n padding: 8px 12px;\n border: none;\n background: transparent;\n color: var(--ag-text-muted);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n transition:\n color 0.15s,\n background 0.15s;\n}\n\n.tabActive {\n color: var(--ag-primary);\n background: var(--ag-bg-light);\n border-bottom: 2px solid var(--ag-primary);\n}\n","import { clsx } from \"clsx\";\nimport positionStyles from \"../../styles/position.module.css\";\nimport styles from \"./DevtoolsPanel.module.css\";\nimport type { DevtoolsPosition } from \"../../types\";\n\nexport function getPositionClass(position: DevtoolsPosition): string {\n return position === \"left\" ? positionStyles.positionLeft : positionStyles.positionRight;\n}\n\nexport function getPanelClassName(position: DevtoolsPosition, isMinimized: boolean): string {\n return clsx(\n styles.panel,\n positionStyles.positionBase,\n getPositionClass(position),\n positionStyles.overlayLayer,\n isMinimized ? styles.panelMinimized : styles.panelExpanded\n );\n}\n","import type { StoredBlocker } from \"@okyrychenko-dev/react-action-guard\";\n\nexport function formatScope(scope: string | ReadonlyArray<string>): string {\n if (Array.isArray(scope)) {\n return scope.join(\", \");\n }\n\n return scope as string;\n}\n\nexport function formatTimestamp(timestamp: number): string {\n const seconds = Math.floor((Date.now() - timestamp) / 1000);\n if (seconds < 60) {\n return `${String(seconds)}s ago`;\n }\n if (seconds < 3600) {\n return `${String(Math.floor(seconds / 60))}m ago`;\n }\n return `${String(Math.floor(seconds / 3600))}h ago`;\n}\n\nexport function getSortedBlockers(\n activeBlockers: ReadonlyMap<string, StoredBlocker>\n): Array<[string, StoredBlocker]> {\n return Array.from(activeBlockers.entries()).sort(([, a], [, b]) => b.priority - a.priority);\n}\n","import { ReactElement, ReactNode, SVGProps } from \"react\";\nimport { IconProps } from \"./Icon.types\";\n\nexport function createSvgIcon(\n children: ReactNode,\n { viewBox = \"0 0 24 24\" }: SVGProps<SVGSVGElement> = {}\n) {\n return function SvgIcon(props: IconProps): ReactElement {\n const { size = 16, color = \"currentColor\" } = props;\n\n return (\n <svg width={size} height={size} viewBox={viewBox} fill={color}>\n {children}\n </svg>\n );\n };\n}\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const BlockIcon = createSvgIcon(\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2M4 12c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69L5.69 16.9C4.63 15.55 4 13.85 4 12m8 8c-1.85 0-3.55-.63-4.9-1.69L18.31 7.1C19.37 8.45 20 10.15 20 12c0 4.42-3.58 8-8 8\" />\n);\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const CloseIcon = createSvgIcon(\n <path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n);\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const MinimizeIcon = createSvgIcon(<path d=\"M6 19h12v2H6z\" />);\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const PauseIcon = createSvgIcon(<path d=\"M6 19h4V5H6zm8-14v14h4V5z\" />);\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const PlayIcon = createSvgIcon(<path d=\"M10 8.64 15.27 12 10 15.36zM8 5v14l11-7z\" />);\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const ShieldIcon = createSvgIcon(\n <path d=\"M12 2 4 5v6.09c0 5.05 3.41 9.76 8 10.91 4.59-1.15 8-5.86 8-10.91V5zm6 9.09c0 4-2.55 7.7-6 8.83-3.45-1.13-6-4.82-6-8.83v-4.7l6-2.25 6 2.25z\" />\n);\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const TrashIcon = createSvgIcon(\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM8 9h8v10H8zm7.5-5-1-1h-5l-1 1H5v2h14V4z\" />\n);\n","export const COLORS = {\n bgHover: \"var(--ag-bg-hover)\",\n bgLight: \"var(--ag-bg-light)\",\n primary: \"var(--ag-primary)\",\n success: \"var(--ag-success)\",\n textDim: \"var(--ag-text-dim)\",\n textMuted: \"var(--ag-text-muted)\",\n warning: \"var(--ag-warning)\",\n} as const;\n\nexport const ACTION_COLORS: Record<string, string> = {\n add: \"rgb(var(--ag-success-rgb))\",\n remove: \"rgb(var(--ag-error-rgb))\",\n update: \"rgb(var(--ag-info-rgb))\",\n timeout: \"rgb(var(--ag-warning-rgb))\",\n clear: \"rgb(var(--ag-info-rgb) / 0.8)\",\n clear_scope: \"rgb(var(--ag-info-rgb) / 0.8)\",\n};\n\nexport const ACTION_COLOR_BACKGROUNDS: Record<string, string> = {\n add: \"rgb(var(--ag-success-rgb) / 0.13)\",\n remove: \"rgb(var(--ag-error-rgb) / 0.13)\",\n update: \"rgb(var(--ag-info-rgb) / 0.13)\",\n timeout: \"rgb(var(--ag-warning-rgb) / 0.13)\",\n clear: \"rgb(var(--ag-info-rgb) / 0.1)\",\n clear_scope: \"rgb(var(--ag-info-rgb) / 0.1)\",\n};\n\nexport const MUTED_COLOR_BACKGROUND = \"rgb(var(--ag-text-muted-rgb) / 0.13)\";\n",".badge {\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n background: var(--ag-primary);\n color: var(--ag-text);\n}\n\n.iconButton {\n width: 28px;\n height: 28px;\n border-radius: 4px;\n border: none;\n background: transparent;\n color: var(--ag-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition:\n background 0.15s,\n color 0.15s;\n}\n\n.emptyState {\n padding: 32px;\n text-align: center;\n color: var(--ag-text-muted);\n}\n\n.content {\n flex: 1;\n overflow: auto;\n min-height: 200px;\n}\n\n.eventBadge {\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.eventBadgeAction {\n background: rgb(var(--ag-text-muted-rgb) / 0.13);\n color: var(--ag-text-muted);\n}\n\n.eventBadgeAction[data-action=\"add\"] {\n background: rgb(var(--ag-success-rgb) / 0.13);\n color: rgb(var(--ag-success-rgb));\n}\n\n.eventBadgeAction[data-action=\"remove\"] {\n background: rgb(var(--ag-error-rgb) / 0.13);\n color: rgb(var(--ag-error-rgb));\n}\n\n.eventBadgeAction[data-action=\"update\"] {\n background: rgb(var(--ag-info-rgb) / 0.13);\n color: rgb(var(--ag-info-rgb));\n}\n\n.eventBadgeAction[data-action=\"timeout\"] {\n background: rgb(var(--ag-warning-rgb) / 0.13);\n color: rgb(var(--ag-warning-rgb));\n}\n\n.eventBadgeAction[data-action=\"clear\"],\n.eventBadgeAction[data-action=\"clear_scope\"] {\n background: rgb(var(--ag-info-rgb) / 0.1);\n color: rgb(var(--ag-info-rgb) / 0.8);\n}\n\n.errorBoundary {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 24px;\n gap: 8px;\n color: var(--ag-text-muted);\n}\n\n.errorTitle {\n font-weight: 600;\n color: rgb(var(--ag-error-rgb));\n}\n\n.errorMessage {\n font-size: 12px;\n opacity: 0.8;\n}\n","import { clsx } from \"clsx\";\nimport { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport sharedStyles from \"../../styles/shared.module.css\";\n\ninterface BadgeProps {\n children: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\nfunction Badge(props: BadgeProps): ReactElement {\n const { children, className, style } = props;\n\n return (\n <span className={clsx(sharedStyles.badge, className)} style={style}>\n {children}\n </span>\n );\n}\n\nexport default Badge;\n","import { clsx } from \"clsx\";\nimport { ReactElement, ReactNode } from \"react\";\nimport sharedStyles from \"../../styles/shared.module.css\";\n\ninterface ContentProps {\n children: ReactNode;\n className?: string;\n}\n\nfunction Content(props: ContentProps): ReactElement {\n const { children, className } = props;\n\n return <div className={clsx(sharedStyles.content, className)}>{children}</div>;\n}\n\nexport default Content;\n","import { clsx } from \"clsx\";\nimport { ReactElement, ReactNode } from \"react\";\nimport sharedStyles from \"../../styles/shared.module.css\";\n\ninterface EmptyStateProps {\n children: ReactNode;\n className?: string;\n}\n\nfunction EmptyState(props: EmptyStateProps): ReactElement {\n const { children, className } = props;\n\n return <div className={clsx(sharedStyles.emptyState, className)}>{children}</div>;\n}\n\nexport default EmptyState;\n","import { Component, ReactNode } from \"react\";\nimport sharedStyles from \"../../styles/shared.module.css\";\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nclass ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n render(): ReactNode {\n const { hasError, error } = this.state;\n const { children, fallback } = this.props;\n\n if (hasError) {\n if (fallback) {\n return fallback;\n }\n\n return (\n <div className={sharedStyles.errorBoundary}>\n <span className={sharedStyles.errorTitle}>Devtools Error</span>\n <span className={sharedStyles.errorMessage}>{error?.message ?? \"Unknown error\"}</span>\n </div>\n );\n }\n\n return children;\n }\n}\n\nexport default ErrorBoundary;\n","import { clsx } from \"clsx\";\nimport { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport sharedStyles from \"../../styles/shared.module.css\";\n\ninterface EventBadgeProps {\n children: ReactNode;\n className?: string;\n style?: CSSProperties;\n action?: string;\n}\n\nfunction EventBadge(props: EventBadgeProps): ReactElement {\n const { children, className, style, action } = props;\n\n const classes = clsx(sharedStyles.eventBadge, action && sharedStyles.eventBadgeAction, className);\n\n return (\n <span className={classes} style={style} data-action={action}>\n {children}\n </span>\n );\n}\n\nexport default EventBadge;\n","import { clsx } from \"clsx\";\nimport { ButtonHTMLAttributes, ReactElement } from \"react\";\nimport sharedStyles from \"../../styles/shared.module.css\";\n\ntype IconButtonProps = ButtonHTMLAttributes<HTMLButtonElement>;\n\nfunction IconButton(props: IconButtonProps): ReactElement {\n const { children, className, type = \"button\", ...others } = props;\n\n return (\n <button type={type} className={clsx(sharedStyles.iconButton, className)} {...others}>\n {children}\n </button>\n );\n}\n\nexport default IconButton;\n",".blockerItem {\n padding: 10px 12px;\n border-bottom: 1px solid var(--ag-border);\n}\n\n.blockerHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 6px;\n}\n\n.blockerId {\n font-weight: 600;\n color: var(--ag-primary);\n}\n\n.blockerMeta {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 11px;\n color: var(--ag-text-muted);\n}\n\n.activeBadge {\n background: var(--ag-success);\n}\n\n.emptyIcon {\n display: inline-flex;\n}\n\n.emptyTitle {\n margin-top: 12px;\n}\n\n.emptySubtext {\n font-size: 11px;\n margin-top: 4px;\n}\n","import { ReactElement } from \"react\";\nimport { BlockIcon } from \"../../icons\";\nimport { COLORS } from \"../../styles/tokens\";\nimport { EmptyState } from \"../shared\";\nimport styles from \"./ActiveBlockers.module.css\";\n\nfunction ActiveBlockersEmptyState(): ReactElement {\n return (\n <EmptyState>\n <span className={styles.emptyIcon}>\n <BlockIcon size={32} color={COLORS.textDim} />\n </span>\n <p className={styles.emptyTitle}>No active blockers</p>\n <p className={styles.emptySubtext}>The UI is currently unblocked.</p>\n </EmptyState>\n );\n}\n\nexport default ActiveBlockersEmptyState;\n","import { StoredBlocker } from \"@okyrychenko-dev/react-action-guard\";\nimport { ReactElement } from \"react\";\nimport { Badge } from \"../shared\";\nimport styles from \"./ActiveBlockers.module.css\";\nimport { formatScope, formatTimestamp } from \"./ActiveBlockers.utils\";\n\ninterface BlockerItemProps {\n id: string;\n blocker: StoredBlocker;\n}\n\nfunction ActiveBlockerItem(props: BlockerItemProps): ReactElement {\n const { id, blocker } = props;\n\n return (\n <div className={styles.blockerItem}>\n <div className={styles.blockerHeader}>\n <span className={styles.blockerId}>{id}</span>\n <Badge className={styles.activeBadge}>Active</Badge>\n </div>\n <div className={styles.blockerMeta}>\n <span>Scope: {formatScope(blocker.scope)}</span>\n <span>Priority: {blocker.priority}</span>\n <span>Reason: {blocker.reason}</span>\n <span>Started: {formatTimestamp(blocker.timestamp)}</span>\n </div>\n </div>\n );\n}\n\nexport default ActiveBlockerItem;\n","import { ReactElement } from \"react\";\nimport { Content } from \"../shared\";\nimport ActiveBlockerItem from \"./ActiveBlockerItem\";\nimport type { StoredBlocker } from \"@okyrychenko-dev/react-action-guard\";\n\ninterface ActiveBlockersListProps {\n blockers: Array<[string, StoredBlocker]>;\n}\n\nfunction ActiveBlockersList(props: ActiveBlockersListProps): ReactElement {\n const { blockers } = props;\n\n return (\n <Content>\n {blockers.map(([id, blocker]) => (\n <ActiveBlockerItem key={id} id={id} blocker={blocker} />\n ))}\n </Content>\n );\n}\n\nexport default ActiveBlockersList;\n","import { uiBlockingStoreApi } from \"@okyrychenko-dev/react-action-guard\";\nimport { ReactElement, useMemo } from \"react\";\nimport { useStore } from \"zustand\";\nimport { getSortedBlockers } from \"./ActiveBlockers.utils\";\nimport ActiveBlockersEmptyState from \"./ActiveBlockersEmptyState\";\nimport ActiveBlockersList from \"./ActiveBlockersList\";\nimport type { UIBlockingStoreApi } from \"../actionGuardDevtools\";\n\ninterface ActiveBlockersProps {\n store?: UIBlockingStoreApi;\n}\n\nfunction ActiveBlockers(props: ActiveBlockersProps): ReactElement {\n const { store } = props;\n\n // Single subscription - use provided store or fall back to global\n const targetStore = store ?? uiBlockingStoreApi;\n const activeBlockers = useStore(targetStore, (state) => state.activeBlockers);\n\n const blockers = useMemo(() => getSortedBlockers(activeBlockers), [activeBlockers]);\n\n if (blockers.length === 0) {\n return <ActiveBlockersEmptyState />;\n }\n\n return <ActiveBlockersList blockers={blockers} />;\n}\n\nexport default ActiveBlockers;\n",".panel {\n background: var(--ag-bg-light);\n border-top: 1px solid var(--ag-border);\n padding: 12px;\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n.content {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.section {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.label {\n font-size: 10px;\n font-weight: 600;\n color: var(--ag-text-dim);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.value {\n font-size: 12px;\n color: var(--ag-text);\n word-break: break-all;\n}\n\n.mutedInline {\n color: var(--ag-text-dim);\n margin-left: 8px;\n}\n\n.mutedLabel {\n color: var(--ag-text-dim);\n}\n\n.config {\n font-size: 11px;\n color: var(--ag-text-muted);\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding-left: 8px;\n border-left: 2px solid var(--ag-border);\n}\n",".eventItem {\n padding: 8px 12px;\n border-bottom: 1px solid var(--ag-border);\n cursor: pointer;\n transition: background 0.15s;\n background: transparent;\n}\n\n.eventItem:hover {\n background: var(--ag-bg-hover);\n}\n\n.selected {\n background: var(--ag-bg-light);\n}\n\n.selected:hover {\n background: var(--ag-bg-light);\n}\n\n.eventHeader {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n}\n\n.eventBlockerId {\n font-weight: 500;\n color: var(--ag-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n}\n\n.eventTime {\n font-size: 10px;\n color: var(--ag-text-dim);\n}\n\n.eventDetails {\n font-size: 11px;\n color: var(--ag-text-muted);\n display: flex;\n gap: 12px;\n}\n","export function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${String(ms)}ms`;\n }\n\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\nexport function formatScope(scope?: string | ReadonlyArray<string>): string {\n if (!scope) {\n return \"global\";\n }\n\n if (Array.isArray(scope)) {\n return scope.join(\", \");\n }\n\n return scope as string;\n}\n\nexport function formatTime(timestamp: number): string {\n const date = new Date(timestamp);\n\n return date.toLocaleTimeString(\"en-US\", {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n}\n","import { ReactElement } from \"react\";\nimport styles from \"./EventItem.module.css\";\nimport { formatDuration, formatScope } from \"./EventItem.utils\";\nimport type { DevtoolsEvent } from \"../../types\";\n\ninterface EventItemDetailsProps {\n event: DevtoolsEvent;\n}\n\nfunction EventItemDetails(props: EventItemDetailsProps): ReactElement {\n const { event } = props;\n const { config, duration } = event;\n\n return (\n <div className={styles.eventDetails}>\n <span>scope: {formatScope(config?.scope)}</span>\n {duration !== undefined && <span>duration: {formatDuration(duration)}</span>}\n {config?.priority !== undefined && <span>priority: {config.priority}</span>}\n </div>\n );\n}\n\nexport default EventItemDetails;\n","import { ReactElement } from \"react\";\nimport { EventBadge } from \"../shared\";\nimport styles from \"./EventItem.module.css\";\nimport { formatTime } from \"./EventItem.utils\";\nimport type { DevtoolsEvent } from \"../../types\";\n\ninterface EventItemHeaderProps {\n event: DevtoolsEvent;\n}\n\nfunction EventItemHeader(props: EventItemHeaderProps): ReactElement {\n const { event } = props;\n const { action, blockerId, timestamp } = event;\n\n return (\n <div className={styles.eventHeader}>\n <EventBadge action={action}>{action}</EventBadge>\n <span className={styles.eventBlockerId}>{blockerId}</span>\n <span className={styles.eventTime}>{formatTime(timestamp)}</span>\n </div>\n );\n}\n\nexport default EventItemHeader;\n","import { clsx } from \"clsx\";\nimport { ReactElement, memo } from \"react\";\nimport styles from \"./EventItem.module.css\";\nimport EventItemDetails from \"./EventItemDetails\";\nimport EventItemHeader from \"./EventItemHeader\";\nimport type { DevtoolsEvent } from \"../../types\";\n\ninterface EventItemProps {\n event: DevtoolsEvent;\n selected: boolean;\n onSelect: (eventId: string | null) => void;\n}\n\nfunction EventItem(props: EventItemProps): ReactElement {\n const { event, selected, onSelect } = props;\n\n const handleSelect = (): void => {\n onSelect(selected ? null : event.id);\n };\n\n return (\n <li className={clsx(styles.eventItem, selected && styles.selected)} onClick={handleSelect}>\n <EventItemHeader event={event} />\n <EventItemDetails event={event} />\n </li>\n );\n}\n\nexport default memo(EventItem);\n","export function formatFullTimestamp(timestamp: number): string {\n const date = new Date(timestamp);\n\n return date.toLocaleString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n}\n\nexport function formatRelativeTime(timestamp: number): string {\n const seconds = Math.floor((Date.now() - timestamp) / 1000);\n\n if (seconds < 60) {\n return `${String(seconds)}s ago`;\n }\n\n if (seconds < 3600) {\n return `${String(Math.floor(seconds / 60))}m ago`;\n }\n\n return `${String(Math.floor(seconds / 3600))}h ago`;\n}\n","import { ReactElement } from \"react\";\nimport { formatDuration, formatScope } from \"../eventItem\";\nimport styles from \"./EventDetails.module.css\";\nimport { formatFullTimestamp, formatRelativeTime } from \"./EventDetails.utils\";\nimport type { DevtoolsEvent } from \"../../types\";\n\ninterface EventDetailsContentProps {\n event: DevtoolsEvent;\n}\n\nfunction EventDetailsContent(props: EventDetailsContentProps): ReactElement {\n const { event } = props;\n\n return (\n <div className={styles.content}>\n <div className={styles.section}>\n <div className={styles.label}>Blocker ID</div>\n <div className={styles.value}>{event.blockerId}</div>\n </div>\n\n <div className={styles.section}>\n <div className={styles.label}>Timestamp</div>\n <div className={styles.value}>\n {formatFullTimestamp(event.timestamp)}\n <span className={styles.mutedInline}>({formatRelativeTime(event.timestamp)})</span>\n </div>\n </div>\n\n {event.duration !== undefined && (\n <div className={styles.section}>\n <div className={styles.label}>Duration</div>\n <div className={styles.value}>{formatDuration(event.duration)}</div>\n </div>\n )}\n\n {event.config && (\n <div className={styles.section}>\n <div className={styles.label}>Config</div>\n <div className={styles.config}>\n {event.config.scope !== undefined && (\n <div>\n <span className={styles.mutedLabel}>scope: </span>\n {formatScope(event.config.scope)}\n </div>\n )}\n {event.config.reason !== undefined && (\n <div>\n <span className={styles.mutedLabel}>reason: </span>\n {event.config.reason}\n </div>\n )}\n {event.config.priority !== undefined && (\n <div>\n <span className={styles.mutedLabel}>priority: </span>\n {event.config.priority}\n </div>\n )}\n </div>\n </div>\n )}\n\n {event.prevState && (\n <div className={styles.section}>\n <div className={styles.label}>Previous State</div>\n <div className={styles.config}>\n {event.prevState.scope !== undefined && (\n <div>\n <span className={styles.mutedLabel}>scope: </span>\n {formatScope(event.prevState.scope)}\n </div>\n )}\n {event.prevState.reason !== undefined && (\n <div>\n <span className={styles.mutedLabel}>reason: </span>\n {event.prevState.reason}\n </div>\n )}\n {event.prevState.priority !== undefined && (\n <div>\n <span className={styles.mutedLabel}>priority: </span>\n {event.prevState.priority}\n </div>\n )}\n </div>\n </div>\n )}\n\n {event.source && (\n <div className={styles.section}>\n <div className={styles.label}>Source</div>\n <div className={styles.value}>{event.source}</div>\n </div>\n )}\n </div>\n );\n}\n\nexport default EventDetailsContent;\n","import { ReactElement } from \"react\";\nimport { CloseIcon } from \"../../icons\";\nimport { EventBadge, IconButton } from \"../shared\";\nimport styles from \"./EventDetails.module.css\";\n\ninterface EventDetailsHeaderProps {\n action: string;\n onClose: VoidFunction;\n}\n\nfunction EventDetailsHeader(props: EventDetailsHeaderProps): ReactElement {\n const { action, onClose } = props;\n\n return (\n <div className={styles.header}>\n <EventBadge action={action}>{action}</EventBadge>\n <IconButton title=\"Close details\" onClick={onClose}>\n <CloseIcon size={16} />\n </IconButton>\n </div>\n );\n}\n\nexport default EventDetailsHeader;\n","import { ReactElement } from \"react\";\nimport styles from \"./EventDetails.module.css\";\nimport EventDetailsContent from \"./EventDetailsContent\";\nimport EventDetailsHeader from \"./EventDetailsHeader\";\nimport type { DevtoolsEvent } from \"../../types\";\n\ninterface EventDetailsProps {\n event: DevtoolsEvent;\n onClose: VoidFunction;\n}\n\nfunction EventDetails(props: EventDetailsProps): ReactElement {\n const { event, onClose } = props;\n\n return (\n <div className={styles.panel}>\n <EventDetailsHeader action={event.action} onClose={onClose} />\n <EventDetailsContent event={event} />\n </div>\n );\n}\n\nexport default EventDetails;\n","import { DEFAULT_FILTER } from \"../../store/devtoolsStore.constants\";\nimport type { DevtoolsFilter } from \"../../types\";\n\nexport function isFilterActive(filter: DevtoolsFilter): boolean {\n if (filter.search.length > 0 || filter.scopes.length > 0) {\n return true;\n }\n\n if (filter.actions.length !== DEFAULT_FILTER.actions.length) {\n return true;\n }\n\n return !DEFAULT_FILTER.actions.every((action) => filter.actions.includes(action));\n}\n",".toolbar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--ag-border);\n background: var(--ag-bg-light);\n}\n\n.searchInput {\n flex: 1;\n padding: 6px 10px;\n border-radius: 4px;\n border: 1px solid var(--ag-border);\n background: var(--ag-bg);\n color: var(--ag-text);\n font-size: 12px;\n outline: none;\n}\n\n.eventList {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.emptyHint {\n font-size: 11px;\n margin-top: 8px;\n}\n","import { ReactElement } from \"react\";\nimport { EventItem } from \"../eventItem\";\nimport { Content, EmptyState } from \"../shared\";\nimport styles from \"./Timeline.module.css\";\nimport type { DevtoolsEvent } from \"../../types\";\n\ninterface TimelineContentProps {\n events: Array<DevtoolsEvent>;\n selectedEventId: string | null;\n onSelectEvent: (eventId: string | null) => void;\n}\n\nfunction TimelineContent(props: TimelineContentProps): ReactElement {\n const { events, selectedEventId, onSelectEvent } = props;\n\n return (\n <Content>\n {events.length === 0 && <EmptyState>No matching events</EmptyState>}\n {events.length > 0 && (\n <ul className={styles.eventList}>\n {events.map((event) => (\n <EventItem\n key={event.id}\n event={event}\n selected={selectedEventId === event.id}\n onSelect={onSelectEvent}\n />\n ))}\n </ul>\n )}\n </Content>\n );\n}\n\nexport default TimelineContent;\n","import { ReactElement } from \"react\";\nimport { EmptyState } from \"../shared\";\nimport styles from \"./Timeline.module.css\";\n\nfunction TimelineEmptyState(): ReactElement {\n return (\n <EmptyState>\n <p>No events recorded yet.</p>\n <p className={styles.emptyHint}>Events will appear here as blockers are added/removed.</p>\n </EmptyState>\n );\n}\n\nexport default TimelineEmptyState;\n","import { ChangeEvent, ReactElement } from \"react\";\nimport styles from \"./Timeline.module.css\";\n\ninterface TimelineToolbarProps {\n search: string;\n onSearchChange: (event: ChangeEvent<HTMLInputElement>) => void;\n}\n\nfunction TimelineToolbar(props: TimelineToolbarProps): ReactElement {\n const { search, onSearchChange } = props;\n\n return (\n <div className={styles.toolbar}>\n <input\n type=\"text\"\n placeholder=\"Search by ID or reason...\"\n value={search}\n className={styles.searchInput}\n onChange={onSearchChange}\n />\n </div>\n );\n}\n\nexport default TimelineToolbar;\n","import { ChangeEvent, ReactElement, useCallback, useEffect } from \"react\";\nimport { useShallow } from \"zustand/react/shallow\";\nimport { selectAllEvents, selectFilteredEvents, useDevtoolsStore } from \"../../store\";\nimport { EventDetails } from \"../eventDetails\";\nimport { isFilterActive } from \"./Timeline.utils\";\nimport TimelineContent from \"./TimelineContent\";\nimport TimelineEmptyState from \"./TimelineEmptyState\";\nimport TimelineToolbar from \"./TimelineToolbar\";\n\nfunction Timeline(): ReactElement {\n const events = useDevtoolsStore(selectFilteredEvents);\n const allEvents = useDevtoolsStore(selectAllEvents);\n const { selectedEventId, selectEvent, filter, setFilter } = useDevtoolsStore(\n useShallow((state) => ({\n selectedEventId: state.selectedEventId,\n selectEvent: state.selectEvent,\n filter: state.filter,\n setFilter: state.setFilter,\n }))\n );\n\n const selectedEvent = selectedEventId ? events.find((e) => e.id === selectedEventId) : null;\n\n // Clear selection if selected event was removed from circular buffer\n useEffect(() => {\n if (selectedEventId && !allEvents.some((event) => event.id === selectedEventId)) {\n selectEvent(null);\n }\n }, [selectedEventId, allEvents, selectEvent]);\n\n const handleSearchChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n setFilter({ search: e.target.value });\n },\n [setFilter]\n );\n\n const handleCloseDetails = useCallback(() => {\n selectEvent(null);\n }, [selectEvent]);\n\n if (events.length === 0 && !isFilterActive(filter)) {\n return <TimelineEmptyState />;\n }\n\n return (\n <>\n <TimelineToolbar search={filter.search} onSearchChange={handleSearchChange} />\n <TimelineContent\n events={events}\n selectedEventId={selectedEventId}\n onSelectEvent={selectEvent}\n />\n {selectedEvent && <EventDetails event={selectedEvent} onClose={handleCloseDetails} />}\n </>\n );\n}\n\nexport default Timeline;\n","import { ReactElement } from \"react\";\nimport { ActiveBlockers } from \"../activeBlockers\";\nimport { ErrorBoundary } from \"../shared\";\nimport { Timeline } from \"../timeline\";\nimport type { DevtoolsState } from \"../../types\";\nimport type { UIBlockingStoreApi } from \"../actionGuardDevtools\";\n\ninterface DevtoolsPanelContentProps {\n activeTab: DevtoolsState[\"activeTab\"];\n store?: UIBlockingStoreApi;\n}\n\nfunction DevtoolsPanelContent(props: DevtoolsPanelContentProps): ReactElement {\n const { activeTab, store } = props;\n\n return (\n <ErrorBoundary>\n {activeTab === \"timeline\" ? <Timeline /> : <ActiveBlockers store={store} />}\n </ErrorBoundary>\n );\n}\n\nexport default DevtoolsPanelContent;\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const MaximizeIcon = createSvgIcon(<path d=\"M3 3h18v2H3z\" />);\n","import { clsx } from \"clsx\";\nimport styles from \"./DevtoolsPanel.module.css\";\n\nexport function getPauseButtonTitle(isPaused: boolean): string {\n return isPaused ? \"Resume recording\" : \"Pause recording\";\n}\n\nexport function getMinimizeButtonTitle(isMinimized: boolean): string {\n return isMinimized ? \"Maximize\" : \"Minimize\";\n}\n\nexport function getPauseButtonClassName(isPaused: boolean): string {\n return clsx(isPaused && styles.pauseButtonActive);\n}\n","import { ReactElement } from \"react\";\nimport { CloseIcon, MinimizeIcon, PauseIcon, PlayIcon, ShieldIcon, TrashIcon } from \"../../icons\";\nimport { MaximizeIcon } from \"../../icons/Maximize\";\nimport { COLORS } from \"../../styles/tokens\";\nimport { Badge, IconButton } from \"../shared\";\nimport styles from \"./DevtoolsPanel.module.css\";\nimport {\n getMinimizeButtonTitle,\n getPauseButtonClassName,\n getPauseButtonTitle,\n} from \"./DevtoolsPanelHeader.utils\";\n\ninterface DevtoolsPanelHeaderProps {\n eventsCount: number;\n isPaused: boolean;\n isMinimized: boolean;\n onTogglePause: VoidFunction;\n onClearEvents: VoidFunction;\n onToggleMinimized: VoidFunction;\n onClose: VoidFunction;\n}\n\nfunction DevtoolsPanelHeader(props: DevtoolsPanelHeaderProps): ReactElement {\n const {\n eventsCount,\n isPaused,\n isMinimized,\n onTogglePause,\n onClearEvents,\n onToggleMinimized,\n onClose,\n } = props;\n\n return (\n <div className={styles.header}>\n <div className={styles.headerTitle}>\n <ShieldIcon size={16} color={COLORS.primary} />\n <span>Action Guard</span>\n <Badge className={styles.headerCount}>{eventsCount}</Badge>\n </div>\n <div className={styles.headerActions}>\n <IconButton\n className={getPauseButtonClassName(isPaused)}\n title={getPauseButtonTitle(isPaused)}\n onClick={onTogglePause}\n >\n {isPaused ? <PlayIcon /> : <PauseIcon />}\n </IconButton>\n <IconButton title=\"Clear events\" onClick={onClearEvents}>\n <TrashIcon />\n </IconButton>\n <IconButton title={getMinimizeButtonTitle(isMinimized)} onClick={onToggleMinimized}>\n {isMinimized ? <MinimizeIcon /> : <MaximizeIcon />}\n </IconButton>\n <IconButton title=\"Close\" onClick={onClose}>\n <CloseIcon />\n </IconButton>\n </div>\n </div>\n );\n}\n\nexport default DevtoolsPanelHeader;\n","import type { DevtoolsState } from \"../../types\";\n\nexport interface DevtoolsTabConfig {\n id: DevtoolsState[\"activeTab\"];\n label: string;\n}\n\nexport const DEVTOOLS_TABS: ReadonlyArray<DevtoolsTabConfig> = [\n { id: \"timeline\", label: \"Timeline\" },\n { id: \"blockers\", label: \"Active Blockers\" },\n];\n","import { clsx } from \"clsx\";\nimport { ReactElement } from \"react\";\nimport styles from \"./DevtoolsPanel.module.css\";\nimport { DEVTOOLS_TABS } from \"./DevtoolsPanelTabs.utils\";\nimport type { DevtoolsState } from \"../../types\";\n\ninterface DevtoolsPanelTabsProps {\n activeTab: DevtoolsState[\"activeTab\"];\n onSelectTab: (tab: DevtoolsState[\"activeTab\"]) => void;\n}\n\nfunction DevtoolsPanelTabs(props: DevtoolsPanelTabsProps): ReactElement {\n const { activeTab, onSelectTab } = props;\n\n return (\n <div className={styles.tabs}>\n {DEVTOOLS_TABS.map((tab) => (\n <button\n key={tab.id}\n onClick={() => {\n onSelectTab(tab.id);\n }}\n className={clsx(styles.tab, activeTab === tab.id && styles.tabActive)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n );\n}\n\nexport default DevtoolsPanelTabs;\n","import { ReactElement } from \"react\";\nimport { useDevtoolsStore } from \"../../store\";\nimport { getPanelClassName } from \"./DevtoolsPanel.utils\";\nimport DevtoolsPanelContent from \"./DevtoolsPanelContent\";\nimport DevtoolsPanelHeader from \"./DevtoolsPanelHeader\";\nimport DevtoolsPanelTabs from \"./DevtoolsPanelTabs\";\nimport type { DevtoolsPosition } from \"../../types\";\nimport type { UIBlockingStoreApi } from \"../actionGuardDevtools\";\n\ninterface DevtoolsPanelProps {\n position: DevtoolsPosition;\n store?: UIBlockingStoreApi;\n}\n\nfunction DevtoolsPanel(props: DevtoolsPanelProps): ReactElement | null {\n const { position, store } = props;\n\n const {\n isOpen,\n isMinimized,\n activeTab,\n setActiveTab,\n toggleOpen,\n toggleMinimized,\n clearEvents,\n isPaused,\n togglePause,\n events,\n } = useDevtoolsStore();\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div className={getPanelClassName(position, isMinimized)}>\n <DevtoolsPanelHeader\n eventsCount={events.length}\n isPaused={isPaused}\n isMinimized={isMinimized}\n onTogglePause={togglePause}\n onClearEvents={clearEvents}\n onToggleMinimized={toggleMinimized}\n onClose={toggleOpen}\n />\n\n {!isMinimized && (\n <>\n <DevtoolsPanelTabs activeTab={activeTab} onSelectTab={setActiveTab} />\n <DevtoolsPanelContent activeTab={activeTab} store={store} />\n </>\n )}\n </div>\n );\n}\n\nexport default DevtoolsPanel;\n",".toggleButton {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n border: none;\n background: var(--ag-primary);\n color: var(--ag-text);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n transition: transform 0.2s, background 0.2s;\n}\n\n.badgePosition {\n position: absolute;\n top: -4px;\n right: -4px;\n}\n\n.badgeActive {\n background: var(--ag-success);\n}\n\n.badgePaused {\n background: var(--ag-warning);\n}\n","import { clsx } from \"clsx\";\nimport positionStyles from \"../../styles/position.module.css\";\nimport styles from \"./ToggleButton.module.css\";\nimport type { DevtoolsPosition } from \"../../types\";\n\nexport function getPositionClass(position: DevtoolsPosition): string {\n return position === \"left\" ? positionStyles.positionLeft : positionStyles.positionRight;\n}\n\nexport function getToggleButtonClassName(position: DevtoolsPosition): string {\n return clsx(\n styles.toggleButton,\n positionStyles.positionBase,\n getPositionClass(position),\n positionStyles.overlayLayer\n );\n}\n","import { clsx } from \"clsx\";\nimport styles from \"./ToggleButton.module.css\";\n\nexport function shouldShowBadge(count: number): boolean {\n return count > 0;\n}\n\nexport function getBadgeClassName(isPaused: boolean): string {\n return clsx(styles.badgePosition, isPaused ? styles.badgePaused : styles.badgeActive);\n}\n","import { ReactElement } from \"react\";\nimport { Badge } from \"../shared\";\nimport { getBadgeClassName, shouldShowBadge } from \"./ToggleButtonBadge.utils\";\n\ninterface ToggleButtonBadgeProps {\n count: number;\n isPaused: boolean;\n}\n\nfunction ToggleButtonBadge(props: ToggleButtonBadgeProps): ReactElement | null {\n const { count, isPaused } = props;\n\n if (!shouldShowBadge(count)) {\n return null;\n }\n\n return <Badge className={getBadgeClassName(isPaused)}>{count}</Badge>;\n}\n\nexport default ToggleButtonBadge;\n","import { uiBlockingStoreApi } from \"@okyrychenko-dev/react-action-guard\";\nimport { ReactElement } from \"react\";\nimport { useStore } from \"zustand\";\nimport { ShieldIcon } from \"../../icons\";\nimport { useDevtoolsStore } from \"../../store\";\nimport { getToggleButtonClassName } from \"./ToggleButton.utils\";\nimport ToggleButtonBadge from \"./ToggleButtonBadge\";\nimport type { DevtoolsPosition } from \"../../types\";\nimport type { UIBlockingStoreApi } from \"../actionGuardDevtools\";\n\ninterface ToggleButtonProps {\n position: DevtoolsPosition;\n store?: UIBlockingStoreApi;\n}\n\nfunction ToggleButton(props: ToggleButtonProps): ReactElement | null {\n const { position, store } = props;\n\n const { isOpen, toggleOpen, isPaused } = useDevtoolsStore();\n\n // Read active blockers count directly from the blocking store\n const targetStore = store ?? uiBlockingStoreApi;\n const activeBlockers = useStore(targetStore, (state) => state.activeBlockers);\n\n const activeCount = activeBlockers.size;\n if (isOpen) {\n return null;\n }\n\n return (\n <button\n className={getToggleButtonClassName(position)}\n title=\"Open Action Guard Devtools\"\n onClick={toggleOpen}\n >\n <ShieldIcon size={22} />\n <ToggleButtonBadge count={activeCount} isPaused={isPaused} />\n </button>\n );\n}\n\nexport default ToggleButton;\n","import { ReactElement } from \"react\";\nimport { DevtoolsPanel } from \"../devtoolsPanel\";\nimport { ToggleButton } from \"../toggleButton\";\nimport type { UIBlockingStoreApi } from \"./ActionGuardDevtools.types\";\nimport type { DevtoolsPosition } from \"../../types\";\n\ninterface ActionGuardDevtoolsContentProps {\n position: DevtoolsPosition;\n store?: UIBlockingStoreApi;\n}\n\nfunction ActionGuardDevtoolsContent(props: ActionGuardDevtoolsContentProps): ReactElement {\n const { position, store } = props;\n\n return (\n <>\n <ToggleButton position={position} store={store} />\n <DevtoolsPanel position={position} store={store} />\n </>\n );\n}\n\nexport default ActionGuardDevtoolsContent;\n","import { uiBlockingStoreApi } from \"@okyrychenko-dev/react-action-guard\";\nimport { ReactElement, useEffect, useMemo, useRef } from \"react\";\nimport { DEVTOOLS_MIDDLEWARE_NAME, createDevtoolsMiddleware } from \"../../middleware\";\nimport { useDevtoolsStore } from \"../../store\";\nimport { getDevtoolsKeyboardAction } from \"./ActionGuardDevtools.utils\";\nimport ActionGuardDevtoolsContent from \"./ActionGuardDevtoolsContent\";\nimport type { ActionGuardDevtoolsProps } from \"./ActionGuardDevtools.types\";\nimport \"../../styles/theme.css\";\n\n/**\n * Internal component that handles all the devtools logic.\n * Separated to allow early return in production without breaking hooks rules.\n */\nfunction ActionGuardDevtoolsInternal(\n props: Omit<ActionGuardDevtoolsProps, \"showInProduction\">\n): ReactElement {\n const { position = \"right\", defaultOpen = false, maxEvents = 200, store: customStore } = props;\n\n const { setOpen, setMaxEvents, isOpen, togglePause, clearEvents } = useDevtoolsStore();\n\n // Get the store to use (custom or global)\n const targetStore = useMemo(() => customStore ?? uiBlockingStoreApi, [customStore]);\n\n // Register middleware on mount\n useEffect(() => {\n const storeState = targetStore.getState();\n const middleware = createDevtoolsMiddleware();\n\n storeState.registerMiddleware(DEVTOOLS_MIDDLEWARE_NAME, middleware);\n\n return () => {\n storeState.unregisterMiddleware(DEVTOOLS_MIDDLEWARE_NAME);\n };\n }, [targetStore]);\n\n // Set initial state\n useEffect(() => {\n setOpen(defaultOpen);\n setMaxEvents(maxEvents);\n }, [defaultOpen, maxEvents, setOpen, setMaxEvents]);\n\n // Stable ref for keyboard handler to avoid re-registering event listener\n const stateRef = useRef({ isOpen, setOpen, togglePause, clearEvents });\n\n // Keep ref in sync with latest values\n useEffect(() => {\n stateRef.current = { isOpen, setOpen, togglePause, clearEvents };\n }, [isOpen, setOpen, togglePause, clearEvents]);\n\n // Register keyboard shortcuts once\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent): void => {\n const { isOpen, setOpen, togglePause, clearEvents } = stateRef.current;\n const action = getDevtoolsKeyboardAction(event, isOpen);\n\n if (!action) {\n return;\n }\n\n if (action.preventDefault) {\n event.preventDefault();\n }\n\n switch (action.action) {\n case \"close\":\n setOpen(false);\n break;\n case \"togglePause\":\n togglePause();\n break;\n case \"clearEvents\":\n clearEvents();\n break;\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, []);\n\n return <ActionGuardDevtoolsContent position={position} store={customStore} />;\n}\n\n/**\n * ActionGuardDevtools - Developer tools panel for UI blocking visualization.\n *\n * In production, returns null immediately without initializing any stores or event listeners.\n * Use `showInProduction` prop to override this behavior if needed.\n */\nfunction ActionGuardDevtools(props: ActionGuardDevtoolsProps): ReactElement | null {\n const { showInProduction = false, ...others } = props;\n\n // Early return in production - no hooks called, no resources allocated\n if (process.env.NODE_ENV === \"production\" && !showInProduction) {\n return null;\n }\n\n return <ActionGuardDevtoolsInternal {...others} />;\n}\n\nexport default ActionGuardDevtools;\n"]}
1
+ {"version":3,"sources":["../src/store/devtoolsStore.constants.ts","../src/store/devtoolsStore.actions.ts","../src/store/devtoolsStore.store.ts","../src/store/devtoolsStore.selectors.ts","../src/middleware/devtoolsMiddleware.ts","../src/components/actionGuardDevtools/ActionGuardDevtools.utils.ts","../src/styles/position.module.css","../src/components/devtoolsPanel/DevtoolsPanel.module.css","../src/components/devtoolsPanel/DevtoolsPanel.utils.ts","../src/components/activeBlockers/ActiveBlockers.utils.ts","../src/icons/Icon.utils.tsx","../src/icons/Block.tsx","../src/icons/Close.tsx","../src/icons/Minimize.tsx","../src/icons/Pause.tsx","../src/icons/Play.tsx","../src/icons/Shield.tsx","../src/icons/Trash.tsx","../src/styles/tokens.ts","../src/styles/shared.module.css","../src/components/shared/Badge.tsx","../src/components/shared/Content.tsx","../src/components/shared/EmptyState.tsx","../src/components/shared/ErrorBoundary.tsx","../src/components/shared/EventBadge.tsx","../src/components/shared/IconButton.tsx","../src/components/activeBlockers/ActiveBlockers.module.css","../src/components/activeBlockers/ActiveBlockersEmptyState.tsx","../src/components/activeBlockers/ActiveBlockerItem.tsx","../src/components/activeBlockers/ActiveBlockersList.tsx","../src/components/activeBlockers/ActiveBlockers.tsx","../src/components/eventDetails/EventDetails.module.css","../src/components/eventItem/EventItem.module.css","../src/components/eventItem/EventItem.utils.ts","../src/components/eventItem/EventItemDetails.tsx","../src/components/eventItem/EventItemHeader.tsx","../src/components/eventItem/EventItem.tsx","../src/components/eventDetails/EventDetails.utils.ts","../src/components/eventDetails/EventDetailsContent.tsx","../src/components/eventDetails/EventDetailsHeader.tsx","../src/components/eventDetails/EventDetails.tsx","../src/components/timeline/Timeline.utils.ts","../src/components/timeline/Timeline.module.css","../src/components/timeline/TimelineContent.tsx","../src/components/timeline/TimelineEmptyState.tsx","../src/components/timeline/TimelineToolbar.tsx","../src/components/timeline/Timeline.tsx","../src/components/devtoolsPanel/DevtoolsPanelContent.tsx","../src/icons/Maximize.tsx","../src/components/devtoolsPanel/DevtoolsPanelHeader.utils.ts","../src/components/devtoolsPanel/DevtoolsPanelHeader.tsx","../src/components/devtoolsPanel/DevtoolsPanelTabs.utils.ts","../src/components/devtoolsPanel/DevtoolsPanelTabs.tsx","../src/components/devtoolsPanel/DevtoolsPanel.tsx","../src/components/toggleButton/ToggleButton.module.css","../src/components/toggleButton/ToggleButton.utils.ts","../src/components/toggleButton/ToggleButtonBadge.utils.ts","../src/components/toggleButton/ToggleButtonBadge.tsx","../src/components/toggleButton/ToggleButton.tsx","../src/components/actionGuardDevtools/ActionGuardDevtoolsContent.tsx","../src/components/actionGuardDevtools/ActionGuardDevtools.tsx"],"names":["createShallowStore","clsx","jsx","Component","jsxs","uiBlockingStoreApi","useStore","useMemo","ActiveBlockers_default","formatScope","EventItem_default","memo","EventDetails_default","useShallow","useEffect","useCallback","Fragment","Timeline_default","DevtoolsPanel_default","getPositionClass","ToggleButton_default","useRef","isOpen","setOpen","togglePause","clearEvents"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { DevtoolsFilter } from \"../types/devtools.types\";\n\nexport const DEFAULT_FILTER: DevtoolsFilter = {\n actions: [\"add\", \"remove\", \"update\", \"timeout\", \"clear\", \"clear_scope\"],\n scopes: [],\n search: \"\",\n};\n\nexport const createDefaultFilter = (): DevtoolsFilter => ({\n actions: [...DEFAULT_FILTER.actions],\n scopes: [...DEFAULT_FILTER.scopes],\n search: DEFAULT_FILTER.search,\n});\n\nexport const DEFAULT_MAX_EVENTS = 200;\n\nexport const DEFAULT_TAB = \"timeline\" as const;\n","import { DEFAULT_MAX_EVENTS, DEFAULT_TAB, createDefaultFilter } from \"./devtoolsStore.constants\";\nimport type { DevtoolsEvent, DevtoolsStore } from \"../types/devtools.types\";\nimport type { StateCreator } from \"zustand\";\n\n/**\n * Devtools Store Slice\n *\n * Implements the state and actions for devtools management.\n * This slice follows the Zustand slice pattern for better code organization.\n */\nexport const createDevtoolsActions: StateCreator<DevtoolsStore, [], [], DevtoolsStore> = (\n set,\n get\n) => {\n let eventCounter = 0;\n\n const createEventId = (eventData: Omit<DevtoolsEvent, \"id\">): string => {\n eventCounter += 1;\n return `${String(eventData.timestamp)}-${eventData.blockerId}-${eventCounter.toString(36)}`;\n };\n\n const trimEvents = (events: Array<DevtoolsEvent>, maxEvents: number): Array<DevtoolsEvent> => {\n if (events.length <= maxEvents) {\n return events;\n }\n\n return events.slice(0, maxEvents);\n };\n\n return {\n // Initial State\n events: [],\n maxEvents: DEFAULT_MAX_EVENTS,\n isOpen: false,\n isMinimized: false,\n activeTab: DEFAULT_TAB,\n filter: createDefaultFilter(),\n selectedEventId: null,\n isPaused: false,\n\n // Actions\n /**\n * Add a new event to history\n *\n * @param eventData - Event data without ID (auto-generated)\n */\n addEvent: (eventData): void => {\n if (get().isPaused) {\n return;\n }\n\n const event: DevtoolsEvent = {\n ...eventData,\n id: createEventId(eventData),\n };\n\n set((state) => {\n const newEvents = [event, ...state.events];\n\n return { events: trimEvents(newEvents, state.maxEvents) };\n });\n },\n\n /**\n * Clear all events from history\n */\n clearEvents: (): void => {\n set({ events: [], selectedEventId: null });\n },\n\n /**\n * Toggle panel open/closed state\n */\n toggleOpen: (): void => {\n set((state) => ({ isOpen: !state.isOpen }));\n },\n\n /**\n * Set panel open state\n *\n * @param open - Whether panel should be open\n */\n setOpen: (open): void => {\n set({ isOpen: open });\n },\n\n /**\n * Toggle minimized state\n */\n toggleMinimized: (): void => {\n set((state) => ({ isMinimized: !state.isMinimized }));\n },\n\n /**\n * Set active tab\n *\n * @param tab - Tab to activate\n */\n setActiveTab: (tab): void => {\n set({ activeTab: tab, selectedEventId: null });\n },\n\n /**\n * Update filter settings (partial update)\n *\n * @param filterUpdate - Partial filter update\n */\n setFilter: (filterUpdate): void => {\n set((state) => ({\n filter: { ...state.filter, ...filterUpdate },\n }));\n },\n\n /**\n * Reset filters to default\n */\n resetFilter: (): void => {\n set({ filter: createDefaultFilter() });\n },\n\n /**\n * Select an event for detail view\n *\n * @param eventId - Event ID to select (null to deselect)\n */\n selectEvent: (eventId): void => {\n set({ selectedEventId: eventId });\n },\n\n /**\n * Toggle pause state (stops/resumes recording)\n */\n togglePause: (): void => {\n set((state) => ({ isPaused: !state.isPaused }));\n },\n\n /**\n * Set maximum events limit\n *\n * @param max - Maximum number of events to keep\n */\n setMaxEvents: (max): void => {\n set((state) => ({\n maxEvents: max,\n events: trimEvents(state.events, max),\n }));\n },\n };\n};\n","import {\n type ShallowStoreBindings,\n createShallowStore,\n} from \"@okyrychenko-dev/react-zustand-toolkit\";\nimport { createDevtoolsActions } from \"./devtoolsStore.actions\";\nimport type { DevtoolsStore } from \"../types/devtools.types\";\n\n/**\n * Devtools Store\n *\n * Global Zustand store for managing devtools state across the application.\n *\n * Features:\n * - Event history with circular buffer\n * - Timeline filtering by action/scope/search\n * - Pause/resume recording\n * - Panel open/minimize states\n * - Automatic shallow comparison for selectors\n */\nconst {\n useStore: useDevtoolsStore,\n useStoreApi: devtoolsStoreApi,\n}: ShallowStoreBindings<DevtoolsStore> = createShallowStore<DevtoolsStore>(createDevtoolsActions);\n\nexport { useDevtoolsStore, devtoolsStoreApi };\n","import { DevtoolsEvent, DevtoolsStore } from \"../types\";\n\ntype ScopeValue = string | ReadonlyArray<string> | undefined;\n\nfunction normalizeScopes(scope: ScopeValue): ReadonlyArray<string> {\n if (!scope) {\n return [];\n }\n\n if (typeof scope === \"string\") {\n return [scope];\n }\n\n return scope;\n}\n\nfunction matchesActionFilter(\n event: DevtoolsEvent,\n actions: DevtoolsStore[\"filter\"][\"actions\"]\n): boolean {\n return actions.length === 0 || actions.includes(event.action);\n}\n\nfunction matchesScopeFilter(event: DevtoolsEvent, scopes: Array<string>): boolean {\n if (scopes.length === 0) {\n return true;\n }\n\n const eventScopes = normalizeScopes(event.config?.scope);\n if (eventScopes.length === 0) {\n return false;\n }\n\n return eventScopes.some((scope) => scopes.includes(scope));\n}\n\nfunction matchesSearchQuery(event: DevtoolsEvent, search: string): boolean {\n if (!search) {\n return true;\n }\n\n const searchLower = search.toLowerCase();\n const matchesId = event.blockerId.toLowerCase().includes(searchLower);\n const matchesReason = (event.config?.reason ?? \"\").toLowerCase().includes(searchLower);\n const matchesScope = normalizeScopes(event.config?.scope).some((scope) =>\n scope.toLowerCase().includes(searchLower)\n );\n\n return matchesId || matchesReason || matchesScope;\n}\n\n/**\n * Selector for filtered events\n */\nexport function selectFilteredEvents(state: DevtoolsStore): Array<DevtoolsEvent> {\n const { events, filter } = state;\n\n return events.filter((event) => {\n return (\n matchesActionFilter(event, filter.actions) &&\n matchesScopeFilter(event, filter.scopes) &&\n matchesSearchQuery(event, filter.search)\n );\n });\n}\n\n/**\n * Get unique scopes from all events (for filter dropdown)\n */\nexport function selectUniqueScopes(state: DevtoolsStore): Array<string> {\n const scopes = new Set<string>();\n\n state.events.forEach((event) => {\n normalizeScopes(event.config?.scope).forEach((scope) => scopes.add(scope));\n });\n\n return Array.from(scopes).sort();\n}\n\nexport function selectAllEvents(state: DevtoolsStore): Array<DevtoolsEvent> {\n return state.events;\n}\n","import { devtoolsStoreApi } from \"../store\";\nimport type { Middleware, MiddlewareContext } from \"@okyrychenko-dev/react-action-guard\";\n\nexport const DEVTOOLS_MIDDLEWARE_NAME = \"action-guard-devtools\";\n\n/**\n * Creates the devtools middleware that captures and records UI blocking events.\n *\n * This middleware intercepts all blocking events (add, remove, timeout, clear) and\n * forwards them to the devtools store for visualization in the ActionGuardDevtools panel.\n *\n * The middleware calculates the duration of each blocker by tracking when it was added\n * and when it was removed/timed out, providing insights into how long UI was blocked.\n *\n * **Note:** This middleware is automatically registered when you use the `ActionGuardDevtools`\n * component. You typically don't need to call this function directly unless you're manually\n * managing middleware registration.\n *\n * @returns Middleware function that can be registered with `configureMiddleware` or `registerMiddleware`\n *\n * @example\n * Manual middleware registration (advanced usage)\n * ```tsx\n * import { uiBlockingStoreApi } from '@okyrychenko-dev/react-action-guard';\n * import { createDevtoolsMiddleware, DEVTOOLS_MIDDLEWARE_NAME } from '@okyrychenko-dev/react-action-guard-devtools';\n *\n * // Register manually\n * const middleware = createDevtoolsMiddleware();\n * uiBlockingStoreApi.getState().registerMiddleware(DEVTOOLS_MIDDLEWARE_NAME, middleware);\n *\n * // Cleanup\n * uiBlockingStoreApi.getState().unregisterMiddleware(DEVTOOLS_MIDDLEWARE_NAME);\n * ```\n *\n * @example\n * Automatic registration (recommended)\n * ```tsx\n * import { ActionGuardDevtools } from '@okyrychenko-dev/react-action-guard-devtools';\n *\n * // Middleware registered automatically when component mounts\n * function App() {\n * return (\n * <>\n * <YourApp />\n * <ActionGuardDevtools />\n * </>\n * );\n * }\n * ```\n *\n * @see {@link ActionGuardDevtools} for automatic middleware registration\n * @see {@link https://github.com/okyrychenko-dev/react-action-guard#middleware | Middleware documentation}\n *\n * @public\n * @since 0.6.0\n */\nexport function createDevtoolsMiddleware(): Middleware {\n // Track add timestamps for duration calculation\n const addTimestamps = new Map<string, number>();\n const terminalActions = new Set<MiddlewareContext[\"action\"]>([\n \"remove\",\n \"timeout\",\n \"clear\",\n \"clear_scope\",\n ]);\n\n const getDuration = (\n action: MiddlewareContext[\"action\"],\n blockerId: string,\n timestamp: number\n ): number | undefined => {\n if (!terminalActions.has(action)) {\n return undefined;\n }\n\n const addTime = addTimestamps.get(blockerId);\n if (addTime === undefined) {\n return undefined;\n }\n\n addTimestamps.delete(blockerId);\n return timestamp - addTime;\n };\n\n return (context: MiddlewareContext): void => {\n const { addEvent } = devtoolsStoreApi.getState();\n\n // Track when blockers are added\n if (context.action === \"add\") {\n addTimestamps.set(context.blockerId, context.timestamp);\n }\n\n // Calculate duration for terminal events\n const duration = getDuration(context.action, context.blockerId, context.timestamp);\n\n // Record the event\n addEvent({\n action: context.action,\n blockerId: context.blockerId,\n config: context.config,\n timestamp: context.timestamp,\n prevState: context.prevState,\n duration,\n });\n };\n}\n","import { DevtoolsKeyboardResult } from \"./ActionGuardDevtools.types\";\n\nfunction isTypingTarget(target: EventTarget | null): boolean {\n return target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement;\n}\n\nexport function getDevtoolsKeyboardAction(\n event: KeyboardEvent,\n isOpen: boolean\n): DevtoolsKeyboardResult | null {\n if (!isOpen) {\n return null;\n }\n\n if (isTypingTarget(event.target)) {\n return null;\n }\n\n switch (event.key) {\n case \"Escape\":\n return { action: \"close\", preventDefault: false };\n case \" \":\n return { action: \"togglePause\", preventDefault: true };\n case \"c\":\n case \"C\":\n if (!event.metaKey && !event.ctrlKey) {\n return { action: \"clearEvents\", preventDefault: false };\n }\n return null;\n default:\n return null;\n }\n}\n",".positionBase {\n position: fixed;\n}\n\n.positionLeft {\n bottom: 16px;\n left: 16px;\n}\n\n.positionRight {\n bottom: 16px;\n right: 16px;\n}\n\n.overlayLayer {\n z-index: 100000;\n}\n",".panel {\n width: 420px;\n background: var(--ag-bg);\n border: 1px solid var(--ag-border);\n border-radius: 8px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Monaco, Consolas, monospace;\n font-size: 12px;\n color: var(--ag-text);\n}\n\n.panelExpanded {\n top: 16px;\n}\n\n.panelMinimized {\n height: auto;\n top: auto;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: var(--ag-bg-light);\n border-bottom: 1px solid var(--ag-border);\n}\n\n.headerTitle {\n font-weight: 600;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.headerCount {\n margin-left: 4px;\n}\n\n.headerActions {\n display: flex;\n gap: 4px;\n}\n\n.pauseButtonActive {\n color: var(--ag-warning);\n}\n\n.tabs {\n display: flex;\n border-bottom: 1px solid var(--ag-border);\n}\n\n.tab {\n flex: 1;\n padding: 8px 12px;\n border: none;\n background: transparent;\n color: var(--ag-text-muted);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n transition:\n color 0.15s,\n background 0.15s;\n}\n\n.tabActive {\n color: var(--ag-primary);\n background: var(--ag-bg-light);\n border-bottom: 2px solid var(--ag-primary);\n}\n","import { clsx } from \"clsx\";\nimport positionStyles from \"../../styles/position.module.css\";\nimport styles from \"./DevtoolsPanel.module.css\";\nimport type { DevtoolsPosition } from \"../../types\";\n\nexport function getPositionClass(position: DevtoolsPosition): string {\n return position === \"left\" ? positionStyles.positionLeft : positionStyles.positionRight;\n}\n\nexport function getPanelClassName(position: DevtoolsPosition, isMinimized: boolean): string {\n return clsx(\n styles.panel,\n positionStyles.positionBase,\n getPositionClass(position),\n positionStyles.overlayLayer,\n isMinimized ? styles.panelMinimized : styles.panelExpanded\n );\n}\n","import type { StoredBlocker } from \"@okyrychenko-dev/react-action-guard\";\n\nexport function formatScope(scope: string | ReadonlyArray<string>): string {\n if (Array.isArray(scope)) {\n return scope.join(\", \");\n }\n\n return scope as string;\n}\n\nexport function formatTimestamp(timestamp: number): string {\n const seconds = Math.floor((Date.now() - timestamp) / 1000);\n if (seconds < 60) {\n return `${String(seconds)}s ago`;\n }\n if (seconds < 3600) {\n return `${String(Math.floor(seconds / 60))}m ago`;\n }\n return `${String(Math.floor(seconds / 3600))}h ago`;\n}\n\nexport function getSortedBlockers(\n activeBlockers: ReadonlyMap<string, StoredBlocker>\n): Array<[string, StoredBlocker]> {\n return Array.from(activeBlockers.entries()).sort(([, a], [, b]) => b.priority - a.priority);\n}\n","import { ReactElement, ReactNode, SVGProps } from \"react\";\nimport { IconProps } from \"./Icon.types\";\n\nexport function createSvgIcon(\n children: ReactNode,\n { viewBox = \"0 0 24 24\" }: SVGProps<SVGSVGElement> = {}\n) {\n return function SvgIcon(props: IconProps): ReactElement {\n const { size = 16, color = \"currentColor\" } = props;\n\n return (\n <svg width={size} height={size} viewBox={viewBox} fill={color}>\n {children}\n </svg>\n );\n };\n}\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const BlockIcon = createSvgIcon(\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2M4 12c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69L5.69 16.9C4.63 15.55 4 13.85 4 12m8 8c-1.85 0-3.55-.63-4.9-1.69L18.31 7.1C19.37 8.45 20 10.15 20 12c0 4.42-3.58 8-8 8\" />\n);\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const CloseIcon = createSvgIcon(\n <path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n);\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const MinimizeIcon = createSvgIcon(<path d=\"M6 19h12v2H6z\" />);\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const PauseIcon = createSvgIcon(<path d=\"M6 19h4V5H6zm8-14v14h4V5z\" />);\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const PlayIcon = createSvgIcon(<path d=\"M10 8.64 15.27 12 10 15.36zM8 5v14l11-7z\" />);\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const ShieldIcon = createSvgIcon(\n <path d=\"M12 2 4 5v6.09c0 5.05 3.41 9.76 8 10.91 4.59-1.15 8-5.86 8-10.91V5zm6 9.09c0 4-2.55 7.7-6 8.83-3.45-1.13-6-4.82-6-8.83v-4.7l6-2.25 6 2.25z\" />\n);\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const TrashIcon = createSvgIcon(\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM8 9h8v10H8zm7.5-5-1-1h-5l-1 1H5v2h14V4z\" />\n);\n","export const COLORS = {\n bgHover: \"var(--ag-bg-hover)\",\n bgLight: \"var(--ag-bg-light)\",\n primary: \"var(--ag-primary)\",\n success: \"var(--ag-success)\",\n textDim: \"var(--ag-text-dim)\",\n textMuted: \"var(--ag-text-muted)\",\n warning: \"var(--ag-warning)\",\n} as const;\n\nexport const ACTION_COLORS: Record<string, string> = {\n add: \"rgb(var(--ag-success-rgb))\",\n remove: \"rgb(var(--ag-error-rgb))\",\n update: \"rgb(var(--ag-info-rgb))\",\n timeout: \"rgb(var(--ag-warning-rgb))\",\n clear: \"rgb(var(--ag-info-rgb) / 0.8)\",\n clear_scope: \"rgb(var(--ag-info-rgb) / 0.8)\",\n};\n\nexport const ACTION_COLOR_BACKGROUNDS: Record<string, string> = {\n add: \"rgb(var(--ag-success-rgb) / 0.13)\",\n remove: \"rgb(var(--ag-error-rgb) / 0.13)\",\n update: \"rgb(var(--ag-info-rgb) / 0.13)\",\n timeout: \"rgb(var(--ag-warning-rgb) / 0.13)\",\n clear: \"rgb(var(--ag-info-rgb) / 0.1)\",\n clear_scope: \"rgb(var(--ag-info-rgb) / 0.1)\",\n};\n\nexport const MUTED_COLOR_BACKGROUND = \"rgb(var(--ag-text-muted-rgb) / 0.13)\";\n",".badge {\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n background: var(--ag-primary);\n color: var(--ag-text);\n}\n\n.iconButton {\n width: 28px;\n height: 28px;\n border-radius: 4px;\n border: none;\n background: transparent;\n color: var(--ag-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition:\n background 0.15s,\n color 0.15s;\n}\n\n.emptyState {\n padding: 32px;\n text-align: center;\n color: var(--ag-text-muted);\n}\n\n.content {\n flex: 1;\n overflow: auto;\n min-height: 200px;\n}\n\n.eventBadge {\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.eventBadgeAction {\n background: rgb(var(--ag-text-muted-rgb) / 0.13);\n color: var(--ag-text-muted);\n}\n\n.eventBadgeAction[data-action=\"add\"] {\n background: rgb(var(--ag-success-rgb) / 0.13);\n color: rgb(var(--ag-success-rgb));\n}\n\n.eventBadgeAction[data-action=\"remove\"] {\n background: rgb(var(--ag-error-rgb) / 0.13);\n color: rgb(var(--ag-error-rgb));\n}\n\n.eventBadgeAction[data-action=\"update\"] {\n background: rgb(var(--ag-info-rgb) / 0.13);\n color: rgb(var(--ag-info-rgb));\n}\n\n.eventBadgeAction[data-action=\"timeout\"] {\n background: rgb(var(--ag-warning-rgb) / 0.13);\n color: rgb(var(--ag-warning-rgb));\n}\n\n.eventBadgeAction[data-action=\"clear\"],\n.eventBadgeAction[data-action=\"clear_scope\"] {\n background: rgb(var(--ag-info-rgb) / 0.1);\n color: rgb(var(--ag-info-rgb) / 0.8);\n}\n\n.errorBoundary {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 24px;\n gap: 8px;\n color: var(--ag-text-muted);\n}\n\n.errorTitle {\n font-weight: 600;\n color: rgb(var(--ag-error-rgb));\n}\n\n.errorMessage {\n font-size: 12px;\n opacity: 0.8;\n}\n","import { clsx } from \"clsx\";\nimport { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport sharedStyles from \"../../styles/shared.module.css\";\n\ninterface BadgeProps {\n children: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\nfunction Badge(props: BadgeProps): ReactElement {\n const { children, className, style } = props;\n\n return (\n <span className={clsx(sharedStyles.badge, className)} style={style}>\n {children}\n </span>\n );\n}\n\nexport default Badge;\n","import { clsx } from \"clsx\";\nimport { ReactElement, ReactNode } from \"react\";\nimport sharedStyles from \"../../styles/shared.module.css\";\n\ninterface ContentProps {\n children: ReactNode;\n className?: string;\n}\n\nfunction Content(props: ContentProps): ReactElement {\n const { children, className } = props;\n\n return <div className={clsx(sharedStyles.content, className)}>{children}</div>;\n}\n\nexport default Content;\n","import { clsx } from \"clsx\";\nimport { ReactElement, ReactNode } from \"react\";\nimport sharedStyles from \"../../styles/shared.module.css\";\n\ninterface EmptyStateProps {\n children: ReactNode;\n className?: string;\n}\n\nfunction EmptyState(props: EmptyStateProps): ReactElement {\n const { children, className } = props;\n\n return <div className={clsx(sharedStyles.emptyState, className)}>{children}</div>;\n}\n\nexport default EmptyState;\n","import { Component, ReactNode } from \"react\";\nimport sharedStyles from \"../../styles/shared.module.css\";\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nclass ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n render(): ReactNode {\n const { hasError, error } = this.state;\n const { children, fallback } = this.props;\n\n if (hasError) {\n if (fallback) {\n return fallback;\n }\n\n return (\n <div className={sharedStyles.errorBoundary}>\n <span className={sharedStyles.errorTitle}>Devtools Error</span>\n <span className={sharedStyles.errorMessage}>{error?.message ?? \"Unknown error\"}</span>\n </div>\n );\n }\n\n return children;\n }\n}\n\nexport default ErrorBoundary;\n","import { clsx } from \"clsx\";\nimport { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport sharedStyles from \"../../styles/shared.module.css\";\n\ninterface EventBadgeProps {\n children: ReactNode;\n className?: string;\n style?: CSSProperties;\n action?: string;\n}\n\nfunction EventBadge(props: EventBadgeProps): ReactElement {\n const { children, className, style, action } = props;\n\n const classes = clsx(sharedStyles.eventBadge, action && sharedStyles.eventBadgeAction, className);\n\n return (\n <span className={classes} style={style} data-action={action}>\n {children}\n </span>\n );\n}\n\nexport default EventBadge;\n","import { clsx } from \"clsx\";\nimport { ButtonHTMLAttributes, ReactElement } from \"react\";\nimport sharedStyles from \"../../styles/shared.module.css\";\n\ntype IconButtonProps = ButtonHTMLAttributes<HTMLButtonElement>;\n\nfunction IconButton(props: IconButtonProps): ReactElement {\n const { children, className, type = \"button\", ...others } = props;\n\n return (\n <button type={type} className={clsx(sharedStyles.iconButton, className)} {...others}>\n {children}\n </button>\n );\n}\n\nexport default IconButton;\n",".blockerItem {\n padding: 10px 12px;\n border-bottom: 1px solid var(--ag-border);\n}\n\n.blockerHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 6px;\n}\n\n.blockerId {\n font-weight: 600;\n color: var(--ag-primary);\n}\n\n.blockerMeta {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 11px;\n color: var(--ag-text-muted);\n}\n\n.activeBadge {\n background: var(--ag-success);\n}\n\n.emptyIcon {\n display: inline-flex;\n}\n\n.emptyTitle {\n margin-top: 12px;\n}\n\n.emptySubtext {\n font-size: 11px;\n margin-top: 4px;\n}\n","import { ReactElement } from \"react\";\nimport { BlockIcon } from \"../../icons\";\nimport { COLORS } from \"../../styles/tokens\";\nimport { EmptyState } from \"../shared\";\nimport styles from \"./ActiveBlockers.module.css\";\n\nfunction ActiveBlockersEmptyState(): ReactElement {\n return (\n <EmptyState>\n <span className={styles.emptyIcon}>\n <BlockIcon size={32} color={COLORS.textDim} />\n </span>\n <p className={styles.emptyTitle}>No active blockers</p>\n <p className={styles.emptySubtext}>The UI is currently unblocked.</p>\n </EmptyState>\n );\n}\n\nexport default ActiveBlockersEmptyState;\n","import { StoredBlocker } from \"@okyrychenko-dev/react-action-guard\";\nimport { ReactElement } from \"react\";\nimport { Badge } from \"../shared\";\nimport styles from \"./ActiveBlockers.module.css\";\nimport { formatScope, formatTimestamp } from \"./ActiveBlockers.utils\";\n\ninterface BlockerItemProps {\n id: string;\n blocker: StoredBlocker;\n}\n\nfunction ActiveBlockerItem(props: BlockerItemProps): ReactElement {\n const { id, blocker } = props;\n\n return (\n <div className={styles.blockerItem}>\n <div className={styles.blockerHeader}>\n <span className={styles.blockerId}>{id}</span>\n <Badge className={styles.activeBadge}>Active</Badge>\n </div>\n <div className={styles.blockerMeta}>\n <span>Scope: {formatScope(blocker.scope)}</span>\n <span>Priority: {blocker.priority}</span>\n <span>Reason: {blocker.reason}</span>\n <span>Started: {formatTimestamp(blocker.timestamp)}</span>\n </div>\n </div>\n );\n}\n\nexport default ActiveBlockerItem;\n","import { ReactElement } from \"react\";\nimport { Content } from \"../shared\";\nimport ActiveBlockerItem from \"./ActiveBlockerItem\";\nimport type { StoredBlocker } from \"@okyrychenko-dev/react-action-guard\";\n\ninterface ActiveBlockersListProps {\n blockers: Array<[string, StoredBlocker]>;\n}\n\nfunction ActiveBlockersList(props: ActiveBlockersListProps): ReactElement {\n const { blockers } = props;\n\n return (\n <Content>\n {blockers.map(([id, blocker]) => (\n <ActiveBlockerItem key={id} id={id} blocker={blocker} />\n ))}\n </Content>\n );\n}\n\nexport default ActiveBlockersList;\n","import { uiBlockingStoreApi } from \"@okyrychenko-dev/react-action-guard\";\nimport { ReactElement, useMemo } from \"react\";\nimport { useStore } from \"zustand\";\nimport { getSortedBlockers } from \"./ActiveBlockers.utils\";\nimport ActiveBlockersEmptyState from \"./ActiveBlockersEmptyState\";\nimport ActiveBlockersList from \"./ActiveBlockersList\";\nimport type { UIBlockingStoreApi } from \"../actionGuardDevtools\";\n\ninterface ActiveBlockersProps {\n store?: UIBlockingStoreApi;\n}\n\nfunction ActiveBlockers(props: ActiveBlockersProps): ReactElement {\n const { store } = props;\n\n // Single subscription - use provided store or fall back to global\n const targetStore = store ?? uiBlockingStoreApi;\n const activeBlockers = useStore(targetStore, (state) => state.activeBlockers);\n\n const blockers = useMemo(() => getSortedBlockers(activeBlockers), [activeBlockers]);\n\n if (blockers.length === 0) {\n return <ActiveBlockersEmptyState />;\n }\n\n return <ActiveBlockersList blockers={blockers} />;\n}\n\nexport default ActiveBlockers;\n",".panel {\n background: var(--ag-bg-light);\n border-top: 1px solid var(--ag-border);\n padding: 12px;\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n.content {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.section {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.label {\n font-size: 10px;\n font-weight: 600;\n color: var(--ag-text-dim);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.value {\n font-size: 12px;\n color: var(--ag-text);\n word-break: break-all;\n}\n\n.mutedInline {\n color: var(--ag-text-dim);\n margin-left: 8px;\n}\n\n.mutedLabel {\n color: var(--ag-text-dim);\n}\n\n.config {\n font-size: 11px;\n color: var(--ag-text-muted);\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding-left: 8px;\n border-left: 2px solid var(--ag-border);\n}\n",".eventItem {\n padding: 8px 12px;\n border-bottom: 1px solid var(--ag-border);\n cursor: pointer;\n transition: background 0.15s;\n background: transparent;\n}\n\n.eventItem:hover {\n background: var(--ag-bg-hover);\n}\n\n.selected {\n background: var(--ag-bg-light);\n}\n\n.selected:hover {\n background: var(--ag-bg-light);\n}\n\n.eventHeader {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n}\n\n.eventBlockerId {\n font-weight: 500;\n color: var(--ag-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n}\n\n.eventTime {\n font-size: 10px;\n color: var(--ag-text-dim);\n}\n\n.eventDetails {\n font-size: 11px;\n color: var(--ag-text-muted);\n display: flex;\n gap: 12px;\n}\n","export function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${String(ms)}ms`;\n }\n\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`;\n }\n\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\nexport function formatScope(scope?: string | ReadonlyArray<string>): string {\n if (!scope) {\n return \"global\";\n }\n\n if (Array.isArray(scope)) {\n return scope.join(\", \");\n }\n\n return scope as string;\n}\n\nexport function formatTime(timestamp: number): string {\n const date = new Date(timestamp);\n\n return date.toLocaleTimeString(\"en-US\", {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n}\n","import { ReactElement } from \"react\";\nimport styles from \"./EventItem.module.css\";\nimport { formatDuration, formatScope } from \"./EventItem.utils\";\nimport type { DevtoolsEvent } from \"../../types\";\n\ninterface EventItemDetailsProps {\n event: DevtoolsEvent;\n}\n\nfunction EventItemDetails(props: EventItemDetailsProps): ReactElement {\n const { event } = props;\n const { config, duration } = event;\n\n return (\n <div className={styles.eventDetails}>\n <span>scope: {formatScope(config?.scope)}</span>\n {duration !== undefined && <span>duration: {formatDuration(duration)}</span>}\n {config?.priority !== undefined && <span>priority: {config.priority}</span>}\n </div>\n );\n}\n\nexport default EventItemDetails;\n","import { ReactElement } from \"react\";\nimport { EventBadge } from \"../shared\";\nimport styles from \"./EventItem.module.css\";\nimport { formatTime } from \"./EventItem.utils\";\nimport type { DevtoolsEvent } from \"../../types\";\n\ninterface EventItemHeaderProps {\n event: DevtoolsEvent;\n}\n\nfunction EventItemHeader(props: EventItemHeaderProps): ReactElement {\n const { event } = props;\n const { action, blockerId, timestamp } = event;\n\n return (\n <div className={styles.eventHeader}>\n <EventBadge action={action}>{action}</EventBadge>\n <span className={styles.eventBlockerId}>{blockerId}</span>\n <span className={styles.eventTime}>{formatTime(timestamp)}</span>\n </div>\n );\n}\n\nexport default EventItemHeader;\n","import { clsx } from \"clsx\";\nimport { ReactElement, memo } from \"react\";\nimport styles from \"./EventItem.module.css\";\nimport EventItemDetails from \"./EventItemDetails\";\nimport EventItemHeader from \"./EventItemHeader\";\nimport type { DevtoolsEvent } from \"../../types\";\n\ninterface EventItemProps {\n event: DevtoolsEvent;\n selected: boolean;\n onSelect: (eventId: string | null) => void;\n}\n\nfunction EventItem(props: EventItemProps): ReactElement {\n const { event, selected, onSelect } = props;\n\n const handleSelect = (): void => {\n onSelect(selected ? null : event.id);\n };\n\n return (\n <li className={clsx(styles.eventItem, selected && styles.selected)} onClick={handleSelect}>\n <EventItemHeader event={event} />\n <EventItemDetails event={event} />\n </li>\n );\n}\n\nexport default memo(EventItem);\n","export function formatFullTimestamp(timestamp: number): string {\n const date = new Date(timestamp);\n\n return date.toLocaleString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n}\n\nexport function formatRelativeTime(timestamp: number): string {\n const seconds = Math.floor((Date.now() - timestamp) / 1000);\n\n if (seconds < 60) {\n return `${String(seconds)}s ago`;\n }\n\n if (seconds < 3600) {\n return `${String(Math.floor(seconds / 60))}m ago`;\n }\n\n return `${String(Math.floor(seconds / 3600))}h ago`;\n}\n","import { ReactElement } from \"react\";\nimport { formatDuration, formatScope } from \"../eventItem\";\nimport styles from \"./EventDetails.module.css\";\nimport { formatFullTimestamp, formatRelativeTime } from \"./EventDetails.utils\";\nimport type { DevtoolsEvent } from \"../../types\";\n\ninterface EventDetailsContentProps {\n event: DevtoolsEvent;\n}\n\nfunction EventDetailsContent(props: EventDetailsContentProps): ReactElement {\n const { event } = props;\n\n return (\n <div className={styles.content}>\n <div className={styles.section}>\n <div className={styles.label}>Blocker ID</div>\n <div className={styles.value}>{event.blockerId}</div>\n </div>\n\n <div className={styles.section}>\n <div className={styles.label}>Timestamp</div>\n <div className={styles.value}>\n {formatFullTimestamp(event.timestamp)}\n <span className={styles.mutedInline}>({formatRelativeTime(event.timestamp)})</span>\n </div>\n </div>\n\n {event.duration !== undefined && (\n <div className={styles.section}>\n <div className={styles.label}>Duration</div>\n <div className={styles.value}>{formatDuration(event.duration)}</div>\n </div>\n )}\n\n {event.config && (\n <div className={styles.section}>\n <div className={styles.label}>Config</div>\n <div className={styles.config}>\n {event.config.scope !== undefined && (\n <div>\n <span className={styles.mutedLabel}>scope: </span>\n {formatScope(event.config.scope)}\n </div>\n )}\n {event.config.reason !== undefined && (\n <div>\n <span className={styles.mutedLabel}>reason: </span>\n {event.config.reason}\n </div>\n )}\n {event.config.priority !== undefined && (\n <div>\n <span className={styles.mutedLabel}>priority: </span>\n {event.config.priority}\n </div>\n )}\n </div>\n </div>\n )}\n\n {event.prevState && (\n <div className={styles.section}>\n <div className={styles.label}>Previous State</div>\n <div className={styles.config}>\n {event.prevState.scope !== undefined && (\n <div>\n <span className={styles.mutedLabel}>scope: </span>\n {formatScope(event.prevState.scope)}\n </div>\n )}\n {event.prevState.reason !== undefined && (\n <div>\n <span className={styles.mutedLabel}>reason: </span>\n {event.prevState.reason}\n </div>\n )}\n {event.prevState.priority !== undefined && (\n <div>\n <span className={styles.mutedLabel}>priority: </span>\n {event.prevState.priority}\n </div>\n )}\n </div>\n </div>\n )}\n\n {event.source && (\n <div className={styles.section}>\n <div className={styles.label}>Source</div>\n <div className={styles.value}>{event.source}</div>\n </div>\n )}\n </div>\n );\n}\n\nexport default EventDetailsContent;\n","import { ReactElement } from \"react\";\nimport { CloseIcon } from \"../../icons\";\nimport { EventBadge, IconButton } from \"../shared\";\nimport styles from \"./EventDetails.module.css\";\n\ninterface EventDetailsHeaderProps {\n action: string;\n onClose: VoidFunction;\n}\n\nfunction EventDetailsHeader(props: EventDetailsHeaderProps): ReactElement {\n const { action, onClose } = props;\n\n return (\n <div className={styles.header}>\n <EventBadge action={action}>{action}</EventBadge>\n <IconButton title=\"Close details\" onClick={onClose}>\n <CloseIcon size={16} />\n </IconButton>\n </div>\n );\n}\n\nexport default EventDetailsHeader;\n","import { ReactElement } from \"react\";\nimport styles from \"./EventDetails.module.css\";\nimport EventDetailsContent from \"./EventDetailsContent\";\nimport EventDetailsHeader from \"./EventDetailsHeader\";\nimport type { DevtoolsEvent } from \"../../types\";\n\ninterface EventDetailsProps {\n event: DevtoolsEvent;\n onClose: VoidFunction;\n}\n\nfunction EventDetails(props: EventDetailsProps): ReactElement {\n const { event, onClose } = props;\n\n return (\n <div className={styles.panel}>\n <EventDetailsHeader action={event.action} onClose={onClose} />\n <EventDetailsContent event={event} />\n </div>\n );\n}\n\nexport default EventDetails;\n","import { DEFAULT_FILTER } from \"../../store/devtoolsStore.constants\";\nimport type { DevtoolsFilter } from \"../../types\";\n\nexport function isFilterActive(filter: DevtoolsFilter): boolean {\n if (filter.search.length > 0 || filter.scopes.length > 0) {\n return true;\n }\n\n if (filter.actions.length !== DEFAULT_FILTER.actions.length) {\n return true;\n }\n\n return !DEFAULT_FILTER.actions.every((action) => filter.actions.includes(action));\n}\n",".toolbar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--ag-border);\n background: var(--ag-bg-light);\n}\n\n.searchInput {\n flex: 1;\n padding: 6px 10px;\n border-radius: 4px;\n border: 1px solid var(--ag-border);\n background: var(--ag-bg);\n color: var(--ag-text);\n font-size: 12px;\n outline: none;\n}\n\n.eventList {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.emptyHint {\n font-size: 11px;\n margin-top: 8px;\n}\n","import { ReactElement } from \"react\";\nimport { EventItem } from \"../eventItem\";\nimport { Content, EmptyState } from \"../shared\";\nimport styles from \"./Timeline.module.css\";\nimport type { DevtoolsEvent } from \"../../types\";\n\ninterface TimelineContentProps {\n events: Array<DevtoolsEvent>;\n selectedEventId: string | null;\n onSelectEvent: (eventId: string | null) => void;\n}\n\nfunction TimelineContent(props: TimelineContentProps): ReactElement {\n const { events, selectedEventId, onSelectEvent } = props;\n\n return (\n <Content>\n {events.length === 0 && <EmptyState>No matching events</EmptyState>}\n {events.length > 0 && (\n <ul className={styles.eventList}>\n {events.map((event) => (\n <EventItem\n key={event.id}\n event={event}\n selected={selectedEventId === event.id}\n onSelect={onSelectEvent}\n />\n ))}\n </ul>\n )}\n </Content>\n );\n}\n\nexport default TimelineContent;\n","import { ReactElement } from \"react\";\nimport { EmptyState } from \"../shared\";\nimport styles from \"./Timeline.module.css\";\n\nfunction TimelineEmptyState(): ReactElement {\n return (\n <EmptyState>\n <p>No events recorded yet.</p>\n <p className={styles.emptyHint}>Events will appear here as blockers are added/removed.</p>\n </EmptyState>\n );\n}\n\nexport default TimelineEmptyState;\n","import { ChangeEvent, ReactElement } from \"react\";\nimport styles from \"./Timeline.module.css\";\n\ninterface TimelineToolbarProps {\n search: string;\n onSearchChange: (event: ChangeEvent<HTMLInputElement>) => void;\n}\n\nfunction TimelineToolbar(props: TimelineToolbarProps): ReactElement {\n const { search, onSearchChange } = props;\n\n return (\n <div className={styles.toolbar}>\n <input\n type=\"text\"\n placeholder=\"Search by ID or reason...\"\n value={search}\n className={styles.searchInput}\n onChange={onSearchChange}\n />\n </div>\n );\n}\n\nexport default TimelineToolbar;\n","import { ChangeEvent, ReactElement, useCallback, useEffect } from \"react\";\nimport { useShallow } from \"zustand/react/shallow\";\nimport { selectAllEvents, selectFilteredEvents, useDevtoolsStore } from \"../../store\";\nimport { EventDetails } from \"../eventDetails\";\nimport { isFilterActive } from \"./Timeline.utils\";\nimport TimelineContent from \"./TimelineContent\";\nimport TimelineEmptyState from \"./TimelineEmptyState\";\nimport TimelineToolbar from \"./TimelineToolbar\";\n\nfunction Timeline(): ReactElement {\n const events = useDevtoolsStore(selectFilteredEvents);\n const allEvents = useDevtoolsStore(selectAllEvents);\n const { selectedEventId, selectEvent, filter, setFilter } = useDevtoolsStore(\n useShallow((state) => ({\n selectedEventId: state.selectedEventId,\n selectEvent: state.selectEvent,\n filter: state.filter,\n setFilter: state.setFilter,\n }))\n );\n\n const selectedEvent = selectedEventId ? events.find((e) => e.id === selectedEventId) : null;\n\n // Clear selection if selected event was removed from circular buffer\n useEffect(() => {\n if (selectedEventId && !allEvents.some((event) => event.id === selectedEventId)) {\n selectEvent(null);\n }\n }, [selectedEventId, allEvents, selectEvent]);\n\n const handleSearchChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n setFilter({ search: e.target.value });\n },\n [setFilter]\n );\n\n const handleCloseDetails = useCallback(() => {\n selectEvent(null);\n }, [selectEvent]);\n\n if (events.length === 0 && !isFilterActive(filter)) {\n return <TimelineEmptyState />;\n }\n\n return (\n <>\n <TimelineToolbar search={filter.search} onSearchChange={handleSearchChange} />\n <TimelineContent\n events={events}\n selectedEventId={selectedEventId}\n onSelectEvent={selectEvent}\n />\n {selectedEvent && <EventDetails event={selectedEvent} onClose={handleCloseDetails} />}\n </>\n );\n}\n\nexport default Timeline;\n","import { ReactElement } from \"react\";\nimport { ActiveBlockers } from \"../activeBlockers\";\nimport { ErrorBoundary } from \"../shared\";\nimport { Timeline } from \"../timeline\";\nimport type { DevtoolsState } from \"../../types\";\nimport type { UIBlockingStoreApi } from \"../actionGuardDevtools\";\n\ninterface DevtoolsPanelContentProps {\n activeTab: DevtoolsState[\"activeTab\"];\n store?: UIBlockingStoreApi;\n}\n\nfunction DevtoolsPanelContent(props: DevtoolsPanelContentProps): ReactElement {\n const { activeTab, store } = props;\n\n return (\n <ErrorBoundary>\n {activeTab === \"timeline\" ? <Timeline /> : <ActiveBlockers store={store} />}\n </ErrorBoundary>\n );\n}\n\nexport default DevtoolsPanelContent;\n","import { createSvgIcon } from \"./Icon.utils\";\n\nexport const MaximizeIcon = createSvgIcon(<path d=\"M3 3h18v2H3z\" />);\n","import { clsx } from \"clsx\";\nimport styles from \"./DevtoolsPanel.module.css\";\n\nexport function getPauseButtonTitle(isPaused: boolean): string {\n return isPaused ? \"Resume recording\" : \"Pause recording\";\n}\n\nexport function getMinimizeButtonTitle(isMinimized: boolean): string {\n return isMinimized ? \"Maximize\" : \"Minimize\";\n}\n\nexport function getPauseButtonClassName(isPaused: boolean): string {\n return clsx(isPaused && styles.pauseButtonActive);\n}\n","import { ReactElement } from \"react\";\nimport { CloseIcon, MinimizeIcon, PauseIcon, PlayIcon, ShieldIcon, TrashIcon } from \"../../icons\";\nimport { MaximizeIcon } from \"../../icons/Maximize\";\nimport { COLORS } from \"../../styles/tokens\";\nimport { Badge, IconButton } from \"../shared\";\nimport styles from \"./DevtoolsPanel.module.css\";\nimport {\n getMinimizeButtonTitle,\n getPauseButtonClassName,\n getPauseButtonTitle,\n} from \"./DevtoolsPanelHeader.utils\";\n\ninterface DevtoolsPanelHeaderProps {\n eventsCount: number;\n isPaused: boolean;\n isMinimized: boolean;\n onTogglePause: VoidFunction;\n onClearEvents: VoidFunction;\n onToggleMinimized: VoidFunction;\n onClose: VoidFunction;\n}\n\nfunction DevtoolsPanelHeader(props: DevtoolsPanelHeaderProps): ReactElement {\n const {\n eventsCount,\n isPaused,\n isMinimized,\n onTogglePause,\n onClearEvents,\n onToggleMinimized,\n onClose,\n } = props;\n\n return (\n <div className={styles.header}>\n <div className={styles.headerTitle}>\n <ShieldIcon size={16} color={COLORS.primary} />\n <span>Action Guard</span>\n <Badge className={styles.headerCount}>{eventsCount}</Badge>\n </div>\n <div className={styles.headerActions}>\n <IconButton\n className={getPauseButtonClassName(isPaused)}\n title={getPauseButtonTitle(isPaused)}\n onClick={onTogglePause}\n >\n {isPaused ? <PlayIcon /> : <PauseIcon />}\n </IconButton>\n <IconButton title=\"Clear events\" onClick={onClearEvents}>\n <TrashIcon />\n </IconButton>\n <IconButton title={getMinimizeButtonTitle(isMinimized)} onClick={onToggleMinimized}>\n {isMinimized ? <MinimizeIcon /> : <MaximizeIcon />}\n </IconButton>\n <IconButton title=\"Close\" onClick={onClose}>\n <CloseIcon />\n </IconButton>\n </div>\n </div>\n );\n}\n\nexport default DevtoolsPanelHeader;\n","import type { DevtoolsState } from \"../../types\";\n\nexport interface DevtoolsTabConfig {\n id: DevtoolsState[\"activeTab\"];\n label: string;\n}\n\nexport const DEVTOOLS_TABS: ReadonlyArray<DevtoolsTabConfig> = [\n { id: \"timeline\", label: \"Timeline\" },\n { id: \"blockers\", label: \"Active Blockers\" },\n];\n","import { clsx } from \"clsx\";\nimport { ReactElement } from \"react\";\nimport styles from \"./DevtoolsPanel.module.css\";\nimport { DEVTOOLS_TABS } from \"./DevtoolsPanelTabs.utils\";\nimport type { DevtoolsState } from \"../../types\";\n\ninterface DevtoolsPanelTabsProps {\n activeTab: DevtoolsState[\"activeTab\"];\n onSelectTab: (tab: DevtoolsState[\"activeTab\"]) => void;\n}\n\nfunction DevtoolsPanelTabs(props: DevtoolsPanelTabsProps): ReactElement {\n const { activeTab, onSelectTab } = props;\n\n return (\n <div className={styles.tabs}>\n {DEVTOOLS_TABS.map((tab) => (\n <button\n key={tab.id}\n onClick={() => {\n onSelectTab(tab.id);\n }}\n className={clsx(styles.tab, activeTab === tab.id && styles.tabActive)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n );\n}\n\nexport default DevtoolsPanelTabs;\n","import { ReactElement } from \"react\";\nimport { useDevtoolsStore } from \"../../store\";\nimport { getPanelClassName } from \"./DevtoolsPanel.utils\";\nimport DevtoolsPanelContent from \"./DevtoolsPanelContent\";\nimport DevtoolsPanelHeader from \"./DevtoolsPanelHeader\";\nimport DevtoolsPanelTabs from \"./DevtoolsPanelTabs\";\nimport type { DevtoolsPosition } from \"../../types\";\nimport type { UIBlockingStoreApi } from \"../actionGuardDevtools\";\n\ninterface DevtoolsPanelProps {\n position: DevtoolsPosition;\n store?: UIBlockingStoreApi;\n}\n\nfunction DevtoolsPanel(props: DevtoolsPanelProps): ReactElement | null {\n const { position, store } = props;\n\n const {\n isOpen,\n isMinimized,\n activeTab,\n setActiveTab,\n toggleOpen,\n toggleMinimized,\n clearEvents,\n isPaused,\n togglePause,\n events,\n } = useDevtoolsStore();\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div className={getPanelClassName(position, isMinimized)}>\n <DevtoolsPanelHeader\n eventsCount={events.length}\n isPaused={isPaused}\n isMinimized={isMinimized}\n onTogglePause={togglePause}\n onClearEvents={clearEvents}\n onToggleMinimized={toggleMinimized}\n onClose={toggleOpen}\n />\n\n {!isMinimized && (\n <>\n <DevtoolsPanelTabs activeTab={activeTab} onSelectTab={setActiveTab} />\n <DevtoolsPanelContent activeTab={activeTab} store={store} />\n </>\n )}\n </div>\n );\n}\n\nexport default DevtoolsPanel;\n",".toggleButton {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n border: none;\n background: var(--ag-primary);\n color: var(--ag-text);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n transition: transform 0.2s, background 0.2s;\n}\n\n.badgePosition {\n position: absolute;\n top: -4px;\n right: -4px;\n}\n\n.badgeActive {\n background: var(--ag-success);\n}\n\n.badgePaused {\n background: var(--ag-warning);\n}\n","import { clsx } from \"clsx\";\nimport positionStyles from \"../../styles/position.module.css\";\nimport styles from \"./ToggleButton.module.css\";\nimport type { DevtoolsPosition } from \"../../types\";\n\nexport function getPositionClass(position: DevtoolsPosition): string {\n return position === \"left\" ? positionStyles.positionLeft : positionStyles.positionRight;\n}\n\nexport function getToggleButtonClassName(position: DevtoolsPosition): string {\n return clsx(\n styles.toggleButton,\n positionStyles.positionBase,\n getPositionClass(position),\n positionStyles.overlayLayer\n );\n}\n","import { clsx } from \"clsx\";\nimport styles from \"./ToggleButton.module.css\";\n\nexport function shouldShowBadge(count: number): boolean {\n return count > 0;\n}\n\nexport function getBadgeClassName(isPaused: boolean): string {\n return clsx(styles.badgePosition, isPaused ? styles.badgePaused : styles.badgeActive);\n}\n","import { ReactElement } from \"react\";\nimport { Badge } from \"../shared\";\nimport { getBadgeClassName, shouldShowBadge } from \"./ToggleButtonBadge.utils\";\n\ninterface ToggleButtonBadgeProps {\n count: number;\n isPaused: boolean;\n}\n\nfunction ToggleButtonBadge(props: ToggleButtonBadgeProps): ReactElement | null {\n const { count, isPaused } = props;\n\n if (!shouldShowBadge(count)) {\n return null;\n }\n\n return <Badge className={getBadgeClassName(isPaused)}>{count}</Badge>;\n}\n\nexport default ToggleButtonBadge;\n","import { uiBlockingStoreApi } from \"@okyrychenko-dev/react-action-guard\";\nimport { ReactElement } from \"react\";\nimport { useStore } from \"zustand\";\nimport { ShieldIcon } from \"../../icons\";\nimport { useDevtoolsStore } from \"../../store\";\nimport { getToggleButtonClassName } from \"./ToggleButton.utils\";\nimport ToggleButtonBadge from \"./ToggleButtonBadge\";\nimport type { DevtoolsPosition } from \"../../types\";\nimport type { UIBlockingStoreApi } from \"../actionGuardDevtools\";\n\ninterface ToggleButtonProps {\n position: DevtoolsPosition;\n store?: UIBlockingStoreApi;\n}\n\nfunction ToggleButton(props: ToggleButtonProps): ReactElement | null {\n const { position, store } = props;\n\n const { isOpen, toggleOpen, isPaused } = useDevtoolsStore();\n\n // Read active blockers count directly from the blocking store\n const targetStore = store ?? uiBlockingStoreApi;\n const activeBlockers = useStore(targetStore, (state) => state.activeBlockers);\n\n const activeCount = activeBlockers.size;\n if (isOpen) {\n return null;\n }\n\n return (\n <button\n className={getToggleButtonClassName(position)}\n title=\"Open Action Guard Devtools\"\n onClick={toggleOpen}\n >\n <ShieldIcon size={22} />\n <ToggleButtonBadge count={activeCount} isPaused={isPaused} />\n </button>\n );\n}\n\nexport default ToggleButton;\n","import { ReactElement } from \"react\";\nimport { DevtoolsPanel } from \"../devtoolsPanel\";\nimport { ToggleButton } from \"../toggleButton\";\nimport type { UIBlockingStoreApi } from \"./ActionGuardDevtools.types\";\nimport type { DevtoolsPosition } from \"../../types\";\n\ninterface ActionGuardDevtoolsContentProps {\n position: DevtoolsPosition;\n store?: UIBlockingStoreApi;\n}\n\nfunction ActionGuardDevtoolsContent(props: ActionGuardDevtoolsContentProps): ReactElement {\n const { position, store } = props;\n\n return (\n <>\n <ToggleButton position={position} store={store} />\n <DevtoolsPanel position={position} store={store} />\n </>\n );\n}\n\nexport default ActionGuardDevtoolsContent;\n","import { uiBlockingStoreApi } from \"@okyrychenko-dev/react-action-guard\";\nimport { ReactElement, useEffect, useMemo, useRef } from \"react\";\nimport { DEVTOOLS_MIDDLEWARE_NAME, createDevtoolsMiddleware } from \"../../middleware\";\nimport { useDevtoolsStore } from \"../../store\";\nimport { getDevtoolsKeyboardAction } from \"./ActionGuardDevtools.utils\";\nimport ActionGuardDevtoolsContent from \"./ActionGuardDevtoolsContent\";\nimport type { ActionGuardDevtoolsProps } from \"./ActionGuardDevtools.types\";\nimport \"../../styles/theme.css\";\n\n/**\n * Internal component that handles all the devtools logic.\n * Separated to allow early return in production without breaking hooks rules.\n */\nfunction ActionGuardDevtoolsInternal(\n props: Omit<ActionGuardDevtoolsProps, \"showInProduction\">\n): ReactElement {\n const { position = \"right\", defaultOpen = false, maxEvents = 200, store: customStore } = props;\n\n const { setOpen, setMaxEvents, isOpen, togglePause, clearEvents } = useDevtoolsStore();\n\n // Get the store to use (custom or global)\n const targetStore = useMemo(() => customStore ?? uiBlockingStoreApi, [customStore]);\n\n // Register middleware on mount\n useEffect(() => {\n const storeState = targetStore.getState();\n const middleware = createDevtoolsMiddleware();\n\n storeState.registerMiddleware(DEVTOOLS_MIDDLEWARE_NAME, middleware);\n\n return () => {\n storeState.unregisterMiddleware(DEVTOOLS_MIDDLEWARE_NAME);\n };\n }, [targetStore]);\n\n // Set initial state\n useEffect(() => {\n setOpen(defaultOpen);\n setMaxEvents(maxEvents);\n }, [defaultOpen, maxEvents, setOpen, setMaxEvents]);\n\n // Stable ref for keyboard handler to avoid re-registering event listener\n const stateRef = useRef({ isOpen, setOpen, togglePause, clearEvents });\n\n // Keep ref in sync with latest values\n useEffect(() => {\n stateRef.current = { isOpen, setOpen, togglePause, clearEvents };\n }, [isOpen, setOpen, togglePause, clearEvents]);\n\n // Register keyboard shortcuts once\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent): void => {\n const { isOpen, setOpen, togglePause, clearEvents } = stateRef.current;\n const action = getDevtoolsKeyboardAction(event, isOpen);\n\n if (!action) {\n return;\n }\n\n if (action.preventDefault) {\n event.preventDefault();\n }\n\n switch (action.action) {\n case \"close\":\n setOpen(false);\n break;\n case \"togglePause\":\n togglePause();\n break;\n case \"clearEvents\":\n clearEvents();\n break;\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, []);\n\n return <ActionGuardDevtoolsContent position={position} store={customStore} />;\n}\n\n/**\n * ActionGuardDevtools - Visual developer tools panel for debugging UI blocking.\n *\n * This component provides a floating developer tools panel that visualizes all UI blocking\n * events in real-time. It shows active blockers, their priorities, scopes, and provides\n * a timeline of all blocking events with filtering and search capabilities.\n *\n * **Key Features:**\n * - Real-time visualization of active blockers\n * - Timeline of all blocking events (add, remove, timeout)\n * - Filter by action type, scope, or search term\n * - Pause/resume event capture\n * - Keyboard shortcuts (Esc to close, P to pause, C to clear)\n * - Draggable and resizable panel\n * - Works with both global store and custom store instances\n *\n * **Performance:**\n * - Automatically disabled in production builds (returns `null`)\n * - Only allocates resources in development\n * - Uses `showInProduction` prop to override if needed\n *\n * **Integration:**\n * - Automatically registers devtools middleware on mount\n * - Cleans up middleware on unmount\n * - No configuration required for basic usage\n *\n * @param props - Configuration props for the devtools panel\n * @param props.position - Panel position: 'left' | 'right' | 'top' | 'bottom' (default: 'right')\n * @param props.defaultOpen - Whether panel is open initially (default: false)\n * @param props.maxEvents - Maximum events to store in timeline (default: 200)\n * @param props.showInProduction - Show panel even in production (default: false)\n * @param props.store - Custom store instance (default: global store)\n *\n * @returns React element in development, `null` in production (unless `showInProduction` is true)\n *\n * @example\n * Basic usage (global store)\n * ```tsx\n * import { ActionGuardDevtools } from '@okyrychenko-dev/react-action-guard-devtools';\n *\n * function App() {\n * return (\n * <div>\n * <YourApp />\n * <ActionGuardDevtools />\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * With custom configuration\n * ```tsx\n * <ActionGuardDevtools\n * position=\"bottom\"\n * defaultOpen={true}\n * maxEvents={500}\n * />\n * ```\n *\n * @example\n * With custom store instance (isolated state)\n * ```tsx\n * import { UIBlockingProvider } from '@okyrychenko-dev/react-action-guard';\n * import { ActionGuardDevtools } from '@okyrychenko-dev/react-action-guard-devtools';\n *\n * function IsolatedApp() {\n * return (\n * <UIBlockingProvider>\n * {({ store }) => (\n * <>\n * <YourApp />\n * <ActionGuardDevtools store={store} />\n * </>\n * )}\n * </UIBlockingProvider>\n * );\n * }\n * ```\n *\n * @example\n * Keyboard shortcuts\n * ```\n * Esc - Close devtools panel\n * Ctrl/⌘ + P - Toggle pause/resume event capture\n * Ctrl/⌘ + K - Clear all events\n * ```\n *\n * @see {@link https://github.com/okyrychenko-dev/react-action-guard-devtools | DevTools README}\n * @see {@link createDevtoolsMiddleware} for manual middleware registration\n *\n * @public\n * @since 0.6.0\n */\nfunction ActionGuardDevtools(props: ActionGuardDevtoolsProps): ReactElement | null {\n const { showInProduction = false, ...others } = props;\n\n // Early return in production - no hooks called, no resources allocated\n if (process.env.NODE_ENV === \"production\" && !showInProduction) {\n return null;\n }\n\n return <ActionGuardDevtoolsInternal {...others} />;\n}\n\nexport default ActionGuardDevtools;\n"]}