qsharp-lang 1.6.1-dev → 1.6.2-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/browser.d.ts +4 -8
- package/dist/browser.js +4 -4
- package/dist/compiler/compiler.d.ts +20 -37
- package/dist/compiler/compiler.js +30 -50
- package/dist/debug-service/debug-service.d.ts +3 -3
- package/dist/debug-service/debug-service.js +4 -3
- package/dist/katas-content.generated.js +28 -8
- package/dist/katas-content.generated.md.js +28 -8
- package/dist/language-service/language-service.d.ts +3 -4
- package/dist/language-service/language-service.js +8 -3
- package/dist/main.d.ts +3 -6
- package/dist/main.js +4 -4
- package/docs/Microsoft.Quantum.Arrays/All.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Any.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Chunks.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/CircularlyShifted.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/ColumnAt.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Count.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Diagonal.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/DrawMany.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Enumerated.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Excluding.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Filtered.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/FlatMapped.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Flattened.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Fold.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/ForEach.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Head.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/HeadAndRest.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/IndexOf.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/IndexRange.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Interleaved.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/IsEmpty.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/IsRectangularArray.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/IsSorted.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/IsSquareArray.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Mapped.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/MappedByIndex.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/MappedOverRange.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Most.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/MostAndTail.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Padded.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Partitioned.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Rest.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Reversed.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/SequenceI.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/SequenceL.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Sorted.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Subarray.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Swapped.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Tail.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Transposed.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Unzipped.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Where.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Windows.md +1 -1
- package/docs/Microsoft.Quantum.Arrays/Zipped.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyCNOTChain.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyControlledOnBitString.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyControlledOnInt.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyP.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyPauli.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyPauliFromBitString.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyPauliFromInt.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyQFT.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyToEach.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyToEachA.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyToEachC.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyToEachCA.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyXorInPlace.md +1 -1
- package/docs/Microsoft.Quantum.Canon/ApplyXorInPlaceL.md +1 -1
- package/docs/Microsoft.Quantum.Canon/CX.md +1 -1
- package/docs/Microsoft.Quantum.Canon/CY.md +1 -1
- package/docs/Microsoft.Quantum.Canon/CZ.md +1 -1
- package/docs/Microsoft.Quantum.Canon/Fst.md +1 -1
- package/docs/Microsoft.Quantum.Canon/Snd.md +1 -1
- package/docs/Microsoft.Quantum.Canon/SwapReverseRegister.md +1 -1
- package/docs/Microsoft.Quantum.Convert/BigIntAsBoolArray.md +1 -1
- package/docs/Microsoft.Quantum.Convert/BoolArrayAsBigInt.md +1 -1
- package/docs/Microsoft.Quantum.Convert/BoolArrayAsInt.md +1 -1
- package/docs/Microsoft.Quantum.Convert/BoolArrayAsResultArray.md +1 -1
- package/docs/Microsoft.Quantum.Convert/BoolAsResult.md +1 -1
- package/docs/Microsoft.Quantum.Convert/ComplexAsComplexPolar.md +1 -1
- package/docs/Microsoft.Quantum.Convert/ComplexPolarAsComplex.md +1 -1
- package/docs/Microsoft.Quantum.Convert/IntAsBigInt.md +1 -1
- package/docs/Microsoft.Quantum.Convert/IntAsBoolArray.md +1 -1
- package/docs/Microsoft.Quantum.Convert/IntAsDouble.md +1 -1
- package/docs/Microsoft.Quantum.Convert/ResultArrayAsBoolArray.md +1 -1
- package/docs/Microsoft.Quantum.Convert/ResultArrayAsInt.md +1 -1
- package/docs/Microsoft.Quantum.Convert/ResultAsBool.md +1 -1
- 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/RangeReverse.md +1 -1
- package/docs/Microsoft.Quantum.Core/RangeStart.md +1 -1
- package/docs/Microsoft.Quantum.Core/RangeStep.md +1 -1
- package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
- package/docs/Microsoft.Quantum.Diagnostics/DumpMachine.md +1 -1
- package/docs/Microsoft.Quantum.Diagnostics/DumpRegister.md +1 -1
- package/docs/Microsoft.Quantum.Diagnostics/Fact.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/AND.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/CCNOT.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/CNOT.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/Exp.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/H.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/I.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/M.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/Measure.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/Message.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/R.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/R1.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/R1Frac.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/RFrac.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/Reset.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/ResetAll.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/Rx.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/Rxx.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/Ry.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/Ryy.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/Rz.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/Rzz.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/S.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/SWAP.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/T.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/X.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/Y.md +1 -1
- package/docs/Microsoft.Quantum.Intrinsic/Z.md +1 -1
- package/docs/Microsoft.Quantum.Logical/Xor.md +1 -1
- package/docs/Microsoft.Quantum.Math/AbsComplex.md +1 -1
- package/docs/Microsoft.Quantum.Math/AbsComplexPolar.md +1 -1
- package/docs/Microsoft.Quantum.Math/AbsD.md +1 -1
- package/docs/Microsoft.Quantum.Math/AbsI.md +1 -1
- package/docs/Microsoft.Quantum.Math/AbsL.md +1 -1
- package/docs/Microsoft.Quantum.Math/AbsSquaredComplex.md +1 -1
- package/docs/Microsoft.Quantum.Math/AbsSquaredComplexPolar.md +1 -1
- package/docs/Microsoft.Quantum.Math/ApproximateFactorial.md +1 -1
- package/docs/Microsoft.Quantum.Math/ArcCos.md +1 -1
- package/docs/Microsoft.Quantum.Math/ArcCosh.md +1 -1
- package/docs/Microsoft.Quantum.Math/ArcSin.md +1 -1
- package/docs/Microsoft.Quantum.Math/ArcSinh.md +1 -1
- package/docs/Microsoft.Quantum.Math/ArcTan.md +1 -1
- package/docs/Microsoft.Quantum.Math/ArcTan2.md +1 -1
- package/docs/Microsoft.Quantum.Math/ArcTanh.md +1 -1
- package/docs/Microsoft.Quantum.Math/ArgComplex.md +1 -1
- package/docs/Microsoft.Quantum.Math/ArgComplexPolar.md +1 -1
- package/docs/Microsoft.Quantum.Math/Binom.md +1 -1
- package/docs/Microsoft.Quantum.Math/BitSizeI.md +1 -1
- package/docs/Microsoft.Quantum.Math/BitSizeL.md +1 -1
- package/docs/Microsoft.Quantum.Math/Ceiling.md +1 -1
- package/docs/Microsoft.Quantum.Math/Complex.md +1 -1
- package/docs/Microsoft.Quantum.Math/ComplexPolar.md +1 -1
- package/docs/Microsoft.Quantum.Math/ContinuedFractionConvergentI.md +1 -1
- package/docs/Microsoft.Quantum.Math/ContinuedFractionConvergentL.md +1 -1
- package/docs/Microsoft.Quantum.Math/Cos.md +1 -1
- package/docs/Microsoft.Quantum.Math/Cosh.md +1 -1
- package/docs/Microsoft.Quantum.Math/DivRemI.md +1 -1
- package/docs/Microsoft.Quantum.Math/DivRemL.md +1 -1
- package/docs/Microsoft.Quantum.Math/DividedByC.md +1 -1
- package/docs/Microsoft.Quantum.Math/DividedByCP.md +1 -1
- package/docs/Microsoft.Quantum.Math/E.md +1 -1
- package/docs/Microsoft.Quantum.Math/ExpModI.md +1 -1
- package/docs/Microsoft.Quantum.Math/ExpModL.md +1 -1
- package/docs/Microsoft.Quantum.Math/ExtendedGreatestCommonDivisorI.md +1 -1
- package/docs/Microsoft.Quantum.Math/ExtendedGreatestCommonDivisorL.md +1 -1
- package/docs/Microsoft.Quantum.Math/FactorialI.md +1 -1
- package/docs/Microsoft.Quantum.Math/FactorialL.md +1 -1
- package/docs/Microsoft.Quantum.Math/Floor.md +1 -1
- package/docs/Microsoft.Quantum.Math/GreatestCommonDivisorI.md +1 -1
- package/docs/Microsoft.Quantum.Math/GreatestCommonDivisorL.md +1 -1
- package/docs/Microsoft.Quantum.Math/HammingWeightI.md +1 -1
- package/docs/Microsoft.Quantum.Math/InverseModI.md +1 -1
- package/docs/Microsoft.Quantum.Math/InverseModL.md +1 -1
- package/docs/Microsoft.Quantum.Math/IsCoprimeI.md +1 -1
- package/docs/Microsoft.Quantum.Math/IsCoprimeL.md +1 -1
- package/docs/Microsoft.Quantum.Math/IsInfinite.md +1 -1
- package/docs/Microsoft.Quantum.Math/IsNaN.md +1 -1
- package/docs/Microsoft.Quantum.Math/LargestFixedPoint.md +1 -1
- package/docs/Microsoft.Quantum.Math/Lg.md +1 -1
- package/docs/Microsoft.Quantum.Math/Log.md +1 -1
- package/docs/Microsoft.Quantum.Math/Log10.md +1 -1
- package/docs/Microsoft.Quantum.Math/LogFactorialD.md +1 -1
- package/docs/Microsoft.Quantum.Math/LogGammaD.md +1 -1
- package/docs/Microsoft.Quantum.Math/LogOf2.md +1 -1
- package/docs/Microsoft.Quantum.Math/Max.md +1 -1
- package/docs/Microsoft.Quantum.Math/MaxD.md +1 -1
- package/docs/Microsoft.Quantum.Math/MaxI.md +1 -1
- package/docs/Microsoft.Quantum.Math/MaxL.md +1 -1
- package/docs/Microsoft.Quantum.Math/Min.md +1 -1
- package/docs/Microsoft.Quantum.Math/MinD.md +1 -1
- package/docs/Microsoft.Quantum.Math/MinI.md +1 -1
- package/docs/Microsoft.Quantum.Math/MinL.md +1 -1
- package/docs/Microsoft.Quantum.Math/MinusC.md +1 -1
- package/docs/Microsoft.Quantum.Math/MinusCP.md +1 -1
- package/docs/Microsoft.Quantum.Math/ModulusI.md +1 -1
- package/docs/Microsoft.Quantum.Math/ModulusL.md +1 -1
- package/docs/Microsoft.Quantum.Math/NegationC.md +1 -1
- package/docs/Microsoft.Quantum.Math/NegationCP.md +1 -1
- package/docs/Microsoft.Quantum.Math/PI.md +1 -1
- package/docs/Microsoft.Quantum.Math/PNorm.md +1 -1
- package/docs/Microsoft.Quantum.Math/PNormalized.md +1 -1
- package/docs/Microsoft.Quantum.Math/PlusC.md +1 -1
- package/docs/Microsoft.Quantum.Math/PlusCP.md +1 -1
- package/docs/Microsoft.Quantum.Math/PowC.md +1 -1
- package/docs/Microsoft.Quantum.Math/PowCP.md +1 -1
- package/docs/Microsoft.Quantum.Math/RealMod.md +1 -1
- package/docs/Microsoft.Quantum.Math/Round.md +1 -1
- package/docs/Microsoft.Quantum.Math/SignD.md +1 -1
- package/docs/Microsoft.Quantum.Math/SignI.md +1 -1
- package/docs/Microsoft.Quantum.Math/SignL.md +1 -1
- package/docs/Microsoft.Quantum.Math/Sin.md +1 -1
- package/docs/Microsoft.Quantum.Math/Sinh.md +1 -1
- package/docs/Microsoft.Quantum.Math/SmallestFixedPoint.md +1 -1
- package/docs/Microsoft.Quantum.Math/Sqrt.md +1 -1
- package/docs/Microsoft.Quantum.Math/SquaredNorm.md +1 -1
- package/docs/Microsoft.Quantum.Math/Tan.md +1 -1
- package/docs/Microsoft.Quantum.Math/Tanh.md +1 -1
- package/docs/Microsoft.Quantum.Math/TimesC.md +1 -1
- package/docs/Microsoft.Quantum.Math/TimesCP.md +1 -1
- package/docs/Microsoft.Quantum.Math/TrailingZeroCountI.md +1 -1
- package/docs/Microsoft.Quantum.Math/TrailingZeroCountL.md +1 -1
- package/docs/Microsoft.Quantum.Math/Truncate.md +1 -1
- package/docs/Microsoft.Quantum.Measurement/MResetEachZ.md +1 -1
- package/docs/Microsoft.Quantum.Measurement/MResetX.md +1 -1
- package/docs/Microsoft.Quantum.Measurement/MResetY.md +1 -1
- package/docs/Microsoft.Quantum.Measurement/MResetZ.md +1 -1
- package/docs/Microsoft.Quantum.Measurement/MeasureAllZ.md +1 -1
- package/docs/Microsoft.Quantum.Measurement/MeasureEachZ.md +1 -1
- package/docs/Microsoft.Quantum.Measurement/MeasureInteger.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/AccountForEstimates.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/AuxQubitCount.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/BeginEstimateCaching.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/BeginRepeatEstimates.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/CczCount.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/EndEstimateCaching.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/EndRepeatEstimates.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/MeasurementCount.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/PSSPCLayout.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/RepeatEstimates.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/RotationCount.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/RotationDepth.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/SingleVariant.md +1 -1
- package/docs/Microsoft.Quantum.ResourceEstimation/TCount.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/AddLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/ApplyIfEqualL.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/ApplyIfEqualLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/ApplyIfGreaterL.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/ApplyIfGreaterLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/ApplyIfLessL.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/ApplyIfLessLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/FourierTDIncByLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/IncByI.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/IncByIUsingIncByLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/IncByL.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/IncByLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/IncByLEUsingAddLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/IncByLUsingIncByLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/LookAheadDKRSAddLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/MAJ.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/ReflectAboutInteger.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/RippleCarryCGAddLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/RippleCarryCGIncByLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.StatePreparation/PreparePureStateD.md +1 -1
- package/docs/Microsoft.Quantum.Unstable.TableLookup/Select.md +1 -1
- package/lib/node/qsc_wasm.cjs +133 -152
- package/lib/node/qsc_wasm.d.cts +62 -36
- package/lib/node/qsc_wasm_bg.wasm +0 -0
- package/lib/web/qsc_wasm.d.ts +71 -45
- package/lib/web/qsc_wasm.js +126 -150
- package/lib/web/qsc_wasm_bg.wasm +0 -0
- package/package.json +1 -1
- package/ux/estimatesOverview.tsx +2 -0
- package/ux/estimatesPanel.tsx +2 -0
- package/ux/qsharp-ux.css +30 -5
- package/ux/saveImage.tsx +107 -0
- package/ux/saveImageUtil.tsx +72 -0
- package/ux/scatterChart.tsx +31 -0
package/ux/saveImage.tsx
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
|
|
4
|
+
// Writes resource estimator output to PNG file
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
getImageSize,
|
|
8
|
+
createImage,
|
|
9
|
+
nodeToDataURI,
|
|
10
|
+
toArray,
|
|
11
|
+
} from "./saveImageUtil.js";
|
|
12
|
+
|
|
13
|
+
async function cloneSingleNode<T extends HTMLElement>(
|
|
14
|
+
node: T,
|
|
15
|
+
): Promise<HTMLElement> {
|
|
16
|
+
return node.cloneNode(false) as T;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function cloneChildren<T extends HTMLElement>(
|
|
20
|
+
nativeNode: T,
|
|
21
|
+
clonedNode: T,
|
|
22
|
+
): Promise<T> {
|
|
23
|
+
let children: T[] = [];
|
|
24
|
+
children = toArray<T>((nativeNode.shadowRoot ?? nativeNode).childNodes);
|
|
25
|
+
|
|
26
|
+
// Depth-first traversal of DOM objects
|
|
27
|
+
await children.reduce(
|
|
28
|
+
(deferred, child) =>
|
|
29
|
+
deferred
|
|
30
|
+
.then(() => cloneNode(child))
|
|
31
|
+
.then((clonedChild: HTMLElement | null) => {
|
|
32
|
+
if (clonedChild) {
|
|
33
|
+
clonedNode.appendChild(clonedChild);
|
|
34
|
+
}
|
|
35
|
+
}),
|
|
36
|
+
Promise.resolve(),
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
return clonedNode;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function cloneCSSStyle<T extends HTMLElement>(nativeNode: T, clonedNode: T) {
|
|
43
|
+
const targetStyle = clonedNode.style;
|
|
44
|
+
if (!targetStyle) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const sourceStyle = window.getComputedStyle(nativeNode);
|
|
49
|
+
toArray<string>(sourceStyle).forEach((name) => {
|
|
50
|
+
const value = sourceStyle.getPropertyValue(name);
|
|
51
|
+
targetStyle.setProperty(name, value, sourceStyle.getPropertyPriority(name));
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function decorate<T extends HTMLElement>(nativeNode: T, clonedNode: T): T {
|
|
56
|
+
cloneCSSStyle(nativeNode, clonedNode);
|
|
57
|
+
return clonedNode;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function cloneNode<T extends HTMLElement>(node: T): Promise<T | null> {
|
|
61
|
+
return Promise.resolve(node)
|
|
62
|
+
.then((clonedNode) => cloneSingleNode(clonedNode) as Promise<T>)
|
|
63
|
+
.then((clonedNode) => cloneChildren(node, clonedNode))
|
|
64
|
+
.then((clonedNode) => decorate(node, clonedNode));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function saveToPng<T extends HTMLElement>(
|
|
68
|
+
node: T,
|
|
69
|
+
backgroundColor: string,
|
|
70
|
+
): Promise<string> {
|
|
71
|
+
const { width, height } = getImageSize(node);
|
|
72
|
+
const clonedNode = (await cloneNode(node)) as HTMLElement;
|
|
73
|
+
const uri = await nodeToDataURI(clonedNode, width, height);
|
|
74
|
+
const img = await createImage(uri);
|
|
75
|
+
|
|
76
|
+
const ratio = window.devicePixelRatio || 1;
|
|
77
|
+
const canvas = document.createElement("canvas");
|
|
78
|
+
canvas.width = width * ratio;
|
|
79
|
+
canvas.height = height * ratio;
|
|
80
|
+
|
|
81
|
+
const context = canvas.getContext("2d")!;
|
|
82
|
+
context.fillStyle = backgroundColor;
|
|
83
|
+
context.fillRect(0, 0, canvas.width, canvas.height);
|
|
84
|
+
|
|
85
|
+
context.drawImage(img, 0, 0, canvas.width, canvas.height);
|
|
86
|
+
return canvas.toDataURL();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export async function saveToImage<T extends HTMLElement>(
|
|
90
|
+
element: T,
|
|
91
|
+
filename = "image.png",
|
|
92
|
+
) {
|
|
93
|
+
const backgroundColor =
|
|
94
|
+
getComputedStyle(element).getPropertyValue("--main-background");
|
|
95
|
+
const data = await saveToPng(element, backgroundColor);
|
|
96
|
+
const link = document.createElement("a");
|
|
97
|
+
if (typeof link.download === "string") {
|
|
98
|
+
link.href = data;
|
|
99
|
+
link.download = filename;
|
|
100
|
+
|
|
101
|
+
document.body.appendChild(link);
|
|
102
|
+
link.click();
|
|
103
|
+
document.body.removeChild(link);
|
|
104
|
+
} else {
|
|
105
|
+
window.open(data);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
|
|
4
|
+
export function toArray<T>(arrayLike: any): T[] {
|
|
5
|
+
const arr: T[] = [];
|
|
6
|
+
for (let i = 0, l = arrayLike.length; i < l; i++) {
|
|
7
|
+
arr.push(arrayLike[i]);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return arr;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function px<T extends HTMLElement>(node: T, styleProperty: string) {
|
|
14
|
+
const win = node.ownerDocument.defaultView || window;
|
|
15
|
+
const val = win.getComputedStyle(node).getPropertyValue(styleProperty);
|
|
16
|
+
return val ? parseFloat(val.replace("px", "")) : 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function getImageSize<T extends HTMLElement>(node: T) {
|
|
20
|
+
const leftBorder = px(node, "border-left-width");
|
|
21
|
+
const rightBorder = px(node, "border-right-width");
|
|
22
|
+
const topBorder = px(node, "border-top-width");
|
|
23
|
+
const bottomBorder = px(node, "border-bottom-width");
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
width: node.clientWidth + leftBorder + rightBorder,
|
|
27
|
+
height: node.clientHeight + topBorder + bottomBorder + 12, // Fixes up truncated region
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function createImage(url: string): Promise<HTMLImageElement> {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const img = new Image();
|
|
34
|
+
img.decode = () => resolve(img) as any;
|
|
35
|
+
img.onload = () => resolve(img);
|
|
36
|
+
img.onerror = reject;
|
|
37
|
+
img.crossOrigin = "anonymous";
|
|
38
|
+
img.decoding = "async";
|
|
39
|
+
img.src = url;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function svgToDataURI(svg: Element): Promise<string> {
|
|
44
|
+
return Promise.resolve()
|
|
45
|
+
.then(() => new XMLSerializer().serializeToString(svg))
|
|
46
|
+
.then(encodeURIComponent)
|
|
47
|
+
.then((html) => `data:image/svg+xml;charset=utf-8,${html}`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export async function nodeToDataURI(
|
|
51
|
+
node: HTMLElement,
|
|
52
|
+
width: number,
|
|
53
|
+
height: number,
|
|
54
|
+
): Promise<string> {
|
|
55
|
+
const xmlns = "http://www.w3.org/2000/svg";
|
|
56
|
+
const svg = document.createElementNS(xmlns, "svg");
|
|
57
|
+
const foreignObject = document.createElementNS(xmlns, "foreignObject");
|
|
58
|
+
|
|
59
|
+
svg.setAttribute("width", `${width}`);
|
|
60
|
+
svg.setAttribute("height", `${height}`);
|
|
61
|
+
svg.setAttribute("viewBox", `0 0 ${width} ${height}`);
|
|
62
|
+
|
|
63
|
+
foreignObject.setAttribute("width", "100%");
|
|
64
|
+
foreignObject.setAttribute("height", "100%");
|
|
65
|
+
foreignObject.setAttribute("x", "0");
|
|
66
|
+
foreignObject.setAttribute("y", "0");
|
|
67
|
+
foreignObject.setAttribute("externalResourcesRequired", "true");
|
|
68
|
+
|
|
69
|
+
svg.appendChild(foreignObject);
|
|
70
|
+
foreignObject.appendChild(node);
|
|
71
|
+
return svgToDataURI(svg);
|
|
72
|
+
}
|
package/ux/scatterChart.tsx
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
// Licensed under the MIT License.
|
|
3
3
|
|
|
4
4
|
import { useRef, useEffect } from "preact/hooks";
|
|
5
|
+
import { createRef } from "preact";
|
|
5
6
|
import * as utils from "../src/utils.js";
|
|
7
|
+
import { saveToImage } from "./saveImage.js";
|
|
6
8
|
|
|
7
9
|
export type ScatterSeries = {
|
|
8
10
|
color: string;
|
|
@@ -31,6 +33,7 @@ export function ScatterChart(props: {
|
|
|
31
33
|
yAxis: Axis;
|
|
32
34
|
onPointSelected(seriesIndex: number, pointIndex: number): void;
|
|
33
35
|
selectedPoint?: [number, number];
|
|
36
|
+
allowSaveImage: boolean;
|
|
34
37
|
}) {
|
|
35
38
|
const selectedTooltipDiv = useRef<HTMLDivElement>(null);
|
|
36
39
|
|
|
@@ -154,6 +157,12 @@ export function ScatterChart(props: {
|
|
|
154
157
|
}
|
|
155
158
|
const selectedPoint = getSelectedPointData();
|
|
156
159
|
|
|
160
|
+
const saveRef = createRef();
|
|
161
|
+
|
|
162
|
+
const handleSaveImage = async () => {
|
|
163
|
+
saveToImage(saveRef!.current);
|
|
164
|
+
};
|
|
165
|
+
|
|
157
166
|
// Need to render first to get the element layout to position the tooltip
|
|
158
167
|
useEffect(() => {
|
|
159
168
|
if (!selectedTooltipDiv.current) return;
|
|
@@ -182,6 +191,7 @@ export function ScatterChart(props: {
|
|
|
182
191
|
onMouseOver={(ev) => onPointMouseEvent(ev, "over")}
|
|
183
192
|
onMouseOut={(ev) => onPointMouseEvent(ev, "out")}
|
|
184
193
|
onClick={(ev) => onPointMouseEvent(ev, "click")}
|
|
194
|
+
ref={saveRef}
|
|
185
195
|
>
|
|
186
196
|
<line
|
|
187
197
|
class="qs-scatterChart-axis"
|
|
@@ -316,6 +326,27 @@ export function ScatterChart(props: {
|
|
|
316
326
|
</svg>
|
|
317
327
|
<div class="qs-scatterChart-selectedInfo" ref={selectedTooltipDiv}></div>
|
|
318
328
|
<div class="qs-scatterChart-tooltip"></div>
|
|
329
|
+
{props.allowSaveImage ? (
|
|
330
|
+
<button
|
|
331
|
+
role="button"
|
|
332
|
+
onClick={handleSaveImage}
|
|
333
|
+
className={"qs-estimatesOverview-saveIcon"}
|
|
334
|
+
>
|
|
335
|
+
<span>
|
|
336
|
+
<svg
|
|
337
|
+
width="75%"
|
|
338
|
+
height="75%"
|
|
339
|
+
viewBox="0 0 16 16"
|
|
340
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
341
|
+
>
|
|
342
|
+
<path
|
|
343
|
+
className={"qs-estimatesOverview-saveIconSvgPath"}
|
|
344
|
+
d="M12.0147 2.8595L13.1397 3.9845L13.25 4.25V12.875L12.875 13.25H3.125L2.75 12.875V3.125L3.125 2.75H11.75L12.0147 2.8595ZM3.5 3.5V12.5H12.5V4.406L11.5947 3.5H10.25V6.5H5V3.5H3.5ZM8 3.5V5.75H9.5V3.5H8Z"
|
|
345
|
+
/>
|
|
346
|
+
</svg>
|
|
347
|
+
</span>
|
|
348
|
+
</button>
|
|
349
|
+
) : null}
|
|
319
350
|
</div>
|
|
320
351
|
);
|
|
321
352
|
}
|