qsharp-lang 1.14.5-dev → 1.15.1-dev

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 (338) hide show
  1. package/dist/browser.d.ts +1 -1
  2. package/dist/compiler/compiler.d.ts +1 -1
  3. package/dist/compiler/compiler.js +6 -1
  4. package/dist/debug-service/debug-service.d.ts +1 -1
  5. package/dist/debug-service/debug-service.js +6 -1
  6. package/dist/katas-content.generated.js +1 -1
  7. package/dist/katas-content.generated.md.js +1 -1
  8. package/dist/samples.generated.js +1 -1
  9. package/dist/shared/circuit.d.ts +86 -30
  10. package/dist/shared/circuit.js +4 -0
  11. package/dist/shared/legacyCircuitUpdate.d.ts +9 -0
  12. package/dist/shared/legacyCircuitUpdate.js +312 -0
  13. package/dist/shared/register.d.ts +3 -5
  14. package/dist/utils.d.ts +9 -0
  15. package/dist/utils.js +41 -0
  16. package/docs/Microsoft.Quantum.Core/Length.md +1 -1
  17. package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
  18. package/docs/Microsoft.Quantum.Core/index.md +1 -1
  19. package/docs/Std.Arithmetic/AddLE.md +1 -1
  20. package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
  21. package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
  22. package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
  23. package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
  24. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
  25. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
  26. package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
  27. package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
  28. package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
  29. package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
  30. package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
  31. package/docs/Std.Arithmetic/IncByI.md +1 -1
  32. package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
  33. package/docs/Std.Arithmetic/IncByL.md +1 -1
  34. package/docs/Std.Arithmetic/IncByLE.md +1 -1
  35. package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
  36. package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
  37. package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
  38. package/docs/Std.Arithmetic/MAJ.md +1 -1
  39. package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
  40. package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
  41. package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
  42. package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
  43. package/docs/Std.Arithmetic/index.md +1 -1
  44. package/docs/Std.Arrays/All.md +1 -1
  45. package/docs/Std.Arrays/Any.md +1 -1
  46. package/docs/Std.Arrays/Chunks.md +1 -1
  47. package/docs/Std.Arrays/CircularlyShifted.md +1 -1
  48. package/docs/Std.Arrays/ColumnAt.md +1 -1
  49. package/docs/Std.Arrays/Count.md +1 -1
  50. package/docs/Std.Arrays/Diagonal.md +1 -1
  51. package/docs/Std.Arrays/DrawMany.md +1 -1
  52. package/docs/Std.Arrays/Enumerated.md +1 -1
  53. package/docs/Std.Arrays/Excluding.md +1 -1
  54. package/docs/Std.Arrays/Filtered.md +1 -1
  55. package/docs/Std.Arrays/FlatMapped.md +1 -1
  56. package/docs/Std.Arrays/Flattened.md +1 -1
  57. package/docs/Std.Arrays/Fold.md +1 -1
  58. package/docs/Std.Arrays/ForEach.md +1 -1
  59. package/docs/Std.Arrays/Head.md +1 -1
  60. package/docs/Std.Arrays/HeadAndRest.md +1 -1
  61. package/docs/Std.Arrays/IndexOf.md +1 -1
  62. package/docs/Std.Arrays/IndexRange.md +1 -1
  63. package/docs/Std.Arrays/Interleaved.md +1 -1
  64. package/docs/Std.Arrays/IsEmpty.md +1 -1
  65. package/docs/Std.Arrays/IsRectangularArray.md +1 -1
  66. package/docs/Std.Arrays/IsSorted.md +1 -1
  67. package/docs/Std.Arrays/IsSquareArray.md +1 -1
  68. package/docs/Std.Arrays/Mapped.md +1 -1
  69. package/docs/Std.Arrays/MappedByIndex.md +1 -1
  70. package/docs/Std.Arrays/MappedOverRange.md +1 -1
  71. package/docs/Std.Arrays/Most.md +1 -1
  72. package/docs/Std.Arrays/MostAndTail.md +1 -1
  73. package/docs/Std.Arrays/Padded.md +1 -1
  74. package/docs/Std.Arrays/Partitioned.md +1 -1
  75. package/docs/Std.Arrays/Rest.md +1 -1
  76. package/docs/Std.Arrays/Reversed.md +1 -1
  77. package/docs/Std.Arrays/SequenceI.md +1 -1
  78. package/docs/Std.Arrays/SequenceL.md +1 -1
  79. package/docs/Std.Arrays/Sorted.md +1 -1
  80. package/docs/Std.Arrays/Subarray.md +1 -1
  81. package/docs/Std.Arrays/Swapped.md +1 -1
  82. package/docs/Std.Arrays/Tail.md +1 -1
  83. package/docs/Std.Arrays/Transposed.md +1 -1
  84. package/docs/Std.Arrays/Unzipped.md +1 -1
  85. package/docs/Std.Arrays/Where.md +1 -1
  86. package/docs/Std.Arrays/Windows.md +1 -1
  87. package/docs/Std.Arrays/Zipped.md +1 -1
  88. package/docs/Std.Arrays/index.md +1 -1
  89. package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
  90. package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
  91. package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
  92. package/docs/Std.Canon/ApplyP.md +1 -1
  93. package/docs/Std.Canon/ApplyPauli.md +1 -1
  94. package/docs/Std.Canon/ApplyPauliFromBitString.md +1 -1
  95. package/docs/Std.Canon/ApplyPauliFromInt.md +1 -1
  96. package/docs/Std.Canon/ApplyQFT.md +1 -1
  97. package/docs/Std.Canon/ApplyToEach.md +1 -1
  98. package/docs/Std.Canon/ApplyToEachA.md +1 -1
  99. package/docs/Std.Canon/ApplyToEachC.md +1 -1
  100. package/docs/Std.Canon/ApplyToEachCA.md +1 -1
  101. package/docs/Std.Canon/ApplyXorInPlace.md +1 -1
  102. package/docs/Std.Canon/ApplyXorInPlaceL.md +1 -1
  103. package/docs/Std.Canon/CX.md +1 -1
  104. package/docs/Std.Canon/CY.md +1 -1
  105. package/docs/Std.Canon/CZ.md +1 -1
  106. package/docs/Std.Canon/Fst.md +1 -1
  107. package/docs/Std.Canon/Relabel.md +1 -1
  108. package/docs/Std.Canon/Snd.md +1 -1
  109. package/docs/Std.Canon/SwapReverseRegister.md +1 -1
  110. package/docs/Std.Canon/index.md +1 -1
  111. package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
  112. package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
  113. package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
  114. package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
  115. package/docs/Std.Convert/BoolAsResult.md +1 -1
  116. package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
  117. package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
  118. package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
  119. package/docs/Std.Convert/IntAsBigInt.md +1 -1
  120. package/docs/Std.Convert/IntAsBoolArray.md +1 -1
  121. package/docs/Std.Convert/IntAsDouble.md +1 -1
  122. package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
  123. package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
  124. package/docs/Std.Convert/ResultAsBool.md +1 -1
  125. package/docs/Std.Convert/index.md +1 -1
  126. package/docs/Std.Core/Length.md +1 -1
  127. package/docs/Std.Core/Repeated.md +1 -1
  128. package/docs/Std.Core/index.md +1 -1
  129. package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
  130. package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
  131. package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
  132. package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
  133. package/docs/Std.Diagnostics/CheckZero.md +1 -1
  134. package/docs/Std.Diagnostics/ConfigurePauliNoise.md +1 -1
  135. package/docs/Std.Diagnostics/DepolarizingNoise.md +1 -1
  136. package/docs/Std.Diagnostics/DumpMachine.md +1 -1
  137. package/docs/Std.Diagnostics/DumpOperation.md +1 -1
  138. package/docs/Std.Diagnostics/DumpRegister.md +1 -1
  139. package/docs/Std.Diagnostics/Fact.md +1 -1
  140. package/docs/Std.Diagnostics/NoNoise.md +1 -1
  141. package/docs/Std.Diagnostics/PhaseFlipNoise.md +1 -1
  142. package/docs/Std.Diagnostics/StartCountingFunction.md +1 -1
  143. package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
  144. package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
  145. package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
  146. package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
  147. package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
  148. package/docs/Std.Diagnostics/index.md +1 -1
  149. package/docs/Std.Intrinsic/AND.md +1 -1
  150. package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
  151. package/docs/Std.Intrinsic/CCNOT.md +1 -1
  152. package/docs/Std.Intrinsic/CNOT.md +1 -1
  153. package/docs/Std.Intrinsic/Exp.md +1 -1
  154. package/docs/Std.Intrinsic/H.md +1 -1
  155. package/docs/Std.Intrinsic/I.md +1 -1
  156. package/docs/Std.Intrinsic/M.md +1 -1
  157. package/docs/Std.Intrinsic/Measure.md +1 -1
  158. package/docs/Std.Intrinsic/Message.md +1 -1
  159. package/docs/Std.Intrinsic/R.md +1 -1
  160. package/docs/Std.Intrinsic/R1.md +1 -1
  161. package/docs/Std.Intrinsic/R1Frac.md +1 -1
  162. package/docs/Std.Intrinsic/RFrac.md +1 -1
  163. package/docs/Std.Intrinsic/Reset.md +1 -1
  164. package/docs/Std.Intrinsic/ResetAll.md +1 -1
  165. package/docs/Std.Intrinsic/Rx.md +1 -1
  166. package/docs/Std.Intrinsic/Rxx.md +1 -1
  167. package/docs/Std.Intrinsic/Ry.md +1 -1
  168. package/docs/Std.Intrinsic/Ryy.md +1 -1
  169. package/docs/Std.Intrinsic/Rz.md +1 -1
  170. package/docs/Std.Intrinsic/Rzz.md +1 -1
  171. package/docs/Std.Intrinsic/S.md +1 -1
  172. package/docs/Std.Intrinsic/SWAP.md +1 -1
  173. package/docs/Std.Intrinsic/T.md +1 -1
  174. package/docs/Std.Intrinsic/X.md +1 -1
  175. package/docs/Std.Intrinsic/Y.md +1 -1
  176. package/docs/Std.Intrinsic/Z.md +1 -1
  177. package/docs/Std.Intrinsic/index.md +1 -1
  178. package/docs/Std.Logical/Xor.md +1 -1
  179. package/docs/Std.Logical/index.md +1 -1
  180. package/docs/Std.Math/AbsComplex.md +1 -1
  181. package/docs/Std.Math/AbsComplexPolar.md +1 -1
  182. package/docs/Std.Math/AbsD.md +1 -1
  183. package/docs/Std.Math/AbsI.md +1 -1
  184. package/docs/Std.Math/AbsL.md +1 -1
  185. package/docs/Std.Math/AbsSquaredComplex.md +1 -1
  186. package/docs/Std.Math/AbsSquaredComplexPolar.md +1 -1
  187. package/docs/Std.Math/ApproximateFactorial.md +1 -1
  188. package/docs/Std.Math/ArcCos.md +1 -1
  189. package/docs/Std.Math/ArcCosh.md +1 -1
  190. package/docs/Std.Math/ArcSin.md +1 -1
  191. package/docs/Std.Math/ArcSinh.md +1 -1
  192. package/docs/Std.Math/ArcTan.md +1 -1
  193. package/docs/Std.Math/ArcTan2.md +1 -1
  194. package/docs/Std.Math/ArcTanh.md +1 -1
  195. package/docs/Std.Math/ArgComplex.md +1 -1
  196. package/docs/Std.Math/ArgComplexPolar.md +1 -1
  197. package/docs/Std.Math/Binom.md +1 -1
  198. package/docs/Std.Math/BitSizeI.md +1 -1
  199. package/docs/Std.Math/BitSizeL.md +1 -1
  200. package/docs/Std.Math/Ceiling.md +1 -1
  201. package/docs/Std.Math/Complex.md +1 -1
  202. package/docs/Std.Math/ComplexPolar.md +1 -1
  203. package/docs/Std.Math/ContinuedFractionConvergentI.md +1 -1
  204. package/docs/Std.Math/ContinuedFractionConvergentL.md +1 -1
  205. package/docs/Std.Math/Cos.md +1 -1
  206. package/docs/Std.Math/Cosh.md +1 -1
  207. package/docs/Std.Math/DivRemI.md +1 -1
  208. package/docs/Std.Math/DivRemL.md +1 -1
  209. package/docs/Std.Math/DividedByC.md +1 -1
  210. package/docs/Std.Math/DividedByCP.md +1 -1
  211. package/docs/Std.Math/E.md +1 -1
  212. package/docs/Std.Math/ExpModI.md +1 -1
  213. package/docs/Std.Math/ExpModL.md +1 -1
  214. package/docs/Std.Math/ExtendedGreatestCommonDivisorI.md +1 -1
  215. package/docs/Std.Math/ExtendedGreatestCommonDivisorL.md +1 -1
  216. package/docs/Std.Math/FactorialI.md +1 -1
  217. package/docs/Std.Math/FactorialL.md +1 -1
  218. package/docs/Std.Math/Floor.md +1 -1
  219. package/docs/Std.Math/GreatestCommonDivisorI.md +1 -1
  220. package/docs/Std.Math/GreatestCommonDivisorL.md +1 -1
  221. package/docs/Std.Math/HammingWeightI.md +1 -1
  222. package/docs/Std.Math/InverseModI.md +1 -1
  223. package/docs/Std.Math/InverseModL.md +1 -1
  224. package/docs/Std.Math/IsCoprimeI.md +1 -1
  225. package/docs/Std.Math/IsCoprimeL.md +1 -1
  226. package/docs/Std.Math/IsInfinite.md +1 -1
  227. package/docs/Std.Math/IsNaN.md +1 -1
  228. package/docs/Std.Math/LargestFixedPoint.md +1 -1
  229. package/docs/Std.Math/Lg.md +1 -1
  230. package/docs/Std.Math/Log.md +1 -1
  231. package/docs/Std.Math/Log10.md +1 -1
  232. package/docs/Std.Math/LogFactorialD.md +1 -1
  233. package/docs/Std.Math/LogGammaD.md +1 -1
  234. package/docs/Std.Math/LogOf2.md +1 -1
  235. package/docs/Std.Math/Max.md +1 -1
  236. package/docs/Std.Math/MaxD.md +1 -1
  237. package/docs/Std.Math/MaxI.md +1 -1
  238. package/docs/Std.Math/MaxL.md +1 -1
  239. package/docs/Std.Math/Min.md +1 -1
  240. package/docs/Std.Math/MinD.md +1 -1
  241. package/docs/Std.Math/MinI.md +1 -1
  242. package/docs/Std.Math/MinL.md +1 -1
  243. package/docs/Std.Math/MinusC.md +1 -1
  244. package/docs/Std.Math/MinusCP.md +1 -1
  245. package/docs/Std.Math/ModulusI.md +1 -1
  246. package/docs/Std.Math/ModulusL.md +1 -1
  247. package/docs/Std.Math/NegationC.md +1 -1
  248. package/docs/Std.Math/NegationCP.md +1 -1
  249. package/docs/Std.Math/PI.md +1 -1
  250. package/docs/Std.Math/PNorm.md +1 -1
  251. package/docs/Std.Math/PNormalized.md +1 -1
  252. package/docs/Std.Math/PlusC.md +1 -1
  253. package/docs/Std.Math/PlusCP.md +1 -1
  254. package/docs/Std.Math/PowC.md +1 -1
  255. package/docs/Std.Math/PowCP.md +1 -1
  256. package/docs/Std.Math/RealMod.md +1 -1
  257. package/docs/Std.Math/Round.md +1 -1
  258. package/docs/Std.Math/SignD.md +1 -1
  259. package/docs/Std.Math/SignI.md +1 -1
  260. package/docs/Std.Math/SignL.md +1 -1
  261. package/docs/Std.Math/Sin.md +1 -1
  262. package/docs/Std.Math/Sinh.md +1 -1
  263. package/docs/Std.Math/SmallestFixedPoint.md +1 -1
  264. package/docs/Std.Math/Sqrt.md +1 -1
  265. package/docs/Std.Math/SquaredNorm.md +1 -1
  266. package/docs/Std.Math/Tan.md +1 -1
  267. package/docs/Std.Math/Tanh.md +1 -1
  268. package/docs/Std.Math/TimesC.md +1 -1
  269. package/docs/Std.Math/TimesCP.md +1 -1
  270. package/docs/Std.Math/TrailingZeroCountI.md +1 -1
  271. package/docs/Std.Math/TrailingZeroCountL.md +1 -1
  272. package/docs/Std.Math/Truncate.md +1 -1
  273. package/docs/Std.Math/index.md +1 -1
  274. package/docs/Std.Measurement/MResetEachZ.md +1 -1
  275. package/docs/Std.Measurement/MResetX.md +1 -1
  276. package/docs/Std.Measurement/MResetY.md +1 -1
  277. package/docs/Std.Measurement/MResetZ.md +1 -1
  278. package/docs/Std.Measurement/MeasureAllZ.md +1 -1
  279. package/docs/Std.Measurement/MeasureEachZ.md +1 -1
  280. package/docs/Std.Measurement/MeasureInteger.md +1 -1
  281. package/docs/Std.Measurement/index.md +1 -1
  282. package/docs/Std.Random/DrawRandomBool.md +1 -1
  283. package/docs/Std.Random/DrawRandomDouble.md +1 -1
  284. package/docs/Std.Random/DrawRandomInt.md +1 -1
  285. package/docs/Std.Random/index.md +1 -1
  286. package/docs/Std.Range/IsRangeEmpty.md +1 -1
  287. package/docs/Std.Range/RangeEnd.md +1 -1
  288. package/docs/Std.Range/RangeReverse.md +1 -1
  289. package/docs/Std.Range/RangeStart.md +1 -1
  290. package/docs/Std.Range/RangeStep.md +1 -1
  291. package/docs/Std.Range/index.md +1 -1
  292. package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
  293. package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
  294. package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
  295. package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
  296. package/docs/Std.ResourceEstimation/CczCount.md +1 -1
  297. package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
  298. package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
  299. package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
  300. package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
  301. package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
  302. package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
  303. package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
  304. package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
  305. package/docs/Std.ResourceEstimation/TCount.md +1 -1
  306. package/docs/Std.ResourceEstimation/index.md +1 -1
  307. package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
  308. package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
  309. package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
  310. package/docs/Std.StatePreparation/index.md +1 -1
  311. package/docs/Std.TableLookup/Select.md +1 -1
  312. package/docs/Std.TableLookup/index.md +1 -1
  313. package/docs/index.md +1 -1
  314. package/lib/node/qsc_wasm.cjs +2 -2
  315. package/lib/node/qsc_wasm_bg.wasm +0 -0
  316. package/lib/web/qsc_wasm.js +2 -2
  317. package/lib/web/qsc_wasm_bg.wasm +0 -0
  318. package/package.json +1 -1
  319. package/ux/circuit-vis/circuit.ts +11 -0
  320. package/ux/circuit-vis/circuitManipulation.ts +549 -0
  321. package/ux/circuit-vis/constants.ts +7 -0
  322. package/ux/circuit-vis/contextMenu.ts +376 -0
  323. package/ux/circuit-vis/draggable.ts +352 -0
  324. package/ux/circuit-vis/events.ts +818 -0
  325. package/ux/circuit-vis/formatters/gateFormatter.ts +56 -23
  326. package/ux/circuit-vis/formatters/inputFormatter.ts +38 -7
  327. package/ux/circuit-vis/formatters/registerFormatter.ts +12 -30
  328. package/ux/circuit-vis/index.ts +16 -11
  329. package/ux/circuit-vis/metadata.ts +3 -1
  330. package/ux/circuit-vis/panel.ts +333 -0
  331. package/ux/circuit-vis/process.ts +136 -232
  332. package/ux/circuit-vis/sqore.ts +231 -116
  333. package/ux/circuit-vis/utils.ts +269 -1
  334. package/ux/circuit.tsx +71 -37
  335. package/ux/data.ts +4 -2
  336. package/ux/index.ts +1 -1
  337. package/ux/qsharp-circuit.css +260 -4
  338. package/ux/circuit-vis/styles.ts +0 -236
@@ -0,0 +1,376 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT license.
3
+
4
+ import { Parameter } from "./circuit";
5
+ import { removeControl, removeOperation } from "./circuitManipulation";
6
+ import { CircuitEvents } from "./events";
7
+ import { findGateElem, findOperation } from "./utils";
8
+
9
+ /**
10
+ * Adds a context menu to a host element in the circuit visualization.
11
+ *
12
+ * @param circuitEvents The CircuitEvents instance to handle circuit-related events.
13
+ * @param hostElem The SVG element representing a gate component to which the context menu will be added.
14
+ */
15
+ const addContextMenuToHostElem = (
16
+ circuitEvents: CircuitEvents,
17
+ hostElem: SVGGraphicsElement,
18
+ ) => {
19
+ hostElem?.addEventListener("contextmenu", (ev: MouseEvent) => {
20
+ ev.preventDefault();
21
+
22
+ // Remove any existing context menu
23
+ const existingContextMenu = document.querySelector(".context-menu");
24
+ if (existingContextMenu) {
25
+ document.body.removeChild(existingContextMenu);
26
+ }
27
+
28
+ const gateElem = findGateElem(hostElem);
29
+ if (!gateElem) return;
30
+ const selectedLocation = gateElem.getAttribute("data-location");
31
+ const selectedOperation = findOperation(
32
+ circuitEvents.componentGrid,
33
+ selectedLocation,
34
+ );
35
+ if (!selectedOperation || !selectedLocation) return;
36
+
37
+ const contextMenu = document.createElement("div");
38
+ contextMenu.classList.add("context-menu");
39
+ contextMenu.style.top = `${ev.clientY + window.scrollY}px`;
40
+ contextMenu.style.left = `${ev.clientX + window.scrollX}px`;
41
+ contextMenu.addEventListener("contextmenu", (e) => {
42
+ e.preventDefault();
43
+ e.stopPropagation();
44
+ });
45
+ contextMenu.addEventListener("mouseup", (e) => {
46
+ e.preventDefault();
47
+ e.stopPropagation();
48
+ });
49
+
50
+ const dataWireStr = hostElem.getAttribute("data-wire");
51
+ const dataWire = dataWireStr != null ? parseInt(dataWireStr) : null;
52
+ const isControl =
53
+ hostElem.classList.contains("control-dot") && dataWire != null;
54
+
55
+ const deleteOption = _createContextMenuItem("Delete", () => {
56
+ removeOperation(circuitEvents, selectedLocation);
57
+ circuitEvents.renderFn();
58
+ });
59
+
60
+ if (
61
+ selectedOperation.kind === "measurement" ||
62
+ selectedOperation.kind === "ket"
63
+ ) {
64
+ contextMenu.appendChild(deleteOption);
65
+ } else if (isControl) {
66
+ const removeControlOption = _createContextMenuItem(
67
+ "Remove control",
68
+ () => {
69
+ removeControl(selectedOperation, dataWire);
70
+ circuitEvents.renderFn();
71
+ },
72
+ );
73
+ contextMenu.appendChild(removeControlOption!);
74
+ } else {
75
+ const adjointOption = _createContextMenuItem("Toggle Adjoint", () => {
76
+ if (selectedOperation.kind !== "unitary") return;
77
+ selectedOperation.isAdjoint = !selectedOperation.isAdjoint;
78
+ circuitEvents.renderFn();
79
+ });
80
+
81
+ const addControlOption = _createContextMenuItem("Add control", () => {
82
+ if (selectedOperation.kind !== "unitary") return;
83
+ circuitEvents._startAddingControl(selectedOperation, selectedLocation);
84
+ });
85
+
86
+ let removeControlOption: HTMLDivElement | undefined;
87
+ if (selectedOperation.controls && selectedOperation.controls.length > 0) {
88
+ removeControlOption = _createContextMenuItem("Remove control", () => {
89
+ circuitEvents._startRemovingControl(selectedOperation);
90
+ });
91
+ contextMenu.appendChild(removeControlOption);
92
+ }
93
+
94
+ const promptArgOption = _createContextMenuItem("Edit Argument", () => {
95
+ promptForArguments(
96
+ selectedOperation.params!,
97
+ selectedOperation.args,
98
+ ).then((args) => {
99
+ if (args.length > 0) {
100
+ selectedOperation.args = args;
101
+ } else {
102
+ selectedOperation.args = undefined;
103
+ }
104
+ circuitEvents.renderFn();
105
+ });
106
+ });
107
+
108
+ if (selectedOperation.gate == "X") {
109
+ contextMenu.appendChild(addControlOption);
110
+ if (removeControlOption) {
111
+ contextMenu.appendChild(removeControlOption);
112
+ }
113
+ contextMenu.appendChild(deleteOption);
114
+ } else {
115
+ contextMenu.appendChild(adjointOption);
116
+ contextMenu.appendChild(addControlOption);
117
+ if (removeControlOption) {
118
+ contextMenu.appendChild(removeControlOption);
119
+ }
120
+ if (
121
+ selectedOperation.params !== undefined &&
122
+ selectedOperation.params.length > 0
123
+ ) {
124
+ contextMenu.appendChild(promptArgOption);
125
+ }
126
+ contextMenu.appendChild(deleteOption);
127
+ }
128
+ }
129
+
130
+ document.body.appendChild(contextMenu);
131
+
132
+ document.addEventListener(
133
+ "click",
134
+ () => {
135
+ if (document.body.contains(contextMenu)) {
136
+ document.body.removeChild(contextMenu);
137
+ }
138
+ },
139
+ { once: true },
140
+ );
141
+ });
142
+ };
143
+
144
+ /**
145
+ * Prompt the user for argument values.
146
+ * @param params - The parameters for which the user needs to provide values.
147
+ * @param defaultArgs - The default values for the parameters, if any.
148
+ * @returns A Promise that resolves with the user-provided arguments as an array of strings.
149
+ */
150
+ const promptForArguments = (
151
+ params: Parameter[],
152
+ defaultArgs: string[] = [],
153
+ ): Promise<string[]> => {
154
+ return new Promise((resolve) => {
155
+ const collectedArgs: string[] = [];
156
+ let currentIndex = 0;
157
+
158
+ const promptNext = () => {
159
+ if (currentIndex >= params.length) {
160
+ resolve(collectedArgs);
161
+ return;
162
+ }
163
+
164
+ const param = params[currentIndex];
165
+ const defaultValue = defaultArgs[currentIndex] || "";
166
+
167
+ _createInputPrompt(
168
+ `Enter value for parameter "${param.name}":`,
169
+ (userInput) => {
170
+ if (userInput !== null) {
171
+ collectedArgs.push(userInput);
172
+ currentIndex++;
173
+ promptNext();
174
+ } else {
175
+ resolve(defaultArgs); // User canceled the prompt
176
+ }
177
+ },
178
+ defaultValue,
179
+ validateExpression,
180
+ 'Examples: "2.0 * π" or "π / 2.0"',
181
+ );
182
+ };
183
+
184
+ promptNext();
185
+ });
186
+ };
187
+
188
+ /**
189
+ * Validate a mathematical expression.
190
+ * @param input - The input string to validate.
191
+ * @returns True if the expression is valid, false otherwise.
192
+ */
193
+ const validateExpression = (input: string): boolean => {
194
+ // Removes outermost parentheses
195
+ const removeParentheses = (expr: string): string => {
196
+ while (expr.startsWith("(") && expr.endsWith(")")) {
197
+ expr = expr.slice(1, -1).trim(); // Remove outermost parentheses
198
+ }
199
+ return expr;
200
+ };
201
+
202
+ // Validates parentheses balance and nesting
203
+ const validateParentheses = (expr: string): boolean => {
204
+ const stack: string[] = [];
205
+ for (const char of expr) {
206
+ if (char === "(") {
207
+ stack.push(char);
208
+ } else if (char === ")") {
209
+ if (stack.length === 0) {
210
+ return false; // Unmatched closing parenthesis
211
+ }
212
+ stack.pop();
213
+ }
214
+ }
215
+ return stack.length === 0; // Ensure no unmatched opening parentheses
216
+ };
217
+
218
+ // Validate the expression recursively
219
+ const validate = (expr: string): boolean => {
220
+ expr = expr.trim();
221
+
222
+ // Remove outermost parentheses
223
+ expr = removeParentheses(expr);
224
+
225
+ // Find and validate all sub-expressions within parentheses
226
+ const parenthesesRegex = /\(([^()]+)\)/g;
227
+ let match;
228
+ while ((match = parenthesesRegex.exec(expr)) !== null) {
229
+ const innerExpr = match[1];
230
+ if (!validate(innerExpr)) {
231
+ return false; // Invalid sub-expression
232
+ }
233
+
234
+ // Replace the validated sub-expression with a placeholder that we know is valid
235
+ expr = expr.replace(match[0], "π");
236
+ }
237
+
238
+ // Validate the remaining expression (without parentheses)
239
+ const sign = "[+-]?";
240
+ const number = "((\\d+(\\.\\d*)?))"; // Matches integers and decimals
241
+ const pi = "(?i:π|pi)"; // Matches π or pi
242
+ const value = `${sign}(${number}|${pi})`; // Matches a signed number or π
243
+ const operator = "[+\\-*/]"; // Matches arithmetic operators
244
+ const expressionRegex = new RegExp(
245
+ `^${value}(\\s*${operator}\\s*${value})*$`,
246
+ );
247
+
248
+ return expressionRegex.test(expr);
249
+ };
250
+
251
+ return validateParentheses(input) && validate(input);
252
+ };
253
+
254
+ /**
255
+ * Create a context menu item
256
+ * @param text - The text to display in the menu item
257
+ * @param onClick - The function to call when the menu item is clicked
258
+ * @returns The created menu item element
259
+ */
260
+ const _createContextMenuItem = (
261
+ text: string,
262
+ onClick: () => void,
263
+ ): HTMLDivElement => {
264
+ const menuItem = document.createElement("div");
265
+ menuItem.classList.add("context-menu-option");
266
+ menuItem.textContent = text;
267
+ menuItem.addEventListener("click", onClick);
268
+ return menuItem;
269
+ };
270
+
271
+ /**
272
+ * Create a user input prompt element
273
+ * @param message - The message to display in the prompt
274
+ * @param callback - The callback function to handle the user input
275
+ * @param defaultValue - The default value to display in the input element
276
+ * @param validateInput - A function to validate the user input
277
+ * @param placeholder - The placeholder text for the input element
278
+ */
279
+ const _createInputPrompt = (
280
+ message: string,
281
+ callback: (input: string | null) => void,
282
+ defaultValue: string = "",
283
+ validateInput: (input: string) => boolean = () => true,
284
+ placeholder: string = "",
285
+ ) => {
286
+ // Create the prompt overlay
287
+ const overlay = document.createElement("div");
288
+ overlay.classList.add("prompt-overlay");
289
+ overlay.addEventListener("contextmenu", (e) => {
290
+ e.preventDefault();
291
+ e.stopPropagation();
292
+ });
293
+
294
+ // Create the prompt container
295
+ const promptContainer = document.createElement("div");
296
+ promptContainer.classList.add("prompt-container");
297
+
298
+ // Create the message element
299
+ const messageElem = document.createElement("div");
300
+ messageElem.classList.add("prompt-message");
301
+ messageElem.textContent = message;
302
+
303
+ // Create the input element
304
+ const inputElem = document.createElement("input");
305
+ inputElem.classList.add("prompt-input");
306
+ inputElem.type = "text";
307
+ inputElem.value = defaultValue;
308
+ inputElem.placeholder = placeholder;
309
+
310
+ // Create the buttons container
311
+ const buttonsContainer = document.createElement("div");
312
+ buttonsContainer.classList.add("prompt-buttons");
313
+
314
+ // Create the π button
315
+ const piButton = document.createElement("button");
316
+ piButton.textContent = "π";
317
+ piButton.classList.add("pi-button", "prompt-button");
318
+ piButton.addEventListener("click", () => {
319
+ const cursorPosition = inputElem.selectionStart || 0;
320
+ const textBefore = inputElem.value.substring(0, cursorPosition);
321
+ const textAfter = inputElem.value.substring(cursorPosition);
322
+ inputElem.value = `${textBefore}π${textAfter}`;
323
+ inputElem.focus();
324
+ inputElem.setSelectionRange(cursorPosition + 1, cursorPosition + 1); // Move cursor after "π"
325
+ validateAndToggleOkButton();
326
+ });
327
+
328
+ // Create the OK button
329
+ const okButton = document.createElement("button");
330
+ okButton.classList.add("prompt-button");
331
+ okButton.textContent = "OK";
332
+ okButton.disabled = !validateInput(defaultValue);
333
+ okButton.addEventListener("click", () => {
334
+ callback(inputElem.value.trim());
335
+ document.body.removeChild(overlay);
336
+ });
337
+
338
+ // Create the Cancel button
339
+ const cancelButton = document.createElement("button");
340
+ cancelButton.classList.add("prompt-button");
341
+ cancelButton.textContent = "Cancel";
342
+ cancelButton.addEventListener("click", () => {
343
+ callback(null);
344
+ document.body.removeChild(overlay);
345
+ });
346
+
347
+ // Function to validate input and toggle the OK button
348
+ const validateAndToggleOkButton = () => {
349
+ const isValid = validateInput(inputElem.value.trim());
350
+ okButton.disabled = !isValid;
351
+ };
352
+
353
+ // Add input event listener for validation
354
+ inputElem.addEventListener("input", validateAndToggleOkButton);
355
+
356
+ // Append buttons to the container
357
+ buttonsContainer.appendChild(piButton);
358
+ buttonsContainer.appendChild(okButton);
359
+ buttonsContainer.appendChild(cancelButton);
360
+
361
+ // Append elements to the prompt container
362
+ promptContainer.appendChild(messageElem);
363
+ promptContainer.appendChild(inputElem);
364
+ promptContainer.appendChild(buttonsContainer);
365
+
366
+ // Append the prompt container to the overlay
367
+ overlay.appendChild(promptContainer);
368
+
369
+ // Append the overlay to the document body
370
+ document.body.appendChild(overlay);
371
+
372
+ // Focus the input element
373
+ inputElem.focus();
374
+ };
375
+
376
+ export { addContextMenuToHostElem, promptForArguments };