@okyrychenko-dev/react-action-guard-devtools 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +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/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/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.utils.ts","../src/components/actionGuardDevtools/ActionGuardDevtools.tsx"],"names":["jsx","clsx","jsxs","ActiveBlockers_default","formatScope","EventItem_default","EventDetails_default","Timeline_default","Fragment","DevtoolsPanel_default","getPositionClass","uiBlockingStoreApi","useStore","ToggleButton_default","useMemo","useEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import type { DevtoolsFilter } from \"../types/devtools.types\";\n\nexport const DEFAULT_FILTER: DevtoolsFilter = {\n actions: [\"add\", \"remove\", \"update\", \"cancel\", \"timeout\"],\n scopes: [],\n search: \"\",\n};\n\nexport const DEFAULT_MAX_EVENTS = 200;\n\nexport const DEFAULT_TAB = \"timeline\" as const;\n","import { DEFAULT_FILTER, DEFAULT_MAX_EVENTS, DEFAULT_TAB } 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 // Initial State\n events: [],\n maxEvents: DEFAULT_MAX_EVENTS,\n isOpen: false,\n isMinimized: false,\n activeTab: DEFAULT_TAB,\n filter: DEFAULT_FILTER,\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: `${String(eventData.timestamp)}-${eventData.blockerId}-${Math.random().toString(36).slice(2, 8)}`,\n };\n\n set((state) => {\n const newEvents = [event, ...state.events];\n\n // Trim to max events (circular buffer)\n if (newEvents.length > state.maxEvents) {\n newEvents.pop();\n }\n\n return { events: newEvents };\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: DEFAULT_FILTER });\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 const events = state.events.length > max ? state.events.slice(0, max) : state.events;\n\n return { maxEvents: max, events };\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\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 // Filter by action type\n if (filter.actions.length > 0 && !filter.actions.includes(event.action)) {\n return false;\n }\n\n // Filter by scope\n if (filter.scopes.length > 0) {\n if (!event.config?.scope) {\n return false;\n }\n\n const eventScopes: ReadonlyArray<string> = Array.isArray(event.config.scope)\n ? event.config.scope\n : [event.config.scope];\n\n const hasMatchingScope = eventScopes.some((s: string) => filter.scopes.includes(s));\n\n if (!hasMatchingScope) {\n return false;\n }\n }\n\n // Filter by search query\n if (filter.search) {\n const searchLower = filter.search.toLowerCase();\n const matchesId = event.blockerId.toLowerCase().includes(searchLower);\n const matchesReason = event.config?.reason?.toLowerCase().includes(searchLower);\n\n if (!matchesId && !matchesReason) {\n return false;\n }\n }\n\n return true;\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 if (event.config?.scope) {\n const eventScopes: ReadonlyArray<string> = Array.isArray(event.config.scope)\n ? event.config.scope\n : [event.config.scope];\n\n eventScopes.forEach((s: string) => scopes.add(s));\n }\n });\n\n return Array.from(scopes).sort();\n}\n\nexport function selectAllEvents(state: { events: Array<unknown> }): Array<unknown> {\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\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 remove, timeout, or cancel events\n let duration: number | undefined;\n if (\n context.action === \"remove\" ||\n context.action === \"timeout\" ||\n context.action === \"cancel\"\n ) {\n const addTime = addTimestamps.get(context.blockerId);\n if (addTime !== undefined) {\n duration = context.timestamp - addTime;\n addTimestamps.delete(context.blockerId);\n }\n }\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",".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(\n position: DevtoolsPosition,\n isMinimized: boolean\n): 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 cancel: \"rgb(var(--ag-warning-rgb))\",\n timeout: \"rgb(var(--ag-warning-rgb))\",\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 cancel: \"rgb(var(--ag-warning-rgb) / 0.13)\",\n timeout: \"rgb(var(--ag-warning-rgb) / 0.13)\",\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: background 0.15s, 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=\"cancel\"],\n.eventBadgeAction[data-action=\"timeout\"] {\n background: rgb(var(--ag-warning-rgb) / 0.13);\n color: rgb(var(--ag-warning-rgb));\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 { 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((e) => (e as { id: string }).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 { 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 activeTab === \"timeline\" ? <Timeline /> : <ActiveBlockers store={store} />;\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 {\n getMinimizeButtonTitle,\n getPauseButtonClassName,\n getPauseButtonTitle,\n} from \"./DevtoolsPanelHeader.utils\";\nimport styles from \"./DevtoolsPanel.module.css\";\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 { DEVTOOLS_TABS } from \"./DevtoolsPanelTabs.utils\";\nimport styles from \"./DevtoolsPanel.module.css\";\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 (\n <Badge className={getBadgeClassName(isPaused)}>{count}</Badge>\n );\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","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","import { uiBlockingStoreApi } from \"@okyrychenko-dev/react-action-guard\";\nimport { ReactElement, useCallback, useEffect, useMemo } from \"react\";\nimport { DEVTOOLS_MIDDLEWARE_NAME, createDevtoolsMiddleware } from \"../../middleware\";\nimport { useDevtoolsStore } from \"../../store\";\nimport ActionGuardDevtoolsContent from \"./ActionGuardDevtoolsContent\";\nimport type { ActionGuardDevtoolsProps } from \"./ActionGuardDevtools.types\";\nimport { getDevtoolsKeyboardAction } from \"./ActionGuardDevtools.utils\";\nimport \"../../styles/theme.css\";\n\nfunction ActionGuardDevtools(props: ActionGuardDevtoolsProps): ReactElement | null {\n const {\n position = \"right\",\n defaultOpen = false,\n maxEvents = 200,\n showInProduction = false,\n store: customStore,\n } = 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 // Keyboard shortcuts handler\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n const action = getDevtoolsKeyboardAction(event, isOpen);\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 [isOpen, setOpen, togglePause, clearEvents]\n );\n\n // Register keyboard shortcuts\n useEffect(() => {\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleKeyDown]);\n\n // Don't render in production unless explicitly enabled\n if (process.env.NODE_ENV === \"production\" && !showInProduction) {\n return null;\n }\n\n return <ActionGuardDevtoolsContent position={position} store={customStore} />;\n}\n\nexport default ActionGuardDevtools;\n"]}
package/package.json ADDED
@@ -0,0 +1,99 @@
1
+ {
2
+ "name": "@okyrychenko-dev/react-action-guard-devtools",
3
+ "version": "0.1.1",
4
+ "type": "module",
5
+ "description": "Developer tools for @okyrychenko-dev/react-action-devtools",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "sideEffects": false,
17
+ "files": [
18
+ "dist",
19
+ "README.md",
20
+ "LICENSE"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsup",
24
+ "dev": "tsup --watch",
25
+ "clean": "rm -rf dist",
26
+ "prepublishOnly": "npm run clean && npm run build",
27
+ "typecheck": "tsc --noEmit",
28
+ "lint": "eslint src --ext .ts,.tsx",
29
+ "lint:fix": "eslint src --ext .ts,.tsx --fix",
30
+ "format": "prettier --write \"src/**/*.{ts,tsx}\"",
31
+ "format:check": "prettier --check \"src/**/*.{ts,tsx}\"",
32
+ "test": "vitest",
33
+ "test:ui": "vitest --ui",
34
+ "test:run": "vitest run",
35
+ "test:coverage": "vitest run --coverage",
36
+ "storybook": "storybook dev -p 6006",
37
+ "build-storybook": "storybook build",
38
+ "prepare": "husky"
39
+ },
40
+ "keywords": [
41
+ "react",
42
+ "devtools",
43
+ "ui-blocking",
44
+ "action-guard",
45
+ "typescript",
46
+ "debugging"
47
+ ],
48
+ "author": "Oleksii Kyrychenko alexey.kirichenko@gmail.com",
49
+ "license": "MIT",
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "https://github.com/okyrychenko-dev/react-action-guard-devtools"
53
+ },
54
+ "bugs": {
55
+ "url": "https://github.com/okyrychenko-dev/react-action-guard-devtools/issues"
56
+ },
57
+ "homepage": "https://github.com/okyrychenko-dev/react-action-guard-devtools#readme",
58
+ "publishConfig": {
59
+ "access": "public"
60
+ },
61
+ "peerDependencies": {
62
+ "@okyrychenko-dev/react-action-guard": "^0.5.0",
63
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
64
+ },
65
+ "dependencies": {
66
+ "@okyrychenko-dev/react-zustand-toolkit": "^0.1.1",
67
+ "clsx": "^2.1.1"
68
+ },
69
+ "devDependencies": {
70
+ "@okyrychenko-dev/react-action-guard": "^0.5.0",
71
+ "@storybook/addon-a11y": "^10.1.10",
72
+ "@storybook/addon-docs": "^10.1.10",
73
+ "@storybook/react-vite": "^10.1.10",
74
+ "@testing-library/dom": "^10.4.1",
75
+ "@testing-library/jest-dom": "^6.9.1",
76
+ "@testing-library/react": "^16.3.0",
77
+ "@types/react": "^19.2.5",
78
+ "@vitest/coverage-v8": "^4.0.9",
79
+ "@vitest/ui": "^4.0.9",
80
+ "eslint": "^9.39.1",
81
+ "eslint-config-prettier": "^10.1.8",
82
+ "eslint-plugin-import": "^2.32.0",
83
+ "eslint-plugin-react": "^7.37.5",
84
+ "eslint-plugin-react-hooks": "^7.0.1",
85
+ "eslint-plugin-storybook": "^10.1.10",
86
+ "happy-dom": "^20.0.10",
87
+ "husky": "^9.1.7",
88
+ "prettier": "^3.6.2",
89
+ "react": "^19.2.0",
90
+ "react-dom": "^19.2.0",
91
+ "remark-gfm": "^4.0.1",
92
+ "storybook": "^10.1.10",
93
+ "tsup": "^8.5.1",
94
+ "typescript": "^5.6.3",
95
+ "typescript-eslint": "^8.48.0",
96
+ "vitest": "^4.0.9",
97
+ "zustand": "^5.0.8"
98
+ }
99
+ }