qsharp-lang 1.25.4-dev → 1.25.7-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.
- package/docs/Microsoft.Quantum.Core/IsRangeEmpty.md +1 -1
- package/docs/Microsoft.Quantum.Core/Length.md +1 -1
- package/docs/Microsoft.Quantum.Core/RangeEnd.md +1 -1
- package/docs/Microsoft.Quantum.Core/RangeStart.md +1 -1
- package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
- package/docs/Microsoft.Quantum.Core/index.md +1 -1
- package/docs/Std.Arithmetic/AddLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
- package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
- package/docs/Std.Arithmetic/IncByI.md +1 -1
- package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
- package/docs/Std.Arithmetic/IncByL.md +1 -1
- package/docs/Std.Arithmetic/IncByLE.md +1 -1
- package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
- package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
- package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
- package/docs/Std.Arithmetic/MAJ.md +1 -1
- package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
- package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
- package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
- package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
- package/docs/Std.Arithmetic/index.md +1 -1
- package/docs/Std.Arrays/All.md +1 -1
- package/docs/Std.Arrays/Any.md +1 -1
- package/docs/Std.Arrays/Chunks.md +1 -1
- package/docs/Std.Arrays/CircularlyShifted.md +1 -1
- package/docs/Std.Arrays/ColumnAt.md +1 -1
- package/docs/Std.Arrays/Count.md +1 -1
- package/docs/Std.Arrays/Diagonal.md +1 -1
- package/docs/Std.Arrays/DrawMany.md +1 -1
- package/docs/Std.Arrays/Enumerated.md +1 -1
- package/docs/Std.Arrays/Excluding.md +1 -1
- package/docs/Std.Arrays/Filtered.md +1 -1
- package/docs/Std.Arrays/FlatMapped.md +1 -1
- package/docs/Std.Arrays/Flattened.md +1 -1
- package/docs/Std.Arrays/Fold.md +1 -1
- package/docs/Std.Arrays/ForEach.md +1 -1
- package/docs/Std.Arrays/Head.md +1 -1
- package/docs/Std.Arrays/HeadAndRest.md +1 -1
- package/docs/Std.Arrays/IndexOf.md +1 -1
- package/docs/Std.Arrays/IndexRange.md +1 -1
- package/docs/Std.Arrays/Interleaved.md +1 -1
- package/docs/Std.Arrays/IsEmpty.md +1 -1
- package/docs/Std.Arrays/IsRectangularArray.md +1 -1
- package/docs/Std.Arrays/IsSorted.md +1 -1
- package/docs/Std.Arrays/IsSquareArray.md +1 -1
- package/docs/Std.Arrays/Mapped.md +1 -1
- package/docs/Std.Arrays/MappedByIndex.md +1 -1
- package/docs/Std.Arrays/MappedOverRange.md +1 -1
- package/docs/Std.Arrays/Most.md +1 -1
- package/docs/Std.Arrays/MostAndTail.md +1 -1
- package/docs/Std.Arrays/Padded.md +1 -1
- package/docs/Std.Arrays/Partitioned.md +1 -1
- package/docs/Std.Arrays/Rest.md +1 -1
- package/docs/Std.Arrays/Reversed.md +1 -1
- package/docs/Std.Arrays/SequenceI.md +1 -1
- package/docs/Std.Arrays/SequenceL.md +1 -1
- package/docs/Std.Arrays/Sorted.md +1 -1
- package/docs/Std.Arrays/Subarray.md +1 -1
- package/docs/Std.Arrays/Swapped.md +1 -1
- package/docs/Std.Arrays/Tail.md +1 -1
- package/docs/Std.Arrays/Transposed.md +1 -1
- package/docs/Std.Arrays/Unzipped.md +1 -1
- package/docs/Std.Arrays/Where.md +1 -1
- package/docs/Std.Arrays/Windows.md +1 -1
- package/docs/Std.Arrays/Zipped.md +1 -1
- package/docs/Std.Arrays/index.md +1 -1
- package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
- package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
- package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
- package/docs/Std.Canon/ApplyOperationPowerA.md +1 -1
- package/docs/Std.Canon/ApplyOperationPowerCA.md +1 -1
- package/docs/Std.Canon/ApplyP.md +1 -1
- package/docs/Std.Canon/ApplyPauli.md +1 -1
- package/docs/Std.Canon/ApplyPauliFromBitString.md +1 -1
- package/docs/Std.Canon/ApplyPauliFromInt.md +1 -1
- package/docs/Std.Canon/ApplyQFT.md +1 -1
- package/docs/Std.Canon/ApplyQPE.md +1 -1
- package/docs/Std.Canon/ApplyToEach.md +1 -1
- package/docs/Std.Canon/ApplyToEachA.md +1 -1
- package/docs/Std.Canon/ApplyToEachC.md +1 -1
- package/docs/Std.Canon/ApplyToEachCA.md +1 -1
- package/docs/Std.Canon/ApplyXorInPlace.md +1 -1
- package/docs/Std.Canon/ApplyXorInPlaceL.md +1 -1
- package/docs/Std.Canon/CX.md +1 -1
- package/docs/Std.Canon/CY.md +1 -1
- package/docs/Std.Canon/CZ.md +1 -1
- package/docs/Std.Canon/Fst.md +1 -1
- package/docs/Std.Canon/MapPauliAxis.md +1 -1
- package/docs/Std.Canon/Relabel.md +1 -1
- package/docs/Std.Canon/Snd.md +1 -1
- package/docs/Std.Canon/SwapReverseRegister.md +1 -1
- package/docs/Std.Canon/index.md +1 -1
- package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
- package/docs/Std.Convert/BigIntAsInt.md +1 -1
- package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
- package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
- package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
- package/docs/Std.Convert/BoolAsResult.md +1 -1
- package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
- package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
- package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
- package/docs/Std.Convert/IntAsBigInt.md +1 -1
- package/docs/Std.Convert/IntAsBoolArray.md +1 -1
- package/docs/Std.Convert/IntAsDouble.md +1 -1
- package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
- package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
- package/docs/Std.Convert/ResultAsBool.md +1 -1
- package/docs/Std.Convert/index.md +1 -1
- package/docs/Std.Core/Complex.md +1 -1
- package/docs/Std.Core/Length.md +1 -1
- package/docs/Std.Core/Repeated.md +1 -1
- package/docs/Std.Core/index.md +1 -1
- package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
- package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
- package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
- package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
- package/docs/Std.Diagnostics/CheckZero.md +1 -1
- package/docs/Std.Diagnostics/ConfigurePauliNoise.md +1 -1
- package/docs/Std.Diagnostics/ConfigureQubitLoss.md +1 -1
- package/docs/Std.Diagnostics/DepolarizingNoise.md +1 -1
- package/docs/Std.Diagnostics/DumpMachine.md +1 -1
- package/docs/Std.Diagnostics/DumpOperation.md +1 -1
- package/docs/Std.Diagnostics/DumpRegister.md +1 -1
- package/docs/Std.Diagnostics/Fact.md +1 -1
- package/docs/Std.Diagnostics/NoNoise.md +1 -1
- package/docs/Std.Diagnostics/PhaseFlipNoise.md +1 -1
- package/docs/Std.Diagnostics/StartCountingFunction.md +1 -1
- package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
- package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
- package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
- package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
- package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
- package/docs/Std.Diagnostics/index.md +1 -1
- package/docs/Std.Intrinsic/AND.md +1 -1
- package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
- package/docs/Std.Intrinsic/CCNOT.md +1 -1
- package/docs/Std.Intrinsic/CNOT.md +1 -1
- package/docs/Std.Intrinsic/Exp.md +1 -1
- package/docs/Std.Intrinsic/H.md +1 -1
- package/docs/Std.Intrinsic/I.md +1 -1
- package/docs/Std.Intrinsic/M.md +1 -1
- package/docs/Std.Intrinsic/Measure.md +1 -1
- package/docs/Std.Intrinsic/Message.md +1 -1
- package/docs/Std.Intrinsic/R.md +1 -1
- package/docs/Std.Intrinsic/R1.md +1 -1
- package/docs/Std.Intrinsic/R1Frac.md +1 -1
- package/docs/Std.Intrinsic/RFrac.md +1 -1
- package/docs/Std.Intrinsic/Reset.md +1 -1
- package/docs/Std.Intrinsic/ResetAll.md +1 -1
- package/docs/Std.Intrinsic/Rx.md +1 -1
- package/docs/Std.Intrinsic/Rxx.md +1 -1
- package/docs/Std.Intrinsic/Ry.md +1 -1
- package/docs/Std.Intrinsic/Ryy.md +1 -1
- package/docs/Std.Intrinsic/Rz.md +1 -1
- package/docs/Std.Intrinsic/Rzz.md +1 -1
- package/docs/Std.Intrinsic/S.md +1 -1
- package/docs/Std.Intrinsic/SWAP.md +1 -1
- package/docs/Std.Intrinsic/SX.md +1 -1
- package/docs/Std.Intrinsic/T.md +1 -1
- package/docs/Std.Intrinsic/X.md +1 -1
- package/docs/Std.Intrinsic/Y.md +1 -1
- package/docs/Std.Intrinsic/Z.md +1 -1
- package/docs/Std.Intrinsic/index.md +1 -1
- package/docs/Std.Logical/Xor.md +1 -1
- package/docs/Std.Logical/index.md +1 -1
- package/docs/Std.Math/AbsComplex.md +1 -1
- package/docs/Std.Math/AbsComplexPolar.md +1 -1
- package/docs/Std.Math/AbsD.md +1 -1
- package/docs/Std.Math/AbsI.md +1 -1
- package/docs/Std.Math/AbsL.md +1 -1
- package/docs/Std.Math/AbsSquaredComplex.md +1 -1
- package/docs/Std.Math/AbsSquaredComplexPolar.md +1 -1
- package/docs/Std.Math/ApproximateFactorial.md +1 -1
- package/docs/Std.Math/ArcCos.md +1 -1
- package/docs/Std.Math/ArcCosh.md +1 -1
- package/docs/Std.Math/ArcSin.md +1 -1
- package/docs/Std.Math/ArcSinh.md +1 -1
- package/docs/Std.Math/ArcTan.md +1 -1
- package/docs/Std.Math/ArcTan2.md +1 -1
- package/docs/Std.Math/ArcTanh.md +1 -1
- package/docs/Std.Math/ArgComplex.md +1 -1
- package/docs/Std.Math/ArgComplexPolar.md +1 -1
- package/docs/Std.Math/Binom.md +1 -1
- package/docs/Std.Math/BitSizeI.md +1 -1
- package/docs/Std.Math/BitSizeL.md +1 -1
- package/docs/Std.Math/Ceiling.md +1 -1
- package/docs/Std.Math/Complex.md +1 -1
- package/docs/Std.Math/ComplexPolar.md +1 -1
- package/docs/Std.Math/ContinuedFractionConvergentI.md +1 -1
- package/docs/Std.Math/ContinuedFractionConvergentL.md +1 -1
- package/docs/Std.Math/Cos.md +1 -1
- package/docs/Std.Math/Cosh.md +1 -1
- package/docs/Std.Math/DivRemI.md +1 -1
- package/docs/Std.Math/DivRemL.md +1 -1
- package/docs/Std.Math/DividedByC.md +1 -1
- package/docs/Std.Math/DividedByCP.md +1 -1
- package/docs/Std.Math/E.md +1 -1
- package/docs/Std.Math/ExpModI.md +1 -1
- package/docs/Std.Math/ExpModL.md +1 -1
- package/docs/Std.Math/ExtendedGreatestCommonDivisorI.md +1 -1
- package/docs/Std.Math/ExtendedGreatestCommonDivisorL.md +1 -1
- package/docs/Std.Math/FactorialI.md +1 -1
- package/docs/Std.Math/FactorialL.md +1 -1
- package/docs/Std.Math/Floor.md +1 -1
- package/docs/Std.Math/GreatestCommonDivisorI.md +1 -1
- package/docs/Std.Math/GreatestCommonDivisorL.md +1 -1
- package/docs/Std.Math/HammingWeightI.md +1 -1
- package/docs/Std.Math/InverseModI.md +1 -1
- package/docs/Std.Math/InverseModL.md +1 -1
- package/docs/Std.Math/IsCoprimeI.md +1 -1
- package/docs/Std.Math/IsCoprimeL.md +1 -1
- package/docs/Std.Math/IsInfinite.md +1 -1
- package/docs/Std.Math/IsNaN.md +1 -1
- package/docs/Std.Math/LargestFixedPoint.md +1 -1
- package/docs/Std.Math/Lg.md +1 -1
- package/docs/Std.Math/Log.md +1 -1
- package/docs/Std.Math/Log10.md +1 -1
- package/docs/Std.Math/LogFactorialD.md +1 -1
- package/docs/Std.Math/LogGammaD.md +1 -1
- package/docs/Std.Math/LogOf2.md +1 -1
- package/docs/Std.Math/Max.md +1 -1
- package/docs/Std.Math/MaxD.md +1 -1
- package/docs/Std.Math/MaxI.md +1 -1
- package/docs/Std.Math/MaxL.md +1 -1
- package/docs/Std.Math/Min.md +1 -1
- package/docs/Std.Math/MinD.md +1 -1
- package/docs/Std.Math/MinI.md +1 -1
- package/docs/Std.Math/MinL.md +1 -1
- package/docs/Std.Math/MinusC.md +1 -1
- package/docs/Std.Math/MinusCP.md +1 -1
- package/docs/Std.Math/ModulusI.md +1 -1
- package/docs/Std.Math/ModulusL.md +1 -1
- package/docs/Std.Math/NegationC.md +1 -1
- package/docs/Std.Math/NegationCP.md +1 -1
- package/docs/Std.Math/PI.md +1 -1
- package/docs/Std.Math/PNorm.md +1 -1
- package/docs/Std.Math/PNormalized.md +1 -1
- package/docs/Std.Math/PlusC.md +1 -1
- package/docs/Std.Math/PlusCP.md +1 -1
- package/docs/Std.Math/PowC.md +1 -1
- package/docs/Std.Math/PowCP.md +1 -1
- package/docs/Std.Math/RealMod.md +1 -1
- package/docs/Std.Math/Round.md +1 -1
- package/docs/Std.Math/RoundHalfAwayFromZero.md +1 -1
- package/docs/Std.Math/SignD.md +1 -1
- package/docs/Std.Math/SignI.md +1 -1
- package/docs/Std.Math/SignL.md +1 -1
- package/docs/Std.Math/Sin.md +1 -1
- package/docs/Std.Math/Sinh.md +1 -1
- package/docs/Std.Math/SmallestFixedPoint.md +1 -1
- package/docs/Std.Math/Sqrt.md +1 -1
- package/docs/Std.Math/SquaredNorm.md +1 -1
- package/docs/Std.Math/Tan.md +1 -1
- package/docs/Std.Math/Tanh.md +1 -1
- package/docs/Std.Math/TimesC.md +1 -1
- package/docs/Std.Math/TimesCP.md +1 -1
- package/docs/Std.Math/TrailingZeroCountI.md +1 -1
- package/docs/Std.Math/TrailingZeroCountL.md +1 -1
- package/docs/Std.Math/Truncate.md +1 -1
- package/docs/Std.Math/index.md +1 -1
- package/docs/Std.Measurement/IsLossResult.md +1 -1
- package/docs/Std.Measurement/MResetEachZ.md +1 -1
- package/docs/Std.Measurement/MResetX.md +1 -1
- package/docs/Std.Measurement/MResetY.md +1 -1
- package/docs/Std.Measurement/MResetZ.md +1 -1
- package/docs/Std.Measurement/MResetZChecked.md +1 -1
- package/docs/Std.Measurement/MeasureAllZ.md +1 -1
- package/docs/Std.Measurement/MeasureEachZ.md +1 -1
- package/docs/Std.Measurement/MeasureInteger.md +1 -1
- package/docs/Std.Measurement/index.md +1 -1
- package/docs/Std.Random/DrawRandomBool.md +1 -1
- package/docs/Std.Random/DrawRandomDouble.md +1 -1
- package/docs/Std.Random/DrawRandomInt.md +1 -1
- package/docs/Std.Random/index.md +1 -1
- package/docs/Std.Range/IsRangeEmpty.md +1 -1
- package/docs/Std.Range/RangeEnd.md +1 -1
- package/docs/Std.Range/RangeReverse.md +1 -1
- package/docs/Std.Range/RangeStart.md +1 -1
- package/docs/Std.Range/RangeStep.md +1 -1
- package/docs/Std.Range/index.md +1 -1
- package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
- package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
- package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/CczCount.md +1 -1
- package/docs/Std.ResourceEstimation/EnableMemoryComputeArchitecture.md +1 -1
- package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
- package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/LeastFrequentlyUsed.md +1 -1
- package/docs/Std.ResourceEstimation/LeastRecentlyUsed.md +1 -1
- package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
- package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
- package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
- package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
- package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
- package/docs/Std.ResourceEstimation/TCount.md +1 -1
- package/docs/Std.ResourceEstimation/index.md +1 -1
- package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
- package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
- package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
- package/docs/Std.StatePreparation/index.md +1 -1
- package/docs/Std.TableLookup/Select.md +1 -1
- package/docs/Std.TableLookup/index.md +1 -1
- package/docs/index.md +1 -1
- package/lib/nodejs/qsc_wasm.cjs +1 -1
- package/lib/nodejs/qsc_wasm_bg.wasm +0 -0
- package/lib/web/qsc_wasm.js +1 -1
- package/lib/web/qsc_wasm_bg.wasm +0 -0
- package/package.json +2 -1
- package/ux/circuit-vis/angleExpression.ts +133 -0
- package/ux/circuit-vis/contextMenu.ts +8 -73
- package/ux/circuit-vis/events.ts +41 -1
- package/ux/circuit-vis/formatters/inputFormatter.ts +14 -6
- package/ux/circuit-vis/index.ts +12 -4
- package/ux/circuit-vis/panel.ts +65 -28
- package/ux/circuit-vis/sqore.ts +30 -16
- package/ux/circuit-vis/state-viz/stateViz.ts +748 -0
- package/ux/circuit-vis/state-viz/stateVizController.ts +285 -0
- package/ux/circuit-vis/state-viz/worker/index.ts +18 -0
- package/ux/circuit-vis/state-viz/worker/stateCompute.ts +260 -0
- package/ux/circuit-vis/state-viz/worker/stateVizPrep.ts +152 -0
- package/ux/circuit.tsx +15 -26
- package/ux/data.ts +5 -3
- package/ux/index.ts +2 -0
- package/ux/qdk-theme.css +15 -0
- package/ux/qsharp-circuit.css +310 -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
|
-
(!
|
|
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.
|
|
95
|
-
props.runCallback,
|
|
92
|
+
props.editor,
|
|
96
93
|
);
|
|
97
94
|
|
|
98
|
-
if (!
|
|
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 (!
|
|
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
|
-
{
|
|
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
|
-
|
|
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
|
-
{
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
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;
|
package/ux/qsharp-circuit.css
CHANGED
|
@@ -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:
|
|
356
|
+
height: auto; /* let SVG expand to content height */
|
|
350
357
|
}
|
|
351
358
|
|
|
352
359
|
.ghost {
|
|
@@ -494,3 +501,305 @@
|
|
|
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: none;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
.state-edge-text {
|
|
640
|
+
writing-mode: vertical-rl;
|
|
641
|
+
text-orientation: mixed;
|
|
642
|
+
font-size: 16px;
|
|
643
|
+
font-weight: 600;
|
|
644
|
+
color: var(--qdk-host-foreground, #333);
|
|
645
|
+
letter-spacing: 0.65px;
|
|
646
|
+
user-select: none;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
/* Edge icons (top and bottom triangles) */
|
|
650
|
+
.state-edge .edge-icon {
|
|
651
|
+
position: absolute;
|
|
652
|
+
width: 18px;
|
|
653
|
+
height: 18px;
|
|
654
|
+
right: 8px;
|
|
655
|
+
pointer-events: none; /* clicks go to the edge */
|
|
656
|
+
transform-origin: 50% 50%;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
.state-edge .edge-icon-top {
|
|
660
|
+
top: 8px;
|
|
661
|
+
}
|
|
662
|
+
.state-edge .edge-icon-bottom {
|
|
663
|
+
bottom: 8px;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
.state-edge .edge-icon svg {
|
|
667
|
+
width: 100%;
|
|
668
|
+
height: 100%;
|
|
669
|
+
display: block;
|
|
670
|
+
}
|
|
671
|
+
.state-edge .edge-icon path {
|
|
672
|
+
fill: var(--qdk-host-foreground, #555);
|
|
673
|
+
stroke: none; /* sharp corners, no outline */
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
/* When collapsed, flip icons to point left */
|
|
677
|
+
.state-panel.collapsed .state-edge .edge-icon {
|
|
678
|
+
transform: rotate(180deg);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/* Empty state: hide SVG and toolbar */
|
|
682
|
+
.state-panel.message .state-svg,
|
|
683
|
+
.state-panel.message .dev-toolbar {
|
|
684
|
+
height: auto;
|
|
685
|
+
display: none;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
.state-svg .state-header {
|
|
689
|
+
font-size: 17px;
|
|
690
|
+
font-weight: 600;
|
|
691
|
+
text-anchor: start; /* override circuit default */
|
|
692
|
+
dominant-baseline: hanging;
|
|
693
|
+
pointer-events: none;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
.state-svg .state-separator {
|
|
697
|
+
stroke: #ddd;
|
|
698
|
+
stroke-width: 1px;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
.state-svg .state-bar {
|
|
702
|
+
opacity: 0.9;
|
|
703
|
+
transition:
|
|
704
|
+
fill var(--stateAnimMs, 200ms) ease,
|
|
705
|
+
opacity var(--stateAnimMs, 200ms) ease;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
.state-svg .state-bar-label {
|
|
709
|
+
font-size: 14px;
|
|
710
|
+
text-anchor: middle;
|
|
711
|
+
dominant-baseline: hanging;
|
|
712
|
+
pointer-events: none;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
.state-svg .state-phase-circle {
|
|
716
|
+
fill: none;
|
|
717
|
+
stroke: #666;
|
|
718
|
+
stroke-width: 1px;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
.state-svg .state-phase-text {
|
|
722
|
+
text-anchor: middle;
|
|
723
|
+
dominant-baseline: hanging; /* align like percentage labels */
|
|
724
|
+
font-size: 14px; /* match percentage label size */
|
|
725
|
+
pointer-events: none;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
.state-svg .state-phase-dot {
|
|
729
|
+
stroke: #333;
|
|
730
|
+
stroke-width: 0.5px;
|
|
731
|
+
transition:
|
|
732
|
+
fill var(--stateAnimMs, 200ms) ease,
|
|
733
|
+
opacity var(--stateAnimMs, 200ms) ease;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
.state-svg .state-phase-wedge {
|
|
737
|
+
stroke: none;
|
|
738
|
+
fill-opacity: 0.75;
|
|
739
|
+
transition:
|
|
740
|
+
fill var(--stateAnimMs, 200ms) ease,
|
|
741
|
+
opacity var(--stateAnimMs, 200ms) ease;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
.state-svg .state-bitstring {
|
|
745
|
+
font-size: 14px;
|
|
746
|
+
text-anchor: middle;
|
|
747
|
+
dominant-baseline: hanging;
|
|
748
|
+
pointer-events: none;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
/* Vertical orientation for long state labels to avoid collisions */
|
|
752
|
+
|
|
753
|
+
/* HTML-based vertical labels inside foreignObject */
|
|
754
|
+
.state-svg .state-bitstring-fo {
|
|
755
|
+
writing-mode: vertical-rl;
|
|
756
|
+
text-orientation: mixed;
|
|
757
|
+
font-size: 14px;
|
|
758
|
+
line-height: 1;
|
|
759
|
+
text-align: center;
|
|
760
|
+
width: -moz-fit-content;
|
|
761
|
+
width: fit-content; /* shrink to content so we can center via margins */
|
|
762
|
+
margin-left: auto;
|
|
763
|
+
margin-right: auto; /* center within the column width */
|
|
764
|
+
color: var(--qdk-host-foreground, #000);
|
|
765
|
+
pointer-events: none;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
/* Centered empty-state message in the panel */
|
|
769
|
+
.state-panel-message {
|
|
770
|
+
position: absolute;
|
|
771
|
+
top: 50%;
|
|
772
|
+
left: 50%;
|
|
773
|
+
transform: translate(-50%, -50%);
|
|
774
|
+
padding: 8px;
|
|
775
|
+
text-align: center;
|
|
776
|
+
font-size: 13px;
|
|
777
|
+
color: var(--qdk-description-foreground);
|
|
778
|
+
z-index: 20;
|
|
779
|
+
pointer-events: none;
|
|
780
|
+
transition: opacity var(--stateAnimMs, 200ms) ease;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/* Circuit container/wrapper layout extracted from inline styles */
|
|
784
|
+
.circuit-editor-container {
|
|
785
|
+
display: flex;
|
|
786
|
+
height: 80vh;
|
|
787
|
+
width: 95vw;
|
|
788
|
+
align-items: stretch;
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
.circuit-wrapper {
|
|
792
|
+
display: block;
|
|
793
|
+
overflow: auto;
|
|
794
|
+
width: 100%;
|
|
795
|
+
flex: 1 1 auto;
|
|
796
|
+
min-width: 0;
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
/* Empty circuit message extracted from inline styles */
|
|
800
|
+
.empty-circuit-message {
|
|
801
|
+
padding: 2em;
|
|
802
|
+
text-align: center;
|
|
803
|
+
color: var(--qdk-description-foreground);
|
|
804
|
+
font-size: 1.1em;
|
|
805
|
+
}
|