@simten/ui 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +41 -0
  3. package/dist/canvas/CircuitCanvas.d.ts +45 -0
  4. package/dist/canvas/CircuitCanvas.d.ts.map +1 -0
  5. package/dist/canvas/CircuitCanvas.js +293 -0
  6. package/dist/canvas/CircuitCanvas.js.map +1 -0
  7. package/dist/canvas/ClockControls.d.ts +31 -0
  8. package/dist/canvas/ClockControls.d.ts.map +1 -0
  9. package/dist/canvas/ClockControls.js +33 -0
  10. package/dist/canvas/ClockControls.js.map +1 -0
  11. package/dist/canvas/CompositeInspectorDialog.d.ts +24 -0
  12. package/dist/canvas/CompositeInspectorDialog.d.ts.map +1 -0
  13. package/dist/canvas/CompositeInspectorDialog.js +290 -0
  14. package/dist/canvas/CompositeInspectorDialog.js.map +1 -0
  15. package/dist/canvas/dagre-layout.d.ts +40 -0
  16. package/dist/canvas/dagre-layout.d.ts.map +1 -0
  17. package/dist/canvas/dagre-layout.js +86 -0
  18. package/dist/canvas/dagre-layout.js.map +1 -0
  19. package/dist/canvas/drill-down-view.d.ts +35 -0
  20. package/dist/canvas/drill-down-view.d.ts.map +1 -0
  21. package/dist/canvas/drill-down-view.js +134 -0
  22. package/dist/canvas/drill-down-view.js.map +1 -0
  23. package/dist/canvas/hooks/useDetectTheme.d.ts +6 -0
  24. package/dist/canvas/hooks/useDetectTheme.d.ts.map +1 -0
  25. package/dist/canvas/hooks/useDetectTheme.js +20 -0
  26. package/dist/canvas/hooks/useDetectTheme.js.map +1 -0
  27. package/dist/canvas/hooks/useIsMobile.d.ts +2 -0
  28. package/dist/canvas/hooks/useIsMobile.d.ts.map +1 -0
  29. package/dist/canvas/hooks/useIsMobile.js +20 -0
  30. package/dist/canvas/hooks/useIsMobile.js.map +1 -0
  31. package/dist/canvas/hooks/useSimulationSession.d.ts +23 -0
  32. package/dist/canvas/hooks/useSimulationSession.d.ts.map +1 -0
  33. package/dist/canvas/hooks/useSimulationSession.js +41 -0
  34. package/dist/canvas/hooks/useSimulationSession.js.map +1 -0
  35. package/dist/canvas/index.d.ts +22 -0
  36. package/dist/canvas/index.d.ts.map +1 -0
  37. package/dist/canvas/index.js +17 -0
  38. package/dist/canvas/index.js.map +1 -0
  39. package/dist/canvas/label-utils.d.ts +10 -0
  40. package/dist/canvas/label-utils.d.ts.map +1 -0
  41. package/dist/canvas/label-utils.js +32 -0
  42. package/dist/canvas/label-utils.js.map +1 -0
  43. package/dist/canvas/node-types.d.ts +10 -0
  44. package/dist/canvas/node-types.d.ts.map +1 -0
  45. package/dist/canvas/node-types.js +29 -0
  46. package/dist/canvas/node-types.js.map +1 -0
  47. package/dist/canvas/projection.d.ts +19 -0
  48. package/dist/canvas/projection.d.ts.map +1 -0
  49. package/dist/canvas/projection.js +317 -0
  50. package/dist/canvas/projection.js.map +1 -0
  51. package/dist/canvas/types.d.ts +56 -0
  52. package/dist/canvas/types.d.ts.map +1 -0
  53. package/dist/canvas/types.js +6 -0
  54. package/dist/canvas/types.js.map +1 -0
  55. package/dist/canvas/useLayout.d.ts +21 -0
  56. package/dist/canvas/useLayout.d.ts.map +1 -0
  57. package/dist/canvas/useLayout.js +26 -0
  58. package/dist/canvas/useLayout.js.map +1 -0
  59. package/dist/editor/components/CircuitSelector.d.ts +9 -0
  60. package/dist/editor/components/CircuitSelector.d.ts.map +1 -0
  61. package/dist/editor/components/CircuitSelector.js +20 -0
  62. package/dist/editor/components/CircuitSelector.js.map +1 -0
  63. package/dist/editor/components/CircuitTabBar.d.ts +8 -0
  64. package/dist/editor/components/CircuitTabBar.d.ts.map +1 -0
  65. package/dist/editor/components/CircuitTabBar.js +23 -0
  66. package/dist/editor/components/CircuitTabBar.js.map +1 -0
  67. package/dist/editor/components/ClockControls.d.ts +6 -0
  68. package/dist/editor/components/ClockControls.d.ts.map +1 -0
  69. package/dist/editor/components/ClockControls.js +7 -0
  70. package/dist/editor/components/ClockControls.js.map +1 -0
  71. package/dist/editor/components/ComponentTooltip.d.ts +25 -0
  72. package/dist/editor/components/ComponentTooltip.d.ts.map +1 -0
  73. package/dist/editor/components/ComponentTooltip.js +82 -0
  74. package/dist/editor/components/ComponentTooltip.js.map +1 -0
  75. package/dist/editor/components/ConflictResolutionModal.d.ts +19 -0
  76. package/dist/editor/components/ConflictResolutionModal.d.ts.map +1 -0
  77. package/dist/editor/components/ConflictResolutionModal.js +20 -0
  78. package/dist/editor/components/ConflictResolutionModal.js.map +1 -0
  79. package/dist/editor/components/HierarchyBreadcrumb.d.ts +9 -0
  80. package/dist/editor/components/HierarchyBreadcrumb.d.ts.map +1 -0
  81. package/dist/editor/components/HierarchyBreadcrumb.js +32 -0
  82. package/dist/editor/components/HierarchyBreadcrumb.js.map +1 -0
  83. package/dist/editor/components/LabelEditor.d.ts +17 -0
  84. package/dist/editor/components/LabelEditor.d.ts.map +1 -0
  85. package/dist/editor/components/LabelEditor.js +40 -0
  86. package/dist/editor/components/LabelEditor.js.map +1 -0
  87. package/dist/editor/components/SignalOutputPanel.d.ts +11 -0
  88. package/dist/editor/components/SignalOutputPanel.d.ts.map +1 -0
  89. package/dist/editor/components/SignalOutputPanel.js +34 -0
  90. package/dist/editor/components/SignalOutputPanel.js.map +1 -0
  91. package/dist/editor/components/index.d.ts +9 -0
  92. package/dist/editor/components/index.d.ts.map +1 -0
  93. package/dist/editor/components/index.js +9 -0
  94. package/dist/editor/components/index.js.map +1 -0
  95. package/dist/editor/hooks/index.d.ts +1 -0
  96. package/dist/editor/hooks/index.d.ts.map +1 -0
  97. package/dist/editor/hooks/index.js +2 -0
  98. package/dist/editor/hooks/index.js.map +1 -0
  99. package/dist/editor/index.d.ts +5 -0
  100. package/dist/editor/index.d.ts.map +1 -0
  101. package/dist/editor/index.js +5 -0
  102. package/dist/editor/index.js.map +1 -0
  103. package/dist/editor/lib/simulation/index.d.ts +7 -0
  104. package/dist/editor/lib/simulation/index.d.ts.map +1 -0
  105. package/dist/editor/lib/simulation/index.js +8 -0
  106. package/dist/editor/lib/simulation/index.js.map +1 -0
  107. package/dist/editor/lib/utils/circuit-flattener.d.ts +29 -0
  108. package/dist/editor/lib/utils/circuit-flattener.d.ts.map +1 -0
  109. package/dist/editor/lib/utils/circuit-flattener.js +230 -0
  110. package/dist/editor/lib/utils/circuit-flattener.js.map +1 -0
  111. package/dist/editor/lib/utils/component-utils.d.ts +28 -0
  112. package/dist/editor/lib/utils/component-utils.d.ts.map +1 -0
  113. package/dist/editor/lib/utils/component-utils.js +72 -0
  114. package/dist/editor/lib/utils/component-utils.js.map +1 -0
  115. package/dist/editor/lib/utils/index.d.ts +3 -0
  116. package/dist/editor/lib/utils/index.d.ts.map +1 -0
  117. package/dist/editor/lib/utils/index.js +3 -0
  118. package/dist/editor/lib/utils/index.js.map +1 -0
  119. package/dist/editor/lib/visualization/index.d.ts +2 -0
  120. package/dist/editor/lib/visualization/index.d.ts.map +1 -0
  121. package/dist/editor/lib/visualization/index.js +2 -0
  122. package/dist/editor/lib/visualization/index.js.map +1 -0
  123. package/dist/editor/lib/visualization/vcd-generator.d.ts +63 -0
  124. package/dist/editor/lib/visualization/vcd-generator.d.ts.map +1 -0
  125. package/dist/editor/lib/visualization/vcd-generator.js +269 -0
  126. package/dist/editor/lib/visualization/vcd-generator.js.map +1 -0
  127. package/dist/editor/stores/circuit-library-store.d.ts +25 -0
  128. package/dist/editor/stores/circuit-library-store.d.ts.map +1 -0
  129. package/dist/editor/stores/circuit-library-store.js +51 -0
  130. package/dist/editor/stores/circuit-library-store.js.map +1 -0
  131. package/dist/editor/stores/circuit-preview-store.d.ts +687 -0
  132. package/dist/editor/stores/circuit-preview-store.d.ts.map +1 -0
  133. package/dist/editor/stores/circuit-preview-store.js +226 -0
  134. package/dist/editor/stores/circuit-preview-store.js.map +1 -0
  135. package/dist/editor/stores/circuit-store.d.ts +354 -0
  136. package/dist/editor/stores/circuit-store.d.ts.map +1 -0
  137. package/dist/editor/stores/circuit-store.js +227 -0
  138. package/dist/editor/stores/circuit-store.js.map +1 -0
  139. package/dist/editor/stores/index.d.ts +11 -0
  140. package/dist/editor/stores/index.d.ts.map +1 -0
  141. package/dist/editor/stores/index.js +8 -0
  142. package/dist/editor/stores/index.js.map +1 -0
  143. package/dist/editor/stores/ui-store.d.ts +96 -0
  144. package/dist/editor/stores/ui-store.d.ts.map +1 -0
  145. package/dist/editor/stores/ui-store.js +101 -0
  146. package/dist/editor/stores/ui-store.js.map +1 -0
  147. package/dist/editor/types/circuit.d.ts +207 -0
  148. package/dist/editor/types/circuit.d.ts.map +1 -0
  149. package/dist/editor/types/circuit.js +62 -0
  150. package/dist/editor/types/circuit.js.map +1 -0
  151. package/dist/editor/types/index.d.ts +12 -0
  152. package/dist/editor/types/index.d.ts.map +1 -0
  153. package/dist/editor/types/index.js +11 -0
  154. package/dist/editor/types/index.js.map +1 -0
  155. package/dist/editor/types/testbench.d.ts +150 -0
  156. package/dist/editor/types/testbench.d.ts.map +1 -0
  157. package/dist/editor/types/testbench.js +85 -0
  158. package/dist/editor/types/testbench.js.map +1 -0
  159. package/dist/editor/types/testing.d.ts +88 -0
  160. package/dist/editor/types/testing.d.ts.map +1 -0
  161. package/dist/editor/types/testing.js +6 -0
  162. package/dist/editor/types/testing.js.map +1 -0
  163. package/dist/editor/types/ui-model.d.ts +68 -0
  164. package/dist/editor/types/ui-model.d.ts.map +1 -0
  165. package/dist/editor/types/ui-model.js +66 -0
  166. package/dist/editor/types/ui-model.js.map +1 -0
  167. package/dist/editor/types/ui.d.ts +33 -0
  168. package/dist/editor/types/ui.d.ts.map +1 -0
  169. package/dist/editor/types/ui.js +8 -0
  170. package/dist/editor/types/ui.js.map +1 -0
  171. package/dist/editor/types/visual.d.ts +45 -0
  172. package/dist/editor/types/visual.d.ts.map +1 -0
  173. package/dist/editor/types/visual.js +23 -0
  174. package/dist/editor/types/visual.js.map +1 -0
  175. package/dist/editor/utils/index.d.ts +5 -0
  176. package/dist/editor/utils/index.d.ts.map +1 -0
  177. package/dist/editor/utils/index.js +6 -0
  178. package/dist/editor/utils/index.js.map +1 -0
  179. package/dist/index.d.ts +11 -0
  180. package/dist/index.d.ts.map +1 -0
  181. package/dist/index.js +12 -0
  182. package/dist/index.js.map +1 -0
  183. package/dist/lib/utils.d.ts +3 -0
  184. package/dist/lib/utils.d.ts.map +1 -0
  185. package/dist/lib/utils.js +6 -0
  186. package/dist/lib/utils.js.map +1 -0
  187. package/dist/nodes/BaseNode.d.ts +20 -0
  188. package/dist/nodes/BaseNode.d.ts.map +1 -0
  189. package/dist/nodes/BaseNode.js +26 -0
  190. package/dist/nodes/BaseNode.js.map +1 -0
  191. package/dist/nodes/CompositeBadge.d.ts +6 -0
  192. package/dist/nodes/CompositeBadge.d.ts.map +1 -0
  193. package/dist/nodes/CompositeBadge.js +10 -0
  194. package/dist/nodes/CompositeBadge.js.map +1 -0
  195. package/dist/nodes/ConsoleNode.d.ts +8 -0
  196. package/dist/nodes/ConsoleNode.d.ts.map +1 -0
  197. package/dist/nodes/ConsoleNode.js +16 -0
  198. package/dist/nodes/ConsoleNode.js.map +1 -0
  199. package/dist/nodes/EmbedConsoleNode.d.ts +8 -0
  200. package/dist/nodes/EmbedConsoleNode.d.ts.map +1 -0
  201. package/dist/nodes/EmbedConsoleNode.js +24 -0
  202. package/dist/nodes/EmbedConsoleNode.js.map +1 -0
  203. package/dist/nodes/EmbedScreenNode.d.ts +8 -0
  204. package/dist/nodes/EmbedScreenNode.d.ts.map +1 -0
  205. package/dist/nodes/EmbedScreenNode.js +24 -0
  206. package/dist/nodes/EmbedScreenNode.js.map +1 -0
  207. package/dist/nodes/EthFrameInputNode.d.ts +8 -0
  208. package/dist/nodes/EthFrameInputNode.d.ts.map +1 -0
  209. package/dist/nodes/EthFrameInputNode.js +14 -0
  210. package/dist/nodes/EthFrameInputNode.js.map +1 -0
  211. package/dist/nodes/InputNode.d.ts +8 -0
  212. package/dist/nodes/InputNode.d.ts.map +1 -0
  213. package/dist/nodes/InputNode.js +57 -0
  214. package/dist/nodes/InputNode.js.map +1 -0
  215. package/dist/nodes/LogicGateNode.d.ts +8 -0
  216. package/dist/nodes/LogicGateNode.d.ts.map +1 -0
  217. package/dist/nodes/LogicGateNode.js +51 -0
  218. package/dist/nodes/LogicGateNode.js.map +1 -0
  219. package/dist/nodes/NicFifoNode.d.ts +8 -0
  220. package/dist/nodes/NicFifoNode.d.ts.map +1 -0
  221. package/dist/nodes/NicFifoNode.js +10 -0
  222. package/dist/nodes/NicFifoNode.js.map +1 -0
  223. package/dist/nodes/NodeData.d.ts +34 -0
  224. package/dist/nodes/NodeData.d.ts.map +1 -0
  225. package/dist/nodes/NodeData.js +2 -0
  226. package/dist/nodes/NodeData.js.map +1 -0
  227. package/dist/nodes/NumericInputNode.d.ts +8 -0
  228. package/dist/nodes/NumericInputNode.d.ts.map +1 -0
  229. package/dist/nodes/NumericInputNode.js +47 -0
  230. package/dist/nodes/NumericInputNode.js.map +1 -0
  231. package/dist/nodes/OutputNode.d.ts +8 -0
  232. package/dist/nodes/OutputNode.d.ts.map +1 -0
  233. package/dist/nodes/OutputNode.js +32 -0
  234. package/dist/nodes/OutputNode.js.map +1 -0
  235. package/dist/nodes/RAMNode.d.ts +8 -0
  236. package/dist/nodes/RAMNode.d.ts.map +1 -0
  237. package/dist/nodes/RAMNode.js +23 -0
  238. package/dist/nodes/RAMNode.js.map +1 -0
  239. package/dist/nodes/ROMNode.d.ts +8 -0
  240. package/dist/nodes/ROMNode.d.ts.map +1 -0
  241. package/dist/nodes/ROMNode.js +23 -0
  242. package/dist/nodes/ROMNode.js.map +1 -0
  243. package/dist/nodes/RV32IInstrMemNode.d.ts +16 -0
  244. package/dist/nodes/RV32IInstrMemNode.d.ts.map +1 -0
  245. package/dist/nodes/RV32IInstrMemNode.js +183 -0
  246. package/dist/nodes/RV32IInstrMemNode.js.map +1 -0
  247. package/dist/nodes/RasterDisplayNode.d.ts +8 -0
  248. package/dist/nodes/RasterDisplayNode.d.ts.map +1 -0
  249. package/dist/nodes/RasterDisplayNode.js +14 -0
  250. package/dist/nodes/RasterDisplayNode.js.map +1 -0
  251. package/dist/nodes/RegisterNode.d.ts +8 -0
  252. package/dist/nodes/RegisterNode.d.ts.map +1 -0
  253. package/dist/nodes/RegisterNode.js +14 -0
  254. package/dist/nodes/RegisterNode.js.map +1 -0
  255. package/dist/nodes/ScreenNode.d.ts +8 -0
  256. package/dist/nodes/ScreenNode.d.ts.map +1 -0
  257. package/dist/nodes/ScreenNode.js +16 -0
  258. package/dist/nodes/ScreenNode.js.map +1 -0
  259. package/dist/nodes/UartTxNode.d.ts +8 -0
  260. package/dist/nodes/UartTxNode.d.ts.map +1 -0
  261. package/dist/nodes/UartTxNode.js +16 -0
  262. package/dist/nodes/UartTxNode.js.map +1 -0
  263. package/dist/nodes/index.d.ts +27 -0
  264. package/dist/nodes/index.d.ts.map +1 -0
  265. package/dist/nodes/index.js +30 -0
  266. package/dist/nodes/index.js.map +1 -0
  267. package/dist/primitives/button.d.ts +12 -0
  268. package/dist/primitives/button.d.ts.map +1 -0
  269. package/dist/primitives/button.js +32 -0
  270. package/dist/primitives/button.js.map +1 -0
  271. package/dist/primitives/index.d.ts +4 -0
  272. package/dist/primitives/index.d.ts.map +1 -0
  273. package/dist/primitives/index.js +4 -0
  274. package/dist/primitives/index.js.map +1 -0
  275. package/dist/primitives/sheet.d.ts +15 -0
  276. package/dist/primitives/sheet.d.ts.map +1 -0
  277. package/dist/primitives/sheet.js +40 -0
  278. package/dist/primitives/sheet.js.map +1 -0
  279. package/dist/primitives/tooltip.d.ts +8 -0
  280. package/dist/primitives/tooltip.d.ts.map +1 -0
  281. package/dist/primitives/tooltip.js +17 -0
  282. package/dist/primitives/tooltip.js.map +1 -0
  283. package/dist/sandbox/SandboxProvider.d.ts +13 -0
  284. package/dist/sandbox/SandboxProvider.d.ts.map +1 -0
  285. package/dist/sandbox/SandboxProvider.js +34 -0
  286. package/dist/sandbox/SandboxProvider.js.map +1 -0
  287. package/dist/sandbox/index.d.ts +4 -0
  288. package/dist/sandbox/index.d.ts.map +1 -0
  289. package/dist/sandbox/index.js +3 -0
  290. package/dist/sandbox/index.js.map +1 -0
  291. package/dist/sandbox/useSandbox.d.ts +197 -0
  292. package/dist/sandbox/useSandbox.d.ts.map +1 -0
  293. package/dist/sandbox/useSandbox.js +250 -0
  294. package/dist/sandbox/useSandbox.js.map +1 -0
  295. package/dist/share/encode-source.d.ts +13 -0
  296. package/dist/share/encode-source.d.ts.map +1 -0
  297. package/dist/share/encode-source.js +31 -0
  298. package/dist/share/encode-source.js.map +1 -0
  299. package/dist/share/index.d.ts +2 -0
  300. package/dist/share/index.d.ts.map +1 -0
  301. package/dist/share/index.js +2 -0
  302. package/dist/share/index.js.map +1 -0
  303. package/dist/waveform/WaveformViewer.d.ts +30 -0
  304. package/dist/waveform/WaveformViewer.d.ts.map +1 -0
  305. package/dist/waveform/WaveformViewer.js +356 -0
  306. package/dist/waveform/WaveformViewer.js.map +1 -0
  307. package/package.json +110 -0
@@ -0,0 +1,317 @@
1
+ /**
2
+ * Pure projection utility for embed.
3
+ * Converts Circuit + Metadata into ReactFlow nodes and edges.
4
+ * No stores, no caches, no globals — explicit params only.
5
+ */
6
+ const WIRE_COLORS = {
7
+ TRUE: '#22c55e',
8
+ FALSE: '#94a3b8',
9
+ UNDEFINED: '#cbd5e1',
10
+ };
11
+ function portPathKey(path) {
12
+ return path.nodeId === '' ? `.${path.portName}` : `${path.nodeId}.${path.portName}`;
13
+ }
14
+ function getNodeTypeForComponent(componentRef, inputCount, outputCount, isComposite) {
15
+ const typeMap = {
16
+ Switch: 'inputNode',
17
+ Input: 'numericInputNode',
18
+ Led: 'outputNode',
19
+ And: 'logicGateNode',
20
+ Or: 'logicGateNode',
21
+ Not: 'logicGateNode',
22
+ Nand: 'logicGateNode',
23
+ Nor: 'logicGateNode',
24
+ Xor: 'logicGateNode',
25
+ Xnor: 'logicGateNode',
26
+ Buffer: 'logicGateNode',
27
+ DFlipFlop: 'logicGateNode',
28
+ Register: 'registerNode',
29
+ RAM: 'ramNode',
30
+ ROM: 'romNode',
31
+ HexDisplay: 'outputNode',
32
+ SevenSegment: 'outputNode',
33
+ Screen: 'screenNode',
34
+ RasterDisplay: 'rasterDisplayNode',
35
+ Console: 'consoleNode',
36
+ UART_TX: 'uartTxNode',
37
+ NIC_FIFO: 'nicFifoNode',
38
+ Constant: 'logicGateNode',
39
+ RV32I_InstrMem: 'rv32iInstrMemNode',
40
+ DualPortROM: 'rv32iInstrMemNode',
41
+ Eth_FrameInput: 'ethFrameInputNode',
42
+ };
43
+ if (typeMap[componentRef])
44
+ return typeMap[componentRef];
45
+ // Composites always render as a generic gate box. The shape-based heuristics
46
+ // below only apply to primitives — a composite with 0 inputs (e.g. an internal
47
+ // counter that streams bytes) shouldn't be coerced into a toggle.
48
+ if (isComposite)
49
+ return 'logicGateNode';
50
+ if (inputCount === 0 && outputCount > 0)
51
+ return 'inputNode';
52
+ if (inputCount > 0 && outputCount === 0)
53
+ return 'outputNode';
54
+ if (inputCount > 0 && outputCount > 0)
55
+ return 'logicGateNode';
56
+ return 'default';
57
+ }
58
+ /**
59
+ * Project Circuit nodes to ReactFlow nodes.
60
+ * Pure function — all state passed explicitly.
61
+ */
62
+ function projectCircuitToNodes(circuit, metadata, library, portValues, seqState) {
63
+ const reactFlowNodes = [];
64
+ for (const node of circuit.nodes) {
65
+ const nodeMetadata = metadata.components[node.id];
66
+ if (!nodeMetadata) {
67
+ console.warn(`[projection] node '${node.id}' (${node.componentRef}) has no layout metadata, skipping render`);
68
+ continue;
69
+ }
70
+ const componentDef = library.resolveCircuit(node.componentRef);
71
+ if (!componentDef)
72
+ continue;
73
+ const inputCount = node.inputs.length;
74
+ const outputCount = node.outputs.length;
75
+ const inputNames = node.inputs.map((p) => p.name);
76
+ const outputNames = node.outputs.map((p) => p.name);
77
+ const isComposite = componentDef.implementation.kind === 'composite';
78
+ const nodeType = getNodeTypeForComponent(node.componentRef, inputCount, outputCount, isComposite);
79
+ let value = undefined;
80
+ let numericValue = undefined;
81
+ let width = undefined;
82
+ let pixels = undefined;
83
+ let consoleText = undefined;
84
+ let uartText = undefined;
85
+ let nicState = undefined;
86
+ if (node.componentRef === 'Switch' || node.componentRef === 'Led') {
87
+ let resolved = false;
88
+ if (portValues) {
89
+ if (node.componentRef === 'Led' && node.inputs.length > 0) {
90
+ const inputKey = portPathKey({ nodeId: node.id, portName: node.inputs[0].name });
91
+ const portValue = portValues.get(inputKey);
92
+ if (portValue !== undefined) {
93
+ value = Boolean(portValue);
94
+ resolved = true;
95
+ }
96
+ }
97
+ else if (node.componentRef === 'Switch' && node.outputs.length > 0) {
98
+ const outputKey = portPathKey({ nodeId: node.id, portName: node.outputs[0].name });
99
+ const portValue = portValues.get(outputKey);
100
+ if (portValue !== undefined) {
101
+ value = Boolean(portValue);
102
+ resolved = true;
103
+ }
104
+ }
105
+ }
106
+ if (!resolved && 'value' in node.arguments) {
107
+ value = Boolean(node.arguments.value);
108
+ }
109
+ }
110
+ else if (node.componentRef === 'Input') {
111
+ width = typeof node.arguments.width === 'number' ? node.arguments.width : 8;
112
+ let numResolved = false;
113
+ if (portValues && node.outputs.length > 0) {
114
+ const outputKey = portPathKey({ nodeId: node.id, portName: node.outputs[0].name });
115
+ const portValue = portValues.get(outputKey);
116
+ if (portValue !== undefined && typeof portValue === 'number') {
117
+ numericValue = portValue;
118
+ numResolved = true;
119
+ }
120
+ }
121
+ if (!numResolved) {
122
+ numericValue = typeof node.arguments.value === 'number' ? node.arguments.value : 0;
123
+ }
124
+ }
125
+ else if (node.componentRef === 'HexDisplay' || node.componentRef === 'SevenSegment') {
126
+ if (portValues && node.inputs.length > 0) {
127
+ const inputKey = portPathKey({ nodeId: node.id, portName: node.inputs[0].name });
128
+ const portValue = portValues.get(inputKey);
129
+ numericValue = typeof portValue === 'number' ? portValue : 0;
130
+ }
131
+ }
132
+ else if (node.componentRef === 'Screen') {
133
+ const screenW = node.arguments.width ?? 8;
134
+ const screenH = node.arguments.height ?? 8;
135
+ const totalPixels = screenW * screenH;
136
+ pixels = new Array(totalPixels).fill(0);
137
+ if (seqState && portValues) {
138
+ const dataInConnection = Array.from(circuit.connections).find(conn => conn.target.nodeId === node.id && conn.target.portName === 'dataIn');
139
+ if (dataInConnection) {
140
+ const sourceNode = circuit.nodes.find(n => n.id === dataInConnection.source.nodeId);
141
+ if (sourceNode?.componentRef === 'DualPortRAM') {
142
+ const ramState = seqState.currentState.get(sourceNode.id);
143
+ if (ramState instanceof Map) {
144
+ for (let addr = 0; addr < totalPixels; addr++) {
145
+ pixels[addr] = ramState.get(addr) ?? 0;
146
+ }
147
+ }
148
+ }
149
+ else if (sourceNode?.componentRef === 'Mux') {
150
+ const selKey = portPathKey({ nodeId: sourceNode.id, portName: 'sel' });
151
+ const selValue = portValues.get(selKey);
152
+ const selectedInputPort = selValue === 0 ? 'in0' : 'in1';
153
+ const muxInputConnection = Array.from(circuit.connections).find(conn => conn.target.nodeId === sourceNode.id && conn.target.portName === selectedInputPort);
154
+ if (muxInputConnection) {
155
+ const ramNode = circuit.nodes.find(n => n.id === muxInputConnection.source.nodeId);
156
+ if (ramNode?.componentRef === 'DualPortRAM') {
157
+ const ramState = seqState.currentState.get(ramNode.id);
158
+ if (ramState instanceof Map) {
159
+ for (let addr = 0; addr < totalPixels; addr++) {
160
+ pixels[addr] = ramState.get(addr) ?? 0;
161
+ }
162
+ }
163
+ }
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ else if (node.componentRef === 'RasterDisplay') {
170
+ const rasterW = node.arguments.width ?? 8;
171
+ const rasterH = node.arguments.height ?? 8;
172
+ const rasterPixels = rasterW * rasterH;
173
+ pixels = new Array(rasterPixels).fill(0);
174
+ if (seqState) {
175
+ const displayState = seqState.currentState.get(node.id);
176
+ if (displayState instanceof Map) {
177
+ for (let addr = 0; addr < rasterPixels; addr++) {
178
+ pixels[addr] = displayState.get(addr) ?? 0;
179
+ }
180
+ }
181
+ }
182
+ }
183
+ else if (node.componentRef === 'Console') {
184
+ if (seqState) {
185
+ const consoleState = seqState.currentState.get(node.id);
186
+ if (typeof consoleState === 'string')
187
+ consoleText = consoleState;
188
+ }
189
+ }
190
+ else if (node.componentRef === 'UART_TX') {
191
+ if (seqState) {
192
+ const uartState = seqState.currentState.get(node.id);
193
+ if (typeof uartState === 'string')
194
+ uartText = uartState;
195
+ }
196
+ }
197
+ else if (node.componentRef === 'NIC_FIFO') {
198
+ if (seqState) {
199
+ const state = seqState.currentState.get(node.id);
200
+ if (state instanceof Map) {
201
+ const s = state;
202
+ const txWp = s.get(0x2000) ?? 0;
203
+ const txRp = s.get(0x2001) ?? 0;
204
+ const rxCount = s.get(0x2012) ?? 0;
205
+ const draining = (s.get(0x2004) ?? 0) !== 0;
206
+ nicState = { txCount: txWp - txRp, rxCount, draining };
207
+ }
208
+ }
209
+ }
210
+ reactFlowNodes.push({
211
+ id: node.id,
212
+ type: nodeType,
213
+ position: nodeMetadata.position,
214
+ data: {
215
+ nodeId: node.id,
216
+ componentRef: node.componentRef,
217
+ label: node.label,
218
+ value,
219
+ numericValue,
220
+ width,
221
+ inputCount,
222
+ outputCount,
223
+ inputNames,
224
+ outputNames,
225
+ isComposite,
226
+ arguments: node.arguments,
227
+ __pixels: pixels,
228
+ __consoleText: consoleText,
229
+ __uartText: uartText,
230
+ __nicState: nicState,
231
+ },
232
+ selectable: true,
233
+ deletable: false,
234
+ });
235
+ }
236
+ // Surface nested console/UART nodes
237
+ if (seqState) {
238
+ const existingNodeIds = new Set(reactFlowNodes.map(n => n.id));
239
+ let consoleIndex = 0;
240
+ for (const [nodeId, state] of seqState.currentState.entries()) {
241
+ if (existingNodeIds.has(nodeId))
242
+ continue;
243
+ if (typeof state === 'string') {
244
+ const pathParts = nodeId.split('.');
245
+ const shortLabel = pathParts.length > 1 ? pathParts.slice(-2).join('.') : nodeId;
246
+ const isUart = nodeId.toLowerCase().includes('uart');
247
+ reactFlowNodes.push({
248
+ id: `__virtual_console_${consoleIndex}`,
249
+ type: isUart ? 'uartTxNode' : 'consoleNode',
250
+ position: { x: 600, y: 50 + (consoleIndex * 250) },
251
+ data: {
252
+ nodeId,
253
+ componentRef: isUart ? 'UART_TX' : 'Console',
254
+ label: isUart ? `UART (${shortLabel})` : `Console (${shortLabel})`,
255
+ value: undefined,
256
+ numericValue: undefined,
257
+ width: undefined,
258
+ inputCount: isUart ? 4 : 2,
259
+ outputCount: 1,
260
+ inputNames: isUart ? ['addr', 'write_data', 'mem_read', 'mem_write'] : ['data', 'we'],
261
+ outputNames: isUart ? ['read_data'] : ['text'],
262
+ __consoleText: isUart ? undefined : state,
263
+ __uartText: isUart ? state : undefined,
264
+ },
265
+ selected: false,
266
+ selectable: false,
267
+ deletable: false,
268
+ });
269
+ consoleIndex++;
270
+ }
271
+ }
272
+ }
273
+ return reactFlowNodes;
274
+ }
275
+ /**
276
+ * Project Circuit connections to ReactFlow edges.
277
+ * Pure function — no hidden state.
278
+ */
279
+ function projectCircuitToEdges(circuit, portValues) {
280
+ const edges = [];
281
+ for (const connection of circuit.connections) {
282
+ let edgeColor = WIRE_COLORS.UNDEFINED;
283
+ if (portValues) {
284
+ const value = portValues.get(portPathKey(connection.source))
285
+ ?? portValues.get(portPathKey(connection.target));
286
+ if (value !== undefined) {
287
+ edgeColor = (typeof value === 'boolean' ? value : value !== 0)
288
+ ? WIRE_COLORS.TRUE : WIRE_COLORS.FALSE;
289
+ }
290
+ }
291
+ edges.push({
292
+ id: connection.id,
293
+ type: 'orthogonal',
294
+ source: connection.source.nodeId,
295
+ target: connection.target.nodeId,
296
+ sourceHandle: `out-${connection.source.portName}`,
297
+ targetHandle: `in-${connection.target.portName}`,
298
+ style: { stroke: edgeColor, strokeWidth: 2 },
299
+ animated: false,
300
+ selectable: false,
301
+ deletable: false,
302
+ });
303
+ }
304
+ return edges;
305
+ }
306
+ /**
307
+ * Main projection function — pure, no side effects.
308
+ */
309
+ export function projectCircuitToReactFlow(circuit, metadata, library, portValues, seqState) {
310
+ if (!circuit)
311
+ return { nodes: [], edges: [] };
312
+ return {
313
+ nodes: projectCircuitToNodes(circuit, metadata, library, portValues, seqState),
314
+ edges: projectCircuitToEdges(circuit, portValues),
315
+ };
316
+ }
317
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../src/canvas/projection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Types for the embed package.
3
+ * Defines layout metadata types and re-exports simulator types from core.
4
+ */
5
+ export type { FlatCircuit, FlatPortValueMap, FlatSequentialState, } from "@simten/core/simulator";
6
+ export type { Circuit } from "@simten/core";
7
+ import type { Circuit as CircuitType } from "@simten/core";
8
+ export interface InspectorFrame {
9
+ componentName: string;
10
+ componentDef: CircuitType;
11
+ nodeLabel: string;
12
+ }
13
+ /** Screen rect of the node that triggered the dialog (for animate-from-origin) */
14
+ export interface OriginRect {
15
+ x: number;
16
+ y: number;
17
+ width: number;
18
+ height: number;
19
+ }
20
+ export interface Position {
21
+ x: number;
22
+ y: number;
23
+ }
24
+ export interface Dimensions {
25
+ width: number;
26
+ height: number;
27
+ }
28
+ export interface ComponentMetadata {
29
+ id: string;
30
+ position: Position;
31
+ dimensions?: Dimensions;
32
+ }
33
+ export interface ConnectionMetadata {
34
+ id: string;
35
+ }
36
+ export interface MetadataState {
37
+ components: Record<string, ComponentMetadata>;
38
+ connections: Record<string, ConnectionMetadata>;
39
+ }
40
+ /**
41
+ * Public layout prop type. Maps a node's label (or id, as fallback) to its
42
+ * position on the canvas. Pass to CircuitCanvas / CircuitEmbed via the
43
+ * `layout` prop to bypass the runtime layout engine entirely.
44
+ *
45
+ * When parameterised by a `BuiltCircuit`, the keys are constrained at compile
46
+ * time to the union of input names, output names, and node labels.
47
+ */
48
+ import type { BuiltCircuit } from "@simten/core";
49
+ export type CircuitLayout<C extends BuiltCircuit | undefined = undefined> = C extends BuiltCircuit<infer Ins, infer Outs, infer Ns> ? Record<keyof Ins | keyof Outs | keyof Ns, {
50
+ x: number;
51
+ y: number;
52
+ }> : Record<string, {
53
+ x: number;
54
+ y: number;
55
+ }>;
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/canvas/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAI5C,OAAO,KAAK,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,WAAW,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,kFAAkF;AAClF,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CACjD;AAED;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,aAAa,CACvB,CAAC,SAAS,YAAY,GAAG,SAAS,GAAG,SAAS,IAC5C,CAAC,SAAS,YAAY,CAAC,MAAM,GAAG,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC,GACvD,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,IAAI,GAAG,MAAM,EAAE,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACnE,MAAM,CAAC,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Types for the embed package.
3
+ * Defines layout metadata types and re-exports simulator types from core.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/canvas/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * useLayout — synchronous layout hook for CircuitCanvas.
3
+ *
4
+ * Wraps computeDagreLayout. Result is available on first render.
5
+ * No loading state, no fallback — dagre runs in <2 ms for typical
6
+ * circuits.
7
+ */
8
+ import type { Circuit } from "@simten/core";
9
+ import type { MetadataState } from "./types";
10
+ import { type DagreLayoutOptions } from "./dagre-layout";
11
+ export type { DagreLayoutOptions };
12
+ /**
13
+ * Returns layout metadata for a circuit. Synchronous: result is
14
+ * available on first render. Pass `null` to skip layout (e.g. when
15
+ * the consumer is providing a static `layout` prop).
16
+ */
17
+ export declare function useLayout(circuit: Circuit | null, options?: DagreLayoutOptions): {
18
+ metadata: MetadataState;
19
+ isLayoutReady: boolean;
20
+ };
21
+ //# sourceMappingURL=useLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLayout.d.ts","sourceRoot":"","sources":["../../src/canvas/useLayout.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,OAAO,GAAG,IAAI,EACvB,OAAO,CAAC,EAAE,kBAAkB,GAC3B;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAUrD"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * useLayout — synchronous layout hook for CircuitCanvas.
3
+ *
4
+ * Wraps computeDagreLayout. Result is available on first render.
5
+ * No loading state, no fallback — dagre runs in <2 ms for typical
6
+ * circuits.
7
+ */
8
+ import { useMemo } from "react";
9
+ import { computeDagreLayout } from "./dagre-layout";
10
+ /**
11
+ * Returns layout metadata for a circuit. Synchronous: result is
12
+ * available on first render. Pass `null` to skip layout (e.g. when
13
+ * the consumer is providing a static `layout` prop).
14
+ */
15
+ export function useLayout(circuit, options) {
16
+ return useMemo(() => {
17
+ if (!circuit) {
18
+ return {
19
+ metadata: { components: {}, connections: {} },
20
+ isLayoutReady: false,
21
+ };
22
+ }
23
+ return { metadata: computeDagreLayout(circuit, options), isLayoutReady: true };
24
+ }, [circuit, options?.direction, options?.nodeSpacing, options?.rankSpacing]);
25
+ }
26
+ //# sourceMappingURL=useLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLayout.js","sourceRoot":"","sources":["../../src/canvas/useLayout.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGhC,OAAO,EAAE,kBAAkB,EAA2B,MAAM,gBAAgB,CAAC;AAI7E;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,OAAuB,EACvB,OAA4B;IAE5B,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAmB;gBAC9D,aAAa,EAAE,KAAK;aACrB,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACjF,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CircuitSelector Component
3
+ *
4
+ * Dropdown selector for choosing which compiled TypeScript circuit to visualize.
5
+ * Displays circuit count and allows switching between multiple circuits
6
+ * when a circuit code file defines multiple circuits.
7
+ */
8
+ export declare function CircuitSelector(): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=CircuitSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircuitSelector.d.ts","sourceRoot":"","sources":["../../../src/editor/components/CircuitSelector.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,wBAAgB,eAAe,4CAyC9B"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * CircuitSelector Component
3
+ *
4
+ * Dropdown selector for choosing which compiled TypeScript circuit to visualize.
5
+ * Displays circuit count and allows switching between multiple circuits
6
+ * when a circuit code file defines multiple circuits.
7
+ */
8
+ 'use client';
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ import { useCircuitPreviewStore } from '../stores/circuit-preview-store';
11
+ import { cn } from '../../lib/utils';
12
+ export function CircuitSelector() {
13
+ const compiledCircuits = useCircuitPreviewStore((state) => state.compiledCircuits);
14
+ const selectedCircuitIndex = useCircuitPreviewStore((state) => state.selectedCircuitIndex);
15
+ const selectCircuit = useCircuitPreviewStore((state) => state.selectCircuit);
16
+ const hasCircuits = compiledCircuits.length > 0;
17
+ const circuitCount = compiledCircuits.length;
18
+ return (_jsxs("div", { className: "flex items-center gap-4 px-4 py-2 border-b bg-gray-50 dark:bg-gray-900", children: [_jsx("label", { htmlFor: "circuit-select", className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: "Circuit:" }), _jsxs("select", { id: "circuit-select", value: selectedCircuitIndex, onChange: (e) => selectCircuit(Number(e.target.value)), disabled: !hasCircuits, className: cn('px-3 py-1 rounded border text-sm', 'bg-white dark:bg-gray-800', 'border-gray-300 dark:border-gray-600', 'text-gray-900 dark:text-gray-100', 'focus:outline-none focus:ring-2 focus:ring-blue-500', 'disabled:opacity-50 disabled:cursor-not-allowed'), children: [!hasCircuits && _jsx("option", { value: -1, children: "No circuits compiled" }), compiledCircuits.map((circuit, index) => (_jsx("option", { value: index, children: circuit.name }, index)))] }), _jsxs("span", { className: "text-sm text-gray-600 dark:text-gray-400", children: [circuitCount === 0 && 'No circuits compiled', circuitCount === 1 && '1 circuit compiled', circuitCount > 1 && `${circuitCount} circuits compiled`] })] }));
19
+ }
20
+ //# sourceMappingURL=CircuitSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircuitSelector.js","sourceRoot":"","sources":["../../../src/editor/components/CircuitSelector.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,CAAC;;AAEb,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC,MAAM,UAAU,eAAe;IAC7B,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnF,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC3F,MAAM,aAAa,GAAG,sBAAsB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAE7E,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAE7C,OAAO,CACL,eAAK,SAAS,EAAC,wEAAwE,aACrF,gBAAO,OAAO,EAAC,gBAAgB,EAAC,SAAS,EAAC,sDAAsD,yBAExF,EACR,kBACE,EAAE,EAAC,gBAAgB,EACnB,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACtD,QAAQ,EAAE,CAAC,WAAW,EACtB,SAAS,EAAE,EAAE,CACX,kCAAkC,EAClC,2BAA2B,EAC3B,sCAAsC,EACtC,kCAAkC,EAClC,qDAAqD,EACrD,iDAAiD,CAClD,aAEA,CAAC,WAAW,IAAI,iBAAQ,KAAK,EAAE,CAAC,CAAC,qCAA+B,EAChE,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CACxC,iBAAoB,KAAK,EAAE,KAAK,YAC7B,OAAO,CAAC,IAAI,IADF,KAAK,CAET,CACV,CAAC,IACK,EACT,gBAAM,SAAS,EAAC,0CAA0C,aACvD,YAAY,KAAK,CAAC,IAAI,sBAAsB,EAC5C,YAAY,KAAK,CAAC,IAAI,oBAAoB,EAC1C,YAAY,GAAG,CAAC,IAAI,GAAG,YAAY,oBAAoB,IACnD,IACH,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * CircuitTabBar Component
3
+ *
4
+ * Browser-style tabs for switching between compiled circuits.
5
+ * Replaces the old dropdown selector with a more discoverable tab interface.
6
+ */
7
+ export declare function CircuitTabBar(): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=CircuitTabBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircuitTabBar.d.ts","sourceRoot":"","sources":["../../../src/editor/components/CircuitTabBar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,wBAAgB,aAAa,4CAqC5B"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * CircuitTabBar Component
3
+ *
4
+ * Browser-style tabs for switching between compiled circuits.
5
+ * Replaces the old dropdown selector with a more discoverable tab interface.
6
+ */
7
+ 'use client';
8
+ import { jsx as _jsx } from "react/jsx-runtime";
9
+ import { useCircuitPreviewStore } from '../stores/circuit-preview-store';
10
+ import { cn } from '../../lib/utils';
11
+ export function CircuitTabBar() {
12
+ const compiledCircuits = useCircuitPreviewStore((state) => state.compiledCircuits);
13
+ const selectedCircuitIndex = useCircuitPreviewStore((state) => state.selectedCircuitIndex);
14
+ const selectCircuit = useCircuitPreviewStore((state) => state.selectCircuit);
15
+ const hasCircuits = compiledCircuits.length > 0;
16
+ if (!hasCircuits) {
17
+ return (_jsx("div", { className: "flex items-center gap-2 px-4 py-3 border-b bg-gray-50 dark:bg-gray-900", children: _jsx("span", { className: "text-sm text-gray-600 dark:text-gray-400", children: "No circuits compiled. Write circuit code to see circuits here." }) }));
18
+ }
19
+ return (_jsx("div", { className: "flex items-center gap-1 px-2 py-2 border-b bg-gray-100 dark:bg-gray-900 overflow-x-auto", children: compiledCircuits.map((circuit, index) => (_jsx("button", { onClick: () => selectCircuit(index), className: cn('px-4 py-2 text-sm font-medium rounded-t-md transition-all whitespace-nowrap', 'hover:bg-gray-200 dark:hover:bg-gray-700', selectedCircuitIndex === index
20
+ ? 'bg-white dark:bg-gray-800 text-blue-600 dark:text-blue-400 border-t-2 border-x border-blue-600 dark:border-blue-400'
21
+ : 'bg-gray-50 dark:bg-gray-800 text-gray-700 dark:text-gray-300 border border-transparent'), title: `Switch to ${circuit.name} circuit`, children: circuit.name }, index))) }));
22
+ }
23
+ //# sourceMappingURL=CircuitTabBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircuitTabBar.js","sourceRoot":"","sources":["../../../src/editor/components/CircuitTabBar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,CAAC;;AAEb,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC,MAAM,UAAU,aAAa;IAC3B,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnF,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC3F,MAAM,aAAa,GAAG,sBAAsB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAE7E,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;IAEhD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CACL,cAAK,SAAS,EAAC,wEAAwE,YACrF,eAAM,SAAS,EAAC,0CAA0C,+EAEnD,GACH,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,yFAAyF,YACrG,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CACxC,iBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EACnC,SAAS,EAAE,EAAE,CACX,6EAA6E,EAC7E,0CAA0C,EAC1C,oBAAoB,KAAK,KAAK;gBAC5B,CAAC,CAAC,qHAAqH;gBACvH,CAAC,CAAC,wFAAwF,CAC7F,EACD,KAAK,EAAE,aAAa,OAAO,CAAC,IAAI,UAAU,YAEzC,OAAO,CAAC,IAAI,IAXR,KAAK,CAYH,CACV,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Editor ClockControls — re-exports the unified canvas ClockControls.
3
+ * The VisualEditor passes all props from the session.
4
+ */
5
+ export { ClockControls, type ClockControlsProps } from '../../canvas/ClockControls';
6
+ //# sourceMappingURL=ClockControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClockControls.d.ts","sourceRoot":"","sources":["../../../src/editor/components/ClockControls.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Editor ClockControls — re-exports the unified canvas ClockControls.
3
+ * The VisualEditor passes all props from the session.
4
+ */
5
+ 'use client';
6
+ export { ClockControls } from '../../canvas/ClockControls';
7
+ //# sourceMappingURL=ClockControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClockControls.js","sourceRoot":"","sources":["../../../src/editor/components/ClockControls.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAA2B,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * ComponentTooltip Component
3
+ *
4
+ * Displays detailed information about a component on hover,
5
+ * similar to Turing Complete game tooltips.
6
+ * Shows component name, description, and input/output states.
7
+ */
8
+ import React from 'react';
9
+ export interface PortInfo {
10
+ index: number;
11
+ label: string;
12
+ value?: boolean;
13
+ }
14
+ interface ComponentTooltipProps {
15
+ children: React.ReactNode;
16
+ title: string;
17
+ description: string;
18
+ inputs?: PortInfo[];
19
+ outputs?: PortInfo[];
20
+ enabled?: boolean;
21
+ delayMs?: number;
22
+ }
23
+ export declare function ComponentTooltip({ children, title, description, inputs, outputs, enabled, delayMs, }: ComponentTooltipProps): import("react/jsx-runtime").JSX.Element;
24
+ export {};
25
+ //# sourceMappingURL=ComponentTooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComponentTooltip.d.ts","sourceRoot":"","sources":["../../../src/editor/components/ComponentTooltip.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAsC,MAAM,OAAO,CAAC;AAI3D,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,KAAK,EACL,WAAW,EACX,MAAW,EACX,OAAY,EACZ,OAAc,EACd,OAAa,GACd,EAAE,qBAAqB,2CA0EvB"}