react-state-inspector-devtools 1.1.2 → 1.1.24
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 +25 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +25 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/index.css +0 -156
- package/dist/index.css.map +0 -1
package/dist/index.js
CHANGED
|
@@ -30,6 +30,31 @@ __export(index_exports, {
|
|
|
30
30
|
});
|
|
31
31
|
module.exports = __toCommonJS(index_exports);
|
|
32
32
|
|
|
33
|
+
// #style-inject:#style-inject
|
|
34
|
+
function styleInject(css, { insertAt } = {}) {
|
|
35
|
+
if (!css || typeof document === "undefined") return;
|
|
36
|
+
const head = document.head || document.getElementsByTagName("head")[0];
|
|
37
|
+
const style = document.createElement("style");
|
|
38
|
+
style.type = "text/css";
|
|
39
|
+
if (insertAt === "top") {
|
|
40
|
+
if (head.firstChild) {
|
|
41
|
+
head.insertBefore(style, head.firstChild);
|
|
42
|
+
} else {
|
|
43
|
+
head.appendChild(style);
|
|
44
|
+
}
|
|
45
|
+
} else {
|
|
46
|
+
head.appendChild(style);
|
|
47
|
+
}
|
|
48
|
+
if (style.styleSheet) {
|
|
49
|
+
style.styleSheet.cssText = css;
|
|
50
|
+
} else {
|
|
51
|
+
style.appendChild(document.createTextNode(css));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// src/index.css
|
|
56
|
+
styleInject('@import "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";\n[data-rsi-root],\n[data-rsi-root] *,\n[data-rsi-root] *::before,\n[data-rsi-root] *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0;\n font-family:\n "Inter",\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n "Helvetica Neue",\n sans-serif;\n font-size: 14px;\n font-weight: 400;\n font-style: normal;\n font-variant: normal;\n line-height: 1.5;\n letter-spacing: normal;\n text-align: left;\n text-decoration: none;\n text-indent: 0;\n text-shadow: none;\n text-transform: none;\n word-spacing: normal;\n white-space: normal;\n background: transparent;\n color: inherit;\n outline: none;\n vertical-align: baseline;\n visibility: visible;\n opacity: 1;\n transform: none;\n transform-origin: 50% 50% 0;\n animation: none;\n transition: none;\n list-style: none;\n border-collapse: collapse;\n border-spacing: 0;\n float: none;\n clear: none;\n cursor: auto;\n}\n[data-rsi-root] {\n all: initial;\n font-family:\n "Inter",\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n "Helvetica Neue",\n sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #fff;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n text-rendering: optimizeLegibility;\n}\n[data-rsi-floating-button] {\n all: initial;\n font-family:\n "Inter",\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n "Helvetica Neue",\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n[data-rsi-root] button {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n background: transparent;\n border: none;\n padding: 0;\n margin: 0;\n border-radius: 8px;\n}\n[data-rsi-root] input,\n[data-rsi-root] textarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n background: transparent;\n border: none;\n outline: none;\n padding: 0;\n margin: 0;\n resize: none;\n}\n[data-rsi-root] input::placeholder,\n[data-rsi-root] textarea::placeholder {\n color: inherit;\n opacity: 0.5;\n}\n[data-rsi-root] a {\n color: inherit;\n text-decoration: none;\n}\n[data-rsi-root] img,\n[data-rsi-root] svg {\n display: block;\n max-width: 100%;\n}\n[data-rsi-root] h1,\n[data-rsi-root] h2,\n[data-rsi-root] h3,\n[data-rsi-root] h4,\n[data-rsi-root] h5,\n[data-rsi-root] h6 {\n font-size: inherit;\n font-weight: inherit;\n}\n[data-rsi-root] ::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n}\n[data-rsi-root] ::-webkit-scrollbar-track {\n background: transparent;\n}\n[data-rsi-root] ::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.2);\n border-radius: 3px;\n}\n[data-rsi-root] ::-webkit-scrollbar-thumb:hover {\n background: rgba(255, 255, 255, 0.3);\n}\n[data-rsi-root] ::selection {\n background: rgba(99, 102, 241, 0.4);\n color: #fff;\n}\n[data-rsi-root] :focus-visible {\n outline: 2px solid rgba(99, 102, 241, 0.6);\n outline-offset: 2px;\n}\n');
|
|
57
|
+
|
|
33
58
|
// src/provider.tsx
|
|
34
59
|
var import_react = require("react");
|
|
35
60
|
|
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/icons/DevtoolsIcon.tsx","../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/styles.ts","../src/ui/components/SearchInput.tsx","../src/ui/components/ComponentList.tsx","../src/ui/components/StatePanelHeader.tsx","../src/ui/components/JsonEditor.tsx","../src/ui/components/StateEditor.tsx","../src/ui/components/StateCard.tsx","../src/ui/components/StateEditorPanel.tsx","../src/ui/icons/DragIcon.tsx","../src/ui/icons/CloseIcon.tsx","../src/ui/components/DockHeader.tsx"],"sourcesContent":["import \"./index.css\";\n\nexport * 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 <InspectorContext.Provider value={store}>{children}</InspectorContext.Provider>;\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: (componentId: ComponentId, entry: InspectableStateEntry) => 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 { LS_LAYOUT, LS_KEY, LS_SIZE, LS_LEFT_W, isMac } 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\";\nimport DockHeader from \"./ui/components/DockHeader\";\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 {\n localStorage.setItem(LS_LAYOUT, layout);\n } catch (e) {\n console.error(e);\n }\n }, [layout]);\n\n // Persist position to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(LS_KEY, JSON.stringify(pos));\n } catch (e) {\n console.error(e);\n }\n }, [pos]);\n\n // Persist sidebar width to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(LS_LEFT_W, String(leftWidth));\n } catch (e) {\n console.error(e);\n }\n }, [leftWidth]);\n\n // Persist size to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(LS_SIZE, JSON.stringify(size));\n } 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, tick]);\n\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 =\n (startSize: PanelSize, startPos: PanelPosition) =>\n (\n delta: { dx: number; dy: number },\n direction:\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\",\n ) => {\n const isLeft = direction === \"left\" || direction.endsWith(\"left\");\n const isTop = direction === \"top\" || direction.startsWith(\"top\");\n const isHorizontal = direction !== \"top\" && direction !== \"bottom\";\n const isVertical = direction !== \"left\" && direction !== \"right\";\n\n const currentWidth = startSize.width ?? 720;\n const currentHeight = startSize.height ?? 420;\n\n // Calculate new dimensions\n let newWidth = currentWidth;\n let newHeight = currentHeight;\n\n if (isHorizontal) {\n if (isLeft) {\n newWidth = Math.min(window.innerWidth - 16, Math.max(480, currentWidth - delta.dx));\n } else {\n newWidth = Math.min(window.innerWidth - 16, Math.max(480, currentWidth + delta.dx));\n }\n }\n\n if (isVertical) {\n if (isTop) {\n newHeight = Math.min(window.innerHeight - 120, Math.max(280, currentHeight - delta.dy));\n } else {\n newHeight = Math.min(window.innerHeight - 120, Math.max(280, currentHeight + delta.dy));\n }\n }\n\n setSize({ width: newWidth, height: newHeight });\n\n // Update position for left/top edges\n const newPos: PanelPosition = { ...startPos };\n\n if (isLeft && startPos.left !== undefined) {\n const widthDelta = newWidth - currentWidth;\n newPos.left = Math.max(8, startPos.left - widthDelta);\n } else if (isLeft && startPos.right !== undefined) {\n // If positioned from right, adjust right position\n const widthDelta = newWidth - currentWidth;\n newPos.right = Math.max(8, startPos.right - widthDelta);\n }\n\n if (isTop && startPos.top !== undefined) {\n const heightDelta = newHeight - currentHeight;\n newPos.top = Math.max(8, startPos.top - heightDelta);\n } else if (isTop && startPos.bottom !== undefined) {\n // If positioned from bottom, adjust bottom position\n const heightDelta = newHeight - currentHeight;\n newPos.bottom = Math.max(8, startPos.bottom - heightDelta);\n }\n\n setPos(newPos);\n };\n\n if (!store.enabled) return null;\n\n return createPortal(\n <>\n <FloatingButton onClick={() => setOpen((o) => !o)} isActive={open} />\n <DockPreviewOverlay preview={preview} />\n\n {open && (\n <div\n data-rsi-root\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 overflow: \"hidden\",\n transition: isTransitioning ? \"all 0.3s ease\" : \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <DockHeader\n setOpen={setOpen}\n handleDragStart={handleDragStart}\n handleDragEnd={handleDragEnd}\n />\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: leftCollapsed ? \"auto\" : `${leftWidth}px 14px auto`,\n height: \"100%\",\n }}\n >\n <ResizeHandle onResize={handlePanelResize(size, pos)} />\n\n <ComponentList\n query={query}\n onQueryChange={setQuery}\n searchRef={searchRef}\n components={filtered}\n selectedId={selectedId}\n onSelect={setSelectedId}\n hidden={leftCollapsed}\n />\n\n <SidebarResizer\n leftWidth={leftWidth}\n onWidthChange={setLeftWidth}\n hidden={leftCollapsed}\n />\n\n <StateEditorPanel\n selected={selected}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={() => setLeftCollapsed((v) => !v)}\n />\n </div>\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 =\n typeof navigator !== \"undefined\" ? navigator.platform.toUpperCase().includes(\"MAC\") : 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","import React, { SVGAttributes } from \"react\";\n\nconst DevtoolsIcon: React.FC<SVGAttributes<SVGSVGElement>> = (props) => {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g clipPath=\"url(#clip0_1_13)\">\n <path\n d=\"M2 7.00002C1.90538 7.00034 1.81262 6.97381 1.73248 6.92351C1.65234 6.87321 1.58812 6.8012 1.54727 6.71585C1.50643 6.6305 1.49065 6.53531 1.50175 6.44135C1.51285 6.34739 1.55039 6.2585 1.61 6.18502L6.56 1.08502C6.59713 1.04216 6.64773 1.0132 6.70349 1.00289C6.75925 0.992575 6.81686 1.00153 6.86687 1.02827C6.91687 1.05502 6.95629 1.09797 6.97867 1.15007C7.00104 1.20218 7.00504 1.26034 6.99 1.31502L6.03 4.32502C6.00169 4.40078 5.99219 4.48228 6.0023 4.56252C6.01241 4.64277 6.04183 4.71936 6.08805 4.78573C6.13426 4.85211 6.19589 4.90628 6.26764 4.9436C6.33939 4.98092 6.41912 5.00028 6.5 5.00002H10C10.0946 4.9997 10.1874 5.02623 10.2675 5.07653C10.3477 5.12683 10.4119 5.19884 10.4527 5.28419C10.4936 5.36954 10.5094 5.46473 10.4983 5.55869C10.4871 5.65266 10.4496 5.74154 10.39 5.81502L5.44 10.915C5.40287 10.9579 5.35227 10.9868 5.29651 10.9972C5.24075 11.0075 5.18314 10.9985 5.13313 10.9718C5.08313 10.945 5.04371 10.9021 5.02133 10.85C4.99896 10.7979 4.99496 10.7397 5.01 10.685L5.97 7.67502C5.99831 7.59926 6.00781 7.51776 5.9977 7.43752C5.98759 7.35727 5.95817 7.28068 5.91195 7.21431C5.86574 7.14793 5.80411 7.09376 5.73236 7.05644C5.66061 7.01912 5.58088 6.99976 5.5 7.00002H2Z\"\n fill=\"inherit\"\n stroke=\"inherit\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1_13\">\n <rect width=\"12\" height=\"12\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n};\n\nexport default DevtoolsIcon;\n","import DevtoolsIcon from \"../icons/DevtoolsIcon\";\n\ninterface FloatingButtonProps {\n onClick: () => void;\n isActive: boolean;\n}\n\nexport function FloatingButton({ onClick, isActive }: FloatingButtonProps) {\n return (\n <button\n data-rsi-floating-button\n title=\"State Inspector (⌘⇧I / Ctrl⇧I)\"\n onClick={onClick}\n style={{\n position: \"fixed\",\n right: 16,\n bottom: 16,\n width: 48,\n height: 48,\n borderRadius: 24,\n border: \"none\",\n background: isActive ? \"#155DFC\" : \"#111\",\n color: \"#fff\",\n cursor: \"pointer\",\n zIndex: 999999,\n padding: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n aria-label=\"Toggle State Inspector\"\n >\n <DevtoolsIcon fill={isActive ? \"#FFF\" : undefined} stroke=\"#FFF\" height={20} width={20} />\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","export type ResizeDirection =\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\ninterface ResizeHandleProps {\n onResize: (delta: { dx: number; dy: number }, direction: ResizeDirection) => void;\n}\n\nconst EDGE_SIZE = 6;\nconst CORNER_SIZE = 12;\n\ntype HandleConfig = {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n width?: number | string;\n height?: number | string;\n cursor: string;\n};\n\nconst handleConfigs: Record<ResizeDirection, HandleConfig> = {\n // Edges\n top: { top: 0, left: CORNER_SIZE, right: CORNER_SIZE, height: EDGE_SIZE, cursor: \"ns-resize\" },\n bottom: {\n bottom: 0,\n left: CORNER_SIZE,\n right: CORNER_SIZE,\n height: EDGE_SIZE,\n cursor: \"ns-resize\",\n },\n left: { left: 0, top: CORNER_SIZE, bottom: CORNER_SIZE, width: EDGE_SIZE, cursor: \"ew-resize\" },\n right: { right: 0, top: CORNER_SIZE, bottom: CORNER_SIZE, width: EDGE_SIZE, cursor: \"ew-resize\" },\n // Corners\n \"top-left\": { top: 0, left: 0, width: CORNER_SIZE, height: CORNER_SIZE, cursor: \"nwse-resize\" },\n \"top-right\": { top: 0, right: 0, width: CORNER_SIZE, height: CORNER_SIZE, cursor: \"nesw-resize\" },\n \"bottom-left\": {\n bottom: 0,\n left: 0,\n width: CORNER_SIZE,\n height: CORNER_SIZE,\n cursor: \"nesw-resize\",\n },\n \"bottom-right\": {\n bottom: 0,\n right: 0,\n width: CORNER_SIZE,\n height: CORNER_SIZE,\n cursor: \"nwse-resize\",\n },\n};\n\nfunction Handle({\n direction,\n onResize,\n}: {\n direction: ResizeDirection;\n onResize: (delta: { dx: number; dy: number }, direction: ResizeDirection) => void;\n}) {\n const config = handleConfigs[direction];\n\n return (\n <div\n onPointerDown={(e) => {\n e.stopPropagation();\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 {\n dx: ev.clientX - startX,\n dy: ev.clientY - startY,\n },\n direction,\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 top: config.top,\n right: config.right,\n bottom: config.bottom,\n left: config.left,\n width: config.width,\n height: config.height,\n cursor: config.cursor,\n background: \"transparent\",\n zIndex: 10,\n }}\n />\n );\n}\n\nconst directions: ResizeDirection[] = [\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n];\n\nexport function ResizeHandle({ onResize }: ResizeHandleProps) {\n return (\n <>\n {directions.map((dir) => (\n <Handle key={dir} direction={dir} onResize={onResize} />\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\";\nimport { useState } 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 const [isDragging, setIsDragging] = useState(false);\n\n return (\n <div\n style={{ cursor: isDragging ? \"grabbing\" : \"grab\", userSelect: \"none\", ...style }}\n onPointerDown={(e) => {\n const target = e.target as HTMLElement | null;\n try {\n if (\n target &&\n typeof target.closest === \"function\" &&\n target.closest('button, input, textarea, a, [role=\"button\"], [data-no-drag]')\n ) {\n return;\n }\n } catch (e) {\n console.error(e);\n }\n\n setIsDragging(true);\n onDragStart(e);\n }}\n onPointerUp={() => {\n if (isDragging) {\n setIsDragging(false);\n onDragEnd();\n }\n }}\n >\n {children}\n </div>\n );\n}\n","import type React from \"react\";\n\nexport const inputStyle: React.CSSProperties = {\n padding: \"8px 10px\",\n borderRadius: 4,\n border: \"none\",\n background: \"#18181B\",\n color: \"#fff\",\n minWidth: 120,\n};\n\nexport const cardStyle: React.CSSProperties = {\n border: \"1px solid rgba(39, 39, 42, 0.30)\",\n borderRadius: 12,\n padding: 10,\n};\n\nexport const buttonStyle: React.CSSProperties = {\n background: \"transparent\",\n color: \"#fff\",\n border: \"1px solid rgba(39, 39, 42, 0.30)\",\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=\"Filter…\"\n ref={inputRef}\n style={{\n ...inputStyle,\n outline: \"none\",\n }}\n />\n );\n}\n","import type React from \"react\";\nimport type { ComponentSummary } from \"../types\";\nimport { SearchInput } from \"./SearchInput\";\ninterface ComponentListProps {\n components: ComponentSummary[];\n selectedId: string | null;\n onSelect: (id: string) => void;\n hidden: boolean;\n query: string;\n onQueryChange: (value: string) => void;\n searchRef: React.RefObject<HTMLInputElement | null>;\n}\n\nexport function ComponentList({\n components,\n selectedId,\n onSelect,\n hidden,\n query,\n onQueryChange,\n searchRef,\n}: ComponentListProps) {\n if (hidden) return null;\n\n return (\n <div style={{ padding: 4, boxSizing: \"border-box\", backgroundColor: \"#09090B\" }}>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n paddingTop: 4,\n paddingBottom: 8,\n paddingLeft: 4,\n paddingRight: 4,\n }}\n >\n <SearchInput value={query} onChange={onQueryChange} inputRef={searchRef} />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2, 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 display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: 8,\n backgroundColor: active ? \"#27272A\" : \"transparent\",\n border: \"none\",\n }}\n >\n <div style={{ fontWeight: 500, fontSize: 12, color: active ? \"#fff\" : \"#9F9FA9\" }}>\n {c.label}\n </div>\n <div\n style={{\n fontSize: 9,\n height: 16,\n width: 16,\n color: \"#D4D4D8\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 8,\n backgroundColor: \"#3F3F47\",\n }}\n >\n {c.stateKeys.length}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import type React from \"react\";\n\ninterface StatePanelHeaderProps {\n selectedLabel: string | null;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n}\n\nexport function StatePanelHeader({\n selectedLabel,\n leftCollapsed,\n onToggleCollapse,\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 <h4 style={{ margin: 0 }}>{selectedLabel ?? \"No selection\"}</h4>\n </div>\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={{\n ...inputStyle,\n minWidth: 120,\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={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: \"row\",\n justifyContent: \"space-between\",\n gap: 8,\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n gap: 1,\n }}\n >\n <div style={{ fontSize: 14 }}>{state.key}</div>\n <div style={{ fontSize: 12, color: \"#52525C\", textTransform: \"uppercase\" }}>\n {state.meta?.type ?? \"auto\"}\n </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 { StateCard } from \"./StateCard\";\n\ninterface StateEditorPanelProps {\n selected: ComponentEntry | null;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n}\n\nexport function StateEditorPanel({\n selected,\n leftCollapsed,\n onToggleCollapse,\n}: StateEditorPanelProps) {\n return (\n <div\n style={{\n padding: 12,\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n backgroundColor: \"#0C0C0E\",\n }}\n >\n <StatePanelHeader\n selectedLabel={selected?.label ?? null}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={onToggleCollapse}\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 }}>This component has no inspectable state.</div>\n )}\n\n {!selected && <div style={{ opacity: 0.7, fontSize: 13 }}>No component selected.</div>}\n\n {selected &&\n Array.from(selected.states.values()).map((s) => <StateCard key={s.key} state={s} />)}\n </div>\n </div>\n );\n}\n","import React, { SVGAttributes } from \"react\";\n\nconst DragIcon: React.FC<SVGAttributes<SVGSVGElement>> = (props) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M7.99998 6.66665C8.36817 6.66665 8.66665 6.36817 8.66665 5.99998C8.66665 5.63179 8.36817 5.33331 7.99998 5.33331C7.63179 5.33331 7.33331 5.63179 7.33331 5.99998C7.33331 6.36817 7.63179 6.66665 7.99998 6.66665Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12.6667 6.66665C13.0349 6.66665 13.3333 6.36817 13.3333 5.99998C13.3333 5.63179 13.0349 5.33331 12.6667 5.33331C12.2985 5.33331 12 5.63179 12 5.99998C12 6.36817 12.2985 6.66665 12.6667 6.66665Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.33335 6.66665C3.70154 6.66665 4.00002 6.36817 4.00002 5.99998C4.00002 5.63179 3.70154 5.33331 3.33335 5.33331C2.96516 5.33331 2.66669 5.63179 2.66669 5.99998C2.66669 6.36817 2.96516 6.66665 3.33335 6.66665Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7.99998 10.6666C8.36817 10.6666 8.66665 10.3682 8.66665 9.99998C8.66665 9.63179 8.36817 9.33331 7.99998 9.33331C7.63179 9.33331 7.33331 9.63179 7.33331 9.99998C7.33331 10.3682 7.63179 10.6666 7.99998 10.6666Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12.6667 10.6666C13.0349 10.6666 13.3333 10.3682 13.3333 9.99998C13.3333 9.63179 13.0349 9.33331 12.6667 9.33331C12.2985 9.33331 12 9.63179 12 9.99998C12 10.3682 12.2985 10.6666 12.6667 10.6666Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.33335 10.6666C3.70154 10.6666 4.00002 10.3682 4.00002 9.99998C4.00002 9.63179 3.70154 9.33331 3.33335 9.33331C2.96516 9.33331 2.66669 9.63179 2.66669 9.99998C2.66669 10.3682 2.96516 10.6666 3.33335 10.6666Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default DragIcon;\n","import React, { SVGAttributes } from \"react\";\n\nconst CloseIcon: React.FC<SVGAttributes<SVGSVGElement>> = (props) => {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M10.5 3.5L3.5 10.5\"\n stroke=\"#71717B\"\n strokeWidth={1.16667}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.5 3.5L10.5 10.5\"\n stroke=\"#71717B\"\n strokeWidth={1.16667}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default CloseIcon;\n","import React from \"react\";\nimport { DragHandle } from \"./DragHandle\";\nimport DevtoolsIcon from \"../icons/DevtoolsIcon\";\nimport DragIcon from \"../icons/DragIcon\";\nimport CloseIcon from \"../icons/CloseIcon\";\n\nconst DockHeader: React.FC<{\n setOpen: (open: boolean) => void;\n handleDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n handleDragEnd: () => void;\n}> = ({ setOpen, handleDragStart, handleDragEnd }) => {\n return (\n <DragHandle onDragStart={handleDragStart} onDragEnd={handleDragEnd}>\n <div\n style={{\n height: 40,\n width: \"100%\",\n padding: \"9.5px 12px\",\n boxSizing: \"border-box\",\n borderBottom: \"1px solid rgba(39, 39, 42, 0.5)\",\n display: \"flex\",\n flexDirection: \"row\",\n backgroundColor: \"rgba(24, 24, 27, 0.5)\",\n }}\n >\n <div\n style={{\n width: 20,\n height: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginRight: 8,\n backgroundColor: \"#27272A\",\n borderRadius: 4,\n }}\n >\n <DevtoolsIcon fill=\"#9F9FA9\" stroke=\"#9F9FA9\" height={12} width={12} />\n </div>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: \"#E4E4E7\",\n }}\n >\n React Inspector\n </span>\n\n <div\n style={{\n marginLeft: \"auto\",\n display: \"flex\",\n flexDirection: \"row\",\n gap: 16,\n alignItems: \"center\",\n }}\n >\n <DragIcon />\n <div\n data-no-drag\n style={{\n cursor: \"pointer\",\n width: 20,\n height: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n }}\n >\n <CloseIcon />\n </div>\n </div>\n </div>\n </DragHandle>\n );\n};\n\nexport default DockHeader;\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_react","import_jsx_runtime","e","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","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","#style-inject:#style-inject","../src/index.css","../src/provider.tsx","../src/store.ts","../src/hooks.ts","../src/StateInspectorUI.tsx","../src/ui/constants.ts","../src/ui/utils.ts","../src/ui/icons/DevtoolsIcon.tsx","../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/styles.ts","../src/ui/components/SearchInput.tsx","../src/ui/components/ComponentList.tsx","../src/ui/components/StatePanelHeader.tsx","../src/ui/components/JsonEditor.tsx","../src/ui/components/StateEditor.tsx","../src/ui/components/StateCard.tsx","../src/ui/components/StateEditorPanel.tsx","../src/ui/icons/DragIcon.tsx","../src/ui/icons/CloseIcon.tsx","../src/ui/components/DockHeader.tsx"],"sourcesContent":["import \"./index.css\";\n\nexport * from \"./provider\";\nexport * from \"./store\";\nexport * from \"./hooks\";\nexport * from \"./StateInspectorUI\";\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"@import \\\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\\\";\\n[data-rsi-root],\\n[data-rsi-root] *,\\n[data-rsi-root] *::before,\\n[data-rsi-root] *::after {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n border: 0;\\n font-family:\\n \\\"Inter\\\",\\n -apple-system,\\n BlinkMacSystemFont,\\n \\\"Segoe UI\\\",\\n Roboto,\\n Oxygen,\\n Ubuntu,\\n Cantarell,\\n \\\"Helvetica Neue\\\",\\n sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n font-style: normal;\\n font-variant: normal;\\n line-height: 1.5;\\n letter-spacing: normal;\\n text-align: left;\\n text-decoration: none;\\n text-indent: 0;\\n text-shadow: none;\\n text-transform: none;\\n word-spacing: normal;\\n white-space: normal;\\n background: transparent;\\n color: inherit;\\n outline: none;\\n vertical-align: baseline;\\n visibility: visible;\\n opacity: 1;\\n transform: none;\\n transform-origin: 50% 50% 0;\\n animation: none;\\n transition: none;\\n list-style: none;\\n border-collapse: collapse;\\n border-spacing: 0;\\n float: none;\\n clear: none;\\n cursor: auto;\\n}\\n[data-rsi-root] {\\n all: initial;\\n font-family:\\n \\\"Inter\\\",\\n -apple-system,\\n BlinkMacSystemFont,\\n \\\"Segoe UI\\\",\\n Roboto,\\n Oxygen,\\n Ubuntu,\\n Cantarell,\\n \\\"Helvetica Neue\\\",\\n sans-serif;\\n font-size: 14px;\\n line-height: 1.5;\\n color: #fff;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n text-rendering: optimizeLegibility;\\n}\\n[data-rsi-floating-button] {\\n all: initial;\\n font-family:\\n \\\"Inter\\\",\\n -apple-system,\\n BlinkMacSystemFont,\\n \\\"Segoe UI\\\",\\n Roboto,\\n Oxygen,\\n Ubuntu,\\n Cantarell,\\n \\\"Helvetica Neue\\\",\\n sans-serif;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n[data-rsi-root] button {\\n font-family: inherit;\\n font-size: inherit;\\n line-height: inherit;\\n cursor: pointer;\\n background: transparent;\\n border: none;\\n padding: 0;\\n margin: 0;\\n border-radius: 8px;\\n}\\n[data-rsi-root] input,\\n[data-rsi-root] textarea {\\n font-family: inherit;\\n font-size: inherit;\\n line-height: inherit;\\n background: transparent;\\n border: none;\\n outline: none;\\n padding: 0;\\n margin: 0;\\n resize: none;\\n}\\n[data-rsi-root] input::placeholder,\\n[data-rsi-root] textarea::placeholder {\\n color: inherit;\\n opacity: 0.5;\\n}\\n[data-rsi-root] a {\\n color: inherit;\\n text-decoration: none;\\n}\\n[data-rsi-root] img,\\n[data-rsi-root] svg {\\n display: block;\\n max-width: 100%;\\n}\\n[data-rsi-root] h1,\\n[data-rsi-root] h2,\\n[data-rsi-root] h3,\\n[data-rsi-root] h4,\\n[data-rsi-root] h5,\\n[data-rsi-root] h6 {\\n font-size: inherit;\\n font-weight: inherit;\\n}\\n[data-rsi-root] ::-webkit-scrollbar {\\n width: 6px;\\n height: 6px;\\n}\\n[data-rsi-root] ::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n[data-rsi-root] ::-webkit-scrollbar-thumb {\\n background: rgba(255, 255, 255, 0.2);\\n border-radius: 3px;\\n}\\n[data-rsi-root] ::-webkit-scrollbar-thumb:hover {\\n background: rgba(255, 255, 255, 0.3);\\n}\\n[data-rsi-root] ::selection {\\n background: rgba(99, 102, 241, 0.4);\\n color: #fff;\\n}\\n[data-rsi-root] :focus-visible {\\n outline: 2px solid rgba(99, 102, 241, 0.6);\\n outline-offset: 2px;\\n}\\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 <InspectorContext.Provider value={store}>{children}</InspectorContext.Provider>;\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: (componentId: ComponentId, entry: InspectableStateEntry) => 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 { LS_LAYOUT, LS_KEY, LS_SIZE, LS_LEFT_W, isMac } 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\";\nimport DockHeader from \"./ui/components/DockHeader\";\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 {\n localStorage.setItem(LS_LAYOUT, layout);\n } catch (e) {\n console.error(e);\n }\n }, [layout]);\n\n // Persist position to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(LS_KEY, JSON.stringify(pos));\n } catch (e) {\n console.error(e);\n }\n }, [pos]);\n\n // Persist sidebar width to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(LS_LEFT_W, String(leftWidth));\n } catch (e) {\n console.error(e);\n }\n }, [leftWidth]);\n\n // Persist size to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(LS_SIZE, JSON.stringify(size));\n } 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, tick]);\n\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 =\n (startSize: PanelSize, startPos: PanelPosition) =>\n (\n delta: { dx: number; dy: number },\n direction:\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\",\n ) => {\n const isLeft = direction === \"left\" || direction.endsWith(\"left\");\n const isTop = direction === \"top\" || direction.startsWith(\"top\");\n const isHorizontal = direction !== \"top\" && direction !== \"bottom\";\n const isVertical = direction !== \"left\" && direction !== \"right\";\n\n const currentWidth = startSize.width ?? 720;\n const currentHeight = startSize.height ?? 420;\n\n // Calculate new dimensions\n let newWidth = currentWidth;\n let newHeight = currentHeight;\n\n if (isHorizontal) {\n if (isLeft) {\n newWidth = Math.min(window.innerWidth - 16, Math.max(480, currentWidth - delta.dx));\n } else {\n newWidth = Math.min(window.innerWidth - 16, Math.max(480, currentWidth + delta.dx));\n }\n }\n\n if (isVertical) {\n if (isTop) {\n newHeight = Math.min(window.innerHeight - 120, Math.max(280, currentHeight - delta.dy));\n } else {\n newHeight = Math.min(window.innerHeight - 120, Math.max(280, currentHeight + delta.dy));\n }\n }\n\n setSize({ width: newWidth, height: newHeight });\n\n // Update position for left/top edges\n const newPos: PanelPosition = { ...startPos };\n\n if (isLeft && startPos.left !== undefined) {\n const widthDelta = newWidth - currentWidth;\n newPos.left = Math.max(8, startPos.left - widthDelta);\n } else if (isLeft && startPos.right !== undefined) {\n // If positioned from right, adjust right position\n const widthDelta = newWidth - currentWidth;\n newPos.right = Math.max(8, startPos.right - widthDelta);\n }\n\n if (isTop && startPos.top !== undefined) {\n const heightDelta = newHeight - currentHeight;\n newPos.top = Math.max(8, startPos.top - heightDelta);\n } else if (isTop && startPos.bottom !== undefined) {\n // If positioned from bottom, adjust bottom position\n const heightDelta = newHeight - currentHeight;\n newPos.bottom = Math.max(8, startPos.bottom - heightDelta);\n }\n\n setPos(newPos);\n };\n\n if (!store.enabled) return null;\n\n return createPortal(\n <>\n <FloatingButton onClick={() => setOpen((o) => !o)} isActive={open} />\n <DockPreviewOverlay preview={preview} />\n\n {open && (\n <div\n data-rsi-root\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 overflow: \"hidden\",\n transition: isTransitioning ? \"all 0.3s ease\" : \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <DockHeader\n setOpen={setOpen}\n handleDragStart={handleDragStart}\n handleDragEnd={handleDragEnd}\n />\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: leftCollapsed ? \"auto\" : `${leftWidth}px 14px auto`,\n height: \"100%\",\n }}\n >\n <ResizeHandle onResize={handlePanelResize(size, pos)} />\n\n <ComponentList\n query={query}\n onQueryChange={setQuery}\n searchRef={searchRef}\n components={filtered}\n selectedId={selectedId}\n onSelect={setSelectedId}\n hidden={leftCollapsed}\n />\n\n <SidebarResizer\n leftWidth={leftWidth}\n onWidthChange={setLeftWidth}\n hidden={leftCollapsed}\n />\n\n <StateEditorPanel\n selected={selected}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={() => setLeftCollapsed((v) => !v)}\n />\n </div>\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 =\n typeof navigator !== \"undefined\" ? navigator.platform.toUpperCase().includes(\"MAC\") : 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","import React, { SVGAttributes } from \"react\";\n\nconst DevtoolsIcon: React.FC<SVGAttributes<SVGSVGElement>> = (props) => {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g clipPath=\"url(#clip0_1_13)\">\n <path\n d=\"M2 7.00002C1.90538 7.00034 1.81262 6.97381 1.73248 6.92351C1.65234 6.87321 1.58812 6.8012 1.54727 6.71585C1.50643 6.6305 1.49065 6.53531 1.50175 6.44135C1.51285 6.34739 1.55039 6.2585 1.61 6.18502L6.56 1.08502C6.59713 1.04216 6.64773 1.0132 6.70349 1.00289C6.75925 0.992575 6.81686 1.00153 6.86687 1.02827C6.91687 1.05502 6.95629 1.09797 6.97867 1.15007C7.00104 1.20218 7.00504 1.26034 6.99 1.31502L6.03 4.32502C6.00169 4.40078 5.99219 4.48228 6.0023 4.56252C6.01241 4.64277 6.04183 4.71936 6.08805 4.78573C6.13426 4.85211 6.19589 4.90628 6.26764 4.9436C6.33939 4.98092 6.41912 5.00028 6.5 5.00002H10C10.0946 4.9997 10.1874 5.02623 10.2675 5.07653C10.3477 5.12683 10.4119 5.19884 10.4527 5.28419C10.4936 5.36954 10.5094 5.46473 10.4983 5.55869C10.4871 5.65266 10.4496 5.74154 10.39 5.81502L5.44 10.915C5.40287 10.9579 5.35227 10.9868 5.29651 10.9972C5.24075 11.0075 5.18314 10.9985 5.13313 10.9718C5.08313 10.945 5.04371 10.9021 5.02133 10.85C4.99896 10.7979 4.99496 10.7397 5.01 10.685L5.97 7.67502C5.99831 7.59926 6.00781 7.51776 5.9977 7.43752C5.98759 7.35727 5.95817 7.28068 5.91195 7.21431C5.86574 7.14793 5.80411 7.09376 5.73236 7.05644C5.66061 7.01912 5.58088 6.99976 5.5 7.00002H2Z\"\n fill=\"inherit\"\n stroke=\"inherit\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1_13\">\n <rect width=\"12\" height=\"12\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n};\n\nexport default DevtoolsIcon;\n","import DevtoolsIcon from \"../icons/DevtoolsIcon\";\n\ninterface FloatingButtonProps {\n onClick: () => void;\n isActive: boolean;\n}\n\nexport function FloatingButton({ onClick, isActive }: FloatingButtonProps) {\n return (\n <button\n data-rsi-floating-button\n title=\"State Inspector (⌘⇧I / Ctrl⇧I)\"\n onClick={onClick}\n style={{\n position: \"fixed\",\n right: 16,\n bottom: 16,\n width: 48,\n height: 48,\n borderRadius: 24,\n border: \"none\",\n background: isActive ? \"#155DFC\" : \"#111\",\n color: \"#fff\",\n cursor: \"pointer\",\n zIndex: 999999,\n padding: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n aria-label=\"Toggle State Inspector\"\n >\n <DevtoolsIcon fill={isActive ? \"#FFF\" : undefined} stroke=\"#FFF\" height={20} width={20} />\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","export type ResizeDirection =\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\ninterface ResizeHandleProps {\n onResize: (delta: { dx: number; dy: number }, direction: ResizeDirection) => void;\n}\n\nconst EDGE_SIZE = 6;\nconst CORNER_SIZE = 12;\n\ntype HandleConfig = {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n width?: number | string;\n height?: number | string;\n cursor: string;\n};\n\nconst handleConfigs: Record<ResizeDirection, HandleConfig> = {\n // Edges\n top: { top: 0, left: CORNER_SIZE, right: CORNER_SIZE, height: EDGE_SIZE, cursor: \"ns-resize\" },\n bottom: {\n bottom: 0,\n left: CORNER_SIZE,\n right: CORNER_SIZE,\n height: EDGE_SIZE,\n cursor: \"ns-resize\",\n },\n left: { left: 0, top: CORNER_SIZE, bottom: CORNER_SIZE, width: EDGE_SIZE, cursor: \"ew-resize\" },\n right: { right: 0, top: CORNER_SIZE, bottom: CORNER_SIZE, width: EDGE_SIZE, cursor: \"ew-resize\" },\n // Corners\n \"top-left\": { top: 0, left: 0, width: CORNER_SIZE, height: CORNER_SIZE, cursor: \"nwse-resize\" },\n \"top-right\": { top: 0, right: 0, width: CORNER_SIZE, height: CORNER_SIZE, cursor: \"nesw-resize\" },\n \"bottom-left\": {\n bottom: 0,\n left: 0,\n width: CORNER_SIZE,\n height: CORNER_SIZE,\n cursor: \"nesw-resize\",\n },\n \"bottom-right\": {\n bottom: 0,\n right: 0,\n width: CORNER_SIZE,\n height: CORNER_SIZE,\n cursor: \"nwse-resize\",\n },\n};\n\nfunction Handle({\n direction,\n onResize,\n}: {\n direction: ResizeDirection;\n onResize: (delta: { dx: number; dy: number }, direction: ResizeDirection) => void;\n}) {\n const config = handleConfigs[direction];\n\n return (\n <div\n onPointerDown={(e) => {\n e.stopPropagation();\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 {\n dx: ev.clientX - startX,\n dy: ev.clientY - startY,\n },\n direction,\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 top: config.top,\n right: config.right,\n bottom: config.bottom,\n left: config.left,\n width: config.width,\n height: config.height,\n cursor: config.cursor,\n background: \"transparent\",\n zIndex: 10,\n }}\n />\n );\n}\n\nconst directions: ResizeDirection[] = [\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n];\n\nexport function ResizeHandle({ onResize }: ResizeHandleProps) {\n return (\n <>\n {directions.map((dir) => (\n <Handle key={dir} direction={dir} onResize={onResize} />\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\";\nimport { useState } 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 const [isDragging, setIsDragging] = useState(false);\n\n return (\n <div\n style={{ cursor: isDragging ? \"grabbing\" : \"grab\", userSelect: \"none\", ...style }}\n onPointerDown={(e) => {\n const target = e.target as HTMLElement | null;\n try {\n if (\n target &&\n typeof target.closest === \"function\" &&\n target.closest('button, input, textarea, a, [role=\"button\"], [data-no-drag]')\n ) {\n return;\n }\n } catch (e) {\n console.error(e);\n }\n\n setIsDragging(true);\n onDragStart(e);\n }}\n onPointerUp={() => {\n if (isDragging) {\n setIsDragging(false);\n onDragEnd();\n }\n }}\n >\n {children}\n </div>\n );\n}\n","import type React from \"react\";\n\nexport const inputStyle: React.CSSProperties = {\n padding: \"8px 10px\",\n borderRadius: 4,\n border: \"none\",\n background: \"#18181B\",\n color: \"#fff\",\n minWidth: 120,\n};\n\nexport const cardStyle: React.CSSProperties = {\n border: \"1px solid rgba(39, 39, 42, 0.30)\",\n borderRadius: 12,\n padding: 10,\n};\n\nexport const buttonStyle: React.CSSProperties = {\n background: \"transparent\",\n color: \"#fff\",\n border: \"1px solid rgba(39, 39, 42, 0.30)\",\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=\"Filter…\"\n ref={inputRef}\n style={{\n ...inputStyle,\n outline: \"none\",\n }}\n />\n );\n}\n","import type React from \"react\";\nimport type { ComponentSummary } from \"../types\";\nimport { SearchInput } from \"./SearchInput\";\ninterface ComponentListProps {\n components: ComponentSummary[];\n selectedId: string | null;\n onSelect: (id: string) => void;\n hidden: boolean;\n query: string;\n onQueryChange: (value: string) => void;\n searchRef: React.RefObject<HTMLInputElement | null>;\n}\n\nexport function ComponentList({\n components,\n selectedId,\n onSelect,\n hidden,\n query,\n onQueryChange,\n searchRef,\n}: ComponentListProps) {\n if (hidden) return null;\n\n return (\n <div style={{ padding: 4, boxSizing: \"border-box\", backgroundColor: \"#09090B\" }}>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n paddingTop: 4,\n paddingBottom: 8,\n paddingLeft: 4,\n paddingRight: 4,\n }}\n >\n <SearchInput value={query} onChange={onQueryChange} inputRef={searchRef} />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2, 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 display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: 8,\n backgroundColor: active ? \"#27272A\" : \"transparent\",\n border: \"none\",\n }}\n >\n <div style={{ fontWeight: 500, fontSize: 12, color: active ? \"#fff\" : \"#9F9FA9\" }}>\n {c.label}\n </div>\n <div\n style={{\n fontSize: 9,\n height: 16,\n width: 16,\n color: \"#D4D4D8\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 8,\n backgroundColor: \"#3F3F47\",\n }}\n >\n {c.stateKeys.length}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import type React from \"react\";\n\ninterface StatePanelHeaderProps {\n selectedLabel: string | null;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n}\n\nexport function StatePanelHeader({\n selectedLabel,\n leftCollapsed,\n onToggleCollapse,\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 <h4 style={{ margin: 0 }}>{selectedLabel ?? \"No selection\"}</h4>\n </div>\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={{\n ...inputStyle,\n minWidth: 120,\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={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: \"row\",\n justifyContent: \"space-between\",\n gap: 8,\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n gap: 1,\n }}\n >\n <div style={{ fontSize: 14 }}>{state.key}</div>\n <div style={{ fontSize: 12, color: \"#52525C\", textTransform: \"uppercase\" }}>\n {state.meta?.type ?? \"auto\"}\n </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 { StateCard } from \"./StateCard\";\n\ninterface StateEditorPanelProps {\n selected: ComponentEntry | null;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n}\n\nexport function StateEditorPanel({\n selected,\n leftCollapsed,\n onToggleCollapse,\n}: StateEditorPanelProps) {\n return (\n <div\n style={{\n padding: 12,\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n backgroundColor: \"#0C0C0E\",\n }}\n >\n <StatePanelHeader\n selectedLabel={selected?.label ?? null}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={onToggleCollapse}\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 }}>This component has no inspectable state.</div>\n )}\n\n {!selected && <div style={{ opacity: 0.7, fontSize: 13 }}>No component selected.</div>}\n\n {selected &&\n Array.from(selected.states.values()).map((s) => <StateCard key={s.key} state={s} />)}\n </div>\n </div>\n );\n}\n","import React, { SVGAttributes } from \"react\";\n\nconst DragIcon: React.FC<SVGAttributes<SVGSVGElement>> = (props) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M7.99998 6.66665C8.36817 6.66665 8.66665 6.36817 8.66665 5.99998C8.66665 5.63179 8.36817 5.33331 7.99998 5.33331C7.63179 5.33331 7.33331 5.63179 7.33331 5.99998C7.33331 6.36817 7.63179 6.66665 7.99998 6.66665Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12.6667 6.66665C13.0349 6.66665 13.3333 6.36817 13.3333 5.99998C13.3333 5.63179 13.0349 5.33331 12.6667 5.33331C12.2985 5.33331 12 5.63179 12 5.99998C12 6.36817 12.2985 6.66665 12.6667 6.66665Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.33335 6.66665C3.70154 6.66665 4.00002 6.36817 4.00002 5.99998C4.00002 5.63179 3.70154 5.33331 3.33335 5.33331C2.96516 5.33331 2.66669 5.63179 2.66669 5.99998C2.66669 6.36817 2.96516 6.66665 3.33335 6.66665Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7.99998 10.6666C8.36817 10.6666 8.66665 10.3682 8.66665 9.99998C8.66665 9.63179 8.36817 9.33331 7.99998 9.33331C7.63179 9.33331 7.33331 9.63179 7.33331 9.99998C7.33331 10.3682 7.63179 10.6666 7.99998 10.6666Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12.6667 10.6666C13.0349 10.6666 13.3333 10.3682 13.3333 9.99998C13.3333 9.63179 13.0349 9.33331 12.6667 9.33331C12.2985 9.33331 12 9.63179 12 9.99998C12 10.3682 12.2985 10.6666 12.6667 10.6666Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.33335 10.6666C3.70154 10.6666 4.00002 10.3682 4.00002 9.99998C4.00002 9.63179 3.70154 9.33331 3.33335 9.33331C2.96516 9.33331 2.66669 9.63179 2.66669 9.99998C2.66669 10.3682 2.96516 10.6666 3.33335 10.6666Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default DragIcon;\n","import React, { SVGAttributes } from \"react\";\n\nconst CloseIcon: React.FC<SVGAttributes<SVGSVGElement>> = (props) => {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M10.5 3.5L3.5 10.5\"\n stroke=\"#71717B\"\n strokeWidth={1.16667}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.5 3.5L10.5 10.5\"\n stroke=\"#71717B\"\n strokeWidth={1.16667}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default CloseIcon;\n","import React from \"react\";\nimport { DragHandle } from \"./DragHandle\";\nimport DevtoolsIcon from \"../icons/DevtoolsIcon\";\nimport DragIcon from \"../icons/DragIcon\";\nimport CloseIcon from \"../icons/CloseIcon\";\n\nconst DockHeader: React.FC<{\n setOpen: (open: boolean) => void;\n handleDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n handleDragEnd: () => void;\n}> = ({ setOpen, handleDragStart, handleDragEnd }) => {\n return (\n <DragHandle onDragStart={handleDragStart} onDragEnd={handleDragEnd}>\n <div\n style={{\n height: 40,\n width: \"100%\",\n padding: \"9.5px 12px\",\n boxSizing: \"border-box\",\n borderBottom: \"1px solid rgba(39, 39, 42, 0.5)\",\n display: \"flex\",\n flexDirection: \"row\",\n backgroundColor: \"rgba(24, 24, 27, 0.5)\",\n }}\n >\n <div\n style={{\n width: 20,\n height: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginRight: 8,\n backgroundColor: \"#27272A\",\n borderRadius: 4,\n }}\n >\n <DevtoolsIcon fill=\"#9F9FA9\" stroke=\"#9F9FA9\" height={12} width={12} />\n </div>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: \"#E4E4E7\",\n }}\n >\n React Inspector\n </span>\n\n <div\n style={{\n marginLeft: \"auto\",\n display: \"flex\",\n flexDirection: \"row\",\n gap: 16,\n alignItems: \"center\",\n }}\n >\n <DragIcon />\n <div\n data-no-drag\n style={{\n cursor: \"pointer\",\n width: 20,\n height: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n }}\n >\n <CloseIcon />\n </div>\n </div>\n </div>\n </DragHandle>\n );\n};\n\nexport default DockHeader;\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_react","import_jsx_runtime","e","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","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,28 @@
|
|
|
1
|
+
// #style-inject:#style-inject
|
|
2
|
+
function styleInject(css, { insertAt } = {}) {
|
|
3
|
+
if (!css || typeof document === "undefined") return;
|
|
4
|
+
const head = document.head || document.getElementsByTagName("head")[0];
|
|
5
|
+
const style = document.createElement("style");
|
|
6
|
+
style.type = "text/css";
|
|
7
|
+
if (insertAt === "top") {
|
|
8
|
+
if (head.firstChild) {
|
|
9
|
+
head.insertBefore(style, head.firstChild);
|
|
10
|
+
} else {
|
|
11
|
+
head.appendChild(style);
|
|
12
|
+
}
|
|
13
|
+
} else {
|
|
14
|
+
head.appendChild(style);
|
|
15
|
+
}
|
|
16
|
+
if (style.styleSheet) {
|
|
17
|
+
style.styleSheet.cssText = css;
|
|
18
|
+
} else {
|
|
19
|
+
style.appendChild(document.createTextNode(css));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// src/index.css
|
|
24
|
+
styleInject('@import "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";\n[data-rsi-root],\n[data-rsi-root] *,\n[data-rsi-root] *::before,\n[data-rsi-root] *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0;\n font-family:\n "Inter",\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n "Helvetica Neue",\n sans-serif;\n font-size: 14px;\n font-weight: 400;\n font-style: normal;\n font-variant: normal;\n line-height: 1.5;\n letter-spacing: normal;\n text-align: left;\n text-decoration: none;\n text-indent: 0;\n text-shadow: none;\n text-transform: none;\n word-spacing: normal;\n white-space: normal;\n background: transparent;\n color: inherit;\n outline: none;\n vertical-align: baseline;\n visibility: visible;\n opacity: 1;\n transform: none;\n transform-origin: 50% 50% 0;\n animation: none;\n transition: none;\n list-style: none;\n border-collapse: collapse;\n border-spacing: 0;\n float: none;\n clear: none;\n cursor: auto;\n}\n[data-rsi-root] {\n all: initial;\n font-family:\n "Inter",\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n "Helvetica Neue",\n sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #fff;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n text-rendering: optimizeLegibility;\n}\n[data-rsi-floating-button] {\n all: initial;\n font-family:\n "Inter",\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n "Helvetica Neue",\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n[data-rsi-root] button {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n background: transparent;\n border: none;\n padding: 0;\n margin: 0;\n border-radius: 8px;\n}\n[data-rsi-root] input,\n[data-rsi-root] textarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n background: transparent;\n border: none;\n outline: none;\n padding: 0;\n margin: 0;\n resize: none;\n}\n[data-rsi-root] input::placeholder,\n[data-rsi-root] textarea::placeholder {\n color: inherit;\n opacity: 0.5;\n}\n[data-rsi-root] a {\n color: inherit;\n text-decoration: none;\n}\n[data-rsi-root] img,\n[data-rsi-root] svg {\n display: block;\n max-width: 100%;\n}\n[data-rsi-root] h1,\n[data-rsi-root] h2,\n[data-rsi-root] h3,\n[data-rsi-root] h4,\n[data-rsi-root] h5,\n[data-rsi-root] h6 {\n font-size: inherit;\n font-weight: inherit;\n}\n[data-rsi-root] ::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n}\n[data-rsi-root] ::-webkit-scrollbar-track {\n background: transparent;\n}\n[data-rsi-root] ::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.2);\n border-radius: 3px;\n}\n[data-rsi-root] ::-webkit-scrollbar-thumb:hover {\n background: rgba(255, 255, 255, 0.3);\n}\n[data-rsi-root] ::selection {\n background: rgba(99, 102, 241, 0.4);\n color: #fff;\n}\n[data-rsi-root] :focus-visible {\n outline: 2px solid rgba(99, 102, 241, 0.6);\n outline-offset: 2px;\n}\n');
|
|
25
|
+
|
|
1
26
|
// src/provider.tsx
|
|
2
27
|
import { createContext, useContext, useEffect, useId, useMemo } from "react";
|
|
3
28
|
|
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/icons/DevtoolsIcon.tsx","../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/styles.ts","../src/ui/components/SearchInput.tsx","../src/ui/components/ComponentList.tsx","../src/ui/components/StatePanelHeader.tsx","../src/ui/components/JsonEditor.tsx","../src/ui/components/StateEditor.tsx","../src/ui/components/StateCard.tsx","../src/ui/components/StateEditorPanel.tsx","../src/ui/icons/DragIcon.tsx","../src/ui/icons/CloseIcon.tsx","../src/ui/components/DockHeader.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 <InspectorContext.Provider value={store}>{children}</InspectorContext.Provider>;\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: (componentId: ComponentId, entry: InspectableStateEntry) => 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 { LS_LAYOUT, LS_KEY, LS_SIZE, LS_LEFT_W, isMac } 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\";\nimport DockHeader from \"./ui/components/DockHeader\";\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 {\n localStorage.setItem(LS_LAYOUT, layout);\n } catch (e) {\n console.error(e);\n }\n }, [layout]);\n\n // Persist position to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(LS_KEY, JSON.stringify(pos));\n } catch (e) {\n console.error(e);\n }\n }, [pos]);\n\n // Persist sidebar width to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(LS_LEFT_W, String(leftWidth));\n } catch (e) {\n console.error(e);\n }\n }, [leftWidth]);\n\n // Persist size to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(LS_SIZE, JSON.stringify(size));\n } 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, tick]);\n\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 =\n (startSize: PanelSize, startPos: PanelPosition) =>\n (\n delta: { dx: number; dy: number },\n direction:\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\",\n ) => {\n const isLeft = direction === \"left\" || direction.endsWith(\"left\");\n const isTop = direction === \"top\" || direction.startsWith(\"top\");\n const isHorizontal = direction !== \"top\" && direction !== \"bottom\";\n const isVertical = direction !== \"left\" && direction !== \"right\";\n\n const currentWidth = startSize.width ?? 720;\n const currentHeight = startSize.height ?? 420;\n\n // Calculate new dimensions\n let newWidth = currentWidth;\n let newHeight = currentHeight;\n\n if (isHorizontal) {\n if (isLeft) {\n newWidth = Math.min(window.innerWidth - 16, Math.max(480, currentWidth - delta.dx));\n } else {\n newWidth = Math.min(window.innerWidth - 16, Math.max(480, currentWidth + delta.dx));\n }\n }\n\n if (isVertical) {\n if (isTop) {\n newHeight = Math.min(window.innerHeight - 120, Math.max(280, currentHeight - delta.dy));\n } else {\n newHeight = Math.min(window.innerHeight - 120, Math.max(280, currentHeight + delta.dy));\n }\n }\n\n setSize({ width: newWidth, height: newHeight });\n\n // Update position for left/top edges\n const newPos: PanelPosition = { ...startPos };\n\n if (isLeft && startPos.left !== undefined) {\n const widthDelta = newWidth - currentWidth;\n newPos.left = Math.max(8, startPos.left - widthDelta);\n } else if (isLeft && startPos.right !== undefined) {\n // If positioned from right, adjust right position\n const widthDelta = newWidth - currentWidth;\n newPos.right = Math.max(8, startPos.right - widthDelta);\n }\n\n if (isTop && startPos.top !== undefined) {\n const heightDelta = newHeight - currentHeight;\n newPos.top = Math.max(8, startPos.top - heightDelta);\n } else if (isTop && startPos.bottom !== undefined) {\n // If positioned from bottom, adjust bottom position\n const heightDelta = newHeight - currentHeight;\n newPos.bottom = Math.max(8, startPos.bottom - heightDelta);\n }\n\n setPos(newPos);\n };\n\n if (!store.enabled) return null;\n\n return createPortal(\n <>\n <FloatingButton onClick={() => setOpen((o) => !o)} isActive={open} />\n <DockPreviewOverlay preview={preview} />\n\n {open && (\n <div\n data-rsi-root\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 overflow: \"hidden\",\n transition: isTransitioning ? \"all 0.3s ease\" : \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <DockHeader\n setOpen={setOpen}\n handleDragStart={handleDragStart}\n handleDragEnd={handleDragEnd}\n />\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: leftCollapsed ? \"auto\" : `${leftWidth}px 14px auto`,\n height: \"100%\",\n }}\n >\n <ResizeHandle onResize={handlePanelResize(size, pos)} />\n\n <ComponentList\n query={query}\n onQueryChange={setQuery}\n searchRef={searchRef}\n components={filtered}\n selectedId={selectedId}\n onSelect={setSelectedId}\n hidden={leftCollapsed}\n />\n\n <SidebarResizer\n leftWidth={leftWidth}\n onWidthChange={setLeftWidth}\n hidden={leftCollapsed}\n />\n\n <StateEditorPanel\n selected={selected}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={() => setLeftCollapsed((v) => !v)}\n />\n </div>\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 =\n typeof navigator !== \"undefined\" ? navigator.platform.toUpperCase().includes(\"MAC\") : 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","import React, { SVGAttributes } from \"react\";\n\nconst DevtoolsIcon: React.FC<SVGAttributes<SVGSVGElement>> = (props) => {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g clipPath=\"url(#clip0_1_13)\">\n <path\n d=\"M2 7.00002C1.90538 7.00034 1.81262 6.97381 1.73248 6.92351C1.65234 6.87321 1.58812 6.8012 1.54727 6.71585C1.50643 6.6305 1.49065 6.53531 1.50175 6.44135C1.51285 6.34739 1.55039 6.2585 1.61 6.18502L6.56 1.08502C6.59713 1.04216 6.64773 1.0132 6.70349 1.00289C6.75925 0.992575 6.81686 1.00153 6.86687 1.02827C6.91687 1.05502 6.95629 1.09797 6.97867 1.15007C7.00104 1.20218 7.00504 1.26034 6.99 1.31502L6.03 4.32502C6.00169 4.40078 5.99219 4.48228 6.0023 4.56252C6.01241 4.64277 6.04183 4.71936 6.08805 4.78573C6.13426 4.85211 6.19589 4.90628 6.26764 4.9436C6.33939 4.98092 6.41912 5.00028 6.5 5.00002H10C10.0946 4.9997 10.1874 5.02623 10.2675 5.07653C10.3477 5.12683 10.4119 5.19884 10.4527 5.28419C10.4936 5.36954 10.5094 5.46473 10.4983 5.55869C10.4871 5.65266 10.4496 5.74154 10.39 5.81502L5.44 10.915C5.40287 10.9579 5.35227 10.9868 5.29651 10.9972C5.24075 11.0075 5.18314 10.9985 5.13313 10.9718C5.08313 10.945 5.04371 10.9021 5.02133 10.85C4.99896 10.7979 4.99496 10.7397 5.01 10.685L5.97 7.67502C5.99831 7.59926 6.00781 7.51776 5.9977 7.43752C5.98759 7.35727 5.95817 7.28068 5.91195 7.21431C5.86574 7.14793 5.80411 7.09376 5.73236 7.05644C5.66061 7.01912 5.58088 6.99976 5.5 7.00002H2Z\"\n fill=\"inherit\"\n stroke=\"inherit\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1_13\">\n <rect width=\"12\" height=\"12\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n};\n\nexport default DevtoolsIcon;\n","import DevtoolsIcon from \"../icons/DevtoolsIcon\";\n\ninterface FloatingButtonProps {\n onClick: () => void;\n isActive: boolean;\n}\n\nexport function FloatingButton({ onClick, isActive }: FloatingButtonProps) {\n return (\n <button\n data-rsi-floating-button\n title=\"State Inspector (⌘⇧I / Ctrl⇧I)\"\n onClick={onClick}\n style={{\n position: \"fixed\",\n right: 16,\n bottom: 16,\n width: 48,\n height: 48,\n borderRadius: 24,\n border: \"none\",\n background: isActive ? \"#155DFC\" : \"#111\",\n color: \"#fff\",\n cursor: \"pointer\",\n zIndex: 999999,\n padding: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n aria-label=\"Toggle State Inspector\"\n >\n <DevtoolsIcon fill={isActive ? \"#FFF\" : undefined} stroke=\"#FFF\" height={20} width={20} />\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","export type ResizeDirection =\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\ninterface ResizeHandleProps {\n onResize: (delta: { dx: number; dy: number }, direction: ResizeDirection) => void;\n}\n\nconst EDGE_SIZE = 6;\nconst CORNER_SIZE = 12;\n\ntype HandleConfig = {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n width?: number | string;\n height?: number | string;\n cursor: string;\n};\n\nconst handleConfigs: Record<ResizeDirection, HandleConfig> = {\n // Edges\n top: { top: 0, left: CORNER_SIZE, right: CORNER_SIZE, height: EDGE_SIZE, cursor: \"ns-resize\" },\n bottom: {\n bottom: 0,\n left: CORNER_SIZE,\n right: CORNER_SIZE,\n height: EDGE_SIZE,\n cursor: \"ns-resize\",\n },\n left: { left: 0, top: CORNER_SIZE, bottom: CORNER_SIZE, width: EDGE_SIZE, cursor: \"ew-resize\" },\n right: { right: 0, top: CORNER_SIZE, bottom: CORNER_SIZE, width: EDGE_SIZE, cursor: \"ew-resize\" },\n // Corners\n \"top-left\": { top: 0, left: 0, width: CORNER_SIZE, height: CORNER_SIZE, cursor: \"nwse-resize\" },\n \"top-right\": { top: 0, right: 0, width: CORNER_SIZE, height: CORNER_SIZE, cursor: \"nesw-resize\" },\n \"bottom-left\": {\n bottom: 0,\n left: 0,\n width: CORNER_SIZE,\n height: CORNER_SIZE,\n cursor: \"nesw-resize\",\n },\n \"bottom-right\": {\n bottom: 0,\n right: 0,\n width: CORNER_SIZE,\n height: CORNER_SIZE,\n cursor: \"nwse-resize\",\n },\n};\n\nfunction Handle({\n direction,\n onResize,\n}: {\n direction: ResizeDirection;\n onResize: (delta: { dx: number; dy: number }, direction: ResizeDirection) => void;\n}) {\n const config = handleConfigs[direction];\n\n return (\n <div\n onPointerDown={(e) => {\n e.stopPropagation();\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 {\n dx: ev.clientX - startX,\n dy: ev.clientY - startY,\n },\n direction,\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 top: config.top,\n right: config.right,\n bottom: config.bottom,\n left: config.left,\n width: config.width,\n height: config.height,\n cursor: config.cursor,\n background: \"transparent\",\n zIndex: 10,\n }}\n />\n );\n}\n\nconst directions: ResizeDirection[] = [\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n];\n\nexport function ResizeHandle({ onResize }: ResizeHandleProps) {\n return (\n <>\n {directions.map((dir) => (\n <Handle key={dir} direction={dir} onResize={onResize} />\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\";\nimport { useState } 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 const [isDragging, setIsDragging] = useState(false);\n\n return (\n <div\n style={{ cursor: isDragging ? \"grabbing\" : \"grab\", userSelect: \"none\", ...style }}\n onPointerDown={(e) => {\n const target = e.target as HTMLElement | null;\n try {\n if (\n target &&\n typeof target.closest === \"function\" &&\n target.closest('button, input, textarea, a, [role=\"button\"], [data-no-drag]')\n ) {\n return;\n }\n } catch (e) {\n console.error(e);\n }\n\n setIsDragging(true);\n onDragStart(e);\n }}\n onPointerUp={() => {\n if (isDragging) {\n setIsDragging(false);\n onDragEnd();\n }\n }}\n >\n {children}\n </div>\n );\n}\n","import type React from \"react\";\n\nexport const inputStyle: React.CSSProperties = {\n padding: \"8px 10px\",\n borderRadius: 4,\n border: \"none\",\n background: \"#18181B\",\n color: \"#fff\",\n minWidth: 120,\n};\n\nexport const cardStyle: React.CSSProperties = {\n border: \"1px solid rgba(39, 39, 42, 0.30)\",\n borderRadius: 12,\n padding: 10,\n};\n\nexport const buttonStyle: React.CSSProperties = {\n background: \"transparent\",\n color: \"#fff\",\n border: \"1px solid rgba(39, 39, 42, 0.30)\",\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=\"Filter…\"\n ref={inputRef}\n style={{\n ...inputStyle,\n outline: \"none\",\n }}\n />\n );\n}\n","import type React from \"react\";\nimport type { ComponentSummary } from \"../types\";\nimport { SearchInput } from \"./SearchInput\";\ninterface ComponentListProps {\n components: ComponentSummary[];\n selectedId: string | null;\n onSelect: (id: string) => void;\n hidden: boolean;\n query: string;\n onQueryChange: (value: string) => void;\n searchRef: React.RefObject<HTMLInputElement | null>;\n}\n\nexport function ComponentList({\n components,\n selectedId,\n onSelect,\n hidden,\n query,\n onQueryChange,\n searchRef,\n}: ComponentListProps) {\n if (hidden) return null;\n\n return (\n <div style={{ padding: 4, boxSizing: \"border-box\", backgroundColor: \"#09090B\" }}>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n paddingTop: 4,\n paddingBottom: 8,\n paddingLeft: 4,\n paddingRight: 4,\n }}\n >\n <SearchInput value={query} onChange={onQueryChange} inputRef={searchRef} />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2, 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 display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: 8,\n backgroundColor: active ? \"#27272A\" : \"transparent\",\n border: \"none\",\n }}\n >\n <div style={{ fontWeight: 500, fontSize: 12, color: active ? \"#fff\" : \"#9F9FA9\" }}>\n {c.label}\n </div>\n <div\n style={{\n fontSize: 9,\n height: 16,\n width: 16,\n color: \"#D4D4D8\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 8,\n backgroundColor: \"#3F3F47\",\n }}\n >\n {c.stateKeys.length}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import type React from \"react\";\n\ninterface StatePanelHeaderProps {\n selectedLabel: string | null;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n}\n\nexport function StatePanelHeader({\n selectedLabel,\n leftCollapsed,\n onToggleCollapse,\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 <h4 style={{ margin: 0 }}>{selectedLabel ?? \"No selection\"}</h4>\n </div>\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={{\n ...inputStyle,\n minWidth: 120,\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={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: \"row\",\n justifyContent: \"space-between\",\n gap: 8,\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n gap: 1,\n }}\n >\n <div style={{ fontSize: 14 }}>{state.key}</div>\n <div style={{ fontSize: 12, color: \"#52525C\", textTransform: \"uppercase\" }}>\n {state.meta?.type ?? \"auto\"}\n </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 { StateCard } from \"./StateCard\";\n\ninterface StateEditorPanelProps {\n selected: ComponentEntry | null;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n}\n\nexport function StateEditorPanel({\n selected,\n leftCollapsed,\n onToggleCollapse,\n}: StateEditorPanelProps) {\n return (\n <div\n style={{\n padding: 12,\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n backgroundColor: \"#0C0C0E\",\n }}\n >\n <StatePanelHeader\n selectedLabel={selected?.label ?? null}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={onToggleCollapse}\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 }}>This component has no inspectable state.</div>\n )}\n\n {!selected && <div style={{ opacity: 0.7, fontSize: 13 }}>No component selected.</div>}\n\n {selected &&\n Array.from(selected.states.values()).map((s) => <StateCard key={s.key} state={s} />)}\n </div>\n </div>\n );\n}\n","import React, { SVGAttributes } from \"react\";\n\nconst DragIcon: React.FC<SVGAttributes<SVGSVGElement>> = (props) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M7.99998 6.66665C8.36817 6.66665 8.66665 6.36817 8.66665 5.99998C8.66665 5.63179 8.36817 5.33331 7.99998 5.33331C7.63179 5.33331 7.33331 5.63179 7.33331 5.99998C7.33331 6.36817 7.63179 6.66665 7.99998 6.66665Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12.6667 6.66665C13.0349 6.66665 13.3333 6.36817 13.3333 5.99998C13.3333 5.63179 13.0349 5.33331 12.6667 5.33331C12.2985 5.33331 12 5.63179 12 5.99998C12 6.36817 12.2985 6.66665 12.6667 6.66665Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.33335 6.66665C3.70154 6.66665 4.00002 6.36817 4.00002 5.99998C4.00002 5.63179 3.70154 5.33331 3.33335 5.33331C2.96516 5.33331 2.66669 5.63179 2.66669 5.99998C2.66669 6.36817 2.96516 6.66665 3.33335 6.66665Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7.99998 10.6666C8.36817 10.6666 8.66665 10.3682 8.66665 9.99998C8.66665 9.63179 8.36817 9.33331 7.99998 9.33331C7.63179 9.33331 7.33331 9.63179 7.33331 9.99998C7.33331 10.3682 7.63179 10.6666 7.99998 10.6666Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12.6667 10.6666C13.0349 10.6666 13.3333 10.3682 13.3333 9.99998C13.3333 9.63179 13.0349 9.33331 12.6667 9.33331C12.2985 9.33331 12 9.63179 12 9.99998C12 10.3682 12.2985 10.6666 12.6667 10.6666Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.33335 10.6666C3.70154 10.6666 4.00002 10.3682 4.00002 9.99998C4.00002 9.63179 3.70154 9.33331 3.33335 9.33331C2.96516 9.33331 2.66669 9.63179 2.66669 9.99998C2.66669 10.3682 2.96516 10.6666 3.33335 10.6666Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default DragIcon;\n","import React, { SVGAttributes } from \"react\";\n\nconst CloseIcon: React.FC<SVGAttributes<SVGSVGElement>> = (props) => {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M10.5 3.5L3.5 10.5\"\n stroke=\"#71717B\"\n strokeWidth={1.16667}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.5 3.5L10.5 10.5\"\n stroke=\"#71717B\"\n strokeWidth={1.16667}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default CloseIcon;\n","import React from \"react\";\nimport { DragHandle } from \"./DragHandle\";\nimport DevtoolsIcon from \"../icons/DevtoolsIcon\";\nimport DragIcon from \"../icons/DragIcon\";\nimport CloseIcon from \"../icons/CloseIcon\";\n\nconst DockHeader: React.FC<{\n setOpen: (open: boolean) => void;\n handleDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n handleDragEnd: () => void;\n}> = ({ setOpen, handleDragStart, handleDragEnd }) => {\n return (\n <DragHandle onDragStart={handleDragStart} onDragEnd={handleDragEnd}>\n <div\n style={{\n height: 40,\n width: \"100%\",\n padding: \"9.5px 12px\",\n boxSizing: \"border-box\",\n borderBottom: \"1px solid rgba(39, 39, 42, 0.5)\",\n display: \"flex\",\n flexDirection: \"row\",\n backgroundColor: \"rgba(24, 24, 27, 0.5)\",\n }}\n >\n <div\n style={{\n width: 20,\n height: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginRight: 8,\n backgroundColor: \"#27272A\",\n borderRadius: 4,\n }}\n >\n <DevtoolsIcon fill=\"#9F9FA9\" stroke=\"#9F9FA9\" height={12} width={12} />\n </div>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: \"#E4E4E7\",\n }}\n >\n React Inspector\n </span>\n\n <div\n style={{\n marginLeft: \"auto\",\n display: \"flex\",\n flexDirection: \"row\",\n gap: 16,\n alignItems: \"center\",\n }}\n >\n <DragIcon />\n <div\n data-no-drag\n style={{\n cursor: \"pointer\",\n width: 20,\n height: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n }}\n >\n <CloseIcon />\n </div>\n </div>\n </div>\n </DragHandle>\n );\n};\n\nexport default DockHeader;\n"],"mappings":"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","names":["useEffect","useId","useMemo","useMemo","useEffect","useId","useEffect","useMemo","useRef","useState","jsx","jsx","jsx","jsx","jsx","useState","jsx","e","jsx","jsx","jsxs","jsx","jsxs","useEffect","useState","jsx","jsxs","useState","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useEffect","useMemo"]}
|
|
1
|
+
{"version":3,"sources":["#style-inject:#style-inject","../src/index.css","../src/provider.tsx","../src/store.ts","../src/hooks.ts","../src/StateInspectorUI.tsx","../src/ui/constants.ts","../src/ui/utils.ts","../src/ui/icons/DevtoolsIcon.tsx","../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/styles.ts","../src/ui/components/SearchInput.tsx","../src/ui/components/ComponentList.tsx","../src/ui/components/StatePanelHeader.tsx","../src/ui/components/JsonEditor.tsx","../src/ui/components/StateEditor.tsx","../src/ui/components/StateCard.tsx","../src/ui/components/StateEditorPanel.tsx","../src/ui/icons/DragIcon.tsx","../src/ui/icons/CloseIcon.tsx","../src/ui/components/DockHeader.tsx"],"sourcesContent":["\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"@import \\\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\\\";\\n[data-rsi-root],\\n[data-rsi-root] *,\\n[data-rsi-root] *::before,\\n[data-rsi-root] *::after {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n border: 0;\\n font-family:\\n \\\"Inter\\\",\\n -apple-system,\\n BlinkMacSystemFont,\\n \\\"Segoe UI\\\",\\n Roboto,\\n Oxygen,\\n Ubuntu,\\n Cantarell,\\n \\\"Helvetica Neue\\\",\\n sans-serif;\\n font-size: 14px;\\n font-weight: 400;\\n font-style: normal;\\n font-variant: normal;\\n line-height: 1.5;\\n letter-spacing: normal;\\n text-align: left;\\n text-decoration: none;\\n text-indent: 0;\\n text-shadow: none;\\n text-transform: none;\\n word-spacing: normal;\\n white-space: normal;\\n background: transparent;\\n color: inherit;\\n outline: none;\\n vertical-align: baseline;\\n visibility: visible;\\n opacity: 1;\\n transform: none;\\n transform-origin: 50% 50% 0;\\n animation: none;\\n transition: none;\\n list-style: none;\\n border-collapse: collapse;\\n border-spacing: 0;\\n float: none;\\n clear: none;\\n cursor: auto;\\n}\\n[data-rsi-root] {\\n all: initial;\\n font-family:\\n \\\"Inter\\\",\\n -apple-system,\\n BlinkMacSystemFont,\\n \\\"Segoe UI\\\",\\n Roboto,\\n Oxygen,\\n Ubuntu,\\n Cantarell,\\n \\\"Helvetica Neue\\\",\\n sans-serif;\\n font-size: 14px;\\n line-height: 1.5;\\n color: #fff;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n text-rendering: optimizeLegibility;\\n}\\n[data-rsi-floating-button] {\\n all: initial;\\n font-family:\\n \\\"Inter\\\",\\n -apple-system,\\n BlinkMacSystemFont,\\n \\\"Segoe UI\\\",\\n Roboto,\\n Oxygen,\\n Ubuntu,\\n Cantarell,\\n \\\"Helvetica Neue\\\",\\n sans-serif;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n}\\n[data-rsi-root] button {\\n font-family: inherit;\\n font-size: inherit;\\n line-height: inherit;\\n cursor: pointer;\\n background: transparent;\\n border: none;\\n padding: 0;\\n margin: 0;\\n border-radius: 8px;\\n}\\n[data-rsi-root] input,\\n[data-rsi-root] textarea {\\n font-family: inherit;\\n font-size: inherit;\\n line-height: inherit;\\n background: transparent;\\n border: none;\\n outline: none;\\n padding: 0;\\n margin: 0;\\n resize: none;\\n}\\n[data-rsi-root] input::placeholder,\\n[data-rsi-root] textarea::placeholder {\\n color: inherit;\\n opacity: 0.5;\\n}\\n[data-rsi-root] a {\\n color: inherit;\\n text-decoration: none;\\n}\\n[data-rsi-root] img,\\n[data-rsi-root] svg {\\n display: block;\\n max-width: 100%;\\n}\\n[data-rsi-root] h1,\\n[data-rsi-root] h2,\\n[data-rsi-root] h3,\\n[data-rsi-root] h4,\\n[data-rsi-root] h5,\\n[data-rsi-root] h6 {\\n font-size: inherit;\\n font-weight: inherit;\\n}\\n[data-rsi-root] ::-webkit-scrollbar {\\n width: 6px;\\n height: 6px;\\n}\\n[data-rsi-root] ::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n[data-rsi-root] ::-webkit-scrollbar-thumb {\\n background: rgba(255, 255, 255, 0.2);\\n border-radius: 3px;\\n}\\n[data-rsi-root] ::-webkit-scrollbar-thumb:hover {\\n background: rgba(255, 255, 255, 0.3);\\n}\\n[data-rsi-root] ::selection {\\n background: rgba(99, 102, 241, 0.4);\\n color: #fff;\\n}\\n[data-rsi-root] :focus-visible {\\n outline: 2px solid rgba(99, 102, 241, 0.6);\\n outline-offset: 2px;\\n}\\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 <InspectorContext.Provider value={store}>{children}</InspectorContext.Provider>;\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: (componentId: ComponentId, entry: InspectableStateEntry) => 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 { LS_LAYOUT, LS_KEY, LS_SIZE, LS_LEFT_W, isMac } 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\";\nimport DockHeader from \"./ui/components/DockHeader\";\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 {\n localStorage.setItem(LS_LAYOUT, layout);\n } catch (e) {\n console.error(e);\n }\n }, [layout]);\n\n // Persist position to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(LS_KEY, JSON.stringify(pos));\n } catch (e) {\n console.error(e);\n }\n }, [pos]);\n\n // Persist sidebar width to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(LS_LEFT_W, String(leftWidth));\n } catch (e) {\n console.error(e);\n }\n }, [leftWidth]);\n\n // Persist size to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(LS_SIZE, JSON.stringify(size));\n } 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, tick]);\n\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 =\n (startSize: PanelSize, startPos: PanelPosition) =>\n (\n delta: { dx: number; dy: number },\n direction:\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\",\n ) => {\n const isLeft = direction === \"left\" || direction.endsWith(\"left\");\n const isTop = direction === \"top\" || direction.startsWith(\"top\");\n const isHorizontal = direction !== \"top\" && direction !== \"bottom\";\n const isVertical = direction !== \"left\" && direction !== \"right\";\n\n const currentWidth = startSize.width ?? 720;\n const currentHeight = startSize.height ?? 420;\n\n // Calculate new dimensions\n let newWidth = currentWidth;\n let newHeight = currentHeight;\n\n if (isHorizontal) {\n if (isLeft) {\n newWidth = Math.min(window.innerWidth - 16, Math.max(480, currentWidth - delta.dx));\n } else {\n newWidth = Math.min(window.innerWidth - 16, Math.max(480, currentWidth + delta.dx));\n }\n }\n\n if (isVertical) {\n if (isTop) {\n newHeight = Math.min(window.innerHeight - 120, Math.max(280, currentHeight - delta.dy));\n } else {\n newHeight = Math.min(window.innerHeight - 120, Math.max(280, currentHeight + delta.dy));\n }\n }\n\n setSize({ width: newWidth, height: newHeight });\n\n // Update position for left/top edges\n const newPos: PanelPosition = { ...startPos };\n\n if (isLeft && startPos.left !== undefined) {\n const widthDelta = newWidth - currentWidth;\n newPos.left = Math.max(8, startPos.left - widthDelta);\n } else if (isLeft && startPos.right !== undefined) {\n // If positioned from right, adjust right position\n const widthDelta = newWidth - currentWidth;\n newPos.right = Math.max(8, startPos.right - widthDelta);\n }\n\n if (isTop && startPos.top !== undefined) {\n const heightDelta = newHeight - currentHeight;\n newPos.top = Math.max(8, startPos.top - heightDelta);\n } else if (isTop && startPos.bottom !== undefined) {\n // If positioned from bottom, adjust bottom position\n const heightDelta = newHeight - currentHeight;\n newPos.bottom = Math.max(8, startPos.bottom - heightDelta);\n }\n\n setPos(newPos);\n };\n\n if (!store.enabled) return null;\n\n return createPortal(\n <>\n <FloatingButton onClick={() => setOpen((o) => !o)} isActive={open} />\n <DockPreviewOverlay preview={preview} />\n\n {open && (\n <div\n data-rsi-root\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 overflow: \"hidden\",\n transition: isTransitioning ? \"all 0.3s ease\" : \"none\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <DockHeader\n setOpen={setOpen}\n handleDragStart={handleDragStart}\n handleDragEnd={handleDragEnd}\n />\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: leftCollapsed ? \"auto\" : `${leftWidth}px 14px auto`,\n height: \"100%\",\n }}\n >\n <ResizeHandle onResize={handlePanelResize(size, pos)} />\n\n <ComponentList\n query={query}\n onQueryChange={setQuery}\n searchRef={searchRef}\n components={filtered}\n selectedId={selectedId}\n onSelect={setSelectedId}\n hidden={leftCollapsed}\n />\n\n <SidebarResizer\n leftWidth={leftWidth}\n onWidthChange={setLeftWidth}\n hidden={leftCollapsed}\n />\n\n <StateEditorPanel\n selected={selected}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={() => setLeftCollapsed((v) => !v)}\n />\n </div>\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 =\n typeof navigator !== \"undefined\" ? navigator.platform.toUpperCase().includes(\"MAC\") : 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","import React, { SVGAttributes } from \"react\";\n\nconst DevtoolsIcon: React.FC<SVGAttributes<SVGSVGElement>> = (props) => {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g clipPath=\"url(#clip0_1_13)\">\n <path\n d=\"M2 7.00002C1.90538 7.00034 1.81262 6.97381 1.73248 6.92351C1.65234 6.87321 1.58812 6.8012 1.54727 6.71585C1.50643 6.6305 1.49065 6.53531 1.50175 6.44135C1.51285 6.34739 1.55039 6.2585 1.61 6.18502L6.56 1.08502C6.59713 1.04216 6.64773 1.0132 6.70349 1.00289C6.75925 0.992575 6.81686 1.00153 6.86687 1.02827C6.91687 1.05502 6.95629 1.09797 6.97867 1.15007C7.00104 1.20218 7.00504 1.26034 6.99 1.31502L6.03 4.32502C6.00169 4.40078 5.99219 4.48228 6.0023 4.56252C6.01241 4.64277 6.04183 4.71936 6.08805 4.78573C6.13426 4.85211 6.19589 4.90628 6.26764 4.9436C6.33939 4.98092 6.41912 5.00028 6.5 5.00002H10C10.0946 4.9997 10.1874 5.02623 10.2675 5.07653C10.3477 5.12683 10.4119 5.19884 10.4527 5.28419C10.4936 5.36954 10.5094 5.46473 10.4983 5.55869C10.4871 5.65266 10.4496 5.74154 10.39 5.81502L5.44 10.915C5.40287 10.9579 5.35227 10.9868 5.29651 10.9972C5.24075 11.0075 5.18314 10.9985 5.13313 10.9718C5.08313 10.945 5.04371 10.9021 5.02133 10.85C4.99896 10.7979 4.99496 10.7397 5.01 10.685L5.97 7.67502C5.99831 7.59926 6.00781 7.51776 5.9977 7.43752C5.98759 7.35727 5.95817 7.28068 5.91195 7.21431C5.86574 7.14793 5.80411 7.09376 5.73236 7.05644C5.66061 7.01912 5.58088 6.99976 5.5 7.00002H2Z\"\n fill=\"inherit\"\n stroke=\"inherit\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1_13\">\n <rect width=\"12\" height=\"12\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n};\n\nexport default DevtoolsIcon;\n","import DevtoolsIcon from \"../icons/DevtoolsIcon\";\n\ninterface FloatingButtonProps {\n onClick: () => void;\n isActive: boolean;\n}\n\nexport function FloatingButton({ onClick, isActive }: FloatingButtonProps) {\n return (\n <button\n data-rsi-floating-button\n title=\"State Inspector (⌘⇧I / Ctrl⇧I)\"\n onClick={onClick}\n style={{\n position: \"fixed\",\n right: 16,\n bottom: 16,\n width: 48,\n height: 48,\n borderRadius: 24,\n border: \"none\",\n background: isActive ? \"#155DFC\" : \"#111\",\n color: \"#fff\",\n cursor: \"pointer\",\n zIndex: 999999,\n padding: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n aria-label=\"Toggle State Inspector\"\n >\n <DevtoolsIcon fill={isActive ? \"#FFF\" : undefined} stroke=\"#FFF\" height={20} width={20} />\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","export type ResizeDirection =\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\ninterface ResizeHandleProps {\n onResize: (delta: { dx: number; dy: number }, direction: ResizeDirection) => void;\n}\n\nconst EDGE_SIZE = 6;\nconst CORNER_SIZE = 12;\n\ntype HandleConfig = {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n width?: number | string;\n height?: number | string;\n cursor: string;\n};\n\nconst handleConfigs: Record<ResizeDirection, HandleConfig> = {\n // Edges\n top: { top: 0, left: CORNER_SIZE, right: CORNER_SIZE, height: EDGE_SIZE, cursor: \"ns-resize\" },\n bottom: {\n bottom: 0,\n left: CORNER_SIZE,\n right: CORNER_SIZE,\n height: EDGE_SIZE,\n cursor: \"ns-resize\",\n },\n left: { left: 0, top: CORNER_SIZE, bottom: CORNER_SIZE, width: EDGE_SIZE, cursor: \"ew-resize\" },\n right: { right: 0, top: CORNER_SIZE, bottom: CORNER_SIZE, width: EDGE_SIZE, cursor: \"ew-resize\" },\n // Corners\n \"top-left\": { top: 0, left: 0, width: CORNER_SIZE, height: CORNER_SIZE, cursor: \"nwse-resize\" },\n \"top-right\": { top: 0, right: 0, width: CORNER_SIZE, height: CORNER_SIZE, cursor: \"nesw-resize\" },\n \"bottom-left\": {\n bottom: 0,\n left: 0,\n width: CORNER_SIZE,\n height: CORNER_SIZE,\n cursor: \"nesw-resize\",\n },\n \"bottom-right\": {\n bottom: 0,\n right: 0,\n width: CORNER_SIZE,\n height: CORNER_SIZE,\n cursor: \"nwse-resize\",\n },\n};\n\nfunction Handle({\n direction,\n onResize,\n}: {\n direction: ResizeDirection;\n onResize: (delta: { dx: number; dy: number }, direction: ResizeDirection) => void;\n}) {\n const config = handleConfigs[direction];\n\n return (\n <div\n onPointerDown={(e) => {\n e.stopPropagation();\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 {\n dx: ev.clientX - startX,\n dy: ev.clientY - startY,\n },\n direction,\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 top: config.top,\n right: config.right,\n bottom: config.bottom,\n left: config.left,\n width: config.width,\n height: config.height,\n cursor: config.cursor,\n background: \"transparent\",\n zIndex: 10,\n }}\n />\n );\n}\n\nconst directions: ResizeDirection[] = [\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n];\n\nexport function ResizeHandle({ onResize }: ResizeHandleProps) {\n return (\n <>\n {directions.map((dir) => (\n <Handle key={dir} direction={dir} onResize={onResize} />\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\";\nimport { useState } 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 const [isDragging, setIsDragging] = useState(false);\n\n return (\n <div\n style={{ cursor: isDragging ? \"grabbing\" : \"grab\", userSelect: \"none\", ...style }}\n onPointerDown={(e) => {\n const target = e.target as HTMLElement | null;\n try {\n if (\n target &&\n typeof target.closest === \"function\" &&\n target.closest('button, input, textarea, a, [role=\"button\"], [data-no-drag]')\n ) {\n return;\n }\n } catch (e) {\n console.error(e);\n }\n\n setIsDragging(true);\n onDragStart(e);\n }}\n onPointerUp={() => {\n if (isDragging) {\n setIsDragging(false);\n onDragEnd();\n }\n }}\n >\n {children}\n </div>\n );\n}\n","import type React from \"react\";\n\nexport const inputStyle: React.CSSProperties = {\n padding: \"8px 10px\",\n borderRadius: 4,\n border: \"none\",\n background: \"#18181B\",\n color: \"#fff\",\n minWidth: 120,\n};\n\nexport const cardStyle: React.CSSProperties = {\n border: \"1px solid rgba(39, 39, 42, 0.30)\",\n borderRadius: 12,\n padding: 10,\n};\n\nexport const buttonStyle: React.CSSProperties = {\n background: \"transparent\",\n color: \"#fff\",\n border: \"1px solid rgba(39, 39, 42, 0.30)\",\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=\"Filter…\"\n ref={inputRef}\n style={{\n ...inputStyle,\n outline: \"none\",\n }}\n />\n );\n}\n","import type React from \"react\";\nimport type { ComponentSummary } from \"../types\";\nimport { SearchInput } from \"./SearchInput\";\ninterface ComponentListProps {\n components: ComponentSummary[];\n selectedId: string | null;\n onSelect: (id: string) => void;\n hidden: boolean;\n query: string;\n onQueryChange: (value: string) => void;\n searchRef: React.RefObject<HTMLInputElement | null>;\n}\n\nexport function ComponentList({\n components,\n selectedId,\n onSelect,\n hidden,\n query,\n onQueryChange,\n searchRef,\n}: ComponentListProps) {\n if (hidden) return null;\n\n return (\n <div style={{ padding: 4, boxSizing: \"border-box\", backgroundColor: \"#09090B\" }}>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n paddingTop: 4,\n paddingBottom: 8,\n paddingLeft: 4,\n paddingRight: 4,\n }}\n >\n <SearchInput value={query} onChange={onQueryChange} inputRef={searchRef} />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2, 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 display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: 8,\n backgroundColor: active ? \"#27272A\" : \"transparent\",\n border: \"none\",\n }}\n >\n <div style={{ fontWeight: 500, fontSize: 12, color: active ? \"#fff\" : \"#9F9FA9\" }}>\n {c.label}\n </div>\n <div\n style={{\n fontSize: 9,\n height: 16,\n width: 16,\n color: \"#D4D4D8\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 8,\n backgroundColor: \"#3F3F47\",\n }}\n >\n {c.stateKeys.length}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","import type React from \"react\";\n\ninterface StatePanelHeaderProps {\n selectedLabel: string | null;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n}\n\nexport function StatePanelHeader({\n selectedLabel,\n leftCollapsed,\n onToggleCollapse,\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 <h4 style={{ margin: 0 }}>{selectedLabel ?? \"No selection\"}</h4>\n </div>\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={{\n ...inputStyle,\n minWidth: 120,\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={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: \"row\",\n justifyContent: \"space-between\",\n gap: 8,\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n gap: 1,\n }}\n >\n <div style={{ fontSize: 14 }}>{state.key}</div>\n <div style={{ fontSize: 12, color: \"#52525C\", textTransform: \"uppercase\" }}>\n {state.meta?.type ?? \"auto\"}\n </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 { StateCard } from \"./StateCard\";\n\ninterface StateEditorPanelProps {\n selected: ComponentEntry | null;\n leftCollapsed: boolean;\n onToggleCollapse: () => void;\n}\n\nexport function StateEditorPanel({\n selected,\n leftCollapsed,\n onToggleCollapse,\n}: StateEditorPanelProps) {\n return (\n <div\n style={{\n padding: 12,\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n backgroundColor: \"#0C0C0E\",\n }}\n >\n <StatePanelHeader\n selectedLabel={selected?.label ?? null}\n leftCollapsed={leftCollapsed}\n onToggleCollapse={onToggleCollapse}\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 }}>This component has no inspectable state.</div>\n )}\n\n {!selected && <div style={{ opacity: 0.7, fontSize: 13 }}>No component selected.</div>}\n\n {selected &&\n Array.from(selected.states.values()).map((s) => <StateCard key={s.key} state={s} />)}\n </div>\n </div>\n );\n}\n","import React, { SVGAttributes } from \"react\";\n\nconst DragIcon: React.FC<SVGAttributes<SVGSVGElement>> = (props) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M7.99998 6.66665C8.36817 6.66665 8.66665 6.36817 8.66665 5.99998C8.66665 5.63179 8.36817 5.33331 7.99998 5.33331C7.63179 5.33331 7.33331 5.63179 7.33331 5.99998C7.33331 6.36817 7.63179 6.66665 7.99998 6.66665Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12.6667 6.66665C13.0349 6.66665 13.3333 6.36817 13.3333 5.99998C13.3333 5.63179 13.0349 5.33331 12.6667 5.33331C12.2985 5.33331 12 5.63179 12 5.99998C12 6.36817 12.2985 6.66665 12.6667 6.66665Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.33335 6.66665C3.70154 6.66665 4.00002 6.36817 4.00002 5.99998C4.00002 5.63179 3.70154 5.33331 3.33335 5.33331C2.96516 5.33331 2.66669 5.63179 2.66669 5.99998C2.66669 6.36817 2.96516 6.66665 3.33335 6.66665Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7.99998 10.6666C8.36817 10.6666 8.66665 10.3682 8.66665 9.99998C8.66665 9.63179 8.36817 9.33331 7.99998 9.33331C7.63179 9.33331 7.33331 9.63179 7.33331 9.99998C7.33331 10.3682 7.63179 10.6666 7.99998 10.6666Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12.6667 10.6666C13.0349 10.6666 13.3333 10.3682 13.3333 9.99998C13.3333 9.63179 13.0349 9.33331 12.6667 9.33331C12.2985 9.33331 12 9.63179 12 9.99998C12 10.3682 12.2985 10.6666 12.6667 10.6666Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.33335 10.6666C3.70154 10.6666 4.00002 10.3682 4.00002 9.99998C4.00002 9.63179 3.70154 9.33331 3.33335 9.33331C2.96516 9.33331 2.66669 9.63179 2.66669 9.99998C2.66669 10.3682 2.96516 10.6666 3.33335 10.6666Z\"\n stroke=\"#3F3F46\"\n strokeWidth={1.33333}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default DragIcon;\n","import React, { SVGAttributes } from \"react\";\n\nconst CloseIcon: React.FC<SVGAttributes<SVGSVGElement>> = (props) => {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M10.5 3.5L3.5 10.5\"\n stroke=\"#71717B\"\n strokeWidth={1.16667}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.5 3.5L10.5 10.5\"\n stroke=\"#71717B\"\n strokeWidth={1.16667}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default CloseIcon;\n","import React from \"react\";\nimport { DragHandle } from \"./DragHandle\";\nimport DevtoolsIcon from \"../icons/DevtoolsIcon\";\nimport DragIcon from \"../icons/DragIcon\";\nimport CloseIcon from \"../icons/CloseIcon\";\n\nconst DockHeader: React.FC<{\n setOpen: (open: boolean) => void;\n handleDragStart: (e: React.PointerEvent<HTMLDivElement>) => void;\n handleDragEnd: () => void;\n}> = ({ setOpen, handleDragStart, handleDragEnd }) => {\n return (\n <DragHandle onDragStart={handleDragStart} onDragEnd={handleDragEnd}>\n <div\n style={{\n height: 40,\n width: \"100%\",\n padding: \"9.5px 12px\",\n boxSizing: \"border-box\",\n borderBottom: \"1px solid rgba(39, 39, 42, 0.5)\",\n display: \"flex\",\n flexDirection: \"row\",\n backgroundColor: \"rgba(24, 24, 27, 0.5)\",\n }}\n >\n <div\n style={{\n width: 20,\n height: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginRight: 8,\n backgroundColor: \"#27272A\",\n borderRadius: 4,\n }}\n >\n <DevtoolsIcon fill=\"#9F9FA9\" stroke=\"#9F9FA9\" height={12} width={12} />\n </div>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: \"#E4E4E7\",\n }}\n >\n React Inspector\n </span>\n\n <div\n style={{\n marginLeft: \"auto\",\n display: \"flex\",\n flexDirection: \"row\",\n gap: 16,\n alignItems: \"center\",\n }}\n >\n <DragIcon />\n <div\n data-no-drag\n style={{\n cursor: \"pointer\",\n width: 20,\n height: 20,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onClick={(e) => {\n e.stopPropagation();\n setOpen(false);\n }}\n >\n <CloseIcon />\n </div>\n </div>\n </div>\n </DragHandle>\n );\n};\n\nexport default DockHeader;\n"],"mappings":"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","names":["useEffect","useId","useMemo","useMemo","useEffect","useId","useEffect","useMemo","useRef","useState","jsx","jsx","jsx","jsx","jsx","useState","jsx","e","jsx","jsx","jsxs","jsx","jsxs","useEffect","useState","jsx","jsxs","useState","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useEffect","useMemo"]}
|
package/package.json
CHANGED
package/dist/index.css
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
@import "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";
|
|
2
|
-
|
|
3
|
-
/* src/index.css */
|
|
4
|
-
[data-rsi-root],
|
|
5
|
-
[data-rsi-root] *,
|
|
6
|
-
[data-rsi-root] *::before,
|
|
7
|
-
[data-rsi-root] *::after {
|
|
8
|
-
box-sizing: border-box;
|
|
9
|
-
margin: 0;
|
|
10
|
-
padding: 0;
|
|
11
|
-
border: 0;
|
|
12
|
-
font-family:
|
|
13
|
-
"Inter",
|
|
14
|
-
-apple-system,
|
|
15
|
-
BlinkMacSystemFont,
|
|
16
|
-
"Segoe UI",
|
|
17
|
-
Roboto,
|
|
18
|
-
Oxygen,
|
|
19
|
-
Ubuntu,
|
|
20
|
-
Cantarell,
|
|
21
|
-
"Helvetica Neue",
|
|
22
|
-
sans-serif;
|
|
23
|
-
font-size: 14px;
|
|
24
|
-
font-weight: 400;
|
|
25
|
-
font-style: normal;
|
|
26
|
-
font-variant: normal;
|
|
27
|
-
line-height: 1.5;
|
|
28
|
-
letter-spacing: normal;
|
|
29
|
-
text-align: left;
|
|
30
|
-
text-decoration: none;
|
|
31
|
-
text-indent: 0;
|
|
32
|
-
text-shadow: none;
|
|
33
|
-
text-transform: none;
|
|
34
|
-
word-spacing: normal;
|
|
35
|
-
white-space: normal;
|
|
36
|
-
background: transparent;
|
|
37
|
-
color: inherit;
|
|
38
|
-
outline: none;
|
|
39
|
-
vertical-align: baseline;
|
|
40
|
-
visibility: visible;
|
|
41
|
-
opacity: 1;
|
|
42
|
-
transform: none;
|
|
43
|
-
transform-origin: 50% 50% 0;
|
|
44
|
-
animation: none;
|
|
45
|
-
transition: none;
|
|
46
|
-
list-style: none;
|
|
47
|
-
border-collapse: collapse;
|
|
48
|
-
border-spacing: 0;
|
|
49
|
-
float: none;
|
|
50
|
-
clear: none;
|
|
51
|
-
cursor: auto;
|
|
52
|
-
}
|
|
53
|
-
[data-rsi-root] {
|
|
54
|
-
all: initial;
|
|
55
|
-
font-family:
|
|
56
|
-
"Inter",
|
|
57
|
-
-apple-system,
|
|
58
|
-
BlinkMacSystemFont,
|
|
59
|
-
"Segoe UI",
|
|
60
|
-
Roboto,
|
|
61
|
-
Oxygen,
|
|
62
|
-
Ubuntu,
|
|
63
|
-
Cantarell,
|
|
64
|
-
"Helvetica Neue",
|
|
65
|
-
sans-serif;
|
|
66
|
-
font-size: 14px;
|
|
67
|
-
line-height: 1.5;
|
|
68
|
-
color: #fff;
|
|
69
|
-
-webkit-font-smoothing: antialiased;
|
|
70
|
-
-moz-osx-font-smoothing: grayscale;
|
|
71
|
-
text-rendering: optimizeLegibility;
|
|
72
|
-
}
|
|
73
|
-
[data-rsi-floating-button] {
|
|
74
|
-
all: initial;
|
|
75
|
-
font-family:
|
|
76
|
-
"Inter",
|
|
77
|
-
-apple-system,
|
|
78
|
-
BlinkMacSystemFont,
|
|
79
|
-
"Segoe UI",
|
|
80
|
-
Roboto,
|
|
81
|
-
Oxygen,
|
|
82
|
-
Ubuntu,
|
|
83
|
-
Cantarell,
|
|
84
|
-
"Helvetica Neue",
|
|
85
|
-
sans-serif;
|
|
86
|
-
-webkit-font-smoothing: antialiased;
|
|
87
|
-
-moz-osx-font-smoothing: grayscale;
|
|
88
|
-
}
|
|
89
|
-
[data-rsi-root] button {
|
|
90
|
-
font-family: inherit;
|
|
91
|
-
font-size: inherit;
|
|
92
|
-
line-height: inherit;
|
|
93
|
-
cursor: pointer;
|
|
94
|
-
background: transparent;
|
|
95
|
-
border: none;
|
|
96
|
-
padding: 0;
|
|
97
|
-
margin: 0;
|
|
98
|
-
}
|
|
99
|
-
[data-rsi-root] input,
|
|
100
|
-
[data-rsi-root] textarea {
|
|
101
|
-
font-family: inherit;
|
|
102
|
-
font-size: inherit;
|
|
103
|
-
line-height: inherit;
|
|
104
|
-
background: transparent;
|
|
105
|
-
border: none;
|
|
106
|
-
outline: none;
|
|
107
|
-
padding: 0;
|
|
108
|
-
margin: 0;
|
|
109
|
-
resize: none;
|
|
110
|
-
}
|
|
111
|
-
[data-rsi-root] input::placeholder,
|
|
112
|
-
[data-rsi-root] textarea::placeholder {
|
|
113
|
-
color: inherit;
|
|
114
|
-
opacity: 0.5;
|
|
115
|
-
}
|
|
116
|
-
[data-rsi-root] a {
|
|
117
|
-
color: inherit;
|
|
118
|
-
text-decoration: none;
|
|
119
|
-
}
|
|
120
|
-
[data-rsi-root] img,
|
|
121
|
-
[data-rsi-root] svg {
|
|
122
|
-
display: block;
|
|
123
|
-
max-width: 100%;
|
|
124
|
-
}
|
|
125
|
-
[data-rsi-root] h1,
|
|
126
|
-
[data-rsi-root] h2,
|
|
127
|
-
[data-rsi-root] h3,
|
|
128
|
-
[data-rsi-root] h4,
|
|
129
|
-
[data-rsi-root] h5,
|
|
130
|
-
[data-rsi-root] h6 {
|
|
131
|
-
font-size: inherit;
|
|
132
|
-
font-weight: inherit;
|
|
133
|
-
}
|
|
134
|
-
[data-rsi-root] ::-webkit-scrollbar {
|
|
135
|
-
width: 6px;
|
|
136
|
-
height: 6px;
|
|
137
|
-
}
|
|
138
|
-
[data-rsi-root] ::-webkit-scrollbar-track {
|
|
139
|
-
background: transparent;
|
|
140
|
-
}
|
|
141
|
-
[data-rsi-root] ::-webkit-scrollbar-thumb {
|
|
142
|
-
background: rgba(255, 255, 255, 0.2);
|
|
143
|
-
border-radius: 3px;
|
|
144
|
-
}
|
|
145
|
-
[data-rsi-root] ::-webkit-scrollbar-thumb:hover {
|
|
146
|
-
background: rgba(255, 255, 255, 0.3);
|
|
147
|
-
}
|
|
148
|
-
[data-rsi-root] ::selection {
|
|
149
|
-
background: rgba(99, 102, 241, 0.4);
|
|
150
|
-
color: #fff;
|
|
151
|
-
}
|
|
152
|
-
[data-rsi-root] :focus-visible {
|
|
153
|
-
outline: 2px solid rgba(99, 102, 241, 0.6);
|
|
154
|
-
outline-offset: 2px;
|
|
155
|
-
}
|
|
156
|
-
/*# sourceMappingURL=index.css.map */
|
package/dist/index.css.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.css"],"sourcesContent":["/* Inter Font Import */\n@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\");\n\n/* CSS Isolation - Reset all inherited styles */\n[data-rsi-root],\n[data-rsi-root] *,\n[data-rsi-root] *::before,\n[data-rsi-root] *::after {\n /* Reset box model */\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0;\n\n /* Reset typography */\n font-family:\n \"Inter\",\n -apple-system,\n BlinkMacSystemFont,\n \"Segoe UI\",\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n \"Helvetica Neue\",\n sans-serif;\n font-size: 14px;\n font-weight: 400;\n font-style: normal;\n font-variant: normal;\n line-height: 1.5;\n letter-spacing: normal;\n text-align: left;\n text-decoration: none;\n text-indent: 0;\n text-shadow: none;\n text-transform: none;\n word-spacing: normal;\n white-space: normal;\n\n /* Reset visual */\n background: transparent;\n color: inherit;\n outline: none;\n vertical-align: baseline;\n visibility: visible;\n opacity: 1;\n\n /* Reset transforms */\n transform: none;\n transform-origin: 50% 50% 0;\n\n /* Reset animations */\n animation: none;\n transition: none;\n\n /* Reset list styles */\n list-style: none;\n\n /* Reset table styles */\n border-collapse: collapse;\n border-spacing: 0;\n\n /* Reset flex/grid */\n float: none;\n clear: none;\n\n /* Reset cursor */\n cursor: auto;\n}\n\n/* Root container base styles */\n[data-rsi-root] {\n all: initial;\n font-family:\n \"Inter\",\n -apple-system,\n BlinkMacSystemFont,\n \"Segoe UI\",\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n \"Helvetica Neue\",\n sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #fff;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n text-rendering: optimizeLegibility;\n}\n\n/* Floating button reset */\n[data-rsi-floating-button] {\n all: initial;\n font-family:\n \"Inter\",\n -apple-system,\n BlinkMacSystemFont,\n \"Segoe UI\",\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n \"Helvetica Neue\",\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n/* Reset specific elements */\n[data-rsi-root] button {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n background: transparent;\n border: none;\n padding: 0;\n margin: 0;\n}\n\n[data-rsi-root] input,\n[data-rsi-root] textarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n background: transparent;\n border: none;\n outline: none;\n padding: 0;\n margin: 0;\n resize: none;\n}\n\n[data-rsi-root] input::placeholder,\n[data-rsi-root] textarea::placeholder {\n color: inherit;\n opacity: 0.5;\n}\n\n[data-rsi-root] a {\n color: inherit;\n text-decoration: none;\n}\n\n[data-rsi-root] img,\n[data-rsi-root] svg {\n display: block;\n max-width: 100%;\n}\n\n[data-rsi-root] h1,\n[data-rsi-root] h2,\n[data-rsi-root] h3,\n[data-rsi-root] h4,\n[data-rsi-root] h5,\n[data-rsi-root] h6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/* Scrollbar styling */\n[data-rsi-root] ::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n}\n\n[data-rsi-root] ::-webkit-scrollbar-track {\n background: transparent;\n}\n\n[data-rsi-root] ::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.2);\n border-radius: 3px;\n}\n\n[data-rsi-root] ::-webkit-scrollbar-thumb:hover {\n background: rgba(255, 255, 255, 0.3);\n}\n\n/* Selection styling */\n[data-rsi-root] ::selection {\n background: rgba(99, 102, 241, 0.4);\n color: #fff;\n}\n\n/* Focus visible for accessibility */\n[data-rsi-root] :focus-visible {\n outline: 2px solid rgba(99, 102, 241, 0.6);\n outline-offset: 2px;\n}\n"],"mappings":";;;AAIA,CAAC;AACD,CAAC,eAAe;AAChB,CAAC,eAAe,CAAC;AACjB,CAAC,eAAe,CAAC;AAEf,cAAY;AACZ,UAAQ;AACR,WAAS;AACT,UAAQ;AAGR;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB;AACF,aAAW;AACX,eAAa;AACb,cAAY;AACZ,gBAAc;AACd,eAAa;AACb,kBAAgB;AAChB,cAAY;AACZ,mBAAiB;AACjB,eAAa;AACb,eAAa;AACb,kBAAgB;AAChB,gBAAc;AACd,eAAa;AAGb,cAAY;AACZ,SAAO;AACP,WAAS;AACT,kBAAgB;AAChB,cAAY;AACZ,WAAS;AAGT,aAAW;AACX,oBAAkB,IAAI,IAAI;AAG1B,aAAW;AACX,cAAY;AAGZ,cAAY;AAGZ,mBAAiB;AACjB,kBAAgB;AAGhB,SAAO;AACP,SAAO;AAGP,UAAQ;AACV;AAGA,CAAC;AACC,OAAK;AACL;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB;AACF,aAAW;AACX,eAAa;AACb,SAAO;AACP,0BAAwB;AACxB,2BAAyB;AACzB,kBAAgB;AAClB;AAGA,CAAC;AACC,OAAK;AACL;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB;AACF,0BAAwB;AACxB,2BAAyB;AAC3B;AAGA,CAAC,eAAe;AACd,eAAa;AACb,aAAW;AACX,eAAa;AACb,UAAQ;AACR,cAAY;AACZ,UAAQ;AACR,WAAS;AACT,UAAQ;AACV;AAEA,CAAC,eAAe;AAChB,CAAC,eAAe;AACd,eAAa;AACb,aAAW;AACX,eAAa;AACb,cAAY;AACZ,UAAQ;AACR,WAAS;AACT,WAAS;AACT,UAAQ;AACR,UAAQ;AACV;AAEA,CAAC,eAAe,KAAK;AACrB,CAAC,eAAe,QAAQ;AACtB,SAAO;AACP,WAAS;AACX;AAEA,CAAC,eAAe;AACd,SAAO;AACP,mBAAiB;AACnB;AAEA,CAAC,eAAe;AAChB,CAAC,eAAe;AACd,WAAS;AACT,aAAW;AACb;AAEA,CAAC,eAAe;AAChB,CAAC,eAAe;AAChB,CAAC,eAAe;AAChB,CAAC,eAAe;AAChB,CAAC,eAAe;AAChB,CAAC,eAAe;AACd,aAAW;AACX,eAAa;AACf;AAGA,CAAC,eAAe;AACd,SAAO;AACP,UAAQ;AACV;AAEA,CAAC,eAAe;AACd,cAAY;AACd;AAEA,CAAC,eAAe;AACd,cAAY,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAChC,iBAAe;AACjB;AAEA,CAAC,eAAe,yBAAyB;AACvC,cAAY,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAClC;AAGA,CAAC,eAAe;AACd,cAAY,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;AAC/B,SAAO;AACT;AAGA,CAAC,eAAe;AACd,WAAS,IAAI,MAAM,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;AACtC,kBAAgB;AAClB;","names":[]}
|