@qontinui/ui-bridge 0.2.0 → 0.3.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.
Files changed (140) hide show
  1. package/dist/ai/index.d.mts +312 -155
  2. package/dist/ai/index.d.ts +312 -155
  3. package/dist/ai/index.js +2363 -67
  4. package/dist/ai/index.js.map +1 -1
  5. package/dist/ai/index.mjs +2328 -68
  6. package/dist/ai/index.mjs.map +1 -1
  7. package/dist/annotations/index.d.mts +218 -0
  8. package/dist/annotations/index.d.ts +218 -0
  9. package/dist/annotations/index.js +246 -0
  10. package/dist/annotations/index.js.map +1 -0
  11. package/dist/annotations/index.mjs +241 -0
  12. package/dist/annotations/index.mjs.map +1 -0
  13. package/dist/assertions-BSR3afVr.d.ts +161 -0
  14. package/dist/assertions-CTw1hfOx.d.mts +161 -0
  15. package/dist/babel-plugin/index.js +504 -0
  16. package/dist/babel-plugin/index.js.map +1 -0
  17. package/dist/babel-plugin/index.mjs +488 -0
  18. package/dist/babel-plugin/index.mjs.map +1 -0
  19. package/dist/browser-capture-Bms60T6f.d.mts +47 -0
  20. package/dist/browser-capture-CsTU29mb.d.ts +47 -0
  21. package/dist/control/index.d.mts +26 -7
  22. package/dist/control/index.d.ts +26 -7
  23. package/dist/control/index.js +276 -48
  24. package/dist/control/index.js.map +1 -1
  25. package/dist/control/index.mjs +276 -48
  26. package/dist/control/index.mjs.map +1 -1
  27. package/dist/core/index.d.mts +115 -44
  28. package/dist/core/index.d.ts +115 -44
  29. package/dist/core/index.js +0 -1560
  30. package/dist/core/index.js.map +1 -1
  31. package/dist/core/index.mjs +1 -1549
  32. package/dist/core/index.mjs.map +1 -1
  33. package/dist/debug/index.d.mts +5 -3
  34. package/dist/debug/index.d.ts +5 -3
  35. package/dist/debug/index.js +925 -1
  36. package/dist/debug/index.js.map +1 -1
  37. package/dist/debug/index.mjs +924 -2
  38. package/dist/debug/index.mjs.map +1 -1
  39. package/dist/index.d.mts +13 -9
  40. package/dist/index.d.ts +13 -9
  41. package/dist/index.js +8310 -3777
  42. package/dist/index.js.map +1 -1
  43. package/dist/index.mjs +8246 -3766
  44. package/dist/index.mjs.map +1 -1
  45. package/dist/{metrics-NC3csD0R.d.mts → metrics-DuA2qIIz.d.mts} +2 -2
  46. package/dist/{metrics-C9XRi_mL.d.ts → metrics-KFAAKNEB.d.ts} +2 -2
  47. package/dist/native/control/index.js +448 -0
  48. package/dist/native/control/index.js.map +1 -0
  49. package/dist/native/control/index.mjs +445 -0
  50. package/dist/native/control/index.mjs.map +1 -0
  51. package/dist/native/core/index.js +486 -0
  52. package/dist/native/core/index.js.map +1 -0
  53. package/dist/native/core/index.mjs +475 -0
  54. package/dist/native/core/index.mjs.map +1 -0
  55. package/dist/native/debug/index.js +408 -0
  56. package/dist/native/debug/index.js.map +1 -0
  57. package/dist/native/debug/index.mjs +406 -0
  58. package/dist/native/debug/index.mjs.map +1 -0
  59. package/dist/native/index.js +2232 -0
  60. package/dist/native/index.js.map +1 -0
  61. package/dist/native/index.mjs +2204 -0
  62. package/dist/native/index.mjs.map +1 -0
  63. package/dist/native/react/index.js +1377 -0
  64. package/dist/native/react/index.js.map +1 -0
  65. package/dist/native/react/index.mjs +1365 -0
  66. package/dist/native/react/index.mjs.map +1 -0
  67. package/dist/native/server/index.js +440 -0
  68. package/dist/native/server/index.js.map +1 -0
  69. package/dist/native/server/index.mjs +435 -0
  70. package/dist/native/server/index.mjs.map +1 -0
  71. package/dist/react/index.d.mts +121 -9
  72. package/dist/react/index.d.ts +121 -9
  73. package/dist/react/index.js +2239 -91
  74. package/dist/react/index.js.map +1 -1
  75. package/dist/react/index.mjs +2239 -92
  76. package/dist/react/index.mjs.map +1 -1
  77. package/dist/{registry-CIEDjbQ9.d.ts → registry-C6dDtn1v.d.ts} +34 -15
  78. package/dist/{registry-SsSDq46X.d.mts → registry-POtcxnal.d.mts} +34 -15
  79. package/dist/render-log/index.d.mts +1 -1
  80. package/dist/render-log/index.d.ts +1 -1
  81. package/dist/server/express.d.mts +37 -0
  82. package/dist/server/express.d.ts +37 -0
  83. package/dist/server/express.js +298 -0
  84. package/dist/server/express.js.map +1 -0
  85. package/dist/server/express.mjs +294 -0
  86. package/dist/server/express.mjs.map +1 -0
  87. package/dist/server/handlers.d.mts +124 -0
  88. package/dist/server/handlers.d.ts +124 -0
  89. package/dist/server/handlers.js +7183 -0
  90. package/dist/server/handlers.js.map +1 -0
  91. package/dist/server/handlers.mjs +7180 -0
  92. package/dist/server/handlers.mjs.map +1 -0
  93. package/dist/server/index.d.mts +12 -0
  94. package/dist/server/index.d.ts +12 -0
  95. package/dist/server/index.js +8384 -0
  96. package/dist/server/index.js.map +1 -0
  97. package/dist/server/index.mjs +8369 -0
  98. package/dist/server/index.mjs.map +1 -0
  99. package/dist/server/nextjs.d.mts +128 -0
  100. package/dist/server/nextjs.d.ts +128 -0
  101. package/dist/server/nextjs.js +390 -0
  102. package/dist/server/nextjs.js.map +1 -0
  103. package/dist/server/nextjs.mjs +385 -0
  104. package/dist/server/nextjs.mjs.map +1 -0
  105. package/dist/server/standalone.d.mts +7 -0
  106. package/dist/server/standalone.d.ts +7 -0
  107. package/dist/server/standalone.js +845 -0
  108. package/dist/server/standalone.js.map +1 -0
  109. package/dist/server/standalone.mjs +841 -0
  110. package/dist/server/standalone.mjs.map +1 -0
  111. package/dist/specs/index.d.mts +365 -0
  112. package/dist/specs/index.d.ts +365 -0
  113. package/dist/specs/index.js +2809 -0
  114. package/dist/specs/index.js.map +1 -0
  115. package/dist/specs/index.mjs +2786 -0
  116. package/dist/specs/index.mjs.map +1 -0
  117. package/dist/standalone-B6GLIEmR.d.ts +216 -0
  118. package/dist/standalone-CjdYqj3P.d.mts +216 -0
  119. package/dist/swc-plugin/index.d.mts +79 -0
  120. package/dist/swc-plugin/index.d.ts +79 -0
  121. package/dist/swc-plugin/index.js +15 -0
  122. package/dist/swc-plugin/index.js.map +1 -0
  123. package/dist/swc-plugin/index.mjs +9 -0
  124. package/dist/swc-plugin/index.mjs.map +1 -0
  125. package/dist/types-B2EfvEaq.d.ts +236 -0
  126. package/dist/{types-Dr6tH-bm.d.mts → types-C7gVYRnF.d.ts} +72 -2
  127. package/dist/{types-oCTrRxSw.d.ts → types-CJGrBEhC.d.mts} +72 -2
  128. package/dist/types-CebMQj76.d.ts +1275 -0
  129. package/dist/types-D_ypYl3T.d.mts +1275 -0
  130. package/dist/types-UBtp7R0u.d.mts +132 -0
  131. package/dist/types-UBtp7R0u.d.ts +132 -0
  132. package/dist/types-gO696T_t.d.mts +236 -0
  133. package/dist/{types-CPMbN_Iw.d.mts → types-suaYwWWg.d.mts} +519 -152
  134. package/dist/{types-CPMbN_Iw.d.ts → types-suaYwWWg.d.ts} +519 -152
  135. package/package.json +123 -4
  136. package/swc-plugin-wasm/ui_bridge_swc_plugin.wasm +0 -0
  137. package/dist/types-BvCfFuEV.d.ts +0 -534
  138. package/dist/types-CFT3Dnx4.d.mts +0 -534
  139. package/dist/websocket-client-CX4QJesI.d.ts +0 -124
  140. package/dist/websocket-client-C_Na0OSp.d.mts +0 -124
@@ -0,0 +1,406 @@
1
+ import { createContext, useState, useMemo, useCallback, useContext } from 'react';
2
+ import { Dimensions, StyleSheet, TouchableOpacity, Text, Modal, View, ScrollView } from 'react-native';
3
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
4
+
5
+ // src/native/debug/inspector.tsx
6
+ var UIBridgeNativeContext = createContext(null);
7
+ function useUIBridgeNativeOptional() {
8
+ return useContext(UIBridgeNativeContext);
9
+ }
10
+ function ElementCard({
11
+ element,
12
+ onPress
13
+ }) {
14
+ const state = element.getState();
15
+ const identifier = element.getIdentifier();
16
+ return /* @__PURE__ */ jsxs(TouchableOpacity, { style: styles.elementCard, onPress: () => onPress(element), children: [
17
+ /* @__PURE__ */ jsxs(View, { style: styles.elementHeader, children: [
18
+ /* @__PURE__ */ jsx(Text, { style: styles.elementId, children: element.id }),
19
+ /* @__PURE__ */ jsx(Text, { style: styles.elementType, children: element.type })
20
+ ] }),
21
+ element.label && /* @__PURE__ */ jsx(Text, { style: styles.elementLabel, children: element.label }),
22
+ /* @__PURE__ */ jsxs(View, { style: styles.stateRow, children: [
23
+ /* @__PURE__ */ jsx(StateIndicator, { label: "Mounted", value: state.mounted }),
24
+ /* @__PURE__ */ jsx(StateIndicator, { label: "Visible", value: state.visible }),
25
+ /* @__PURE__ */ jsx(StateIndicator, { label: "Enabled", value: state.enabled })
26
+ ] }),
27
+ identifier.testId && /* @__PURE__ */ jsxs(Text, { style: styles.testId, children: [
28
+ "testID: ",
29
+ identifier.testId
30
+ ] })
31
+ ] });
32
+ }
33
+ function StateIndicator({ label, value }) {
34
+ return /* @__PURE__ */ jsxs(View, { style: styles.stateIndicator, children: [
35
+ /* @__PURE__ */ jsx(View, { style: [styles.stateDot, { backgroundColor: value ? "#4CAF50" : "#F44336" }] }),
36
+ /* @__PURE__ */ jsx(Text, { style: styles.stateLabel, children: label })
37
+ ] });
38
+ }
39
+ function ElementDetail({
40
+ element,
41
+ onClose
42
+ }) {
43
+ const state = element.getState();
44
+ const identifier = element.getIdentifier();
45
+ return /* @__PURE__ */ jsxs(View, { style: styles.detailContainer, children: [
46
+ /* @__PURE__ */ jsxs(View, { style: styles.detailHeader, children: [
47
+ /* @__PURE__ */ jsx(Text, { style: styles.detailTitle, children: element.id }),
48
+ /* @__PURE__ */ jsx(TouchableOpacity, { onPress: onClose, children: /* @__PURE__ */ jsx(Text, { style: styles.closeButton, children: "Close" }) })
49
+ ] }),
50
+ /* @__PURE__ */ jsxs(ScrollView, { style: styles.detailContent, children: [
51
+ /* @__PURE__ */ jsx(Text, { style: styles.sectionTitle, children: "Type" }),
52
+ /* @__PURE__ */ jsx(Text, { style: styles.sectionValue, children: element.type }),
53
+ element.label && /* @__PURE__ */ jsxs(Fragment, { children: [
54
+ /* @__PURE__ */ jsx(Text, { style: styles.sectionTitle, children: "Label" }),
55
+ /* @__PURE__ */ jsx(Text, { style: styles.sectionValue, children: element.label })
56
+ ] }),
57
+ /* @__PURE__ */ jsx(Text, { style: styles.sectionTitle, children: "State" }),
58
+ /* @__PURE__ */ jsxs(View, { style: styles.stateSection, children: [
59
+ /* @__PURE__ */ jsxs(Text, { style: styles.stateText, children: [
60
+ "Mounted: ",
61
+ String(state.mounted)
62
+ ] }),
63
+ /* @__PURE__ */ jsxs(Text, { style: styles.stateText, children: [
64
+ "Visible: ",
65
+ String(state.visible)
66
+ ] }),
67
+ /* @__PURE__ */ jsxs(Text, { style: styles.stateText, children: [
68
+ "Enabled: ",
69
+ String(state.enabled)
70
+ ] }),
71
+ /* @__PURE__ */ jsxs(Text, { style: styles.stateText, children: [
72
+ "Focused: ",
73
+ String(state.focused)
74
+ ] }),
75
+ state.value !== void 0 && /* @__PURE__ */ jsxs(Text, { style: styles.stateText, children: [
76
+ "Value: ",
77
+ state.value
78
+ ] })
79
+ ] }),
80
+ state.layout && /* @__PURE__ */ jsxs(Fragment, { children: [
81
+ /* @__PURE__ */ jsx(Text, { style: styles.sectionTitle, children: "Layout" }),
82
+ /* @__PURE__ */ jsxs(View, { style: styles.stateSection, children: [
83
+ /* @__PURE__ */ jsxs(Text, { style: styles.stateText, children: [
84
+ "Position: (",
85
+ state.layout.x,
86
+ ", ",
87
+ state.layout.y,
88
+ ")"
89
+ ] }),
90
+ /* @__PURE__ */ jsxs(Text, { style: styles.stateText, children: [
91
+ "Size: ",
92
+ state.layout.width,
93
+ " x ",
94
+ state.layout.height
95
+ ] }),
96
+ /* @__PURE__ */ jsxs(Text, { style: styles.stateText, children: [
97
+ "Page: (",
98
+ state.layout.pageX,
99
+ ", ",
100
+ state.layout.pageY,
101
+ ")"
102
+ ] })
103
+ ] })
104
+ ] }),
105
+ /* @__PURE__ */ jsx(Text, { style: styles.sectionTitle, children: "Identifier" }),
106
+ /* @__PURE__ */ jsxs(View, { style: styles.stateSection, children: [
107
+ identifier.uiId && /* @__PURE__ */ jsxs(Text, { style: styles.stateText, children: [
108
+ "uiId: ",
109
+ identifier.uiId
110
+ ] }),
111
+ identifier.testId && /* @__PURE__ */ jsxs(Text, { style: styles.stateText, children: [
112
+ "testId: ",
113
+ identifier.testId
114
+ ] }),
115
+ identifier.accessibilityLabel && /* @__PURE__ */ jsxs(Text, { style: styles.stateText, children: [
116
+ "a11yLabel: ",
117
+ identifier.accessibilityLabel
118
+ ] }),
119
+ /* @__PURE__ */ jsxs(Text, { style: styles.stateText, children: [
120
+ "treePath: ",
121
+ identifier.treePath
122
+ ] })
123
+ ] }),
124
+ /* @__PURE__ */ jsx(Text, { style: styles.sectionTitle, children: "Actions" }),
125
+ /* @__PURE__ */ jsx(View, { style: styles.actionsSection, children: element.actions.map((action) => /* @__PURE__ */ jsx(View, { style: styles.actionBadge, children: /* @__PURE__ */ jsx(Text, { style: styles.actionText, children: action }) }, action)) }),
126
+ element.customActions && Object.keys(element.customActions).length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
127
+ /* @__PURE__ */ jsx(Text, { style: styles.sectionTitle, children: "Custom Actions" }),
128
+ /* @__PURE__ */ jsx(View, { style: styles.actionsSection, children: Object.keys(element.customActions).map((action) => /* @__PURE__ */ jsx(View, { style: [styles.actionBadge, styles.customActionBadge], children: /* @__PURE__ */ jsx(Text, { style: styles.actionText, children: action }) }, action)) })
129
+ ] })
130
+ ] })
131
+ ] });
132
+ }
133
+ function UIBridgeInspector({
134
+ visible = false,
135
+ onClose,
136
+ togglePosition = "bottom-right"
137
+ }) {
138
+ const bridge = useUIBridgeNativeOptional();
139
+ const [showInspector, setShowInspector] = useState(visible);
140
+ const [selectedElement, setSelectedElement] = useState(null);
141
+ const elements = useMemo(() => bridge ? bridge.getElements() : [], [bridge, showInspector]);
142
+ const components = useMemo(() => bridge ? bridge.getComponents() : [], [bridge, showInspector]);
143
+ const handleToggle = useCallback(() => {
144
+ setShowInspector((prev) => !prev);
145
+ }, []);
146
+ const handleClose = useCallback(() => {
147
+ setShowInspector(false);
148
+ onClose?.();
149
+ }, [onClose]);
150
+ const handleSelectElement = useCallback((element) => {
151
+ setSelectedElement(element);
152
+ }, []);
153
+ const handleCloseDetail = useCallback(() => {
154
+ setSelectedElement(null);
155
+ }, []);
156
+ const toggleStyle = useMemo(() => {
157
+ switch (togglePosition) {
158
+ case "top-left":
159
+ return { top: 50, left: 10 };
160
+ case "top-right":
161
+ return { top: 50, right: 10 };
162
+ case "bottom-left":
163
+ return { bottom: 50, left: 10 };
164
+ case "bottom-right":
165
+ default:
166
+ return { bottom: 50, right: 10 };
167
+ }
168
+ }, [togglePosition]);
169
+ if (!bridge) {
170
+ return null;
171
+ }
172
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
173
+ /* @__PURE__ */ jsx(TouchableOpacity, { style: [styles.toggleButton, toggleStyle], onPress: handleToggle, children: /* @__PURE__ */ jsx(Text, { style: styles.toggleText, children: "UI" }) }),
174
+ /* @__PURE__ */ jsx(
175
+ Modal,
176
+ {
177
+ visible: showInspector,
178
+ animationType: "slide",
179
+ transparent: true,
180
+ onRequestClose: handleClose,
181
+ children: /* @__PURE__ */ jsx(View, { style: styles.modalContainer, children: /* @__PURE__ */ jsxs(View, { style: styles.inspectorContainer, children: [
182
+ /* @__PURE__ */ jsxs(View, { style: styles.header, children: [
183
+ /* @__PURE__ */ jsx(Text, { style: styles.headerTitle, children: "UI Bridge Inspector" }),
184
+ /* @__PURE__ */ jsx(TouchableOpacity, { onPress: handleClose, children: /* @__PURE__ */ jsx(Text, { style: styles.closeButton, children: "X" }) })
185
+ ] }),
186
+ /* @__PURE__ */ jsxs(View, { style: styles.statsRow, children: [
187
+ /* @__PURE__ */ jsxs(View, { style: styles.stat, children: [
188
+ /* @__PURE__ */ jsx(Text, { style: styles.statValue, children: elements.length }),
189
+ /* @__PURE__ */ jsx(Text, { style: styles.statLabel, children: "Elements" })
190
+ ] }),
191
+ /* @__PURE__ */ jsxs(View, { style: styles.stat, children: [
192
+ /* @__PURE__ */ jsx(Text, { style: styles.statValue, children: components.length }),
193
+ /* @__PURE__ */ jsx(Text, { style: styles.statLabel, children: "Components" })
194
+ ] }),
195
+ /* @__PURE__ */ jsxs(View, { style: styles.stat, children: [
196
+ /* @__PURE__ */ jsx(Text, { style: styles.statValue, children: bridge.serverRunning ? "ON" : "OFF" }),
197
+ /* @__PURE__ */ jsx(Text, { style: styles.statLabel, children: "Server" })
198
+ ] })
199
+ ] }),
200
+ selectedElement ? /* @__PURE__ */ jsx(ElementDetail, { element: selectedElement, onClose: handleCloseDetail }) : /* @__PURE__ */ jsxs(ScrollView, { style: styles.elementList, children: [
201
+ elements.map((element) => /* @__PURE__ */ jsx(ElementCard, { element, onPress: handleSelectElement }, element.id)),
202
+ elements.length === 0 && /* @__PURE__ */ jsx(Text, { style: styles.emptyText, children: "No elements registered yet" })
203
+ ] })
204
+ ] }) })
205
+ }
206
+ )
207
+ ] });
208
+ }
209
+ var { height: screenHeight } = Dimensions.get("window");
210
+ var styles = StyleSheet.create({
211
+ toggleButton: {
212
+ position: "absolute",
213
+ width: 44,
214
+ height: 44,
215
+ borderRadius: 22,
216
+ backgroundColor: "#2196F3",
217
+ justifyContent: "center",
218
+ alignItems: "center",
219
+ shadowColor: "#000",
220
+ shadowOffset: { width: 0, height: 2 },
221
+ shadowOpacity: 0.25,
222
+ shadowRadius: 4,
223
+ elevation: 5,
224
+ zIndex: 1e3
225
+ },
226
+ toggleText: {
227
+ color: "#fff",
228
+ fontWeight: "bold",
229
+ fontSize: 14
230
+ },
231
+ modalContainer: {
232
+ flex: 1,
233
+ backgroundColor: "rgba(0, 0, 0, 0.5)",
234
+ justifyContent: "flex-end"
235
+ },
236
+ inspectorContainer: {
237
+ backgroundColor: "#1e1e1e",
238
+ borderTopLeftRadius: 16,
239
+ borderTopRightRadius: 16,
240
+ maxHeight: screenHeight * 0.8
241
+ },
242
+ header: {
243
+ flexDirection: "row",
244
+ justifyContent: "space-between",
245
+ alignItems: "center",
246
+ padding: 16,
247
+ borderBottomWidth: 1,
248
+ borderBottomColor: "#333"
249
+ },
250
+ headerTitle: {
251
+ color: "#fff",
252
+ fontSize: 18,
253
+ fontWeight: "bold"
254
+ },
255
+ closeButton: {
256
+ color: "#2196F3",
257
+ fontSize: 16,
258
+ fontWeight: "bold"
259
+ },
260
+ statsRow: {
261
+ flexDirection: "row",
262
+ padding: 12,
263
+ borderBottomWidth: 1,
264
+ borderBottomColor: "#333"
265
+ },
266
+ stat: {
267
+ flex: 1,
268
+ alignItems: "center"
269
+ },
270
+ statValue: {
271
+ color: "#fff",
272
+ fontSize: 20,
273
+ fontWeight: "bold"
274
+ },
275
+ statLabel: {
276
+ color: "#888",
277
+ fontSize: 12,
278
+ marginTop: 2
279
+ },
280
+ elementList: {
281
+ padding: 12
282
+ },
283
+ elementCard: {
284
+ backgroundColor: "#2d2d2d",
285
+ borderRadius: 8,
286
+ padding: 12,
287
+ marginBottom: 8
288
+ },
289
+ elementHeader: {
290
+ flexDirection: "row",
291
+ justifyContent: "space-between",
292
+ alignItems: "center"
293
+ },
294
+ elementId: {
295
+ color: "#fff",
296
+ fontSize: 14,
297
+ fontWeight: "bold"
298
+ },
299
+ elementType: {
300
+ color: "#888",
301
+ fontSize: 12,
302
+ backgroundColor: "#444",
303
+ paddingHorizontal: 8,
304
+ paddingVertical: 2,
305
+ borderRadius: 4
306
+ },
307
+ elementLabel: {
308
+ color: "#aaa",
309
+ fontSize: 12,
310
+ marginTop: 4
311
+ },
312
+ stateRow: {
313
+ flexDirection: "row",
314
+ marginTop: 8
315
+ },
316
+ stateIndicator: {
317
+ flexDirection: "row",
318
+ alignItems: "center",
319
+ marginRight: 12
320
+ },
321
+ stateDot: {
322
+ width: 8,
323
+ height: 8,
324
+ borderRadius: 4,
325
+ marginRight: 4
326
+ },
327
+ stateLabel: {
328
+ color: "#888",
329
+ fontSize: 10
330
+ },
331
+ testId: {
332
+ color: "#666",
333
+ fontSize: 10,
334
+ marginTop: 4,
335
+ fontFamily: "monospace"
336
+ },
337
+ emptyText: {
338
+ color: "#888",
339
+ textAlign: "center",
340
+ marginTop: 20
341
+ },
342
+ detailContainer: {
343
+ flex: 1
344
+ },
345
+ detailHeader: {
346
+ flexDirection: "row",
347
+ justifyContent: "space-between",
348
+ alignItems: "center",
349
+ padding: 12,
350
+ borderBottomWidth: 1,
351
+ borderBottomColor: "#333"
352
+ },
353
+ detailTitle: {
354
+ color: "#fff",
355
+ fontSize: 16,
356
+ fontWeight: "bold"
357
+ },
358
+ detailContent: {
359
+ padding: 12
360
+ },
361
+ sectionTitle: {
362
+ color: "#888",
363
+ fontSize: 12,
364
+ marginTop: 12,
365
+ marginBottom: 4,
366
+ textTransform: "uppercase"
367
+ },
368
+ sectionValue: {
369
+ color: "#fff",
370
+ fontSize: 14
371
+ },
372
+ stateSection: {
373
+ backgroundColor: "#2d2d2d",
374
+ borderRadius: 8,
375
+ padding: 8
376
+ },
377
+ stateText: {
378
+ color: "#ddd",
379
+ fontSize: 12,
380
+ fontFamily: "monospace",
381
+ marginBottom: 2
382
+ },
383
+ actionsSection: {
384
+ flexDirection: "row",
385
+ flexWrap: "wrap"
386
+ },
387
+ actionBadge: {
388
+ backgroundColor: "#2196F3",
389
+ paddingHorizontal: 8,
390
+ paddingVertical: 4,
391
+ borderRadius: 4,
392
+ marginRight: 6,
393
+ marginBottom: 6
394
+ },
395
+ customActionBadge: {
396
+ backgroundColor: "#9C27B0"
397
+ },
398
+ actionText: {
399
+ color: "#fff",
400
+ fontSize: 12
401
+ }
402
+ });
403
+
404
+ export { UIBridgeInspector };
405
+ //# sourceMappingURL=index.mjs.map
406
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/native/react/UIBridgeNativeProvider.tsx","../../../src/native/debug/inspector.tsx"],"names":["jsx","useState","useMemo","useCallback"],"mappings":"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","file":"index.mjs","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 { NativeUIBridgeRegistry, setGlobalRegistry, resetGlobalRegistry } 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(`[ui-bridge-native] Would start HTTP server on port ${config.serverPort || 9876}`);\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}>{children}</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 style={styles.elementCard} onPress={() => onPress(element)}>\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 && <Text style={styles.elementLabel}>{element.label}</Text>}\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 && <Text style={styles.testId}>testID: {identifier.testId}</Text>}\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 style={[styles.stateDot, { backgroundColor: value ? '#4CAF50' : '#F44336' }]} />\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 && <Text style={styles.stateText}>Value: {state.value}</Text>}\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 && <Text style={styles.stateText}>uiId: {identifier.uiId}</Text>}\n {identifier.testId && <Text style={styles.stateText}>testId: {identifier.testId}</Text>}\n {identifier.accessibilityLabel && (\n <Text style={styles.stateText}>a11yLabel: {identifier.accessibilityLabel}</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>(null);\n\n const elements = useMemo(() => (bridge ? bridge.getElements() : []), [bridge, showInspector]);\n\n const components = useMemo(() => (bridge ? bridge.getComponents() : []), [bridge, showInspector]);\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 style={[styles.toggleButton, toggleStyle]} onPress={handleToggle}>\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}>{bridge.serverRunning ? 'ON' : 'OFF'}</Text>\n <Text style={styles.statLabel}>Server</Text>\n </View>\n </View>\n\n {/* Element list or detail */}\n {selectedElement ? (\n <ElementDetail element={selectedElement} onClose={handleCloseDetail} />\n ) : (\n <ScrollView style={styles.elementList}>\n {elements.map((element) => (\n <ElementCard key={element.id} element={element} onPress={handleSelectElement} />\n ))}\n {elements.length === 0 && (\n <Text style={styles.emptyText}>No elements registered yet</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"]}