qsharp-lang 1.25.4-dev → 1.25.5-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 (337) 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 +1 -1
  317. package/lib/nodejs/qsc_wasm_bg.wasm +0 -0
  318. package/lib/web/qsc_wasm.js +1 -1
  319. package/lib/web/qsc_wasm_bg.wasm +0 -0
  320. package/package.json +2 -1
  321. package/ux/circuit-vis/angleExpression.ts +133 -0
  322. package/ux/circuit-vis/contextMenu.ts +8 -73
  323. package/ux/circuit-vis/events.ts +41 -1
  324. package/ux/circuit-vis/formatters/inputFormatter.ts +14 -6
  325. package/ux/circuit-vis/index.ts +12 -4
  326. package/ux/circuit-vis/panel.ts +65 -28
  327. package/ux/circuit-vis/sqore.ts +30 -16
  328. package/ux/circuit-vis/state-viz/stateViz.ts +763 -0
  329. package/ux/circuit-vis/state-viz/stateVizController.ts +285 -0
  330. package/ux/circuit-vis/state-viz/worker/index.ts +18 -0
  331. package/ux/circuit-vis/state-viz/worker/stateCompute.ts +260 -0
  332. package/ux/circuit-vis/state-viz/worker/stateVizPrep.ts +152 -0
  333. package/ux/circuit.tsx +15 -26
  334. package/ux/data.ts +5 -3
  335. package/ux/index.ts +2 -0
  336. package/ux/qdk-theme.css +15 -0
  337. package/ux/qsharp-circuit.css +311 -1
@@ -0,0 +1,152 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT license.
3
+
4
+ // State visualization “prep” utilities.
5
+ // Converts raw amplitude maps into a small set of render-ready columns
6
+ // (normalization, thresholding, capping, and aggregating an "Others" bucket).
7
+ // Kept DOM-free so it can run on the main thread or inside a Web Worker.
8
+
9
+ import type {
10
+ StateColumn,
11
+ AmpComplex,
12
+ AmpPolar,
13
+ AmpLike,
14
+ AmpMap,
15
+ } from "../stateViz.js";
16
+
17
+ export type PrepareStateVizOptions = {
18
+ // normalize probabilities to unit mass (default true)
19
+ normalize?: boolean;
20
+ // Minimum probability (0..1) for a state to be shown as its own column.
21
+ // States below this threshold will be aggregated into Others bucket.
22
+ // Default: 0
23
+ minProbThreshold?: number;
24
+ // Maximum number of columns to render, including Others if present.
25
+ // Default: 16
26
+ maxColumns?: number;
27
+ };
28
+
29
+ const DEFAULT_MAX_COLUMNS = 16;
30
+ const MIN_PROB_EPSILON = 1e-12;
31
+
32
+ // Convert amplitude to polar `{ prob, phase }`.
33
+ const toPolar = (a: AmpLike): { prob: number; phase: number } => {
34
+ const maybe = a as Partial<AmpComplex & AmpPolar>;
35
+ const hasPolar =
36
+ typeof maybe.prob === "number" || typeof maybe.phase === "number";
37
+ if (hasPolar) {
38
+ const prob = typeof maybe.prob === "number" ? maybe.prob : 0;
39
+ const phase = typeof maybe.phase === "number" ? maybe.phase : 0;
40
+ return { prob, phase };
41
+ }
42
+ const re = typeof maybe.re === "number" ? maybe.re : 0;
43
+ const im = typeof maybe.im === "number" ? maybe.im : 0;
44
+ return { prob: re * re + im * im, phase: Math.atan2(im, re) };
45
+ };
46
+
47
+ function normalizeColumns(columns: StateColumn[]): StateColumn[] {
48
+ const sum = columns.reduce((acc, c) => acc + (c.prob ?? 0), 0);
49
+ if (sum <= 0) return columns;
50
+ return columns.map((c) => ({ ...c, prob: (c.prob ?? 0) / sum }));
51
+ }
52
+
53
+ function splitByThreshold(
54
+ columns: StateColumn[],
55
+ minProb: number,
56
+ ): { significant: StateColumn[]; small: StateColumn[] } {
57
+ const minThresh = Math.max(0, Math.min(1, minProb));
58
+ const significant: StateColumn[] = [];
59
+ const small: StateColumn[] = [];
60
+ for (const c of columns) {
61
+ if ((c.prob ?? 0) >= minThresh) significant.push(c);
62
+ else small.push(c);
63
+ }
64
+ return { significant, small };
65
+ }
66
+
67
+ function capAndAggregateColumns(
68
+ significant: StateColumn[],
69
+ small: StateColumn[],
70
+ maxColumns: number,
71
+ ): StateColumn[] {
72
+ const needsOthers = small.length > 0 || significant.length > maxColumns;
73
+ const capacity = needsOthers
74
+ ? Math.max(0, maxColumns - 1)
75
+ : Math.max(1, maxColumns);
76
+
77
+ const topColumns = significant.slice(0, capacity);
78
+ const dropped = significant.slice(capacity);
79
+ const othersList = [...small, ...dropped];
80
+
81
+ const columns = [...topColumns];
82
+ if (othersList.length > 0) {
83
+ const othersProb = othersList.reduce((s, r) => s + (r.prob ?? 0), 0);
84
+ const othersCount = othersList.length;
85
+ columns.push({
86
+ label: "__OTHERS__",
87
+ prob: othersProb,
88
+ phase: 0,
89
+ isOthers: true,
90
+ othersCount,
91
+ });
92
+ }
93
+ return columns;
94
+ }
95
+
96
+ function sortColumnsByLabel(columns: StateColumn[]): StateColumn[] {
97
+ const numericRegex = /^[+-]?\d+(?:\.\d+)?$/;
98
+ const asNumber = (s: string) => (numericRegex.test(s) ? parseFloat(s) : NaN);
99
+ const isNumeric = (s: string) => numericRegex.test(s);
100
+ const labelCmp = (a: string, b: string) => a.localeCompare(b);
101
+ const labelOrderCmp = (a: StateColumn, b: StateColumn) => {
102
+ if (a.isOthers === true) return 1;
103
+ if (b.isOthers === true) return -1;
104
+ const an = isNumeric(a.label);
105
+ const bn = isNumeric(b.label);
106
+ if (an && bn) {
107
+ const av = asNumber(a.label);
108
+ const bv = asNumber(b.label);
109
+ return av - bv;
110
+ }
111
+ if (an !== bn) return an ? -1 : 1;
112
+ return labelCmp(a.label, b.label);
113
+ };
114
+ return columns.slice().sort(labelOrderCmp);
115
+ }
116
+
117
+ export function prepareStateVizColumnsFromAmpMap(
118
+ ampMap: AmpMap,
119
+ opts: PrepareStateVizOptions = {},
120
+ ): StateColumn[] {
121
+ const entries = Object.entries(ampMap ?? {});
122
+ if (entries.length === 0) return [];
123
+
124
+ const raw = entries.map(([label, a]) => {
125
+ const { prob, phase } = toPolar(a);
126
+ return {
127
+ label,
128
+ prob: prob < MIN_PROB_EPSILON ? 0 : prob,
129
+ phase,
130
+ } as StateColumn;
131
+ });
132
+
133
+ // Normalize probabilities
134
+ const doNormalize = opts.normalize ?? true;
135
+ const normalized = doNormalize ? normalizeColumns(raw) : raw;
136
+
137
+ // Split columns based on threshold value
138
+ const { significant, small } =
139
+ typeof opts.minProbThreshold === "number"
140
+ ? splitByThreshold(normalized, opts.minProbThreshold)
141
+ : { significant: normalized, small: [] };
142
+
143
+ // Sort by probability and cap to max column numbers, aggregating rest into "Others"
144
+ significant.sort((a, b) => (b.prob ?? 0) - (a.prob ?? 0));
145
+ const maxColumns =
146
+ typeof opts.maxColumns === "number" && isFinite(opts.maxColumns)
147
+ ? Math.max(1, Math.floor(opts.maxColumns))
148
+ : DEFAULT_MAX_COLUMNS;
149
+ const capped = capAndAggregateColumns(significant, small, maxColumns);
150
+ // Sort by top columns by label, with "Others" last
151
+ return sortColumnsByLabel(capped);
152
+ }
package/ux/circuit.tsx CHANGED
@@ -20,11 +20,10 @@ const MAX_CIRCUITS = 1;
20
20
  // This component is shared by the Python widget and the VS Code panel
21
21
  export function Circuit(props: {
22
22
  circuit?: qviz.CircuitGroup | qviz.Circuit;
23
- isEditable: boolean;
24
- editCallback?: (fileData: qviz.CircuitGroup) => void;
25
- runCallback?: () => void;
26
23
  renderLocations?: (s: SourceLocation[]) => { title: string; href: string };
24
+ editor?: qviz.EditorHandlers;
27
25
  }) {
26
+ const isEditable = props.editor != null;
28
27
  let unrenderable = false;
29
28
  let qubits = 0;
30
29
  let operations = 0;
@@ -41,7 +40,7 @@ export function Circuit(props: {
41
40
  unrenderable =
42
41
  unrenderable ||
43
42
  result.circuitGroup.circuits.length > MAX_CIRCUITS ||
44
- (!props.isEditable && qubits === 0) ||
43
+ (!isEditable && qubits === 0) ||
45
44
  operations > MAX_OPERATIONS ||
46
45
  qubits > MAX_QUBITS;
47
46
  } else {
@@ -65,16 +64,16 @@ export function Circuit(props: {
65
64
 
66
65
  function ZoomableCircuit(props: {
67
66
  circuitGroup: qviz.CircuitGroup;
68
- isEditable: boolean;
69
- editCallback?: (fileData: qviz.CircuitGroup) => void;
70
- runCallback?: () => void;
71
67
  renderLocations?: (s: SourceLocation[]) => { title: string; href: string };
68
+ editor?: qviz.EditorHandlers;
72
69
  }) {
73
70
  const circuitDiv = useRef<HTMLDivElement>(null);
74
71
  const [zoomLevel, setZoomLevel] = useState(100);
75
72
  const [rendering, setRendering] = useState(true);
76
73
  const [zoomOnResize, setZoomOnResize] = useState(true);
77
74
 
75
+ const isEditable = props.editor != null;
76
+
78
77
  useEffect(() => {
79
78
  // Enable "rendering" text while the circuit is being drawn
80
79
  setRendering(true);
@@ -89,13 +88,11 @@ function ZoomableCircuit(props: {
89
88
  const svg = renderCircuits(
90
89
  props.circuitGroup,
91
90
  container,
92
- props.isEditable,
93
91
  props.renderLocations,
94
- props.editCallback,
95
- props.runCallback,
92
+ props.editor,
96
93
  );
97
94
 
98
- if (!props.isEditable) {
95
+ if (!isEditable) {
99
96
  const initialZoom = calculateZoomToFit(container, svg as SVGElement);
100
97
  // Set the initial zoom level
101
98
  setZoomLevel(initialZoom);
@@ -106,7 +103,7 @@ function ZoomableCircuit(props: {
106
103
  // Calculate the initial zoom level based on the container width
107
104
  // Disable "rendering" text
108
105
  setRendering(false);
109
- } else if (!props.isEditable) {
106
+ } else if (!isEditable) {
110
107
  // Initial drawing done, attach window resize handler
111
108
  window.addEventListener("resize", onResize);
112
109
  return () => {
@@ -122,7 +119,7 @@ function ZoomableCircuit(props: {
122
119
  return (
123
120
  <div>
124
121
  <div>
125
- {props.isEditable || rendering ? null : (
122
+ {isEditable || rendering ? null : (
126
123
  <ZoomControl zoom={zoomLevel} onInput={userSetZoomLevel} />
127
124
  )}
128
125
  </div>
@@ -176,17 +173,10 @@ function ZoomableCircuit(props: {
176
173
  function renderCircuits(
177
174
  circuitGroup: qviz.CircuitGroup,
178
175
  container: HTMLDivElement,
179
- isEditable: boolean,
180
176
  renderLocations?: (s: SourceLocation[]) => { title: string; href: string },
181
- editCallback?: (fileData: qviz.CircuitGroup) => void,
182
- runCallback?: () => void,
177
+ editor?: qviz.EditorHandlers,
183
178
  ) {
184
- qviz.draw(circuitGroup, container, {
185
- isEditable,
186
- editCallback,
187
- runCallback,
188
- renderLocations,
189
- });
179
+ qviz.draw(circuitGroup, container, { renderLocations, editor });
190
180
  return container.getElementsByClassName("qviz")[0]!;
191
181
  }
192
182
 
@@ -283,6 +273,7 @@ function ZoomControl(props: { zoom: number; onInput: (zoom: number) => void }) {
283
273
 
284
274
  // This component is exclusive to the VS Code panel
285
275
  export function CircuitPanel(props: CircuitProps) {
276
+ const isEditable = props.editor != null;
286
277
  const error = props.errorHtml ? (
287
278
  <div>
288
279
  <p>
@@ -312,7 +303,7 @@ export function CircuitPanel(props: CircuitProps) {
312
303
  )}
313
304
  <p>
314
305
  Learn more at{" "}
315
- {props.isEditable ? (
306
+ {isEditable ? (
316
307
  <a href="https://aka.ms/qdk.circuit-editor">
317
308
  https://aka.ms/qdk.circuit-editor
318
309
  </a>
@@ -328,10 +319,8 @@ export function CircuitPanel(props: CircuitProps) {
328
319
  {props.circuit ? (
329
320
  <Circuit
330
321
  circuit={props.circuit}
331
- isEditable={props.isEditable}
332
- editCallback={props.editCallback}
333
- runCallback={props.runCallback}
334
322
  renderLocations={renderLocations}
323
+ editor={props.editor}
335
324
  ></Circuit>
336
325
  ) : null}
337
326
  </div>
package/ux/data.ts CHANGED
@@ -73,9 +73,11 @@ export type CircuitProps = {
73
73
  simulated: boolean;
74
74
  /** Circuit is still being generated */
75
75
  calculating: boolean;
76
- isEditable: boolean;
77
- editCallback?: (fileData: CircuitGroup) => void;
78
- runCallback?: () => void;
76
+ // Editor-specific handlers (callbacks, state-viz host offload, etc.).
77
+ // When omitted, the circuit is rendered read-only.
78
+ editor?: EditorHandlers;
79
79
  };
80
80
 
81
+ export type EditorHandlers = import("./circuit-vis/index.js").EditorHandlers;
81
82
  export type CircuitGroup = import("./circuit-vis/circuit.js").CircuitGroup;
83
+ export type CircuitModel = import("./circuit-vis/circuit.js").Circuit;
package/ux/index.ts CHANGED
@@ -9,6 +9,8 @@ import "./qsharp-circuit.css";
9
9
  export {
10
10
  CreateSingleEstimateResult,
11
11
  type ReData,
12
+ type EditorHandlers,
13
+ type CircuitModel,
12
14
  type CircuitGroup,
13
15
  type CircuitProps,
14
16
  } from "./data.js";
package/ux/qdk-theme.css CHANGED
@@ -102,6 +102,12 @@ body[data-vscode-theme-kind="vscode-high-contrast-light"] {
102
102
  --qdk-menu-fill-hover: #9cf;
103
103
  --qdk-menu-fill-selected: #7af;
104
104
 
105
+ /* Use for focus outlines in interactive widgets */
106
+ --qdk-focus-border: var(--vscode-focusBorder, var(--qdk-atom-fill));
107
+
108
+ /* Use for subdued explanatory text */
109
+ --qdk-description-foreground: var(--vscode-descriptionForeground, #666);
110
+
105
111
  /* Used for shapes in charts, etc. that may have overlapping text (which should contrast) */
106
112
  --qdk-shape-fill: #8ab8ff;
107
113
  --qdk-shape-fill-selected: #b5c5f2;
@@ -144,6 +150,15 @@ body[data-vscode-theme-kind="vscode-high-contrast"] {
144
150
  --qdk-menu-fill-hover: #468;
145
151
  --qdk-menu-fill-selected: #47a;
146
152
 
153
+ /* Use for focus outlines in interactive widgets */
154
+ --qdk-focus-border: var(--vscode-focusBorder, var(--qdk-atom-fill));
155
+
156
+ /* Use for subdued explanatory text */
157
+ --qdk-description-foreground: var(
158
+ --vscode-descriptionForeground,
159
+ var(--qdk-foreground-muted)
160
+ );
161
+
147
162
  /* Used for shapes in charts, etc. that may have overlapping text (which should contrast) */
148
163
  --qdk-shape-fill: #4aa3ff;
149
164
  --qdk-shape-fill-selected: #ffd54f;
@@ -306,6 +306,9 @@
306
306
  .panel {
307
307
  display: flex;
308
308
  flex-direction: row;
309
+ height: 100%;
310
+ align-items: stretch;
311
+ min-height: 0; /* allow flex children to scroll */
309
312
  }
310
313
 
311
314
  .container {
@@ -337,6 +340,10 @@
337
340
  width: 100px;
338
341
  min-height: var(--minToolboxHeight);
339
342
  border-right: medium solid var(--vscode-editorWidget-border, #000000);
343
+ height: 100%;
344
+ min-height: 0; /* enable internal scroll in flex container */
345
+ overflow-y: auto;
346
+ overflow-x: hidden;
340
347
  }
341
348
 
342
349
  .toolbox-panel .title {
@@ -346,7 +353,7 @@
346
353
  .toolbox-panel-svg {
347
354
  width: -webkit-fill-available;
348
355
  min-height: var(--minToolboxHeight);
349
- height: 100%;
356
+ height: auto; /* let SVG expand to content height */
350
357
  }
351
358
 
352
359
  .ghost {
@@ -494,3 +501,306 @@
494
501
  line-height: 40px;
495
502
  font-size: 16px;
496
503
  }
504
+
505
+ /* State visualizer panel */
506
+ .state-panel {
507
+ flex: 0 0 0px;
508
+ border-left: none; /* replaced by clickable edge */
509
+ display: flex;
510
+ flex-direction: column;
511
+ background: var(--qdk-host-background, #ffffff);
512
+ pointer-events: auto;
513
+ height: 100%;
514
+ min-height: 0; /* allow scroll in short windows */
515
+ overflow-y: auto;
516
+ overflow-x: hidden;
517
+ position: relative; /* anchor toggle button */
518
+ transition:
519
+ flex-basis var(--stateAnimMs, 200ms) ease,
520
+ width var(--stateAnimMs, 200ms) ease,
521
+ padding-left var(--stateAnimMs, 200ms) ease;
522
+ padding-left: 36px; /* reserve space for the clickable edge */
523
+ }
524
+
525
+ .state-panel:not(.collapsed) {
526
+ flex-basis: 226px; /* 190px content + 36px edge */
527
+ }
528
+
529
+ .state-panel .state-svg {
530
+ flex: 0 0 auto; /* size to content */
531
+ width: 100%;
532
+ height: auto; /* allow panel to scroll when content is taller */
533
+ transition: opacity var(--stateAnimMs, 200ms) ease;
534
+ }
535
+
536
+ /* Loading overlay for async state compute */
537
+ .state-loading-overlay {
538
+ position: absolute;
539
+ top: 0;
540
+ left: 36px; /* keep the clickable edge visible */
541
+ right: 0;
542
+ bottom: 0;
543
+ display: none;
544
+ align-items: center;
545
+ justify-content: center;
546
+ pointer-events: none;
547
+ z-index: 10;
548
+ background: color-mix(
549
+ in srgb,
550
+ var(--qdk-host-background, #ffffff) 70%,
551
+ transparent
552
+ );
553
+ backdrop-filter: blur(0.5px);
554
+ }
555
+
556
+ .state-panel.loading:not(.collapsed):not(.message) .state-loading-overlay {
557
+ display: flex;
558
+ }
559
+
560
+ .state-loading-spinner {
561
+ width: 22px;
562
+ height: 22px;
563
+ border-radius: 999px;
564
+ border: 3px solid var(--qdk-host-foreground, #666);
565
+ border-right-color: transparent;
566
+ opacity: 0.8;
567
+ animation: stateLoadingSpin 0.85s linear infinite;
568
+ }
569
+
570
+ @keyframes stateLoadingSpin {
571
+ from {
572
+ transform: rotate(0deg);
573
+ }
574
+ to {
575
+ transform: rotate(360deg);
576
+ }
577
+ }
578
+
579
+ /* Developer toolbar above the visualizer */
580
+ .dev-toolbar {
581
+ display: flex;
582
+ align-items: center;
583
+ gap: 6px;
584
+ flex-wrap: wrap;
585
+ row-gap: 4px;
586
+ width: 100%;
587
+ padding: 4px 6px;
588
+ font-size: 12px;
589
+ border-bottom: 1px solid #ddd;
590
+ transition: opacity var(--stateAnimMs, 200ms) ease;
591
+ }
592
+
593
+ .dev-toolbar-sep {
594
+ opacity: 0.6;
595
+ }
596
+
597
+ .dev-toolbar input {
598
+ width: 56px;
599
+ }
600
+
601
+ /* Collapsed state: shrink panel and hide content except the toggle */
602
+ .state-panel.collapsed {
603
+ flex: 0 0 36px !important; /* match edge width */
604
+ width: 36px; /* assist transition in some browsers */
605
+ overflow: visible; /* keep toggle visible */
606
+ padding-left: 0; /* only the edge remains visible */
607
+ }
608
+
609
+ /* Fade content while collapsing instead of instantly hiding */
610
+ .state-panel.collapsed .state-svg,
611
+ .state-panel.collapsed .dev-toolbar,
612
+ .state-panel.collapsed .state-panel-message {
613
+ opacity: 0;
614
+ pointer-events: none;
615
+ }
616
+
617
+ /* Full-height clickable edge with vertical text */
618
+ .state-edge {
619
+ position: absolute;
620
+ top: 0;
621
+ left: 0;
622
+ bottom: 0;
623
+ width: 36px;
624
+ background: var(--qdk-background-accent, #e6e6e6);
625
+ border-right: 1px solid var(--qdk-widget-outline, #c8c8c8);
626
+ box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.06);
627
+ cursor: pointer;
628
+ display: flex;
629
+ align-items: center;
630
+ justify-content: center;
631
+ z-index: 20;
632
+ pointer-events: auto;
633
+ }
634
+
635
+ .state-edge:focus {
636
+ outline: 2px solid var(--qdk-focus-border);
637
+ outline-offset: -2px;
638
+ }
639
+
640
+ .state-edge-text {
641
+ writing-mode: vertical-rl;
642
+ text-orientation: mixed;
643
+ font-size: 16px;
644
+ font-weight: 600;
645
+ color: var(--qdk-host-foreground, #333);
646
+ letter-spacing: 0.65px;
647
+ user-select: none;
648
+ }
649
+
650
+ /* Edge icons (top and bottom triangles) */
651
+ .state-edge .edge-icon {
652
+ position: absolute;
653
+ width: 18px;
654
+ height: 18px;
655
+ right: 8px;
656
+ pointer-events: none; /* clicks go to the edge */
657
+ transform-origin: 50% 50%;
658
+ }
659
+
660
+ .state-edge .edge-icon-top {
661
+ top: 8px;
662
+ }
663
+ .state-edge .edge-icon-bottom {
664
+ bottom: 8px;
665
+ }
666
+
667
+ .state-edge .edge-icon svg {
668
+ width: 100%;
669
+ height: 100%;
670
+ display: block;
671
+ }
672
+ .state-edge .edge-icon path {
673
+ fill: var(--qdk-host-foreground, #555);
674
+ stroke: none; /* sharp corners, no outline */
675
+ }
676
+
677
+ /* When collapsed, flip icons to point left */
678
+ .state-panel.collapsed .state-edge .edge-icon {
679
+ transform: rotate(180deg);
680
+ }
681
+
682
+ /* Empty state: hide SVG and toolbar */
683
+ .state-panel.message .state-svg,
684
+ .state-panel.message .dev-toolbar {
685
+ height: auto;
686
+ display: none;
687
+ }
688
+
689
+ .state-svg .state-header {
690
+ font-size: 17px;
691
+ font-weight: 600;
692
+ text-anchor: start; /* override circuit default */
693
+ dominant-baseline: hanging;
694
+ pointer-events: none;
695
+ }
696
+
697
+ .state-svg .state-separator {
698
+ stroke: #ddd;
699
+ stroke-width: 1px;
700
+ }
701
+
702
+ .state-svg .state-bar {
703
+ opacity: 0.9;
704
+ transition:
705
+ fill var(--stateAnimMs, 200ms) ease,
706
+ opacity var(--stateAnimMs, 200ms) ease;
707
+ }
708
+
709
+ .state-svg .state-bar-label {
710
+ font-size: 14px;
711
+ text-anchor: middle;
712
+ dominant-baseline: hanging;
713
+ pointer-events: none;
714
+ }
715
+
716
+ .state-svg .state-phase-circle {
717
+ fill: none;
718
+ stroke: #666;
719
+ stroke-width: 1px;
720
+ }
721
+
722
+ .state-svg .state-phase-text {
723
+ text-anchor: middle;
724
+ dominant-baseline: hanging; /* align like percentage labels */
725
+ font-size: 14px; /* match percentage label size */
726
+ pointer-events: none;
727
+ }
728
+
729
+ .state-svg .state-phase-dot {
730
+ stroke: #333;
731
+ stroke-width: 0.5px;
732
+ transition:
733
+ fill var(--stateAnimMs, 200ms) ease,
734
+ opacity var(--stateAnimMs, 200ms) ease;
735
+ }
736
+
737
+ .state-svg .state-phase-wedge {
738
+ stroke: none;
739
+ fill-opacity: 0.75;
740
+ transition:
741
+ fill var(--stateAnimMs, 200ms) ease,
742
+ opacity var(--stateAnimMs, 200ms) ease;
743
+ }
744
+
745
+ .state-svg .state-bitstring {
746
+ font-size: 14px;
747
+ text-anchor: middle;
748
+ dominant-baseline: hanging;
749
+ pointer-events: none;
750
+ }
751
+
752
+ /* Vertical orientation for long state labels to avoid collisions */
753
+
754
+ /* HTML-based vertical labels inside foreignObject */
755
+ .state-svg .state-bitstring-fo {
756
+ writing-mode: vertical-rl;
757
+ text-orientation: mixed;
758
+ font-size: 14px;
759
+ line-height: 1;
760
+ text-align: center;
761
+ width: -moz-fit-content;
762
+ width: fit-content; /* shrink to content so we can center via margins */
763
+ margin-left: auto;
764
+ margin-right: auto; /* center within the column width */
765
+ color: var(--qdk-host-foreground, #000);
766
+ pointer-events: none;
767
+ }
768
+
769
+ /* Centered empty-state message in the panel */
770
+ .state-panel-message {
771
+ position: absolute;
772
+ top: 50%;
773
+ left: 50%;
774
+ transform: translate(-50%, -50%);
775
+ padding: 8px;
776
+ text-align: center;
777
+ font-size: 13px;
778
+ color: var(--qdk-description-foreground);
779
+ z-index: 20;
780
+ pointer-events: none;
781
+ transition: opacity var(--stateAnimMs, 200ms) ease;
782
+ }
783
+
784
+ /* Circuit container/wrapper layout extracted from inline styles */
785
+ .circuit-editor-container {
786
+ display: flex;
787
+ height: 80vh;
788
+ width: 95vw;
789
+ align-items: stretch;
790
+ }
791
+
792
+ .circuit-wrapper {
793
+ display: block;
794
+ overflow: auto;
795
+ width: 100%;
796
+ flex: 1 1 auto;
797
+ min-width: 0;
798
+ }
799
+
800
+ /* Empty circuit message extracted from inline styles */
801
+ .empty-circuit-message {
802
+ padding: 2em;
803
+ text-align: center;
804
+ color: var(--qdk-description-foreground);
805
+ font-size: 1.1em;
806
+ }