@assistant-ui/react-devtools 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsHost.d.ts","names":[],"sources":["../src/DevToolsHost.ts"],"mappings":";UAMU,kBAAA;EACR,IAAA;EACA,IAAA;IACE,OAAA;IACA,IAAA;IACA,KAAA;EAAA;AAAA;AAAA,UAIM,kBAAA;EACR,IAAA;EACA,IAAA;IACE,OAAA,GAAU,KAAA;MAAQ,KAAA;IAAA;IAClB,IAAA,GAAO,KAAK;MACV,KAAA;MACA,KAAA;MACA,MAAA;MACA,YAAA;IAAA;EAAA;AAAA;AAAA,cAKO,YAAA;EAAA,QACH,YAAA;EAAA,QAOA,WAAA;EAAA,QACA,aAAA;cAEI,aAAA,GAAgB,OAAA,EAAS,kBAAA;EAKrC,gBAAA,CAAiB,OAAA,EAAS,kBAAkB;EAAA,QAcpC,kBAAA;EAAA,QAiBA,mBAAA;EAAA,QAMA,UAAA;EA+DR,OAAA,CAAA;AAAA"}
1
+ {"version":3,"file":"DevToolsHost.d.ts","names":[],"sources":["../src/DevToolsHost.ts"],"mappings":";UAMU,kBAAA;EACR,IAAA;EACA,IAAA;IACE,OAAA;IACA,IAAA;IACA,KAAA;EAAA;AAAA;AAAA,UAIM,kBAAA;EACR,IAAA;EACA,IAAA;IACE,OAAA,GAAU,KAAA;MAAQ,KAAA;IAAA;IAClB,IAAA,GAAO,KAAK;MACV,KAAA;MACA,KAAA;MACA,MAAA;MACA,YAAA;IAAA;EAAA;AAAA;AAAA,cAKO,YAAA;EAAA,QACH,YAAA;EAAA,QAOA,WAAA;EAAA,QACA,aAAA;cAEI,aAAA,GAAgB,OAAA,EAAS,kBAAA;EAKrC,gBAAA,CAAiB,OAAA,EAAS,kBAAkB;EAAA,QAcpC,kBAAA;EAAA,QAiBA,mBAAA;EAAA,QAMA,UAAA;EA+DR,OAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsModal.d.ts","names":[],"sources":["../src/DevToolsModal.tsx"],"mappings":";cAmLa,aAAA,oCAAa,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"DevToolsModal.d.ts","names":[],"sources":["../src/DevToolsModal.tsx"],"mappings":";cAiLa,aAAA,oCAAa,GAAA,CAAA,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsModal.js","names":[],"sources":["../src/DevToolsModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState, useSyncExternalStore } from \"react\";\nimport { DevToolsFrame } from \"./DevToolsFrame\";\nimport { getStyles, ANIMATION_STYLES } from \"./styles/DevToolsModal.styles\";\n\nconst isDarkMode = (): boolean => {\n if (typeof document === \"undefined\") return false;\n return (\n document.documentElement.classList.contains(\"dark\") ||\n document.body.classList.contains(\"dark\")\n );\n};\n\nconst subscribeToThemeChanges = (callback: () => void) => {\n if (typeof MutationObserver === \"undefined\") {\n return () => {};\n }\n\n const observer = new MutationObserver(callback);\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n\n if (document.body !== document.documentElement) {\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n }\n\n return () => observer.disconnect();\n};\n\nconst DevToolsModalImpl = () => {\n const [isOpen, setIsOpen] = useState(false);\n const [buttonHover, setButtonHover] = useState(false);\n const [closeHover, setCloseHover] = useState(false);\n\n const darkMode = useSyncExternalStore(\n subscribeToThemeChanges,\n isDarkMode,\n () => false, // Server-side always returns false\n );\n\n const styles = useMemo(() => getStyles(darkMode), [darkMode]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n const styleId = \"devtools-modal-animations\";\n if (!document.getElementById(styleId)) {\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = ANIMATION_STYLES;\n document.head.appendChild(style);\n }\n\n return () => {\n const style = document.getElementById(styleId);\n if (style && !document.querySelector(\"[data-devtools-modal]\")) {\n style.remove();\n }\n };\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [isOpen]);\n\n return (\n <>\n <div style={styles.floatingContainer}>\n <button\n type=\"button\"\n onClick={() => setIsOpen(true)}\n onMouseEnter={() => setButtonHover(true)}\n onMouseLeave={() => setButtonHover(false)}\n style={{\n ...styles.floatingButton,\n ...(buttonHover ? styles.floatingButtonHover : {}),\n }}\n aria-label=\"Open assistant-ui DevTools\"\n title=\"Open assistant-ui DevTools\"\n >\n <svg\n aria-hidden=\"true\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ width: \"20px\", height: \"20px\" }}\n >\n <path\n d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n </div>\n\n {isOpen && (\n <>\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: backdrop click is a convenience; keyboard users use the close button */}\n {/* biome-ignore lint/a11y/noStaticElementInteractions: backdrop overlay */}\n <div style={styles.backdrop} onClick={() => setIsOpen(false)} />\n\n <div style={styles.modal} data-devtools-modal>\n <button\n type=\"button\"\n onClick={() => setIsOpen(false)}\n onMouseEnter={() => setCloseHover(true)}\n onMouseLeave={() => setCloseHover(false)}\n style={{\n ...styles.dismissButton,\n ...(closeHover ? styles.dismissButtonHover : {}),\n }}\n aria-label=\"Close DevTools\"\n >\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6 6L18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n <div style={styles.modalContent}>\n <DevToolsFrame\n style={{\n width: \"100%\",\n height: \"100%\",\n border: \"none\",\n borderRadius: \"12px\",\n backgroundColor: \"transparent\",\n }}\n />\n </div>\n </div>\n </>\n )}\n </>\n );\n};\n\n// Export a component that only renders in development\nexport const DevToolsModal = () => {\n // Check if we're in production - most bundlers will replace process.env.NODE_ENV\n // This allows the entire component to be eliminated via dead code elimination\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"production\"\n ) {\n return null;\n }\n\n return <DevToolsModalImpl />;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"DevToolsModal.js","names":[],"sources":["../src/DevToolsModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState, useSyncExternalStore } from \"react\";\nimport { DevToolsFrame } from \"./DevToolsFrame\";\nimport { getStyles, ANIMATION_STYLES } from \"./styles/DevToolsModal.styles\";\n\nconst isDarkMode = (): boolean => {\n if (typeof document === \"undefined\") return false;\n return (\n document.documentElement.classList.contains(\"dark\") ||\n document.body.classList.contains(\"dark\")\n );\n};\n\nconst subscribeToThemeChanges = (callback: () => void) => {\n if (typeof MutationObserver === \"undefined\") {\n return () => {};\n }\n\n const observer = new MutationObserver(callback);\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n\n if (document.body !== document.documentElement) {\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n }\n\n return () => observer.disconnect();\n};\n\nconst DevToolsModalImpl = () => {\n const [isOpen, setIsOpen] = useState(false);\n const [buttonHover, setButtonHover] = useState(false);\n const [closeHover, setCloseHover] = useState(false);\n\n const darkMode = useSyncExternalStore(\n subscribeToThemeChanges,\n isDarkMode,\n () => false, // Server-side always returns false\n );\n\n const styles = useMemo(() => getStyles(darkMode), [darkMode]);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n const styleId = \"devtools-modal-animations\";\n if (!document.getElementById(styleId)) {\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = ANIMATION_STYLES;\n document.head.appendChild(style);\n }\n\n return () => {\n const style = document.getElementById(styleId);\n if (style && !document.querySelector(\"[data-devtools-modal]\")) {\n style.remove();\n }\n };\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [isOpen]);\n\n return (\n <>\n <div style={styles.floatingContainer}>\n <button\n type=\"button\"\n onClick={() => setIsOpen(true)}\n onMouseEnter={() => setButtonHover(true)}\n onMouseLeave={() => setButtonHover(false)}\n style={{\n ...styles.floatingButton,\n ...(buttonHover ? styles.floatingButtonHover : {}),\n }}\n aria-label=\"Open assistant-ui DevTools\"\n title=\"Open assistant-ui DevTools\"\n >\n <svg\n aria-hidden=\"true\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ width: \"20px\", height: \"20px\" }}\n >\n <path\n d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n </div>\n\n {isOpen && (\n <>\n <div style={styles.backdrop} onClick={() => setIsOpen(false)} />\n\n <div style={styles.modal} data-devtools-modal>\n <button\n type=\"button\"\n onClick={() => setIsOpen(false)}\n onMouseEnter={() => setCloseHover(true)}\n onMouseLeave={() => setCloseHover(false)}\n style={{\n ...styles.dismissButton,\n ...(closeHover ? styles.dismissButtonHover : {}),\n }}\n aria-label=\"Close DevTools\"\n >\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18 6L6 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6 6L18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n <div style={styles.modalContent}>\n <DevToolsFrame\n style={{\n width: \"100%\",\n height: \"100%\",\n border: \"none\",\n borderRadius: \"12px\",\n backgroundColor: \"transparent\",\n }}\n />\n </div>\n </div>\n </>\n )}\n </>\n );\n};\n\n// Export a component that only renders in development\nexport const DevToolsModal = () => {\n // Check if we're in production - most bundlers will replace process.env.NODE_ENV\n // This allows the entire component to be eliminated via dead code elimination\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"production\"\n ) {\n return null;\n }\n\n return <DevToolsModalImpl />;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionHost.d.ts","names":[],"sources":["../src/ExtensionHost.ts"],"mappings":";cAEa,aAAA;EAAA,QACH,YAAA;EAAA,QACA,eAAA;;EAgDR,OAAA,CAAA;AAAA"}
1
+ {"version":3,"file":"ExtensionHost.d.ts","names":[],"sources":["../src/ExtensionHost.ts"],"mappings":";cAEa,aAAA;EAAA,QACH,YAAA;EAAA,QACA,eAAA;;EAgDR,OAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"FrameClient.d.ts","names":[],"sources":["../src/FrameClient.ts"],"mappings":";UAAU,OAAA;EACR,KAAA;EACA,KAAA;EACA,MAAA;EACA,OAAA;AAAA;AAAA,KAeG,cAAA,IAAkB,IAAA;EACrB,OAAA,GAAU,KAAA;IAAQ,KAAA;EAAA;EAClB,IAAA,GAAO,OAAO;AAAA;AAAA,cAGH,WAAA;EAAA,QACH,SAAA;EAAA,QACA,mBAAA;EAAA,QACA,UAAA;;UASA,oBAAA;EAeR,eAAA,CAAgB,QAAA;EAOhB,SAAA,CAAU,QAAA,EAAU,cAAA;EAapB,eAAA,CAAgB,OAAA;IAAW,OAAA;IAAmB,IAAA;EAAA;EAU9C,WAAA,CAAY,KAAA;EAAA,QAUJ,eAAA;EAKR,aAAA,CAAA;cApEY,KAAA;MAAQ,KAAA;IAAA;WACX,OAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"FrameClient.d.ts","names":[],"sources":["../src/FrameClient.ts"],"mappings":";UAAU,OAAA;EACR,KAAA;EACA,KAAA;EACA,MAAA;EACA,OAAA;AAAA;AAAA,KAeG,cAAA,IAAkB,IAAA;EACrB,OAAA,GAAU,KAAA;IAAQ,KAAA;EAAA;EAClB,IAAA,GAAO,OAAO;AAAA;AAAA,cAGH,WAAA;EAAA,QACH,SAAA;EAAA,QACA,mBAAA;EAAA,QACA,UAAA;;UASA,oBAAA;EAcR,eAAA,CAAgB,QAAA;EAOhB,SAAA,CAAU,QAAA,EAAU,cAAA;EAapB,eAAA,CAAgB,OAAA;IAAW,OAAA;IAAmB,IAAA;EAAA;EAU9C,WAAA,CAAY,KAAA;EAAA,QAUJ,eAAA;EAIR,aAAA;cAlEY,KAAA;MAAQ,KAAA;IAAA;WACX,OAAA;EAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"FrameClient.js","names":[],"sources":["../src/FrameClient.ts"],"sourcesContent":["interface ApiData {\n apiId: number;\n state: any;\n events: any[];\n context?: any;\n}\n\ninterface UpdateMessage {\n type: \"update\";\n data: {\n apiList?: Array<{ apiId: number }>;\n apis?: ApiData[];\n };\n}\n\ninterface HostConnectedMessage {\n type: \"host-connected\";\n}\n\ntype UpdateListener = (data: {\n apiList?: Array<{ apiId: number }>;\n apis?: ApiData[];\n}) => void;\n\nexport class FrameClient {\n private listeners = new Set<UpdateListener>();\n private connectionListeners = new Set<() => void>();\n private lastUpdate: {\n apiList?: Array<{ apiId: number }>;\n apis?: ApiData[];\n } = {};\n\n constructor() {\n this.setupMessageListener();\n }\n\n private setupMessageListener() {\n window.addEventListener(\"message\", (event) => {\n const message = event.data as UpdateMessage | HostConnectedMessage;\n\n if (message.type === \"update\") {\n this.lastUpdate = message.data;\n this.notifyListeners(message.data);\n } else if (message.type === \"host-connected\") {\n // Host has reconnected (page refresh), notify listeners to re-subscribe\n // biome-ignore lint/suspicious/useIterableCallbackReturn: forEach callback intentionally has no return\n this.connectionListeners.forEach((listener) => listener());\n }\n });\n }\n\n onHostConnected(listener: () => void): () => void {\n this.connectionListeners.add(listener);\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n\n subscribe(listener: UpdateListener): () => void {\n this.listeners.add(listener);\n\n // Send the last update to the new listener\n if (this.lastUpdate.apiList || this.lastUpdate.apis) {\n listener(this.lastUpdate);\n }\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n setSubscription(options: { apiList?: boolean; apis?: number[] }) {\n window.parent.postMessage(\n {\n type: \"subscription\",\n data: options,\n },\n \"*\",\n );\n }\n\n clearEvents(apiId: number) {\n window.parent.postMessage(\n {\n type: \"clearEvents\",\n data: { apiId },\n },\n \"*\",\n );\n }\n\n private notifyListeners(data: UpdateMessage[\"data\"]) {\n // biome-ignore lint/suspicious/useIterableCallbackReturn: forEach callback intentionally has no return\n this.listeners.forEach((listener) => listener(data));\n }\n\n getLastUpdate() {\n return this.lastUpdate;\n }\n}\n"],"mappings":";AAwBA,IAAa,cAAb,MAAyB;CACvB,4BAAoB,IAAI,IAAoB;CAC5C,sCAA8B,IAAI,IAAgB;CAClD,aAGI,CAAC;CAEL,cAAc;EACZ,KAAK,qBAAqB;CAC5B;CAEA,uBAA+B;EAC7B,OAAO,iBAAiB,YAAY,UAAU;GAC5C,MAAM,UAAU,MAAM;GAEtB,IAAI,QAAQ,SAAS,UAAU;IAC7B,KAAK,aAAa,QAAQ;IAC1B,KAAK,gBAAgB,QAAQ,IAAI;GACnC,OAAO,IAAI,QAAQ,SAAS,kBAG1B,KAAK,oBAAoB,SAAS,aAAa,SAAS,CAAC;EAE7D,CAAC;CACH;CAEA,gBAAgB,UAAkC;EAChD,KAAK,oBAAoB,IAAI,QAAQ;EACrC,aAAa;GACX,KAAK,oBAAoB,OAAO,QAAQ;EAC1C;CACF;CAEA,UAAU,UAAsC;EAC9C,KAAK,UAAU,IAAI,QAAQ;EAG3B,IAAI,KAAK,WAAW,WAAW,KAAK,WAAW,MAC7C,SAAS,KAAK,UAAU;EAG1B,aAAa;GACX,KAAK,UAAU,OAAO,QAAQ;EAChC;CACF;CAEA,gBAAgB,SAAiD;EAC/D,OAAO,OAAO,YACZ;GACE,MAAM;GACN,MAAM;EACR,GACA,GACF;CACF;CAEA,YAAY,OAAe;EACzB,OAAO,OAAO,YACZ;GACE,MAAM;GACN,MAAM,EAAE,MAAM;EAChB,GACA,GACF;CACF;CAEA,gBAAwB,MAA6B;EAEnD,KAAK,UAAU,SAAS,aAAa,SAAS,IAAI,CAAC;CACrD;CAEA,gBAAgB;EACd,OAAO,KAAK;CACd;AACF"}
1
+ {"version":3,"file":"FrameClient.js","names":[],"sources":["../src/FrameClient.ts"],"sourcesContent":["interface ApiData {\n apiId: number;\n state: any;\n events: any[];\n context?: any;\n}\n\ninterface UpdateMessage {\n type: \"update\";\n data: {\n apiList?: Array<{ apiId: number }>;\n apis?: ApiData[];\n };\n}\n\ninterface HostConnectedMessage {\n type: \"host-connected\";\n}\n\ntype UpdateListener = (data: {\n apiList?: Array<{ apiId: number }>;\n apis?: ApiData[];\n}) => void;\n\nexport class FrameClient {\n private listeners = new Set<UpdateListener>();\n private connectionListeners = new Set<() => void>();\n private lastUpdate: {\n apiList?: Array<{ apiId: number }>;\n apis?: ApiData[];\n } = {};\n\n constructor() {\n this.setupMessageListener();\n }\n\n private setupMessageListener() {\n window.addEventListener(\"message\", (event) => {\n const message = event.data as UpdateMessage | HostConnectedMessage;\n\n if (message.type === \"update\") {\n this.lastUpdate = message.data;\n this.notifyListeners(message.data);\n } else if (message.type === \"host-connected\") {\n // Host has reconnected (page refresh), notify listeners to re-subscribe\n this.connectionListeners.forEach((listener) => listener());\n }\n });\n }\n\n onHostConnected(listener: () => void): () => void {\n this.connectionListeners.add(listener);\n return () => {\n this.connectionListeners.delete(listener);\n };\n }\n\n subscribe(listener: UpdateListener): () => void {\n this.listeners.add(listener);\n\n // Send the last update to the new listener\n if (this.lastUpdate.apiList || this.lastUpdate.apis) {\n listener(this.lastUpdate);\n }\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n setSubscription(options: { apiList?: boolean; apis?: number[] }) {\n window.parent.postMessage(\n {\n type: \"subscription\",\n data: options,\n },\n \"*\",\n );\n }\n\n clearEvents(apiId: number) {\n window.parent.postMessage(\n {\n type: \"clearEvents\",\n data: { apiId },\n },\n \"*\",\n );\n }\n\n private notifyListeners(data: UpdateMessage[\"data\"]) {\n this.listeners.forEach((listener) => listener(data));\n }\n\n getLastUpdate() {\n return this.lastUpdate;\n }\n}\n"],"mappings":";AAwBA,IAAa,cAAb,MAAyB;CACvB,4BAAoB,IAAI,IAAoB;CAC5C,sCAA8B,IAAI,IAAgB;CAClD,aAGI,CAAC;CAEL,cAAc;EACZ,KAAK,qBAAqB;CAC5B;CAEA,uBAA+B;EAC7B,OAAO,iBAAiB,YAAY,UAAU;GAC5C,MAAM,UAAU,MAAM;GAEtB,IAAI,QAAQ,SAAS,UAAU;IAC7B,KAAK,aAAa,QAAQ;IAC1B,KAAK,gBAAgB,QAAQ,IAAI;GACnC,OAAO,IAAI,QAAQ,SAAS,kBAE1B,KAAK,oBAAoB,SAAS,aAAa,SAAS,CAAC;EAE7D,CAAC;CACH;CAEA,gBAAgB,UAAkC;EAChD,KAAK,oBAAoB,IAAI,QAAQ;EACrC,aAAa;GACX,KAAK,oBAAoB,OAAO,QAAQ;EAC1C;CACF;CAEA,UAAU,UAAsC;EAC9C,KAAK,UAAU,IAAI,QAAQ;EAG3B,IAAI,KAAK,WAAW,WAAW,KAAK,WAAW,MAC7C,SAAS,KAAK,UAAU;EAG1B,aAAa;GACX,KAAK,UAAU,OAAO,QAAQ;EAChC;CACF;CAEA,gBAAgB,SAAiD;EAC/D,OAAO,OAAO,YACZ;GACE,MAAM;GACN,MAAM;EACR,GACA,GACF;CACF;CAEA,YAAY,OAAe;EACzB,OAAO,OAAO,YACZ;GACE,MAAM;GACN,MAAM,EAAE,MAAM;EAChB,GACA,GACF;CACF;CAEA,gBAAwB,MAA6B;EACnD,KAAK,UAAU,SAAS,aAAa,SAAS,IAAI,CAAC;CACrD;CAEA,gBAAgB;EACd,OAAO,KAAK;CACd;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"FrameHost.d.ts","names":[],"sources":["../src/FrameHost.ts"],"mappings":";cAEa,SAAA;EAAA,QACH,KAAA;EAAA,QACA,YAAA;EAAA,QACA,eAAA;cAEI,KAAA,EAAO,iBAAiB;EAmBpC,OAAA,CAAA;AAAA"}
1
+ {"version":3,"file":"FrameHost.d.ts","names":[],"sources":["../src/FrameHost.ts"],"mappings":";cAEa,SAAA;EAAA,QACH,KAAA;EAAA,QACA,YAAA;EAAA,QACA,eAAA;cAEI,KAAA,EAAO,iBAAiB;EAmBpC,OAAA;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/react-devtools",
3
- "version": "1.2.1",
3
+ "version": "1.2.2",
4
4
  "description": "React development tools for assistant-ui components",
5
5
  "keywords": [
6
6
  "assistant-ui",
@@ -30,8 +30,8 @@
30
30
  "zod": "^4.4.3"
31
31
  },
32
32
  "peerDependencies": {
33
- "@assistant-ui/react": "^0.14.8",
34
- "@assistant-ui/tap": "^0.5.12",
33
+ "@assistant-ui/react": "^0.14.12",
34
+ "@assistant-ui/tap": "^0.5.14",
35
35
  "@types/react": "*",
36
36
  "@types/react-dom": "*",
37
37
  "react": "^18 || ^19",
@@ -51,9 +51,9 @@
51
51
  "@types/react-dom": "^19.2.3",
52
52
  "react": "^19.2.6",
53
53
  "react-dom": "^19.2.6",
54
- "@assistant-ui/react": "0.14.8",
55
- "@assistant-ui/tap": "0.5.12",
56
- "@assistant-ui/x-buildutils": "0.0.9"
54
+ "@assistant-ui/react": "0.14.12",
55
+ "@assistant-ui/tap": "0.5.14",
56
+ "@assistant-ui/x-buildutils": "0.0.10"
57
57
  },
58
58
  "publishConfig": {
59
59
  "access": "public",
@@ -117,8 +117,6 @@ const DevToolsModalImpl = () => {
117
117
 
118
118
  {isOpen && (
119
119
  <>
120
- {/* biome-ignore lint/a11y/useKeyWithClickEvents: backdrop click is a convenience; keyboard users use the close button */}
121
- {/* biome-ignore lint/a11y/noStaticElementInteractions: backdrop overlay */}
122
120
  <div style={styles.backdrop} onClick={() => setIsOpen(false)} />
123
121
 
124
122
  <div style={styles.modal} data-devtools-modal>
@@ -43,7 +43,6 @@ export class FrameClient {
43
43
  this.notifyListeners(message.data);
44
44
  } else if (message.type === "host-connected") {
45
45
  // Host has reconnected (page refresh), notify listeners to re-subscribe
46
- // biome-ignore lint/suspicious/useIterableCallbackReturn: forEach callback intentionally has no return
47
46
  this.connectionListeners.forEach((listener) => listener());
48
47
  }
49
48
  });
@@ -90,7 +89,6 @@ export class FrameClient {
90
89
  }
91
90
 
92
91
  private notifyListeners(data: UpdateMessage["data"]) {
93
- // biome-ignore lint/suspicious/useIterableCallbackReturn: forEach callback intentionally has no return
94
92
  this.listeners.forEach((listener) => listener(data));
95
93
  }
96
94