@qontinui/ui-bridge 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/index.d.mts +4 -4
- package/dist/ai/index.d.ts +4 -4
- package/dist/babel-plugin/index.js +515 -0
- package/dist/babel-plugin/index.js.map +1 -0
- package/dist/babel-plugin/index.mjs +499 -0
- package/dist/babel-plugin/index.mjs.map +1 -0
- package/dist/control/index.d.mts +5 -5
- package/dist/control/index.d.ts +5 -5
- package/dist/core/index.d.mts +115 -44
- package/dist/core/index.d.ts +115 -44
- package/dist/core/index.js +0 -1560
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +1 -1549
- package/dist/core/index.mjs.map +1 -1
- package/dist/debug/index.d.mts +3 -3
- package/dist/debug/index.d.ts +3 -3
- package/dist/index.d.mts +7 -8
- package/dist/index.d.ts +7 -8
- package/dist/index.js +859 -873
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +860 -862
- package/dist/index.mjs.map +1 -1
- package/dist/{metrics-C9XRi_mL.d.ts → metrics-BfiT_rhZ.d.ts} +2 -2
- package/dist/{metrics-NC3csD0R.d.mts → metrics-DTA2bwG7.d.mts} +2 -2
- package/dist/native/control/index.js +453 -0
- package/dist/native/control/index.js.map +1 -0
- package/dist/native/control/index.mjs +450 -0
- package/dist/native/control/index.mjs.map +1 -0
- package/dist/native/core/index.js +486 -0
- package/dist/native/core/index.js.map +1 -0
- package/dist/native/core/index.mjs +475 -0
- package/dist/native/core/index.mjs.map +1 -0
- package/dist/native/debug/index.js +451 -0
- package/dist/native/debug/index.js.map +1 -0
- package/dist/native/debug/index.mjs +449 -0
- package/dist/native/debug/index.mjs.map +1 -0
- package/dist/native/index.js +2274 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/index.mjs +2246 -0
- package/dist/native/index.mjs.map +1 -0
- package/dist/native/react/index.js +1401 -0
- package/dist/native/react/index.js.map +1 -0
- package/dist/native/react/index.mjs +1389 -0
- package/dist/native/react/index.mjs.map +1 -0
- package/dist/native/server/index.js +415 -0
- package/dist/native/server/index.js.map +1 -0
- package/dist/native/server/index.mjs +410 -0
- package/dist/native/server/index.mjs.map +1 -0
- package/dist/react/index.d.mts +20 -7
- package/dist/react/index.d.ts +20 -7
- package/dist/react/index.js +42 -4
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +42 -4
- package/dist/react/index.mjs.map +1 -1
- package/dist/{registry-CIEDjbQ9.d.ts → registry-BKLEm-yk.d.ts} +9 -15
- package/dist/{registry-SsSDq46X.d.mts → registry-BmZgyCz8.d.mts} +9 -15
- package/dist/render-log/index.d.mts +1 -1
- package/dist/render-log/index.d.ts +1 -1
- package/dist/server/express.d.mts +36 -0
- package/dist/server/express.d.ts +36 -0
- package/dist/server/express.js +196 -0
- package/dist/server/express.js.map +1 -0
- package/dist/server/express.mjs +192 -0
- package/dist/server/express.mjs.map +1 -0
- package/dist/server/handlers.d.mts +93 -0
- package/dist/server/handlers.d.ts +93 -0
- package/dist/server/handlers.js +4278 -0
- package/dist/server/handlers.js.map +1 -0
- package/dist/server/handlers.mjs +4275 -0
- package/dist/server/handlers.mjs.map +1 -0
- package/dist/server/index.d.mts +10 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.js +5352 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +5337 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/nextjs.d.mts +126 -0
- package/dist/server/nextjs.d.ts +126 -0
- package/dist/server/nextjs.js +287 -0
- package/dist/server/nextjs.js.map +1 -0
- package/dist/server/nextjs.mjs +282 -0
- package/dist/server/nextjs.mjs.map +1 -0
- package/dist/server/standalone.d.mts +6 -0
- package/dist/server/standalone.d.ts +6 -0
- package/dist/server/standalone.js +719 -0
- package/dist/server/standalone.js.map +1 -0
- package/dist/server/standalone.mjs +715 -0
- package/dist/server/standalone.mjs.map +1 -0
- package/dist/standalone-BURj8J3G.d.ts +212 -0
- package/dist/standalone-Dwmel29d.d.mts +212 -0
- package/dist/swc-plugin/index.d.mts +79 -0
- package/dist/swc-plugin/index.d.ts +79 -0
- package/dist/swc-plugin/index.js +15 -0
- package/dist/swc-plugin/index.js.map +1 -0
- package/dist/swc-plugin/index.mjs +9 -0
- package/dist/swc-plugin/index.mjs.map +1 -0
- package/dist/{types-CFT3Dnx4.d.mts → types-B5Q0GVo0.d.mts} +115 -3
- package/dist/{types-Dr6tH-bm.d.mts → types-B7J7noLK.d.mts} +1 -1
- package/dist/{types-oCTrRxSw.d.ts → types-BkNRILUa.d.ts} +1 -1
- package/dist/types-CEQLnFMv.d.mts +156 -0
- package/dist/types-CHnlwiTK.d.ts +156 -0
- package/dist/{types-BvCfFuEV.d.ts → types-DfPqwU-i.d.ts} +115 -3
- package/dist/{types-CPMbN_Iw.d.mts → types-jKVgTI6_.d.mts} +356 -160
- package/dist/{types-CPMbN_Iw.d.ts → types-jKVgTI6_.d.ts} +356 -160
- package/package.json +106 -3
- package/swc-plugin-wasm/ui_bridge_swc_plugin.wasm +0 -0
- package/dist/websocket-client-CX4QJesI.d.ts +0 -124
- package/dist/websocket-client-C_Na0OSp.d.mts +0 -124
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var reactNative = require('react-native');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
// src/native/debug/inspector.tsx
|
|
8
|
+
var UIBridgeNativeContext = react.createContext(null);
|
|
9
|
+
function useUIBridgeNativeOptional() {
|
|
10
|
+
return react.useContext(UIBridgeNativeContext);
|
|
11
|
+
}
|
|
12
|
+
function ElementCard({
|
|
13
|
+
element,
|
|
14
|
+
onPress
|
|
15
|
+
}) {
|
|
16
|
+
const state = element.getState();
|
|
17
|
+
const identifier = element.getIdentifier();
|
|
18
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
19
|
+
reactNative.TouchableOpacity,
|
|
20
|
+
{
|
|
21
|
+
style: styles.elementCard,
|
|
22
|
+
onPress: () => onPress(element),
|
|
23
|
+
children: [
|
|
24
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.elementHeader, children: [
|
|
25
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.elementId, children: element.id }),
|
|
26
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.elementType, children: element.type })
|
|
27
|
+
] }),
|
|
28
|
+
element.label && /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.elementLabel, children: element.label }),
|
|
29
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.stateRow, children: [
|
|
30
|
+
/* @__PURE__ */ jsxRuntime.jsx(StateIndicator, { label: "Mounted", value: state.mounted }),
|
|
31
|
+
/* @__PURE__ */ jsxRuntime.jsx(StateIndicator, { label: "Visible", value: state.visible }),
|
|
32
|
+
/* @__PURE__ */ jsxRuntime.jsx(StateIndicator, { label: "Enabled", value: state.enabled })
|
|
33
|
+
] }),
|
|
34
|
+
identifier.testId && /* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.testId, children: [
|
|
35
|
+
"testID: ",
|
|
36
|
+
identifier.testId
|
|
37
|
+
] })
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
function StateIndicator({ label, value }) {
|
|
43
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.stateIndicator, children: [
|
|
44
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
45
|
+
reactNative.View,
|
|
46
|
+
{
|
|
47
|
+
style: [
|
|
48
|
+
styles.stateDot,
|
|
49
|
+
{ backgroundColor: value ? "#4CAF50" : "#F44336" }
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
),
|
|
53
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.stateLabel, children: label })
|
|
54
|
+
] });
|
|
55
|
+
}
|
|
56
|
+
function ElementDetail({
|
|
57
|
+
element,
|
|
58
|
+
onClose
|
|
59
|
+
}) {
|
|
60
|
+
const state = element.getState();
|
|
61
|
+
const identifier = element.getIdentifier();
|
|
62
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.detailContainer, children: [
|
|
63
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.detailHeader, children: [
|
|
64
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.detailTitle, children: element.id }),
|
|
65
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.TouchableOpacity, { onPress: onClose, children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.closeButton, children: "Close" }) })
|
|
66
|
+
] }),
|
|
67
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.ScrollView, { style: styles.detailContent, children: [
|
|
68
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.sectionTitle, children: "Type" }),
|
|
69
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.sectionValue, children: element.type }),
|
|
70
|
+
element.label && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
71
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.sectionTitle, children: "Label" }),
|
|
72
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.sectionValue, children: element.label })
|
|
73
|
+
] }),
|
|
74
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.sectionTitle, children: "State" }),
|
|
75
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.stateSection, children: [
|
|
76
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.stateText, children: [
|
|
77
|
+
"Mounted: ",
|
|
78
|
+
String(state.mounted)
|
|
79
|
+
] }),
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.stateText, children: [
|
|
81
|
+
"Visible: ",
|
|
82
|
+
String(state.visible)
|
|
83
|
+
] }),
|
|
84
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.stateText, children: [
|
|
85
|
+
"Enabled: ",
|
|
86
|
+
String(state.enabled)
|
|
87
|
+
] }),
|
|
88
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.stateText, children: [
|
|
89
|
+
"Focused: ",
|
|
90
|
+
String(state.focused)
|
|
91
|
+
] }),
|
|
92
|
+
state.value !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.stateText, children: [
|
|
93
|
+
"Value: ",
|
|
94
|
+
state.value
|
|
95
|
+
] })
|
|
96
|
+
] }),
|
|
97
|
+
state.layout && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
98
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.sectionTitle, children: "Layout" }),
|
|
99
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.stateSection, children: [
|
|
100
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.stateText, children: [
|
|
101
|
+
"Position: (",
|
|
102
|
+
state.layout.x,
|
|
103
|
+
", ",
|
|
104
|
+
state.layout.y,
|
|
105
|
+
")"
|
|
106
|
+
] }),
|
|
107
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.stateText, children: [
|
|
108
|
+
"Size: ",
|
|
109
|
+
state.layout.width,
|
|
110
|
+
" x ",
|
|
111
|
+
state.layout.height
|
|
112
|
+
] }),
|
|
113
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.stateText, children: [
|
|
114
|
+
"Page: (",
|
|
115
|
+
state.layout.pageX,
|
|
116
|
+
", ",
|
|
117
|
+
state.layout.pageY,
|
|
118
|
+
")"
|
|
119
|
+
] })
|
|
120
|
+
] })
|
|
121
|
+
] }),
|
|
122
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.sectionTitle, children: "Identifier" }),
|
|
123
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.stateSection, children: [
|
|
124
|
+
identifier.uiId && /* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.stateText, children: [
|
|
125
|
+
"uiId: ",
|
|
126
|
+
identifier.uiId
|
|
127
|
+
] }),
|
|
128
|
+
identifier.testId && /* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.stateText, children: [
|
|
129
|
+
"testId: ",
|
|
130
|
+
identifier.testId
|
|
131
|
+
] }),
|
|
132
|
+
identifier.accessibilityLabel && /* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.stateText, children: [
|
|
133
|
+
"a11yLabel: ",
|
|
134
|
+
identifier.accessibilityLabel
|
|
135
|
+
] }),
|
|
136
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: styles.stateText, children: [
|
|
137
|
+
"treePath: ",
|
|
138
|
+
identifier.treePath
|
|
139
|
+
] })
|
|
140
|
+
] }),
|
|
141
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.sectionTitle, children: "Actions" }),
|
|
142
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles.actionsSection, children: element.actions.map((action) => /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles.actionBadge, children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.actionText, children: action }) }, action)) }),
|
|
143
|
+
element.customActions && Object.keys(element.customActions).length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
144
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.sectionTitle, children: "Custom Actions" }),
|
|
145
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles.actionsSection, children: Object.keys(element.customActions).map((action) => /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: [styles.actionBadge, styles.customActionBadge], children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.actionText, children: action }) }, action)) })
|
|
146
|
+
] })
|
|
147
|
+
] })
|
|
148
|
+
] });
|
|
149
|
+
}
|
|
150
|
+
function UIBridgeInspector({
|
|
151
|
+
visible = false,
|
|
152
|
+
onClose,
|
|
153
|
+
togglePosition = "bottom-right"
|
|
154
|
+
}) {
|
|
155
|
+
const bridge = useUIBridgeNativeOptional();
|
|
156
|
+
const [showInspector, setShowInspector] = react.useState(visible);
|
|
157
|
+
const [selectedElement, setSelectedElement] = react.useState(
|
|
158
|
+
null
|
|
159
|
+
);
|
|
160
|
+
const elements = react.useMemo(
|
|
161
|
+
() => bridge ? bridge.getElements() : [],
|
|
162
|
+
[bridge, showInspector]
|
|
163
|
+
);
|
|
164
|
+
const components = react.useMemo(
|
|
165
|
+
() => bridge ? bridge.getComponents() : [],
|
|
166
|
+
[bridge, showInspector]
|
|
167
|
+
);
|
|
168
|
+
const handleToggle = react.useCallback(() => {
|
|
169
|
+
setShowInspector((prev) => !prev);
|
|
170
|
+
}, []);
|
|
171
|
+
const handleClose = react.useCallback(() => {
|
|
172
|
+
setShowInspector(false);
|
|
173
|
+
onClose?.();
|
|
174
|
+
}, [onClose]);
|
|
175
|
+
const handleSelectElement = react.useCallback((element) => {
|
|
176
|
+
setSelectedElement(element);
|
|
177
|
+
}, []);
|
|
178
|
+
const handleCloseDetail = react.useCallback(() => {
|
|
179
|
+
setSelectedElement(null);
|
|
180
|
+
}, []);
|
|
181
|
+
const toggleStyle = react.useMemo(() => {
|
|
182
|
+
switch (togglePosition) {
|
|
183
|
+
case "top-left":
|
|
184
|
+
return { top: 50, left: 10 };
|
|
185
|
+
case "top-right":
|
|
186
|
+
return { top: 50, right: 10 };
|
|
187
|
+
case "bottom-left":
|
|
188
|
+
return { bottom: 50, left: 10 };
|
|
189
|
+
case "bottom-right":
|
|
190
|
+
default:
|
|
191
|
+
return { bottom: 50, right: 10 };
|
|
192
|
+
}
|
|
193
|
+
}, [togglePosition]);
|
|
194
|
+
if (!bridge) {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
198
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
199
|
+
reactNative.TouchableOpacity,
|
|
200
|
+
{
|
|
201
|
+
style: [styles.toggleButton, toggleStyle],
|
|
202
|
+
onPress: handleToggle,
|
|
203
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.toggleText, children: "UI" })
|
|
204
|
+
}
|
|
205
|
+
),
|
|
206
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
207
|
+
reactNative.Modal,
|
|
208
|
+
{
|
|
209
|
+
visible: showInspector,
|
|
210
|
+
animationType: "slide",
|
|
211
|
+
transparent: true,
|
|
212
|
+
onRequestClose: handleClose,
|
|
213
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: styles.modalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.inspectorContainer, children: [
|
|
214
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.header, children: [
|
|
215
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.headerTitle, children: "UI Bridge Inspector" }),
|
|
216
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.TouchableOpacity, { onPress: handleClose, children: /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.closeButton, children: "X" }) })
|
|
217
|
+
] }),
|
|
218
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.statsRow, children: [
|
|
219
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.stat, children: [
|
|
220
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.statValue, children: elements.length }),
|
|
221
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.statLabel, children: "Elements" })
|
|
222
|
+
] }),
|
|
223
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.stat, children: [
|
|
224
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.statValue, children: components.length }),
|
|
225
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.statLabel, children: "Components" })
|
|
226
|
+
] }),
|
|
227
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.stat, children: [
|
|
228
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.statValue, children: bridge.serverRunning ? "ON" : "OFF" }),
|
|
229
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.statLabel, children: "Server" })
|
|
230
|
+
] })
|
|
231
|
+
] }),
|
|
232
|
+
selectedElement ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
233
|
+
ElementDetail,
|
|
234
|
+
{
|
|
235
|
+
element: selectedElement,
|
|
236
|
+
onClose: handleCloseDetail
|
|
237
|
+
}
|
|
238
|
+
) : /* @__PURE__ */ jsxRuntime.jsxs(reactNative.ScrollView, { style: styles.elementList, children: [
|
|
239
|
+
elements.map((element) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
240
|
+
ElementCard,
|
|
241
|
+
{
|
|
242
|
+
element,
|
|
243
|
+
onPress: handleSelectElement
|
|
244
|
+
},
|
|
245
|
+
element.id
|
|
246
|
+
)),
|
|
247
|
+
elements.length === 0 && /* @__PURE__ */ jsxRuntime.jsx(reactNative.Text, { style: styles.emptyText, children: "No elements registered yet" })
|
|
248
|
+
] })
|
|
249
|
+
] }) })
|
|
250
|
+
}
|
|
251
|
+
)
|
|
252
|
+
] });
|
|
253
|
+
}
|
|
254
|
+
var { height: screenHeight } = reactNative.Dimensions.get("window");
|
|
255
|
+
var styles = reactNative.StyleSheet.create({
|
|
256
|
+
toggleButton: {
|
|
257
|
+
position: "absolute",
|
|
258
|
+
width: 44,
|
|
259
|
+
height: 44,
|
|
260
|
+
borderRadius: 22,
|
|
261
|
+
backgroundColor: "#2196F3",
|
|
262
|
+
justifyContent: "center",
|
|
263
|
+
alignItems: "center",
|
|
264
|
+
shadowColor: "#000",
|
|
265
|
+
shadowOffset: { width: 0, height: 2 },
|
|
266
|
+
shadowOpacity: 0.25,
|
|
267
|
+
shadowRadius: 4,
|
|
268
|
+
elevation: 5,
|
|
269
|
+
zIndex: 1e3
|
|
270
|
+
},
|
|
271
|
+
toggleText: {
|
|
272
|
+
color: "#fff",
|
|
273
|
+
fontWeight: "bold",
|
|
274
|
+
fontSize: 14
|
|
275
|
+
},
|
|
276
|
+
modalContainer: {
|
|
277
|
+
flex: 1,
|
|
278
|
+
backgroundColor: "rgba(0, 0, 0, 0.5)",
|
|
279
|
+
justifyContent: "flex-end"
|
|
280
|
+
},
|
|
281
|
+
inspectorContainer: {
|
|
282
|
+
backgroundColor: "#1e1e1e",
|
|
283
|
+
borderTopLeftRadius: 16,
|
|
284
|
+
borderTopRightRadius: 16,
|
|
285
|
+
maxHeight: screenHeight * 0.8
|
|
286
|
+
},
|
|
287
|
+
header: {
|
|
288
|
+
flexDirection: "row",
|
|
289
|
+
justifyContent: "space-between",
|
|
290
|
+
alignItems: "center",
|
|
291
|
+
padding: 16,
|
|
292
|
+
borderBottomWidth: 1,
|
|
293
|
+
borderBottomColor: "#333"
|
|
294
|
+
},
|
|
295
|
+
headerTitle: {
|
|
296
|
+
color: "#fff",
|
|
297
|
+
fontSize: 18,
|
|
298
|
+
fontWeight: "bold"
|
|
299
|
+
},
|
|
300
|
+
closeButton: {
|
|
301
|
+
color: "#2196F3",
|
|
302
|
+
fontSize: 16,
|
|
303
|
+
fontWeight: "bold"
|
|
304
|
+
},
|
|
305
|
+
statsRow: {
|
|
306
|
+
flexDirection: "row",
|
|
307
|
+
padding: 12,
|
|
308
|
+
borderBottomWidth: 1,
|
|
309
|
+
borderBottomColor: "#333"
|
|
310
|
+
},
|
|
311
|
+
stat: {
|
|
312
|
+
flex: 1,
|
|
313
|
+
alignItems: "center"
|
|
314
|
+
},
|
|
315
|
+
statValue: {
|
|
316
|
+
color: "#fff",
|
|
317
|
+
fontSize: 20,
|
|
318
|
+
fontWeight: "bold"
|
|
319
|
+
},
|
|
320
|
+
statLabel: {
|
|
321
|
+
color: "#888",
|
|
322
|
+
fontSize: 12,
|
|
323
|
+
marginTop: 2
|
|
324
|
+
},
|
|
325
|
+
elementList: {
|
|
326
|
+
padding: 12
|
|
327
|
+
},
|
|
328
|
+
elementCard: {
|
|
329
|
+
backgroundColor: "#2d2d2d",
|
|
330
|
+
borderRadius: 8,
|
|
331
|
+
padding: 12,
|
|
332
|
+
marginBottom: 8
|
|
333
|
+
},
|
|
334
|
+
elementHeader: {
|
|
335
|
+
flexDirection: "row",
|
|
336
|
+
justifyContent: "space-between",
|
|
337
|
+
alignItems: "center"
|
|
338
|
+
},
|
|
339
|
+
elementId: {
|
|
340
|
+
color: "#fff",
|
|
341
|
+
fontSize: 14,
|
|
342
|
+
fontWeight: "bold"
|
|
343
|
+
},
|
|
344
|
+
elementType: {
|
|
345
|
+
color: "#888",
|
|
346
|
+
fontSize: 12,
|
|
347
|
+
backgroundColor: "#444",
|
|
348
|
+
paddingHorizontal: 8,
|
|
349
|
+
paddingVertical: 2,
|
|
350
|
+
borderRadius: 4
|
|
351
|
+
},
|
|
352
|
+
elementLabel: {
|
|
353
|
+
color: "#aaa",
|
|
354
|
+
fontSize: 12,
|
|
355
|
+
marginTop: 4
|
|
356
|
+
},
|
|
357
|
+
stateRow: {
|
|
358
|
+
flexDirection: "row",
|
|
359
|
+
marginTop: 8
|
|
360
|
+
},
|
|
361
|
+
stateIndicator: {
|
|
362
|
+
flexDirection: "row",
|
|
363
|
+
alignItems: "center",
|
|
364
|
+
marginRight: 12
|
|
365
|
+
},
|
|
366
|
+
stateDot: {
|
|
367
|
+
width: 8,
|
|
368
|
+
height: 8,
|
|
369
|
+
borderRadius: 4,
|
|
370
|
+
marginRight: 4
|
|
371
|
+
},
|
|
372
|
+
stateLabel: {
|
|
373
|
+
color: "#888",
|
|
374
|
+
fontSize: 10
|
|
375
|
+
},
|
|
376
|
+
testId: {
|
|
377
|
+
color: "#666",
|
|
378
|
+
fontSize: 10,
|
|
379
|
+
marginTop: 4,
|
|
380
|
+
fontFamily: "monospace"
|
|
381
|
+
},
|
|
382
|
+
emptyText: {
|
|
383
|
+
color: "#888",
|
|
384
|
+
textAlign: "center",
|
|
385
|
+
marginTop: 20
|
|
386
|
+
},
|
|
387
|
+
detailContainer: {
|
|
388
|
+
flex: 1
|
|
389
|
+
},
|
|
390
|
+
detailHeader: {
|
|
391
|
+
flexDirection: "row",
|
|
392
|
+
justifyContent: "space-between",
|
|
393
|
+
alignItems: "center",
|
|
394
|
+
padding: 12,
|
|
395
|
+
borderBottomWidth: 1,
|
|
396
|
+
borderBottomColor: "#333"
|
|
397
|
+
},
|
|
398
|
+
detailTitle: {
|
|
399
|
+
color: "#fff",
|
|
400
|
+
fontSize: 16,
|
|
401
|
+
fontWeight: "bold"
|
|
402
|
+
},
|
|
403
|
+
detailContent: {
|
|
404
|
+
padding: 12
|
|
405
|
+
},
|
|
406
|
+
sectionTitle: {
|
|
407
|
+
color: "#888",
|
|
408
|
+
fontSize: 12,
|
|
409
|
+
marginTop: 12,
|
|
410
|
+
marginBottom: 4,
|
|
411
|
+
textTransform: "uppercase"
|
|
412
|
+
},
|
|
413
|
+
sectionValue: {
|
|
414
|
+
color: "#fff",
|
|
415
|
+
fontSize: 14
|
|
416
|
+
},
|
|
417
|
+
stateSection: {
|
|
418
|
+
backgroundColor: "#2d2d2d",
|
|
419
|
+
borderRadius: 8,
|
|
420
|
+
padding: 8
|
|
421
|
+
},
|
|
422
|
+
stateText: {
|
|
423
|
+
color: "#ddd",
|
|
424
|
+
fontSize: 12,
|
|
425
|
+
fontFamily: "monospace",
|
|
426
|
+
marginBottom: 2
|
|
427
|
+
},
|
|
428
|
+
actionsSection: {
|
|
429
|
+
flexDirection: "row",
|
|
430
|
+
flexWrap: "wrap"
|
|
431
|
+
},
|
|
432
|
+
actionBadge: {
|
|
433
|
+
backgroundColor: "#2196F3",
|
|
434
|
+
paddingHorizontal: 8,
|
|
435
|
+
paddingVertical: 4,
|
|
436
|
+
borderRadius: 4,
|
|
437
|
+
marginRight: 6,
|
|
438
|
+
marginBottom: 6
|
|
439
|
+
},
|
|
440
|
+
customActionBadge: {
|
|
441
|
+
backgroundColor: "#9C27B0"
|
|
442
|
+
},
|
|
443
|
+
actionText: {
|
|
444
|
+
color: "#fff",
|
|
445
|
+
fontSize: 12
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
exports.UIBridgeInspector = UIBridgeInspector;
|
|
450
|
+
//# sourceMappingURL=index.js.map
|
|
451
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/native/react/UIBridgeNativeProvider.tsx","../../../src/native/debug/inspector.tsx"],"names":["createContext","useContext","jsxs","TouchableOpacity","View","jsx","Text","ScrollView","Fragment","useState","useMemo","useCallback","Modal","Dimensions","StyleSheet"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * UI Bridge Native Provider\n *\n * React context provider for UI Bridge Native functionality.\n */\n\nimport React, {\n createContext,\n useContext,\n useMemo,\n useEffect,\n useCallback,\n useRef,\n useState,\n} from 'react';\nimport type {\n NativeUIBridgeFeatures,\n NativeUIBridgeConfig,\n RegisteredNativeElement,\n RegisteredNativeComponent,\n NativeBridgeSnapshot,\n BridgeEventType,\n BridgeEventListener,\n} from '../core/types';\nimport {\n NativeUIBridgeRegistry,\n setGlobalRegistry,\n resetGlobalRegistry,\n} from '../core/registry';\nimport { createNativeActionExecutor } from '../control/action-executor';\nimport type { NativeActionExecutor } from '../control/types';\n\n/**\n * UI Bridge Native context value\n */\nexport interface UIBridgeNativeContextValue {\n /** Feature flags */\n features: NativeUIBridgeFeatures;\n /** Configuration */\n config: NativeUIBridgeConfig;\n /** Element registry */\n registry: NativeUIBridgeRegistry;\n /** Action executor */\n executor: NativeActionExecutor;\n /** Get all registered elements */\n getElements: () => RegisteredNativeElement[];\n /** Get all registered components */\n getComponents: () => RegisteredNativeComponent[];\n /** Create a snapshot */\n createSnapshot: () => NativeBridgeSnapshot;\n /** Subscribe to events */\n on: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => () => void;\n /** Unsubscribe from events */\n off: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => void;\n /** Whether the provider is initialized */\n initialized: boolean;\n /** Server running status */\n serverRunning: boolean;\n /** Start the HTTP server */\n startServer: () => Promise<void>;\n /** Stop the HTTP server */\n stopServer: () => void;\n}\n\n/**\n * UI Bridge Native context\n */\nconst UIBridgeNativeContext = createContext<UIBridgeNativeContextValue | null>(null);\n\n/**\n * UI Bridge Native provider props\n */\nexport interface UIBridgeNativeProviderProps {\n /** Child components */\n children: React.ReactNode;\n /** Feature flags */\n features?: NativeUIBridgeFeatures;\n /** Configuration */\n config?: NativeUIBridgeConfig;\n /** Event handler */\n onEvent?: BridgeEventListener;\n}\n\n/**\n * UI Bridge Native Provider\n *\n * Provides UI Bridge Native context to child components.\n *\n * @example\n * ```tsx\n * // app/_layout.tsx\n * import { UIBridgeNativeProvider } from 'ui-bridge-native';\n *\n * export default function RootLayout() {\n * return (\n * <UIBridgeNativeProvider\n * features={{ server: __DEV__, debug: __DEV__ }}\n * config={{ serverPort: 9876 }}\n * >\n * <Stack>{children}</Stack>\n * </UIBridgeNativeProvider>\n * );\n * }\n * ```\n */\nexport function UIBridgeNativeProvider({\n children,\n features = {},\n config = {},\n onEvent,\n}: UIBridgeNativeProviderProps) {\n const registryRef = useRef<NativeUIBridgeRegistry | null>(null);\n const executorRef = useRef<NativeActionExecutor | null>(null);\n const [serverRunning, setServerRunning] = useState(false);\n\n // Initialize on first render\n if (!registryRef.current) {\n registryRef.current = new NativeUIBridgeRegistry({\n verbose: config.verbose,\n onEvent,\n });\n setGlobalRegistry(registryRef.current);\n }\n\n const registry = registryRef.current;\n\n // Create executor (memoized)\n if (!executorRef.current) {\n executorRef.current = createNativeActionExecutor(registry);\n }\n\n const executor = executorRef.current;\n\n // Server management (placeholder - actual implementation depends on RN HTTP server library)\n const startServer = useCallback(async () => {\n if (!features.server) {\n console.warn('[ui-bridge-native] Server feature not enabled');\n return;\n }\n\n // TODO: Implement actual HTTP server using react-native-http-bridge or similar\n // For now, just log that we would start the server\n console.log(\n `[ui-bridge-native] Would start HTTP server on port ${config.serverPort || 9876}`\n );\n setServerRunning(true);\n }, [features.server, config.serverPort]);\n\n const stopServer = useCallback(() => {\n // TODO: Implement actual server stop\n console.log('[ui-bridge-native] Would stop HTTP server');\n setServerRunning(false);\n }, []);\n\n // Auto-start server if enabled\n useEffect(() => {\n if (features.server) {\n startServer();\n return () => stopServer();\n }\n }, [features.server, startServer, stopServer]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n stopServer();\n resetGlobalRegistry();\n };\n }, [stopServer]);\n\n // Context methods\n const getElements = useCallback(() => registry.getAllElements(), [registry]);\n\n const getComponents = useCallback(() => registry.getAllComponents(), [registry]);\n\n const createSnapshot = useCallback(() => registry.createSnapshot(), [registry]);\n\n const on = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.on(type, listener),\n [registry]\n );\n\n const off = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.off(type, listener),\n [registry]\n );\n\n const contextValue = useMemo<UIBridgeNativeContextValue>(\n () => ({\n features,\n config,\n registry,\n executor,\n getElements,\n getComponents,\n createSnapshot,\n on,\n off,\n initialized: true,\n serverRunning,\n startServer,\n stopServer,\n }),\n [\n features,\n config,\n registry,\n executor,\n getElements,\n getComponents,\n createSnapshot,\n on,\n off,\n serverRunning,\n startServer,\n stopServer,\n ]\n );\n\n return (\n <UIBridgeNativeContext.Provider value={contextValue}>\n {children}\n </UIBridgeNativeContext.Provider>\n );\n}\n\n/**\n * useUIBridgeNative hook\n *\n * Access the UI Bridge Native context. Throws if used outside provider.\n */\nexport function useUIBridgeNative(): UIBridgeNativeContextValue {\n const context = useContext(UIBridgeNativeContext);\n if (!context) {\n throw new Error('useUIBridgeNative must be used within a UIBridgeNativeProvider');\n }\n return context;\n}\n\n/**\n * useUIBridgeNativeOptional hook\n *\n * Access the UI Bridge Native context, returning null if outside provider.\n */\nexport function useUIBridgeNativeOptional(): UIBridgeNativeContextValue | null {\n return useContext(UIBridgeNativeContext);\n}\n\n/**\n * useUIBridgeNativeRequired hook\n *\n * Alias for useUIBridgeNative (throws if outside provider).\n */\nexport const useUIBridgeNativeRequired = useUIBridgeNative;\n","/**\n * UI Bridge Native Debug Inspector\n *\n * An overlay component that shows registered elements and allows\n * inspection of the UI Bridge state.\n */\n\nimport React, { useState, useCallback, useMemo } from 'react';\nimport {\n View,\n Text,\n StyleSheet,\n TouchableOpacity,\n ScrollView,\n Modal,\n Dimensions,\n} from 'react-native';\nimport { useUIBridgeNativeOptional } from '../react/UIBridgeNativeProvider';\nimport type { RegisteredNativeElement } from '../core/types';\n\n/**\n * Inspector props\n */\nexport interface UIBridgeInspectorProps {\n /** Whether to show the inspector */\n visible?: boolean;\n /** Callback when inspector is closed */\n onClose?: () => void;\n /** Position of the inspector toggle button */\n togglePosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n}\n\n/**\n * Element info card\n */\nfunction ElementCard({\n element,\n onPress,\n}: {\n element: RegisteredNativeElement;\n onPress: (element: RegisteredNativeElement) => void;\n}) {\n const state = element.getState();\n const identifier = element.getIdentifier();\n\n return (\n <TouchableOpacity\n style={styles.elementCard}\n onPress={() => onPress(element)}\n >\n <View style={styles.elementHeader}>\n <Text style={styles.elementId}>{element.id}</Text>\n <Text style={styles.elementType}>{element.type}</Text>\n </View>\n {element.label && (\n <Text style={styles.elementLabel}>{element.label}</Text>\n )}\n <View style={styles.stateRow}>\n <StateIndicator label=\"Mounted\" value={state.mounted} />\n <StateIndicator label=\"Visible\" value={state.visible} />\n <StateIndicator label=\"Enabled\" value={state.enabled} />\n </View>\n {identifier.testId && (\n <Text style={styles.testId}>testID: {identifier.testId}</Text>\n )}\n </TouchableOpacity>\n );\n}\n\n/**\n * State indicator\n */\nfunction StateIndicator({ label, value }: { label: string; value: boolean }) {\n return (\n <View style={styles.stateIndicator}>\n <View\n style={[\n styles.stateDot,\n { backgroundColor: value ? '#4CAF50' : '#F44336' },\n ]}\n />\n <Text style={styles.stateLabel}>{label}</Text>\n </View>\n );\n}\n\n/**\n * Element detail view\n */\nfunction ElementDetail({\n element,\n onClose,\n}: {\n element: RegisteredNativeElement;\n onClose: () => void;\n}) {\n const state = element.getState();\n const identifier = element.getIdentifier();\n\n return (\n <View style={styles.detailContainer}>\n <View style={styles.detailHeader}>\n <Text style={styles.detailTitle}>{element.id}</Text>\n <TouchableOpacity onPress={onClose}>\n <Text style={styles.closeButton}>Close</Text>\n </TouchableOpacity>\n </View>\n\n <ScrollView style={styles.detailContent}>\n <Text style={styles.sectionTitle}>Type</Text>\n <Text style={styles.sectionValue}>{element.type}</Text>\n\n {element.label && (\n <>\n <Text style={styles.sectionTitle}>Label</Text>\n <Text style={styles.sectionValue}>{element.label}</Text>\n </>\n )}\n\n <Text style={styles.sectionTitle}>State</Text>\n <View style={styles.stateSection}>\n <Text style={styles.stateText}>Mounted: {String(state.mounted)}</Text>\n <Text style={styles.stateText}>Visible: {String(state.visible)}</Text>\n <Text style={styles.stateText}>Enabled: {String(state.enabled)}</Text>\n <Text style={styles.stateText}>Focused: {String(state.focused)}</Text>\n {state.value !== undefined && (\n <Text style={styles.stateText}>Value: {state.value}</Text>\n )}\n </View>\n\n {state.layout && (\n <>\n <Text style={styles.sectionTitle}>Layout</Text>\n <View style={styles.stateSection}>\n <Text style={styles.stateText}>\n Position: ({state.layout.x}, {state.layout.y})\n </Text>\n <Text style={styles.stateText}>\n Size: {state.layout.width} x {state.layout.height}\n </Text>\n <Text style={styles.stateText}>\n Page: ({state.layout.pageX}, {state.layout.pageY})\n </Text>\n </View>\n </>\n )}\n\n <Text style={styles.sectionTitle}>Identifier</Text>\n <View style={styles.stateSection}>\n {identifier.uiId && (\n <Text style={styles.stateText}>uiId: {identifier.uiId}</Text>\n )}\n {identifier.testId && (\n <Text style={styles.stateText}>testId: {identifier.testId}</Text>\n )}\n {identifier.accessibilityLabel && (\n <Text style={styles.stateText}>\n a11yLabel: {identifier.accessibilityLabel}\n </Text>\n )}\n <Text style={styles.stateText}>treePath: {identifier.treePath}</Text>\n </View>\n\n <Text style={styles.sectionTitle}>Actions</Text>\n <View style={styles.actionsSection}>\n {element.actions.map((action) => (\n <View key={action} style={styles.actionBadge}>\n <Text style={styles.actionText}>{action}</Text>\n </View>\n ))}\n </View>\n\n {element.customActions && Object.keys(element.customActions).length > 0 && (\n <>\n <Text style={styles.sectionTitle}>Custom Actions</Text>\n <View style={styles.actionsSection}>\n {Object.keys(element.customActions).map((action) => (\n <View key={action} style={[styles.actionBadge, styles.customActionBadge]}>\n <Text style={styles.actionText}>{action}</Text>\n </View>\n ))}\n </View>\n </>\n )}\n </ScrollView>\n </View>\n );\n}\n\n/**\n * UI Bridge Inspector component\n *\n * Shows an overlay with information about registered elements.\n * Useful for debugging and development.\n *\n * @example\n * ```tsx\n * function App() {\n * const [showInspector, setShowInspector] = useState(false);\n *\n * return (\n * <UIBridgeNativeProvider features={{ debug: __DEV__ }}>\n * <MainContent />\n * {__DEV__ && (\n * <UIBridgeInspector\n * visible={showInspector}\n * onClose={() => setShowInspector(false)}\n * />\n * )}\n * </UIBridgeNativeProvider>\n * );\n * }\n * ```\n */\nexport function UIBridgeInspector({\n visible = false,\n onClose,\n togglePosition = 'bottom-right',\n}: UIBridgeInspectorProps) {\n const bridge = useUIBridgeNativeOptional();\n const [showInspector, setShowInspector] = useState(visible);\n const [selectedElement, setSelectedElement] = useState<RegisteredNativeElement | null>(\n null\n );\n\n const elements = useMemo(\n () => (bridge ? bridge.getElements() : []),\n [bridge, showInspector]\n );\n\n const components = useMemo(\n () => (bridge ? bridge.getComponents() : []),\n [bridge, showInspector]\n );\n\n const handleToggle = useCallback(() => {\n setShowInspector((prev) => !prev);\n }, []);\n\n const handleClose = useCallback(() => {\n setShowInspector(false);\n onClose?.();\n }, [onClose]);\n\n const handleSelectElement = useCallback((element: RegisteredNativeElement) => {\n setSelectedElement(element);\n }, []);\n\n const handleCloseDetail = useCallback(() => {\n setSelectedElement(null);\n }, []);\n\n // Position style for toggle button\n const toggleStyle = useMemo(() => {\n switch (togglePosition) {\n case 'top-left':\n return { top: 50, left: 10 };\n case 'top-right':\n return { top: 50, right: 10 };\n case 'bottom-left':\n return { bottom: 50, left: 10 };\n case 'bottom-right':\n default:\n return { bottom: 50, right: 10 };\n }\n }, [togglePosition]);\n\n if (!bridge) {\n return null;\n }\n\n return (\n <>\n {/* Toggle button */}\n <TouchableOpacity\n style={[styles.toggleButton, toggleStyle]}\n onPress={handleToggle}\n >\n <Text style={styles.toggleText}>UI</Text>\n </TouchableOpacity>\n\n {/* Inspector modal */}\n <Modal\n visible={showInspector}\n animationType=\"slide\"\n transparent={true}\n onRequestClose={handleClose}\n >\n <View style={styles.modalContainer}>\n <View style={styles.inspectorContainer}>\n {/* Header */}\n <View style={styles.header}>\n <Text style={styles.headerTitle}>UI Bridge Inspector</Text>\n <TouchableOpacity onPress={handleClose}>\n <Text style={styles.closeButton}>X</Text>\n </TouchableOpacity>\n </View>\n\n {/* Stats */}\n <View style={styles.statsRow}>\n <View style={styles.stat}>\n <Text style={styles.statValue}>{elements.length}</Text>\n <Text style={styles.statLabel}>Elements</Text>\n </View>\n <View style={styles.stat}>\n <Text style={styles.statValue}>{components.length}</Text>\n <Text style={styles.statLabel}>Components</Text>\n </View>\n <View style={styles.stat}>\n <Text style={styles.statValue}>\n {bridge.serverRunning ? 'ON' : 'OFF'}\n </Text>\n <Text style={styles.statLabel}>Server</Text>\n </View>\n </View>\n\n {/* Element list or detail */}\n {selectedElement ? (\n <ElementDetail\n element={selectedElement}\n onClose={handleCloseDetail}\n />\n ) : (\n <ScrollView style={styles.elementList}>\n {elements.map((element) => (\n <ElementCard\n key={element.id}\n element={element}\n onPress={handleSelectElement}\n />\n ))}\n {elements.length === 0 && (\n <Text style={styles.emptyText}>\n No elements registered yet\n </Text>\n )}\n </ScrollView>\n )}\n </View>\n </View>\n </Modal>\n </>\n );\n}\n\nconst { height: screenHeight } = Dimensions.get('window');\n\nconst styles = StyleSheet.create({\n toggleButton: {\n position: 'absolute',\n width: 44,\n height: 44,\n borderRadius: 22,\n backgroundColor: '#2196F3',\n justifyContent: 'center',\n alignItems: 'center',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n elevation: 5,\n zIndex: 1000,\n },\n toggleText: {\n color: '#fff',\n fontWeight: 'bold',\n fontSize: 14,\n },\n modalContainer: {\n flex: 1,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n justifyContent: 'flex-end',\n },\n inspectorContainer: {\n backgroundColor: '#1e1e1e',\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n maxHeight: screenHeight * 0.8,\n },\n header: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 16,\n borderBottomWidth: 1,\n borderBottomColor: '#333',\n },\n headerTitle: {\n color: '#fff',\n fontSize: 18,\n fontWeight: 'bold',\n },\n closeButton: {\n color: '#2196F3',\n fontSize: 16,\n fontWeight: 'bold',\n },\n statsRow: {\n flexDirection: 'row',\n padding: 12,\n borderBottomWidth: 1,\n borderBottomColor: '#333',\n },\n stat: {\n flex: 1,\n alignItems: 'center',\n },\n statValue: {\n color: '#fff',\n fontSize: 20,\n fontWeight: 'bold',\n },\n statLabel: {\n color: '#888',\n fontSize: 12,\n marginTop: 2,\n },\n elementList: {\n padding: 12,\n },\n elementCard: {\n backgroundColor: '#2d2d2d',\n borderRadius: 8,\n padding: 12,\n marginBottom: 8,\n },\n elementHeader: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n elementId: {\n color: '#fff',\n fontSize: 14,\n fontWeight: 'bold',\n },\n elementType: {\n color: '#888',\n fontSize: 12,\n backgroundColor: '#444',\n paddingHorizontal: 8,\n paddingVertical: 2,\n borderRadius: 4,\n },\n elementLabel: {\n color: '#aaa',\n fontSize: 12,\n marginTop: 4,\n },\n stateRow: {\n flexDirection: 'row',\n marginTop: 8,\n },\n stateIndicator: {\n flexDirection: 'row',\n alignItems: 'center',\n marginRight: 12,\n },\n stateDot: {\n width: 8,\n height: 8,\n borderRadius: 4,\n marginRight: 4,\n },\n stateLabel: {\n color: '#888',\n fontSize: 10,\n },\n testId: {\n color: '#666',\n fontSize: 10,\n marginTop: 4,\n fontFamily: 'monospace',\n },\n emptyText: {\n color: '#888',\n textAlign: 'center',\n marginTop: 20,\n },\n detailContainer: {\n flex: 1,\n },\n detailHeader: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 12,\n borderBottomWidth: 1,\n borderBottomColor: '#333',\n },\n detailTitle: {\n color: '#fff',\n fontSize: 16,\n fontWeight: 'bold',\n },\n detailContent: {\n padding: 12,\n },\n sectionTitle: {\n color: '#888',\n fontSize: 12,\n marginTop: 12,\n marginBottom: 4,\n textTransform: 'uppercase',\n },\n sectionValue: {\n color: '#fff',\n fontSize: 14,\n },\n stateSection: {\n backgroundColor: '#2d2d2d',\n borderRadius: 8,\n padding: 8,\n },\n stateText: {\n color: '#ddd',\n fontSize: 12,\n fontFamily: 'monospace',\n marginBottom: 2,\n },\n actionsSection: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n },\n actionBadge: {\n backgroundColor: '#2196F3',\n paddingHorizontal: 8,\n paddingVertical: 4,\n borderRadius: 4,\n marginRight: 6,\n marginBottom: 6,\n },\n customActionBadge: {\n backgroundColor: '#9C27B0',\n },\n actionText: {\n color: '#fff',\n fontSize: 12,\n },\n});\n"]}
|