qsharp-lang 1.25.2-dev → 1.25.3-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 (326) hide show
  1. package/docs/Microsoft.Quantum.Core/IsRangeEmpty.md +1 -1
  2. package/docs/Microsoft.Quantum.Core/Length.md +1 -1
  3. package/docs/Microsoft.Quantum.Core/RangeEnd.md +1 -1
  4. package/docs/Microsoft.Quantum.Core/RangeStart.md +1 -1
  5. package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
  6. package/docs/Microsoft.Quantum.Core/index.md +1 -1
  7. package/docs/Std.Arithmetic/AddLE.md +1 -1
  8. package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
  9. package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
  10. package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
  11. package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
  12. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
  13. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
  14. package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
  15. package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
  16. package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
  17. package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
  18. package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
  19. package/docs/Std.Arithmetic/IncByI.md +1 -1
  20. package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
  21. package/docs/Std.Arithmetic/IncByL.md +1 -1
  22. package/docs/Std.Arithmetic/IncByLE.md +1 -1
  23. package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
  24. package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
  25. package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
  26. package/docs/Std.Arithmetic/MAJ.md +1 -1
  27. package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
  28. package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
  29. package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
  30. package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
  31. package/docs/Std.Arithmetic/index.md +1 -1
  32. package/docs/Std.Arrays/All.md +1 -1
  33. package/docs/Std.Arrays/Any.md +1 -1
  34. package/docs/Std.Arrays/Chunks.md +1 -1
  35. package/docs/Std.Arrays/CircularlyShifted.md +1 -1
  36. package/docs/Std.Arrays/ColumnAt.md +1 -1
  37. package/docs/Std.Arrays/Count.md +1 -1
  38. package/docs/Std.Arrays/Diagonal.md +1 -1
  39. package/docs/Std.Arrays/DrawMany.md +1 -1
  40. package/docs/Std.Arrays/Enumerated.md +1 -1
  41. package/docs/Std.Arrays/Excluding.md +1 -1
  42. package/docs/Std.Arrays/Filtered.md +1 -1
  43. package/docs/Std.Arrays/FlatMapped.md +1 -1
  44. package/docs/Std.Arrays/Flattened.md +1 -1
  45. package/docs/Std.Arrays/Fold.md +1 -1
  46. package/docs/Std.Arrays/ForEach.md +1 -1
  47. package/docs/Std.Arrays/Head.md +1 -1
  48. package/docs/Std.Arrays/HeadAndRest.md +1 -1
  49. package/docs/Std.Arrays/IndexOf.md +1 -1
  50. package/docs/Std.Arrays/IndexRange.md +1 -1
  51. package/docs/Std.Arrays/Interleaved.md +1 -1
  52. package/docs/Std.Arrays/IsEmpty.md +1 -1
  53. package/docs/Std.Arrays/IsRectangularArray.md +1 -1
  54. package/docs/Std.Arrays/IsSorted.md +1 -1
  55. package/docs/Std.Arrays/IsSquareArray.md +1 -1
  56. package/docs/Std.Arrays/Mapped.md +1 -1
  57. package/docs/Std.Arrays/MappedByIndex.md +1 -1
  58. package/docs/Std.Arrays/MappedOverRange.md +1 -1
  59. package/docs/Std.Arrays/Most.md +1 -1
  60. package/docs/Std.Arrays/MostAndTail.md +1 -1
  61. package/docs/Std.Arrays/Padded.md +1 -1
  62. package/docs/Std.Arrays/Partitioned.md +1 -1
  63. package/docs/Std.Arrays/Rest.md +1 -1
  64. package/docs/Std.Arrays/Reversed.md +1 -1
  65. package/docs/Std.Arrays/SequenceI.md +1 -1
  66. package/docs/Std.Arrays/SequenceL.md +1 -1
  67. package/docs/Std.Arrays/Sorted.md +1 -1
  68. package/docs/Std.Arrays/Subarray.md +1 -1
  69. package/docs/Std.Arrays/Swapped.md +1 -1
  70. package/docs/Std.Arrays/Tail.md +1 -1
  71. package/docs/Std.Arrays/Transposed.md +1 -1
  72. package/docs/Std.Arrays/Unzipped.md +1 -1
  73. package/docs/Std.Arrays/Where.md +1 -1
  74. package/docs/Std.Arrays/Windows.md +1 -1
  75. package/docs/Std.Arrays/Zipped.md +1 -1
  76. package/docs/Std.Arrays/index.md +1 -1
  77. package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
  78. package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
  79. package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
  80. package/docs/Std.Canon/ApplyOperationPowerA.md +1 -1
  81. package/docs/Std.Canon/ApplyOperationPowerCA.md +1 -1
  82. package/docs/Std.Canon/ApplyP.md +1 -1
  83. package/docs/Std.Canon/ApplyPauli.md +1 -1
  84. package/docs/Std.Canon/ApplyPauliFromBitString.md +1 -1
  85. package/docs/Std.Canon/ApplyPauliFromInt.md +1 -1
  86. package/docs/Std.Canon/ApplyQFT.md +1 -1
  87. package/docs/Std.Canon/ApplyQPE.md +1 -1
  88. package/docs/Std.Canon/ApplyToEach.md +1 -1
  89. package/docs/Std.Canon/ApplyToEachA.md +1 -1
  90. package/docs/Std.Canon/ApplyToEachC.md +1 -1
  91. package/docs/Std.Canon/ApplyToEachCA.md +1 -1
  92. package/docs/Std.Canon/ApplyXorInPlace.md +1 -1
  93. package/docs/Std.Canon/ApplyXorInPlaceL.md +1 -1
  94. package/docs/Std.Canon/CX.md +1 -1
  95. package/docs/Std.Canon/CY.md +1 -1
  96. package/docs/Std.Canon/CZ.md +1 -1
  97. package/docs/Std.Canon/Fst.md +1 -1
  98. package/docs/Std.Canon/MapPauliAxis.md +1 -1
  99. package/docs/Std.Canon/Relabel.md +1 -1
  100. package/docs/Std.Canon/Snd.md +1 -1
  101. package/docs/Std.Canon/SwapReverseRegister.md +1 -1
  102. package/docs/Std.Canon/index.md +1 -1
  103. package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
  104. package/docs/Std.Convert/BigIntAsInt.md +1 -1
  105. package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
  106. package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
  107. package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
  108. package/docs/Std.Convert/BoolAsResult.md +1 -1
  109. package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
  110. package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
  111. package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
  112. package/docs/Std.Convert/IntAsBigInt.md +1 -1
  113. package/docs/Std.Convert/IntAsBoolArray.md +1 -1
  114. package/docs/Std.Convert/IntAsDouble.md +1 -1
  115. package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
  116. package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
  117. package/docs/Std.Convert/ResultAsBool.md +1 -1
  118. package/docs/Std.Convert/index.md +1 -1
  119. package/docs/Std.Core/Complex.md +1 -1
  120. package/docs/Std.Core/Length.md +1 -1
  121. package/docs/Std.Core/Repeated.md +1 -1
  122. package/docs/Std.Core/index.md +1 -1
  123. package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
  124. package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
  125. package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
  126. package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
  127. package/docs/Std.Diagnostics/CheckZero.md +1 -1
  128. package/docs/Std.Diagnostics/ConfigurePauliNoise.md +1 -1
  129. package/docs/Std.Diagnostics/ConfigureQubitLoss.md +1 -1
  130. package/docs/Std.Diagnostics/DepolarizingNoise.md +1 -1
  131. package/docs/Std.Diagnostics/DumpMachine.md +1 -1
  132. package/docs/Std.Diagnostics/DumpOperation.md +1 -1
  133. package/docs/Std.Diagnostics/DumpRegister.md +1 -1
  134. package/docs/Std.Diagnostics/Fact.md +1 -1
  135. package/docs/Std.Diagnostics/NoNoise.md +1 -1
  136. package/docs/Std.Diagnostics/PhaseFlipNoise.md +1 -1
  137. package/docs/Std.Diagnostics/StartCountingFunction.md +1 -1
  138. package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
  139. package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
  140. package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
  141. package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
  142. package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
  143. package/docs/Std.Diagnostics/index.md +1 -1
  144. package/docs/Std.Intrinsic/AND.md +1 -1
  145. package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
  146. package/docs/Std.Intrinsic/CCNOT.md +1 -1
  147. package/docs/Std.Intrinsic/CNOT.md +1 -1
  148. package/docs/Std.Intrinsic/Exp.md +1 -1
  149. package/docs/Std.Intrinsic/H.md +1 -1
  150. package/docs/Std.Intrinsic/I.md +1 -1
  151. package/docs/Std.Intrinsic/M.md +1 -1
  152. package/docs/Std.Intrinsic/Measure.md +1 -1
  153. package/docs/Std.Intrinsic/Message.md +1 -1
  154. package/docs/Std.Intrinsic/R.md +1 -1
  155. package/docs/Std.Intrinsic/R1.md +1 -1
  156. package/docs/Std.Intrinsic/R1Frac.md +1 -1
  157. package/docs/Std.Intrinsic/RFrac.md +1 -1
  158. package/docs/Std.Intrinsic/Reset.md +1 -1
  159. package/docs/Std.Intrinsic/ResetAll.md +1 -1
  160. package/docs/Std.Intrinsic/Rx.md +1 -1
  161. package/docs/Std.Intrinsic/Rxx.md +1 -1
  162. package/docs/Std.Intrinsic/Ry.md +1 -1
  163. package/docs/Std.Intrinsic/Ryy.md +1 -1
  164. package/docs/Std.Intrinsic/Rz.md +1 -1
  165. package/docs/Std.Intrinsic/Rzz.md +1 -1
  166. package/docs/Std.Intrinsic/S.md +1 -1
  167. package/docs/Std.Intrinsic/SWAP.md +1 -1
  168. package/docs/Std.Intrinsic/SX.md +1 -1
  169. package/docs/Std.Intrinsic/T.md +1 -1
  170. package/docs/Std.Intrinsic/X.md +1 -1
  171. package/docs/Std.Intrinsic/Y.md +1 -1
  172. package/docs/Std.Intrinsic/Z.md +1 -1
  173. package/docs/Std.Intrinsic/index.md +1 -1
  174. package/docs/Std.Logical/Xor.md +1 -1
  175. package/docs/Std.Logical/index.md +1 -1
  176. package/docs/Std.Math/AbsComplex.md +1 -1
  177. package/docs/Std.Math/AbsComplexPolar.md +1 -1
  178. package/docs/Std.Math/AbsD.md +1 -1
  179. package/docs/Std.Math/AbsI.md +1 -1
  180. package/docs/Std.Math/AbsL.md +1 -1
  181. package/docs/Std.Math/AbsSquaredComplex.md +1 -1
  182. package/docs/Std.Math/AbsSquaredComplexPolar.md +1 -1
  183. package/docs/Std.Math/ApproximateFactorial.md +1 -1
  184. package/docs/Std.Math/ArcCos.md +1 -1
  185. package/docs/Std.Math/ArcCosh.md +1 -1
  186. package/docs/Std.Math/ArcSin.md +1 -1
  187. package/docs/Std.Math/ArcSinh.md +1 -1
  188. package/docs/Std.Math/ArcTan.md +1 -1
  189. package/docs/Std.Math/ArcTan2.md +1 -1
  190. package/docs/Std.Math/ArcTanh.md +1 -1
  191. package/docs/Std.Math/ArgComplex.md +1 -1
  192. package/docs/Std.Math/ArgComplexPolar.md +1 -1
  193. package/docs/Std.Math/Binom.md +1 -1
  194. package/docs/Std.Math/BitSizeI.md +1 -1
  195. package/docs/Std.Math/BitSizeL.md +1 -1
  196. package/docs/Std.Math/Ceiling.md +1 -1
  197. package/docs/Std.Math/Complex.md +1 -1
  198. package/docs/Std.Math/ComplexPolar.md +1 -1
  199. package/docs/Std.Math/ContinuedFractionConvergentI.md +1 -1
  200. package/docs/Std.Math/ContinuedFractionConvergentL.md +1 -1
  201. package/docs/Std.Math/Cos.md +1 -1
  202. package/docs/Std.Math/Cosh.md +1 -1
  203. package/docs/Std.Math/DivRemI.md +1 -1
  204. package/docs/Std.Math/DivRemL.md +1 -1
  205. package/docs/Std.Math/DividedByC.md +1 -1
  206. package/docs/Std.Math/DividedByCP.md +1 -1
  207. package/docs/Std.Math/E.md +1 -1
  208. package/docs/Std.Math/ExpModI.md +1 -1
  209. package/docs/Std.Math/ExpModL.md +1 -1
  210. package/docs/Std.Math/ExtendedGreatestCommonDivisorI.md +1 -1
  211. package/docs/Std.Math/ExtendedGreatestCommonDivisorL.md +1 -1
  212. package/docs/Std.Math/FactorialI.md +1 -1
  213. package/docs/Std.Math/FactorialL.md +1 -1
  214. package/docs/Std.Math/Floor.md +1 -1
  215. package/docs/Std.Math/GreatestCommonDivisorI.md +1 -1
  216. package/docs/Std.Math/GreatestCommonDivisorL.md +1 -1
  217. package/docs/Std.Math/HammingWeightI.md +1 -1
  218. package/docs/Std.Math/InverseModI.md +1 -1
  219. package/docs/Std.Math/InverseModL.md +1 -1
  220. package/docs/Std.Math/IsCoprimeI.md +1 -1
  221. package/docs/Std.Math/IsCoprimeL.md +1 -1
  222. package/docs/Std.Math/IsInfinite.md +1 -1
  223. package/docs/Std.Math/IsNaN.md +1 -1
  224. package/docs/Std.Math/LargestFixedPoint.md +1 -1
  225. package/docs/Std.Math/Lg.md +1 -1
  226. package/docs/Std.Math/Log.md +1 -1
  227. package/docs/Std.Math/Log10.md +1 -1
  228. package/docs/Std.Math/LogFactorialD.md +1 -1
  229. package/docs/Std.Math/LogGammaD.md +1 -1
  230. package/docs/Std.Math/LogOf2.md +1 -1
  231. package/docs/Std.Math/Max.md +1 -1
  232. package/docs/Std.Math/MaxD.md +1 -1
  233. package/docs/Std.Math/MaxI.md +1 -1
  234. package/docs/Std.Math/MaxL.md +1 -1
  235. package/docs/Std.Math/Min.md +1 -1
  236. package/docs/Std.Math/MinD.md +1 -1
  237. package/docs/Std.Math/MinI.md +1 -1
  238. package/docs/Std.Math/MinL.md +1 -1
  239. package/docs/Std.Math/MinusC.md +1 -1
  240. package/docs/Std.Math/MinusCP.md +1 -1
  241. package/docs/Std.Math/ModulusI.md +1 -1
  242. package/docs/Std.Math/ModulusL.md +1 -1
  243. package/docs/Std.Math/NegationC.md +1 -1
  244. package/docs/Std.Math/NegationCP.md +1 -1
  245. package/docs/Std.Math/PI.md +1 -1
  246. package/docs/Std.Math/PNorm.md +1 -1
  247. package/docs/Std.Math/PNormalized.md +1 -1
  248. package/docs/Std.Math/PlusC.md +1 -1
  249. package/docs/Std.Math/PlusCP.md +1 -1
  250. package/docs/Std.Math/PowC.md +1 -1
  251. package/docs/Std.Math/PowCP.md +1 -1
  252. package/docs/Std.Math/RealMod.md +1 -1
  253. package/docs/Std.Math/Round.md +1 -1
  254. package/docs/Std.Math/RoundHalfAwayFromZero.md +1 -1
  255. package/docs/Std.Math/SignD.md +1 -1
  256. package/docs/Std.Math/SignI.md +1 -1
  257. package/docs/Std.Math/SignL.md +1 -1
  258. package/docs/Std.Math/Sin.md +1 -1
  259. package/docs/Std.Math/Sinh.md +1 -1
  260. package/docs/Std.Math/SmallestFixedPoint.md +1 -1
  261. package/docs/Std.Math/Sqrt.md +1 -1
  262. package/docs/Std.Math/SquaredNorm.md +1 -1
  263. package/docs/Std.Math/Tan.md +1 -1
  264. package/docs/Std.Math/Tanh.md +1 -1
  265. package/docs/Std.Math/TimesC.md +1 -1
  266. package/docs/Std.Math/TimesCP.md +1 -1
  267. package/docs/Std.Math/TrailingZeroCountI.md +1 -1
  268. package/docs/Std.Math/TrailingZeroCountL.md +1 -1
  269. package/docs/Std.Math/Truncate.md +1 -1
  270. package/docs/Std.Math/index.md +1 -1
  271. package/docs/Std.Measurement/IsLossResult.md +1 -1
  272. package/docs/Std.Measurement/MResetEachZ.md +1 -1
  273. package/docs/Std.Measurement/MResetX.md +1 -1
  274. package/docs/Std.Measurement/MResetY.md +1 -1
  275. package/docs/Std.Measurement/MResetZ.md +1 -1
  276. package/docs/Std.Measurement/MResetZChecked.md +1 -1
  277. package/docs/Std.Measurement/MeasureAllZ.md +1 -1
  278. package/docs/Std.Measurement/MeasureEachZ.md +1 -1
  279. package/docs/Std.Measurement/MeasureInteger.md +1 -1
  280. package/docs/Std.Measurement/index.md +1 -1
  281. package/docs/Std.Random/DrawRandomBool.md +1 -1
  282. package/docs/Std.Random/DrawRandomDouble.md +1 -1
  283. package/docs/Std.Random/DrawRandomInt.md +1 -1
  284. package/docs/Std.Random/index.md +1 -1
  285. package/docs/Std.Range/IsRangeEmpty.md +1 -1
  286. package/docs/Std.Range/RangeEnd.md +1 -1
  287. package/docs/Std.Range/RangeReverse.md +1 -1
  288. package/docs/Std.Range/RangeStart.md +1 -1
  289. package/docs/Std.Range/RangeStep.md +1 -1
  290. package/docs/Std.Range/index.md +1 -1
  291. package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
  292. package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
  293. package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
  294. package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
  295. package/docs/Std.ResourceEstimation/CczCount.md +1 -1
  296. package/docs/Std.ResourceEstimation/EnableMemoryComputeArchitecture.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/LeastFrequentlyUsed.md +1 -1
  300. package/docs/Std.ResourceEstimation/LeastRecentlyUsed.md +1 -1
  301. package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
  302. package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
  303. package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
  304. package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
  305. package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
  306. package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
  307. package/docs/Std.ResourceEstimation/TCount.md +1 -1
  308. package/docs/Std.ResourceEstimation/index.md +1 -1
  309. package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
  310. package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
  311. package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
  312. package/docs/Std.StatePreparation/index.md +1 -1
  313. package/docs/Std.TableLookup/Select.md +1 -1
  314. package/docs/Std.TableLookup/index.md +1 -1
  315. package/docs/index.md +1 -1
  316. package/lib/nodejs/qsc_wasm.cjs +2 -2
  317. package/lib/nodejs/qsc_wasm_bg.wasm +0 -0
  318. package/lib/web/qsc_wasm.js +2 -2
  319. package/lib/web/qsc_wasm_bg.wasm +0 -0
  320. package/package.json +1 -1
  321. package/ux/atoms/index.css +26 -71
  322. package/ux/atoms/layout.ts +215 -49
  323. package/ux/chem/index.tsx +10 -18
  324. package/ux/chem/style.css +2 -2
  325. package/ux/qdk-theme.css +18 -1
  326. package/ux/qsharp-ux.css +0 -174
@@ -4,17 +4,59 @@
4
4
  import { appendChildren, createSvgElements, setAttributes } from "./utils.js";
5
5
 
6
6
  // Zones will be rendered from top to bottom in array order
7
+ // Supports both old format (rows count) and new format (rowStart/rowEnd)
8
+ type ZoneDataInput = {
9
+ title: string;
10
+ kind: "register" | "interaction" | "measurement";
11
+ } & (
12
+ | { rows: number; rowStart?: never; rowEnd?: never }
13
+ | { rowStart: number; rowEnd: number; rows?: never }
14
+ );
15
+
16
+ // Normalized internal format always uses rowStart/rowEnd
7
17
  type ZoneData = {
8
18
  title: string;
9
- rows: number;
19
+ rowStart: number;
20
+ rowEnd: number;
10
21
  kind: "register" | "interaction" | "measurement";
11
22
  };
12
23
 
13
24
  export type ZoneLayout = {
14
25
  cols: number;
15
- zones: ZoneData[];
26
+ zones: ZoneDataInput[];
27
+ // The instructions may assume certain columns are missing, but we don't render that visually.
28
+ // e.g. if `skipCols: [0,9]` was provided, then a `move(0,1)` would actually move to visual column 0,
29
+ // and a `move(1,10)` would move to visual column 8.
30
+ skipCols?: number[];
16
31
  };
17
32
 
33
+ // Normalize zone data to always use rowStart/rowEnd format
34
+ function normalizeZones(zones: ZoneDataInput[]): ZoneData[] {
35
+ let nextRowStart = 0;
36
+ return zones.map((zone) => {
37
+ if ("rowStart" in zone && zone.rowStart !== undefined) {
38
+ // New format with explicit rowStart/rowEnd
39
+ return {
40
+ title: zone.title,
41
+ rowStart: zone.rowStart,
42
+ rowEnd: zone.rowEnd,
43
+ kind: zone.kind,
44
+ };
45
+ } else {
46
+ // Old format with rows count - convert to rowStart/rowEnd
47
+ const rowStart = nextRowStart;
48
+ const rowEnd = nextRowStart + zone.rows - 1;
49
+ nextRowStart = rowEnd + 1;
50
+ return {
51
+ title: zone.title,
52
+ rowStart,
53
+ rowEnd,
54
+ kind: zone.kind,
55
+ };
56
+ }
57
+ });
58
+ }
59
+
18
60
  export type TraceData = {
19
61
  metadata: any;
20
62
  qubits: Array<[number, number]>;
@@ -51,25 +93,40 @@ export function fillQubitLocations(
51
93
  layout: ZoneLayout,
52
94
  ): Array<[number, number]> {
53
95
  const qubits: Array<[number, number]> = [];
54
- let currRow = 0;
55
- layout.zones.forEach((zone) => {
56
- for (let row = 0; row < zone.rows; ++row) {
57
- if (zone.kind === "register") {
96
+ const normalizedZones = normalizeZones(layout.zones);
97
+ normalizedZones.forEach((zone) => {
98
+ if (zone.kind === "register") {
99
+ for (let row = zone.rowStart; row <= zone.rowEnd; ++row) {
58
100
  for (let col = 0; col < layout.cols; ++col) {
59
- qubits.push([currRow, col]);
101
+ qubits.push([row, col]);
60
102
  }
61
103
  }
62
- ++currRow;
63
104
  }
64
105
  });
65
106
 
66
107
  return qubits;
67
108
  }
68
109
 
69
- function parseMove(op: string): { qubit: number; to: Location } | undefined {
110
+ // Maps an instruction column to a visual column by accounting for skipped columns.
111
+ // For each column in skipCols that is less than the instruction column, we subtract 1.
112
+ function mapColumn(col: number, skipCols?: number[]): number {
113
+ if (!skipCols || skipCols.length === 0) {
114
+ return col;
115
+ }
116
+ const skippedBefore = skipCols.filter((c) => c < col).length;
117
+ return col - skippedBefore;
118
+ }
119
+
120
+ function parseMove(
121
+ op: string,
122
+ skipCols?: number[],
123
+ ): { qubit: number; to: Location } | undefined {
70
124
  const match = op.match(/move\((\d+), (\d+)\) (\d+)/);
71
125
  if (match) {
72
- const to: Location = [parseInt(match[1]), parseInt(match[2])];
126
+ const to: Location = [
127
+ parseInt(match[1]),
128
+ mapColumn(parseInt(match[2]), skipCols),
129
+ ];
73
130
  return { qubit: parseInt(match[3]), to };
74
131
  }
75
132
  return undefined;
@@ -89,12 +146,39 @@ function parseGate(
89
146
  }
90
147
  }
91
148
 
149
+ function parseZoneOp(
150
+ op: string,
151
+ layout: ZoneLayout,
152
+ ): { op: "zone_cz" | "zone_mresetz"; zoneIndex: number } | undefined {
153
+ // If we get a naked 'cz' or 'mresetz', treat it as a zone op for the first zone of the matching type
154
+ if (op === "cz") {
155
+ return {
156
+ op: "zone_cz",
157
+ zoneIndex: layout.zones.findIndex((z) => z.kind === "interaction"),
158
+ };
159
+ }
160
+ if (op === "mresetz") {
161
+ return {
162
+ op: "zone_mresetz",
163
+ zoneIndex: layout.zones.findIndex((z) => z.kind === "measurement"),
164
+ };
165
+ }
166
+ const match = op.match(/^(zone_cz|zone_mresetz)\s+(\d+)$/);
167
+ if (match) {
168
+ return {
169
+ op: match[1] as "zone_cz" | "zone_mresetz",
170
+ zoneIndex: parseInt(match[2]),
171
+ };
172
+ }
173
+ return undefined;
174
+ }
175
+
92
176
  /*
93
177
  We want to build up a cache of the qubit location at each 'n' steps so that scrubbing is fast.
94
178
  Storing for each step is too large for the number of steps we want to handle. Also, the building
95
179
  of the cache can take a long time, so we want to chunk it up to avoid blocking the UI thread.
96
180
  */
97
- function TraceToGetLayoutFn(trace: TraceData) {
181
+ function TraceToGetLayoutFn(trace: TraceData, skipCols?: number[]) {
98
182
  const STEP_SIZE = 100; // How many steps between each cache entry
99
183
 
100
184
  const cacheEntries = Math.ceil(trace.steps.length / STEP_SIZE);
@@ -116,7 +200,7 @@ function TraceToGetLayoutFn(trace: TraceData) {
116
200
  }
117
201
  // Extract the move operations in the prior step, to apply to the prior layout
118
202
  const moves = trace.steps[stepIndex - 1].ops
119
- .map(parseMove)
203
+ .map((op) => parseMove(op, skipCols))
120
204
  .filter((x) => x != undefined);
121
205
 
122
206
  // Then apply them to the layout
@@ -221,7 +305,9 @@ export class Layout {
221
305
  height: number;
222
306
  scale: number = initialScale;
223
307
  qubits: Location[];
224
- rowOffset: number[];
308
+ rowOffsetMap: Map<number, number>; // Maps absolute row numbers to visual Y offsets
309
+ normalizedZones: ZoneData[];
310
+ effectiveCols: number; // Visual column count after accounting for skipCols
225
311
  currentStep = 0;
226
312
  trackParent: SVGGElement;
227
313
  activeGates: SVGElement[] = [];
@@ -237,9 +323,15 @@ export class Layout {
237
323
  ) {
238
324
  if (!trace.qubits?.length) {
239
325
  trace.qubits = fillQubitLocations(layout);
326
+ } else if (layout.skipCols?.length) {
327
+ // Map the initial qubit column positions if skipCols is provided
328
+ trace.qubits = trace.qubits.map(([row, col]) => [
329
+ row,
330
+ mapColumn(col, layout.skipCols),
331
+ ]);
240
332
  }
241
333
  this.trace = trace;
242
- this.getStepLayout = TraceToGetLayoutFn(trace);
334
+ this.getStepLayout = TraceToGetLayoutFn(trace, layout.skipCols);
243
335
 
244
336
  this.qubits = structuredClone(trace.qubits);
245
337
 
@@ -248,11 +340,20 @@ export class Layout {
248
340
  "svg",
249
341
  );
250
342
 
251
- const totalRows = layout.zones.reduce((prev, curr) => prev + curr.rows, 0);
343
+ // Normalize zones to always use rowStart/rowEnd format
344
+ this.normalizedZones = normalizeZones(layout.zones);
345
+
346
+ // Calculate effective columns (visual count after skipping)
347
+ this.effectiveCols = layout.cols - (layout.skipCols?.length ?? 0);
348
+
349
+ const totalRows = this.normalizedZones.reduce(
350
+ (prev, curr) => prev + (curr.rowEnd - curr.rowStart + 1),
351
+ 0,
352
+ );
252
353
 
253
354
  this.height =
254
355
  totalRows * qubitSize + zoneSpacing * (layout.zones.length + 1);
255
- this.width = layout.cols * qubitSize + colPadding;
356
+ this.width = this.effectiveCols * qubitSize + colPadding;
256
357
 
257
358
  setAttributes(this.container, {
258
359
  viewBox: `-5 0 ${this.width} ${this.height}`,
@@ -261,21 +362,20 @@ export class Layout {
261
362
  });
262
363
 
263
364
  // Loop through the zones, calculating the row offsets, and rendering the zones
264
- this.rowOffset = [];
365
+ // Maps absolute row numbers to visual Y offsets
366
+ this.rowOffsetMap = new Map();
265
367
  let nextOffset = zoneSpacing;
266
- let nextRowNum = 0;
267
- layout.zones.forEach((zone, index) => {
268
- this.renderZone(index, nextOffset, nextRowNum);
269
- for (let i = 0; i < zone.rows; ++i) {
270
- this.rowOffset.push(nextOffset);
368
+ this.normalizedZones.forEach((zone, index) => {
369
+ this.renderZone(index, nextOffset);
370
+ for (let row = zone.rowStart; row <= zone.rowEnd; ++row) {
371
+ this.rowOffsetMap.set(row, nextOffset);
271
372
  nextOffset += qubitSize;
272
- ++nextRowNum;
273
373
  }
274
374
  nextOffset += zoneSpacing; // Add spacing after each zone
275
375
  });
276
376
 
277
377
  const colNumOffset = nextOffset - 8;
278
- this.renderColNums(layout.cols, colNumOffset);
378
+ this.renderColNums(this.effectiveCols, colNumOffset);
279
379
 
280
380
  // Put the track parent before the qubits, so the qubits render on top
281
381
  this.trackParent = createSvgElements("g")[0] as SVGGElement;
@@ -319,8 +419,9 @@ export class Layout {
319
419
  return this.trace.steps[step].ops;
320
420
  }
321
421
 
322
- private renderZone(zoneIndex: number, offset: number, firstRowNum = 0) {
323
- const zoneData = this.layout.zones[zoneIndex];
422
+ private renderZone(zoneIndex: number, offset: number) {
423
+ const zoneData = this.normalizedZones[zoneIndex];
424
+ const zoneRows = zoneData.rowEnd - zoneData.rowStart + 1;
324
425
  const g = createSvgElements("g")[0];
325
426
  setAttributes(g, {
326
427
  transform: `translate(0 ${offset})`,
@@ -333,32 +434,32 @@ export class Layout {
333
434
  setAttributes(rect, {
334
435
  x: "0",
335
436
  y: "0",
336
- width: `${this.layout.cols * qubitSize}`,
337
- height: `${zoneData.rows * qubitSize}`,
437
+ width: `${this.effectiveCols * qubitSize}`,
438
+ height: `${zoneRows * qubitSize}`,
338
439
  rx: `${zoneBoxCornerRadius}`,
339
440
  });
340
441
  appendChildren(g, [rect]);
341
442
 
342
443
  // Draw the lines between the rows
343
- for (let i = 1; i < zoneData.rows; i++) {
444
+ for (let i = 1; i < zoneRows; i++) {
344
445
  const path = createSvgElements("path")[0];
345
446
  setAttributes(path, {
346
- d: `M 0,${i * qubitSize} h${this.layout.cols * qubitSize}`,
447
+ d: `M 0,${i * qubitSize} h${this.effectiveCols * qubitSize}`,
347
448
  });
348
449
  appendChildren(g, [path]);
349
450
  }
350
451
  // Draw the lines between the columns
351
- for (let i = 1; i < this.layout.cols; i++) {
452
+ for (let i = 1; i < this.effectiveCols; i++) {
352
453
  const path = createSvgElements("path")[0];
353
454
  setAttributes(path, {
354
- d: `M ${i * qubitSize},0 v${zoneData.rows * qubitSize}`,
455
+ d: `M ${i * qubitSize},0 v${zoneRows * qubitSize}`,
355
456
  });
356
457
  appendChildren(g, [path]);
357
458
  }
358
459
  } else {
359
460
  // For the interaction zone draw each doublon
360
- for (let row = 0; row < zoneData.rows; ++row) {
361
- for (let i = 0; i < this.layout.cols; i += 2) {
461
+ for (let row = 0; row < zoneRows; ++row) {
462
+ for (let i = 0; i < this.effectiveCols; i += 2) {
362
463
  const rect = createSvgElements("rect")[0];
363
464
  setAttributes(rect, {
364
465
  x: `${i * qubitSize}`,
@@ -376,12 +477,12 @@ export class Layout {
376
477
  }
377
478
  }
378
479
 
379
- // Number the rows
380
- for (let i = 0; i < zoneData.rows; ++i) {
381
- const rowNum = firstRowNum + i;
480
+ // Number the rows using the absolute row numbers from rowStart to rowEnd
481
+ for (let i = 0; i < zoneRows; ++i) {
482
+ const rowNum = zoneData.rowStart + i;
382
483
  const label = createSvgElements("text")[0];
383
484
  setAttributes(label, {
384
- x: `${this.layout.cols * qubitSize + 5}`,
485
+ x: `${this.effectiveCols * qubitSize + 5}`,
385
486
  y: `${i * qubitSize + 5}`,
386
487
  class: "qs-atoms-label",
387
488
  });
@@ -435,16 +536,20 @@ export class Layout {
435
536
  setAttributes(g, {
436
537
  transform: `translate(0 ${offset})`,
437
538
  });
438
- // Number the columns
439
- for (let i = 0; i < cols; ++i) {
539
+ // Number the columns, showing original column numbers (skipping those in skipCols)
540
+ const skipCols = this.layout.skipCols ?? [];
541
+ let visualCol = 0;
542
+ for (let origCol = 0; visualCol < cols; ++origCol) {
543
+ if (skipCols.includes(origCol)) continue;
440
544
  const label = createSvgElements("text")[0];
441
545
  setAttributes(label, {
442
- x: `${i * qubitSize + 5}`,
546
+ x: `${visualCol * qubitSize + 5}`,
443
547
  y: `5`,
444
548
  class: "qs-atoms-label",
445
549
  });
446
- label.textContent = `${i}`;
550
+ label.textContent = `${origCol}`;
447
551
  appendChildren(g, [label]);
552
+ ++visualCol;
448
553
  }
449
554
  appendChildren(this.container, [g]);
450
555
  }
@@ -588,7 +693,27 @@ export class Layout {
588
693
  }
589
694
 
590
695
  getQubitRowOffset(row: number) {
591
- return this.rowOffset[row];
696
+ const offset = this.rowOffsetMap.get(row);
697
+ if (offset === undefined) {
698
+ throw `Row ${row} not found in layout`;
699
+ }
700
+ return offset;
701
+ }
702
+
703
+ // Returns array of qubit indices that are currently in the specified zone
704
+ getQubitsInZone(zoneIndex: number): number[] {
705
+ const zone = this.normalizedZones[zoneIndex];
706
+ if (!zone) {
707
+ throw `Zone ${zoneIndex} not found`;
708
+ }
709
+ const qubitsInZone: number[] = [];
710
+ for (let i = 0; i < this.qubits.length; i++) {
711
+ const [row] = this.qubits[i];
712
+ if (row >= zone.rowStart && row <= zone.rowEnd) {
713
+ qubitsInZone.push(i);
714
+ }
715
+ }
716
+ return qubitsInZone;
592
717
  }
593
718
 
594
719
  getLocationCenter(row: number, col: number): [number, number] {
@@ -645,7 +770,7 @@ export class Layout {
645
770
  const ops = this.getOpsAtStep(qubitLocationIndex);
646
771
  let trailId = 0;
647
772
  ops.forEach((op) => {
648
- const move = parseMove(op);
773
+ const move = parseMove(op, this.layout.skipCols);
649
774
  if (move) {
650
775
  // Apply the move animation
651
776
  const [oldX, oldY] = this.getQubitCenter(move.qubit);
@@ -718,11 +843,52 @@ export class Layout {
718
843
  });
719
844
  // TODO: Check if you can/should cancel when scrubbing
720
845
  } else {
721
- // Wasn't a move, so render the gate
722
- const gate = parseGate(op);
723
- if (!gate) throw `Invalid gate: ${op}`;
724
- const arg = gate.arg ? gate.arg.substring(0, 4) : undefined;
725
- this.renderGateOnQubit(gate.qubit, gate.gate.toUpperCase(), arg);
846
+ // Check if it's a zone operation
847
+ const zoneOp = parseZoneOp(op, this.layout);
848
+ if (zoneOp) {
849
+ const qubitsInZone = this.getQubitsInZone(zoneOp.zoneIndex);
850
+ if (zoneOp.op === "zone_cz") {
851
+ // For zone_cz, render CZ gates on pairs of qubits in doublons
852
+ // Group qubits by their row, then pair adjacent columns
853
+ const qubitsByRow = new Map<number, number[]>();
854
+ for (const qubitIdx of qubitsInZone) {
855
+ const [row] = this.qubits[qubitIdx];
856
+ if (!qubitsByRow.has(row)) {
857
+ qubitsByRow.set(row, []);
858
+ }
859
+ qubitsByRow.get(row)!.push(qubitIdx);
860
+ }
861
+ // For each row, find pairs in doublons (col 0-1, 2-3, 4-5, etc.)
862
+ for (const [, qubitsInRow] of qubitsByRow) {
863
+ // Sort by column
864
+ qubitsInRow.sort(
865
+ (a, b) => this.qubits[a][1] - this.qubits[b][1],
866
+ );
867
+ for (let i = 0; i < qubitsInRow.length - 1; i++) {
868
+ const q1 = qubitsInRow[i];
869
+ const q2 = qubitsInRow[i + 1];
870
+ const col1 = this.qubits[q1][1];
871
+ const col2 = this.qubits[q2][1];
872
+ // Check if they're in the same doublon (even-odd pair)
873
+ if (Math.floor(col1 / 2) === Math.floor(col2 / 2)) {
874
+ this.renderGateOnQubit(q1, "CZ");
875
+ i++; // Skip the next qubit since we've paired it
876
+ }
877
+ }
878
+ }
879
+ } else if (zoneOp.op === "zone_mresetz") {
880
+ // For zone_mresetz, render MZ gate on all qubits in the zone
881
+ for (const qubitIdx of qubitsInZone) {
882
+ this.renderGateOnQubit(qubitIdx, "MZ");
883
+ }
884
+ }
885
+ } else {
886
+ // Wasn't a move or zone op, so render the gate
887
+ const gate = parseGate(op);
888
+ if (!gate) throw `Invalid gate: ${op}`;
889
+ const arg = gate.arg ? gate.arg.substring(0, 4) : undefined;
890
+ this.renderGateOnQubit(gate.qubit, gate.gate.toUpperCase(), arg);
891
+ }
726
892
  }
727
893
  });
728
894
  }
package/ux/chem/index.tsx CHANGED
@@ -5,8 +5,7 @@ import { useRef, useEffect, useState } from "preact/hooks";
5
5
  import { createViewer, GLViewer } from "3dmol";
6
6
 
7
7
  import "./style.css";
8
-
9
- const themeAttribute = "data-vscode-theme-kind";
8
+ import { detectThemeChange } from "../themeObserver.js";
10
9
 
11
10
  export function MoleculeViewer(props: {
12
11
  moleculeData: string;
@@ -29,7 +28,7 @@ export function MoleculeViewer(props: {
29
28
  viewer.current ??
30
29
  createViewer(viewerRef.current, {
31
30
  backgroundColor: getComputedStyle(document.body).getPropertyValue(
32
- "--vscode-editor-background",
31
+ "--qdk-host-background",
33
32
  ),
34
33
  });
35
34
  try {
@@ -44,22 +43,15 @@ export function MoleculeViewer(props: {
44
43
  viewer.current.zoomTo();
45
44
  }
46
45
 
47
- // Respond to theme changes
48
- const callback = (mutations: MutationRecord[]) => {
49
- for (const mutation of mutations) {
50
- if (mutation.attributeName === themeAttribute) {
51
- const newBackgroundColor = getComputedStyle(
52
- document.body,
53
- ).getPropertyValue("--vscode-editor-background");
54
- if (viewer.current) {
55
- viewer.current.setBackgroundColor(newBackgroundColor, 1.0);
56
- viewer.current.render();
57
- }
58
- }
46
+ detectThemeChange(document.body, () => {
47
+ const newBackgroundColor = getComputedStyle(
48
+ document.body,
49
+ ).getPropertyValue("--qdk-host-background");
50
+ if (viewer.current) {
51
+ viewer.current.setBackgroundColor(newBackgroundColor, 1.0);
52
+ viewer.current.render();
59
53
  }
60
- };
61
- const observer = new MutationObserver(callback);
62
- observer.observe(document.body, { attributeFilter: [themeAttribute] });
54
+ });
63
55
  }, [props.moleculeData]);
64
56
 
65
57
  useEffect(() => {
package/ux/chem/style.css CHANGED
@@ -47,8 +47,8 @@
47
47
 
48
48
  .view-option select,
49
49
  .view-option input[type="range"] {
50
- color: var(--vscode-editor-foreground);
51
- background-color: var(--vscode-editor-background);
50
+ color: var(--qdk-host-foreground);
51
+ background-color: var(--qdk-host-background);
52
52
  }
53
53
 
54
54
  #cube-dropdown-container {
package/ux/qdk-theme.css CHANGED
@@ -68,6 +68,7 @@ body[data-jp-theme-light="true"],
68
68
  body[data-vscode-theme-kind="vscode-light"],
69
69
  body[data-vscode-theme-kind="vscode-high-contrast-light"] {
70
70
  /* Set any non-theme specific values here only */
71
+ --qdk-font-family: system-ui, "Segoe UI", "Roboto", sans-serif;
71
72
  --qdk-font-family-monospace: var(
72
73
  --vscode-editor-font-family,
73
74
  "Consolas",
@@ -88,6 +89,7 @@ body[data-vscode-theme-kind="vscode-high-contrast-light"] {
88
89
  var(--jp-widgets-color, #222)
89
90
  );
90
91
  --qdk-background-accent: #ddd;
92
+ --qdk-foreground-muted: #aaa;
91
93
 
92
94
  /* Used for text that must stand out on various backgrounds */
93
95
  --qdk-text-high-contrast: #000;
@@ -96,7 +98,7 @@ body[data-vscode-theme-kind="vscode-high-contrast-light"] {
96
98
  --qdk-widget-outline: #ccc;
97
99
 
98
100
  /* Use for menus */
99
- --qdk-menu-fill: #ccc;
101
+ --qdk-menu-fill: #c4dbeb;
100
102
  --qdk-menu-fill-hover: #9cf;
101
103
  --qdk-menu-fill-selected: #7af;
102
104
 
@@ -105,6 +107,13 @@ body[data-vscode-theme-kind="vscode-high-contrast-light"] {
105
107
  --qdk-shape-fill-selected: #b5c5f2;
106
108
  --qdk-shape-stroke-selected: #587ddd;
107
109
  --qdk-shape-stroke-hover: #6b6b6b;
110
+
111
+ --qdk-gate-generic: #66d;
112
+ --qdk-gate-pair: #eae753;
113
+ --qdk-gate-measure: #822;
114
+ --qdk-gate-reset: #282;
115
+ --qdk-atom-fill: #0078d4;
116
+ --qdk-atom-trail: #fa0;
108
117
  }
109
118
 
110
119
  /* Set these variables on the body element if attributes indicate a dark theme choice */
@@ -122,6 +131,7 @@ body[data-vscode-theme-kind="vscode-high-contrast"] {
122
131
  var(--jp-widgets-color, #eee)
123
132
  );
124
133
  --qdk-background-accent: #333;
134
+ --qdk-foreground-muted: #666;
125
135
 
126
136
  /* Used for text that must stand out on various backgrounds */
127
137
  --qdk-text-high-contrast: #fff;
@@ -139,4 +149,11 @@ body[data-vscode-theme-kind="vscode-high-contrast"] {
139
149
  --qdk-shape-fill-selected: #ffd54f;
140
150
  --qdk-shape-stroke-selected: #ffecb3;
141
151
  --qdk-shape-stroke-hover: #c5c5c5;
152
+
153
+ --qdk-gate-generic: #ccf;
154
+ --qdk-gate-pair: #b91;
155
+ --qdk-gate-measure: #e88;
156
+ --qdk-gate-reset: #8e8;
157
+ --qdk-atom-fill: #9df;
158
+ --qdk-atom-trail: #fa0;
142
159
  }