@np-dev/ui-ai-anotation 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -21
- package/dist/cjs/index.cjs +247 -14
- package/dist/cjs/index.cjs.map +4 -4
- package/dist/cjs/index.native.cjs +11 -11
- package/dist/cjs/index.native.cjs.map +3 -3
- package/dist/cjs/index.web.cjs +5 -5
- package/dist/cjs/index.web.cjs.map +2 -2
- package/dist/esm/index.js +248 -14
- package/dist/esm/index.js.map +4 -4
- package/dist/esm/index.native.js +11 -11
- package/dist/esm/index.native.js.map +3 -3
- package/dist/esm/index.web.js +5 -5
- package/dist/esm/index.web.js.map +2 -2
- package/dist/types/components/ErrorBoundary.d.ts +159 -0
- package/dist/types/index.d.ts +5 -3
- package/dist/types/index.web.d.ts +2 -2
- package/dist/types/store.d.ts +2 -2
- package/package.json +1 -1
- package/src/components/AnnotationInput.tsx +2 -2
- package/src/components/AnnotationList.tsx +2 -2
- package/src/components/ErrorBoundary.tsx +426 -0
- package/src/components/Highlighter.tsx +2 -2
- package/src/components/Toolbar.tsx +4 -3
- package/src/components/native/AnnotationInput.tsx +2 -2
- package/src/components/native/AnnotationList.tsx +2 -2
- package/src/components/native/Highlighter.tsx +2 -2
- package/src/components/native/Toolbar.tsx +2 -2
- package/src/components/web/AnnotationInput.tsx +2 -2
- package/src/components/web/AnnotationList.tsx +2 -2
- package/src/components/web/Highlighter.tsx +2 -2
- package/src/components/web/Toolbar.tsx +2 -2
- package/src/extension.tsx +1 -1
- package/src/index.native.tsx +4 -4
- package/src/index.tsx +6 -4
- package/src/index.web.tsx +3 -3
- package/src/store.tsx +3 -3
package/dist/esm/index.native.js
CHANGED
|
@@ -53,14 +53,14 @@ function reducer(state, action) {
|
|
|
53
53
|
return state;
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
-
function
|
|
56
|
+
function AgentAnnotationProvider({ children }) {
|
|
57
57
|
const [state, dispatch] = useReducer(reducer, initialState);
|
|
58
58
|
return /* @__PURE__ */ jsx(AnnotationContext.Provider, { value: { state, dispatch }, children });
|
|
59
59
|
}
|
|
60
|
-
function
|
|
60
|
+
function useAgentAnnotation() {
|
|
61
61
|
const context = useContext(AnnotationContext);
|
|
62
62
|
if (!context) {
|
|
63
|
-
throw new Error("
|
|
63
|
+
throw new Error("useAgentAnnotation must be used within an AgentAnnotationProvider");
|
|
64
64
|
}
|
|
65
65
|
return context;
|
|
66
66
|
}
|
|
@@ -153,7 +153,7 @@ import {
|
|
|
153
153
|
} from "react-native";
|
|
154
154
|
import { jsx as jsx3, jsxs } from "react/jsx-runtime";
|
|
155
155
|
function AnnotationInput({ onClose, componentName }) {
|
|
156
|
-
const { dispatch } =
|
|
156
|
+
const { dispatch } = useAgentAnnotation();
|
|
157
157
|
const [note, setNote] = useState("");
|
|
158
158
|
const [fadeAnim] = useState(new Animated2.Value(0));
|
|
159
159
|
const [scaleAnim] = useState(new Animated2.Value(0.95));
|
|
@@ -357,7 +357,7 @@ var styles2 = StyleSheet2.create({
|
|
|
357
357
|
// src/components/native/Highlighter.tsx
|
|
358
358
|
import { Fragment, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
359
359
|
function Highlighter({ onInspect }) {
|
|
360
|
-
const { state, dispatch } =
|
|
360
|
+
const { state, dispatch } = useAgentAnnotation();
|
|
361
361
|
const { mode } = state;
|
|
362
362
|
const [highlightRect, setHighlightRect] = useState2(null);
|
|
363
363
|
const [componentName, setComponentName] = useState2("");
|
|
@@ -550,7 +550,7 @@ import {
|
|
|
550
550
|
} from "react-native";
|
|
551
551
|
import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
552
552
|
function AnnotationList() {
|
|
553
|
-
const { state, dispatch } =
|
|
553
|
+
const { state, dispatch } = useAgentAnnotation();
|
|
554
554
|
if (!state.showList) return null;
|
|
555
555
|
return /* @__PURE__ */ jsx5(
|
|
556
556
|
Modal2,
|
|
@@ -706,7 +706,7 @@ var copyToClipboard = async (text) => {
|
|
|
706
706
|
}
|
|
707
707
|
};
|
|
708
708
|
function Toolbar() {
|
|
709
|
-
const { state, dispatch } =
|
|
709
|
+
const { state, dispatch } = useAgentAnnotation();
|
|
710
710
|
const [showCopied, setShowCopied] = useState3(false);
|
|
711
711
|
const handleCopy = async () => {
|
|
712
712
|
const data = state.annotations.map((a) => ({
|
|
@@ -985,14 +985,14 @@ function isTauriEnv() {
|
|
|
985
985
|
|
|
986
986
|
// src/index.native.tsx
|
|
987
987
|
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
988
|
-
function
|
|
989
|
-
return /* @__PURE__ */ jsx7(
|
|
988
|
+
function AgentAnnotationProvider2({ children }) {
|
|
989
|
+
return /* @__PURE__ */ jsx7(AgentAnnotationProvider, { children: /* @__PURE__ */ jsxs5(View6, { style: { flex: 1 }, children: [
|
|
990
990
|
children,
|
|
991
991
|
/* @__PURE__ */ jsx7(Toolbar, {})
|
|
992
992
|
] }) });
|
|
993
993
|
}
|
|
994
994
|
export {
|
|
995
|
-
|
|
995
|
+
AgentAnnotationProvider2 as AgentAnnotationProvider,
|
|
996
996
|
AnnotationInput,
|
|
997
997
|
AnnotationList,
|
|
998
998
|
Draggable,
|
|
@@ -1007,6 +1007,6 @@ export {
|
|
|
1007
1007
|
isNative,
|
|
1008
1008
|
isTauriEnv,
|
|
1009
1009
|
isWeb,
|
|
1010
|
-
|
|
1010
|
+
useAgentAnnotation
|
|
1011
1011
|
};
|
|
1012
1012
|
//# sourceMappingURL=index.native.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.native.tsx", "../../src/store.tsx", "../../src/components/native/Toolbar.tsx", "../../src/components/native/Draggable.tsx", "../../src/components/native/Highlighter.tsx", "../../src/components/native/AnnotationInput.tsx", "../../src/components/native/AnnotationList.tsx", "../../src/utils/screenshot.native.ts", "../../src/utils/fiber.native.ts", "../../src/utils/platform.ts"],
|
|
4
|
-
"sourcesContent": ["import React from 'react';\nimport { View } from 'react-native';\nimport { AiAnnotationProvider as Provider } from './store';\nimport { Toolbar } from './components/native/Toolbar';\n\nexport interface AiAnnotationProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * React Native AI Annotation Provider\n * Wraps your app to provide annotation functionality\n */\nexport function AiAnnotationProvider({ children }: AiAnnotationProviderProps) {\n return (\n <Provider>\n <View style={{ flex: 1 }}>\n {children}\n <Toolbar />\n </View>\n </Provider>\n );\n}\n\n// Re-export store\nexport * from './store';\n\n// Export native components\nexport { Toolbar } from './components/native/Toolbar';\nexport { Highlighter } from './components/native/Highlighter';\nexport { AnnotationInput } from './components/native/AnnotationInput';\nexport { AnnotationList } from './components/native/AnnotationList';\nexport { Draggable } from './components/native/Draggable';\n\n// Export native screenshot utility\nexport { captureScreenshot } from './utils/screenshot.native';\nexport type { ScreenshotOptions, ScreenshotResult } from './utils/screenshot.native';\n\n// Export native fiber utilities\nexport {\n getReactFiber,\n getComponentDisplayName,\n getElementFromFiber,\n inspectComponent,\n} from './utils/fiber.native';\nexport type { ComponentInfo } from './utils/fiber.native';\n\n// Export platform utilities\nexport { isWeb, isNative, getPlatform, isTauriEnv } from './utils/platform';\nexport type { PlatformType } from './utils/platform';\n", "import React, { createContext, useContext, useReducer, ReactNode } from 'react';\nimport type { ComponentDetails, ChildComponentInfo, ElementInfo } from './utils/fiber';\n\n// Re-export types for external use\nexport type { ComponentDetails, ChildComponentInfo, ElementInfo };\n\nexport type Annotation = {\n id: string;\n componentName: string;\n note: string;\n timestamp: number;\n /** Enhanced component details (optional for backward compatibility) */\n details?: ComponentDetails;\n};\n\nexport type Mode = 'disabled' | 'inspecting';\n\n/**\n * Platform-agnostic element type\n * - On web: HTMLElement\n * - On native: View ref or null\n */\nexport type HoveredElement = any;\n\n/**\n * Enhanced component info with full details\n */\nexport interface HoveredComponentInfo {\n name: string;\n /** Full component details including hierarchy, children, and element info */\n details?: ComponentDetails;\n}\n\ninterface State {\n mode: Mode;\n annotations: Annotation[];\n hoveredElement: HoveredElement;\n hoveredComponentInfo: HoveredComponentInfo | null;\n isMinimized: boolean;\n showList: boolean;\n}\n\ntype Action =\n | { type: 'SET_MODE'; payload: Mode }\n | { type: 'ADD_ANNOTATION'; payload: Annotation }\n | { type: 'REMOVE_ANNOTATION'; payload: string }\n | { type: 'CLEAR_ALL_ANNOTATIONS' }\n | { type: 'SET_HOVERED'; payload: { element: HoveredElement; name: string | null; details?: ComponentDetails } }\n | { type: 'TOGGLE_MINIMIZED' }\n | { type: 'TOGGLE_LIST' }\n | { type: 'RESET_HOVER' };\n\nconst initialState: State = {\n mode: 'disabled',\n annotations: [],\n hoveredElement: null,\n hoveredComponentInfo: null,\n isMinimized: false,\n showList: false,\n};\n\nconst AnnotationContext = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n} | undefined>(undefined);\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'SET_MODE':\n return { ...state, mode: action.payload };\n case 'ADD_ANNOTATION':\n return { ...state, annotations: [...state.annotations, action.payload] };\n case 'REMOVE_ANNOTATION':\n return {\n ...state,\n annotations: state.annotations.filter((a) => a.id !== action.payload),\n };\n case 'CLEAR_ALL_ANNOTATIONS':\n return {\n ...state,\n annotations: [],\n };\n case 'SET_HOVERED':\n // Avoid updates if same\n if (state.hoveredElement === action.payload.element) return state;\n return {\n ...state,\n hoveredElement: action.payload.element,\n hoveredComponentInfo: action.payload.name\n ? { name: action.payload.name, details: action.payload.details }\n : null\n };\n case 'RESET_HOVER':\n return { ...state, hoveredElement: null, hoveredComponentInfo: null };\n case 'TOGGLE_MINIMIZED':\n return { ...state, isMinimized: !state.isMinimized };\n case 'TOGGLE_LIST':\n return { ...state, showList: !state.showList };\n default:\n return state;\n }\n}\n\nexport function AiAnnotationProvider({ children }: { children: ReactNode }) {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n return (\n <AnnotationContext.Provider value={{ state, dispatch }}>\n {children}\n </AnnotationContext.Provider>\n );\n}\n\nexport function useAiAnnotation() {\n const context = useContext(AnnotationContext);\n if (!context) {\n throw new Error('useAiAnnotation must be used within an AiAnnotationProvider');\n }\n return context;\n}\n", "import React, { useState } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n StyleSheet,\n Platform,\n} from 'react-native';\nimport { useAiAnnotation } from '../../store';\nimport { Draggable } from './Draggable';\nimport { Highlighter } from './Highlighter';\nimport { AnnotationList } from './AnnotationList';\n\n// Dynamic clipboard import to handle different React Native versions\nconst copyToClipboard = async (text: string) => {\n try {\n // Try expo-clipboard first\n const ExpoClipboard = await import('expo-clipboard');\n await ExpoClipboard.setStringAsync(text);\n } catch {\n try {\n // Fallback to @react-native-clipboard/clipboard\n const RNClipboard = await import('@react-native-clipboard/clipboard');\n RNClipboard.default.setString(text);\n } catch {\n console.warn('No clipboard module available');\n }\n }\n};\n\nexport function Toolbar() {\n const { state, dispatch } = useAiAnnotation();\n const [showCopied, setShowCopied] = useState(false);\n\n const handleCopy = async () => {\n const data = state.annotations.map((a) => ({\n component: a.componentName,\n instruction: a.note,\n }));\n const text = JSON.stringify(data, null, 2);\n\n await copyToClipboard(text);\n\n setShowCopied(true);\n setTimeout(() => setShowCopied(false), 2000);\n };\n\n const toggleMode = () => {\n dispatch({\n type: 'SET_MODE',\n payload: state.mode === 'disabled' ? 'inspecting' : 'disabled',\n });\n };\n\n const handleToggleMinimized = () => {\n dispatch({ type: 'TOGGLE_MINIMIZED' });\n };\n\n return (\n <>\n <Highlighter />\n <AnnotationList />\n <Draggable>\n <View style={styles.toolbar}>\n {/* Drag Handle */}\n <View style={styles.dragHandle}>\n <Text style={styles.dragHandleText}>\u22EE\u22EE</Text>\n </View>\n\n {!state.isMinimized && (\n <>\n <View style={styles.separator} />\n\n {/* Toggle inspection mode */}\n <TouchableOpacity\n style={[\n styles.button,\n state.mode === 'inspecting' && styles.buttonActive,\n ]}\n onPress={toggleMode}\n >\n <Text style={styles.buttonText}>\n {state.mode === 'inspecting' ? '\uD83D\uDC46' : '\uD83D\uDEAB'}\n </Text>\n </TouchableOpacity>\n\n {/* List annotations */}\n <TouchableOpacity\n style={styles.button}\n onPress={() => dispatch({ type: 'TOGGLE_LIST' })}\n >\n <Text style={styles.buttonText}>\uD83D\uDCCB</Text>\n {state.annotations.length > 0 && (\n <View style={styles.badge}>\n <Text style={styles.badgeText}>{state.annotations.length}</Text>\n </View>\n )}\n </TouchableOpacity>\n\n {/* Copy annotations */}\n <TouchableOpacity\n style={[styles.button, showCopied && styles.buttonSuccess]}\n onPress={handleCopy}\n >\n <Text style={styles.buttonText}>{showCopied ? '\u2713' : '\uD83D\uDCCB'}</Text>\n {showCopied && <Text style={styles.copiedText}>Copied!</Text>}\n </TouchableOpacity>\n </>\n )}\n\n <View style={styles.separator} />\n\n {/* Minimize/Expand */}\n <TouchableOpacity style={styles.button} onPress={handleToggleMinimized}>\n <Text style={styles.buttonText}>{state.isMinimized ? '\u2B1C' : '\u2796'}</Text>\n </TouchableOpacity>\n </View>\n </Draggable>\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n toolbar: {\n backgroundColor: '#1e1e1e',\n borderWidth: 1,\n borderColor: '#333',\n borderRadius: 8,\n padding: 8,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 12,\n elevation: 8,\n },\n dragHandle: {\n paddingHorizontal: 4,\n },\n dragHandleText: {\n color: '#666',\n fontSize: 16,\n },\n separator: {\n width: 1,\n height: 24,\n backgroundColor: '#333',\n },\n button: {\n width: 32,\n height: 32,\n borderRadius: 4,\n justifyContent: 'center',\n alignItems: 'center',\n position: 'relative',\n },\n buttonActive: {\n backgroundColor: '#3b82f6',\n },\n buttonSuccess: {\n backgroundColor: '#22c55e',\n flexDirection: 'row',\n width: 'auto',\n paddingHorizontal: 8,\n gap: 4,\n },\n buttonText: {\n fontSize: 16,\n },\n copiedText: {\n color: 'white',\n fontSize: 12,\n },\n badge: {\n position: 'absolute',\n top: -4,\n right: -4,\n backgroundColor: '#ef4444',\n borderRadius: 7,\n width: 14,\n height: 14,\n justifyContent: 'center',\n alignItems: 'center',\n },\n badgeText: {\n color: 'white',\n fontSize: 9,\n fontWeight: 'bold',\n },\n});\n", "import React, { useRef, ReactNode } from 'react';\nimport {\n View,\n PanResponder,\n Animated,\n StyleSheet,\n ViewStyle,\n GestureResponderEvent,\n PanResponderGestureState,\n} from 'react-native';\n\ninterface DraggableProps {\n children: ReactNode;\n initialPos?: { x: number; y: number };\n style?: ViewStyle;\n}\n\nexport function Draggable({ children, initialPos = { x: 20, y: 20 }, style }: DraggableProps) {\n const pan = useRef(new Animated.ValueXY(initialPos)).current;\n const lastOffset = useRef(initialPos);\n\n const panResponder = useRef(\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderGrant: () => {\n pan.setOffset(lastOffset.current);\n pan.setValue({ x: 0, y: 0 });\n },\n onPanResponderMove: Animated.event(\n [null, { dx: pan.x, dy: pan.y }],\n { useNativeDriver: false }\n ),\n onPanResponderRelease: (_e: GestureResponderEvent, gestureState: PanResponderGestureState) => {\n lastOffset.current = {\n x: lastOffset.current.x + gestureState.dx,\n y: lastOffset.current.y + gestureState.dy,\n };\n pan.flattenOffset();\n },\n })\n ).current;\n\n return (\n <Animated.View\n {...panResponder.panHandlers}\n style={[\n styles.container,\n style,\n {\n transform: [{ translateX: pan.x }, { translateY: pan.y }],\n },\n ]}\n >\n {children}\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n position: 'absolute',\n zIndex: 9999,\n },\n});\n", "import React, { useState, useCallback, useRef } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n StyleSheet,\n Dimensions,\n GestureResponderEvent,\n} from 'react-native';\nimport { useAiAnnotation } from '../../store';\nimport { AnnotationInput } from './AnnotationInput';\n\ninterface HighlightRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ninterface HighlighterProps {\n /**\n * Called when a touch occurs in inspection mode.\n * Return component info { name, rect } to highlight, or null to ignore.\n */\n onInspect?: (event: GestureResponderEvent) => {\n name: string;\n rect: HighlightRect;\n } | null;\n}\n\nexport function Highlighter({ onInspect }: HighlighterProps) {\n const { state, dispatch } = useAiAnnotation();\n const { mode } = state;\n\n const [highlightRect, setHighlightRect] = useState<HighlightRect | null>(null);\n const [componentName, setComponentName] = useState<string>('');\n const [showInput, setShowInput] = useState(false);\n const [showTooltip, setShowTooltip] = useState(false);\n const [tooltipPos, setTooltipPos] = useState({ x: 0, y: 0 });\n\n const screenDimensions = Dimensions.get('window');\n\n const handleTouch = useCallback(\n (event: GestureResponderEvent) => {\n if (mode !== 'inspecting') return;\n\n const { pageX, pageY } = event.nativeEvent;\n\n if (onInspect) {\n const result = onInspect(event);\n if (result) {\n setHighlightRect(result.rect);\n setComponentName(result.name);\n setTooltipPos({ x: pageX, y: pageY });\n setShowTooltip(true);\n return;\n }\n }\n\n // Default behavior: show tooltip at touch location\n setTooltipPos({ x: pageX, y: pageY });\n setShowTooltip(true);\n setComponentName('TouchedComponent');\n setHighlightRect({\n x: pageX - 50,\n y: pageY - 50,\n width: 100,\n height: 100,\n });\n },\n [mode, onInspect]\n );\n\n const handleAddAnnotation = () => {\n setShowInput(true);\n setShowTooltip(false);\n };\n\n const handleCloseInput = () => {\n setShowInput(false);\n setHighlightRect(null);\n setComponentName('');\n };\n\n const handleDismiss = () => {\n setShowTooltip(false);\n setHighlightRect(null);\n setComponentName('');\n };\n\n if (mode !== 'inspecting') return null;\n\n // Calculate tooltip position to keep it on screen\n const tooltipWidth = 120;\n const tooltipHeight = 50;\n let adjustedX = tooltipPos.x + 16;\n let adjustedY = tooltipPos.y + 16;\n\n if (adjustedX + tooltipWidth > screenDimensions.width) {\n adjustedX = tooltipPos.x - tooltipWidth - 16;\n }\n if (adjustedY + tooltipHeight > screenDimensions.height) {\n adjustedY = tooltipPos.y - tooltipHeight - 16;\n }\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\">\n {/* Touch capture overlay */}\n <TouchableOpacity\n style={styles.touchOverlay}\n activeOpacity={1}\n onPress={handleTouch}\n />\n\n {/* Highlight rectangle */}\n {highlightRect && (\n <>\n <View\n style={[\n styles.highlight,\n {\n left: highlightRect.x - 2,\n top: highlightRect.y - 2,\n width: highlightRect.width + 4,\n height: highlightRect.height + 4,\n },\n ]}\n pointerEvents=\"none\"\n />\n\n {/* Component name label */}\n {componentName && (\n <View\n style={[\n styles.nameLabel,\n {\n left: highlightRect.x,\n top: highlightRect.y - 24,\n },\n ]}\n pointerEvents=\"none\"\n >\n <Text style={styles.nameLabelText}>{componentName}</Text>\n </View>\n )}\n </>\n )}\n\n {/* Floating tooltip */}\n {showTooltip && (\n <View\n style={[\n styles.tooltip,\n {\n left: adjustedX,\n top: adjustedY,\n },\n ]}\n >\n <TouchableOpacity style={styles.tooltipButton} onPress={handleAddAnnotation}>\n <Text style={styles.tooltipButtonText}>+</Text>\n </TouchableOpacity>\n <TouchableOpacity style={styles.dismissButton} onPress={handleDismiss}>\n <Text style={styles.dismissButtonText}>\u2715</Text>\n </TouchableOpacity>\n </View>\n )}\n\n {/* Annotation input modal */}\n {showInput && (\n <AnnotationInput onClose={handleCloseInput} componentName={componentName || 'Unknown'} />\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n touchOverlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'transparent',\n },\n highlight: {\n position: 'absolute',\n borderWidth: 2,\n borderColor: '#3b82f6',\n borderRadius: 4,\n backgroundColor: 'rgba(59, 130, 246, 0.1)',\n },\n nameLabel: {\n position: 'absolute',\n backgroundColor: '#3b82f6',\n paddingHorizontal: 8,\n paddingVertical: 2,\n borderRadius: 4,\n },\n nameLabelText: {\n color: 'white',\n fontSize: 12,\n fontFamily: 'monospace',\n },\n tooltip: {\n position: 'absolute',\n flexDirection: 'row',\n gap: 6,\n padding: 6,\n backgroundColor: 'rgba(0, 0, 0, 0.9)',\n borderRadius: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 12,\n elevation: 8,\n },\n tooltipButton: {\n width: 32,\n height: 32,\n borderRadius: 6,\n backgroundColor: '#3b82f6',\n justifyContent: 'center',\n alignItems: 'center',\n },\n tooltipButtonText: {\n color: 'white',\n fontSize: 18,\n fontWeight: 'bold',\n },\n dismissButton: {\n width: 32,\n height: 32,\n borderRadius: 6,\n backgroundColor: '#6b7280',\n justifyContent: 'center',\n alignItems: 'center',\n },\n dismissButtonText: {\n color: 'white',\n fontSize: 14,\n },\n});\n", "import React, { useState, useEffect } from 'react';\nimport {\n View,\n Text,\n Modal,\n TextInput,\n TouchableOpacity,\n StyleSheet,\n Animated,\n KeyboardAvoidingView,\n Platform,\n} from 'react-native';\nimport { useAiAnnotation } from '../../store';\n\ninterface AnnotationInputProps {\n onClose: () => void;\n componentName: string;\n}\n\nexport function AnnotationInput({ onClose, componentName }: AnnotationInputProps) {\n const { dispatch } = useAiAnnotation();\n const [note, setNote] = useState('');\n const [fadeAnim] = useState(new Animated.Value(0));\n const [scaleAnim] = useState(new Animated.Value(0.95));\n\n useEffect(() => {\n Animated.parallel([\n Animated.timing(fadeAnim, {\n toValue: 1,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.spring(scaleAnim, {\n toValue: 1,\n friction: 8,\n useNativeDriver: true,\n }),\n ]).start();\n }, []);\n\n const handleClose = () => {\n Animated.parallel([\n Animated.timing(fadeAnim, {\n toValue: 0,\n duration: 150,\n useNativeDriver: true,\n }),\n Animated.timing(scaleAnim, {\n toValue: 0.95,\n duration: 150,\n useNativeDriver: true,\n }),\n ]).start(() => {\n onClose();\n });\n };\n\n const handleSubmit = () => {\n if (!note.trim()) return;\n\n dispatch({\n type: 'ADD_ANNOTATION',\n payload: {\n id: Date.now().toString(),\n componentName,\n note: note.trim(),\n timestamp: Date.now(),\n },\n });\n handleClose();\n };\n\n return (\n <Modal\n visible\n transparent\n animationType=\"none\"\n onRequestClose={handleClose}\n >\n <KeyboardAvoidingView\n behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n style={styles.keyboardView}\n >\n <Animated.View style={[styles.overlay, { opacity: fadeAnim }]}>\n <TouchableOpacity\n style={styles.backdropTouchable}\n activeOpacity={1}\n onPress={handleClose}\n >\n <Animated.View\n style={[\n styles.container,\n {\n opacity: fadeAnim,\n transform: [{ scale: scaleAnim }],\n },\n ]}\n >\n <TouchableOpacity activeOpacity={1}>\n <View style={styles.header}>\n <Text style={styles.title}>Add Annotation</Text>\n <TouchableOpacity onPress={handleClose} style={styles.closeButton}>\n <Text style={styles.closeButtonText}>\u2715</Text>\n </TouchableOpacity>\n </View>\n\n <Text style={styles.componentLabel}>\n Component: <Text style={styles.componentName}>{componentName}</Text>\n </Text>\n\n <TextInput\n style={styles.textInput}\n value={note}\n onChangeText={setNote}\n placeholder=\"Describe what this component does...\"\n placeholderTextColor=\"#6b7280\"\n multiline\n numberOfLines={4}\n textAlignVertical=\"top\"\n autoFocus\n />\n\n <View style={styles.buttonContainer}>\n <TouchableOpacity style={styles.cancelButton} onPress={handleClose}>\n <Text style={styles.cancelButtonText}>Cancel</Text>\n </TouchableOpacity>\n <TouchableOpacity style={styles.submitButton} onPress={handleSubmit}>\n <Text style={styles.submitButtonText}>Save Annotation</Text>\n </TouchableOpacity>\n </View>\n </TouchableOpacity>\n </Animated.View>\n </TouchableOpacity>\n </Animated.View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n keyboardView: {\n flex: 1,\n },\n overlay: {\n flex: 1,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n backdropTouchable: {\n flex: 1,\n width: '100%',\n justifyContent: 'center',\n alignItems: 'center',\n },\n container: {\n backgroundColor: '#1e1e1e',\n borderRadius: 8,\n padding: 20,\n width: '90%',\n maxWidth: 400,\n },\n header: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 16,\n },\n title: {\n color: '#e5e7eb',\n fontSize: 18,\n fontWeight: 'bold',\n },\n closeButton: {\n padding: 4,\n },\n closeButtonText: {\n color: '#e5e7eb',\n fontSize: 20,\n },\n componentLabel: {\n color: '#9ca3af',\n fontSize: 14,\n marginBottom: 12,\n },\n componentName: {\n color: '#e5e7eb',\n fontWeight: 'bold',\n },\n textInput: {\n backgroundColor: '#2d2d2d',\n borderWidth: 1,\n borderColor: '#404040',\n borderRadius: 4,\n padding: 8,\n color: 'white',\n height: 100,\n marginBottom: 16,\n fontSize: 14,\n },\n buttonContainer: {\n flexDirection: 'row',\n justifyContent: 'flex-end',\n gap: 8,\n },\n cancelButton: {\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#404040',\n },\n cancelButtonText: {\n color: 'white',\n fontSize: 14,\n },\n submitButton: {\n backgroundColor: '#3b82f6',\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 4,\n },\n submitButtonText: {\n color: 'white',\n fontSize: 14,\n },\n});\n", "import React from 'react';\nimport {\n View,\n Text,\n Modal,\n TouchableOpacity,\n ScrollView,\n StyleSheet,\n} from 'react-native';\nimport { useAiAnnotation } from '../../store';\n\nexport function AnnotationList() {\n const { state, dispatch } = useAiAnnotation();\n\n if (!state.showList) return null;\n\n return (\n <Modal\n visible={state.showList}\n transparent\n animationType=\"fade\"\n onRequestClose={() => dispatch({ type: 'TOGGLE_LIST' })}\n >\n <View style={styles.overlay}>\n <View style={styles.container}>\n <View style={styles.header}>\n <Text style={styles.title}>Annotations ({state.annotations.length})</Text>\n <View style={styles.headerActions}>\n {state.annotations.length > 0 && (\n <TouchableOpacity\n style={styles.clearButton}\n onPress={() => dispatch({ type: 'CLEAR_ALL_ANNOTATIONS' })}\n >\n <Text style={styles.clearButtonText}>Clear All</Text>\n </TouchableOpacity>\n )}\n <TouchableOpacity\n style={styles.closeButton}\n onPress={() => dispatch({ type: 'TOGGLE_LIST' })}\n >\n <Text style={styles.closeButtonText}>\u2715</Text>\n </TouchableOpacity>\n </View>\n </View>\n\n <ScrollView style={styles.listContainer}>\n {state.annotations.length === 0 ? (\n <Text style={styles.emptyText}>No annotations yet.</Text>\n ) : (\n state.annotations.map((ann) => (\n <View key={ann.id} style={styles.annotationItem}>\n <View style={styles.annotationContent}>\n <Text style={styles.componentName}>{ann.componentName}</Text>\n <Text style={styles.annotationNote}>{ann.note}</Text>\n </View>\n <TouchableOpacity\n style={styles.deleteButton}\n onPress={() => dispatch({ type: 'REMOVE_ANNOTATION', payload: ann.id })}\n >\n <Text style={styles.deleteButtonText}>\uD83D\uDDD1</Text>\n </TouchableOpacity>\n </View>\n ))\n )}\n </ScrollView>\n </View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n container: {\n backgroundColor: '#1e1e1e',\n borderRadius: 8,\n width: '90%',\n maxWidth: 500,\n maxHeight: '80%',\n padding: 20,\n },\n header: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 16,\n },\n title: {\n color: '#e5e7eb',\n fontSize: 18,\n fontWeight: 'bold',\n },\n headerActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n },\n clearButton: {\n backgroundColor: '#ef4444',\n paddingHorizontal: 12,\n paddingVertical: 6,\n borderRadius: 4,\n },\n clearButtonText: {\n color: 'white',\n fontSize: 12,\n },\n closeButton: {\n padding: 4,\n },\n closeButtonText: {\n color: '#e5e7eb',\n fontSize: 20,\n },\n listContainer: {\n flex: 1,\n },\n emptyText: {\n color: '#9ca3af',\n textAlign: 'center',\n padding: 20,\n },\n annotationItem: {\n backgroundColor: '#2d2d2d',\n padding: 12,\n borderRadius: 4,\n marginBottom: 8,\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n },\n annotationContent: {\n flex: 1,\n marginRight: 12,\n },\n componentName: {\n color: '#60a5fa',\n fontWeight: 'bold',\n fontSize: 14,\n marginBottom: 4,\n },\n annotationNote: {\n color: '#e5e7eb',\n fontSize: 14,\n },\n deleteButton: {\n padding: 4,\n },\n deleteButtonText: {\n fontSize: 16,\n },\n});\n", "import { RefObject } from 'react';\nimport { View, Platform } from 'react-native';\n\nexport interface ScreenshotOptions {\n /** Scale factor for higher resolution (default: 2) */\n scale?: number;\n /** Image format (default: 'png') */\n format?: 'png' | 'jpg';\n /** Quality for jpg format (0-1, default: 0.9) */\n quality?: number;\n /** Whether to copy to clipboard (default: true, requires expo-clipboard) */\n copyToClipboard?: boolean;\n /** Whether to save to camera roll (default: false, requires expo-media-library) */\n saveToCameraRoll?: boolean;\n}\n\nexport interface ScreenshotResult {\n success: boolean;\n uri?: string;\n base64?: string;\n error?: string;\n}\n\n/**\n * Captures a screenshot of a React Native View using react-native-view-shot\n * \n * Requirements:\n * - react-native-view-shot must be installed\n * - Optionally: expo-clipboard for clipboard support\n * - Optionally: expo-media-library for camera roll support\n * \n * @param viewRef - Reference to the View to capture\n * @param options - Screenshot options\n */\nexport async function captureScreenshot(\n viewRef: RefObject<View>,\n options: ScreenshotOptions = {}\n): Promise<ScreenshotResult> {\n const {\n scale = 2,\n format = 'png',\n quality = 0.9,\n copyToClipboard = false,\n saveToCameraRoll = false,\n } = options;\n\n try {\n // Dynamic import to avoid issues if not installed\n let captureRef: any;\n try {\n const viewShot = await import('react-native-view-shot');\n captureRef = viewShot.captureRef;\n } catch {\n return {\n success: false,\n error: 'react-native-view-shot is not installed. Run: npm install react-native-view-shot',\n };\n }\n\n if (!viewRef.current) {\n return {\n success: false,\n error: 'View reference is null',\n };\n }\n\n // Capture the view\n const uri = await captureRef(viewRef, {\n format,\n quality,\n result: 'tmpfile',\n snapshotContentContainer: false,\n });\n\n // Get base64 if needed\n let base64: string | undefined;\n if (copyToClipboard) {\n const base64Result = await captureRef(viewRef, {\n format,\n quality,\n result: 'base64',\n snapshotContentContainer: false,\n });\n base64 = base64Result;\n }\n\n // Copy to clipboard if requested\n if (copyToClipboard && base64) {\n try {\n const Clipboard = await import('expo-clipboard');\n // expo-clipboard doesn't support image directly, \n // we'll copy the base64 string\n await Clipboard.setStringAsync(base64);\n } catch {\n console.warn('expo-clipboard not available for clipboard support');\n }\n }\n\n // Save to camera roll if requested\n if (saveToCameraRoll) {\n try {\n const MediaLibrary = await import('expo-media-library');\n const { status } = await MediaLibrary.requestPermissionsAsync();\n if (status === 'granted') {\n await MediaLibrary.saveToLibraryAsync(uri);\n }\n } catch {\n console.warn('expo-media-library not available for saving to camera roll');\n }\n }\n\n return {\n success: true,\n uri,\n base64,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error('Screenshot capture failed:', message);\n return {\n success: false,\n error: message,\n };\n }\n}\n\n/**\n * Placeholder for web compatibility\n * The actual web implementation is in screenshot.ts\n */\nexport function captureScreenshotWeb(\n _element: any,\n _options: any\n): Promise<ScreenshotResult> {\n return Promise.resolve({\n success: false,\n error: 'Use the web-specific captureScreenshot function',\n });\n}\n", "/**\n * React Fiber utilities for React Native\n * \n * Note: React Native has different fiber access compared to web.\n * These utilities provide a similar interface but with native-specific logic.\n */\n\n/**\n * Attempts to get the React Fiber from a native view instance\n * This is less reliable in React Native than on web\n */\nexport function getReactFiber(instance: any): any {\n if (!instance) return null;\n \n // React Native stores fiber differently\n // Try to find the fiber via internal props\n const key = Object.keys(instance).find((k) =>\n k.startsWith('__reactFiber$') || \n k.startsWith('__reactInternalInstance$') ||\n k.startsWith('_reactInternals')\n );\n \n return key ? instance[key] : null;\n}\n\n/**\n * Gets the display name of a React component from its fiber\n */\nexport function getComponentDisplayName(fiber: any): string {\n if (!fiber) return 'Unknown';\n \n let curr = fiber;\n while (curr) {\n const type = curr.type;\n if (type) {\n // Check for displayName or name\n const name = type.displayName || type.name;\n if (name && typeof name === 'string') {\n // Skip internal React Native components\n if (!name.startsWith('RCT') && !name.startsWith('_')) {\n return name;\n }\n }\n }\n curr = curr.return;\n }\n return 'Unknown';\n}\n\n/**\n * For React Native, we can't easily get DOM elements from fibers\n * This is a no-op that returns null\n */\nexport function getElementFromFiber(_fiber: any): null {\n return null;\n}\n\n/**\n * Interface for component inspection result\n */\nexport interface ComponentInfo {\n name: string;\n props?: Record<string, any>;\n}\n\n/**\n * Inspects a React Native component instance to get info\n * This works with refs passed to components\n */\nexport function inspectComponent(ref: any): ComponentInfo | null {\n if (!ref) return null;\n \n // Try to get fiber from the ref\n const fiber = getReactFiber(ref);\n if (fiber) {\n return {\n name: getComponentDisplayName(fiber),\n props: fiber.memoizedProps,\n };\n }\n \n // Fallback: try to infer from the ref itself\n if (ref.constructor && ref.constructor.name) {\n return {\n name: ref.constructor.name,\n };\n }\n \n return null;\n}\n", "/**\n * Platform detection utilities for cross-platform support\n */\n\n// Check if we're running in a web environment\nexport const isWeb = typeof document !== 'undefined' && typeof window !== 'undefined';\n\n// Check if we're running in React Native\n// We check for the absence of DOM and presence of native-specific globals\nexport const isNative = !isWeb && typeof global !== 'undefined';\n\n// Get the current platform\nexport type PlatformType = 'web' | 'ios' | 'android' | 'native';\n\nexport function getPlatform(): PlatformType {\n if (isWeb) return 'web';\n \n // In React Native, we need to dynamically check Platform\n try {\n // This will only work in React Native environment\n const { Platform } = require('react-native');\n if (Platform.OS === 'ios') return 'ios';\n if (Platform.OS === 'android') return 'android';\n return 'native';\n } catch {\n return 'native';\n }\n}\n\n// Check if running in Tauri environment (web only)\nexport function isTauriEnv(): boolean {\n return isWeb && typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["View", "useState", "View", "Text", "TouchableOpacity", "StyleSheet", "jsx", "useState", "View", "Text", "TouchableOpacity", "StyleSheet", "View", "StyleSheet", "Animated", "jsx", "Animated", "styles", "View", "StyleSheet", "jsx", "jsxs", "useState", "View", "StyleSheet", "TouchableOpacity", "styles", "Text", "View", "Text", "Modal", "TouchableOpacity", "StyleSheet", "jsx", "jsxs", "Modal", "View", "styles", "Text", "TouchableOpacity", "StyleSheet", "Fragment", "jsx", "jsxs", "useState", "View", "styles", "Text", "TouchableOpacity", "StyleSheet", "copyToClipboard", "Platform", "jsx", "jsxs", "
|
|
4
|
+
"sourcesContent": ["import React from 'react';\nimport { View } from 'react-native';\nimport { AgentAnnotationProvider as Provider } from './store';\nimport { Toolbar } from './components/native/Toolbar';\n\nexport interface AgentAnnotationProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * React Native Agent Annotation Provider\n * Wraps your app to provide annotation functionality\n */\nexport function AgentAnnotationProvider({ children }: AgentAnnotationProviderProps) {\n return (\n <Provider>\n <View style={{ flex: 1 }}>\n {children}\n <Toolbar />\n </View>\n </Provider>\n );\n}\n\n// Re-export store\nexport * from './store';\n\n// Export native components\nexport { Toolbar } from './components/native/Toolbar';\nexport { Highlighter } from './components/native/Highlighter';\nexport { AnnotationInput } from './components/native/AnnotationInput';\nexport { AnnotationList } from './components/native/AnnotationList';\nexport { Draggable } from './components/native/Draggable';\n\n// Export native screenshot utility\nexport { captureScreenshot } from './utils/screenshot.native';\nexport type { ScreenshotOptions, ScreenshotResult } from './utils/screenshot.native';\n\n// Export native fiber utilities\nexport {\n getReactFiber,\n getComponentDisplayName,\n getElementFromFiber,\n inspectComponent,\n} from './utils/fiber.native';\nexport type { ComponentInfo } from './utils/fiber.native';\n\n// Export platform utilities\nexport { isWeb, isNative, getPlatform, isTauriEnv } from './utils/platform';\nexport type { PlatformType } from './utils/platform';\n", "import React, { createContext, useContext, useReducer, ReactNode } from 'react';\nimport type { ComponentDetails, ChildComponentInfo, ElementInfo } from './utils/fiber';\n\n// Re-export types for external use\nexport type { ComponentDetails, ChildComponentInfo, ElementInfo };\n\nexport type Annotation = {\n id: string;\n componentName: string;\n note: string;\n timestamp: number;\n /** Enhanced component details (optional for backward compatibility) */\n details?: ComponentDetails;\n};\n\nexport type Mode = 'disabled' | 'inspecting';\n\n/**\n * Platform-agnostic element type\n * - On web: HTMLElement\n * - On native: View ref or null\n */\nexport type HoveredElement = any;\n\n/**\n * Enhanced component info with full details\n */\nexport interface HoveredComponentInfo {\n name: string;\n /** Full component details including hierarchy, children, and element info */\n details?: ComponentDetails;\n}\n\ninterface State {\n mode: Mode;\n annotations: Annotation[];\n hoveredElement: HoveredElement;\n hoveredComponentInfo: HoveredComponentInfo | null;\n isMinimized: boolean;\n showList: boolean;\n}\n\ntype Action =\n | { type: 'SET_MODE'; payload: Mode }\n | { type: 'ADD_ANNOTATION'; payload: Annotation }\n | { type: 'REMOVE_ANNOTATION'; payload: string }\n | { type: 'CLEAR_ALL_ANNOTATIONS' }\n | { type: 'SET_HOVERED'; payload: { element: HoveredElement; name: string | null; details?: ComponentDetails } }\n | { type: 'TOGGLE_MINIMIZED' }\n | { type: 'TOGGLE_LIST' }\n | { type: 'RESET_HOVER' };\n\nconst initialState: State = {\n mode: 'disabled',\n annotations: [],\n hoveredElement: null,\n hoveredComponentInfo: null,\n isMinimized: false,\n showList: false,\n};\n\nconst AnnotationContext = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n} | undefined>(undefined);\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'SET_MODE':\n return { ...state, mode: action.payload };\n case 'ADD_ANNOTATION':\n return { ...state, annotations: [...state.annotations, action.payload] };\n case 'REMOVE_ANNOTATION':\n return {\n ...state,\n annotations: state.annotations.filter((a) => a.id !== action.payload),\n };\n case 'CLEAR_ALL_ANNOTATIONS':\n return {\n ...state,\n annotations: [],\n };\n case 'SET_HOVERED':\n // Avoid updates if same\n if (state.hoveredElement === action.payload.element) return state;\n return {\n ...state,\n hoveredElement: action.payload.element,\n hoveredComponentInfo: action.payload.name\n ? { name: action.payload.name, details: action.payload.details }\n : null\n };\n case 'RESET_HOVER':\n return { ...state, hoveredElement: null, hoveredComponentInfo: null };\n case 'TOGGLE_MINIMIZED':\n return { ...state, isMinimized: !state.isMinimized };\n case 'TOGGLE_LIST':\n return { ...state, showList: !state.showList };\n default:\n return state;\n }\n}\n\nexport function AgentAnnotationProvider({ children }: { children: ReactNode }) {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n return (\n <AnnotationContext.Provider value={{ state, dispatch }}>\n {children}\n </AnnotationContext.Provider>\n );\n}\n\nexport function useAgentAnnotation() {\n const context = useContext(AnnotationContext);\n if (!context) {\n throw new Error('useAgentAnnotation must be used within an AgentAnnotationProvider');\n }\n return context;\n}\n", "import React, { useState } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n StyleSheet,\n Platform,\n} from 'react-native';\nimport { useAgentAnnotation } from '../../store';\nimport { Draggable } from './Draggable';\nimport { Highlighter } from './Highlighter';\nimport { AnnotationList } from './AnnotationList';\n\n// Dynamic clipboard import to handle different React Native versions\nconst copyToClipboard = async (text: string) => {\n try {\n // Try expo-clipboard first\n const ExpoClipboard = await import('expo-clipboard');\n await ExpoClipboard.setStringAsync(text);\n } catch {\n try {\n // Fallback to @react-native-clipboard/clipboard\n const RNClipboard = await import('@react-native-clipboard/clipboard');\n RNClipboard.default.setString(text);\n } catch {\n console.warn('No clipboard module available');\n }\n }\n};\n\nexport function Toolbar() {\n const { state, dispatch } = useAgentAnnotation();\n const [showCopied, setShowCopied] = useState(false);\n\n const handleCopy = async () => {\n const data = state.annotations.map((a) => ({\n component: a.componentName,\n instruction: a.note,\n }));\n const text = JSON.stringify(data, null, 2);\n\n await copyToClipboard(text);\n\n setShowCopied(true);\n setTimeout(() => setShowCopied(false), 2000);\n };\n\n const toggleMode = () => {\n dispatch({\n type: 'SET_MODE',\n payload: state.mode === 'disabled' ? 'inspecting' : 'disabled',\n });\n };\n\n const handleToggleMinimized = () => {\n dispatch({ type: 'TOGGLE_MINIMIZED' });\n };\n\n return (\n <>\n <Highlighter />\n <AnnotationList />\n <Draggable>\n <View style={styles.toolbar}>\n {/* Drag Handle */}\n <View style={styles.dragHandle}>\n <Text style={styles.dragHandleText}>\u22EE\u22EE</Text>\n </View>\n\n {!state.isMinimized && (\n <>\n <View style={styles.separator} />\n\n {/* Toggle inspection mode */}\n <TouchableOpacity\n style={[\n styles.button,\n state.mode === 'inspecting' && styles.buttonActive,\n ]}\n onPress={toggleMode}\n >\n <Text style={styles.buttonText}>\n {state.mode === 'inspecting' ? '\uD83D\uDC46' : '\uD83D\uDEAB'}\n </Text>\n </TouchableOpacity>\n\n {/* List annotations */}\n <TouchableOpacity\n style={styles.button}\n onPress={() => dispatch({ type: 'TOGGLE_LIST' })}\n >\n <Text style={styles.buttonText}>\uD83D\uDCCB</Text>\n {state.annotations.length > 0 && (\n <View style={styles.badge}>\n <Text style={styles.badgeText}>{state.annotations.length}</Text>\n </View>\n )}\n </TouchableOpacity>\n\n {/* Copy annotations */}\n <TouchableOpacity\n style={[styles.button, showCopied && styles.buttonSuccess]}\n onPress={handleCopy}\n >\n <Text style={styles.buttonText}>{showCopied ? '\u2713' : '\uD83D\uDCCB'}</Text>\n {showCopied && <Text style={styles.copiedText}>Copied!</Text>}\n </TouchableOpacity>\n </>\n )}\n\n <View style={styles.separator} />\n\n {/* Minimize/Expand */}\n <TouchableOpacity style={styles.button} onPress={handleToggleMinimized}>\n <Text style={styles.buttonText}>{state.isMinimized ? '\u2B1C' : '\u2796'}</Text>\n </TouchableOpacity>\n </View>\n </Draggable>\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n toolbar: {\n backgroundColor: '#1e1e1e',\n borderWidth: 1,\n borderColor: '#333',\n borderRadius: 8,\n padding: 8,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 12,\n elevation: 8,\n },\n dragHandle: {\n paddingHorizontal: 4,\n },\n dragHandleText: {\n color: '#666',\n fontSize: 16,\n },\n separator: {\n width: 1,\n height: 24,\n backgroundColor: '#333',\n },\n button: {\n width: 32,\n height: 32,\n borderRadius: 4,\n justifyContent: 'center',\n alignItems: 'center',\n position: 'relative',\n },\n buttonActive: {\n backgroundColor: '#3b82f6',\n },\n buttonSuccess: {\n backgroundColor: '#22c55e',\n flexDirection: 'row',\n width: 'auto',\n paddingHorizontal: 8,\n gap: 4,\n },\n buttonText: {\n fontSize: 16,\n },\n copiedText: {\n color: 'white',\n fontSize: 12,\n },\n badge: {\n position: 'absolute',\n top: -4,\n right: -4,\n backgroundColor: '#ef4444',\n borderRadius: 7,\n width: 14,\n height: 14,\n justifyContent: 'center',\n alignItems: 'center',\n },\n badgeText: {\n color: 'white',\n fontSize: 9,\n fontWeight: 'bold',\n },\n});\n", "import React, { useRef, ReactNode } from 'react';\nimport {\n View,\n PanResponder,\n Animated,\n StyleSheet,\n ViewStyle,\n GestureResponderEvent,\n PanResponderGestureState,\n} from 'react-native';\n\ninterface DraggableProps {\n children: ReactNode;\n initialPos?: { x: number; y: number };\n style?: ViewStyle;\n}\n\nexport function Draggable({ children, initialPos = { x: 20, y: 20 }, style }: DraggableProps) {\n const pan = useRef(new Animated.ValueXY(initialPos)).current;\n const lastOffset = useRef(initialPos);\n\n const panResponder = useRef(\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderGrant: () => {\n pan.setOffset(lastOffset.current);\n pan.setValue({ x: 0, y: 0 });\n },\n onPanResponderMove: Animated.event(\n [null, { dx: pan.x, dy: pan.y }],\n { useNativeDriver: false }\n ),\n onPanResponderRelease: (_e: GestureResponderEvent, gestureState: PanResponderGestureState) => {\n lastOffset.current = {\n x: lastOffset.current.x + gestureState.dx,\n y: lastOffset.current.y + gestureState.dy,\n };\n pan.flattenOffset();\n },\n })\n ).current;\n\n return (\n <Animated.View\n {...panResponder.panHandlers}\n style={[\n styles.container,\n style,\n {\n transform: [{ translateX: pan.x }, { translateY: pan.y }],\n },\n ]}\n >\n {children}\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n position: 'absolute',\n zIndex: 9999,\n },\n});\n", "import React, { useState, useCallback, useRef } from 'react';\nimport {\n View,\n Text,\n TouchableOpacity,\n StyleSheet,\n Dimensions,\n GestureResponderEvent,\n} from 'react-native';\nimport { useAgentAnnotation } from '../../store';\nimport { AnnotationInput } from './AnnotationInput';\n\ninterface HighlightRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ninterface HighlighterProps {\n /**\n * Called when a touch occurs in inspection mode.\n * Return component info { name, rect } to highlight, or null to ignore.\n */\n onInspect?: (event: GestureResponderEvent) => {\n name: string;\n rect: HighlightRect;\n } | null;\n}\n\nexport function Highlighter({ onInspect }: HighlighterProps) {\n const { state, dispatch } = useAgentAnnotation();\n const { mode } = state;\n\n const [highlightRect, setHighlightRect] = useState<HighlightRect | null>(null);\n const [componentName, setComponentName] = useState<string>('');\n const [showInput, setShowInput] = useState(false);\n const [showTooltip, setShowTooltip] = useState(false);\n const [tooltipPos, setTooltipPos] = useState({ x: 0, y: 0 });\n\n const screenDimensions = Dimensions.get('window');\n\n const handleTouch = useCallback(\n (event: GestureResponderEvent) => {\n if (mode !== 'inspecting') return;\n\n const { pageX, pageY } = event.nativeEvent;\n\n if (onInspect) {\n const result = onInspect(event);\n if (result) {\n setHighlightRect(result.rect);\n setComponentName(result.name);\n setTooltipPos({ x: pageX, y: pageY });\n setShowTooltip(true);\n return;\n }\n }\n\n // Default behavior: show tooltip at touch location\n setTooltipPos({ x: pageX, y: pageY });\n setShowTooltip(true);\n setComponentName('TouchedComponent');\n setHighlightRect({\n x: pageX - 50,\n y: pageY - 50,\n width: 100,\n height: 100,\n });\n },\n [mode, onInspect]\n );\n\n const handleAddAnnotation = () => {\n setShowInput(true);\n setShowTooltip(false);\n };\n\n const handleCloseInput = () => {\n setShowInput(false);\n setHighlightRect(null);\n setComponentName('');\n };\n\n const handleDismiss = () => {\n setShowTooltip(false);\n setHighlightRect(null);\n setComponentName('');\n };\n\n if (mode !== 'inspecting') return null;\n\n // Calculate tooltip position to keep it on screen\n const tooltipWidth = 120;\n const tooltipHeight = 50;\n let adjustedX = tooltipPos.x + 16;\n let adjustedY = tooltipPos.y + 16;\n\n if (adjustedX + tooltipWidth > screenDimensions.width) {\n adjustedX = tooltipPos.x - tooltipWidth - 16;\n }\n if (adjustedY + tooltipHeight > screenDimensions.height) {\n adjustedY = tooltipPos.y - tooltipHeight - 16;\n }\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\">\n {/* Touch capture overlay */}\n <TouchableOpacity\n style={styles.touchOverlay}\n activeOpacity={1}\n onPress={handleTouch}\n />\n\n {/* Highlight rectangle */}\n {highlightRect && (\n <>\n <View\n style={[\n styles.highlight,\n {\n left: highlightRect.x - 2,\n top: highlightRect.y - 2,\n width: highlightRect.width + 4,\n height: highlightRect.height + 4,\n },\n ]}\n pointerEvents=\"none\"\n />\n\n {/* Component name label */}\n {componentName && (\n <View\n style={[\n styles.nameLabel,\n {\n left: highlightRect.x,\n top: highlightRect.y - 24,\n },\n ]}\n pointerEvents=\"none\"\n >\n <Text style={styles.nameLabelText}>{componentName}</Text>\n </View>\n )}\n </>\n )}\n\n {/* Floating tooltip */}\n {showTooltip && (\n <View\n style={[\n styles.tooltip,\n {\n left: adjustedX,\n top: adjustedY,\n },\n ]}\n >\n <TouchableOpacity style={styles.tooltipButton} onPress={handleAddAnnotation}>\n <Text style={styles.tooltipButtonText}>+</Text>\n </TouchableOpacity>\n <TouchableOpacity style={styles.dismissButton} onPress={handleDismiss}>\n <Text style={styles.dismissButtonText}>\u2715</Text>\n </TouchableOpacity>\n </View>\n )}\n\n {/* Annotation input modal */}\n {showInput && (\n <AnnotationInput onClose={handleCloseInput} componentName={componentName || 'Unknown'} />\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n touchOverlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'transparent',\n },\n highlight: {\n position: 'absolute',\n borderWidth: 2,\n borderColor: '#3b82f6',\n borderRadius: 4,\n backgroundColor: 'rgba(59, 130, 246, 0.1)',\n },\n nameLabel: {\n position: 'absolute',\n backgroundColor: '#3b82f6',\n paddingHorizontal: 8,\n paddingVertical: 2,\n borderRadius: 4,\n },\n nameLabelText: {\n color: 'white',\n fontSize: 12,\n fontFamily: 'monospace',\n },\n tooltip: {\n position: 'absolute',\n flexDirection: 'row',\n gap: 6,\n padding: 6,\n backgroundColor: 'rgba(0, 0, 0, 0.9)',\n borderRadius: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.3,\n shadowRadius: 12,\n elevation: 8,\n },\n tooltipButton: {\n width: 32,\n height: 32,\n borderRadius: 6,\n backgroundColor: '#3b82f6',\n justifyContent: 'center',\n alignItems: 'center',\n },\n tooltipButtonText: {\n color: 'white',\n fontSize: 18,\n fontWeight: 'bold',\n },\n dismissButton: {\n width: 32,\n height: 32,\n borderRadius: 6,\n backgroundColor: '#6b7280',\n justifyContent: 'center',\n alignItems: 'center',\n },\n dismissButtonText: {\n color: 'white',\n fontSize: 14,\n },\n});\n", "import React, { useState, useEffect } from 'react';\nimport {\n View,\n Text,\n Modal,\n TextInput,\n TouchableOpacity,\n StyleSheet,\n Animated,\n KeyboardAvoidingView,\n Platform,\n} from 'react-native';\nimport { useAgentAnnotation } from '../../store';\n\ninterface AnnotationInputProps {\n onClose: () => void;\n componentName: string;\n}\n\nexport function AnnotationInput({ onClose, componentName }: AnnotationInputProps) {\n const { dispatch } = useAgentAnnotation();\n const [note, setNote] = useState('');\n const [fadeAnim] = useState(new Animated.Value(0));\n const [scaleAnim] = useState(new Animated.Value(0.95));\n\n useEffect(() => {\n Animated.parallel([\n Animated.timing(fadeAnim, {\n toValue: 1,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.spring(scaleAnim, {\n toValue: 1,\n friction: 8,\n useNativeDriver: true,\n }),\n ]).start();\n }, []);\n\n const handleClose = () => {\n Animated.parallel([\n Animated.timing(fadeAnim, {\n toValue: 0,\n duration: 150,\n useNativeDriver: true,\n }),\n Animated.timing(scaleAnim, {\n toValue: 0.95,\n duration: 150,\n useNativeDriver: true,\n }),\n ]).start(() => {\n onClose();\n });\n };\n\n const handleSubmit = () => {\n if (!note.trim()) return;\n\n dispatch({\n type: 'ADD_ANNOTATION',\n payload: {\n id: Date.now().toString(),\n componentName,\n note: note.trim(),\n timestamp: Date.now(),\n },\n });\n handleClose();\n };\n\n return (\n <Modal\n visible\n transparent\n animationType=\"none\"\n onRequestClose={handleClose}\n >\n <KeyboardAvoidingView\n behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n style={styles.keyboardView}\n >\n <Animated.View style={[styles.overlay, { opacity: fadeAnim }]}>\n <TouchableOpacity\n style={styles.backdropTouchable}\n activeOpacity={1}\n onPress={handleClose}\n >\n <Animated.View\n style={[\n styles.container,\n {\n opacity: fadeAnim,\n transform: [{ scale: scaleAnim }],\n },\n ]}\n >\n <TouchableOpacity activeOpacity={1}>\n <View style={styles.header}>\n <Text style={styles.title}>Add Annotation</Text>\n <TouchableOpacity onPress={handleClose} style={styles.closeButton}>\n <Text style={styles.closeButtonText}>\u2715</Text>\n </TouchableOpacity>\n </View>\n\n <Text style={styles.componentLabel}>\n Component: <Text style={styles.componentName}>{componentName}</Text>\n </Text>\n\n <TextInput\n style={styles.textInput}\n value={note}\n onChangeText={setNote}\n placeholder=\"Describe what this component does...\"\n placeholderTextColor=\"#6b7280\"\n multiline\n numberOfLines={4}\n textAlignVertical=\"top\"\n autoFocus\n />\n\n <View style={styles.buttonContainer}>\n <TouchableOpacity style={styles.cancelButton} onPress={handleClose}>\n <Text style={styles.cancelButtonText}>Cancel</Text>\n </TouchableOpacity>\n <TouchableOpacity style={styles.submitButton} onPress={handleSubmit}>\n <Text style={styles.submitButtonText}>Save Annotation</Text>\n </TouchableOpacity>\n </View>\n </TouchableOpacity>\n </Animated.View>\n </TouchableOpacity>\n </Animated.View>\n </KeyboardAvoidingView>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n keyboardView: {\n flex: 1,\n },\n overlay: {\n flex: 1,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n backdropTouchable: {\n flex: 1,\n width: '100%',\n justifyContent: 'center',\n alignItems: 'center',\n },\n container: {\n backgroundColor: '#1e1e1e',\n borderRadius: 8,\n padding: 20,\n width: '90%',\n maxWidth: 400,\n },\n header: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 16,\n },\n title: {\n color: '#e5e7eb',\n fontSize: 18,\n fontWeight: 'bold',\n },\n closeButton: {\n padding: 4,\n },\n closeButtonText: {\n color: '#e5e7eb',\n fontSize: 20,\n },\n componentLabel: {\n color: '#9ca3af',\n fontSize: 14,\n marginBottom: 12,\n },\n componentName: {\n color: '#e5e7eb',\n fontWeight: 'bold',\n },\n textInput: {\n backgroundColor: '#2d2d2d',\n borderWidth: 1,\n borderColor: '#404040',\n borderRadius: 4,\n padding: 8,\n color: 'white',\n height: 100,\n marginBottom: 16,\n fontSize: 14,\n },\n buttonContainer: {\n flexDirection: 'row',\n justifyContent: 'flex-end',\n gap: 8,\n },\n cancelButton: {\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 4,\n borderWidth: 1,\n borderColor: '#404040',\n },\n cancelButtonText: {\n color: 'white',\n fontSize: 14,\n },\n submitButton: {\n backgroundColor: '#3b82f6',\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 4,\n },\n submitButtonText: {\n color: 'white',\n fontSize: 14,\n },\n});\n", "import React from 'react';\nimport {\n View,\n Text,\n Modal,\n TouchableOpacity,\n ScrollView,\n StyleSheet,\n} from 'react-native';\nimport { useAgentAnnotation } from '../../store';\n\nexport function AnnotationList() {\n const { state, dispatch } = useAgentAnnotation();\n\n if (!state.showList) return null;\n\n return (\n <Modal\n visible={state.showList}\n transparent\n animationType=\"fade\"\n onRequestClose={() => dispatch({ type: 'TOGGLE_LIST' })}\n >\n <View style={styles.overlay}>\n <View style={styles.container}>\n <View style={styles.header}>\n <Text style={styles.title}>Annotations ({state.annotations.length})</Text>\n <View style={styles.headerActions}>\n {state.annotations.length > 0 && (\n <TouchableOpacity\n style={styles.clearButton}\n onPress={() => dispatch({ type: 'CLEAR_ALL_ANNOTATIONS' })}\n >\n <Text style={styles.clearButtonText}>Clear All</Text>\n </TouchableOpacity>\n )}\n <TouchableOpacity\n style={styles.closeButton}\n onPress={() => dispatch({ type: 'TOGGLE_LIST' })}\n >\n <Text style={styles.closeButtonText}>\u2715</Text>\n </TouchableOpacity>\n </View>\n </View>\n\n <ScrollView style={styles.listContainer}>\n {state.annotations.length === 0 ? (\n <Text style={styles.emptyText}>No annotations yet.</Text>\n ) : (\n state.annotations.map((ann) => (\n <View key={ann.id} style={styles.annotationItem}>\n <View style={styles.annotationContent}>\n <Text style={styles.componentName}>{ann.componentName}</Text>\n <Text style={styles.annotationNote}>{ann.note}</Text>\n </View>\n <TouchableOpacity\n style={styles.deleteButton}\n onPress={() => dispatch({ type: 'REMOVE_ANNOTATION', payload: ann.id })}\n >\n <Text style={styles.deleteButtonText}>\uD83D\uDDD1</Text>\n </TouchableOpacity>\n </View>\n ))\n )}\n </ScrollView>\n </View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n container: {\n backgroundColor: '#1e1e1e',\n borderRadius: 8,\n width: '90%',\n maxWidth: 500,\n maxHeight: '80%',\n padding: 20,\n },\n header: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 16,\n },\n title: {\n color: '#e5e7eb',\n fontSize: 18,\n fontWeight: 'bold',\n },\n headerActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n },\n clearButton: {\n backgroundColor: '#ef4444',\n paddingHorizontal: 12,\n paddingVertical: 6,\n borderRadius: 4,\n },\n clearButtonText: {\n color: 'white',\n fontSize: 12,\n },\n closeButton: {\n padding: 4,\n },\n closeButtonText: {\n color: '#e5e7eb',\n fontSize: 20,\n },\n listContainer: {\n flex: 1,\n },\n emptyText: {\n color: '#9ca3af',\n textAlign: 'center',\n padding: 20,\n },\n annotationItem: {\n backgroundColor: '#2d2d2d',\n padding: 12,\n borderRadius: 4,\n marginBottom: 8,\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n },\n annotationContent: {\n flex: 1,\n marginRight: 12,\n },\n componentName: {\n color: '#60a5fa',\n fontWeight: 'bold',\n fontSize: 14,\n marginBottom: 4,\n },\n annotationNote: {\n color: '#e5e7eb',\n fontSize: 14,\n },\n deleteButton: {\n padding: 4,\n },\n deleteButtonText: {\n fontSize: 16,\n },\n});\n", "import { RefObject } from 'react';\nimport { View, Platform } from 'react-native';\n\nexport interface ScreenshotOptions {\n /** Scale factor for higher resolution (default: 2) */\n scale?: number;\n /** Image format (default: 'png') */\n format?: 'png' | 'jpg';\n /** Quality for jpg format (0-1, default: 0.9) */\n quality?: number;\n /** Whether to copy to clipboard (default: true, requires expo-clipboard) */\n copyToClipboard?: boolean;\n /** Whether to save to camera roll (default: false, requires expo-media-library) */\n saveToCameraRoll?: boolean;\n}\n\nexport interface ScreenshotResult {\n success: boolean;\n uri?: string;\n base64?: string;\n error?: string;\n}\n\n/**\n * Captures a screenshot of a React Native View using react-native-view-shot\n * \n * Requirements:\n * - react-native-view-shot must be installed\n * - Optionally: expo-clipboard for clipboard support\n * - Optionally: expo-media-library for camera roll support\n * \n * @param viewRef - Reference to the View to capture\n * @param options - Screenshot options\n */\nexport async function captureScreenshot(\n viewRef: RefObject<View>,\n options: ScreenshotOptions = {}\n): Promise<ScreenshotResult> {\n const {\n scale = 2,\n format = 'png',\n quality = 0.9,\n copyToClipboard = false,\n saveToCameraRoll = false,\n } = options;\n\n try {\n // Dynamic import to avoid issues if not installed\n let captureRef: any;\n try {\n const viewShot = await import('react-native-view-shot');\n captureRef = viewShot.captureRef;\n } catch {\n return {\n success: false,\n error: 'react-native-view-shot is not installed. Run: npm install react-native-view-shot',\n };\n }\n\n if (!viewRef.current) {\n return {\n success: false,\n error: 'View reference is null',\n };\n }\n\n // Capture the view\n const uri = await captureRef(viewRef, {\n format,\n quality,\n result: 'tmpfile',\n snapshotContentContainer: false,\n });\n\n // Get base64 if needed\n let base64: string | undefined;\n if (copyToClipboard) {\n const base64Result = await captureRef(viewRef, {\n format,\n quality,\n result: 'base64',\n snapshotContentContainer: false,\n });\n base64 = base64Result;\n }\n\n // Copy to clipboard if requested\n if (copyToClipboard && base64) {\n try {\n const Clipboard = await import('expo-clipboard');\n // expo-clipboard doesn't support image directly, \n // we'll copy the base64 string\n await Clipboard.setStringAsync(base64);\n } catch {\n console.warn('expo-clipboard not available for clipboard support');\n }\n }\n\n // Save to camera roll if requested\n if (saveToCameraRoll) {\n try {\n const MediaLibrary = await import('expo-media-library');\n const { status } = await MediaLibrary.requestPermissionsAsync();\n if (status === 'granted') {\n await MediaLibrary.saveToLibraryAsync(uri);\n }\n } catch {\n console.warn('expo-media-library not available for saving to camera roll');\n }\n }\n\n return {\n success: true,\n uri,\n base64,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error('Screenshot capture failed:', message);\n return {\n success: false,\n error: message,\n };\n }\n}\n\n/**\n * Placeholder for web compatibility\n * The actual web implementation is in screenshot.ts\n */\nexport function captureScreenshotWeb(\n _element: any,\n _options: any\n): Promise<ScreenshotResult> {\n return Promise.resolve({\n success: false,\n error: 'Use the web-specific captureScreenshot function',\n });\n}\n", "/**\n * React Fiber utilities for React Native\n * \n * Note: React Native has different fiber access compared to web.\n * These utilities provide a similar interface but with native-specific logic.\n */\n\n/**\n * Attempts to get the React Fiber from a native view instance\n * This is less reliable in React Native than on web\n */\nexport function getReactFiber(instance: any): any {\n if (!instance) return null;\n \n // React Native stores fiber differently\n // Try to find the fiber via internal props\n const key = Object.keys(instance).find((k) =>\n k.startsWith('__reactFiber$') || \n k.startsWith('__reactInternalInstance$') ||\n k.startsWith('_reactInternals')\n );\n \n return key ? instance[key] : null;\n}\n\n/**\n * Gets the display name of a React component from its fiber\n */\nexport function getComponentDisplayName(fiber: any): string {\n if (!fiber) return 'Unknown';\n \n let curr = fiber;\n while (curr) {\n const type = curr.type;\n if (type) {\n // Check for displayName or name\n const name = type.displayName || type.name;\n if (name && typeof name === 'string') {\n // Skip internal React Native components\n if (!name.startsWith('RCT') && !name.startsWith('_')) {\n return name;\n }\n }\n }\n curr = curr.return;\n }\n return 'Unknown';\n}\n\n/**\n * For React Native, we can't easily get DOM elements from fibers\n * This is a no-op that returns null\n */\nexport function getElementFromFiber(_fiber: any): null {\n return null;\n}\n\n/**\n * Interface for component inspection result\n */\nexport interface ComponentInfo {\n name: string;\n props?: Record<string, any>;\n}\n\n/**\n * Inspects a React Native component instance to get info\n * This works with refs passed to components\n */\nexport function inspectComponent(ref: any): ComponentInfo | null {\n if (!ref) return null;\n \n // Try to get fiber from the ref\n const fiber = getReactFiber(ref);\n if (fiber) {\n return {\n name: getComponentDisplayName(fiber),\n props: fiber.memoizedProps,\n };\n }\n \n // Fallback: try to infer from the ref itself\n if (ref.constructor && ref.constructor.name) {\n return {\n name: ref.constructor.name,\n };\n }\n \n return null;\n}\n", "/**\n * Platform detection utilities for cross-platform support\n */\n\n// Check if we're running in a web environment\nexport const isWeb = typeof document !== 'undefined' && typeof window !== 'undefined';\n\n// Check if we're running in React Native\n// We check for the absence of DOM and presence of native-specific globals\nexport const isNative = !isWeb && typeof global !== 'undefined';\n\n// Get the current platform\nexport type PlatformType = 'web' | 'ios' | 'android' | 'native';\n\nexport function getPlatform(): PlatformType {\n if (isWeb) return 'web';\n \n // In React Native, we need to dynamically check Platform\n try {\n // This will only work in React Native environment\n const { Platform } = require('react-native');\n if (Platform.OS === 'ios') return 'ios';\n if (Platform.OS === 'android') return 'android';\n return 'native';\n } catch {\n return 'native';\n }\n}\n\n// Check if running in Tauri environment (web only)\nexport function isTauriEnv(): boolean {\n return isWeb && typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["View", "useState", "View", "Text", "TouchableOpacity", "StyleSheet", "jsx", "useState", "View", "Text", "TouchableOpacity", "StyleSheet", "View", "StyleSheet", "Animated", "jsx", "Animated", "styles", "View", "StyleSheet", "jsx", "jsxs", "useState", "View", "StyleSheet", "TouchableOpacity", "styles", "Text", "View", "Text", "Modal", "TouchableOpacity", "StyleSheet", "jsx", "jsxs", "Modal", "View", "styles", "Text", "TouchableOpacity", "StyleSheet", "Fragment", "jsx", "jsxs", "useState", "View", "styles", "Text", "TouchableOpacity", "StyleSheet", "copyToClipboard", "Platform", "jsx", "jsxs", "AgentAnnotationProvider", "View"]
|
|
7
7
|
}
|
package/dist/esm/index.web.js
CHANGED
|
@@ -44,19 +44,19 @@ function reducer(state, action) {
|
|
|
44
44
|
return state;
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
|
-
function
|
|
47
|
+
function AgentAnnotationProvider({ children }) {
|
|
48
48
|
const [state, dispatch] = useReducer(reducer, initialState);
|
|
49
49
|
return /* @__PURE__ */ jsx(AnnotationContext.Provider, { value: { state, dispatch }, children });
|
|
50
50
|
}
|
|
51
|
-
function
|
|
51
|
+
function useAgentAnnotation() {
|
|
52
52
|
const context = useContext(AnnotationContext);
|
|
53
53
|
if (!context) {
|
|
54
|
-
throw new Error("
|
|
54
|
+
throw new Error("useAgentAnnotation must be used within an AgentAnnotationProvider");
|
|
55
55
|
}
|
|
56
56
|
return context;
|
|
57
57
|
}
|
|
58
58
|
export {
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
AgentAnnotationProvider,
|
|
60
|
+
useAgentAnnotation
|
|
61
61
|
};
|
|
62
62
|
//# sourceMappingURL=index.web.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.web.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Web-only entry point for Chrome Extension\n * This avoids any React Native imports\n */\n\nimport React, { createContext, useContext, useReducer, ReactNode } from 'react';\nimport type { ComponentDetails, ChildComponentInfo, ElementInfo } from './utils/fiber';\n\n// Re-export types for external use\nexport type { ComponentDetails, ChildComponentInfo, ElementInfo };\n\nexport type Annotation = {\n id: string;\n componentName: string;\n note: string;\n timestamp: number;\n /** Enhanced component details (optional for backward compatibility) */\n details?: ComponentDetails;\n};\n\nexport type Mode = 'disabled' | 'inspecting';\n\n/**\n * Platform-agnostic element type\n * - On web: HTMLElement\n */\nexport type HoveredElement = HTMLElement | null;\n\n/**\n * Enhanced component info with full details\n */\nexport interface HoveredComponentInfo {\n name: string;\n /** Full component details including hierarchy, children, and element info */\n details?: ComponentDetails;\n}\n\ninterface State {\n mode: Mode;\n annotations: Annotation[];\n hoveredElement: HoveredElement;\n hoveredComponentInfo: HoveredComponentInfo | null;\n isMinimized: boolean;\n showList: boolean;\n}\n\ntype Action =\n | { type: 'SET_MODE'; payload: Mode }\n | { type: 'ADD_ANNOTATION'; payload: Annotation }\n | { type: 'REMOVE_ANNOTATION'; payload: string }\n | { type: 'CLEAR_ALL_ANNOTATIONS' }\n | { type: 'SET_HOVERED'; payload: { element: HoveredElement; name: string | null; details?: ComponentDetails } }\n | { type: 'TOGGLE_MINIMIZED' }\n | { type: 'TOGGLE_LIST' }\n | { type: 'RESET_HOVER' };\n\nconst initialState: State = {\n mode: 'inspecting', // Start enabled for extension\n annotations: [],\n hoveredElement: null,\n hoveredComponentInfo: null,\n isMinimized: false,\n showList: false,\n};\n\nconst AnnotationContext = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n} | undefined>(undefined);\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'SET_MODE':\n return { ...state, mode: action.payload };\n case 'ADD_ANNOTATION':\n return { ...state, annotations: [...state.annotations, action.payload] };\n case 'REMOVE_ANNOTATION':\n return {\n ...state,\n annotations: state.annotations.filter((a) => a.id !== action.payload),\n };\n case 'CLEAR_ALL_ANNOTATIONS':\n return {\n ...state,\n annotations: [],\n };\n case 'SET_HOVERED':\n // Avoid updates if same\n if (state.hoveredElement === action.payload.element) return state;\n return {\n ...state,\n hoveredElement: action.payload.element,\n hoveredComponentInfo: action.payload.name\n ? { name: action.payload.name, details: action.payload.details }\n : null\n };\n case 'RESET_HOVER':\n return { ...state, hoveredElement: null, hoveredComponentInfo: null };\n case 'TOGGLE_MINIMIZED':\n return { ...state, isMinimized: !state.isMinimized };\n case 'TOGGLE_LIST':\n return { ...state, showList: !state.showList };\n default:\n return state;\n }\n}\n\nexport function
|
|
5
|
-
"mappings": ";AAKA,SAAgB,eAAe,YAAY,kBAA6B;AA0GpE;AAvDJ,IAAM,eAAsB;AAAA,EAC1B,MAAM;AAAA;AAAA,EACN,aAAa,CAAC;AAAA,EACd,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,UAAU;AACZ;AAEA,IAAM,oBAAoB,cAGX,MAAS;AAExB,SAAS,QAAQ,OAAc,QAAuB;AACpD,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,MAAM,OAAO,QAAQ;AAAA,IAC1C,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,CAAC,GAAG,MAAM,aAAa,OAAO,OAAO,EAAE;AAAA,IACzE,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,aAAa,MAAM,YAAY,OAAO,CAAC,MAAM,EAAE,OAAO,OAAO,OAAO;AAAA,MACtE;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,aAAa,CAAC;AAAA,MAChB;AAAA,IACF,KAAK;AAED,UAAI,MAAM,mBAAmB,OAAO,QAAQ,QAAS,QAAO;AAC5D,aAAO;AAAA,QACH,GAAG;AAAA,QACH,gBAAgB,OAAO,QAAQ;AAAA,QAC/B,sBAAsB,OAAO,QAAQ,OACjC,EAAE,MAAM,OAAO,QAAQ,MAAM,SAAS,OAAO,QAAQ,QAAQ,IAC7D;AAAA,MACR;AAAA,IACJ,KAAK;AACD,aAAO,EAAE,GAAG,OAAO,gBAAgB,MAAM,sBAAsB,KAAK;AAAA,IACxE,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,CAAC,MAAM,YAAY;AAAA,IACrD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,UAAU,CAAC,MAAM,SAAS;AAAA,IAC/C;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,
|
|
4
|
+
"sourcesContent": ["/**\n * Web-only entry point for Chrome Extension\n * This avoids any React Native imports\n */\n\nimport React, { createContext, useContext, useReducer, ReactNode } from 'react';\nimport type { ComponentDetails, ChildComponentInfo, ElementInfo } from './utils/fiber';\n\n// Re-export types for external use\nexport type { ComponentDetails, ChildComponentInfo, ElementInfo };\n\nexport type Annotation = {\n id: string;\n componentName: string;\n note: string;\n timestamp: number;\n /** Enhanced component details (optional for backward compatibility) */\n details?: ComponentDetails;\n};\n\nexport type Mode = 'disabled' | 'inspecting';\n\n/**\n * Platform-agnostic element type\n * - On web: HTMLElement\n */\nexport type HoveredElement = HTMLElement | null;\n\n/**\n * Enhanced component info with full details\n */\nexport interface HoveredComponentInfo {\n name: string;\n /** Full component details including hierarchy, children, and element info */\n details?: ComponentDetails;\n}\n\ninterface State {\n mode: Mode;\n annotations: Annotation[];\n hoveredElement: HoveredElement;\n hoveredComponentInfo: HoveredComponentInfo | null;\n isMinimized: boolean;\n showList: boolean;\n}\n\ntype Action =\n | { type: 'SET_MODE'; payload: Mode }\n | { type: 'ADD_ANNOTATION'; payload: Annotation }\n | { type: 'REMOVE_ANNOTATION'; payload: string }\n | { type: 'CLEAR_ALL_ANNOTATIONS' }\n | { type: 'SET_HOVERED'; payload: { element: HoveredElement; name: string | null; details?: ComponentDetails } }\n | { type: 'TOGGLE_MINIMIZED' }\n | { type: 'TOGGLE_LIST' }\n | { type: 'RESET_HOVER' };\n\nconst initialState: State = {\n mode: 'inspecting', // Start enabled for extension\n annotations: [],\n hoveredElement: null,\n hoveredComponentInfo: null,\n isMinimized: false,\n showList: false,\n};\n\nconst AnnotationContext = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n} | undefined>(undefined);\n\nfunction reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'SET_MODE':\n return { ...state, mode: action.payload };\n case 'ADD_ANNOTATION':\n return { ...state, annotations: [...state.annotations, action.payload] };\n case 'REMOVE_ANNOTATION':\n return {\n ...state,\n annotations: state.annotations.filter((a) => a.id !== action.payload),\n };\n case 'CLEAR_ALL_ANNOTATIONS':\n return {\n ...state,\n annotations: [],\n };\n case 'SET_HOVERED':\n // Avoid updates if same\n if (state.hoveredElement === action.payload.element) return state;\n return {\n ...state,\n hoveredElement: action.payload.element,\n hoveredComponentInfo: action.payload.name\n ? { name: action.payload.name, details: action.payload.details }\n : null\n };\n case 'RESET_HOVER':\n return { ...state, hoveredElement: null, hoveredComponentInfo: null };\n case 'TOGGLE_MINIMIZED':\n return { ...state, isMinimized: !state.isMinimized };\n case 'TOGGLE_LIST':\n return { ...state, showList: !state.showList };\n default:\n return state;\n }\n}\n\nexport function AgentAnnotationProvider({ children }: { children: ReactNode }) {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n return (\n <AnnotationContext.Provider value={{ state, dispatch }}>\n {children}\n </AnnotationContext.Provider>\n );\n}\n\nexport function useAgentAnnotation() {\n const context = useContext(AnnotationContext);\n if (!context) {\n throw new Error('useAgentAnnotation must be used within an AgentAnnotationProvider');\n }\n return context;\n}\n"],
|
|
5
|
+
"mappings": ";AAKA,SAAgB,eAAe,YAAY,kBAA6B;AA0GpE;AAvDJ,IAAM,eAAsB;AAAA,EAC1B,MAAM;AAAA;AAAA,EACN,aAAa,CAAC;AAAA,EACd,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,UAAU;AACZ;AAEA,IAAM,oBAAoB,cAGX,MAAS;AAExB,SAAS,QAAQ,OAAc,QAAuB;AACpD,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,MAAM,OAAO,QAAQ;AAAA,IAC1C,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,CAAC,GAAG,MAAM,aAAa,OAAO,OAAO,EAAE;AAAA,IACzE,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,aAAa,MAAM,YAAY,OAAO,CAAC,MAAM,EAAE,OAAO,OAAO,OAAO;AAAA,MACtE;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,aAAa,CAAC;AAAA,MAChB;AAAA,IACF,KAAK;AAED,UAAI,MAAM,mBAAmB,OAAO,QAAQ,QAAS,QAAO;AAC5D,aAAO;AAAA,QACH,GAAG;AAAA,QACH,gBAAgB,OAAO,QAAQ;AAAA,QAC/B,sBAAsB,OAAO,QAAQ,OACjC,EAAE,MAAM,OAAO,QAAQ,MAAM,SAAS,OAAO,QAAQ,QAAQ,IAC7D;AAAA,MACR;AAAA,IACJ,KAAK;AACD,aAAO,EAAE,GAAG,OAAO,gBAAgB,MAAM,sBAAsB,KAAK;AAAA,IACxE,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,aAAa,CAAC,MAAM,YAAY;AAAA,IACrD,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,UAAU,CAAC,MAAM,SAAS;AAAA,IAC/C;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,wBAAwB,EAAE,SAAS,GAA4B;AAC7E,QAAM,CAAC,OAAO,QAAQ,IAAI,WAAW,SAAS,YAAY;AAE1D,SACE,oBAAC,kBAAkB,UAAlB,EAA2B,OAAO,EAAE,OAAO,SAAS,GAClD,UACH;AAEJ;AAEO,SAAS,qBAAqB;AACnC,QAAM,UAAU,WAAW,iBAAiB;AAC5C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import React, { Component, ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Error information passed to fallback components
|
|
4
|
+
*/
|
|
5
|
+
export interface ErrorInfo {
|
|
6
|
+
error: Error;
|
|
7
|
+
errorInfo: React.ErrorInfo;
|
|
8
|
+
/** Formatted error message for copying/display */
|
|
9
|
+
formattedError: string;
|
|
10
|
+
/** Reset the error state and retry rendering */
|
|
11
|
+
reset: () => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Props for custom fallback component
|
|
15
|
+
*/
|
|
16
|
+
export interface FallbackProps extends ErrorInfo {
|
|
17
|
+
/** Copy error details to clipboard */
|
|
18
|
+
copyToClipboard: () => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Button configuration for default error UI
|
|
22
|
+
*/
|
|
23
|
+
export interface ErrorButtonConfig {
|
|
24
|
+
/** Button label text */
|
|
25
|
+
label: string;
|
|
26
|
+
/** Click handler */
|
|
27
|
+
onClick: (errorInfo: ErrorInfo) => void;
|
|
28
|
+
/** Optional button style override */
|
|
29
|
+
style?: React.CSSProperties;
|
|
30
|
+
/** Optional className */
|
|
31
|
+
className?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Props for ErrorBoundary component
|
|
35
|
+
*/
|
|
36
|
+
export interface ErrorBoundaryProps {
|
|
37
|
+
children: ReactNode;
|
|
38
|
+
/**
|
|
39
|
+
* Custom fallback component to render when error occurs.
|
|
40
|
+
* Takes full control of error UI.
|
|
41
|
+
*/
|
|
42
|
+
fallback?: React.ComponentType<FallbackProps>;
|
|
43
|
+
/**
|
|
44
|
+
* Fallback element (simpler alternative to fallback component)
|
|
45
|
+
*/
|
|
46
|
+
fallbackElement?: ReactNode;
|
|
47
|
+
/**
|
|
48
|
+
* Custom title for default error page
|
|
49
|
+
* @default "Something went wrong"
|
|
50
|
+
*/
|
|
51
|
+
title?: string;
|
|
52
|
+
/**
|
|
53
|
+
* Custom subtitle/description for default error page
|
|
54
|
+
* @default "An unexpected error occurred"
|
|
55
|
+
*/
|
|
56
|
+
subtitle?: string;
|
|
57
|
+
/**
|
|
58
|
+
* Whether to show error details in default UI
|
|
59
|
+
* @default true
|
|
60
|
+
*/
|
|
61
|
+
showErrorDetails?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Whether to show the "Copy Error" button in default UI
|
|
64
|
+
* @default true
|
|
65
|
+
*/
|
|
66
|
+
showCopyButton?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Whether to show the "Try Again" button in default UI
|
|
69
|
+
* @default true
|
|
70
|
+
*/
|
|
71
|
+
showRetryButton?: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Custom retry button label
|
|
74
|
+
* @default "Try Again"
|
|
75
|
+
*/
|
|
76
|
+
retryButtonLabel?: string;
|
|
77
|
+
/**
|
|
78
|
+
* Custom copy button label
|
|
79
|
+
* @default "Copy Error Details"
|
|
80
|
+
*/
|
|
81
|
+
copyButtonLabel?: string;
|
|
82
|
+
/**
|
|
83
|
+
* Additional custom buttons to show in default UI
|
|
84
|
+
*/
|
|
85
|
+
customButtons?: ErrorButtonConfig[];
|
|
86
|
+
/**
|
|
87
|
+
* Custom styles for the default error container
|
|
88
|
+
*/
|
|
89
|
+
containerStyle?: React.CSSProperties;
|
|
90
|
+
/**
|
|
91
|
+
* Custom styles for the error details section
|
|
92
|
+
*/
|
|
93
|
+
errorDetailsStyle?: React.CSSProperties;
|
|
94
|
+
/**
|
|
95
|
+
* Callback when an error is caught
|
|
96
|
+
*/
|
|
97
|
+
onError?: (error: Error, errorInfo: React.ErrorInfo) => void;
|
|
98
|
+
/**
|
|
99
|
+
* Callback when reset/retry is triggered
|
|
100
|
+
*/
|
|
101
|
+
onReset?: () => void;
|
|
102
|
+
}
|
|
103
|
+
interface ErrorBoundaryState {
|
|
104
|
+
hasError: boolean;
|
|
105
|
+
error: Error | null;
|
|
106
|
+
errorInfo: React.ErrorInfo | null;
|
|
107
|
+
copied: boolean;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* ErrorBoundary component with customizable error UI
|
|
111
|
+
*
|
|
112
|
+
* @example Basic usage
|
|
113
|
+
* ```tsx
|
|
114
|
+
* <ErrorBoundary>
|
|
115
|
+
* <App />
|
|
116
|
+
* </ErrorBoundary>
|
|
117
|
+
* ```
|
|
118
|
+
*
|
|
119
|
+
* @example Custom title and buttons
|
|
120
|
+
* ```tsx
|
|
121
|
+
* <ErrorBoundary
|
|
122
|
+
* title="Oops! Something broke"
|
|
123
|
+
* subtitle="Please try again or contact support"
|
|
124
|
+
* showCopyButton={true}
|
|
125
|
+
* customButtons={[
|
|
126
|
+
* { label: "Go Home", onClick: () => window.location.href = "/" }
|
|
127
|
+
* ]}
|
|
128
|
+
* >
|
|
129
|
+
* <App />
|
|
130
|
+
* </ErrorBoundary>
|
|
131
|
+
* ```
|
|
132
|
+
*
|
|
133
|
+
* @example Fully custom fallback
|
|
134
|
+
* ```tsx
|
|
135
|
+
* <ErrorBoundary
|
|
136
|
+
* fallback={({ error, reset, copyToClipboard }) => (
|
|
137
|
+
* <div>
|
|
138
|
+
* <h1>Error: {error.message}</h1>
|
|
139
|
+
* <button onClick={reset}>Retry</button>
|
|
140
|
+
* <button onClick={copyToClipboard}>Copy</button>
|
|
141
|
+
* </div>
|
|
142
|
+
* )}
|
|
143
|
+
* >
|
|
144
|
+
* <App />
|
|
145
|
+
* </ErrorBoundary>
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
export declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
149
|
+
constructor(props: ErrorBoundaryProps);
|
|
150
|
+
static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState>;
|
|
151
|
+
componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void;
|
|
152
|
+
private formatError;
|
|
153
|
+
private handleReset;
|
|
154
|
+
private handleCopyToClipboard;
|
|
155
|
+
private getErrorInfo;
|
|
156
|
+
private renderDefaultFallback;
|
|
157
|
+
render(): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | import("react/jsx-runtime").JSX.Element | null | undefined;
|
|
158
|
+
}
|
|
159
|
+
export default ErrorBoundary;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
export interface
|
|
2
|
+
export interface AgentAnnotationProviderProps {
|
|
3
3
|
children: React.ReactNode;
|
|
4
4
|
}
|
|
5
5
|
/**
|
|
6
|
-
* Web
|
|
6
|
+
* Web Agent Annotation Provider
|
|
7
7
|
* Wraps your app to provide annotation functionality
|
|
8
8
|
*/
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function AgentAnnotationProvider({ children }: AgentAnnotationProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
10
10
|
export * from './store';
|
|
11
11
|
export { Toolbar } from './components/Toolbar';
|
|
12
12
|
export { Highlighter } from './components/Highlighter';
|
|
13
13
|
export { AnnotationInput } from './components/AnnotationInput';
|
|
14
14
|
export { AnnotationList } from './components/AnnotationList';
|
|
15
15
|
export { Draggable } from './components/Draggable';
|
|
16
|
+
export { ErrorBoundary } from './components/ErrorBoundary';
|
|
17
|
+
export type { ErrorBoundaryProps, ErrorInfo, FallbackProps, ErrorButtonConfig } from './components/ErrorBoundary';
|
|
16
18
|
export { captureScreenshot } from './utils/screenshot';
|
|
17
19
|
export type { ScreenshotOptions, ScreenshotResult } from './utils/screenshot';
|
|
18
20
|
export { getReactFiber, getComponentDisplayName, getElementFromFiber } from './utils/fiber';
|
|
@@ -60,10 +60,10 @@ type Action = {
|
|
|
60
60
|
} | {
|
|
61
61
|
type: 'RESET_HOVER';
|
|
62
62
|
};
|
|
63
|
-
export declare function
|
|
63
|
+
export declare function AgentAnnotationProvider({ children }: {
|
|
64
64
|
children: ReactNode;
|
|
65
65
|
}): import("react/jsx-runtime").JSX.Element;
|
|
66
|
-
export declare function
|
|
66
|
+
export declare function useAgentAnnotation(): {
|
|
67
67
|
state: State;
|
|
68
68
|
dispatch: React.Dispatch<Action>;
|
|
69
69
|
};
|