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,352 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT license.
3
+
4
+ import { getMinMaxRegIdx } from "../../src/utils";
5
+ import { ComponentGrid, Operation } from "./circuit";
6
+ import { gatePadding, minGateWidth, startX } from "./constants";
7
+ import { box, controlDot } from "./formatters/formatUtils";
8
+ import { formatGate } from "./formatters/gateFormatter";
9
+ import { toMetadata } from "./panel";
10
+ import { Sqore } from "./sqore";
11
+ import {
12
+ findLocation,
13
+ getHostElems,
14
+ getToolboxElems,
15
+ getWireData,
16
+ locationStringToIndexes,
17
+ } from "./utils";
18
+
19
+ interface Context {
20
+ container: HTMLElement;
21
+ operationGrid: ComponentGrid;
22
+ wireData: number[];
23
+ paddingY: number;
24
+ }
25
+
26
+ /**
27
+ * Create dragzones elements for dragging on circuit.
28
+ *
29
+ * @param container HTML element for rendering visualization into
30
+ * @param sqore Sqore object
31
+ */
32
+ const createDragzones = (container: HTMLElement, sqore: Sqore): void => {
33
+ const svg = container.querySelector("svg[id]") as SVGElement;
34
+
35
+ const context: Context = {
36
+ container,
37
+ operationGrid: sqore.circuit.componentGrid,
38
+ wireData: getWireData(container),
39
+ paddingY: 20,
40
+ };
41
+ _addStyles(container, getWireData(container));
42
+ _addDataWires(container);
43
+ svg.appendChild(_dropzoneLayer(context));
44
+ };
45
+
46
+ /**
47
+ * Creates a ghost element for dragging operations in the circuit visualization.
48
+ *
49
+ * @param ev The mouse event that triggered the creation of the ghost element.
50
+ * @param container The HTML container element where the ghost element will be appended.
51
+ * @param selectedOperation The operation that is being dragged.
52
+ * @param isControl A boolean indicating if the ghost element is for a control operation.
53
+ */
54
+ const createGhostElement = (
55
+ ev: MouseEvent,
56
+ container: HTMLElement,
57
+ selectedOperation: Operation,
58
+ isControl: boolean,
59
+ ) => {
60
+ const ghost = isControl
61
+ ? controlDot(20, 20)
62
+ : (() => {
63
+ const ghostMetadata = toMetadata(selectedOperation, 0, 0);
64
+ return formatGate(ghostMetadata).cloneNode(true) as SVGElement;
65
+ })();
66
+
67
+ // Generate svg element to wrap around ghost element
68
+ const svgElem = document.createElementNS("http://www.w3.org/2000/svg", "svg");
69
+ svgElem.append(ghost);
70
+
71
+ // Generate div element to wrap around svg element
72
+ const divElem = document.createElement("div");
73
+ divElem.classList.add("ghost");
74
+ divElem.appendChild(svgElem);
75
+ divElem.style.position = "fixed";
76
+
77
+ if (container) {
78
+ container.appendChild(divElem);
79
+
80
+ // Now that the element is appended to the DOM, get its dimensions
81
+ const [ghostWidth, ghostHeight] = isControl
82
+ ? [40, 40]
83
+ : (() => {
84
+ const ghostRect = ghost.getBoundingClientRect();
85
+ return [ghostRect.width, ghostRect.height];
86
+ })();
87
+
88
+ const updateDivLeftTop = (ev: MouseEvent) => {
89
+ divElem.style.left = `${ev.clientX - ghostWidth / 2}px`;
90
+ divElem.style.top = `${ev.clientY - ghostHeight / 2}px`;
91
+ };
92
+
93
+ updateDivLeftTop(ev);
94
+
95
+ container.addEventListener("mousemove", updateDivLeftTop);
96
+ } else {
97
+ console.error("container not found");
98
+ }
99
+ };
100
+
101
+ /**
102
+ * Create a dropzone element that spans the length of the wire.
103
+ *
104
+ * @param circuitSvg The SVG element representing the circuit.
105
+ * @param wireData An array of y values corresponding to the circuit wires.
106
+ * @param wireIndex The index of the wire for which the dropzone is created.
107
+ * @returns The created dropzone SVG element.
108
+ */
109
+ const createWireDropzone = (
110
+ circuitSvg: SVGElement,
111
+ wireData: number[],
112
+ wireIndex: number,
113
+ ): SVGElement => {
114
+ const wireY = wireData[wireIndex];
115
+ const svgWidth = Number(circuitSvg.getAttribute("width"));
116
+ const paddingY = 20;
117
+
118
+ const dropzone = box(
119
+ 0,
120
+ wireY - paddingY,
121
+ svgWidth,
122
+ paddingY * 2,
123
+ "dropzone-full-wire",
124
+ );
125
+ dropzone.setAttribute("data-dropzone-wire", `${wireIndex}`);
126
+
127
+ return dropzone;
128
+ };
129
+
130
+ /**
131
+ * Remove all wire dropzones.
132
+ *
133
+ * @param circuitSvg The SVG element representing the circuit.
134
+ */
135
+ const removeAllWireDropzones = (circuitSvg: SVGElement) => {
136
+ const dropzones = circuitSvg.querySelectorAll(".dropzone-full-wire");
137
+ dropzones.forEach((elem) => {
138
+ elem.parentNode?.removeChild(elem);
139
+ });
140
+ };
141
+
142
+ /**
143
+ * Add data-wire to all host elements
144
+ */
145
+ const _addDataWires = (container: HTMLElement) => {
146
+ const elems = getHostElems(container);
147
+ elems.forEach((elem) => {
148
+ const { cY } = _center(elem);
149
+ // i.e. cY = 40, wireData returns [40, 100, 140, 180]
150
+ // dataWire will return 0, which is the index of 40 in wireData
151
+ const dataWire = getWireData(container).findIndex((y) => y === cY);
152
+ if (dataWire !== -1) {
153
+ elem.setAttribute("data-wire", `${dataWire}`);
154
+ } else {
155
+ const { y, height } = elem.getBBox();
156
+ const wireData = getWireData(container);
157
+ const groupDataWire = wireData.findIndex(
158
+ (wireY) => wireY > y && wireY < y + height,
159
+ );
160
+ elem.setAttribute("data-wire", `${groupDataWire}`);
161
+ }
162
+ });
163
+ };
164
+
165
+ /**
166
+ * Create a list of wires that element is spanning on
167
+ * i.e. Gate 'Foo' spans on wire 0 (y=40), 1 (y=100), and 2 (y=140)
168
+ * Function returns [40, 100, 140]
169
+ */
170
+ const _wireYs = (elem: SVGGraphicsElement, wireData: number[]): number[] => {
171
+ const { y, height } = elem.getBBox();
172
+ return wireData.filter((wireY) => wireY > y && wireY < y + height);
173
+ };
174
+
175
+ /**
176
+ * Add custom styles specific to this module
177
+ */
178
+ const _addStyles = (container: HTMLElement, wireData: number[]): void => {
179
+ const elems = getHostElems(container);
180
+ elems.forEach((elem) => {
181
+ if (_wireYs(elem, wireData).length < 2) elem.style.cursor = "grab";
182
+ });
183
+
184
+ const toolBoxElems = getToolboxElems(container);
185
+ toolBoxElems.forEach((elem) => {
186
+ elem.style.cursor = "grab";
187
+ });
188
+ };
189
+
190
+ /**
191
+ * Find center point of element
192
+ */
193
+ const _center = (elem: SVGGraphicsElement): { cX: number; cY: number } => {
194
+ const { x, y, width, height } = elem.getBBox();
195
+ return { cX: x + width / 2, cY: y + height / 2 };
196
+ };
197
+
198
+ /**
199
+ * Create dropzone layer with all dropzones populated
200
+ */
201
+ const _dropzoneLayer = (context: Context) => {
202
+ const dropzoneLayer = document.createElementNS(
203
+ "http://www.w3.org/2000/svg",
204
+ "g",
205
+ );
206
+ dropzoneLayer.classList.add("dropzone-layer");
207
+ dropzoneLayer.style.display = "none";
208
+
209
+ const { container, operationGrid, wireData, paddingY } = context;
210
+ if (wireData.length === 0) return dropzoneLayer; // Return early if there are no wires
211
+ const elems = getHostElems(container);
212
+
213
+ // Get the widths of each column based on the elements in the column
214
+ const colWidths = elems.reduce(
215
+ (acc, elem) => {
216
+ const location = findLocation(elem);
217
+ if (!location) return acc;
218
+ const indexes = locationStringToIndexes(location);
219
+ // NOTE: for now, we are just going to consider the widths of top-level gates
220
+ if (indexes.length != 1) return acc;
221
+ const [colIndex] = indexes[0];
222
+
223
+ if (!acc[colIndex]) {
224
+ acc[colIndex] = Math.max(minGateWidth, elem.getBBox().width);
225
+ } else {
226
+ acc[colIndex] = Math.max(acc[colIndex], elem.getBBox().width);
227
+ }
228
+ return acc;
229
+ },
230
+ {} as Record<number, number>,
231
+ );
232
+
233
+ // Sort colWidths by colIndex
234
+ const sortedColWidths = Object.entries(colWidths)
235
+ .sort(([colIndexA], [colIndexB]) => Number(colIndexA) - Number(colIndexB))
236
+ .map(([colIndex, colWidth]) => [Number(colIndex), colWidth]);
237
+
238
+ // let xOffset = regLineStart;
239
+ let xOffset = startX - gatePadding;
240
+
241
+ /**
242
+ * Create a dropzone box element.
243
+ *
244
+ * @param wireIndex The index of the wire for which the dropzone is created.
245
+ * @param colIndex The index of the column where the dropzone is located.
246
+ * @param colWidth The width of the column.
247
+ * @param opIndex The index of the operation within the column.
248
+ * @param interColumn Whether the dropzone is between columns.
249
+ * @returns The created dropzone SVG element.
250
+ */
251
+ const _makeDropzoneBox = (
252
+ wireIndex: number,
253
+ colIndex: number,
254
+ colWidth: number,
255
+ opIndex: number,
256
+ interColumn: boolean,
257
+ ): SVGElement => {
258
+ const wireY = wireData[wireIndex];
259
+ let dropzone = null;
260
+ if (interColumn) {
261
+ dropzone = box(
262
+ xOffset - gatePadding * 2,
263
+ wireY - paddingY,
264
+ gatePadding * 4,
265
+ paddingY * 2,
266
+ "dropzone",
267
+ );
268
+ } else {
269
+ dropzone = box(
270
+ xOffset + gatePadding,
271
+ wireY - paddingY,
272
+ colWidth,
273
+ paddingY * 2,
274
+ "dropzone",
275
+ );
276
+ }
277
+ dropzone.setAttribute("data-dropzone-location", `${colIndex},${opIndex}`);
278
+ dropzone.setAttribute("data-dropzone-wire", `${wireIndex}`);
279
+ dropzone.setAttribute("data-dropzone-inter-column", `${interColumn}`);
280
+ return dropzone;
281
+ };
282
+
283
+ // Create dropzones for each intersection of columns and wires
284
+ sortedColWidths.forEach(([colIndex, colWidth]) => {
285
+ const columnOps = operationGrid[colIndex];
286
+ let wireIndex = 0;
287
+
288
+ columnOps.components.forEach((op, opIndex) => {
289
+ const [minTarget, maxTarget] = getMinMaxRegIdx(op, wireData.length);
290
+ // Add dropzones before the first target
291
+ while (wireIndex <= maxTarget) {
292
+ dropzoneLayer.appendChild(
293
+ _makeDropzoneBox(wireIndex, colIndex, colWidth, opIndex, true),
294
+ );
295
+ // We don't want to make a central zone if the spot is occupied by a gate or its connecting lines
296
+ if (wireIndex < minTarget) {
297
+ dropzoneLayer.appendChild(
298
+ _makeDropzoneBox(wireIndex, colIndex, colWidth, opIndex, false),
299
+ );
300
+ }
301
+
302
+ wireIndex++;
303
+ }
304
+ });
305
+
306
+ // Add dropzones after the last target
307
+ while (wireIndex < wireData.length) {
308
+ dropzoneLayer.appendChild(
309
+ _makeDropzoneBox(
310
+ wireIndex,
311
+ colIndex,
312
+ colWidth,
313
+ columnOps.components.length,
314
+ true,
315
+ ),
316
+ );
317
+ dropzoneLayer.appendChild(
318
+ _makeDropzoneBox(
319
+ wireIndex,
320
+ colIndex,
321
+ colWidth,
322
+ columnOps.components.length,
323
+ false,
324
+ ),
325
+ );
326
+
327
+ wireIndex++;
328
+ }
329
+ xOffset += colWidth + gatePadding * 2;
330
+ });
331
+
332
+ // This assumes column indexes are continuous
333
+ const endColIndex = sortedColWidths.length;
334
+
335
+ // Add remaining dropzones to allow users to add gates to the end of the circuit
336
+ for (let wireIndex = 0; wireIndex < wireData.length; wireIndex++) {
337
+ const dropzone = _makeDropzoneBox(wireIndex, endColIndex, 0, 0, true);
338
+ // Note: the last column should have the shape of an inter-column dropzone, but
339
+ // we don't want to attach the inter-column logic to it.
340
+ dropzone.setAttribute("data-dropzone-inter-column", "false");
341
+ dropzoneLayer.appendChild(dropzone);
342
+ }
343
+
344
+ return dropzoneLayer;
345
+ };
346
+
347
+ export {
348
+ createDragzones,
349
+ createGhostElement,
350
+ createWireDropzone,
351
+ removeAllWireDropzones,
352
+ };