qsharp-lang 1.26.2-dev → 1.26.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.
- package/dist/data-structures/circuit.d.ts +0 -15
- package/dist/data-structures/circuit.js +1 -19
- package/dist/katas-content.generated.js +1 -1
- package/dist/katas-content.generated.md.js +1 -1
- package/dist/samples.generated.js +4 -4
- 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/PostSelectZ.md +40 -0
- 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 +2 -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/docs/toc.yml +1 -0
- package/lib/nodejs/qsc_wasm.cjs +1318 -1392
- package/lib/nodejs/qsc_wasm.d.cts +313 -290
- package/lib/nodejs/qsc_wasm_bg.wasm +0 -0
- package/lib/web/qsc_wasm.d.ts +388 -364
- package/lib/web/qsc_wasm.js +1346 -1346
- package/lib/web/qsc_wasm_bg.wasm +0 -0
- package/package.json +1 -1
- package/ux/circuit-vis/circuit.ts +0 -1
- package/ux/circuit-vis/formatters/gateFormatter.ts +111 -86
- package/ux/circuit-vis/formatters/registerFormatter.ts +2 -5
- package/ux/circuit-vis/gateRenderData.ts +10 -3
- package/ux/circuit-vis/panel.ts +1 -0
- package/ux/circuit-vis/process.ts +162 -57
- package/ux/circuit-vis/sqore.ts +34 -28
- package/ux/circuit-vis/utils.ts +2 -1
|
@@ -10,12 +10,7 @@ import {
|
|
|
10
10
|
groupTopPadding,
|
|
11
11
|
groupBottomPadding,
|
|
12
12
|
} from "./constants.js";
|
|
13
|
-
import {
|
|
14
|
-
ComponentGrid,
|
|
15
|
-
Operation,
|
|
16
|
-
ConditionalRender,
|
|
17
|
-
SourceLocation,
|
|
18
|
-
} from "./circuit.js";
|
|
13
|
+
import { ComponentGrid, Operation, SourceLocation } from "./circuit.js";
|
|
19
14
|
import { GateRenderData, GateType } from "./gateRenderData.js";
|
|
20
15
|
import { Register, RegisterMap } from "./register.js";
|
|
21
16
|
import { getMinGateWidth } from "./utils.js";
|
|
@@ -45,19 +40,21 @@ const processOperations = (
|
|
|
45
40
|
maxTopPadding: number;
|
|
46
41
|
maxBottomPadding: number;
|
|
47
42
|
} => {
|
|
48
|
-
if (componentGrid.length === 0)
|
|
43
|
+
if (componentGrid.length === 0) {
|
|
49
44
|
return {
|
|
50
45
|
renderDataArray: [],
|
|
51
46
|
svgWidth: startX + gatePadding * 2,
|
|
52
47
|
maxTopPadding: 0,
|
|
53
48
|
maxBottomPadding: 0,
|
|
54
49
|
};
|
|
55
|
-
|
|
56
|
-
const columnsWidths: number[] = new Array(numColumns).fill(minGateWidth);
|
|
50
|
+
}
|
|
57
51
|
|
|
58
52
|
let maxTopPadding = 0;
|
|
59
53
|
let maxBottomPadding = 0;
|
|
60
54
|
|
|
55
|
+
// Track the width of each column as we process it.
|
|
56
|
+
const columnsWidths: number[] = componentGrid.map(() => minGateWidth);
|
|
57
|
+
|
|
61
58
|
// Get classical registers and their starting column index
|
|
62
59
|
const classicalRegs: [number, Register][] =
|
|
63
60
|
_getClassicalRegStarts(componentGrid);
|
|
@@ -97,14 +94,21 @@ const processOperations = (
|
|
|
97
94
|
);
|
|
98
95
|
}
|
|
99
96
|
|
|
97
|
+
const isCollapsedGroup =
|
|
98
|
+
renderData.type === GateType.Group && !renderData.isExpanded;
|
|
99
|
+
|
|
100
100
|
if (
|
|
101
101
|
op != null &&
|
|
102
|
-
[
|
|
103
|
-
|
|
104
|
-
|
|
102
|
+
([
|
|
103
|
+
GateType.Unitary,
|
|
104
|
+
GateType.Ket,
|
|
105
|
+
GateType.ControlledUnitary,
|
|
106
|
+
].includes(renderData.type) ||
|
|
107
|
+
isCollapsedGroup)
|
|
105
108
|
) {
|
|
106
|
-
//
|
|
107
|
-
//
|
|
109
|
+
// Split multi-wire gate bodies into segments if there is a classical
|
|
110
|
+
// register wire between them. This prevents classical wires from
|
|
111
|
+
// visually intersecting/entering gate bodies.
|
|
108
112
|
|
|
109
113
|
// Get y coordinates of classical registers in the same column as this operation
|
|
110
114
|
const classicalRegY: number[] = classicalRegs
|
|
@@ -120,9 +124,16 @@ const processOperations = (
|
|
|
120
124
|
return children[reg.result].y;
|
|
121
125
|
});
|
|
122
126
|
|
|
127
|
+
const allowedThroughY = (renderData.classicalControlRegs ?? []).map(
|
|
128
|
+
(reg) => _getRegY(reg, registers),
|
|
129
|
+
);
|
|
130
|
+
const splitAroundY = classicalRegY.filter(
|
|
131
|
+
(y) => !allowedThroughY.includes(y),
|
|
132
|
+
);
|
|
133
|
+
|
|
123
134
|
renderData.targetsY = _splitTargetsY(
|
|
124
135
|
targets,
|
|
125
|
-
|
|
136
|
+
splitAroundY,
|
|
126
137
|
registers,
|
|
127
138
|
);
|
|
128
139
|
}
|
|
@@ -136,13 +147,23 @@ const processOperations = (
|
|
|
136
147
|
}),
|
|
137
148
|
);
|
|
138
149
|
|
|
139
|
-
// Filter out invalid gates
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
.
|
|
150
|
+
// Filter out invalid gates and remove empty columns.
|
|
151
|
+
// Keep column widths in sync with the filtered columns.
|
|
152
|
+
const filteredColumns = renderDataArray
|
|
153
|
+
.map((col, colIndex) => ({
|
|
154
|
+
colIndex,
|
|
155
|
+
gates: col.filter(({ type }) => type != GateType.Invalid),
|
|
156
|
+
}))
|
|
157
|
+
.filter(({ gates }) => gates.length > 0);
|
|
158
|
+
const filteredArray: GateRenderData[][] = filteredColumns.map(
|
|
159
|
+
({ gates }) => gates,
|
|
160
|
+
);
|
|
161
|
+
const filteredColumnWidths: number[] = filteredColumns.map(
|
|
162
|
+
({ colIndex }) => columnsWidths[colIndex],
|
|
163
|
+
);
|
|
143
164
|
|
|
144
165
|
// Fill in x coord of each gate
|
|
145
|
-
const endX: number = _fillRenderDataX(filteredArray,
|
|
166
|
+
const endX: number = _fillRenderDataX(filteredArray, filteredColumnWidths);
|
|
146
167
|
|
|
147
168
|
return {
|
|
148
169
|
renderDataArray: filteredArray,
|
|
@@ -182,6 +203,29 @@ const _getClassicalRegStarts = (
|
|
|
182
203
|
return clsRegs;
|
|
183
204
|
};
|
|
184
205
|
|
|
206
|
+
/**
|
|
207
|
+
* Recursively collects classical control registers from source circuit children.
|
|
208
|
+
* Used inside _opToRenderData for collapsed groups whose children have not been rendered.
|
|
209
|
+
*/
|
|
210
|
+
function _collectClassicalControlsFromSourceChildren(
|
|
211
|
+
children: ComponentGrid,
|
|
212
|
+
): Register[] {
|
|
213
|
+
const regs: Register[] = [];
|
|
214
|
+
for (const col of children) {
|
|
215
|
+
for (const op of col.components) {
|
|
216
|
+
if (op.kind === "unitary") {
|
|
217
|
+
for (const reg of op.controls ?? []) {
|
|
218
|
+
if (reg.result != null) regs.push(reg);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (op.children != null) {
|
|
222
|
+
regs.push(..._collectClassicalControlsFromSourceChildren(op.children));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return regs;
|
|
227
|
+
}
|
|
228
|
+
|
|
185
229
|
/**
|
|
186
230
|
* Maps operation to render data (e.g. gate type, position, dimensions, text)
|
|
187
231
|
* required to render the image.
|
|
@@ -198,6 +242,7 @@ const _opToRenderData = (
|
|
|
198
242
|
): GateRenderData => {
|
|
199
243
|
const renderData: GateRenderData = {
|
|
200
244
|
type: GateType.Invalid,
|
|
245
|
+
isExpanded: false,
|
|
201
246
|
x: 0,
|
|
202
247
|
controlsY: [],
|
|
203
248
|
targetsY: [],
|
|
@@ -230,31 +275,34 @@ const _opToRenderData = (
|
|
|
230
275
|
break;
|
|
231
276
|
}
|
|
232
277
|
|
|
233
|
-
const {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
278
|
+
const { gate, args, children, dataAttributes } = op;
|
|
279
|
+
|
|
280
|
+
// Classically-controlled operations are encoded as operations whose `controls` are
|
|
281
|
+
// classical registers (i.e. `Register.result` is set), with IDs provided via
|
|
282
|
+
// `metadata.controlResultIds`.
|
|
283
|
+
const hasClassicalControls =
|
|
284
|
+
op.kind === "unitary" &&
|
|
285
|
+
((controls?.some((reg) => reg.result != null) ?? false) ||
|
|
286
|
+
(op.metadata?.controlResultIds?.length ?? 0) > 0);
|
|
287
|
+
|
|
288
|
+
const hasChildren = children != null && children.length > 0;
|
|
289
|
+
const expandedAttr = dataAttributes?.["expanded"];
|
|
290
|
+
const defaultExpanded = hasClassicalControls && hasChildren;
|
|
291
|
+
const isExpanded =
|
|
292
|
+
expandedAttr === undefined ? defaultExpanded : expandedAttr === "true";
|
|
293
|
+
renderData.isExpanded = isExpanded;
|
|
241
294
|
|
|
242
295
|
// Set y coords
|
|
243
296
|
renderData.controlsY = controls?.map((reg) => _getRegY(reg, registers)) || [];
|
|
244
297
|
renderData.targetsY = targets.map((reg) => _getRegY(reg, registers));
|
|
245
298
|
|
|
246
|
-
if (
|
|
247
|
-
// Classically-controlled operations
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
"No children operations found for classically-controlled operation.",
|
|
251
|
-
);
|
|
299
|
+
if (hasClassicalControls) {
|
|
300
|
+
// Classically-controlled operations.
|
|
301
|
+
// These are treated as composite/group operations when they have children.
|
|
302
|
+
// Expanded vs. collapsed rendering is controlled via the `expanded` state.
|
|
252
303
|
|
|
253
|
-
renderData.type = GateType.ClassicalControlled;
|
|
254
304
|
renderData.label = gate;
|
|
255
305
|
|
|
256
|
-
_processChildren(renderData, children, registers, renderLocations);
|
|
257
|
-
|
|
258
306
|
// Fill in the ID to be displayed in each control wire's circle.
|
|
259
307
|
renderData.classicalControlIds =
|
|
260
308
|
controls
|
|
@@ -266,22 +314,30 @@ const _opToRenderData = (
|
|
|
266
314
|
)
|
|
267
315
|
.map((id) => id ?? null) || [];
|
|
268
316
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
317
|
+
if (hasChildren) {
|
|
318
|
+
renderData.type = GateType.Group;
|
|
319
|
+
if (isExpanded) {
|
|
320
|
+
_processChildren(renderData, children!, registers, renderLocations);
|
|
321
|
+
|
|
322
|
+
// Add additional width for classical control circle.
|
|
323
|
+
// (The group width comes from children layout; it doesn't account for controls.)
|
|
324
|
+
renderData.width += controlCircleOffset;
|
|
325
|
+
}
|
|
326
|
+
} else {
|
|
327
|
+
// Defensive fallback: a conditional without children is rendered as a unitary.
|
|
328
|
+
renderData.type = GateType.Unitary;
|
|
329
|
+
}
|
|
330
|
+
} else if (hasChildren) {
|
|
331
|
+
// Composite/grouped operations.
|
|
332
|
+
// Always represented as `GateType.Group` so the UI can determine expandability
|
|
333
|
+
// solely from gate type.
|
|
277
334
|
|
|
278
335
|
renderData.type = GateType.Group;
|
|
279
|
-
// _zoomButton function in gateFormatter.ts relies on
|
|
280
|
-
// 'expanded' attribute to render zoom button
|
|
281
|
-
renderData.dataAttributes = { expanded: "true" };
|
|
282
336
|
renderData.label = gate;
|
|
283
337
|
|
|
284
|
-
|
|
338
|
+
if (isExpanded) {
|
|
339
|
+
_processChildren(renderData, children!, registers, renderLocations);
|
|
340
|
+
}
|
|
285
341
|
} else if (op.kind === "measurement") {
|
|
286
342
|
renderData.type = GateType.Measure;
|
|
287
343
|
} else if (op.kind === "ket") {
|
|
@@ -301,6 +357,32 @@ const _opToRenderData = (
|
|
|
301
357
|
renderData.label = gate;
|
|
302
358
|
}
|
|
303
359
|
|
|
360
|
+
// Collect classical control registers for this op and all descendants.
|
|
361
|
+
// For expanded groups, aggregate from already-rendered children to avoid re-walking source data.
|
|
362
|
+
// For collapsed groups with children, walk source data directly.
|
|
363
|
+
{
|
|
364
|
+
const ownControls =
|
|
365
|
+
op.kind === "unitary"
|
|
366
|
+
? (controls ?? []).filter((r) => r.result != null)
|
|
367
|
+
: [];
|
|
368
|
+
const descendantControls: Register[] =
|
|
369
|
+
renderData.children != null
|
|
370
|
+
? renderData.children
|
|
371
|
+
.flat()
|
|
372
|
+
.flatMap((c) => c.classicalControlRegs ?? [])
|
|
373
|
+
: hasChildren
|
|
374
|
+
? _collectClassicalControlsFromSourceChildren(children!)
|
|
375
|
+
: [];
|
|
376
|
+
const seen = new Set<string>();
|
|
377
|
+
renderData.classicalControlRegs = [
|
|
378
|
+
...ownControls,
|
|
379
|
+
...descendantControls,
|
|
380
|
+
].filter((r) => {
|
|
381
|
+
const key = `${r.qubit}:${r.result}`;
|
|
382
|
+
return seen.has(key) ? false : (seen.add(key), true);
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
|
|
304
386
|
// If adjoint, add ' to the end of gate label
|
|
305
387
|
if (isAdjoint && renderData.label.length > 0) renderData.label += "'";
|
|
306
388
|
|
|
@@ -308,9 +390,19 @@ const _opToRenderData = (
|
|
|
308
390
|
// For now, we only display the first argument
|
|
309
391
|
if (args !== undefined && args.length > 0) renderData.displayArgs = args[0];
|
|
310
392
|
|
|
311
|
-
// Minimum width is calculated based on the label and args
|
|
393
|
+
// Minimum width is calculated based on the label and args.
|
|
394
|
+
// If this is a collapsed composite (GateType.Group with no children render data),
|
|
395
|
+
// its width should be based on the summary gate rather than the full expanded layout.
|
|
312
396
|
const minWidth = getMinGateWidth(renderData);
|
|
313
|
-
|
|
397
|
+
|
|
398
|
+
const isCollapsedComposite =
|
|
399
|
+
renderData.type === GateType.Group && !isExpanded;
|
|
400
|
+
|
|
401
|
+
if (isCollapsedComposite) {
|
|
402
|
+
renderData.width = minWidth;
|
|
403
|
+
} else {
|
|
404
|
+
renderData.width = Math.max(minWidth, renderData.width);
|
|
405
|
+
}
|
|
314
406
|
|
|
315
407
|
if (op.metadata?.source && renderLocations) {
|
|
316
408
|
renderData.link = renderLocations([op.metadata.source]);
|
|
@@ -323,6 +415,14 @@ const _opToRenderData = (
|
|
|
323
415
|
...dataAttributes,
|
|
324
416
|
};
|
|
325
417
|
|
|
418
|
+
// By default, classically controlled groups are expanded unless explicitly overridden.
|
|
419
|
+
if (defaultExpanded && expandedAttr === undefined) {
|
|
420
|
+
renderData.dataAttributes = {
|
|
421
|
+
...renderData.dataAttributes,
|
|
422
|
+
expanded: "true",
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
|
|
326
426
|
return renderData;
|
|
327
427
|
};
|
|
328
428
|
|
|
@@ -440,27 +540,32 @@ const _fillRenderDataX = (
|
|
|
440
540
|
renderDataArray.forEach((col, colIndex) =>
|
|
441
541
|
col.forEach((renderData) => {
|
|
442
542
|
const x = colStartX[colIndex];
|
|
543
|
+
const columnWidth = columnWidths[colIndex];
|
|
544
|
+
const columnCenterX = x + columnWidth / 2;
|
|
443
545
|
switch (renderData.type) {
|
|
444
|
-
case GateType.ClassicalControlled:
|
|
445
546
|
case GateType.Group:
|
|
446
547
|
{
|
|
548
|
+
// Center the group within the column, and offset nested child gates
|
|
549
|
+
// relative to the group's left edge (plus internal padding).
|
|
550
|
+
const groupLeftX = columnCenterX - renderData.width / 2;
|
|
551
|
+
|
|
447
552
|
// Subtract startX offset from nested gates and add offset and padding
|
|
448
|
-
let offset: number =
|
|
449
|
-
if (renderData.
|
|
553
|
+
let offset: number = groupLeftX - startX + groupPaddingX;
|
|
554
|
+
if (renderData.classicalControlIds != null) {
|
|
450
555
|
offset += controlCircleOffset;
|
|
451
556
|
}
|
|
452
557
|
|
|
453
558
|
// Offset each x coord in children gates
|
|
454
559
|
_offsetChildrenX(renderData.children, offset);
|
|
455
560
|
|
|
456
|
-
//
|
|
457
|
-
renderData.x =
|
|
561
|
+
// Center gate in column
|
|
562
|
+
renderData.x = columnCenterX;
|
|
458
563
|
}
|
|
459
564
|
break;
|
|
460
565
|
|
|
461
566
|
default:
|
|
462
567
|
// Center gate in column
|
|
463
|
-
renderData.x =
|
|
568
|
+
renderData.x = columnCenterX;
|
|
464
569
|
break;
|
|
465
570
|
}
|
|
466
571
|
}),
|
package/ux/circuit-vis/sqore.ts
CHANGED
|
@@ -6,7 +6,6 @@ import { formatGates } from "./formatters/gateFormatter.js";
|
|
|
6
6
|
import { formatRegisters } from "./formatters/registerFormatter.js";
|
|
7
7
|
import { processOperations } from "./process.js";
|
|
8
8
|
import {
|
|
9
|
-
ConditionalRender,
|
|
10
9
|
Circuit,
|
|
11
10
|
CircuitGroup,
|
|
12
11
|
ComponentGrid,
|
|
@@ -260,7 +259,6 @@ export class Sqore {
|
|
|
260
259
|
for (const col of componentGrid) {
|
|
261
260
|
for (const op of col.components) {
|
|
262
261
|
if (currentDepth < targetDepth && op.children != null) {
|
|
263
|
-
op.conditionalRender = ConditionalRender.AsGroup;
|
|
264
262
|
op.dataAttributes = op.dataAttributes || {};
|
|
265
263
|
op.dataAttributes["expanded"] = "true";
|
|
266
264
|
this.expandOperationsToDepth(
|
|
@@ -429,21 +427,19 @@ export class Sqore {
|
|
|
429
427
|
private fillGateRegistry(operation: Operation, location: string): void {
|
|
430
428
|
if (operation.dataAttributes == null) operation.dataAttributes = {};
|
|
431
429
|
operation.dataAttributes["location"] = location;
|
|
432
|
-
|
|
433
|
-
|
|
430
|
+
|
|
431
|
+
// Note: `dataAttributes["expanded"]` is intentionally not defaulted here.
|
|
432
|
+
// Expansion is controlled by:
|
|
433
|
+
// - `renderDepth` (see `expandOperationsToDepth`),
|
|
434
|
+
// - user interaction (expand/collapse), and
|
|
435
|
+
// - `expandIfSingleOperation`, which auto-expands a single top-level op
|
|
436
|
+
// unless it has been explicitly collapsed.
|
|
434
437
|
this.gateRegistry[location] = operation;
|
|
435
438
|
operation.children?.forEach((col, colIndex) =>
|
|
436
439
|
col.components.forEach((childOp, i) => {
|
|
437
440
|
this.fillGateRegistry(childOp, `${location}-${colIndex},${i}`);
|
|
438
|
-
if (childOp.dataAttributes == null) childOp.dataAttributes = {};
|
|
439
|
-
// Children operations can be zoomed out
|
|
440
|
-
childOp.dataAttributes["zoom-out"] = "true";
|
|
441
441
|
}),
|
|
442
442
|
);
|
|
443
|
-
// Composite operations can be zoomed in
|
|
444
|
-
operation.dataAttributes["zoom-in"] = (
|
|
445
|
-
operation.children != null
|
|
446
|
-
).toString();
|
|
447
443
|
}
|
|
448
444
|
|
|
449
445
|
/**
|
|
@@ -458,11 +454,10 @@ export class Sqore {
|
|
|
458
454
|
}
|
|
459
455
|
|
|
460
456
|
/**
|
|
461
|
-
* Add interactive click handlers for
|
|
457
|
+
* Add interactive click handlers for expand/collapse functionality.
|
|
462
458
|
*
|
|
463
459
|
* @param container HTML element containing visualized circuit.
|
|
464
460
|
* @param circuit Circuit to be visualized.
|
|
465
|
-
*
|
|
466
461
|
*/
|
|
467
462
|
private addZoomHandlers(container: HTMLElement, circuit: Circuit): void {
|
|
468
463
|
container.querySelectorAll(".gate .gate-control").forEach((ctrl) => {
|
|
@@ -486,11 +481,10 @@ export class Sqore {
|
|
|
486
481
|
}
|
|
487
482
|
|
|
488
483
|
/**
|
|
489
|
-
* Expand selected operation
|
|
484
|
+
* Expand selected composite operation.
|
|
490
485
|
*
|
|
491
486
|
* @param componentGrid Grid of circuit components.
|
|
492
487
|
* @param location Location of operation to expand.
|
|
493
|
-
*
|
|
494
488
|
*/
|
|
495
489
|
private expandOperation(
|
|
496
490
|
componentGrid: ComponentGrid,
|
|
@@ -498,12 +492,10 @@ export class Sqore {
|
|
|
498
492
|
): void {
|
|
499
493
|
componentGrid.forEach((col) =>
|
|
500
494
|
col.components.forEach((op) => {
|
|
501
|
-
if (op.
|
|
502
|
-
this.expandOperation(op.children || [], location);
|
|
495
|
+
if (op.children != null) this.expandOperation(op.children, location);
|
|
503
496
|
if (op.dataAttributes == null) return op;
|
|
504
497
|
const opId: string = op.dataAttributes["location"];
|
|
505
498
|
if (opId === location && op.children != null) {
|
|
506
|
-
op.conditionalRender = ConditionalRender.AsGroup;
|
|
507
499
|
op.dataAttributes["expanded"] = "true";
|
|
508
500
|
}
|
|
509
501
|
}),
|
|
@@ -511,11 +503,10 @@ export class Sqore {
|
|
|
511
503
|
}
|
|
512
504
|
|
|
513
505
|
/**
|
|
514
|
-
* Collapse selected operation
|
|
506
|
+
* Collapse selected composite operation.
|
|
515
507
|
*
|
|
516
508
|
* @param componentGrid Grid of circuit components.
|
|
517
509
|
* @param parentLoc Location of operation to collapse.
|
|
518
|
-
*
|
|
519
510
|
*/
|
|
520
511
|
private collapseOperation(
|
|
521
512
|
componentGrid: ComponentGrid,
|
|
@@ -523,14 +514,18 @@ export class Sqore {
|
|
|
523
514
|
): void {
|
|
524
515
|
componentGrid.forEach((col) =>
|
|
525
516
|
col.components.forEach((op) => {
|
|
526
|
-
if (op.
|
|
527
|
-
this.collapseOperation(op.children || [], parentLoc);
|
|
517
|
+
if (op.children != null) this.collapseOperation(op.children, parentLoc);
|
|
528
518
|
if (op.dataAttributes == null) return op;
|
|
529
519
|
const opId: string = op.dataAttributes["location"];
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
op.conditionalRender = ConditionalRender.Always;
|
|
520
|
+
if (opId === parentLoc) {
|
|
521
|
+
// Explicitly collapse the targeted parent operation.
|
|
533
522
|
op.dataAttributes["expanded"] = "false";
|
|
523
|
+
} else if (opId.startsWith(parentLoc)) {
|
|
524
|
+
// For descendants, remove the explicit expanded attribute rather than
|
|
525
|
+
// forcing it to "false". This allows default expansion rules (e.g.
|
|
526
|
+
// classically controlled groups default to expanded) to re-apply
|
|
527
|
+
// correctly when the parent is later re-expanded.
|
|
528
|
+
delete op.dataAttributes["expanded"];
|
|
534
529
|
}
|
|
535
530
|
}),
|
|
536
531
|
);
|
|
@@ -655,7 +650,18 @@ function updateRowHeights(
|
|
|
655
650
|
* its children, with a dashed box around the children.
|
|
656
651
|
*/
|
|
657
652
|
function isExpandedGroup(component: Operation) {
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
653
|
+
const expandedAttr = component.dataAttributes?.["expanded"];
|
|
654
|
+
if (expandedAttr != null) {
|
|
655
|
+
return expandedAttr === "true";
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
const hasChildren =
|
|
659
|
+
component.children != null && component.children.length > 0;
|
|
660
|
+
const hasClassicalControls =
|
|
661
|
+
component.kind === "unitary" &&
|
|
662
|
+
(((component.controls ?? []).some((reg) => reg.result != null) ?? false) ||
|
|
663
|
+
(component.metadata?.controlResultIds?.length ?? 0) > 0);
|
|
664
|
+
|
|
665
|
+
// Classically controlled groups default to expanded when not explicitly set.
|
|
666
|
+
return hasChildren && hasClassicalControls;
|
|
661
667
|
}
|
package/ux/circuit-vis/utils.ts
CHANGED
|
@@ -61,6 +61,7 @@ const getMinGateWidth = ({
|
|
|
61
61
|
type,
|
|
62
62
|
label,
|
|
63
63
|
displayArgs,
|
|
64
|
+
classicalControlIds,
|
|
64
65
|
}: GateRenderData): number => {
|
|
65
66
|
switch (type) {
|
|
66
67
|
case GateType.Measure:
|
|
@@ -70,7 +71,7 @@ const getMinGateWidth = ({
|
|
|
70
71
|
default: {
|
|
71
72
|
// Classically controlled gates are wider because of the control button on the left
|
|
72
73
|
const controlButtonWidth =
|
|
73
|
-
|
|
74
|
+
classicalControlIds != null ? controlCircleOffset : 0;
|
|
74
75
|
const labelWidth = _getStringWidth(label);
|
|
75
76
|
const argsWidth =
|
|
76
77
|
displayArgs != null ? _getStringWidth(displayArgs, argsFontSize) : 0;
|