react-state-inspector-devtools 1.0.1 → 1.0.3
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/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -2
package/dist/index.js
CHANGED
|
@@ -156,6 +156,7 @@ function useInspectorComponent(label) {
|
|
|
156
156
|
const trimmed = label?.trim();
|
|
157
157
|
if (trimmed) store.setComponentLabel(componentId, trimmed);
|
|
158
158
|
}, [store, componentId, label]);
|
|
159
|
+
console.log({ id: componentId });
|
|
159
160
|
return (0, import_react.useMemo)(() => ({ id: componentId }), [componentId]);
|
|
160
161
|
}
|
|
161
162
|
|
|
@@ -747,7 +748,7 @@ function StateInspectorUI() {
|
|
|
747
748
|
const [isTransitioning, setIsTransitioning] = (0, import_react4.useState)(false);
|
|
748
749
|
const [open, setOpen] = (0, import_react4.useState)(false);
|
|
749
750
|
const [selectedId, setSelectedId] = (0, import_react4.useState)(null);
|
|
750
|
-
const [, force] = (0, import_react4.useState)(0);
|
|
751
|
+
const [tick, force] = (0, import_react4.useState)(0);
|
|
751
752
|
const searchRef = (0, import_react4.useRef)(null);
|
|
752
753
|
const [pos, setPos] = (0, import_react4.useState)(() => {
|
|
753
754
|
try {
|
|
@@ -805,12 +806,15 @@ function StateInspectorUI() {
|
|
|
805
806
|
const shouldCollapse = leftWidth <= 200 || (size.width ?? 720) - leftWidth < 320;
|
|
806
807
|
setLeftCollapsed(shouldCollapse);
|
|
807
808
|
}, [leftWidth, size.width]);
|
|
809
|
+
console.log("Store", store);
|
|
808
810
|
(0, import_react4.useEffect)(() => store.subscribe(() => force((x) => x + 1)), [store]);
|
|
809
|
-
const snapshot = (0, import_react4.useMemo)(() => store.getSnapshot(), [store]);
|
|
811
|
+
const snapshot = (0, import_react4.useMemo)(() => store.getSnapshot(), [store, tick]);
|
|
812
|
+
console.log("Snapshot", snapshot);
|
|
810
813
|
const components = (0, import_react4.useMemo)(
|
|
811
814
|
() => snapshot.components.filter((c) => c.mounted),
|
|
812
815
|
[snapshot.components]
|
|
813
816
|
);
|
|
817
|
+
console.log(components);
|
|
814
818
|
const q = query.trim().toLowerCase();
|
|
815
819
|
const filtered = (0, import_react4.useMemo)(
|
|
816
820
|
() => q ? components.filter((c) => {
|
|
@@ -820,6 +824,7 @@ function StateInspectorUI() {
|
|
|
820
824
|
}) : components,
|
|
821
825
|
[q, components]
|
|
822
826
|
);
|
|
827
|
+
console.log(filtered);
|
|
823
828
|
(0, import_react4.useEffect)(() => {
|
|
824
829
|
if (!open) return;
|
|
825
830
|
if (components.length === 0) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/store.ts","../src/hooks.ts","../src/StateInspectorUI.tsx","../src/ui/constants.ts","../src/ui/utils.ts","../src/ui/components/FloatingButton.tsx","../src/ui/components/DockPreviewOverlay.tsx","../src/ui/components/ResizeHandle.tsx","../src/ui/components/SidebarResizer.tsx","../src/ui/components/DragHandle.tsx","../src/ui/components/ComponentList.tsx","../src/ui/components/StatePanelHeader.tsx","../src/ui/styles.ts","../src/ui/components/SearchInput.tsx","../src/ui/components/JsonEditor.tsx","../src/ui/components/StateEditor.tsx","../src/ui/components/StateCard.tsx","../src/ui/components/StateEditorPanel.tsx"],"sourcesContent":["export * from \"./provider\";\nexport * from \"./store\";\nexport * from \"./hooks\";\nexport * from \"./StateInspectorUI\";\n","import React, { createContext, useContext, useEffect, useId, useMemo } from \"react\";\nimport { createInspectorStore, InspectorComponentRef, InspectorStore } from \"./store\";\n\nconst InspectorContext = createContext<InspectorStore | null>(null);\n\nconst storeRef = { current: null as InspectorStore | null };\n\nfunction getStore(): InspectorStore {\n if (!storeRef.current) {\n storeRef.current = createInspectorStore();\n }\n return storeRef.current;\n}\n\nexport function StateInspectorProvider({\n enabled = true,\n children,\n}: {\n enabled?: boolean;\n children: React.ReactNode;\n}) {\n const store = useMemo(() => getStore(), []);\n\n useEffect(() => {\n storeRef.current!.enabled = enabled;\n }, [enabled]);\n\n return (\n <InspectorContext.Provider value={store}>\n {children}\n </InspectorContext.Provider>\n );\n}\n\nexport function useInspectorStore(): InspectorStore {\n const ctx = useContext(InspectorContext);\n if (!ctx) {\n throw new Error(\"useInspectorStore must be used inside StateInspectorProvider\");\n }\n return ctx;\n}\n\nexport function useInspectorComponent(label?: string): InspectorComponentRef {\n const store = useInspectorStore();\n const reactId = useId();\n const componentId = useMemo(() => `c_${reactId}`, [reactId]);\n\n useEffect(() => {\n if (!store.enabled) return;\n\n store.registerComponent(componentId, label?.trim());\n return () => {\n store.unregisterComponent(componentId);\n };\n }, [store, componentId, label]);\n\n useEffect(() => {\n if (!store.enabled) return;\n const trimmed = label?.trim();\n if (trimmed) store.setComponentLabel(componentId, trimmed);\n }, [store, componentId, label]);\n\n return useMemo(() => ({ id: componentId }), [componentId]);\n}\n","export type ComponentId = string;\n\nexport type InspectableMeta =\n | { type: \"boolean\" }\n | { type: \"text\"; placeholder?: string }\n | { type: \"number\"; min?: number; max?: number; step?: number }\n | { type: \"select\"; options: Array<string | { label: string; value: string }> }\n | { type: \"json\" }\n | { type: \"custom\"; renderId: string };\n\nexport interface InspectableStateEntry {\n key: string;\n value: unknown;\n setValue: (next: unknown) => void;\n meta?: InspectableMeta;\n}\n\nexport interface ComponentEntry {\n id: ComponentId;\n label: string;\n mounted: boolean;\n states: Map<string, InspectableStateEntry>;\n}\n\nexport interface InspectorSnapshot {\n enabled: boolean;\n components: Array<{\n id: ComponentId;\n label: string;\n mounted: boolean;\n stateKeys: string[];\n }>;\n}\n\ntype Listener = () => void;\n\nexport interface InspectorComponentRef {\n id: string;\n}\n\nexport interface InspectorStore {\n enabled: boolean;\n\n // internal registry\n components: Map<ComponentId, ComponentEntry>;\n\n // subscriptions\n subscribe: (listener: Listener) => () => void;\n getSnapshot: () => InspectorSnapshot;\n\n // component lifecycle\n registerComponent: (id: ComponentId, label?: string) => void;\n setComponentLabel: (id: ComponentId, label: string) => void;\n unregisterComponent: (id: ComponentId) => void;\n\n // state lifecycle\n upsertState: (\n componentId: ComponentId,\n entry: InspectableStateEntry,\n ) => void;\n\n updateStateValue: (componentId: ComponentId, key: string, value: unknown) => void;\n removeState: (componentId: ComponentId, key: string) => void;\n}\n\nexport function createInspectorStore(): InspectorStore {\n const components = new Map<ComponentId, ComponentEntry>();\n const listeners = new Set<Listener>();\n\n function emit() {\n for (const l of listeners) l();\n }\n\n function getOrCreateComponent(id: ComponentId): ComponentEntry {\n const existing = components.get(id);\n if (existing) return existing;\n\n const created: ComponentEntry = {\n id,\n label: \"Unknown\",\n mounted: true,\n states: new Map(),\n };\n components.set(id, created);\n return created;\n }\n\n const store: InspectorStore = {\n enabled: true,\n components,\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n getSnapshot() {\n return {\n enabled: store.enabled,\n components: Array.from(components.values()).map((c) => ({\n id: c.id,\n label: c.label,\n mounted: c.mounted,\n stateKeys: Array.from(c.states.keys()),\n })),\n };\n },\n\n registerComponent(id, label) {\n const c = getOrCreateComponent(id);\n c.mounted = true;\n if (label && label.trim()) c.label = label.trim();\n emit();\n },\n\n setComponentLabel(id, label) {\n const c = getOrCreateComponent(id);\n c.label = label.trim() || \"Unknown\";\n emit();\n },\n\n unregisterComponent(id) {\n const c = components.get(id);\n if (!c) return;\n\n // StrictMode double-unmount safe:\n // we mark as unmounted; UI can choose to hide unmounted entries.\n c.mounted = false;\n\n // Optional: immediate cleanup if you prefer:\n // components.delete(id);\n\n emit();\n },\n\n upsertState(componentId, entry) {\n const c = getOrCreateComponent(componentId);\n c.states.set(entry.key, entry);\n emit();\n },\n\n updateStateValue(componentId, key, value) {\n const c = components.get(componentId);\n if (!c) return;\n const s = c.states.get(key);\n if (!s) return;\n s.value = value;\n emit();\n },\n\n removeState(componentId, key) {\n const c = components.get(componentId);\n if (!c) return;\n if (!c.states.has(key)) return;\n c.states.delete(key);\n emit();\n },\n };\n\n return store;\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { useInspectorStore } from \"./provider\";\nimport type { InspectableMeta, InspectorComponentRef } from \"./store\";\n\nfunction stableKey(input: string): string {\n return input.trim();\n}\n\nfunction inferMeta(value: unknown): InspectableMeta | undefined {\n const t = typeof value;\n if (t === \"boolean\") return { type: \"boolean\" };\n if (t === \"number\") return { type: \"number\" };\n if (t === \"string\") return { type: \"text\" };\n if (value && t === \"object\") return { type: \"json\" };\n return undefined;\n}\n\n/**\n * Registers a piece of state to the inspector registry.\n * Opt-in by replacing useState with useInspectableState.\n */\nexport function useInspectableState<T>(\n component: InspectorComponentRef,\n key: string,\n initial: T | (() => T),\n meta?: InspectableMeta,\n): [T, React.Dispatch<React.SetStateAction<T>>] {\n const store = useInspectorStore();\n const componentId = component.id;\n\n const stateKey = useMemo(() => stableKey(key), [key]);\n\n const [value, setValue] = useState<T>(initial);\n\n // Keep latest setter stable for registry consumers\n const setValueRef = useRef<(next: unknown) => void>(() => {});\n setValueRef.current = (next: unknown) => {\n setValue(next as T);\n };\n\n // Register component + state entry\n useEffect(() => {\n if (!store.enabled) return;\n\n const resolvedMeta = meta ?? inferMeta(value);\n store.upsertState(componentId, {\n key: stateKey,\n value,\n setValue: (next) => setValueRef.current(next),\n ...(resolvedMeta !== undefined && { meta: resolvedMeta }),\n });\n\n return () => {\n store.removeState(componentId, stateKey);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [store, componentId, stateKey]);\n\n // Sync updates on each render when value/meta changes\n useEffect(() => {\n if (!store.enabled) return;\n\n const resolvedMeta = meta ?? inferMeta(value);\n store.upsertState(componentId, {\n key: stateKey,\n value,\n setValue: (next) => setValueRef.current(next),\n ...(resolvedMeta !== undefined && { meta: resolvedMeta }),\n });\n }, [store, componentId, stateKey, value, meta]);\n\n return [value, setValue];\n}\n\n/**\n * Optional helper to give the current component instance a human label.\n */\nexport function useComponentLabel(label: string) {\n const store = useInspectorStore();\n const reactId = useId();\n const componentId = useMemo(() => `c_${reactId}`, [reactId]);\n\n useEffect(() => {\n if (!store.enabled) return;\n const trimmed = label.trim();\n if (!trimmed) return;\n store.setComponentLabel(componentId, trimmed);\n }, [store, componentId, label]);\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useInspectorStore } from \"./provider\";\n\n// UI imports\nimport {\n LS_LAYOUT,\n LS_KEY,\n LS_SIZE,\n LS_LEFT_W,\n isMac,\n} from \"./ui/constants\";\n\nimport type { DockMode, DockPreview, PanelPosition, PanelSize } from \"./ui/types\";\n\nimport { computePreview, previewRectStyle } from \"./ui/utils\";\n\nimport {\n FloatingButton,\n DockPreviewOverlay,\n ResizeHandle,\n SidebarResizer,\n ComponentList,\n StateEditorPanel,\n} from \"./ui/components\";\n\nexport function StateInspectorUI() {\n const store = useInspectorStore();\n const [query, setQuery] = useState<string>(\"\");\n const [leftCollapsed, setLeftCollapsed] = useState(false);\n\n const [layout, setLayout] = useState<DockMode>(\"floating\");\n const [preview, setPreview] = useState<DockPreview>(null);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [open, setOpen] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [, force] = useState(0);\n\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n // Persisted panel position\n const [pos, setPos] = useState<PanelPosition>(() => {\n try {\n const raw = localStorage.getItem(LS_KEY);\n return raw ? JSON.parse(raw) : { right: 16, bottom: 72 };\n } catch {\n return { right: 16, bottom: 72 };\n }\n });\n\n // Persisted sidebar width\n const [leftWidth, setLeftWidth] = useState(() => {\n try {\n const raw = localStorage.getItem(LS_LEFT_W);\n return raw ? Number(raw) : 280;\n } catch {\n return 280;\n }\n });\n\n // Persisted panel size\n const [size, setSize] = useState<PanelSize>(() => {\n try {\n const raw = localStorage.getItem(LS_SIZE);\n return raw ? JSON.parse(raw) : { width: 720, height: 420 };\n } catch {\n return { width: 720, height: 420 };\n }\n });\n\n // Persist layout to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_LAYOUT, layout); } catch(e) {\n console.error(e);\n }\n }, [layout]);\n\n // Persist position to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_KEY, JSON.stringify(pos)); } catch(e) {\n console.error(e);\n }\n }, [pos]);\n\n // Persist sidebar width to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_LEFT_W, String(leftWidth)); } catch(e) {\n console.error(e);\n }\n }, [leftWidth]);\n\n // Persist size to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_SIZE, JSON.stringify(size)); } catch(e) {\n console.error(e);\n }\n }, [size]);\n\n // Auto-collapse sidebar when too narrow\n useEffect(() => {\n const shouldCollapse = leftWidth <= 200 || (size.width ?? 720) - leftWidth < 320;\n setLeftCollapsed(shouldCollapse);\n }, [leftWidth, size.width]);\n\n // Subscribe to store changes\n useEffect(() => store.subscribe(() => force((x) => x + 1)), [store]);\n\n // Get mounted components\n const snapshot = useMemo(() => store.getSnapshot(), [store]);\n const components = useMemo(\n () => snapshot.components.filter((c) => c.mounted),\n [snapshot.components]\n );\n\n // Filter components by search query\n const q = query.trim().toLowerCase();\n const filtered = useMemo(\n () =>\n q\n ? components.filter((c) => {\n const labelHit = c.label.toLowerCase().includes(q);\n const keyHit = c.stateKeys.some((k) => k.toLowerCase().includes(q));\n return labelHit || keyHit;\n })\n : components,\n [q, components]\n );\n\n // Keep a valid selection\n useEffect(() => {\n if (!open) return;\n\n if (components.length === 0) {\n setSelectedId(null);\n return;\n }\n\n if (!selectedId || !components.some((c) => c.id === selectedId)) {\n setSelectedId(components[0]!.id);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, components.length]);\n\n // Keyboard shortcuts\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n const mod = isMac ? e.metaKey : e.ctrlKey;\n\n // Cmd/Ctrl + Shift + I → toggle inspector\n if (mod && e.shiftKey && e.key.toLowerCase() === \"i\") {\n e.preventDefault();\n setOpen((o) => !o);\n return;\n }\n\n if (!open) return;\n\n // Esc → close\n if (e.key === \"Escape\") {\n setOpen(false);\n return;\n }\n\n // \"/\" → focus search\n if (e.key === \"/\") {\n e.preventDefault();\n searchRef.current?.focus();\n return;\n }\n\n // Arrow navigation\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n const list = filtered;\n if (!list.length) return;\n\n const idx = list.findIndex((c) => c.id === selectedId);\n const next =\n e.key === \"ArrowDown\"\n ? list[(Math.max(-1, idx) + 1) % list.length]!.id\n : list[(idx <= 0 ? list.length - 1 : idx - 1)]!.id;\n\n setSelectedId(next);\n setTimeout(() => {\n document.getElementById(`rsi-comp-${next}`)?.scrollIntoView({ block: \"nearest\" });\n }, 0);\n }\n }\n\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open, filtered, selectedId]);\n\n // Get selected component\n const selected = useMemo(() => {\n if (!selectedId) return null;\n return store.components.get(selectedId) ?? null;\n }, [store, selectedId]);\n\n // Drag end handler - apply dock or reset preview\n const handleDragEnd = () => {\n if (preview) {\n setLayout(preview);\n setIsTransitioning(true);\n\n const rects = previewRectStyle(preview);\n setSize({ width: rects.width as number, height: rects.height as number });\n setPos({\n left: rects.left as number,\n right: rects.right as number,\n top: rects.top as number,\n bottom: rects.bottom as number,\n });\n setPreview(null);\n\n setTimeout(() => setIsTransitioning(false), 300);\n return;\n }\n setPreview(null);\n };\n\n // Drag start handler - initiate panel movement\n const handleDragStart = (e: React.PointerEvent<HTMLDivElement>) => {\n const startX = e.clientX;\n const startY = e.clientY;\n const start = pos;\n\n setLayout(\"floating\");\n setIsTransitioning(true);\n setSize({ width: 720, height: 420 });\n setTimeout(() => setIsTransitioning(false), 300);\n\n (e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n const nextPreview = computePreview(ev.clientX, ev.clientY);\n\n setPreview((p) => (p === nextPreview ? p : nextPreview));\n\n const newPos: PanelPosition = {};\n if (start.left !== undefined) {\n newPos.left = Math.max(8, start.left + dx);\n } else {\n newPos.right = Math.max(8, (start.right ?? 16) - dx);\n }\n if (start.top !== undefined) {\n newPos.top = Math.max(8, start.top + dy);\n } else {\n newPos.bottom = Math.max(8, (start.bottom ?? 72) - dy);\n }\n setPos(newPos);\n };\n\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n };\n\n // Handle panel resize\n const handlePanelResize = (startSize: PanelSize) => (delta: { dx: number; dy: number }) => {\n setSize({\n width: Math.min(window.innerWidth - 16, Math.max(480, (startSize.width ?? 0) + delta.dx)),\n height: Math.min(window.innerHeight - 120, Math.max(280, (startSize.height ?? 0) + delta.dy)),\n });\n };\n\n if (!store.enabled) return null;\n\n return createPortal(\n <>\n <FloatingButton onClick={() => setOpen((o) => !o)} />\n <DockPreviewOverlay preview={preview} />\n\n {open && (\n <div\n style={{\n position: \"fixed\",\n left: pos.left,\n right: pos.right,\n top: pos.top,\n bottom: pos.bottom,\n width: size.width || \"calc(100dvw - 24px)\",\n maxWidth: \"calc(100vw - 24px)\",\n height: size.height || \"calc(100dvh - 24px)\",\n maxHeight: \"calc(100vh - 24px)\",\n background: \"#1c1c1c\",\n color: \"#fff\",\n borderRadius: 12,\n border: \"1px solid #333\",\n zIndex: 999999,\n display: \"grid\",\n gridTemplateColumns: leftCollapsed ? \"auto\" : `${leftWidth}px 14px auto`,\n overflow: \"hidden\",\n transition: isTransitioning ? \"all 0.3s ease\" : \"none\",\n }}\n >\n <ResizeHandle onResize={handlePanelResize(size)} />\n\n <ComponentList\n components={filtered}\n selectedId={selectedId}\n onSelect={setSelectedId}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n height={size.height}\n hidden={leftCollapsed}\n />\n\n <SidebarResizer\n leftWidth={leftWidth}\n onWidthChange={setLeftWidth}\n hidden={leftCollapsed}\n />\n\n <StateEditorPanel\n selected={selected}\n query={query}\n onQueryChange={setQuery}\n searchRef={searchRef}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={() => setLeftCollapsed((v) => !v)}\n onClose={() => setOpen(false)}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n />\n </div>\n )}\n </>,\n document.body,\n );\n}\n","// LocalStorage keys\nexport const LS_LAYOUT = \"rsi:panel-layout\";\nexport const LS_KEY = \"rsi:panel-pos\";\nexport const LS_SIZE = \"rsi:panel-size\";\nexport const LS_LEFT_W = \"rsi:left-width\";\n\n// Dock settings\nexport const SNAP = 100; // distance in px to trigger dock preview\nexport const DOCK_W = 420; // left/right dock width\nexport const DOCK_H = 320; // top/bottom dock height\nexport const MARGIN = 12; // dock margin\n\n// Sidebar settings\nexport const LEFT_MIN = 180;\nexport const LEFT_MAX = 420;\n\n// Platform detection\nexport const isMac = typeof navigator !== \"undefined\" \n ? navigator.platform.toUpperCase().includes(\"MAC\") \n : false;\n","import type React from \"react\";\nimport { SNAP, DOCK_W, DOCK_H, MARGIN } from \"./constants\";\nimport type { DockPreview } from \"./types\";\n\n/**\n * Type guard for select option objects\n */\nexport function isOptionObject(\n opt: string | { label: string; value: string },\n): opt is { label: string; value: string } {\n return typeof opt === \"object\" && opt !== null && \"value\" in opt;\n}\n\n/**\n * Compute dock preview based on cursor position\n */\nexport function computePreview(x: number, y: number): DockPreview {\n const w = window.innerWidth;\n const h = window.innerHeight;\n\n const nearLeft = x <= SNAP;\n const nearRight = x >= w - SNAP;\n const nearTop = y <= SNAP;\n const nearBottom = y >= h - SNAP;\n\n // Priority: horizontal edges take precedence over vertical\n if (nearLeft) return \"dock-left\";\n if (nearRight) return \"dock-right\";\n if (nearTop) return \"dock-top\";\n if (nearBottom) return \"dock-bottom\";\n return null;\n}\n\n/**\n * Get CSS properties for dock preview rectangle\n */\nexport function previewRectStyle(p: DockPreview): React.CSSProperties {\n const base: React.CSSProperties = {\n position: \"fixed\",\n border: \"1px dashed #555\",\n background: \"rgba(255,255,255,0.06)\",\n borderRadius: 12,\n };\n\n if (p === \"dock-left\") {\n return { ...base, left: MARGIN, top: MARGIN, bottom: MARGIN, width: DOCK_W };\n }\n if (p === \"dock-right\") {\n return { ...base, right: MARGIN, top: MARGIN, bottom: MARGIN, width: DOCK_W };\n }\n if (p === \"dock-top\") {\n return { ...base, left: MARGIN, right: MARGIN, top: MARGIN, height: DOCK_H };\n }\n // dock-bottom\n return { ...base, left: MARGIN, right: MARGIN, bottom: MARGIN, height: DOCK_H };\n}\n\n/**\n * Safely stringify a value to JSON\n */\nexport function safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n}\n","interface FloatingButtonProps {\n onClick: () => void;\n}\n\nexport function FloatingButton({ onClick }: FloatingButtonProps) {\n return (\n <button\n title=\"State Inspector (⌘⇧I / Ctrl⇧I)\"\n onClick={onClick}\n style={{\n position: \"fixed\",\n right: 16,\n bottom: 16,\n width: 44,\n height: 44,\n borderRadius: 22,\n border: \"none\",\n background: \"#111\",\n color: \"#fff\",\n cursor: \"pointer\",\n zIndex: 999999,\n }}\n aria-label=\"Toggle State Inspector\"\n >\n ◎\n </button>\n );\n}\n","import type { DockPreview } from \"../types\";\nimport { previewRectStyle } from \"../utils\";\n\ninterface DockPreviewOverlayProps {\n preview: DockPreview;\n}\n\nexport function DockPreviewOverlay({ preview }: DockPreviewOverlayProps) {\n if (!preview) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 999998,\n }}\n >\n <div style={previewRectStyle(preview)} />\n </div>\n );\n}\n","interface ResizeHandleProps {\n onResize: (delta: { dx: number; dy: number }) => void;\n}\n\nexport function ResizeHandle({ onResize }: ResizeHandleProps) {\n return (\n <div\n onPointerDown={(e) => {\n const startX = e.clientX;\n const startY = e.clientY;\n\n (e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n onResize({\n dx: ev.clientX - startX,\n dy: ev.clientY - startY,\n });\n };\n\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n }}\n style={{\n position: \"absolute\",\n right: 6,\n bottom: 6,\n width: 14,\n height: 14,\n borderRadius: 6,\n border: \"1px solid #333\",\n background: \"#838383\",\n cursor: \"nwse-resize\",\n }}\n />\n );\n}\n","import { LEFT_MIN, LEFT_MAX } from \"../constants\";\n\ninterface SidebarResizerProps {\n leftWidth: number;\n onWidthChange: (width: number) => void;\n hidden: boolean;\n}\n\nexport function SidebarResizer({ leftWidth, onWidthChange, hidden }: SidebarResizerProps) {\n if (hidden) return null;\n\n return (\n <div\n onPointerDown={(e) => {\n e.preventDefault();\n const startX = e.clientX;\n const startW = leftWidth;\n\n (e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const next = Math.max(LEFT_MIN, Math.min(LEFT_MAX, startW + dx));\n onWidthChange(next);\n };\n\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n }}\n style={{\n width: 8,\n cursor: \"col-resize\",\n background: \"transparent\",\n borderLeft: \"1px solid #2a2a2a\",\n borderRight: \"1px solid #2a2a2a\",\n }}\n title=\"Resize sidebar\"\n />\n );\n}\n","import type React from \"react\";\n\ninterface DragHandleProps {\n children: React.ReactNode;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n style?: React.CSSProperties;\n}\n\nexport function DragHandle({ children, onDragStart, onDragEnd, style }: DragHandleProps) {\n return (\n <div\n style={{ cursor: \"grab\", userSelect: \"none\", ...style }}\n onPointerDown={onDragStart}\n onPointerUp={onDragEnd}\n >\n {children}\n </div>\n );\n}\n","import type React from \"react\";\nimport type { ComponentSummary } from \"../types\";\nimport { DragHandle } from \"./DragHandle\";\n\ninterface ComponentListProps {\n components: ComponentSummary[];\n selectedId: string | null;\n onSelect: (id: string) => void;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n height?: number | undefined;\n hidden: boolean;\n}\n\nexport function ComponentList({\n components,\n selectedId,\n onSelect,\n onDragStart,\n onDragEnd,\n height,\n hidden,\n}: ComponentListProps) {\n if (hidden) return null;\n\n return (\n <div style={{ padding: 12, height, flexDirection: \"column\", boxSizing: \"border-box\", display: \"flex\" }}>\n <DragHandle\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}\n >\n <h4 style={{ margin: 0 }}>Components</h4>\n <span style={{ fontSize: 12, opacity: 0.7 }}>{components.length}</span>\n </DragHandle>\n\n <div style={{ marginTop: 10, display: \"flex\", flexDirection: \"column\", gap: 8, overflow: \"auto\", flex: 1 }}>\n {components.map((c) => {\n const active = c.id === selectedId;\n return (\n <button\n key={c.id}\n id={`rsi-comp-${c.id}`}\n onClick={() => onSelect(c.id)}\n style={{\n textAlign: \"left\",\n background: active ? \"#2a2a2a\" : \"transparent\",\n border: \"1px solid #333\",\n borderRadius: 10,\n padding: 10,\n color: \"#fff\",\n cursor: \"pointer\",\n flex: \"none\",\n }}\n >\n <div style={{ fontWeight: 700 }}>{c.label}</div>\n <div style={{ fontSize: 12, opacity: 0.7 }}>\n states: {c.stateKeys.length || 0}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import type React from \"react\";\nimport { DragHandle } from \"./DragHandle\";\n\ninterface StatePanelHeaderProps {\n selectedLabel: string | null;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n onClose: () => void;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n}\n\nexport function StatePanelHeader({\n selectedLabel,\n leftCollapsed,\n onToggleCollapse,\n onClose,\n onDragStart,\n onDragEnd,\n}: StatePanelHeaderProps) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\" }}>\n <button\n onClick={(e) => {\n e.preventDefault();\n onToggleCollapse();\n }}\n style={{\n padding: 4,\n marginRight: 12,\n borderRadius: 6,\n border: \"1px solid #333\",\n background: \"transparent\",\n color: \"#fff\",\n cursor: \"pointer\",\n fontSize: 12,\n width: 24,\n height: 24,\n }}\n >\n {leftCollapsed ? \"»\" : \"«\"}\n </button>\n\n <DragHandle\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n style={{ display: \"flex\", flexDirection: \"column\", flex: 1 }}\n >\n <h4 style={{ margin: 0 }}>State</h4>\n <div style={{ fontSize: 12, opacity: 0.7 }}>\n {selectedLabel ?? \"No selection\"}\n </div>\n </DragHandle>\n\n <button\n onClick={onClose}\n style={{\n background: \"transparent\",\n color: \"#fff\",\n border: \"1px solid #333\",\n borderRadius: 10,\n padding: \"6px 10px\",\n cursor: \"pointer\",\n fontSize: 12,\n marginLeft: \"auto\",\n }}\n >\n Close\n </button>\n </div>\n );\n}\n","import type React from \"react\";\n\nexport const inputStyle: React.CSSProperties = {\n padding: \"8px 10px\",\n borderRadius: 10,\n border: \"1px solid #333\",\n background: \"#111\",\n color: \"#fff\",\n};\n\nexport const cardStyle: React.CSSProperties = {\n border: \"1px solid #333\",\n borderRadius: 12,\n padding: 10,\n};\n\nexport const buttonStyle: React.CSSProperties = {\n background: \"transparent\",\n color: \"#fff\",\n border: \"1px solid #333\",\n cursor: \"pointer\",\n};\n","import type React from \"react\";\nimport { inputStyle } from \"../styles\";\n\ninterface SearchInputProps {\n value: string;\n onChange: (value: string) => void;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\nexport function SearchInput({ value, onChange, inputRef }: SearchInputProps) {\n return (\n <input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"Search components / state keys…\"\n ref={inputRef}\n style={{\n ...inputStyle,\n marginTop: 10,\n outline: \"none\",\n }}\n />\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { inputStyle } from \"../styles\";\n\ninterface JsonEditorProps {\n initial: string;\n onValidJson: (obj: unknown) => void;\n}\n\nexport function JsonEditor({ initial, onValidJson }: JsonEditorProps) {\n const [raw, setRaw] = useState(initial);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n setRaw(initial);\n }, [initial]);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const next = e.target.value;\n setRaw(next);\n\n try {\n const parsed = JSON.parse(next);\n setError(null);\n onValidJson(parsed);\n } catch {\n setError(\"Invalid JSON\");\n }\n };\n\n return (\n <div style={{ display: \"grid\", gap: 6 }}>\n <textarea\n value={raw}\n onChange={handleChange}\n rows={6}\n style={{\n ...inputStyle,\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n fontSize: 12,\n resize: \"vertical\",\n }}\n />\n {error && <div style={{ fontSize: 12, color: \"#ff6b6b\" }}>{error}</div>}\n </div>\n );\n}\n","import type { InspectableMeta } from \"../../store\";\nimport { inputStyle } from \"../styles\";\nimport { isOptionObject, safeStringify } from \"../utils\";\nimport { JsonEditor } from \"./JsonEditor\";\n\ninterface StateEditorProps {\n value: unknown;\n meta: InspectableMeta | undefined;\n onChange: (next: unknown) => void;\n}\n\nexport function StateEditor({ value, meta, onChange }: StateEditorProps) {\n // boolean\n if (meta?.type === \"boolean\" || typeof value === \"boolean\") {\n return (\n <label style={{ display: \"flex\", gap: 10, alignItems: \"center\" }}>\n <input\n type=\"checkbox\"\n checked={Boolean(value)}\n onChange={(e) => onChange(e.target.checked)}\n />\n <span style={{ fontSize: 13, opacity: 0.8 }}>{String(Boolean(value))}</span>\n </label>\n );\n }\n\n // select\n if (meta?.type === \"select\" && Array.isArray(meta.options)) {\n const current = typeof value === \"string\" ? value : String(value ?? \"\");\n return (\n <select\n value={current}\n onChange={(e) => onChange(e.target.value)}\n style={inputStyle}\n >\n {meta.options.map((opt: string | { label: string; value: string }) => {\n const o = isOptionObject(opt) ? opt : { label: String(opt), value: String(opt) };\n return (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n );\n })}\n </select>\n );\n }\n\n // number\n if (meta?.type === \"number\") {\n return (\n <input\n type=\"number\"\n value={typeof value === \"number\" ? value : Number(value ?? 0)}\n min={meta?.min}\n max={meta?.max}\n step={meta?.step}\n onChange={(e) => onChange(e.target.value === \"\" ? 0 : Number(e.target.value))}\n style={inputStyle}\n />\n );\n }\n\n // json\n if (meta?.type === \"json\" || (value && typeof value === \"object\")) {\n return <JsonEditor initial={safeStringify(value)} onValidJson={onChange} />;\n }\n\n // text (default)\n return (\n <input\n type=\"text\"\n value={typeof value === \"string\" ? value : String(value ?? \"\")}\n placeholder={meta?.type === \"text\" ? meta.placeholder : undefined}\n onChange={(e) => onChange(e.target.value)}\n style={inputStyle}\n />\n );\n}\n","import type { InspectableStateEntry } from \"../../store\";\nimport { cardStyle } from \"../styles\";\nimport { StateEditor } from \"./StateEditor\";\n\ninterface StateCardProps {\n state: InspectableStateEntry;\n}\n\nexport function StateCard({ state }: StateCardProps) {\n return (\n <div\n style={{\n ...cardStyle,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <div style={{ display: \"flex\", justifyContent: \"space-between\", gap: 12 }}>\n <div style={{ fontWeight: 700 }}>{state.key}</div>\n <div style={{ fontSize: 12, opacity: 0.6 }}>{state.meta?.type ?? \"auto\"}</div>\n </div>\n\n <StateEditor\n value={state.value}\n meta={state.meta}\n onChange={(next) => state.setValue(next)}\n />\n </div>\n );\n}\n","import type React from \"react\";\nimport type { ComponentEntry } from \"../../store\";\nimport { StatePanelHeader } from \"./StatePanelHeader\";\nimport { SearchInput } from \"./SearchInput\";\nimport { StateCard } from \"./StateCard\";\n\ninterface StateEditorPanelProps {\n selected: ComponentEntry | null;\n query: string;\n onQueryChange: (value: string) => void;\n searchRef: React.RefObject<HTMLInputElement | null>;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n onClose: () => void;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n}\n\nexport function StateEditorPanel({\n selected,\n query,\n onQueryChange,\n searchRef,\n leftCollapsed,\n onToggleCollapse,\n onClose,\n onDragStart,\n onDragEnd,\n}: StateEditorPanelProps) {\n return (\n <div style={{ padding: 12, overflow: \"auto\", display: \"flex\", flexDirection: \"column\", boxSizing: \"border-box\" }}>\n <StatePanelHeader\n selectedLabel={selected?.label ?? null}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={onToggleCollapse}\n onClose={onClose}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n />\n\n <SearchInput\n value={query}\n onChange={onQueryChange}\n inputRef={searchRef}\n />\n\n <div style={{ marginTop: 12, display: \"grid\", gap: 10 }}>\n {selected && selected.states.size === 0 && (\n <div style={{ fontSize: 13, opacity: 0.7 }}>\n This component has no inspectable state.\n </div>\n )}\n\n {!selected && (\n <div style={{ opacity: 0.7, fontSize: 13 }}>\n No component selected.\n </div>\n )}\n\n {selected &&\n Array.from(selected.states.values()).map((s) => (\n <StateCard key={s.key} state={s} />\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/store.ts","../src/hooks.ts","../src/StateInspectorUI.tsx","../src/ui/constants.ts","../src/ui/utils.ts","../src/ui/components/FloatingButton.tsx","../src/ui/components/DockPreviewOverlay.tsx","../src/ui/components/ResizeHandle.tsx","../src/ui/components/SidebarResizer.tsx","../src/ui/components/DragHandle.tsx","../src/ui/components/ComponentList.tsx","../src/ui/components/StatePanelHeader.tsx","../src/ui/styles.ts","../src/ui/components/SearchInput.tsx","../src/ui/components/JsonEditor.tsx","../src/ui/components/StateEditor.tsx","../src/ui/components/StateCard.tsx","../src/ui/components/StateEditorPanel.tsx"],"sourcesContent":["export * from \"./provider\";\nexport * from \"./store\";\nexport * from \"./hooks\";\nexport * from \"./StateInspectorUI\";\n","import React, { createContext, useContext, useEffect, useId, useMemo } from \"react\";\nimport { createInspectorStore, InspectorComponentRef, InspectorStore } from \"./store\";\n\nconst InspectorContext = createContext<InspectorStore | null>(null);\n\nconst storeRef = { current: null as InspectorStore | null };\n\nfunction getStore(): InspectorStore {\n if (!storeRef.current) {\n storeRef.current = createInspectorStore();\n }\n return storeRef.current;\n}\n\nexport function StateInspectorProvider({\n enabled = true,\n children,\n}: {\n enabled?: boolean;\n children: React.ReactNode;\n}) {\n const store = useMemo(() => getStore(), []);\n\n useEffect(() => {\n storeRef.current!.enabled = enabled;\n }, [enabled]);\n\n return (\n <InspectorContext.Provider value={store}>\n {children}\n </InspectorContext.Provider>\n );\n}\n\nexport function useInspectorStore(): InspectorStore {\n const ctx = useContext(InspectorContext);\n if (!ctx) {\n throw new Error(\"useInspectorStore must be used inside StateInspectorProvider\");\n }\n return ctx;\n}\n\nexport function useInspectorComponent(label?: string): InspectorComponentRef {\n const store = useInspectorStore();\n const reactId = useId();\n const componentId = useMemo(() => `c_${reactId}`, [reactId]);\n\n useEffect(() => {\n if (!store.enabled) return;\n\n store.registerComponent(componentId, label?.trim());\n return () => {\n store.unregisterComponent(componentId);\n };\n }, [store, componentId, label]);\n\n useEffect(() => {\n if (!store.enabled) return;\n const trimmed = label?.trim();\n if (trimmed) store.setComponentLabel(componentId, trimmed);\n }, [store, componentId, label]);\n console.log({ id: componentId });\n \n return useMemo(() => ({ id: componentId }), [componentId]);\n}\n","export type ComponentId = string;\n\nexport type InspectableMeta =\n | { type: \"boolean\" }\n | { type: \"text\"; placeholder?: string }\n | { type: \"number\"; min?: number; max?: number; step?: number }\n | { type: \"select\"; options: Array<string | { label: string; value: string }> }\n | { type: \"json\" }\n | { type: \"custom\"; renderId: string };\n\nexport interface InspectableStateEntry {\n key: string;\n value: unknown;\n setValue: (next: unknown) => void;\n meta?: InspectableMeta;\n}\n\nexport interface ComponentEntry {\n id: ComponentId;\n label: string;\n mounted: boolean;\n states: Map<string, InspectableStateEntry>;\n}\n\nexport interface InspectorSnapshot {\n enabled: boolean;\n components: Array<{\n id: ComponentId;\n label: string;\n mounted: boolean;\n stateKeys: string[];\n }>;\n}\n\ntype Listener = () => void;\n\nexport interface InspectorComponentRef {\n id: string;\n}\n\nexport interface InspectorStore {\n enabled: boolean;\n\n // internal registry\n components: Map<ComponentId, ComponentEntry>;\n\n // subscriptions\n subscribe: (listener: Listener) => () => void;\n getSnapshot: () => InspectorSnapshot;\n\n // component lifecycle\n registerComponent: (id: ComponentId, label?: string) => void;\n setComponentLabel: (id: ComponentId, label: string) => void;\n unregisterComponent: (id: ComponentId) => void;\n\n // state lifecycle\n upsertState: (\n componentId: ComponentId,\n entry: InspectableStateEntry,\n ) => void;\n\n updateStateValue: (componentId: ComponentId, key: string, value: unknown) => void;\n removeState: (componentId: ComponentId, key: string) => void;\n}\n\nexport function createInspectorStore(): InspectorStore {\n const components = new Map<ComponentId, ComponentEntry>();\n const listeners = new Set<Listener>();\n\n function emit() {\n for (const l of listeners) l();\n }\n\n function getOrCreateComponent(id: ComponentId): ComponentEntry {\n const existing = components.get(id);\n if (existing) return existing;\n\n const created: ComponentEntry = {\n id,\n label: \"Unknown\",\n mounted: true,\n states: new Map(),\n };\n components.set(id, created);\n return created;\n }\n\n const store: InspectorStore = {\n enabled: true,\n components,\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n getSnapshot() {\n return {\n enabled: store.enabled,\n components: Array.from(components.values()).map((c) => ({\n id: c.id,\n label: c.label,\n mounted: c.mounted,\n stateKeys: Array.from(c.states.keys()),\n })),\n };\n },\n\n registerComponent(id, label) {\n const c = getOrCreateComponent(id);\n c.mounted = true;\n if (label && label.trim()) c.label = label.trim();\n emit();\n },\n\n setComponentLabel(id, label) {\n const c = getOrCreateComponent(id);\n c.label = label.trim() || \"Unknown\";\n emit();\n },\n\n unregisterComponent(id) {\n const c = components.get(id);\n if (!c) return;\n\n // StrictMode double-unmount safe:\n // we mark as unmounted; UI can choose to hide unmounted entries.\n c.mounted = false;\n\n // Optional: immediate cleanup if you prefer:\n // components.delete(id);\n\n emit();\n },\n\n upsertState(componentId, entry) {\n const c = getOrCreateComponent(componentId);\n c.states.set(entry.key, entry);\n emit();\n },\n\n updateStateValue(componentId, key, value) {\n const c = components.get(componentId);\n if (!c) return;\n const s = c.states.get(key);\n if (!s) return;\n s.value = value;\n emit();\n },\n\n removeState(componentId, key) {\n const c = components.get(componentId);\n if (!c) return;\n if (!c.states.has(key)) return;\n c.states.delete(key);\n emit();\n },\n };\n\n return store;\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { useInspectorStore } from \"./provider\";\nimport type { InspectableMeta, InspectorComponentRef } from \"./store\";\n\nfunction stableKey(input: string): string {\n return input.trim();\n}\n\nfunction inferMeta(value: unknown): InspectableMeta | undefined {\n const t = typeof value;\n if (t === \"boolean\") return { type: \"boolean\" };\n if (t === \"number\") return { type: \"number\" };\n if (t === \"string\") return { type: \"text\" };\n if (value && t === \"object\") return { type: \"json\" };\n return undefined;\n}\n\n/**\n * Registers a piece of state to the inspector registry.\n * Opt-in by replacing useState with useInspectableState.\n */\nexport function useInspectableState<T>(\n component: InspectorComponentRef,\n key: string,\n initial: T | (() => T),\n meta?: InspectableMeta,\n): [T, React.Dispatch<React.SetStateAction<T>>] {\n const store = useInspectorStore();\n const componentId = component.id;\n\n const stateKey = useMemo(() => stableKey(key), [key]);\n\n const [value, setValue] = useState<T>(initial);\n\n // Keep latest setter stable for registry consumers\n const setValueRef = useRef<(next: unknown) => void>(() => {});\n setValueRef.current = (next: unknown) => {\n setValue(next as T);\n };\n\n // Register component + state entry\n useEffect(() => {\n if (!store.enabled) return;\n\n const resolvedMeta = meta ?? inferMeta(value);\n store.upsertState(componentId, {\n key: stateKey,\n value,\n setValue: (next) => setValueRef.current(next),\n ...(resolvedMeta !== undefined && { meta: resolvedMeta }),\n });\n\n return () => {\n store.removeState(componentId, stateKey);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [store, componentId, stateKey]);\n\n // Sync updates on each render when value/meta changes\n useEffect(() => {\n if (!store.enabled) return;\n\n const resolvedMeta = meta ?? inferMeta(value);\n store.upsertState(componentId, {\n key: stateKey,\n value,\n setValue: (next) => setValueRef.current(next),\n ...(resolvedMeta !== undefined && { meta: resolvedMeta }),\n });\n }, [store, componentId, stateKey, value, meta]);\n\n return [value, setValue];\n}\n\n/**\n * Optional helper to give the current component instance a human label.\n */\nexport function useComponentLabel(label: string) {\n const store = useInspectorStore();\n const reactId = useId();\n const componentId = useMemo(() => `c_${reactId}`, [reactId]);\n\n useEffect(() => {\n if (!store.enabled) return;\n const trimmed = label.trim();\n if (!trimmed) return;\n store.setComponentLabel(componentId, trimmed);\n }, [store, componentId, label]);\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useInspectorStore } from \"./provider\";\n\n// UI imports\nimport {\n LS_LAYOUT,\n LS_KEY,\n LS_SIZE,\n LS_LEFT_W,\n isMac,\n} from \"./ui/constants\";\n\nimport type { DockMode, DockPreview, PanelPosition, PanelSize } from \"./ui/types\";\n\nimport { computePreview, previewRectStyle } from \"./ui/utils\";\n\nimport {\n FloatingButton,\n DockPreviewOverlay,\n ResizeHandle,\n SidebarResizer,\n ComponentList,\n StateEditorPanel,\n} from \"./ui/components\";\n\nexport function StateInspectorUI() {\n const store = useInspectorStore();\n const [query, setQuery] = useState<string>(\"\");\n const [leftCollapsed, setLeftCollapsed] = useState(false);\n\n const [layout, setLayout] = useState<DockMode>(\"floating\");\n const [preview, setPreview] = useState<DockPreview>(null);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [open, setOpen] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [tick, force] = useState(0);\n\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n // Persisted panel position\n const [pos, setPos] = useState<PanelPosition>(() => {\n try {\n const raw = localStorage.getItem(LS_KEY);\n return raw ? JSON.parse(raw) : { right: 16, bottom: 72 };\n } catch {\n return { right: 16, bottom: 72 };\n }\n });\n\n // Persisted sidebar width\n const [leftWidth, setLeftWidth] = useState(() => {\n try {\n const raw = localStorage.getItem(LS_LEFT_W);\n return raw ? Number(raw) : 280;\n } catch {\n return 280;\n }\n });\n\n // Persisted panel size\n const [size, setSize] = useState<PanelSize>(() => {\n try {\n const raw = localStorage.getItem(LS_SIZE);\n return raw ? JSON.parse(raw) : { width: 720, height: 420 };\n } catch {\n return { width: 720, height: 420 };\n }\n });\n\n // Persist layout to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_LAYOUT, layout); } catch(e) {\n console.error(e);\n }\n }, [layout]);\n\n // Persist position to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_KEY, JSON.stringify(pos)); } catch(e) {\n console.error(e);\n }\n }, [pos]);\n\n // Persist sidebar width to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_LEFT_W, String(leftWidth)); } catch(e) {\n console.error(e);\n }\n }, [leftWidth]);\n\n // Persist size to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_SIZE, JSON.stringify(size)); } catch(e) {\n console.error(e);\n }\n }, [size]);\n\n // Auto-collapse sidebar when too narrow\n useEffect(() => {\n const shouldCollapse = leftWidth <= 200 || (size.width ?? 720) - leftWidth < 320;\n setLeftCollapsed(shouldCollapse);\n }, [leftWidth, size.width]);\n console.log(\"Store\", store);\n \n // Subscribe to store changes\n useEffect(() => store.subscribe(() => force((x) => x + 1)), [store]);\n\n // Get mounted components\n const snapshot = useMemo(() => store.getSnapshot(), [store, tick]);\n console.log(\"Snapshot\", snapshot);\n \n const components = useMemo(\n () => snapshot.components.filter((c) => c.mounted),\n [snapshot.components]\n );\n\n console.log(components);\n \n\n // Filter components by search query\n const q = query.trim().toLowerCase();\n const filtered = useMemo(\n () =>\n q\n ? components.filter((c) => {\n const labelHit = c.label.toLowerCase().includes(q);\n const keyHit = c.stateKeys.some((k) => k.toLowerCase().includes(q));\n return labelHit || keyHit;\n })\n : components,\n [q, components]\n );\n\n console.log(filtered);\n\n // Keep a valid selection\n useEffect(() => {\n if (!open) return;\n\n if (components.length === 0) {\n setSelectedId(null);\n return;\n }\n\n if (!selectedId || !components.some((c) => c.id === selectedId)) {\n setSelectedId(components[0]!.id);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, components.length]);\n\n // Keyboard shortcuts\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n const mod = isMac ? e.metaKey : e.ctrlKey;\n\n // Cmd/Ctrl + Shift + I → toggle inspector\n if (mod && e.shiftKey && e.key.toLowerCase() === \"i\") {\n e.preventDefault();\n setOpen((o) => !o);\n return;\n }\n\n if (!open) return;\n\n // Esc → close\n if (e.key === \"Escape\") {\n setOpen(false);\n return;\n }\n\n // \"/\" → focus search\n if (e.key === \"/\") {\n e.preventDefault();\n searchRef.current?.focus();\n return;\n }\n\n // Arrow navigation\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n const list = filtered;\n if (!list.length) return;\n\n const idx = list.findIndex((c) => c.id === selectedId);\n const next =\n e.key === \"ArrowDown\"\n ? list[(Math.max(-1, idx) + 1) % list.length]!.id\n : list[(idx <= 0 ? list.length - 1 : idx - 1)]!.id;\n\n setSelectedId(next);\n setTimeout(() => {\n document.getElementById(`rsi-comp-${next}`)?.scrollIntoView({ block: \"nearest\" });\n }, 0);\n }\n }\n\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open, filtered, selectedId]);\n\n // Get selected component\n const selected = useMemo(() => {\n if (!selectedId) return null;\n return store.components.get(selectedId) ?? null;\n }, [store, selectedId]);\n\n // Drag end handler - apply dock or reset preview\n const handleDragEnd = () => {\n if (preview) {\n setLayout(preview);\n setIsTransitioning(true);\n\n const rects = previewRectStyle(preview);\n setSize({ width: rects.width as number, height: rects.height as number });\n setPos({\n left: rects.left as number,\n right: rects.right as number,\n top: rects.top as number,\n bottom: rects.bottom as number,\n });\n setPreview(null);\n\n setTimeout(() => setIsTransitioning(false), 300);\n return;\n }\n setPreview(null);\n };\n\n // Drag start handler - initiate panel movement\n const handleDragStart = (e: React.PointerEvent<HTMLDivElement>) => {\n const startX = e.clientX;\n const startY = e.clientY;\n const start = pos;\n\n setLayout(\"floating\");\n setIsTransitioning(true);\n setSize({ width: 720, height: 420 });\n setTimeout(() => setIsTransitioning(false), 300);\n\n (e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n const nextPreview = computePreview(ev.clientX, ev.clientY);\n\n setPreview((p) => (p === nextPreview ? p : nextPreview));\n\n const newPos: PanelPosition = {};\n if (start.left !== undefined) {\n newPos.left = Math.max(8, start.left + dx);\n } else {\n newPos.right = Math.max(8, (start.right ?? 16) - dx);\n }\n if (start.top !== undefined) {\n newPos.top = Math.max(8, start.top + dy);\n } else {\n newPos.bottom = Math.max(8, (start.bottom ?? 72) - dy);\n }\n setPos(newPos);\n };\n\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n };\n\n // Handle panel resize\n const handlePanelResize = (startSize: PanelSize) => (delta: { dx: number; dy: number }) => {\n setSize({\n width: Math.min(window.innerWidth - 16, Math.max(480, (startSize.width ?? 0) + delta.dx)),\n height: Math.min(window.innerHeight - 120, Math.max(280, (startSize.height ?? 0) + delta.dy)),\n });\n };\n\n if (!store.enabled) return null;\n\n return createPortal(\n <>\n <FloatingButton onClick={() => setOpen((o) => !o)} />\n <DockPreviewOverlay preview={preview} />\n\n {open && (\n <div\n style={{\n position: \"fixed\",\n left: pos.left,\n right: pos.right,\n top: pos.top,\n bottom: pos.bottom,\n width: size.width || \"calc(100dvw - 24px)\",\n maxWidth: \"calc(100vw - 24px)\",\n height: size.height || \"calc(100dvh - 24px)\",\n maxHeight: \"calc(100vh - 24px)\",\n background: \"#1c1c1c\",\n color: \"#fff\",\n borderRadius: 12,\n border: \"1px solid #333\",\n zIndex: 999999,\n display: \"grid\",\n gridTemplateColumns: leftCollapsed ? \"auto\" : `${leftWidth}px 14px auto`,\n overflow: \"hidden\",\n transition: isTransitioning ? \"all 0.3s ease\" : \"none\",\n }}\n >\n <ResizeHandle onResize={handlePanelResize(size)} />\n\n <ComponentList\n components={filtered}\n selectedId={selectedId}\n onSelect={setSelectedId}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n height={size.height}\n hidden={leftCollapsed}\n />\n\n <SidebarResizer\n leftWidth={leftWidth}\n onWidthChange={setLeftWidth}\n hidden={leftCollapsed}\n />\n\n <StateEditorPanel\n selected={selected}\n query={query}\n onQueryChange={setQuery}\n searchRef={searchRef}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={() => setLeftCollapsed((v) => !v)}\n onClose={() => setOpen(false)}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n />\n </div>\n )}\n </>,\n document.body,\n );\n}\n","// LocalStorage keys\nexport const LS_LAYOUT = \"rsi:panel-layout\";\nexport const LS_KEY = \"rsi:panel-pos\";\nexport const LS_SIZE = \"rsi:panel-size\";\nexport const LS_LEFT_W = \"rsi:left-width\";\n\n// Dock settings\nexport const SNAP = 100; // distance in px to trigger dock preview\nexport const DOCK_W = 420; // left/right dock width\nexport const DOCK_H = 320; // top/bottom dock height\nexport const MARGIN = 12; // dock margin\n\n// Sidebar settings\nexport const LEFT_MIN = 180;\nexport const LEFT_MAX = 420;\n\n// Platform detection\nexport const isMac = typeof navigator !== \"undefined\" \n ? navigator.platform.toUpperCase().includes(\"MAC\") \n : false;\n","import type React from \"react\";\nimport { SNAP, DOCK_W, DOCK_H, MARGIN } from \"./constants\";\nimport type { DockPreview } from \"./types\";\n\n/**\n * Type guard for select option objects\n */\nexport function isOptionObject(\n opt: string | { label: string; value: string },\n): opt is { label: string; value: string } {\n return typeof opt === \"object\" && opt !== null && \"value\" in opt;\n}\n\n/**\n * Compute dock preview based on cursor position\n */\nexport function computePreview(x: number, y: number): DockPreview {\n const w = window.innerWidth;\n const h = window.innerHeight;\n\n const nearLeft = x <= SNAP;\n const nearRight = x >= w - SNAP;\n const nearTop = y <= SNAP;\n const nearBottom = y >= h - SNAP;\n\n // Priority: horizontal edges take precedence over vertical\n if (nearLeft) return \"dock-left\";\n if (nearRight) return \"dock-right\";\n if (nearTop) return \"dock-top\";\n if (nearBottom) return \"dock-bottom\";\n return null;\n}\n\n/**\n * Get CSS properties for dock preview rectangle\n */\nexport function previewRectStyle(p: DockPreview): React.CSSProperties {\n const base: React.CSSProperties = {\n position: \"fixed\",\n border: \"1px dashed #555\",\n background: \"rgba(255,255,255,0.06)\",\n borderRadius: 12,\n };\n\n if (p === \"dock-left\") {\n return { ...base, left: MARGIN, top: MARGIN, bottom: MARGIN, width: DOCK_W };\n }\n if (p === \"dock-right\") {\n return { ...base, right: MARGIN, top: MARGIN, bottom: MARGIN, width: DOCK_W };\n }\n if (p === \"dock-top\") {\n return { ...base, left: MARGIN, right: MARGIN, top: MARGIN, height: DOCK_H };\n }\n // dock-bottom\n return { ...base, left: MARGIN, right: MARGIN, bottom: MARGIN, height: DOCK_H };\n}\n\n/**\n * Safely stringify a value to JSON\n */\nexport function safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n}\n","interface FloatingButtonProps {\n onClick: () => void;\n}\n\nexport function FloatingButton({ onClick }: FloatingButtonProps) {\n return (\n <button\n title=\"State Inspector (⌘⇧I / Ctrl⇧I)\"\n onClick={onClick}\n style={{\n position: \"fixed\",\n right: 16,\n bottom: 16,\n width: 44,\n height: 44,\n borderRadius: 22,\n border: \"none\",\n background: \"#111\",\n color: \"#fff\",\n cursor: \"pointer\",\n zIndex: 999999,\n }}\n aria-label=\"Toggle State Inspector\"\n >\n ◎\n </button>\n );\n}\n","import type { DockPreview } from \"../types\";\nimport { previewRectStyle } from \"../utils\";\n\ninterface DockPreviewOverlayProps {\n preview: DockPreview;\n}\n\nexport function DockPreviewOverlay({ preview }: DockPreviewOverlayProps) {\n if (!preview) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 999998,\n }}\n >\n <div style={previewRectStyle(preview)} />\n </div>\n );\n}\n","interface ResizeHandleProps {\n onResize: (delta: { dx: number; dy: number }) => void;\n}\n\nexport function ResizeHandle({ onResize }: ResizeHandleProps) {\n return (\n <div\n onPointerDown={(e) => {\n const startX = e.clientX;\n const startY = e.clientY;\n\n (e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n onResize({\n dx: ev.clientX - startX,\n dy: ev.clientY - startY,\n });\n };\n\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n }}\n style={{\n position: \"absolute\",\n right: 6,\n bottom: 6,\n width: 14,\n height: 14,\n borderRadius: 6,\n border: \"1px solid #333\",\n background: \"#838383\",\n cursor: \"nwse-resize\",\n }}\n />\n );\n}\n","import { LEFT_MIN, LEFT_MAX } from \"../constants\";\n\ninterface SidebarResizerProps {\n leftWidth: number;\n onWidthChange: (width: number) => void;\n hidden: boolean;\n}\n\nexport function SidebarResizer({ leftWidth, onWidthChange, hidden }: SidebarResizerProps) {\n if (hidden) return null;\n\n return (\n <div\n onPointerDown={(e) => {\n e.preventDefault();\n const startX = e.clientX;\n const startW = leftWidth;\n\n (e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const next = Math.max(LEFT_MIN, Math.min(LEFT_MAX, startW + dx));\n onWidthChange(next);\n };\n\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n }}\n style={{\n width: 8,\n cursor: \"col-resize\",\n background: \"transparent\",\n borderLeft: \"1px solid #2a2a2a\",\n borderRight: \"1px solid #2a2a2a\",\n }}\n title=\"Resize sidebar\"\n />\n );\n}\n","import type React from \"react\";\n\ninterface DragHandleProps {\n children: React.ReactNode;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n style?: React.CSSProperties;\n}\n\nexport function DragHandle({ children, onDragStart, onDragEnd, style }: DragHandleProps) {\n return (\n <div\n style={{ cursor: \"grab\", userSelect: \"none\", ...style }}\n onPointerDown={onDragStart}\n onPointerUp={onDragEnd}\n >\n {children}\n </div>\n );\n}\n","import type React from \"react\";\nimport type { ComponentSummary } from \"../types\";\nimport { DragHandle } from \"./DragHandle\";\n\ninterface ComponentListProps {\n components: ComponentSummary[];\n selectedId: string | null;\n onSelect: (id: string) => void;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n height?: number | undefined;\n hidden: boolean;\n}\n\nexport function ComponentList({\n components,\n selectedId,\n onSelect,\n onDragStart,\n onDragEnd,\n height,\n hidden,\n}: ComponentListProps) {\n if (hidden) return null;\n\n return (\n <div style={{ padding: 12, height, flexDirection: \"column\", boxSizing: \"border-box\", display: \"flex\" }}>\n <DragHandle\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}\n >\n <h4 style={{ margin: 0 }}>Components</h4>\n <span style={{ fontSize: 12, opacity: 0.7 }}>{components.length}</span>\n </DragHandle>\n\n <div style={{ marginTop: 10, display: \"flex\", flexDirection: \"column\", gap: 8, overflow: \"auto\", flex: 1 }}>\n {components.map((c) => {\n const active = c.id === selectedId;\n return (\n <button\n key={c.id}\n id={`rsi-comp-${c.id}`}\n onClick={() => onSelect(c.id)}\n style={{\n textAlign: \"left\",\n background: active ? \"#2a2a2a\" : \"transparent\",\n border: \"1px solid #333\",\n borderRadius: 10,\n padding: 10,\n color: \"#fff\",\n cursor: \"pointer\",\n flex: \"none\",\n }}\n >\n <div style={{ fontWeight: 700 }}>{c.label}</div>\n <div style={{ fontSize: 12, opacity: 0.7 }}>\n states: {c.stateKeys.length || 0}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import type React from \"react\";\nimport { DragHandle } from \"./DragHandle\";\n\ninterface StatePanelHeaderProps {\n selectedLabel: string | null;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n onClose: () => void;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n}\n\nexport function StatePanelHeader({\n selectedLabel,\n leftCollapsed,\n onToggleCollapse,\n onClose,\n onDragStart,\n onDragEnd,\n}: StatePanelHeaderProps) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\" }}>\n <button\n onClick={(e) => {\n e.preventDefault();\n onToggleCollapse();\n }}\n style={{\n padding: 4,\n marginRight: 12,\n borderRadius: 6,\n border: \"1px solid #333\",\n background: \"transparent\",\n color: \"#fff\",\n cursor: \"pointer\",\n fontSize: 12,\n width: 24,\n height: 24,\n }}\n >\n {leftCollapsed ? \"»\" : \"«\"}\n </button>\n\n <DragHandle\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n style={{ display: \"flex\", flexDirection: \"column\", flex: 1 }}\n >\n <h4 style={{ margin: 0 }}>State</h4>\n <div style={{ fontSize: 12, opacity: 0.7 }}>\n {selectedLabel ?? \"No selection\"}\n </div>\n </DragHandle>\n\n <button\n onClick={onClose}\n style={{\n background: \"transparent\",\n color: \"#fff\",\n border: \"1px solid #333\",\n borderRadius: 10,\n padding: \"6px 10px\",\n cursor: \"pointer\",\n fontSize: 12,\n marginLeft: \"auto\",\n }}\n >\n Close\n </button>\n </div>\n );\n}\n","import type React from \"react\";\n\nexport const inputStyle: React.CSSProperties = {\n padding: \"8px 10px\",\n borderRadius: 10,\n border: \"1px solid #333\",\n background: \"#111\",\n color: \"#fff\",\n};\n\nexport const cardStyle: React.CSSProperties = {\n border: \"1px solid #333\",\n borderRadius: 12,\n padding: 10,\n};\n\nexport const buttonStyle: React.CSSProperties = {\n background: \"transparent\",\n color: \"#fff\",\n border: \"1px solid #333\",\n cursor: \"pointer\",\n};\n","import type React from \"react\";\nimport { inputStyle } from \"../styles\";\n\ninterface SearchInputProps {\n value: string;\n onChange: (value: string) => void;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\nexport function SearchInput({ value, onChange, inputRef }: SearchInputProps) {\n return (\n <input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"Search components / state keys…\"\n ref={inputRef}\n style={{\n ...inputStyle,\n marginTop: 10,\n outline: \"none\",\n }}\n />\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { inputStyle } from \"../styles\";\n\ninterface JsonEditorProps {\n initial: string;\n onValidJson: (obj: unknown) => void;\n}\n\nexport function JsonEditor({ initial, onValidJson }: JsonEditorProps) {\n const [raw, setRaw] = useState(initial);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n setRaw(initial);\n }, [initial]);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const next = e.target.value;\n setRaw(next);\n\n try {\n const parsed = JSON.parse(next);\n setError(null);\n onValidJson(parsed);\n } catch {\n setError(\"Invalid JSON\");\n }\n };\n\n return (\n <div style={{ display: \"grid\", gap: 6 }}>\n <textarea\n value={raw}\n onChange={handleChange}\n rows={6}\n style={{\n ...inputStyle,\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n fontSize: 12,\n resize: \"vertical\",\n }}\n />\n {error && <div style={{ fontSize: 12, color: \"#ff6b6b\" }}>{error}</div>}\n </div>\n );\n}\n","import type { InspectableMeta } from \"../../store\";\nimport { inputStyle } from \"../styles\";\nimport { isOptionObject, safeStringify } from \"../utils\";\nimport { JsonEditor } from \"./JsonEditor\";\n\ninterface StateEditorProps {\n value: unknown;\n meta: InspectableMeta | undefined;\n onChange: (next: unknown) => void;\n}\n\nexport function StateEditor({ value, meta, onChange }: StateEditorProps) {\n // boolean\n if (meta?.type === \"boolean\" || typeof value === \"boolean\") {\n return (\n <label style={{ display: \"flex\", gap: 10, alignItems: \"center\" }}>\n <input\n type=\"checkbox\"\n checked={Boolean(value)}\n onChange={(e) => onChange(e.target.checked)}\n />\n <span style={{ fontSize: 13, opacity: 0.8 }}>{String(Boolean(value))}</span>\n </label>\n );\n }\n\n // select\n if (meta?.type === \"select\" && Array.isArray(meta.options)) {\n const current = typeof value === \"string\" ? value : String(value ?? \"\");\n return (\n <select\n value={current}\n onChange={(e) => onChange(e.target.value)}\n style={inputStyle}\n >\n {meta.options.map((opt: string | { label: string; value: string }) => {\n const o = isOptionObject(opt) ? opt : { label: String(opt), value: String(opt) };\n return (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n );\n })}\n </select>\n );\n }\n\n // number\n if (meta?.type === \"number\") {\n return (\n <input\n type=\"number\"\n value={typeof value === \"number\" ? value : Number(value ?? 0)}\n min={meta?.min}\n max={meta?.max}\n step={meta?.step}\n onChange={(e) => onChange(e.target.value === \"\" ? 0 : Number(e.target.value))}\n style={inputStyle}\n />\n );\n }\n\n // json\n if (meta?.type === \"json\" || (value && typeof value === \"object\")) {\n return <JsonEditor initial={safeStringify(value)} onValidJson={onChange} />;\n }\n\n // text (default)\n return (\n <input\n type=\"text\"\n value={typeof value === \"string\" ? value : String(value ?? \"\")}\n placeholder={meta?.type === \"text\" ? meta.placeholder : undefined}\n onChange={(e) => onChange(e.target.value)}\n style={inputStyle}\n />\n );\n}\n","import type { InspectableStateEntry } from \"../../store\";\nimport { cardStyle } from \"../styles\";\nimport { StateEditor } from \"./StateEditor\";\n\ninterface StateCardProps {\n state: InspectableStateEntry;\n}\n\nexport function StateCard({ state }: StateCardProps) {\n return (\n <div\n style={{\n ...cardStyle,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <div style={{ display: \"flex\", justifyContent: \"space-between\", gap: 12 }}>\n <div style={{ fontWeight: 700 }}>{state.key}</div>\n <div style={{ fontSize: 12, opacity: 0.6 }}>{state.meta?.type ?? \"auto\"}</div>\n </div>\n\n <StateEditor\n value={state.value}\n meta={state.meta}\n onChange={(next) => state.setValue(next)}\n />\n </div>\n );\n}\n","import type React from \"react\";\nimport type { ComponentEntry } from \"../../store\";\nimport { StatePanelHeader } from \"./StatePanelHeader\";\nimport { SearchInput } from \"./SearchInput\";\nimport { StateCard } from \"./StateCard\";\n\ninterface StateEditorPanelProps {\n selected: ComponentEntry | null;\n query: string;\n onQueryChange: (value: string) => void;\n searchRef: React.RefObject<HTMLInputElement | null>;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n onClose: () => void;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n}\n\nexport function StateEditorPanel({\n selected,\n query,\n onQueryChange,\n searchRef,\n leftCollapsed,\n onToggleCollapse,\n onClose,\n onDragStart,\n onDragEnd,\n}: StateEditorPanelProps) {\n return (\n <div style={{ padding: 12, overflow: \"auto\", display: \"flex\", flexDirection: \"column\", boxSizing: \"border-box\" }}>\n <StatePanelHeader\n selectedLabel={selected?.label ?? null}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={onToggleCollapse}\n onClose={onClose}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n />\n\n <SearchInput\n value={query}\n onChange={onQueryChange}\n inputRef={searchRef}\n />\n\n <div style={{ marginTop: 12, display: \"grid\", gap: 10 }}>\n {selected && selected.states.size === 0 && (\n <div style={{ fontSize: 13, opacity: 0.7 }}>\n This component has no inspectable state.\n </div>\n )}\n\n {!selected && (\n <div style={{ opacity: 0.7, fontSize: 13 }}>\n No component selected.\n </div>\n )}\n\n {selected &&\n Array.from(selected.states.values()).map((s) => (\n <StateCard key={s.key} state={s} />\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
package/dist/index.mjs
CHANGED
|
@@ -124,6 +124,7 @@ function useInspectorComponent(label) {
|
|
|
124
124
|
const trimmed = label?.trim();
|
|
125
125
|
if (trimmed) store.setComponentLabel(componentId, trimmed);
|
|
126
126
|
}, [store, componentId, label]);
|
|
127
|
+
console.log({ id: componentId });
|
|
127
128
|
return useMemo(() => ({ id: componentId }), [componentId]);
|
|
128
129
|
}
|
|
129
130
|
|
|
@@ -715,7 +716,7 @@ function StateInspectorUI() {
|
|
|
715
716
|
const [isTransitioning, setIsTransitioning] = useState3(false);
|
|
716
717
|
const [open, setOpen] = useState3(false);
|
|
717
718
|
const [selectedId, setSelectedId] = useState3(null);
|
|
718
|
-
const [, force] = useState3(0);
|
|
719
|
+
const [tick, force] = useState3(0);
|
|
719
720
|
const searchRef = useRef2(null);
|
|
720
721
|
const [pos, setPos] = useState3(() => {
|
|
721
722
|
try {
|
|
@@ -773,12 +774,15 @@ function StateInspectorUI() {
|
|
|
773
774
|
const shouldCollapse = leftWidth <= 200 || (size.width ?? 720) - leftWidth < 320;
|
|
774
775
|
setLeftCollapsed(shouldCollapse);
|
|
775
776
|
}, [leftWidth, size.width]);
|
|
777
|
+
console.log("Store", store);
|
|
776
778
|
useEffect4(() => store.subscribe(() => force((x) => x + 1)), [store]);
|
|
777
|
-
const snapshot = useMemo3(() => store.getSnapshot(), [store]);
|
|
779
|
+
const snapshot = useMemo3(() => store.getSnapshot(), [store, tick]);
|
|
780
|
+
console.log("Snapshot", snapshot);
|
|
778
781
|
const components = useMemo3(
|
|
779
782
|
() => snapshot.components.filter((c) => c.mounted),
|
|
780
783
|
[snapshot.components]
|
|
781
784
|
);
|
|
785
|
+
console.log(components);
|
|
782
786
|
const q = query.trim().toLowerCase();
|
|
783
787
|
const filtered = useMemo3(
|
|
784
788
|
() => q ? components.filter((c) => {
|
|
@@ -788,6 +792,7 @@ function StateInspectorUI() {
|
|
|
788
792
|
}) : components,
|
|
789
793
|
[q, components]
|
|
790
794
|
);
|
|
795
|
+
console.log(filtered);
|
|
791
796
|
useEffect4(() => {
|
|
792
797
|
if (!open) return;
|
|
793
798
|
if (components.length === 0) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider.tsx","../src/store.ts","../src/hooks.ts","../src/StateInspectorUI.tsx","../src/ui/constants.ts","../src/ui/utils.ts","../src/ui/components/FloatingButton.tsx","../src/ui/components/DockPreviewOverlay.tsx","../src/ui/components/ResizeHandle.tsx","../src/ui/components/SidebarResizer.tsx","../src/ui/components/DragHandle.tsx","../src/ui/components/ComponentList.tsx","../src/ui/components/StatePanelHeader.tsx","../src/ui/styles.ts","../src/ui/components/SearchInput.tsx","../src/ui/components/JsonEditor.tsx","../src/ui/components/StateEditor.tsx","../src/ui/components/StateCard.tsx","../src/ui/components/StateEditorPanel.tsx"],"sourcesContent":["import React, { createContext, useContext, useEffect, useId, useMemo } from \"react\";\nimport { createInspectorStore, InspectorComponentRef, InspectorStore } from \"./store\";\n\nconst InspectorContext = createContext<InspectorStore | null>(null);\n\nconst storeRef = { current: null as InspectorStore | null };\n\nfunction getStore(): InspectorStore {\n if (!storeRef.current) {\n storeRef.current = createInspectorStore();\n }\n return storeRef.current;\n}\n\nexport function StateInspectorProvider({\n enabled = true,\n children,\n}: {\n enabled?: boolean;\n children: React.ReactNode;\n}) {\n const store = useMemo(() => getStore(), []);\n\n useEffect(() => {\n storeRef.current!.enabled = enabled;\n }, [enabled]);\n\n return (\n <InspectorContext.Provider value={store}>\n {children}\n </InspectorContext.Provider>\n );\n}\n\nexport function useInspectorStore(): InspectorStore {\n const ctx = useContext(InspectorContext);\n if (!ctx) {\n throw new Error(\"useInspectorStore must be used inside StateInspectorProvider\");\n }\n return ctx;\n}\n\nexport function useInspectorComponent(label?: string): InspectorComponentRef {\n const store = useInspectorStore();\n const reactId = useId();\n const componentId = useMemo(() => `c_${reactId}`, [reactId]);\n\n useEffect(() => {\n if (!store.enabled) return;\n\n store.registerComponent(componentId, label?.trim());\n return () => {\n store.unregisterComponent(componentId);\n };\n }, [store, componentId, label]);\n\n useEffect(() => {\n if (!store.enabled) return;\n const trimmed = label?.trim();\n if (trimmed) store.setComponentLabel(componentId, trimmed);\n }, [store, componentId, label]);\n\n return useMemo(() => ({ id: componentId }), [componentId]);\n}\n","export type ComponentId = string;\n\nexport type InspectableMeta =\n | { type: \"boolean\" }\n | { type: \"text\"; placeholder?: string }\n | { type: \"number\"; min?: number; max?: number; step?: number }\n | { type: \"select\"; options: Array<string | { label: string; value: string }> }\n | { type: \"json\" }\n | { type: \"custom\"; renderId: string };\n\nexport interface InspectableStateEntry {\n key: string;\n value: unknown;\n setValue: (next: unknown) => void;\n meta?: InspectableMeta;\n}\n\nexport interface ComponentEntry {\n id: ComponentId;\n label: string;\n mounted: boolean;\n states: Map<string, InspectableStateEntry>;\n}\n\nexport interface InspectorSnapshot {\n enabled: boolean;\n components: Array<{\n id: ComponentId;\n label: string;\n mounted: boolean;\n stateKeys: string[];\n }>;\n}\n\ntype Listener = () => void;\n\nexport interface InspectorComponentRef {\n id: string;\n}\n\nexport interface InspectorStore {\n enabled: boolean;\n\n // internal registry\n components: Map<ComponentId, ComponentEntry>;\n\n // subscriptions\n subscribe: (listener: Listener) => () => void;\n getSnapshot: () => InspectorSnapshot;\n\n // component lifecycle\n registerComponent: (id: ComponentId, label?: string) => void;\n setComponentLabel: (id: ComponentId, label: string) => void;\n unregisterComponent: (id: ComponentId) => void;\n\n // state lifecycle\n upsertState: (\n componentId: ComponentId,\n entry: InspectableStateEntry,\n ) => void;\n\n updateStateValue: (componentId: ComponentId, key: string, value: unknown) => void;\n removeState: (componentId: ComponentId, key: string) => void;\n}\n\nexport function createInspectorStore(): InspectorStore {\n const components = new Map<ComponentId, ComponentEntry>();\n const listeners = new Set<Listener>();\n\n function emit() {\n for (const l of listeners) l();\n }\n\n function getOrCreateComponent(id: ComponentId): ComponentEntry {\n const existing = components.get(id);\n if (existing) return existing;\n\n const created: ComponentEntry = {\n id,\n label: \"Unknown\",\n mounted: true,\n states: new Map(),\n };\n components.set(id, created);\n return created;\n }\n\n const store: InspectorStore = {\n enabled: true,\n components,\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n getSnapshot() {\n return {\n enabled: store.enabled,\n components: Array.from(components.values()).map((c) => ({\n id: c.id,\n label: c.label,\n mounted: c.mounted,\n stateKeys: Array.from(c.states.keys()),\n })),\n };\n },\n\n registerComponent(id, label) {\n const c = getOrCreateComponent(id);\n c.mounted = true;\n if (label && label.trim()) c.label = label.trim();\n emit();\n },\n\n setComponentLabel(id, label) {\n const c = getOrCreateComponent(id);\n c.label = label.trim() || \"Unknown\";\n emit();\n },\n\n unregisterComponent(id) {\n const c = components.get(id);\n if (!c) return;\n\n // StrictMode double-unmount safe:\n // we mark as unmounted; UI can choose to hide unmounted entries.\n c.mounted = false;\n\n // Optional: immediate cleanup if you prefer:\n // components.delete(id);\n\n emit();\n },\n\n upsertState(componentId, entry) {\n const c = getOrCreateComponent(componentId);\n c.states.set(entry.key, entry);\n emit();\n },\n\n updateStateValue(componentId, key, value) {\n const c = components.get(componentId);\n if (!c) return;\n const s = c.states.get(key);\n if (!s) return;\n s.value = value;\n emit();\n },\n\n removeState(componentId, key) {\n const c = components.get(componentId);\n if (!c) return;\n if (!c.states.has(key)) return;\n c.states.delete(key);\n emit();\n },\n };\n\n return store;\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { useInspectorStore } from \"./provider\";\nimport type { InspectableMeta, InspectorComponentRef } from \"./store\";\n\nfunction stableKey(input: string): string {\n return input.trim();\n}\n\nfunction inferMeta(value: unknown): InspectableMeta | undefined {\n const t = typeof value;\n if (t === \"boolean\") return { type: \"boolean\" };\n if (t === \"number\") return { type: \"number\" };\n if (t === \"string\") return { type: \"text\" };\n if (value && t === \"object\") return { type: \"json\" };\n return undefined;\n}\n\n/**\n * Registers a piece of state to the inspector registry.\n * Opt-in by replacing useState with useInspectableState.\n */\nexport function useInspectableState<T>(\n component: InspectorComponentRef,\n key: string,\n initial: T | (() => T),\n meta?: InspectableMeta,\n): [T, React.Dispatch<React.SetStateAction<T>>] {\n const store = useInspectorStore();\n const componentId = component.id;\n\n const stateKey = useMemo(() => stableKey(key), [key]);\n\n const [value, setValue] = useState<T>(initial);\n\n // Keep latest setter stable for registry consumers\n const setValueRef = useRef<(next: unknown) => void>(() => {});\n setValueRef.current = (next: unknown) => {\n setValue(next as T);\n };\n\n // Register component + state entry\n useEffect(() => {\n if (!store.enabled) return;\n\n const resolvedMeta = meta ?? inferMeta(value);\n store.upsertState(componentId, {\n key: stateKey,\n value,\n setValue: (next) => setValueRef.current(next),\n ...(resolvedMeta !== undefined && { meta: resolvedMeta }),\n });\n\n return () => {\n store.removeState(componentId, stateKey);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [store, componentId, stateKey]);\n\n // Sync updates on each render when value/meta changes\n useEffect(() => {\n if (!store.enabled) return;\n\n const resolvedMeta = meta ?? inferMeta(value);\n store.upsertState(componentId, {\n key: stateKey,\n value,\n setValue: (next) => setValueRef.current(next),\n ...(resolvedMeta !== undefined && { meta: resolvedMeta }),\n });\n }, [store, componentId, stateKey, value, meta]);\n\n return [value, setValue];\n}\n\n/**\n * Optional helper to give the current component instance a human label.\n */\nexport function useComponentLabel(label: string) {\n const store = useInspectorStore();\n const reactId = useId();\n const componentId = useMemo(() => `c_${reactId}`, [reactId]);\n\n useEffect(() => {\n if (!store.enabled) return;\n const trimmed = label.trim();\n if (!trimmed) return;\n store.setComponentLabel(componentId, trimmed);\n }, [store, componentId, label]);\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useInspectorStore } from \"./provider\";\n\n// UI imports\nimport {\n LS_LAYOUT,\n LS_KEY,\n LS_SIZE,\n LS_LEFT_W,\n isMac,\n} from \"./ui/constants\";\n\nimport type { DockMode, DockPreview, PanelPosition, PanelSize } from \"./ui/types\";\n\nimport { computePreview, previewRectStyle } from \"./ui/utils\";\n\nimport {\n FloatingButton,\n DockPreviewOverlay,\n ResizeHandle,\n SidebarResizer,\n ComponentList,\n StateEditorPanel,\n} from \"./ui/components\";\n\nexport function StateInspectorUI() {\n const store = useInspectorStore();\n const [query, setQuery] = useState<string>(\"\");\n const [leftCollapsed, setLeftCollapsed] = useState(false);\n\n const [layout, setLayout] = useState<DockMode>(\"floating\");\n const [preview, setPreview] = useState<DockPreview>(null);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [open, setOpen] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [, force] = useState(0);\n\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n // Persisted panel position\n const [pos, setPos] = useState<PanelPosition>(() => {\n try {\n const raw = localStorage.getItem(LS_KEY);\n return raw ? JSON.parse(raw) : { right: 16, bottom: 72 };\n } catch {\n return { right: 16, bottom: 72 };\n }\n });\n\n // Persisted sidebar width\n const [leftWidth, setLeftWidth] = useState(() => {\n try {\n const raw = localStorage.getItem(LS_LEFT_W);\n return raw ? Number(raw) : 280;\n } catch {\n return 280;\n }\n });\n\n // Persisted panel size\n const [size, setSize] = useState<PanelSize>(() => {\n try {\n const raw = localStorage.getItem(LS_SIZE);\n return raw ? JSON.parse(raw) : { width: 720, height: 420 };\n } catch {\n return { width: 720, height: 420 };\n }\n });\n\n // Persist layout to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_LAYOUT, layout); } catch(e) {\n console.error(e);\n }\n }, [layout]);\n\n // Persist position to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_KEY, JSON.stringify(pos)); } catch(e) {\n console.error(e);\n }\n }, [pos]);\n\n // Persist sidebar width to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_LEFT_W, String(leftWidth)); } catch(e) {\n console.error(e);\n }\n }, [leftWidth]);\n\n // Persist size to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_SIZE, JSON.stringify(size)); } catch(e) {\n console.error(e);\n }\n }, [size]);\n\n // Auto-collapse sidebar when too narrow\n useEffect(() => {\n const shouldCollapse = leftWidth <= 200 || (size.width ?? 720) - leftWidth < 320;\n setLeftCollapsed(shouldCollapse);\n }, [leftWidth, size.width]);\n\n // Subscribe to store changes\n useEffect(() => store.subscribe(() => force((x) => x + 1)), [store]);\n\n // Get mounted components\n const snapshot = useMemo(() => store.getSnapshot(), [store]);\n const components = useMemo(\n () => snapshot.components.filter((c) => c.mounted),\n [snapshot.components]\n );\n\n // Filter components by search query\n const q = query.trim().toLowerCase();\n const filtered = useMemo(\n () =>\n q\n ? components.filter((c) => {\n const labelHit = c.label.toLowerCase().includes(q);\n const keyHit = c.stateKeys.some((k) => k.toLowerCase().includes(q));\n return labelHit || keyHit;\n })\n : components,\n [q, components]\n );\n\n // Keep a valid selection\n useEffect(() => {\n if (!open) return;\n\n if (components.length === 0) {\n setSelectedId(null);\n return;\n }\n\n if (!selectedId || !components.some((c) => c.id === selectedId)) {\n setSelectedId(components[0]!.id);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, components.length]);\n\n // Keyboard shortcuts\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n const mod = isMac ? e.metaKey : e.ctrlKey;\n\n // Cmd/Ctrl + Shift + I → toggle inspector\n if (mod && e.shiftKey && e.key.toLowerCase() === \"i\") {\n e.preventDefault();\n setOpen((o) => !o);\n return;\n }\n\n if (!open) return;\n\n // Esc → close\n if (e.key === \"Escape\") {\n setOpen(false);\n return;\n }\n\n // \"/\" → focus search\n if (e.key === \"/\") {\n e.preventDefault();\n searchRef.current?.focus();\n return;\n }\n\n // Arrow navigation\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n const list = filtered;\n if (!list.length) return;\n\n const idx = list.findIndex((c) => c.id === selectedId);\n const next =\n e.key === \"ArrowDown\"\n ? list[(Math.max(-1, idx) + 1) % list.length]!.id\n : list[(idx <= 0 ? list.length - 1 : idx - 1)]!.id;\n\n setSelectedId(next);\n setTimeout(() => {\n document.getElementById(`rsi-comp-${next}`)?.scrollIntoView({ block: \"nearest\" });\n }, 0);\n }\n }\n\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open, filtered, selectedId]);\n\n // Get selected component\n const selected = useMemo(() => {\n if (!selectedId) return null;\n return store.components.get(selectedId) ?? null;\n }, [store, selectedId]);\n\n // Drag end handler - apply dock or reset preview\n const handleDragEnd = () => {\n if (preview) {\n setLayout(preview);\n setIsTransitioning(true);\n\n const rects = previewRectStyle(preview);\n setSize({ width: rects.width as number, height: rects.height as number });\n setPos({\n left: rects.left as number,\n right: rects.right as number,\n top: rects.top as number,\n bottom: rects.bottom as number,\n });\n setPreview(null);\n\n setTimeout(() => setIsTransitioning(false), 300);\n return;\n }\n setPreview(null);\n };\n\n // Drag start handler - initiate panel movement\n const handleDragStart = (e: React.PointerEvent<HTMLDivElement>) => {\n const startX = e.clientX;\n const startY = e.clientY;\n const start = pos;\n\n setLayout(\"floating\");\n setIsTransitioning(true);\n setSize({ width: 720, height: 420 });\n setTimeout(() => setIsTransitioning(false), 300);\n\n (e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n const nextPreview = computePreview(ev.clientX, ev.clientY);\n\n setPreview((p) => (p === nextPreview ? p : nextPreview));\n\n const newPos: PanelPosition = {};\n if (start.left !== undefined) {\n newPos.left = Math.max(8, start.left + dx);\n } else {\n newPos.right = Math.max(8, (start.right ?? 16) - dx);\n }\n if (start.top !== undefined) {\n newPos.top = Math.max(8, start.top + dy);\n } else {\n newPos.bottom = Math.max(8, (start.bottom ?? 72) - dy);\n }\n setPos(newPos);\n };\n\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n };\n\n // Handle panel resize\n const handlePanelResize = (startSize: PanelSize) => (delta: { dx: number; dy: number }) => {\n setSize({\n width: Math.min(window.innerWidth - 16, Math.max(480, (startSize.width ?? 0) + delta.dx)),\n height: Math.min(window.innerHeight - 120, Math.max(280, (startSize.height ?? 0) + delta.dy)),\n });\n };\n\n if (!store.enabled) return null;\n\n return createPortal(\n <>\n <FloatingButton onClick={() => setOpen((o) => !o)} />\n <DockPreviewOverlay preview={preview} />\n\n {open && (\n <div\n style={{\n position: \"fixed\",\n left: pos.left,\n right: pos.right,\n top: pos.top,\n bottom: pos.bottom,\n width: size.width || \"calc(100dvw - 24px)\",\n maxWidth: \"calc(100vw - 24px)\",\n height: size.height || \"calc(100dvh - 24px)\",\n maxHeight: \"calc(100vh - 24px)\",\n background: \"#1c1c1c\",\n color: \"#fff\",\n borderRadius: 12,\n border: \"1px solid #333\",\n zIndex: 999999,\n display: \"grid\",\n gridTemplateColumns: leftCollapsed ? \"auto\" : `${leftWidth}px 14px auto`,\n overflow: \"hidden\",\n transition: isTransitioning ? \"all 0.3s ease\" : \"none\",\n }}\n >\n <ResizeHandle onResize={handlePanelResize(size)} />\n\n <ComponentList\n components={filtered}\n selectedId={selectedId}\n onSelect={setSelectedId}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n height={size.height}\n hidden={leftCollapsed}\n />\n\n <SidebarResizer\n leftWidth={leftWidth}\n onWidthChange={setLeftWidth}\n hidden={leftCollapsed}\n />\n\n <StateEditorPanel\n selected={selected}\n query={query}\n onQueryChange={setQuery}\n searchRef={searchRef}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={() => setLeftCollapsed((v) => !v)}\n onClose={() => setOpen(false)}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n />\n </div>\n )}\n </>,\n document.body,\n );\n}\n","// LocalStorage keys\nexport const LS_LAYOUT = \"rsi:panel-layout\";\nexport const LS_KEY = \"rsi:panel-pos\";\nexport const LS_SIZE = \"rsi:panel-size\";\nexport const LS_LEFT_W = \"rsi:left-width\";\n\n// Dock settings\nexport const SNAP = 100; // distance in px to trigger dock preview\nexport const DOCK_W = 420; // left/right dock width\nexport const DOCK_H = 320; // top/bottom dock height\nexport const MARGIN = 12; // dock margin\n\n// Sidebar settings\nexport const LEFT_MIN = 180;\nexport const LEFT_MAX = 420;\n\n// Platform detection\nexport const isMac = typeof navigator !== \"undefined\" \n ? navigator.platform.toUpperCase().includes(\"MAC\") \n : false;\n","import type React from \"react\";\nimport { SNAP, DOCK_W, DOCK_H, MARGIN } from \"./constants\";\nimport type { DockPreview } from \"./types\";\n\n/**\n * Type guard for select option objects\n */\nexport function isOptionObject(\n opt: string | { label: string; value: string },\n): opt is { label: string; value: string } {\n return typeof opt === \"object\" && opt !== null && \"value\" in opt;\n}\n\n/**\n * Compute dock preview based on cursor position\n */\nexport function computePreview(x: number, y: number): DockPreview {\n const w = window.innerWidth;\n const h = window.innerHeight;\n\n const nearLeft = x <= SNAP;\n const nearRight = x >= w - SNAP;\n const nearTop = y <= SNAP;\n const nearBottom = y >= h - SNAP;\n\n // Priority: horizontal edges take precedence over vertical\n if (nearLeft) return \"dock-left\";\n if (nearRight) return \"dock-right\";\n if (nearTop) return \"dock-top\";\n if (nearBottom) return \"dock-bottom\";\n return null;\n}\n\n/**\n * Get CSS properties for dock preview rectangle\n */\nexport function previewRectStyle(p: DockPreview): React.CSSProperties {\n const base: React.CSSProperties = {\n position: \"fixed\",\n border: \"1px dashed #555\",\n background: \"rgba(255,255,255,0.06)\",\n borderRadius: 12,\n };\n\n if (p === \"dock-left\") {\n return { ...base, left: MARGIN, top: MARGIN, bottom: MARGIN, width: DOCK_W };\n }\n if (p === \"dock-right\") {\n return { ...base, right: MARGIN, top: MARGIN, bottom: MARGIN, width: DOCK_W };\n }\n if (p === \"dock-top\") {\n return { ...base, left: MARGIN, right: MARGIN, top: MARGIN, height: DOCK_H };\n }\n // dock-bottom\n return { ...base, left: MARGIN, right: MARGIN, bottom: MARGIN, height: DOCK_H };\n}\n\n/**\n * Safely stringify a value to JSON\n */\nexport function safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n}\n","interface FloatingButtonProps {\n onClick: () => void;\n}\n\nexport function FloatingButton({ onClick }: FloatingButtonProps) {\n return (\n <button\n title=\"State Inspector (⌘⇧I / Ctrl⇧I)\"\n onClick={onClick}\n style={{\n position: \"fixed\",\n right: 16,\n bottom: 16,\n width: 44,\n height: 44,\n borderRadius: 22,\n border: \"none\",\n background: \"#111\",\n color: \"#fff\",\n cursor: \"pointer\",\n zIndex: 999999,\n }}\n aria-label=\"Toggle State Inspector\"\n >\n ◎\n </button>\n );\n}\n","import type { DockPreview } from \"../types\";\nimport { previewRectStyle } from \"../utils\";\n\ninterface DockPreviewOverlayProps {\n preview: DockPreview;\n}\n\nexport function DockPreviewOverlay({ preview }: DockPreviewOverlayProps) {\n if (!preview) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 999998,\n }}\n >\n <div style={previewRectStyle(preview)} />\n </div>\n );\n}\n","interface ResizeHandleProps {\n onResize: (delta: { dx: number; dy: number }) => void;\n}\n\nexport function ResizeHandle({ onResize }: ResizeHandleProps) {\n return (\n <div\n onPointerDown={(e) => {\n const startX = e.clientX;\n const startY = e.clientY;\n\n (e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n onResize({\n dx: ev.clientX - startX,\n dy: ev.clientY - startY,\n });\n };\n\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n }}\n style={{\n position: \"absolute\",\n right: 6,\n bottom: 6,\n width: 14,\n height: 14,\n borderRadius: 6,\n border: \"1px solid #333\",\n background: \"#838383\",\n cursor: \"nwse-resize\",\n }}\n />\n );\n}\n","import { LEFT_MIN, LEFT_MAX } from \"../constants\";\n\ninterface SidebarResizerProps {\n leftWidth: number;\n onWidthChange: (width: number) => void;\n hidden: boolean;\n}\n\nexport function SidebarResizer({ leftWidth, onWidthChange, hidden }: SidebarResizerProps) {\n if (hidden) return null;\n\n return (\n <div\n onPointerDown={(e) => {\n e.preventDefault();\n const startX = e.clientX;\n const startW = leftWidth;\n\n (e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const next = Math.max(LEFT_MIN, Math.min(LEFT_MAX, startW + dx));\n onWidthChange(next);\n };\n\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n }}\n style={{\n width: 8,\n cursor: \"col-resize\",\n background: \"transparent\",\n borderLeft: \"1px solid #2a2a2a\",\n borderRight: \"1px solid #2a2a2a\",\n }}\n title=\"Resize sidebar\"\n />\n );\n}\n","import type React from \"react\";\n\ninterface DragHandleProps {\n children: React.ReactNode;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n style?: React.CSSProperties;\n}\n\nexport function DragHandle({ children, onDragStart, onDragEnd, style }: DragHandleProps) {\n return (\n <div\n style={{ cursor: \"grab\", userSelect: \"none\", ...style }}\n onPointerDown={onDragStart}\n onPointerUp={onDragEnd}\n >\n {children}\n </div>\n );\n}\n","import type React from \"react\";\nimport type { ComponentSummary } from \"../types\";\nimport { DragHandle } from \"./DragHandle\";\n\ninterface ComponentListProps {\n components: ComponentSummary[];\n selectedId: string | null;\n onSelect: (id: string) => void;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n height?: number | undefined;\n hidden: boolean;\n}\n\nexport function ComponentList({\n components,\n selectedId,\n onSelect,\n onDragStart,\n onDragEnd,\n height,\n hidden,\n}: ComponentListProps) {\n if (hidden) return null;\n\n return (\n <div style={{ padding: 12, height, flexDirection: \"column\", boxSizing: \"border-box\", display: \"flex\" }}>\n <DragHandle\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}\n >\n <h4 style={{ margin: 0 }}>Components</h4>\n <span style={{ fontSize: 12, opacity: 0.7 }}>{components.length}</span>\n </DragHandle>\n\n <div style={{ marginTop: 10, display: \"flex\", flexDirection: \"column\", gap: 8, overflow: \"auto\", flex: 1 }}>\n {components.map((c) => {\n const active = c.id === selectedId;\n return (\n <button\n key={c.id}\n id={`rsi-comp-${c.id}`}\n onClick={() => onSelect(c.id)}\n style={{\n textAlign: \"left\",\n background: active ? \"#2a2a2a\" : \"transparent\",\n border: \"1px solid #333\",\n borderRadius: 10,\n padding: 10,\n color: \"#fff\",\n cursor: \"pointer\",\n flex: \"none\",\n }}\n >\n <div style={{ fontWeight: 700 }}>{c.label}</div>\n <div style={{ fontSize: 12, opacity: 0.7 }}>\n states: {c.stateKeys.length || 0}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import type React from \"react\";\nimport { DragHandle } from \"./DragHandle\";\n\ninterface StatePanelHeaderProps {\n selectedLabel: string | null;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n onClose: () => void;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n}\n\nexport function StatePanelHeader({\n selectedLabel,\n leftCollapsed,\n onToggleCollapse,\n onClose,\n onDragStart,\n onDragEnd,\n}: StatePanelHeaderProps) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\" }}>\n <button\n onClick={(e) => {\n e.preventDefault();\n onToggleCollapse();\n }}\n style={{\n padding: 4,\n marginRight: 12,\n borderRadius: 6,\n border: \"1px solid #333\",\n background: \"transparent\",\n color: \"#fff\",\n cursor: \"pointer\",\n fontSize: 12,\n width: 24,\n height: 24,\n }}\n >\n {leftCollapsed ? \"»\" : \"«\"}\n </button>\n\n <DragHandle\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n style={{ display: \"flex\", flexDirection: \"column\", flex: 1 }}\n >\n <h4 style={{ margin: 0 }}>State</h4>\n <div style={{ fontSize: 12, opacity: 0.7 }}>\n {selectedLabel ?? \"No selection\"}\n </div>\n </DragHandle>\n\n <button\n onClick={onClose}\n style={{\n background: \"transparent\",\n color: \"#fff\",\n border: \"1px solid #333\",\n borderRadius: 10,\n padding: \"6px 10px\",\n cursor: \"pointer\",\n fontSize: 12,\n marginLeft: \"auto\",\n }}\n >\n Close\n </button>\n </div>\n );\n}\n","import type React from \"react\";\n\nexport const inputStyle: React.CSSProperties = {\n padding: \"8px 10px\",\n borderRadius: 10,\n border: \"1px solid #333\",\n background: \"#111\",\n color: \"#fff\",\n};\n\nexport const cardStyle: React.CSSProperties = {\n border: \"1px solid #333\",\n borderRadius: 12,\n padding: 10,\n};\n\nexport const buttonStyle: React.CSSProperties = {\n background: \"transparent\",\n color: \"#fff\",\n border: \"1px solid #333\",\n cursor: \"pointer\",\n};\n","import type React from \"react\";\nimport { inputStyle } from \"../styles\";\n\ninterface SearchInputProps {\n value: string;\n onChange: (value: string) => void;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\nexport function SearchInput({ value, onChange, inputRef }: SearchInputProps) {\n return (\n <input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"Search components / state keys…\"\n ref={inputRef}\n style={{\n ...inputStyle,\n marginTop: 10,\n outline: \"none\",\n }}\n />\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { inputStyle } from \"../styles\";\n\ninterface JsonEditorProps {\n initial: string;\n onValidJson: (obj: unknown) => void;\n}\n\nexport function JsonEditor({ initial, onValidJson }: JsonEditorProps) {\n const [raw, setRaw] = useState(initial);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n setRaw(initial);\n }, [initial]);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const next = e.target.value;\n setRaw(next);\n\n try {\n const parsed = JSON.parse(next);\n setError(null);\n onValidJson(parsed);\n } catch {\n setError(\"Invalid JSON\");\n }\n };\n\n return (\n <div style={{ display: \"grid\", gap: 6 }}>\n <textarea\n value={raw}\n onChange={handleChange}\n rows={6}\n style={{\n ...inputStyle,\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n fontSize: 12,\n resize: \"vertical\",\n }}\n />\n {error && <div style={{ fontSize: 12, color: \"#ff6b6b\" }}>{error}</div>}\n </div>\n );\n}\n","import type { InspectableMeta } from \"../../store\";\nimport { inputStyle } from \"../styles\";\nimport { isOptionObject, safeStringify } from \"../utils\";\nimport { JsonEditor } from \"./JsonEditor\";\n\ninterface StateEditorProps {\n value: unknown;\n meta: InspectableMeta | undefined;\n onChange: (next: unknown) => void;\n}\n\nexport function StateEditor({ value, meta, onChange }: StateEditorProps) {\n // boolean\n if (meta?.type === \"boolean\" || typeof value === \"boolean\") {\n return (\n <label style={{ display: \"flex\", gap: 10, alignItems: \"center\" }}>\n <input\n type=\"checkbox\"\n checked={Boolean(value)}\n onChange={(e) => onChange(e.target.checked)}\n />\n <span style={{ fontSize: 13, opacity: 0.8 }}>{String(Boolean(value))}</span>\n </label>\n );\n }\n\n // select\n if (meta?.type === \"select\" && Array.isArray(meta.options)) {\n const current = typeof value === \"string\" ? value : String(value ?? \"\");\n return (\n <select\n value={current}\n onChange={(e) => onChange(e.target.value)}\n style={inputStyle}\n >\n {meta.options.map((opt: string | { label: string; value: string }) => {\n const o = isOptionObject(opt) ? opt : { label: String(opt), value: String(opt) };\n return (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n );\n })}\n </select>\n );\n }\n\n // number\n if (meta?.type === \"number\") {\n return (\n <input\n type=\"number\"\n value={typeof value === \"number\" ? value : Number(value ?? 0)}\n min={meta?.min}\n max={meta?.max}\n step={meta?.step}\n onChange={(e) => onChange(e.target.value === \"\" ? 0 : Number(e.target.value))}\n style={inputStyle}\n />\n );\n }\n\n // json\n if (meta?.type === \"json\" || (value && typeof value === \"object\")) {\n return <JsonEditor initial={safeStringify(value)} onValidJson={onChange} />;\n }\n\n // text (default)\n return (\n <input\n type=\"text\"\n value={typeof value === \"string\" ? value : String(value ?? \"\")}\n placeholder={meta?.type === \"text\" ? meta.placeholder : undefined}\n onChange={(e) => onChange(e.target.value)}\n style={inputStyle}\n />\n );\n}\n","import type { InspectableStateEntry } from \"../../store\";\nimport { cardStyle } from \"../styles\";\nimport { StateEditor } from \"./StateEditor\";\n\ninterface StateCardProps {\n state: InspectableStateEntry;\n}\n\nexport function StateCard({ state }: StateCardProps) {\n return (\n <div\n style={{\n ...cardStyle,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <div style={{ display: \"flex\", justifyContent: \"space-between\", gap: 12 }}>\n <div style={{ fontWeight: 700 }}>{state.key}</div>\n <div style={{ fontSize: 12, opacity: 0.6 }}>{state.meta?.type ?? \"auto\"}</div>\n </div>\n\n <StateEditor\n value={state.value}\n meta={state.meta}\n onChange={(next) => state.setValue(next)}\n />\n </div>\n );\n}\n","import type React from \"react\";\nimport type { ComponentEntry } from \"../../store\";\nimport { StatePanelHeader } from \"./StatePanelHeader\";\nimport { SearchInput } from \"./SearchInput\";\nimport { StateCard } from \"./StateCard\";\n\ninterface StateEditorPanelProps {\n selected: ComponentEntry | null;\n query: string;\n onQueryChange: (value: string) => void;\n searchRef: React.RefObject<HTMLInputElement | null>;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n onClose: () => void;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n}\n\nexport function StateEditorPanel({\n selected,\n query,\n onQueryChange,\n searchRef,\n leftCollapsed,\n onToggleCollapse,\n onClose,\n onDragStart,\n onDragEnd,\n}: StateEditorPanelProps) {\n return (\n <div style={{ padding: 12, overflow: \"auto\", display: \"flex\", flexDirection: \"column\", boxSizing: \"border-box\" }}>\n <StatePanelHeader\n selectedLabel={selected?.label ?? null}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={onToggleCollapse}\n onClose={onClose}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n />\n\n <SearchInput\n value={query}\n onChange={onQueryChange}\n inputRef={searchRef}\n />\n\n <div style={{ marginTop: 12, display: \"grid\", gap: 10 }}>\n {selected && selected.states.size === 0 && (\n <div style={{ fontSize: 13, opacity: 0.7 }}>\n This component has no inspectable state.\n </div>\n )}\n\n {!selected && (\n <div style={{ opacity: 0.7, fontSize: 13 }}>\n No component selected.\n </div>\n )}\n\n {selected &&\n Array.from(selected.states.values()).map((s) => (\n <StateCard key={s.key} state={s} />\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["useEffect","useId","useMemo","useMemo","useEffect","useId","useEffect","useMemo","useRef","useState","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","useEffect","useState","jsx","jsxs","useState","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useMemo"]}
|
|
1
|
+
{"version":3,"sources":["../src/provider.tsx","../src/store.ts","../src/hooks.ts","../src/StateInspectorUI.tsx","../src/ui/constants.ts","../src/ui/utils.ts","../src/ui/components/FloatingButton.tsx","../src/ui/components/DockPreviewOverlay.tsx","../src/ui/components/ResizeHandle.tsx","../src/ui/components/SidebarResizer.tsx","../src/ui/components/DragHandle.tsx","../src/ui/components/ComponentList.tsx","../src/ui/components/StatePanelHeader.tsx","../src/ui/styles.ts","../src/ui/components/SearchInput.tsx","../src/ui/components/JsonEditor.tsx","../src/ui/components/StateEditor.tsx","../src/ui/components/StateCard.tsx","../src/ui/components/StateEditorPanel.tsx"],"sourcesContent":["import React, { createContext, useContext, useEffect, useId, useMemo } from \"react\";\nimport { createInspectorStore, InspectorComponentRef, InspectorStore } from \"./store\";\n\nconst InspectorContext = createContext<InspectorStore | null>(null);\n\nconst storeRef = { current: null as InspectorStore | null };\n\nfunction getStore(): InspectorStore {\n if (!storeRef.current) {\n storeRef.current = createInspectorStore();\n }\n return storeRef.current;\n}\n\nexport function StateInspectorProvider({\n enabled = true,\n children,\n}: {\n enabled?: boolean;\n children: React.ReactNode;\n}) {\n const store = useMemo(() => getStore(), []);\n\n useEffect(() => {\n storeRef.current!.enabled = enabled;\n }, [enabled]);\n\n return (\n <InspectorContext.Provider value={store}>\n {children}\n </InspectorContext.Provider>\n );\n}\n\nexport function useInspectorStore(): InspectorStore {\n const ctx = useContext(InspectorContext);\n if (!ctx) {\n throw new Error(\"useInspectorStore must be used inside StateInspectorProvider\");\n }\n return ctx;\n}\n\nexport function useInspectorComponent(label?: string): InspectorComponentRef {\n const store = useInspectorStore();\n const reactId = useId();\n const componentId = useMemo(() => `c_${reactId}`, [reactId]);\n\n useEffect(() => {\n if (!store.enabled) return;\n\n store.registerComponent(componentId, label?.trim());\n return () => {\n store.unregisterComponent(componentId);\n };\n }, [store, componentId, label]);\n\n useEffect(() => {\n if (!store.enabled) return;\n const trimmed = label?.trim();\n if (trimmed) store.setComponentLabel(componentId, trimmed);\n }, [store, componentId, label]);\n console.log({ id: componentId });\n \n return useMemo(() => ({ id: componentId }), [componentId]);\n}\n","export type ComponentId = string;\n\nexport type InspectableMeta =\n | { type: \"boolean\" }\n | { type: \"text\"; placeholder?: string }\n | { type: \"number\"; min?: number; max?: number; step?: number }\n | { type: \"select\"; options: Array<string | { label: string; value: string }> }\n | { type: \"json\" }\n | { type: \"custom\"; renderId: string };\n\nexport interface InspectableStateEntry {\n key: string;\n value: unknown;\n setValue: (next: unknown) => void;\n meta?: InspectableMeta;\n}\n\nexport interface ComponentEntry {\n id: ComponentId;\n label: string;\n mounted: boolean;\n states: Map<string, InspectableStateEntry>;\n}\n\nexport interface InspectorSnapshot {\n enabled: boolean;\n components: Array<{\n id: ComponentId;\n label: string;\n mounted: boolean;\n stateKeys: string[];\n }>;\n}\n\ntype Listener = () => void;\n\nexport interface InspectorComponentRef {\n id: string;\n}\n\nexport interface InspectorStore {\n enabled: boolean;\n\n // internal registry\n components: Map<ComponentId, ComponentEntry>;\n\n // subscriptions\n subscribe: (listener: Listener) => () => void;\n getSnapshot: () => InspectorSnapshot;\n\n // component lifecycle\n registerComponent: (id: ComponentId, label?: string) => void;\n setComponentLabel: (id: ComponentId, label: string) => void;\n unregisterComponent: (id: ComponentId) => void;\n\n // state lifecycle\n upsertState: (\n componentId: ComponentId,\n entry: InspectableStateEntry,\n ) => void;\n\n updateStateValue: (componentId: ComponentId, key: string, value: unknown) => void;\n removeState: (componentId: ComponentId, key: string) => void;\n}\n\nexport function createInspectorStore(): InspectorStore {\n const components = new Map<ComponentId, ComponentEntry>();\n const listeners = new Set<Listener>();\n\n function emit() {\n for (const l of listeners) l();\n }\n\n function getOrCreateComponent(id: ComponentId): ComponentEntry {\n const existing = components.get(id);\n if (existing) return existing;\n\n const created: ComponentEntry = {\n id,\n label: \"Unknown\",\n mounted: true,\n states: new Map(),\n };\n components.set(id, created);\n return created;\n }\n\n const store: InspectorStore = {\n enabled: true,\n components,\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n getSnapshot() {\n return {\n enabled: store.enabled,\n components: Array.from(components.values()).map((c) => ({\n id: c.id,\n label: c.label,\n mounted: c.mounted,\n stateKeys: Array.from(c.states.keys()),\n })),\n };\n },\n\n registerComponent(id, label) {\n const c = getOrCreateComponent(id);\n c.mounted = true;\n if (label && label.trim()) c.label = label.trim();\n emit();\n },\n\n setComponentLabel(id, label) {\n const c = getOrCreateComponent(id);\n c.label = label.trim() || \"Unknown\";\n emit();\n },\n\n unregisterComponent(id) {\n const c = components.get(id);\n if (!c) return;\n\n // StrictMode double-unmount safe:\n // we mark as unmounted; UI can choose to hide unmounted entries.\n c.mounted = false;\n\n // Optional: immediate cleanup if you prefer:\n // components.delete(id);\n\n emit();\n },\n\n upsertState(componentId, entry) {\n const c = getOrCreateComponent(componentId);\n c.states.set(entry.key, entry);\n emit();\n },\n\n updateStateValue(componentId, key, value) {\n const c = components.get(componentId);\n if (!c) return;\n const s = c.states.get(key);\n if (!s) return;\n s.value = value;\n emit();\n },\n\n removeState(componentId, key) {\n const c = components.get(componentId);\n if (!c) return;\n if (!c.states.has(key)) return;\n c.states.delete(key);\n emit();\n },\n };\n\n return store;\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { useInspectorStore } from \"./provider\";\nimport type { InspectableMeta, InspectorComponentRef } from \"./store\";\n\nfunction stableKey(input: string): string {\n return input.trim();\n}\n\nfunction inferMeta(value: unknown): InspectableMeta | undefined {\n const t = typeof value;\n if (t === \"boolean\") return { type: \"boolean\" };\n if (t === \"number\") return { type: \"number\" };\n if (t === \"string\") return { type: \"text\" };\n if (value && t === \"object\") return { type: \"json\" };\n return undefined;\n}\n\n/**\n * Registers a piece of state to the inspector registry.\n * Opt-in by replacing useState with useInspectableState.\n */\nexport function useInspectableState<T>(\n component: InspectorComponentRef,\n key: string,\n initial: T | (() => T),\n meta?: InspectableMeta,\n): [T, React.Dispatch<React.SetStateAction<T>>] {\n const store = useInspectorStore();\n const componentId = component.id;\n\n const stateKey = useMemo(() => stableKey(key), [key]);\n\n const [value, setValue] = useState<T>(initial);\n\n // Keep latest setter stable for registry consumers\n const setValueRef = useRef<(next: unknown) => void>(() => {});\n setValueRef.current = (next: unknown) => {\n setValue(next as T);\n };\n\n // Register component + state entry\n useEffect(() => {\n if (!store.enabled) return;\n\n const resolvedMeta = meta ?? inferMeta(value);\n store.upsertState(componentId, {\n key: stateKey,\n value,\n setValue: (next) => setValueRef.current(next),\n ...(resolvedMeta !== undefined && { meta: resolvedMeta }),\n });\n\n return () => {\n store.removeState(componentId, stateKey);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [store, componentId, stateKey]);\n\n // Sync updates on each render when value/meta changes\n useEffect(() => {\n if (!store.enabled) return;\n\n const resolvedMeta = meta ?? inferMeta(value);\n store.upsertState(componentId, {\n key: stateKey,\n value,\n setValue: (next) => setValueRef.current(next),\n ...(resolvedMeta !== undefined && { meta: resolvedMeta }),\n });\n }, [store, componentId, stateKey, value, meta]);\n\n return [value, setValue];\n}\n\n/**\n * Optional helper to give the current component instance a human label.\n */\nexport function useComponentLabel(label: string) {\n const store = useInspectorStore();\n const reactId = useId();\n const componentId = useMemo(() => `c_${reactId}`, [reactId]);\n\n useEffect(() => {\n if (!store.enabled) return;\n const trimmed = label.trim();\n if (!trimmed) return;\n store.setComponentLabel(componentId, trimmed);\n }, [store, componentId, label]);\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useInspectorStore } from \"./provider\";\n\n// UI imports\nimport {\n LS_LAYOUT,\n LS_KEY,\n LS_SIZE,\n LS_LEFT_W,\n isMac,\n} from \"./ui/constants\";\n\nimport type { DockMode, DockPreview, PanelPosition, PanelSize } from \"./ui/types\";\n\nimport { computePreview, previewRectStyle } from \"./ui/utils\";\n\nimport {\n FloatingButton,\n DockPreviewOverlay,\n ResizeHandle,\n SidebarResizer,\n ComponentList,\n StateEditorPanel,\n} from \"./ui/components\";\n\nexport function StateInspectorUI() {\n const store = useInspectorStore();\n const [query, setQuery] = useState<string>(\"\");\n const [leftCollapsed, setLeftCollapsed] = useState(false);\n\n const [layout, setLayout] = useState<DockMode>(\"floating\");\n const [preview, setPreview] = useState<DockPreview>(null);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [open, setOpen] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [tick, force] = useState(0);\n\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n // Persisted panel position\n const [pos, setPos] = useState<PanelPosition>(() => {\n try {\n const raw = localStorage.getItem(LS_KEY);\n return raw ? JSON.parse(raw) : { right: 16, bottom: 72 };\n } catch {\n return { right: 16, bottom: 72 };\n }\n });\n\n // Persisted sidebar width\n const [leftWidth, setLeftWidth] = useState(() => {\n try {\n const raw = localStorage.getItem(LS_LEFT_W);\n return raw ? Number(raw) : 280;\n } catch {\n return 280;\n }\n });\n\n // Persisted panel size\n const [size, setSize] = useState<PanelSize>(() => {\n try {\n const raw = localStorage.getItem(LS_SIZE);\n return raw ? JSON.parse(raw) : { width: 720, height: 420 };\n } catch {\n return { width: 720, height: 420 };\n }\n });\n\n // Persist layout to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_LAYOUT, layout); } catch(e) {\n console.error(e);\n }\n }, [layout]);\n\n // Persist position to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_KEY, JSON.stringify(pos)); } catch(e) {\n console.error(e);\n }\n }, [pos]);\n\n // Persist sidebar width to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_LEFT_W, String(leftWidth)); } catch(e) {\n console.error(e);\n }\n }, [leftWidth]);\n\n // Persist size to localStorage\n useEffect(() => {\n try { localStorage.setItem(LS_SIZE, JSON.stringify(size)); } catch(e) {\n console.error(e);\n }\n }, [size]);\n\n // Auto-collapse sidebar when too narrow\n useEffect(() => {\n const shouldCollapse = leftWidth <= 200 || (size.width ?? 720) - leftWidth < 320;\n setLeftCollapsed(shouldCollapse);\n }, [leftWidth, size.width]);\n console.log(\"Store\", store);\n \n // Subscribe to store changes\n useEffect(() => store.subscribe(() => force((x) => x + 1)), [store]);\n\n // Get mounted components\n const snapshot = useMemo(() => store.getSnapshot(), [store, tick]);\n console.log(\"Snapshot\", snapshot);\n \n const components = useMemo(\n () => snapshot.components.filter((c) => c.mounted),\n [snapshot.components]\n );\n\n console.log(components);\n \n\n // Filter components by search query\n const q = query.trim().toLowerCase();\n const filtered = useMemo(\n () =>\n q\n ? components.filter((c) => {\n const labelHit = c.label.toLowerCase().includes(q);\n const keyHit = c.stateKeys.some((k) => k.toLowerCase().includes(q));\n return labelHit || keyHit;\n })\n : components,\n [q, components]\n );\n\n console.log(filtered);\n\n // Keep a valid selection\n useEffect(() => {\n if (!open) return;\n\n if (components.length === 0) {\n setSelectedId(null);\n return;\n }\n\n if (!selectedId || !components.some((c) => c.id === selectedId)) {\n setSelectedId(components[0]!.id);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, components.length]);\n\n // Keyboard shortcuts\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n const mod = isMac ? e.metaKey : e.ctrlKey;\n\n // Cmd/Ctrl + Shift + I → toggle inspector\n if (mod && e.shiftKey && e.key.toLowerCase() === \"i\") {\n e.preventDefault();\n setOpen((o) => !o);\n return;\n }\n\n if (!open) return;\n\n // Esc → close\n if (e.key === \"Escape\") {\n setOpen(false);\n return;\n }\n\n // \"/\" → focus search\n if (e.key === \"/\") {\n e.preventDefault();\n searchRef.current?.focus();\n return;\n }\n\n // Arrow navigation\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n const list = filtered;\n if (!list.length) return;\n\n const idx = list.findIndex((c) => c.id === selectedId);\n const next =\n e.key === \"ArrowDown\"\n ? list[(Math.max(-1, idx) + 1) % list.length]!.id\n : list[(idx <= 0 ? list.length - 1 : idx - 1)]!.id;\n\n setSelectedId(next);\n setTimeout(() => {\n document.getElementById(`rsi-comp-${next}`)?.scrollIntoView({ block: \"nearest\" });\n }, 0);\n }\n }\n\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open, filtered, selectedId]);\n\n // Get selected component\n const selected = useMemo(() => {\n if (!selectedId) return null;\n return store.components.get(selectedId) ?? null;\n }, [store, selectedId]);\n\n // Drag end handler - apply dock or reset preview\n const handleDragEnd = () => {\n if (preview) {\n setLayout(preview);\n setIsTransitioning(true);\n\n const rects = previewRectStyle(preview);\n setSize({ width: rects.width as number, height: rects.height as number });\n setPos({\n left: rects.left as number,\n right: rects.right as number,\n top: rects.top as number,\n bottom: rects.bottom as number,\n });\n setPreview(null);\n\n setTimeout(() => setIsTransitioning(false), 300);\n return;\n }\n setPreview(null);\n };\n\n // Drag start handler - initiate panel movement\n const handleDragStart = (e: React.PointerEvent<HTMLDivElement>) => {\n const startX = e.clientX;\n const startY = e.clientY;\n const start = pos;\n\n setLayout(\"floating\");\n setIsTransitioning(true);\n setSize({ width: 720, height: 420 });\n setTimeout(() => setIsTransitioning(false), 300);\n\n (e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n const nextPreview = computePreview(ev.clientX, ev.clientY);\n\n setPreview((p) => (p === nextPreview ? p : nextPreview));\n\n const newPos: PanelPosition = {};\n if (start.left !== undefined) {\n newPos.left = Math.max(8, start.left + dx);\n } else {\n newPos.right = Math.max(8, (start.right ?? 16) - dx);\n }\n if (start.top !== undefined) {\n newPos.top = Math.max(8, start.top + dy);\n } else {\n newPos.bottom = Math.max(8, (start.bottom ?? 72) - dy);\n }\n setPos(newPos);\n };\n\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n };\n\n // Handle panel resize\n const handlePanelResize = (startSize: PanelSize) => (delta: { dx: number; dy: number }) => {\n setSize({\n width: Math.min(window.innerWidth - 16, Math.max(480, (startSize.width ?? 0) + delta.dx)),\n height: Math.min(window.innerHeight - 120, Math.max(280, (startSize.height ?? 0) + delta.dy)),\n });\n };\n\n if (!store.enabled) return null;\n\n return createPortal(\n <>\n <FloatingButton onClick={() => setOpen((o) => !o)} />\n <DockPreviewOverlay preview={preview} />\n\n {open && (\n <div\n style={{\n position: \"fixed\",\n left: pos.left,\n right: pos.right,\n top: pos.top,\n bottom: pos.bottom,\n width: size.width || \"calc(100dvw - 24px)\",\n maxWidth: \"calc(100vw - 24px)\",\n height: size.height || \"calc(100dvh - 24px)\",\n maxHeight: \"calc(100vh - 24px)\",\n background: \"#1c1c1c\",\n color: \"#fff\",\n borderRadius: 12,\n border: \"1px solid #333\",\n zIndex: 999999,\n display: \"grid\",\n gridTemplateColumns: leftCollapsed ? \"auto\" : `${leftWidth}px 14px auto`,\n overflow: \"hidden\",\n transition: isTransitioning ? \"all 0.3s ease\" : \"none\",\n }}\n >\n <ResizeHandle onResize={handlePanelResize(size)} />\n\n <ComponentList\n components={filtered}\n selectedId={selectedId}\n onSelect={setSelectedId}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n height={size.height}\n hidden={leftCollapsed}\n />\n\n <SidebarResizer\n leftWidth={leftWidth}\n onWidthChange={setLeftWidth}\n hidden={leftCollapsed}\n />\n\n <StateEditorPanel\n selected={selected}\n query={query}\n onQueryChange={setQuery}\n searchRef={searchRef}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={() => setLeftCollapsed((v) => !v)}\n onClose={() => setOpen(false)}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n />\n </div>\n )}\n </>,\n document.body,\n );\n}\n","// LocalStorage keys\nexport const LS_LAYOUT = \"rsi:panel-layout\";\nexport const LS_KEY = \"rsi:panel-pos\";\nexport const LS_SIZE = \"rsi:panel-size\";\nexport const LS_LEFT_W = \"rsi:left-width\";\n\n// Dock settings\nexport const SNAP = 100; // distance in px to trigger dock preview\nexport const DOCK_W = 420; // left/right dock width\nexport const DOCK_H = 320; // top/bottom dock height\nexport const MARGIN = 12; // dock margin\n\n// Sidebar settings\nexport const LEFT_MIN = 180;\nexport const LEFT_MAX = 420;\n\n// Platform detection\nexport const isMac = typeof navigator !== \"undefined\" \n ? navigator.platform.toUpperCase().includes(\"MAC\") \n : false;\n","import type React from \"react\";\nimport { SNAP, DOCK_W, DOCK_H, MARGIN } from \"./constants\";\nimport type { DockPreview } from \"./types\";\n\n/**\n * Type guard for select option objects\n */\nexport function isOptionObject(\n opt: string | { label: string; value: string },\n): opt is { label: string; value: string } {\n return typeof opt === \"object\" && opt !== null && \"value\" in opt;\n}\n\n/**\n * Compute dock preview based on cursor position\n */\nexport function computePreview(x: number, y: number): DockPreview {\n const w = window.innerWidth;\n const h = window.innerHeight;\n\n const nearLeft = x <= SNAP;\n const nearRight = x >= w - SNAP;\n const nearTop = y <= SNAP;\n const nearBottom = y >= h - SNAP;\n\n // Priority: horizontal edges take precedence over vertical\n if (nearLeft) return \"dock-left\";\n if (nearRight) return \"dock-right\";\n if (nearTop) return \"dock-top\";\n if (nearBottom) return \"dock-bottom\";\n return null;\n}\n\n/**\n * Get CSS properties for dock preview rectangle\n */\nexport function previewRectStyle(p: DockPreview): React.CSSProperties {\n const base: React.CSSProperties = {\n position: \"fixed\",\n border: \"1px dashed #555\",\n background: \"rgba(255,255,255,0.06)\",\n borderRadius: 12,\n };\n\n if (p === \"dock-left\") {\n return { ...base, left: MARGIN, top: MARGIN, bottom: MARGIN, width: DOCK_W };\n }\n if (p === \"dock-right\") {\n return { ...base, right: MARGIN, top: MARGIN, bottom: MARGIN, width: DOCK_W };\n }\n if (p === \"dock-top\") {\n return { ...base, left: MARGIN, right: MARGIN, top: MARGIN, height: DOCK_H };\n }\n // dock-bottom\n return { ...base, left: MARGIN, right: MARGIN, bottom: MARGIN, height: DOCK_H };\n}\n\n/**\n * Safely stringify a value to JSON\n */\nexport function safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n}\n","interface FloatingButtonProps {\n onClick: () => void;\n}\n\nexport function FloatingButton({ onClick }: FloatingButtonProps) {\n return (\n <button\n title=\"State Inspector (⌘⇧I / Ctrl⇧I)\"\n onClick={onClick}\n style={{\n position: \"fixed\",\n right: 16,\n bottom: 16,\n width: 44,\n height: 44,\n borderRadius: 22,\n border: \"none\",\n background: \"#111\",\n color: \"#fff\",\n cursor: \"pointer\",\n zIndex: 999999,\n }}\n aria-label=\"Toggle State Inspector\"\n >\n ◎\n </button>\n );\n}\n","import type { DockPreview } from \"../types\";\nimport { previewRectStyle } from \"../utils\";\n\ninterface DockPreviewOverlayProps {\n preview: DockPreview;\n}\n\nexport function DockPreviewOverlay({ preview }: DockPreviewOverlayProps) {\n if (!preview) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 999998,\n }}\n >\n <div style={previewRectStyle(preview)} />\n </div>\n );\n}\n","interface ResizeHandleProps {\n onResize: (delta: { dx: number; dy: number }) => void;\n}\n\nexport function ResizeHandle({ onResize }: ResizeHandleProps) {\n return (\n <div\n onPointerDown={(e) => {\n const startX = e.clientX;\n const startY = e.clientY;\n\n (e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n onResize({\n dx: ev.clientX - startX,\n dy: ev.clientY - startY,\n });\n };\n\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n }}\n style={{\n position: \"absolute\",\n right: 6,\n bottom: 6,\n width: 14,\n height: 14,\n borderRadius: 6,\n border: \"1px solid #333\",\n background: \"#838383\",\n cursor: \"nwse-resize\",\n }}\n />\n );\n}\n","import { LEFT_MIN, LEFT_MAX } from \"../constants\";\n\ninterface SidebarResizerProps {\n leftWidth: number;\n onWidthChange: (width: number) => void;\n hidden: boolean;\n}\n\nexport function SidebarResizer({ leftWidth, onWidthChange, hidden }: SidebarResizerProps) {\n if (hidden) return null;\n\n return (\n <div\n onPointerDown={(e) => {\n e.preventDefault();\n const startX = e.clientX;\n const startW = leftWidth;\n\n (e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId);\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const next = Math.max(LEFT_MIN, Math.min(LEFT_MAX, startW + dx));\n onWidthChange(next);\n };\n\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n }}\n style={{\n width: 8,\n cursor: \"col-resize\",\n background: \"transparent\",\n borderLeft: \"1px solid #2a2a2a\",\n borderRight: \"1px solid #2a2a2a\",\n }}\n title=\"Resize sidebar\"\n />\n );\n}\n","import type React from \"react\";\n\ninterface DragHandleProps {\n children: React.ReactNode;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n style?: React.CSSProperties;\n}\n\nexport function DragHandle({ children, onDragStart, onDragEnd, style }: DragHandleProps) {\n return (\n <div\n style={{ cursor: \"grab\", userSelect: \"none\", ...style }}\n onPointerDown={onDragStart}\n onPointerUp={onDragEnd}\n >\n {children}\n </div>\n );\n}\n","import type React from \"react\";\nimport type { ComponentSummary } from \"../types\";\nimport { DragHandle } from \"./DragHandle\";\n\ninterface ComponentListProps {\n components: ComponentSummary[];\n selectedId: string | null;\n onSelect: (id: string) => void;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n height?: number | undefined;\n hidden: boolean;\n}\n\nexport function ComponentList({\n components,\n selectedId,\n onSelect,\n onDragStart,\n onDragEnd,\n height,\n hidden,\n}: ComponentListProps) {\n if (hidden) return null;\n\n return (\n <div style={{ padding: 12, height, flexDirection: \"column\", boxSizing: \"border-box\", display: \"flex\" }}>\n <DragHandle\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}\n >\n <h4 style={{ margin: 0 }}>Components</h4>\n <span style={{ fontSize: 12, opacity: 0.7 }}>{components.length}</span>\n </DragHandle>\n\n <div style={{ marginTop: 10, display: \"flex\", flexDirection: \"column\", gap: 8, overflow: \"auto\", flex: 1 }}>\n {components.map((c) => {\n const active = c.id === selectedId;\n return (\n <button\n key={c.id}\n id={`rsi-comp-${c.id}`}\n onClick={() => onSelect(c.id)}\n style={{\n textAlign: \"left\",\n background: active ? \"#2a2a2a\" : \"transparent\",\n border: \"1px solid #333\",\n borderRadius: 10,\n padding: 10,\n color: \"#fff\",\n cursor: \"pointer\",\n flex: \"none\",\n }}\n >\n <div style={{ fontWeight: 700 }}>{c.label}</div>\n <div style={{ fontSize: 12, opacity: 0.7 }}>\n states: {c.stateKeys.length || 0}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import type React from \"react\";\nimport { DragHandle } from \"./DragHandle\";\n\ninterface StatePanelHeaderProps {\n selectedLabel: string | null;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n onClose: () => void;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n}\n\nexport function StatePanelHeader({\n selectedLabel,\n leftCollapsed,\n onToggleCollapse,\n onClose,\n onDragStart,\n onDragEnd,\n}: StatePanelHeaderProps) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\" }}>\n <button\n onClick={(e) => {\n e.preventDefault();\n onToggleCollapse();\n }}\n style={{\n padding: 4,\n marginRight: 12,\n borderRadius: 6,\n border: \"1px solid #333\",\n background: \"transparent\",\n color: \"#fff\",\n cursor: \"pointer\",\n fontSize: 12,\n width: 24,\n height: 24,\n }}\n >\n {leftCollapsed ? \"»\" : \"«\"}\n </button>\n\n <DragHandle\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n style={{ display: \"flex\", flexDirection: \"column\", flex: 1 }}\n >\n <h4 style={{ margin: 0 }}>State</h4>\n <div style={{ fontSize: 12, opacity: 0.7 }}>\n {selectedLabel ?? \"No selection\"}\n </div>\n </DragHandle>\n\n <button\n onClick={onClose}\n style={{\n background: \"transparent\",\n color: \"#fff\",\n border: \"1px solid #333\",\n borderRadius: 10,\n padding: \"6px 10px\",\n cursor: \"pointer\",\n fontSize: 12,\n marginLeft: \"auto\",\n }}\n >\n Close\n </button>\n </div>\n );\n}\n","import type React from \"react\";\n\nexport const inputStyle: React.CSSProperties = {\n padding: \"8px 10px\",\n borderRadius: 10,\n border: \"1px solid #333\",\n background: \"#111\",\n color: \"#fff\",\n};\n\nexport const cardStyle: React.CSSProperties = {\n border: \"1px solid #333\",\n borderRadius: 12,\n padding: 10,\n};\n\nexport const buttonStyle: React.CSSProperties = {\n background: \"transparent\",\n color: \"#fff\",\n border: \"1px solid #333\",\n cursor: \"pointer\",\n};\n","import type React from \"react\";\nimport { inputStyle } from \"../styles\";\n\ninterface SearchInputProps {\n value: string;\n onChange: (value: string) => void;\n inputRef: React.RefObject<HTMLInputElement | null>;\n}\n\nexport function SearchInput({ value, onChange, inputRef }: SearchInputProps) {\n return (\n <input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"Search components / state keys…\"\n ref={inputRef}\n style={{\n ...inputStyle,\n marginTop: 10,\n outline: \"none\",\n }}\n />\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { inputStyle } from \"../styles\";\n\ninterface JsonEditorProps {\n initial: string;\n onValidJson: (obj: unknown) => void;\n}\n\nexport function JsonEditor({ initial, onValidJson }: JsonEditorProps) {\n const [raw, setRaw] = useState(initial);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n setRaw(initial);\n }, [initial]);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const next = e.target.value;\n setRaw(next);\n\n try {\n const parsed = JSON.parse(next);\n setError(null);\n onValidJson(parsed);\n } catch {\n setError(\"Invalid JSON\");\n }\n };\n\n return (\n <div style={{ display: \"grid\", gap: 6 }}>\n <textarea\n value={raw}\n onChange={handleChange}\n rows={6}\n style={{\n ...inputStyle,\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n fontSize: 12,\n resize: \"vertical\",\n }}\n />\n {error && <div style={{ fontSize: 12, color: \"#ff6b6b\" }}>{error}</div>}\n </div>\n );\n}\n","import type { InspectableMeta } from \"../../store\";\nimport { inputStyle } from \"../styles\";\nimport { isOptionObject, safeStringify } from \"../utils\";\nimport { JsonEditor } from \"./JsonEditor\";\n\ninterface StateEditorProps {\n value: unknown;\n meta: InspectableMeta | undefined;\n onChange: (next: unknown) => void;\n}\n\nexport function StateEditor({ value, meta, onChange }: StateEditorProps) {\n // boolean\n if (meta?.type === \"boolean\" || typeof value === \"boolean\") {\n return (\n <label style={{ display: \"flex\", gap: 10, alignItems: \"center\" }}>\n <input\n type=\"checkbox\"\n checked={Boolean(value)}\n onChange={(e) => onChange(e.target.checked)}\n />\n <span style={{ fontSize: 13, opacity: 0.8 }}>{String(Boolean(value))}</span>\n </label>\n );\n }\n\n // select\n if (meta?.type === \"select\" && Array.isArray(meta.options)) {\n const current = typeof value === \"string\" ? value : String(value ?? \"\");\n return (\n <select\n value={current}\n onChange={(e) => onChange(e.target.value)}\n style={inputStyle}\n >\n {meta.options.map((opt: string | { label: string; value: string }) => {\n const o = isOptionObject(opt) ? opt : { label: String(opt), value: String(opt) };\n return (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n );\n })}\n </select>\n );\n }\n\n // number\n if (meta?.type === \"number\") {\n return (\n <input\n type=\"number\"\n value={typeof value === \"number\" ? value : Number(value ?? 0)}\n min={meta?.min}\n max={meta?.max}\n step={meta?.step}\n onChange={(e) => onChange(e.target.value === \"\" ? 0 : Number(e.target.value))}\n style={inputStyle}\n />\n );\n }\n\n // json\n if (meta?.type === \"json\" || (value && typeof value === \"object\")) {\n return <JsonEditor initial={safeStringify(value)} onValidJson={onChange} />;\n }\n\n // text (default)\n return (\n <input\n type=\"text\"\n value={typeof value === \"string\" ? value : String(value ?? \"\")}\n placeholder={meta?.type === \"text\" ? meta.placeholder : undefined}\n onChange={(e) => onChange(e.target.value)}\n style={inputStyle}\n />\n );\n}\n","import type { InspectableStateEntry } from \"../../store\";\nimport { cardStyle } from \"../styles\";\nimport { StateEditor } from \"./StateEditor\";\n\ninterface StateCardProps {\n state: InspectableStateEntry;\n}\n\nexport function StateCard({ state }: StateCardProps) {\n return (\n <div\n style={{\n ...cardStyle,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <div style={{ display: \"flex\", justifyContent: \"space-between\", gap: 12 }}>\n <div style={{ fontWeight: 700 }}>{state.key}</div>\n <div style={{ fontSize: 12, opacity: 0.6 }}>{state.meta?.type ?? \"auto\"}</div>\n </div>\n\n <StateEditor\n value={state.value}\n meta={state.meta}\n onChange={(next) => state.setValue(next)}\n />\n </div>\n );\n}\n","import type React from \"react\";\nimport type { ComponentEntry } from \"../../store\";\nimport { StatePanelHeader } from \"./StatePanelHeader\";\nimport { SearchInput } from \"./SearchInput\";\nimport { StateCard } from \"./StateCard\";\n\ninterface StateEditorPanelProps {\n selected: ComponentEntry | null;\n query: string;\n onQueryChange: (value: string) => void;\n searchRef: React.RefObject<HTMLInputElement | null>;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n onClose: () => void;\n onDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n}\n\nexport function StateEditorPanel({\n selected,\n query,\n onQueryChange,\n searchRef,\n leftCollapsed,\n onToggleCollapse,\n onClose,\n onDragStart,\n onDragEnd,\n}: StateEditorPanelProps) {\n return (\n <div style={{ padding: 12, overflow: \"auto\", display: \"flex\", flexDirection: \"column\", boxSizing: \"border-box\" }}>\n <StatePanelHeader\n selectedLabel={selected?.label ?? null}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={onToggleCollapse}\n onClose={onClose}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n />\n\n <SearchInput\n value={query}\n onChange={onQueryChange}\n inputRef={searchRef}\n />\n\n <div style={{ marginTop: 12, display: \"grid\", gap: 10 }}>\n {selected && selected.states.size === 0 && (\n <div style={{ fontSize: 13, opacity: 0.7 }}>\n This component has no inspectable state.\n </div>\n )}\n\n {!selected && (\n <div style={{ opacity: 0.7, fontSize: 13 }}>\n No component selected.\n </div>\n )}\n\n {selected &&\n Array.from(selected.states.values()).map((s) => (\n <StateCard key={s.key} state={s} />\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["useEffect","useId","useMemo","useMemo","useEffect","useId","useEffect","useMemo","useRef","useState","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","useEffect","useState","jsx","jsxs","useState","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useMemo"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-state-inspector-devtools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -30,5 +30,13 @@
|
|
|
30
30
|
"lint": "eslint .",
|
|
31
31
|
"format": "prettier . --check",
|
|
32
32
|
"format:write": "prettier . --write"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/react": "^18.2.0",
|
|
36
|
+
"@types/react-dom": "^18.2.0",
|
|
37
|
+
"react": "^18.2.0",
|
|
38
|
+
"react-dom": "^18.2.0",
|
|
39
|
+
"tsup": "^8.0.0",
|
|
40
|
+
"typescript": "^5.0.0"
|
|
33
41
|
}
|
|
34
|
-
}
|
|
42
|
+
}
|