react-state-inspector-devtools 0.1.8 → 1.0.2
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 +675 -364
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +670 -359
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider.tsx","../src/store.ts","../src/hooks.ts","../src/StateInspectorUI.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\";\nimport { InspectableMeta } from \"./store\";\nconst isMac = navigator.platform.toUpperCase().includes(\"MAC\");\n\nfunction 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\nexport function StateInspectorUI() {\n const store = useInspectorStore();\n const [query, setQuery] = useState<string>(\"\");\n\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 const LS_KEY = \"rsi:panel-pos\";\n const [pos, setPos] = useState<{ right: number; bottom: number }>(() => {\n try {\n const raw = localStorage.getItem(LS_KEY);\n return raw ? JSON.parse(raw) : { right: 16, bottom: 72 };\n } catch {\n // Fallback to default position if localStorage is unavailable\n return { right: 16, bottom: 72 };\n }\n });\n\n useEffect(() => {\n try {\n localStorage.setItem(LS_KEY, JSON.stringify(pos));\n } catch {\n // Silently fail if localStorage is unavailable\n }\n }, [pos]);\n\n const SIZE_KEY = \"rsi:panel-size\";\n const [size, setSize] = useState<{ width: number; height: number }>(() => {\n try {\n const raw = localStorage.getItem(SIZE_KEY);\n return raw ? JSON.parse(raw) : { width: 720, height: 420 };\n } catch {\n // Fallback to default size if localStorage is unavailable\n return { width: 720, height: 420 };\n }\n });\n\n useEffect(() => {\n try {\n localStorage.setItem(SIZE_KEY, JSON.stringify(size));\n } catch {\n // Silently fail if localStorage is unavailable\n }\n }, [size]);\n\n useEffect(() => store.subscribe(() => force((x) => x + 1)), [store]);\n\n const snapshot = useMemo(() => store.getSnapshot(), [store]);\n const components = useMemo(\n () => snapshot.components.filter((c) => c.mounted),\n [snapshot.components]\n );\n\n const q = query.trim().toLowerCase();\n\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) =>\n k.toLowerCase().includes(q)\n );\n return labelHit || keyHit;\n })\n : components,\n [q, components]\n );\n\n // Keep a valid selection\n useEffect(() => {\n if (!open) {\n return;\n }\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 useEffect(() => {\n if (!open) {\n return;\n }\n\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") setOpen(false);\n }\n\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open]);\n\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 }\n }\n\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open, filtered, selectedId]);\n\n const selected = useMemo(() => {\n if (!selectedId) return null;\n return store.components.get(selectedId) ?? null;\n }, [store, selectedId]);\n\n if (!store.enabled) return null;\n\n return createPortal(\n <>\n {/* Floating Button */}\n <button\n title=\"State Inspector (⌘⇧I / Ctrl⇧I)\"\n onClick={() => setOpen((o) => !o)}\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 {/* Floating Card */}\n {open && (\n <div\n style={{\n position: \"fixed\",\n right: pos.right,\n bottom: pos.bottom,\n width: size.width,\n maxWidth: \"calc(100vw - 32px)\",\n height: size.height,\n maxHeight: \"calc(100vh - 120px)\",\n background: \"#1c1c1c\",\n color: \"#fff\",\n borderRadius: 12,\n border: \"1px solid #333\",\n zIndex: 999999,\n display: \"grid\",\n gridTemplateColumns: \"280px 1fr\",\n overflow: \"hidden\",\n }}\n >\n {/* Resize Handle */}\n <div\n onPointerDown={(e) => {\n const startX = e.clientX;\n const startY = e.clientY;\n const start = size;\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 setSize({\n width: Math.min(window.innerWidth - 16, Math.max(480, start.width + dx)),\n height: Math.min(window.innerHeight - 120, Math.max(280, start.height + dy)),\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 {/* Left: component list */}\n <div style={{ borderRight: \"1px solid #333\", padding: 12, height: size.height, display: \"flex\", flexDirection: \"column\", boxSizing: \"border-box\" }}>\n <div \n style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", cursor: \"grab\", userSelect: \"none\" }}\n onPointerDown={(e) => {\n const startX = e.clientX;\n const startY = e.clientY;\n const start = pos;\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 setPos({\n right: Math.max(8, start.right - dx),\n bottom: Math.max(8, start.bottom - dy),\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 >\n <h4 style={{ margin: 0 }}>Components</h4>\n <span style={{ fontSize: 12, opacity: 0.7 }}>{filtered.length}</span>\n </div>\n\n <div style={{ marginTop: 10, display: \"grid\", gap: 8, overflow: \"auto\", flex: 1 }}>\n {filtered.map((c) => {\n const active = c.id === selectedId;\n return (\n <button\n key={c.id}\n onClick={() => setSelectedId(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 }}\n >\n <div style={{ fontWeight: 700 }}>{c.label}</div>\n <div style={{ fontSize: 12, opacity: 0.7 }}>\n states: {c.stateKeys.length ? c.stateKeys.length : 0}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Right: state editors */}\n <div style={{ padding: 12, overflow: \"auto\", display: \"flex\", flexDirection: \"column\", boxSizing: \"border-box\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <div>\n <h4 style={{ margin: 0 }}>State</h4>\n <div style={{ fontSize: 12, opacity: 0.7 }}>\n {selected ? selected.label : \"No selection\"}\n </div>\n </div>\n\n <button\n onClick={() => setOpen(false)}\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 }}\n >\n Close\n </button>\n </div>\n\n <input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search components / state keys…\"\n ref={searchRef}\n style={{\n marginTop: 10,\n padding: \"8px 10px\",\n borderRadius: 10,\n border: \"1px solid #333\",\n background: \"#111\",\n color: \"#fff\",\n outline: \"none\",\n }}\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 <div\n key={s.key}\n style={{\n border: \"1px solid #333\",\n borderRadius: 12,\n padding: 10,\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 }}>{s.key}</div>\n <div style={{ fontSize: 12, opacity: 0.6 }}>{s.meta?.type ?? \"auto\"}</div>\n </div>\n\n <StateEditor\n value={s.value}\n meta={s.meta}\n onChange={(next) => s.setValue(next)}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n </>,\n document.body,\n );\n}\n\nfunction StateEditor({\n value,\n meta,\n onChange,\n}: {\n value: unknown;\n meta: InspectableMeta | undefined;\n onChange: (next: unknown) => void;\n}) {\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={{\n padding: \"8px 10px\",\n borderRadius: 10,\n border: \"1px solid #333\",\n background: \"#111\",\n color: \"#fff\",\n }}\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={{\n padding: \"8px 10px\",\n borderRadius: 10,\n border: \"1px solid #333\",\n background: \"#111\",\n color: \"#fff\",\n }}\n />\n );\n }\n\n // json\n if (meta?.type === \"json\" || (value && typeof value === \"object\")) {\n const text = safeStringify(value);\n return (\n <JsonEditor initial={text} onValidJson={(obj) => onChange(obj)} />\n );\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={{\n padding: \"8px 10px\",\n borderRadius: 10,\n border: \"1px solid #333\",\n background: \"#111\",\n color: \"#fff\",\n }}\n />\n );\n}\n\nfunction safeStringify(v: unknown) {\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n}\n\nfunction JsonEditor({\n initial,\n onValidJson,\n}: {\n initial: string;\n onValidJson: (obj: unknown) => void;\n}) {\n const [raw, setRaw] = useState(initial);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n setRaw(initial);\n }, [initial]);\n\n return (\n <div style={{ display: \"grid\", gap: 6 }}>\n <textarea\n value={raw}\n onChange={(e) => {\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 rows={6}\n style={{\n padding: \"8px 10px\",\n borderRadius: 10,\n border: \"1px solid #333\",\n background: \"#111\",\n color: \"#fff\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n fontSize: 12,\n }}\n />\n {error && <div style={{ fontSize: 12, color: \"#ff6b6b\" }}>{error}</div>}\n </div>\n );\n}\n"],"mappings":"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","names":["useEffect","useId","useMemo","useMemo","useEffect","useId","useEffect","useMemo","useRef","useState","jsx","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\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-state-inspector-devtools",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.2",
|
|
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
|
}
|