@zenbu-labs/pixel 0.0.0 → 0.0.13

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 (153) hide show
  1. package/dist/bin.d.ts +2 -0
  2. package/dist/bin.js +161 -0
  3. package/dist/bootstrap.d.ts +1 -0
  4. package/dist/bootstrap.js +75 -0
  5. package/dist/context-menu.d.ts +20 -0
  6. package/dist/context-menu.js +57 -0
  7. package/dist/debug.d.ts +1 -0
  8. package/dist/debug.js +9 -0
  9. package/dist/devtools-layout.d.ts +21 -0
  10. package/dist/devtools-layout.js +45 -0
  11. package/dist/devtools.d.ts +33 -0
  12. package/dist/devtools.js +125 -0
  13. package/dist/electron/index.d.ts +3 -0
  14. package/dist/electron/index.js +4 -0
  15. package/dist/host/guest.d.ts +5 -0
  16. package/dist/host/guest.js +178 -0
  17. package/dist/host/server.d.ts +91 -0
  18. package/dist/host/server.js +296 -0
  19. package/dist/host/shell.d.ts +35 -0
  20. package/dist/host/shell.js +113 -0
  21. package/dist/host/strip.d.ts +6 -0
  22. package/dist/host/strip.js +63 -0
  23. package/dist/icons.d.ts +30 -0
  24. package/dist/icons.js +58 -0
  25. package/dist/index.d.ts +17 -0
  26. package/dist/index.js +39 -0
  27. package/dist/instances.d.ts +30 -0
  28. package/dist/instances.js +177 -0
  29. package/dist/layout.d.ts +5 -0
  30. package/dist/layout.js +34 -0
  31. package/dist/popup.d.ts +21 -0
  32. package/dist/popup.js +47 -0
  33. package/dist/preload/index.d.ts +15 -0
  34. package/dist/preload/index.js +3 -0
  35. package/dist/react/colors.d.ts +3 -0
  36. package/dist/react/colors.js +25 -0
  37. package/dist/react/components.d.ts +21 -0
  38. package/dist/react/components.js +45 -0
  39. package/dist/react/devtools/app.d.ts +3 -0
  40. package/dist/react/devtools/app.js +89 -0
  41. package/dist/react/devtools/console-capture.d.ts +1 -0
  42. package/dist/react/devtools/console-capture.js +41 -0
  43. package/dist/react/devtools/controller.d.ts +45 -0
  44. package/dist/react/devtools/controller.js +252 -0
  45. package/dist/react/devtools/elements.d.ts +4 -0
  46. package/dist/react/devtools/elements.js +152 -0
  47. package/dist/react/devtools/export-profile.d.ts +2 -0
  48. package/dist/react/devtools/export-profile.js +225 -0
  49. package/dist/react/devtools/fiber-hook.d.ts +1 -0
  50. package/dist/react/devtools/fiber-hook.js +89 -0
  51. package/dist/react/devtools/log-panel.d.ts +4 -0
  52. package/dist/react/devtools/log-panel.js +113 -0
  53. package/dist/react/devtools/profiler.d.ts +11 -0
  54. package/dist/react/devtools/profiler.js +374 -0
  55. package/dist/react/devtools/store.d.ts +27 -0
  56. package/dist/react/devtools/store.js +61 -0
  57. package/dist/react/devtools/stores.d.ts +92 -0
  58. package/dist/react/devtools/stores.js +41 -0
  59. package/dist/react/devtools/theme.d.ts +35 -0
  60. package/dist/react/devtools/theme.js +77 -0
  61. package/dist/react/devtools/ui.d.ts +24 -0
  62. package/dist/react/devtools/ui.js +59 -0
  63. package/dist/react/index.d.ts +110 -0
  64. package/dist/react/index.js +538 -0
  65. package/dist/react/markdown.d.ts +25 -0
  66. package/dist/react/markdown.js +270 -0
  67. package/dist/react/native.d.ts +116 -0
  68. package/dist/react/native.js +56 -0
  69. package/dist/react/reconciler-config.d.ts +241 -0
  70. package/dist/react/reconciler-config.js +412 -0
  71. package/dist/react/styles.d.ts +88 -0
  72. package/dist/react/styles.js +85 -0
  73. package/dist/react/surface.d.ts +55 -0
  74. package/dist/react/surface.js +74 -0
  75. package/dist/registry.d.ts +53 -0
  76. package/dist/registry.js +193 -0
  77. package/dist/root.d.ts +19 -0
  78. package/dist/root.js +342 -0
  79. package/dist/sandbox.d.ts +4 -0
  80. package/dist/sandbox.js +84 -0
  81. package/dist/scale.d.ts +7 -0
  82. package/dist/scale.js +31 -0
  83. package/dist/ssh/index.d.ts +58 -0
  84. package/dist/ssh/index.js +445 -0
  85. package/dist/terminal/applescript.d.ts +2 -0
  86. package/dist/terminal/applescript.js +20 -0
  87. package/dist/terminal/detect.d.ts +10 -0
  88. package/dist/terminal/detect.js +34 -0
  89. package/dist/terminal/graphics.d.ts +9 -0
  90. package/dist/terminal/graphics.js +142 -0
  91. package/dist/terminal/index.d.ts +12 -0
  92. package/dist/terminal/index.js +23 -0
  93. package/dist/terminal/run.d.ts +2 -0
  94. package/dist/terminal/run.js +15 -0
  95. package/dist/terminal/shared.d.ts +20 -0
  96. package/dist/terminal/shared.js +88 -0
  97. package/dist/terminal/terminal.d.ts +66 -0
  98. package/dist/terminal/terminal.js +6 -0
  99. package/dist/terminal/terminals/cmux.d.ts +2 -0
  100. package/dist/terminal/terminals/cmux.js +98 -0
  101. package/dist/terminal/terminals/ghostty-script.d.ts +1 -0
  102. package/dist/terminal/terminals/ghostty-script.js +179 -0
  103. package/dist/terminal/terminals/ghostty.d.ts +2 -0
  104. package/dist/terminal/terminals/ghostty.js +336 -0
  105. package/dist/terminal/terminals/herdr.d.ts +2 -0
  106. package/dist/terminal/terminals/herdr.js +141 -0
  107. package/dist/terminal/terminals/index.d.ts +5 -0
  108. package/dist/terminal/terminals/index.js +26 -0
  109. package/dist/terminal/terminals/kitty.d.ts +2 -0
  110. package/dist/terminal/terminals/kitty.js +209 -0
  111. package/dist/terminal/terminals/supacode.d.ts +2 -0
  112. package/dist/terminal/terminals/supacode.js +79 -0
  113. package/dist/terminal/terminals/tmux.d.ts +2 -0
  114. package/dist/terminal/terminals/tmux.js +132 -0
  115. package/dist/terminal/terminals/tty7.d.ts +2 -0
  116. package/dist/terminal/terminals/tty7.js +58 -0
  117. package/dist/terminal/terminals/vscode.d.ts +2 -0
  118. package/dist/terminal/terminals/vscode.js +13 -0
  119. package/dist/terminal/terminals/wezterm.d.ts +2 -0
  120. package/dist/terminal/terminals/wezterm.js +59 -0
  121. package/dist/theme.d.ts +22 -0
  122. package/dist/theme.js +40 -0
  123. package/dist/web/browser-session.d.ts +13 -0
  124. package/dist/web/browser-session.js +186 -0
  125. package/dist/web/cursor.d.ts +1 -0
  126. package/dist/web/cursor.js +24 -0
  127. package/dist/web/devtools.d.ts +39 -0
  128. package/dist/web/devtools.js +300 -0
  129. package/dist/web/favicon.d.ts +7 -0
  130. package/dist/web/favicon.js +73 -0
  131. package/dist/web/frame-rate.d.ts +1 -0
  132. package/dist/web/frame-rate.js +12 -0
  133. package/dist/web/host.d.ts +123 -0
  134. package/dist/web/host.js +573 -0
  135. package/dist/web/input.d.ts +49 -0
  136. package/dist/web/input.js +468 -0
  137. package/dist/web/offscreen.d.ts +2 -0
  138. package/dist/web/offscreen.js +23 -0
  139. package/dist/web/paint.d.ts +11 -0
  140. package/dist/web/paint.js +128 -0
  141. package/dist/web/popup.d.ts +40 -0
  142. package/dist/web/popup.js +144 -0
  143. package/dist/web/session.d.ts +20 -0
  144. package/dist/web/session.js +110 -0
  145. package/dist/web/types.d.ts +38 -0
  146. package/dist/web/types.js +39 -0
  147. package/dist/web/zoom.d.ts +5 -0
  148. package/dist/web/zoom.js +36 -0
  149. package/dist/webview.d.ts +55 -0
  150. package/dist/webview.js +481 -0
  151. package/package.json +69 -3
  152. package/scripts/apparmor.sh +71 -0
  153. package/scripts/postinstall.mjs +150 -0
@@ -0,0 +1,538 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inspectorStore = exports.engineOp = exports.requestLayout = exports.toggleDevtools = exports.closeDevtools = exports.openDevtools = exports.Markdown = exports.SurfaceCapture = exports.Surface = exports.useTerminalColors = exports.parseMarkdown = exports.highlight = exports.encodeRecording = exports.diff = exports.captureFilmstrip = exports.HIGHLIGHT_CAPTURES = exports.profilerStore = exports.layoutStore = exports.Path = exports.MarkedText = exports.Image = exports.Input = exports.Text = exports.Box = void 0;
4
+ exports.appLog = appLog;
5
+ exports.setKeyCapture = setKeyCapture;
6
+ exports.setPointerShape = setPointerShape;
7
+ exports.requestClipboardImage = requestClipboardImage;
8
+ exports.setClipboard = setClipboard;
9
+ exports.createRoot = createRoot;
10
+ const react_1 = require("react");
11
+ const constants_1 = require("react-reconciler/constants");
12
+ const reconciler_config_1 = require("./reconciler-config");
13
+ const surface_1 = require("./surface");
14
+ const app_1 = require("./devtools/app");
15
+ const console_capture_1 = require("./devtools/console-capture");
16
+ const controller_1 = require("./devtools/controller");
17
+ Object.defineProperty(exports, "closeDevtools", { enumerable: true, get: function () { return controller_1.closeDevtools; } });
18
+ Object.defineProperty(exports, "engineOp", { enumerable: true, get: function () { return controller_1.engineOp; } });
19
+ Object.defineProperty(exports, "openDevtools", { enumerable: true, get: function () { return controller_1.openDevtools; } });
20
+ Object.defineProperty(exports, "requestLayout", { enumerable: true, get: function () { return controller_1.requestLayout; } });
21
+ Object.defineProperty(exports, "toggleDevtools", { enumerable: true, get: function () { return controller_1.toggleDevtools; } });
22
+ const export_profile_1 = require("./devtools/export-profile");
23
+ const fiber_hook_1 = require("./devtools/fiber-hook");
24
+ const colors_1 = require("./colors");
25
+ const theme_1 = require("./devtools/theme");
26
+ const stores_1 = require("./devtools/stores");
27
+ Object.defineProperty(exports, "inspectorStore", { enumerable: true, get: function () { return stores_1.inspectorStore; } });
28
+ function appLog(level, target, text) {
29
+ stores_1.engineLogs.push(level, target, text);
30
+ }
31
+ var components_1 = require("./components");
32
+ Object.defineProperty(exports, "Box", { enumerable: true, get: function () { return components_1.Box; } });
33
+ Object.defineProperty(exports, "Text", { enumerable: true, get: function () { return components_1.Text; } });
34
+ Object.defineProperty(exports, "Input", { enumerable: true, get: function () { return components_1.Input; } });
35
+ Object.defineProperty(exports, "Image", { enumerable: true, get: function () { return components_1.Image; } });
36
+ Object.defineProperty(exports, "MarkedText", { enumerable: true, get: function () { return components_1.MarkedText; } });
37
+ Object.defineProperty(exports, "Path", { enumerable: true, get: function () { return components_1.Path; } });
38
+ var stores_2 = require("./devtools/stores");
39
+ Object.defineProperty(exports, "layoutStore", { enumerable: true, get: function () { return stores_2.layoutStore; } });
40
+ Object.defineProperty(exports, "profilerStore", { enumerable: true, get: function () { return stores_2.profilerStore; } });
41
+ var native_1 = require("./native");
42
+ Object.defineProperty(exports, "HIGHLIGHT_CAPTURES", { enumerable: true, get: function () { return native_1.HIGHLIGHT_CAPTURES; } });
43
+ Object.defineProperty(exports, "captureFilmstrip", { enumerable: true, get: function () { return native_1.captureFilmstrip; } });
44
+ Object.defineProperty(exports, "diff", { enumerable: true, get: function () { return native_1.diff; } });
45
+ Object.defineProperty(exports, "encodeRecording", { enumerable: true, get: function () { return native_1.encodeRecording; } });
46
+ Object.defineProperty(exports, "highlight", { enumerable: true, get: function () { return native_1.highlight; } });
47
+ Object.defineProperty(exports, "parseMarkdown", { enumerable: true, get: function () { return native_1.parseMarkdown; } });
48
+ var colors_2 = require("./colors");
49
+ Object.defineProperty(exports, "useTerminalColors", { enumerable: true, get: function () { return colors_2.useTerminalColors; } });
50
+ var surface_2 = require("./surface");
51
+ Object.defineProperty(exports, "Surface", { enumerable: true, get: function () { return surface_2.Surface; } });
52
+ Object.defineProperty(exports, "SurfaceCapture", { enumerable: true, get: function () { return surface_2.SurfaceCapture; } });
53
+ var markdown_1 = require("./markdown");
54
+ Object.defineProperty(exports, "Markdown", { enumerable: true, get: function () { return markdown_1.Markdown; } });
55
+ /**
56
+ *
57
+ * i think this api exists to support capturing a click to focus the input,
58
+ * this is dumb we can abstract this with a more cannonical capture/bubble phase
59
+ */
60
+ function setKeyCapture(keys) {
61
+ const bridge = (0, reconciler_config_1.getBridge)();
62
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "setKeyCapture", keys });
63
+ bridge.flush();
64
+ }
65
+ function setPointerShape(shape) {
66
+ const bridge = (0, reconciler_config_1.getBridge)();
67
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "setPointerShape", shape });
68
+ bridge.flush();
69
+ }
70
+ function requestClipboardImage() {
71
+ const bridge = (0, reconciler_config_1.getBridge)();
72
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "requestClipboardImage" });
73
+ bridge.flush();
74
+ }
75
+ function setClipboard(text) {
76
+ const bridge = (0, reconciler_config_1.getBridge)();
77
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "setClipboard", text });
78
+ bridge.flush();
79
+ }
80
+ function applyColors(colors) {
81
+ (0, colors_1.publishColors)(colors);
82
+ (0, theme_1.refreshTheme)(colors);
83
+ stores_1.devtoolsStore.update((s) => ({ ...s, background: colors.background }));
84
+ }
85
+ function createRoot(options = {}) {
86
+ const bridge = options.tty || options.host
87
+ ? new reconciler_config_1.Bridge(options.tty, options.wrapper, options.sessionEnv, options.host)
88
+ : (0, reconciler_config_1.getBridge)(options.wrapper);
89
+ const devtoolsEnabled = options.devtools !== false;
90
+ if (options.cwd)
91
+ (0, export_profile_1.setProfileDirectory)(options.cwd);
92
+ let devtoolsInstalled = false;
93
+ const enableDevtools = () => {
94
+ if (devtoolsInstalled)
95
+ return;
96
+ devtoolsInstalled = true;
97
+ (0, console_capture_1.installConsoleCapture)();
98
+ (0, fiber_hook_1.installFiberHook)();
99
+ reconciler_config_1.reconciler.injectIntoDevTools({
100
+ bundleType: 0,
101
+ version: "18.3.1",
102
+ rendererPackageName: "pixel-react",
103
+ });
104
+ bridge.onFlush = (sample) => {
105
+ (0, stores_1.recordSpan)({
106
+ name: `ops flush (${sample.ops} ops)`,
107
+ start: sample.start,
108
+ dur: sample.dur,
109
+ depth: 0,
110
+ lane: "bridge",
111
+ arg: sample.seq,
112
+ });
113
+ };
114
+ };
115
+ const info = JSON.parse(bridge.engine.info());
116
+ applyColors(info.colors);
117
+ bridge.engine.setKeyEventTypes(!!options.keyEventTypes);
118
+ if (options.onLayout) {
119
+ bridge.afterCommit = (view) => {
120
+ if (view !== reconciler_config_1.APP_VIEW)
121
+ return;
122
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "queryLayout" });
123
+ bridge.flush();
124
+ };
125
+ }
126
+ const container = { bridge, view: reconciler_config_1.APP_VIEW, children: [] };
127
+ bridge.containers[reconciler_config_1.APP_VIEW] = container;
128
+ const root = reconciler_config_1.reconciler.createContainer(container, constants_1.ConcurrentRoot, null, false, null, "pixel", (error) => {
129
+ stores_1.engineLogs.push("error", "react", String(error));
130
+ }, null);
131
+ if (devtoolsEnabled)
132
+ enableDevtools();
133
+ const fontIds = new Map();
134
+ const fontRequests = new Map();
135
+ const retargets = [];
136
+ const dispatch = (event) => {
137
+ const view = event.view ?? reconciler_config_1.APP_VIEW;
138
+ switch (event.type) {
139
+ case "click": {
140
+ const props = bridge.propsById[view]?.get(event.node);
141
+ props?.onClick?.({ x: event.x, y: event.y, offset: event.offset ?? undefined });
142
+ break;
143
+ }
144
+ case "clickOutside": {
145
+ const props = bridge.propsById[view]?.get(event.node);
146
+ props?.onClickOutside?.({ x: event.x, y: event.y });
147
+ break;
148
+ }
149
+ case "change": {
150
+ const props = bridge.propsById[view]?.get(event.node);
151
+ props?.onChange?.(event.text, {
152
+ cursor: event.cursor ?? 0,
153
+ ...(event.caret ?? { x: 0, y: 0, w: 0, h: 0 }),
154
+ source: event.source ?? "edit",
155
+ marks: event.marks ?? [],
156
+ });
157
+ break;
158
+ }
159
+ case "caret": {
160
+ const props = bridge.propsById[view]?.get(event.node);
161
+ props?.onCaret?.({
162
+ cursor: event.cursor ?? 0,
163
+ ...(event.caret ?? { x: 0, y: 0, w: 0, h: 0 }),
164
+ });
165
+ break;
166
+ }
167
+ case "submit": {
168
+ const props = bridge.propsById[view]?.get(event.node);
169
+ props?.onSubmit?.(event.text, event.marks ?? []);
170
+ break;
171
+ }
172
+ case "serializeMarks": {
173
+ const request = (event.marks ?? []);
174
+ const replies = [];
175
+ for (const entry of request) {
176
+ const props = bridge.propsById[view]?.get(entry.node);
177
+ const data = props?.serializeMark?.(entry.id);
178
+ if (typeof data === "string")
179
+ replies.push({ index: entry.index, data });
180
+ }
181
+ bridge.push(view, { op: "richClipboard", token: event.token, marks: replies });
182
+ bridge.flush();
183
+ break;
184
+ }
185
+ case "pasteImage": {
186
+ const image = {
187
+ path: event.path,
188
+ width: event.width,
189
+ height: event.height,
190
+ source: event.source,
191
+ };
192
+ const props = bridge.propsById[view]?.get(event.node);
193
+ if (props?.onPasteImage) {
194
+ props.onPasteImage(image);
195
+ }
196
+ else if (view === reconciler_config_1.APP_VIEW) {
197
+ options.onPasteImage?.(image);
198
+ }
199
+ break;
200
+ }
201
+ case "scroll": {
202
+ const props = bridge.propsById[view]?.get(event.node);
203
+ props?.onScroll?.({ offset: event.offset, max: event.max });
204
+ break;
205
+ }
206
+ case "selection": {
207
+ const props = bridge.propsById[view]?.get(event.node);
208
+ props?.onSelection?.({
209
+ text: event.text ?? "",
210
+ x: event.x ?? 0,
211
+ y: event.y ?? 0,
212
+ w: event.w ?? 0,
213
+ h: event.h ?? 0,
214
+ parts: (event.parts ?? []),
215
+ });
216
+ break;
217
+ }
218
+ case "drag": {
219
+ const props = bridge.propsById[view]?.get(event.node);
220
+ props?.onDrag?.({
221
+ phase: event.phase,
222
+ x: event.x,
223
+ y: event.y,
224
+ mods: event.mods ?? { shift: false, alt: false, ctrl: false, super: false },
225
+ });
226
+ break;
227
+ }
228
+ case "hoverEnter": {
229
+ const props = bridge.propsById[view]?.get(event.node);
230
+ props?.onMouseEnter?.();
231
+ break;
232
+ }
233
+ case "hoverLeave": {
234
+ const props = bridge.propsById[view]?.get(event.node);
235
+ props?.onMouseLeave?.();
236
+ break;
237
+ }
238
+ case "wheel": {
239
+ const props = bridge.propsById[view]?.get(event.node);
240
+ props?.onWheel?.({
241
+ x: event.x,
242
+ y: event.y,
243
+ deltaX: event.deltaX ?? 0,
244
+ deltaY: event.deltaY ?? 0,
245
+ precise: !!event.precise,
246
+ mods: event.mods ?? { shift: false, alt: false, ctrl: false, super: false },
247
+ });
248
+ break;
249
+ }
250
+ case "pointer": {
251
+ const props = bridge.propsById[view]?.get(event.node);
252
+ props?.onPointer?.({
253
+ kind: event.kind,
254
+ button: event.button,
255
+ mods: event.mods,
256
+ x: event.x,
257
+ y: event.y,
258
+ });
259
+ break;
260
+ }
261
+ case "mouseMove": {
262
+ const props = bridge.propsById[view]?.get(event.node);
263
+ props?.onMouseMove?.({ x: event.x, y: event.y });
264
+ break;
265
+ }
266
+ case "colors": {
267
+ info.colors = event.colors;
268
+ applyColors(info.colors);
269
+ options.onColors?.(info.colors);
270
+ break;
271
+ }
272
+ case "resize": {
273
+ const size = {
274
+ width: event.width,
275
+ height: event.height,
276
+ basePx: event.basePx,
277
+ };
278
+ if (view === reconciler_config_1.APP_VIEW) {
279
+ info.width = size.width;
280
+ info.height = size.height;
281
+ info.basePx = size.basePx;
282
+ options.onResize?.(size);
283
+ }
284
+ else if ((0, reconciler_config_1.devtoolsBridge)() === bridge) {
285
+ stores_1.devtoolsStore.update((s) => ({ ...s, ...size }));
286
+ }
287
+ break;
288
+ }
289
+ case "key": {
290
+ if (view === reconciler_config_1.DEVTOOLS_VIEW) {
291
+ if ((0, reconciler_config_1.devtoolsBridge)() === bridge)
292
+ (0, app_1.handleDevtoolsKey)(event.key);
293
+ }
294
+ else {
295
+ options.onKey?.({
296
+ key: event.key,
297
+ kind: event.kind,
298
+ text: event.text,
299
+ mods: event.mods,
300
+ });
301
+ }
302
+ break;
303
+ }
304
+ case "rightClick":
305
+ if (view === reconciler_config_1.APP_VIEW) {
306
+ options.onRightClick?.({ x: event.x, y: event.y });
307
+ }
308
+ break;
309
+ case "paste":
310
+ if (view === reconciler_config_1.APP_VIEW)
311
+ options.onPaste?.(event.text);
312
+ break;
313
+ case "focus":
314
+ options.onFocus?.(!!event.focused);
315
+ break;
316
+ case "devtools":
317
+ enableDevtools();
318
+ (0, controller_1.attachDevtools)(bridge);
319
+ (0, controller_1.toggleDevtools)();
320
+ break;
321
+ case "inspect":
322
+ if (devtoolsEnabled && view === reconciler_config_1.APP_VIEW && event.node != null) {
323
+ enableDevtools();
324
+ (0, controller_1.attachDevtools)(bridge);
325
+ (0, controller_1.openDevtools)(event.node);
326
+ (0, controller_1.selectNode)(event.node, true);
327
+ }
328
+ break;
329
+ case "log":
330
+ stores_1.engineLogs.push(event.level ?? "info", event.target ?? "engine", event.message ?? event.text ?? "", event.epochMs);
331
+ break;
332
+ case "layout": {
333
+ const rects = new Map();
334
+ for (const node of event.nodes ?? [])
335
+ rects.set(node.id, node);
336
+ const snapshot = {
337
+ rects,
338
+ stats: event.stats ?? { frameMs: 0, fps: 0 },
339
+ width: event.width ?? 0,
340
+ height: event.height ?? 0,
341
+ at: Date.now(),
342
+ };
343
+ stores_1.layoutStore.set(snapshot);
344
+ options.onLayout?.(snapshot);
345
+ break;
346
+ }
347
+ case "profile":
348
+ (0, controller_1.onEngineProfile)({
349
+ epochMs: event.epochMs ?? 0,
350
+ spans: event.spans ?? [],
351
+ counters: event.counters ?? [],
352
+ marks: event.marks ?? [],
353
+ });
354
+ break;
355
+ case "error":
356
+ stores_1.engineLogs.push("error", "bridge", event.message ?? "unknown bridge error");
357
+ break;
358
+ case "hostClosed":
359
+ options.onHostClosed?.();
360
+ break;
361
+ case "handoff":
362
+ options.onHandoff?.({ tty: event.tty ?? undefined, socket: event.socket ?? undefined });
363
+ break;
364
+ case "retargeted": {
365
+ const waiting = retargets.shift();
366
+ if (event.ok && event.info) {
367
+ Object.assign(info, event.info);
368
+ applyColors(info.colors);
369
+ waiting?.resolve();
370
+ }
371
+ else {
372
+ waiting?.reject(new Error(event.error ?? "retarget failed"));
373
+ }
374
+ break;
375
+ }
376
+ case "fontRegistered": {
377
+ const pending = fontRequests.get(event.path) ?? [];
378
+ fontRequests.delete(event.path);
379
+ if (event.font != null) {
380
+ fontIds.set(event.path, event.font);
381
+ for (const p of pending)
382
+ p.resolve(event.font);
383
+ }
384
+ else {
385
+ const error = new Error(event.error ?? "font failed to load");
386
+ for (const p of pending)
387
+ p.reject(error);
388
+ }
389
+ break;
390
+ }
391
+ case "exit":
392
+ if (options.onEngineExit) {
393
+ options.onEngineExit(event.error ?? null);
394
+ }
395
+ else {
396
+ if (event.error) {
397
+ process.stderr.write(`pixel-react: engine exited: ${event.error}\n`);
398
+ }
399
+ process.exit(event.error ? 1 : 0);
400
+ }
401
+ break;
402
+ }
403
+ };
404
+ bridge.engine.start((err, json) => {
405
+ if (err)
406
+ return;
407
+ const event = JSON.parse(json);
408
+ dispatch(event);
409
+ if (event.atMs && event.type !== "profile" && stores_1.profilerStore.get().recording) {
410
+ const now = performance.timeOrigin + performance.now();
411
+ (0, stores_1.recordSpan)({
412
+ name: `event ${event.type}`,
413
+ start: event.atMs,
414
+ dur: Math.max(now - event.atMs, 0.01),
415
+ depth: 0,
416
+ lane: "bridge",
417
+ });
418
+ }
419
+ });
420
+ if (!devtoolsEnabled || options.onRightClick) {
421
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "setDefaultMenu", on: false });
422
+ bridge.flush();
423
+ }
424
+ /**
425
+ *
426
+ * fixme: node types?
427
+ */
428
+ const forwardResize = () => bridge.engine.applyOps(JSON.stringify({ view: 0, ops: [] }));
429
+ const ownsStdout = !options.tty && !options.host;
430
+ if (ownsStdout)
431
+ process.stdout.on("resize", forwardResize);
432
+ const restore = () => bridge.engine.stop();
433
+ process.on("exit", restore);
434
+ const onAppRender = (_id, phase, actualDuration, _baseDuration, startTime, commitTime) => {
435
+ (0, stores_1.recordSpan)({
436
+ name: `react ${phase}`,
437
+ start: performance.timeOrigin + startTime,
438
+ dur: Math.max(commitTime - startTime, actualDuration),
439
+ depth: 0,
440
+ lane: "react",
441
+ self: actualDuration,
442
+ });
443
+ };
444
+ let nextSurfaceId = 1;
445
+ return {
446
+ info,
447
+ sharedTextures: typeof bridge.engine.updateSurfaceTexture === "function",
448
+ render(element) {
449
+ const wrapped = devtoolsEnabled
450
+ ? (0, react_1.createElement)(react_1.Profiler, { id: "pixel-app", onRender: onAppRender }, element)
451
+ : element;
452
+ reconciler_config_1.reconciler.updateContainer(wrapped, root, null, null);
453
+ },
454
+ flushSync(fn) {
455
+ return reconciler_config_1.reconciler.flushSync(fn);
456
+ },
457
+ registerFont(path) {
458
+ const known = fontIds.get(path);
459
+ if (known != null)
460
+ return Promise.resolve(known);
461
+ return new Promise((resolve, reject) => {
462
+ const pending = fontRequests.get(path);
463
+ if (pending) {
464
+ pending.push({ resolve, reject });
465
+ return;
466
+ }
467
+ fontRequests.set(path, [{ resolve, reject }]);
468
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "registerFont", path });
469
+ bridge.flush();
470
+ });
471
+ },
472
+ createSurface() {
473
+ return new surface_1.Surface(bridge.engine, nextSurfaceId++);
474
+ },
475
+ surfaceStats() {
476
+ return JSON.parse(bridge.engine.surfaceStats());
477
+ },
478
+ stop() {
479
+ reconciler_config_1.reconciler.flushSync(() => {
480
+ reconciler_config_1.reconciler.updateContainer(null, root, null, null);
481
+ });
482
+ if ((0, reconciler_config_1.devtoolsBridge)() === bridge)
483
+ (0, controller_1.unmountDevtools)();
484
+ bridge.engine.stop();
485
+ if (ownsStdout)
486
+ process.stdout.off("resize", forwardResize);
487
+ process.off("exit", restore);
488
+ },
489
+ openDevtools() {
490
+ enableDevtools();
491
+ (0, controller_1.attachDevtools)(bridge);
492
+ (0, controller_1.openDevtools)();
493
+ },
494
+ closeDevtools() {
495
+ if ((0, reconciler_config_1.devtoolsBridge)() === bridge)
496
+ (0, controller_1.closeDevtools)();
497
+ },
498
+ // shitty name
499
+ nudgeResize() {
500
+ forwardResize();
501
+ },
502
+ queryLayout() {
503
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "queryLayout" });
504
+ bridge.flush();
505
+ },
506
+ setPointerShape(shape) {
507
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "setPointerShape", shape });
508
+ bridge.flush();
509
+ },
510
+ setClearColor(color) {
511
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "setClearColor", color });
512
+ bridge.flush();
513
+ },
514
+ setKeyCapture(keys) {
515
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "setKeyCapture", keys });
516
+ bridge.flush();
517
+ },
518
+ requestClipboardImage() {
519
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "requestClipboardImage" });
520
+ bridge.flush();
521
+ },
522
+ setClipboard(text) {
523
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "setClipboard", text });
524
+ bridge.flush();
525
+ },
526
+ setTitle(text) {
527
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "setTitle", text });
528
+ bridge.flush();
529
+ },
530
+ retarget(target) {
531
+ return new Promise((resolve, reject) => {
532
+ retargets.push({ resolve, reject });
533
+ bridge.push(reconciler_config_1.APP_VIEW, { op: "retarget", ...target });
534
+ bridge.flush();
535
+ });
536
+ },
537
+ };
538
+ }
@@ -0,0 +1,25 @@
1
+ import type { Color } from "./styles";
2
+ export interface MarkdownTheme {
3
+ fg: Color;
4
+ muted: Color;
5
+ link: Color;
6
+ inlineCode: Color;
7
+ codeBg: Color;
8
+ separator: Color;
9
+ syntax: Record<string, Color | undefined>;
10
+ }
11
+ export interface MarkdownProps {
12
+ text: string;
13
+ theme: MarkdownTheme;
14
+ rem: number;
15
+ streaming?: boolean;
16
+ monoFont?: number;
17
+ onLinkClick?: (href: string) => void;
18
+ highlight?: {
19
+ start: number;
20
+ end: number;
21
+ } | null;
22
+ highlightBg?: Color;
23
+ }
24
+ export declare function Markdown({ text, theme, rem, streaming, monoFont, onLinkClick, highlight, highlightBg, }: MarkdownProps): import("react").JSX.Element;
25
+ export declare function slugify(text: string): string;