@twick/2d 0.11.0
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/LICENSE +21 -0
- package/editor/editor/NodeInspectorConfig.d.ts +3 -0
- package/editor/editor/NodeInspectorConfig.d.ts.map +1 -0
- package/editor/editor/PreviewOverlayConfig.d.ts +3 -0
- package/editor/editor/PreviewOverlayConfig.d.ts.map +1 -0
- package/editor/editor/Provider.d.ts +17 -0
- package/editor/editor/Provider.d.ts.map +1 -0
- package/editor/editor/SceneGraphTabConfig.d.ts +3 -0
- package/editor/editor/SceneGraphTabConfig.d.ts.map +1 -0
- package/editor/editor/icons/CircleIcon.d.ts +2 -0
- package/editor/editor/icons/CircleIcon.d.ts.map +1 -0
- package/editor/editor/icons/CodeBlockIcon.d.ts +2 -0
- package/editor/editor/icons/CodeBlockIcon.d.ts.map +1 -0
- package/editor/editor/icons/CurveIcon.d.ts +2 -0
- package/editor/editor/icons/CurveIcon.d.ts.map +1 -0
- package/editor/editor/icons/GridIcon.d.ts +2 -0
- package/editor/editor/icons/GridIcon.d.ts.map +1 -0
- package/editor/editor/icons/IconMap.d.ts +3 -0
- package/editor/editor/icons/IconMap.d.ts.map +1 -0
- package/editor/editor/icons/ImgIcon.d.ts +2 -0
- package/editor/editor/icons/ImgIcon.d.ts.map +1 -0
- package/editor/editor/icons/LayoutIcon.d.ts +2 -0
- package/editor/editor/icons/LayoutIcon.d.ts.map +1 -0
- package/editor/editor/icons/LineIcon.d.ts +2 -0
- package/editor/editor/icons/LineIcon.d.ts.map +1 -0
- package/editor/editor/icons/NodeIcon.d.ts +2 -0
- package/editor/editor/icons/NodeIcon.d.ts.map +1 -0
- package/editor/editor/icons/RayIcon.d.ts +2 -0
- package/editor/editor/icons/RayIcon.d.ts.map +1 -0
- package/editor/editor/icons/RectIcon.d.ts +2 -0
- package/editor/editor/icons/RectIcon.d.ts.map +1 -0
- package/editor/editor/icons/ShapeIcon.d.ts +2 -0
- package/editor/editor/icons/ShapeIcon.d.ts.map +1 -0
- package/editor/editor/icons/TxtIcon.d.ts +2 -0
- package/editor/editor/icons/TxtIcon.d.ts.map +1 -0
- package/editor/editor/icons/VideoIcon.d.ts +2 -0
- package/editor/editor/icons/VideoIcon.d.ts.map +1 -0
- package/editor/editor/icons/View2DIcon.d.ts +2 -0
- package/editor/editor/icons/View2DIcon.d.ts.map +1 -0
- package/editor/editor/index.d.ts +4 -0
- package/editor/editor/index.d.ts.map +1 -0
- package/editor/editor/tree/DetachedRoot.d.ts +2 -0
- package/editor/editor/tree/DetachedRoot.d.ts.map +1 -0
- package/editor/editor/tree/NodeElement.d.ts +8 -0
- package/editor/editor/tree/NodeElement.d.ts.map +1 -0
- package/editor/editor/tree/TreeElement.d.ts +15 -0
- package/editor/editor/tree/TreeElement.d.ts.map +1 -0
- package/editor/editor/tree/TreeRoot.d.ts +3 -0
- package/editor/editor/tree/TreeRoot.d.ts.map +1 -0
- package/editor/editor/tree/ViewRoot.d.ts +2 -0
- package/editor/editor/tree/ViewRoot.d.ts.map +1 -0
- package/editor/editor/tree/index.d.ts +4 -0
- package/editor/editor/tree/index.d.ts.map +1 -0
- package/editor/editor/tsconfig.build.tsbuildinfo +1 -0
- package/editor/index.css +33 -0
- package/editor/index.js +341 -0
- package/editor/index.js.map +1 -0
- package/lib/code/CodeCursor.d.ts +83 -0
- package/lib/code/CodeCursor.d.ts.map +1 -0
- package/lib/code/CodeCursor.js +306 -0
- package/lib/code/CodeDiffer.d.ts +28 -0
- package/lib/code/CodeDiffer.d.ts.map +1 -0
- package/lib/code/CodeDiffer.js +51 -0
- package/lib/code/CodeFragment.d.ts +42 -0
- package/lib/code/CodeFragment.d.ts.map +1 -0
- package/lib/code/CodeFragment.js +72 -0
- package/lib/code/CodeHighlighter.d.ts +71 -0
- package/lib/code/CodeHighlighter.d.ts.map +1 -0
- package/lib/code/CodeHighlighter.js +2 -0
- package/lib/code/CodeMetrics.d.ts +11 -0
- package/lib/code/CodeMetrics.d.ts.map +1 -0
- package/lib/code/CodeMetrics.js +29 -0
- package/lib/code/CodeRange.d.ts +41 -0
- package/lib/code/CodeRange.d.ts.map +1 -0
- package/lib/code/CodeRange.js +179 -0
- package/lib/code/CodeScope.d.ts +16 -0
- package/lib/code/CodeScope.d.ts.map +1 -0
- package/lib/code/CodeScope.js +72 -0
- package/lib/code/CodeSelection.d.ts +6 -0
- package/lib/code/CodeSelection.d.ts.map +1 -0
- package/lib/code/CodeSelection.js +13 -0
- package/lib/code/CodeSignal.d.ts +60 -0
- package/lib/code/CodeSignal.d.ts.map +1 -0
- package/lib/code/CodeSignal.js +194 -0
- package/lib/code/CodeTokenizer.d.ts +8 -0
- package/lib/code/CodeTokenizer.d.ts.map +1 -0
- package/lib/code/CodeTokenizer.js +50 -0
- package/lib/code/DefaultHighlightStyle.d.ts +3 -0
- package/lib/code/DefaultHighlightStyle.d.ts.map +1 -0
- package/lib/code/DefaultHighlightStyle.js +98 -0
- package/lib/code/LezerHighlighter.d.ts +22 -0
- package/lib/code/LezerHighlighter.d.ts.map +1 -0
- package/lib/code/LezerHighlighter.js +89 -0
- package/lib/code/diff.d.ts +31 -0
- package/lib/code/diff.d.ts.map +1 -0
- package/lib/code/diff.js +236 -0
- package/lib/code/extractRange.d.ts +17 -0
- package/lib/code/extractRange.d.ts.map +1 -0
- package/lib/code/extractRange.js +102 -0
- package/lib/code/index.d.ts +14 -0
- package/lib/code/index.d.ts.map +1 -0
- package/lib/code/index.js +14 -0
- package/lib/components/Audio.d.ts +14 -0
- package/lib/components/Audio.d.ts.map +1 -0
- package/lib/components/Audio.js +118 -0
- package/lib/components/Bezier.d.ts +23 -0
- package/lib/components/Bezier.d.ts.map +1 -0
- package/lib/components/Bezier.js +81 -0
- package/lib/components/Circle.d.ts +193 -0
- package/lib/components/Circle.d.ts.map +1 -0
- package/lib/components/Circle.js +178 -0
- package/lib/components/Code.d.ts +231 -0
- package/lib/components/Code.d.ts.map +1 -0
- package/lib/components/Code.js +325 -0
- package/lib/components/CodeBlock.d.ts +133 -0
- package/lib/components/CodeBlock.d.ts.map +1 -0
- package/lib/components/CodeBlock.js +461 -0
- package/lib/components/CubicBezier.d.ts +70 -0
- package/lib/components/CubicBezier.d.ts.map +1 -0
- package/lib/components/CubicBezier.js +81 -0
- package/lib/components/Curve.d.ts +204 -0
- package/lib/components/Curve.d.ts.map +1 -0
- package/lib/components/Curve.js +284 -0
- package/lib/components/Grid.d.ts +76 -0
- package/lib/components/Grid.d.ts.map +1 -0
- package/lib/components/Grid.js +91 -0
- package/lib/components/Icon.d.ts +59 -0
- package/lib/components/Icon.d.ts.map +1 -0
- package/lib/components/Icon.js +58 -0
- package/lib/components/Img.d.ts +118 -0
- package/lib/components/Img.d.ts.map +1 -0
- package/lib/components/Img.js +245 -0
- package/lib/components/Knot.d.ts +90 -0
- package/lib/components/Knot.d.ts.map +1 -0
- package/lib/components/Knot.js +68 -0
- package/lib/components/Latex.d.ts +39 -0
- package/lib/components/Latex.d.ts.map +1 -0
- package/lib/components/Latex.js +101 -0
- package/lib/components/Layout.d.ts +419 -0
- package/lib/components/Layout.d.ts.map +1 -0
- package/lib/components/Layout.js +706 -0
- package/lib/components/Line.d.ts +160 -0
- package/lib/components/Line.d.ts.map +1 -0
- package/lib/components/Line.js +346 -0
- package/lib/components/Media.d.ts +65 -0
- package/lib/components/Media.d.ts.map +1 -0
- package/lib/components/Media.js +303 -0
- package/lib/components/Node.d.ts +836 -0
- package/lib/components/Node.d.ts.map +1 -0
- package/lib/components/Node.js +1317 -0
- package/lib/components/Path.d.ts +20 -0
- package/lib/components/Path.d.ts.map +1 -0
- package/lib/components/Path.js +97 -0
- package/lib/components/Polygon.d.ts +113 -0
- package/lib/components/Polygon.d.ts.map +1 -0
- package/lib/components/Polygon.js +123 -0
- package/lib/components/QuadBezier.d.ts +62 -0
- package/lib/components/QuadBezier.d.ts.map +1 -0
- package/lib/components/QuadBezier.js +76 -0
- package/lib/components/Ray.d.ts +62 -0
- package/lib/components/Ray.d.ts.map +1 -0
- package/lib/components/Ray.js +96 -0
- package/lib/components/Rect.d.ts +114 -0
- package/lib/components/Rect.d.ts.map +1 -0
- package/lib/components/Rect.js +76 -0
- package/lib/components/Rive.d.ts +22 -0
- package/lib/components/Rive.d.ts.map +1 -0
- package/lib/components/Rive.js +117 -0
- package/lib/components/SVG.d.ts +178 -0
- package/lib/components/SVG.d.ts.map +1 -0
- package/lib/components/SVG.js +577 -0
- package/lib/components/Shape.d.ts +40 -0
- package/lib/components/Shape.d.ts.map +1 -0
- package/lib/components/Shape.js +134 -0
- package/lib/components/Spline.d.ts +89 -0
- package/lib/components/Spline.d.ts.map +1 -0
- package/lib/components/Spline.js +256 -0
- package/lib/components/Txt.d.ts +53 -0
- package/lib/components/Txt.d.ts.map +1 -0
- package/lib/components/Txt.js +173 -0
- package/lib/components/TxtLeaf.d.ts +21 -0
- package/lib/components/TxtLeaf.d.ts.map +1 -0
- package/lib/components/TxtLeaf.js +181 -0
- package/lib/components/Video.d.ts +69 -0
- package/lib/components/Video.d.ts.map +1 -0
- package/lib/components/Video.js +283 -0
- package/lib/components/View2D.d.ts +28 -0
- package/lib/components/View2D.d.ts.map +1 -0
- package/lib/components/View2D.js +93 -0
- package/lib/components/index.d.ts +29 -0
- package/lib/components/index.d.ts.map +1 -0
- package/lib/components/index.js +29 -0
- package/lib/components/types.d.ts +17 -0
- package/lib/components/types.d.ts.map +1 -0
- package/lib/components/types.js +2 -0
- package/lib/curves/ArcSegment.d.ts +26 -0
- package/lib/curves/ArcSegment.d.ts.map +1 -0
- package/lib/curves/ArcSegment.js +97 -0
- package/lib/curves/CircleSegment.d.ts +18 -0
- package/lib/curves/CircleSegment.d.ts.map +1 -0
- package/lib/curves/CircleSegment.js +52 -0
- package/lib/curves/CubicBezierSegment.d.ts +18 -0
- package/lib/curves/CubicBezierSegment.d.ts.map +1 -0
- package/lib/curves/CubicBezierSegment.js +55 -0
- package/lib/curves/CurveDrawingInfo.d.ts +11 -0
- package/lib/curves/CurveDrawingInfo.d.ts.map +1 -0
- package/lib/curves/CurveDrawingInfo.js +2 -0
- package/lib/curves/CurvePoint.d.ts +15 -0
- package/lib/curves/CurvePoint.d.ts.map +1 -0
- package/lib/curves/CurvePoint.js +2 -0
- package/lib/curves/CurveProfile.d.ts +7 -0
- package/lib/curves/CurveProfile.d.ts.map +1 -0
- package/lib/curves/CurveProfile.js +2 -0
- package/lib/curves/KnotInfo.d.ts +12 -0
- package/lib/curves/KnotInfo.d.ts.map +1 -0
- package/lib/curves/KnotInfo.js +2 -0
- package/lib/curves/LineSegment.d.ts +16 -0
- package/lib/curves/LineSegment.d.ts.map +1 -0
- package/lib/curves/LineSegment.js +45 -0
- package/lib/curves/Polynomial.d.ts +118 -0
- package/lib/curves/Polynomial.d.ts.map +1 -0
- package/lib/curves/Polynomial.js +259 -0
- package/lib/curves/Polynomial2D.d.ts +22 -0
- package/lib/curves/Polynomial2D.d.ts.map +1 -0
- package/lib/curves/Polynomial2D.js +45 -0
- package/lib/curves/PolynomialSegment.d.ts +39 -0
- package/lib/curves/PolynomialSegment.d.ts.map +1 -0
- package/lib/curves/PolynomialSegment.js +86 -0
- package/lib/curves/QuadBezierSegment.d.ts +17 -0
- package/lib/curves/QuadBezierSegment.d.ts.map +1 -0
- package/lib/curves/QuadBezierSegment.js +49 -0
- package/lib/curves/Segment.d.ts +9 -0
- package/lib/curves/Segment.d.ts.map +1 -0
- package/lib/curves/Segment.js +3 -0
- package/lib/curves/UniformPolynomialCurveSampler.d.ts +43 -0
- package/lib/curves/UniformPolynomialCurveSampler.d.ts.map +1 -0
- package/lib/curves/UniformPolynomialCurveSampler.js +73 -0
- package/lib/curves/createCurveProfileLerp.d.ts +32 -0
- package/lib/curves/createCurveProfileLerp.d.ts.map +1 -0
- package/lib/curves/createCurveProfileLerp.js +351 -0
- package/lib/curves/getBezierSplineProfile.d.ts +12 -0
- package/lib/curves/getBezierSplineProfile.d.ts.map +1 -0
- package/lib/curves/getBezierSplineProfile.js +137 -0
- package/lib/curves/getCircleProfile.d.ts +4 -0
- package/lib/curves/getCircleProfile.d.ts.map +1 -0
- package/lib/curves/getCircleProfile.js +44 -0
- package/lib/curves/getPathProfile.d.ts +3 -0
- package/lib/curves/getPathProfile.d.ts.map +1 -0
- package/lib/curves/getPathProfile.js +128 -0
- package/lib/curves/getPointAtDistance.d.ts +4 -0
- package/lib/curves/getPointAtDistance.d.ts.map +1 -0
- package/lib/curves/getPointAtDistance.js +15 -0
- package/lib/curves/getPolylineProfile.d.ts +4 -0
- package/lib/curves/getPolylineProfile.d.ts.map +1 -0
- package/lib/curves/getPolylineProfile.js +58 -0
- package/lib/curves/getRectProfile.d.ts +4 -0
- package/lib/curves/getRectProfile.d.ts.map +1 -0
- package/lib/curves/getRectProfile.js +57 -0
- package/lib/curves/index.d.ts +17 -0
- package/lib/curves/index.d.ts.map +1 -0
- package/lib/curves/index.js +17 -0
- package/lib/decorators/canvasStyleSignal.d.ts +5 -0
- package/lib/decorators/canvasStyleSignal.d.ts.map +1 -0
- package/lib/decorators/canvasStyleSignal.js +12 -0
- package/lib/decorators/colorSignal.d.ts +2 -0
- package/lib/decorators/colorSignal.d.ts.map +1 -0
- package/lib/decorators/colorSignal.js +9 -0
- package/lib/decorators/compound.d.ts +26 -0
- package/lib/decorators/compound.d.ts.map +1 -0
- package/lib/decorators/compound.js +49 -0
- package/lib/decorators/computed.d.ts +9 -0
- package/lib/decorators/computed.d.ts.map +1 -0
- package/lib/decorators/computed.js +18 -0
- package/lib/decorators/defaultStyle.d.ts +2 -0
- package/lib/decorators/defaultStyle.d.ts.map +1 -0
- package/lib/decorators/defaultStyle.js +14 -0
- package/lib/decorators/filtersSignal.d.ts +13 -0
- package/lib/decorators/filtersSignal.d.ts.map +1 -0
- package/lib/decorators/filtersSignal.js +73 -0
- package/lib/decorators/index.d.ts +11 -0
- package/lib/decorators/index.d.ts.map +1 -0
- package/lib/decorators/index.js +11 -0
- package/lib/decorators/initializers.d.ts +4 -0
- package/lib/decorators/initializers.d.ts.map +1 -0
- package/lib/decorators/initializers.js +27 -0
- package/lib/decorators/nodeName.d.ts +9 -0
- package/lib/decorators/nodeName.d.ts.map +1 -0
- package/lib/decorators/nodeName.js +13 -0
- package/lib/decorators/signal.d.ts +183 -0
- package/lib/decorators/signal.d.ts.map +1 -0
- package/lib/decorators/signal.js +285 -0
- package/lib/decorators/spacingSignal.d.ts +2 -0
- package/lib/decorators/spacingSignal.d.ts.map +1 -0
- package/lib/decorators/spacingSignal.js +15 -0
- package/lib/decorators/vector2Signal.d.ts +9 -0
- package/lib/decorators/vector2Signal.d.ts.map +1 -0
- package/lib/decorators/vector2Signal.js +15 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +9 -0
- package/lib/jsx-dev-runtime.d.ts +3 -0
- package/lib/jsx-dev-runtime.d.ts.map +1 -0
- package/lib/jsx-dev-runtime.js +3 -0
- package/lib/jsx-runtime.d.ts +12 -0
- package/lib/jsx-runtime.d.ts.map +1 -0
- package/lib/jsx-runtime.js +23 -0
- package/lib/partials/Filter.d.ts +82 -0
- package/lib/partials/Filter.d.ts.map +1 -0
- package/lib/partials/Filter.js +135 -0
- package/lib/partials/Gradient.d.ts +31 -0
- package/lib/partials/Gradient.d.ts.map +1 -0
- package/lib/partials/Gradient.js +63 -0
- package/lib/partials/Pattern.d.ts +13 -0
- package/lib/partials/Pattern.d.ts.map +1 -0
- package/lib/partials/Pattern.js +27 -0
- package/lib/partials/ShaderConfig.d.ts +81 -0
- package/lib/partials/ShaderConfig.d.ts.map +1 -0
- package/lib/partials/ShaderConfig.js +25 -0
- package/lib/partials/index.d.ts +5 -0
- package/lib/partials/index.d.ts.map +1 -0
- package/lib/partials/index.js +5 -0
- package/lib/partials/types.d.ts +35 -0
- package/lib/partials/types.d.ts.map +1 -0
- package/lib/partials/types.js +2 -0
- package/lib/scenes/Scene2D.d.ts +29 -0
- package/lib/scenes/Scene2D.d.ts.map +1 -0
- package/lib/scenes/Scene2D.js +180 -0
- package/lib/scenes/index.d.ts +4 -0
- package/lib/scenes/index.d.ts.map +1 -0
- package/lib/scenes/index.js +4 -0
- package/lib/scenes/makeScene2D.d.ts +5 -0
- package/lib/scenes/makeScene2D.d.ts.map +1 -0
- package/lib/scenes/makeScene2D.js +11 -0
- package/lib/scenes/useScene2D.d.ts +3 -0
- package/lib/scenes/useScene2D.d.ts.map +1 -0
- package/lib/scenes/useScene2D.js +5 -0
- package/lib/tsconfig.build.tsbuildinfo +1 -0
- package/lib/utils/CanvasUtils.d.ts +23 -0
- package/lib/utils/CanvasUtils.d.ts.map +1 -0
- package/lib/utils/CanvasUtils.js +138 -0
- package/lib/utils/diff.d.ts +31 -0
- package/lib/utils/diff.d.ts.map +1 -0
- package/lib/utils/diff.js +97 -0
- package/lib/utils/index.d.ts +3 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +3 -0
- package/lib/utils/is.d.ts +8 -0
- package/lib/utils/is.d.ts.map +1 -0
- package/lib/utils/is.js +10 -0
- package/lib/utils/makeSignalExtensions.d.ts +4 -0
- package/lib/utils/makeSignalExtensions.d.ts.map +1 -0
- package/lib/utils/makeSignalExtensions.js +20 -0
- package/lib/utils/video/ffmpeg-client.d.ts +5 -0
- package/lib/utils/video/ffmpeg-client.d.ts.map +1 -0
- package/lib/utils/video/ffmpeg-client.js +32 -0
- package/lib/utils/video/mp4-parser-manager.d.ts +3 -0
- package/lib/utils/video/mp4-parser-manager.d.ts.map +1 -0
- package/lib/utils/video/mp4-parser-manager.js +55 -0
- package/lib/utils/video/parser/index.d.ts +2 -0
- package/lib/utils/video/parser/index.d.ts.map +1 -0
- package/lib/utils/video/parser/index.js +2 -0
- package/lib/utils/video/parser/parser.d.ts +21 -0
- package/lib/utils/video/parser/parser.d.ts.map +1 -0
- package/lib/utils/video/parser/parser.js +168 -0
- package/lib/utils/video/parser/sampler.d.ts +16 -0
- package/lib/utils/video/parser/sampler.d.ts.map +1 -0
- package/lib/utils/video/parser/sampler.js +56 -0
- package/lib/utils/video/parser/segment.d.ts +48 -0
- package/lib/utils/video/parser/segment.d.ts.map +1 -0
- package/lib/utils/video/parser/segment.js +239 -0
- package/lib/utils/video/parser/sink.d.ts +9 -0
- package/lib/utils/video/parser/sink.d.ts.map +1 -0
- package/lib/utils/video/parser/sink.js +22 -0
- package/lib/utils/video/parser/utils.d.ts +10 -0
- package/lib/utils/video/parser/utils.d.ts.map +1 -0
- package/lib/utils/video/parser/utils.js +22 -0
- package/package.json +53 -0
- package/src/editor/NodeInspectorConfig.tsx +76 -0
- package/src/editor/PreviewOverlayConfig.tsx +67 -0
- package/src/editor/Provider.tsx +93 -0
- package/src/editor/SceneGraphTabConfig.tsx +81 -0
- package/src/editor/icons/CircleIcon.tsx +7 -0
- package/src/editor/icons/CodeBlockIcon.tsx +8 -0
- package/src/editor/icons/CurveIcon.tsx +7 -0
- package/src/editor/icons/GridIcon.tsx +7 -0
- package/src/editor/icons/IconMap.ts +35 -0
- package/src/editor/icons/ImgIcon.tsx +8 -0
- package/src/editor/icons/LayoutIcon.tsx +9 -0
- package/src/editor/icons/LineIcon.tsx +7 -0
- package/src/editor/icons/NodeIcon.tsx +7 -0
- package/src/editor/icons/RayIcon.tsx +7 -0
- package/src/editor/icons/RectIcon.tsx +7 -0
- package/src/editor/icons/ShapeIcon.tsx +7 -0
- package/src/editor/icons/TxtIcon.tsx +8 -0
- package/src/editor/icons/VideoIcon.tsx +7 -0
- package/src/editor/icons/View2DIcon.tsx +10 -0
- package/src/editor/index.css +0 -0
- package/src/editor/index.ts +17 -0
- package/src/editor/tree/DetachedRoot.tsx +23 -0
- package/src/editor/tree/NodeElement.tsx +74 -0
- package/src/editor/tree/TreeElement.tsx +72 -0
- package/src/editor/tree/TreeRoot.tsx +10 -0
- package/src/editor/tree/ViewRoot.tsx +20 -0
- package/src/editor/tree/index.module.scss +38 -0
- package/src/editor/tree/index.ts +3 -0
- package/src/editor/tsconfig.build.json +5 -0
- package/src/editor/tsconfig.json +12 -0
- package/src/editor/tsdoc.json +4 -0
- package/src/editor/vite-env.d.ts +1 -0
- package/src/lib/code/CodeCursor.ts +445 -0
- package/src/lib/code/CodeDiffer.ts +78 -0
- package/src/lib/code/CodeFragment.ts +97 -0
- package/src/lib/code/CodeHighlighter.ts +75 -0
- package/src/lib/code/CodeMetrics.ts +47 -0
- package/src/lib/code/CodeRange.test.ts +74 -0
- package/src/lib/code/CodeRange.ts +216 -0
- package/src/lib/code/CodeScope.ts +101 -0
- package/src/lib/code/CodeSelection.ts +24 -0
- package/src/lib/code/CodeSignal.ts +327 -0
- package/src/lib/code/CodeTokenizer.ts +54 -0
- package/src/lib/code/DefaultHighlightStyle.ts +98 -0
- package/src/lib/code/LezerHighlighter.ts +113 -0
- package/src/lib/code/diff.test.ts +311 -0
- package/src/lib/code/diff.ts +319 -0
- package/src/lib/code/extractRange.ts +126 -0
- package/src/lib/code/index.ts +13 -0
- package/src/lib/components/Audio.ts +131 -0
- package/src/lib/components/Bezier.ts +105 -0
- package/src/lib/components/Circle.ts +266 -0
- package/src/lib/components/Code.ts +526 -0
- package/src/lib/components/CodeBlock.ts +576 -0
- package/src/lib/components/CubicBezier.ts +112 -0
- package/src/lib/components/Curve.ts +455 -0
- package/src/lib/components/Grid.ts +135 -0
- package/src/lib/components/Icon.ts +96 -0
- package/src/lib/components/Img.ts +319 -0
- package/src/lib/components/Knot.ts +157 -0
- package/src/lib/components/Latex.ts +122 -0
- package/src/lib/components/Layout.ts +1092 -0
- package/src/lib/components/Line.ts +429 -0
- package/src/lib/components/Media.ts +379 -0
- package/src/lib/components/Node.ts +1940 -0
- package/src/lib/components/Path.ts +137 -0
- package/src/lib/components/Polygon.ts +171 -0
- package/src/lib/components/QuadBezier.ts +100 -0
- package/src/lib/components/Ray.ts +125 -0
- package/src/lib/components/Rect.ts +187 -0
- package/src/lib/components/Rive.ts +156 -0
- package/src/lib/components/SVG.ts +797 -0
- package/src/lib/components/Shape.ts +143 -0
- package/src/lib/components/Spline.ts +344 -0
- package/src/lib/components/Txt.test.tsx +81 -0
- package/src/lib/components/Txt.ts +203 -0
- package/src/lib/components/TxtLeaf.ts +205 -0
- package/src/lib/components/Video.ts +397 -0
- package/src/lib/components/View2D.ts +98 -0
- package/src/lib/components/__tests__/children.test.tsx +142 -0
- package/src/lib/components/__tests__/clone.test.tsx +126 -0
- package/src/lib/components/__tests__/generatorTest.ts +28 -0
- package/src/lib/components/__tests__/mockScene2D.ts +45 -0
- package/src/lib/components/__tests__/query.test.tsx +122 -0
- package/src/lib/components/__tests__/state.test.tsx +60 -0
- package/src/lib/components/index.ts +28 -0
- package/src/lib/components/types.ts +35 -0
- package/src/lib/curves/ArcSegment.ts +159 -0
- package/src/lib/curves/CircleSegment.ts +77 -0
- package/src/lib/curves/CubicBezierSegment.ts +78 -0
- package/src/lib/curves/CurveDrawingInfo.ts +11 -0
- package/src/lib/curves/CurvePoint.ts +15 -0
- package/src/lib/curves/CurveProfile.ts +7 -0
- package/src/lib/curves/KnotInfo.ts +10 -0
- package/src/lib/curves/LineSegment.ts +62 -0
- package/src/lib/curves/Polynomial.ts +355 -0
- package/src/lib/curves/Polynomial2D.ts +62 -0
- package/src/lib/curves/PolynomialSegment.ts +124 -0
- package/src/lib/curves/QuadBezierSegment.ts +64 -0
- package/src/lib/curves/Segment.ts +17 -0
- package/src/lib/curves/UniformPolynomialCurveSampler.ts +94 -0
- package/src/lib/curves/createCurveProfileLerp.ts +471 -0
- package/src/lib/curves/getBezierSplineProfile.ts +223 -0
- package/src/lib/curves/getCircleProfile.ts +86 -0
- package/src/lib/curves/getPathProfile.ts +178 -0
- package/src/lib/curves/getPointAtDistance.ts +21 -0
- package/src/lib/curves/getPolylineProfile.test.ts +21 -0
- package/src/lib/curves/getPolylineProfile.ts +89 -0
- package/src/lib/curves/getRectProfile.ts +139 -0
- package/src/lib/curves/index.ts +16 -0
- package/src/lib/decorators/canvasStyleSignal.ts +16 -0
- package/src/lib/decorators/colorSignal.ts +9 -0
- package/src/lib/decorators/compound.ts +72 -0
- package/src/lib/decorators/computed.ts +18 -0
- package/src/lib/decorators/defaultStyle.ts +18 -0
- package/src/lib/decorators/filtersSignal.ts +136 -0
- package/src/lib/decorators/index.ts +10 -0
- package/src/lib/decorators/initializers.ts +32 -0
- package/src/lib/decorators/nodeName.ts +13 -0
- package/src/lib/decorators/signal.test.ts +90 -0
- package/src/lib/decorators/signal.ts +345 -0
- package/src/lib/decorators/spacingSignal.ts +15 -0
- package/src/lib/decorators/vector2Signal.ts +30 -0
- package/src/lib/globals.d.ts +2 -0
- package/src/lib/index.ts +8 -0
- package/src/lib/jsx-dev-runtime.ts +2 -0
- package/src/lib/jsx-runtime.ts +46 -0
- package/src/lib/parse-svg-path.d.ts +14 -0
- package/src/lib/partials/Filter.ts +180 -0
- package/src/lib/partials/Gradient.ts +102 -0
- package/src/lib/partials/Pattern.ts +34 -0
- package/src/lib/partials/ShaderConfig.ts +117 -0
- package/src/lib/partials/index.ts +4 -0
- package/src/lib/partials/types.ts +58 -0
- package/src/lib/scenes/Scene2D.ts +242 -0
- package/src/lib/scenes/index.ts +3 -0
- package/src/lib/scenes/makeScene2D.ts +16 -0
- package/src/lib/scenes/useScene2D.ts +6 -0
- package/src/lib/tsconfig.build.json +5 -0
- package/src/lib/tsconfig.json +10 -0
- package/src/lib/tsdoc.json +4 -0
- package/src/lib/utils/CanvasUtils.ts +306 -0
- package/src/lib/utils/diff.test.ts +453 -0
- package/src/lib/utils/diff.ts +148 -0
- package/src/lib/utils/index.ts +2 -0
- package/src/lib/utils/is.ts +11 -0
- package/src/lib/utils/makeSignalExtensions.ts +30 -0
- package/src/lib/utils/video/declarations.d.ts +1 -0
- package/src/lib/utils/video/ffmpeg-client.ts +50 -0
- package/src/lib/utils/video/mp4-parser-manager.ts +72 -0
- package/src/lib/utils/video/parser/index.ts +1 -0
- package/src/lib/utils/video/parser/parser.ts +257 -0
- package/src/lib/utils/video/parser/sampler.ts +72 -0
- package/src/lib/utils/video/parser/segment.ts +302 -0
- package/src/lib/utils/video/parser/sink.ts +29 -0
- package/src/lib/utils/video/parser/utils.ts +31 -0
- package/src/tsconfig.base.json +19 -0
- package/src/tsconfig.build.json +8 -0
- package/src/tsconfig.json +5 -0
- package/tsconfig.project.json +7 -0
|
@@ -0,0 +1,1317 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var Node_1;
|
|
8
|
+
import { BBox, DependencyContext, UNIFORM_DESTINATION_MATRIX, UNIFORM_SOURCE_MATRIX, UNIFORM_TIME, Vector2, all, clamp, createSignal, easeInOutCubic, isReactive, modify, threadable, transformAngle, transformScalar, transformVector, transformVectorAsPoint, unwrap, useLogger, } from '@twick/core';
|
|
9
|
+
import { cloneable, colorSignal, computed, getPropertiesOf, initial, initializeSignals, inspectable, nodeName, parser, signal, vector2Signal, wrapper, } from '../decorators';
|
|
10
|
+
import { filtersSignal } from '../decorators/filtersSignal';
|
|
11
|
+
import { spacingSignal } from '../decorators/spacingSignal';
|
|
12
|
+
import { parseShader } from '../partials/ShaderConfig';
|
|
13
|
+
import { useScene2D } from '../scenes/useScene2D';
|
|
14
|
+
import { drawLine } from '../utils';
|
|
15
|
+
let Node = Node_1 = class Node {
|
|
16
|
+
get x() {
|
|
17
|
+
return this.position.x;
|
|
18
|
+
}
|
|
19
|
+
get y() {
|
|
20
|
+
return this.position.y;
|
|
21
|
+
}
|
|
22
|
+
getAbsolutePosition() {
|
|
23
|
+
const matrix = this.localToWorld();
|
|
24
|
+
return new Vector2(matrix.m41, matrix.m42);
|
|
25
|
+
}
|
|
26
|
+
setAbsolutePosition(value) {
|
|
27
|
+
this.position(modify(value, unwrapped => transformVectorAsPoint(new Vector2(unwrapped), this.worldToParent())));
|
|
28
|
+
}
|
|
29
|
+
getAbsoluteRotation() {
|
|
30
|
+
const matrix = this.localToWorld();
|
|
31
|
+
return Vector2.degrees(matrix.m11, matrix.m12);
|
|
32
|
+
}
|
|
33
|
+
setAbsoluteRotation(value) {
|
|
34
|
+
this.rotation(modify(value, unwrapped => transformAngle(unwrapped, this.worldToParent())));
|
|
35
|
+
}
|
|
36
|
+
getAbsoluteScale() {
|
|
37
|
+
const matrix = this.localToWorld();
|
|
38
|
+
return new Vector2(Vector2.magnitude(matrix.m11, matrix.m12), Vector2.magnitude(matrix.m21, matrix.m22));
|
|
39
|
+
}
|
|
40
|
+
setAbsoluteScale(value) {
|
|
41
|
+
this.scale(modify(value, unwrapped => this.getRelativeScale(new Vector2(unwrapped))));
|
|
42
|
+
}
|
|
43
|
+
getRelativeScale(scale) {
|
|
44
|
+
const parentScale = this.parent()?.absoluteScale() ?? Vector2.one;
|
|
45
|
+
return scale.div(parentScale);
|
|
46
|
+
}
|
|
47
|
+
*tweenCompositeOperation(value, time, timingFunction) {
|
|
48
|
+
const nextValue = unwrap(value);
|
|
49
|
+
if (nextValue === 'source-over') {
|
|
50
|
+
yield* this.compositeOverride(1, time, timingFunction);
|
|
51
|
+
this.compositeOverride(0);
|
|
52
|
+
this.compositeOperation(nextValue);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.compositeOperation(nextValue);
|
|
56
|
+
this.compositeOverride(1);
|
|
57
|
+
yield* this.compositeOverride(0, time, timingFunction);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
absoluteOpacity() {
|
|
61
|
+
return (this.parent()?.absoluteOpacity() ?? 1) * this.opacity();
|
|
62
|
+
}
|
|
63
|
+
hasFilters() {
|
|
64
|
+
return !!this.filters().find(filter => filter.isActive());
|
|
65
|
+
}
|
|
66
|
+
hasShadow() {
|
|
67
|
+
return (!!this.shadowColor() &&
|
|
68
|
+
(this.shadowBlur() > 0 ||
|
|
69
|
+
this.shadowOffset.x() !== 0 ||
|
|
70
|
+
this.shadowOffset.y() !== 0));
|
|
71
|
+
}
|
|
72
|
+
filterString() {
|
|
73
|
+
let filters = '';
|
|
74
|
+
const matrix = this.compositeToWorld();
|
|
75
|
+
for (const filter of this.filters()) {
|
|
76
|
+
if (filter.isActive()) {
|
|
77
|
+
filters += ' ' + filter.serialize(matrix);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return filters;
|
|
81
|
+
}
|
|
82
|
+
getSpawner() {
|
|
83
|
+
return this.children();
|
|
84
|
+
}
|
|
85
|
+
setSpawner(value) {
|
|
86
|
+
this.children(value);
|
|
87
|
+
}
|
|
88
|
+
setChildren(value) {
|
|
89
|
+
if (this.children.context.raw() === value) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
this.children.context.setter(value);
|
|
93
|
+
if (!isReactive(value)) {
|
|
94
|
+
this.spawnChildren(false, value);
|
|
95
|
+
}
|
|
96
|
+
else if (!this.hasSpawnedChildren) {
|
|
97
|
+
for (const oldChild of this.realChildren) {
|
|
98
|
+
oldChild.parent(null);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
getChildren() {
|
|
103
|
+
this.children.context.getter();
|
|
104
|
+
return this.spawnedChildren();
|
|
105
|
+
}
|
|
106
|
+
spawnedChildren() {
|
|
107
|
+
const children = this.children.context.getter();
|
|
108
|
+
if (isReactive(this.children.context.raw())) {
|
|
109
|
+
this.spawnChildren(true, children);
|
|
110
|
+
}
|
|
111
|
+
return this.realChildren;
|
|
112
|
+
}
|
|
113
|
+
sortedChildren() {
|
|
114
|
+
return [...this.children()].sort((a, b) => Math.sign(a.zIndex() - b.zIndex()));
|
|
115
|
+
}
|
|
116
|
+
constructor({ children, spawner, key, ...rest }) {
|
|
117
|
+
this.compositeOverride = createSignal(0);
|
|
118
|
+
this.stateStack = [];
|
|
119
|
+
this.realChildren = [];
|
|
120
|
+
this.hasSpawnedChildren = false;
|
|
121
|
+
this.parent = createSignal(null);
|
|
122
|
+
this.properties = getPropertiesOf(this);
|
|
123
|
+
const scene = useScene2D();
|
|
124
|
+
[this.key, this.unregister] = scene.registerNode(this, key);
|
|
125
|
+
this.view2D = scene.getView();
|
|
126
|
+
this.creationStack = new Error().stack;
|
|
127
|
+
initializeSignals(this, rest);
|
|
128
|
+
if (spawner) {
|
|
129
|
+
useLogger().warn({
|
|
130
|
+
message: 'Node.spawner() has been deprecated.',
|
|
131
|
+
remarks: 'Use <code>Node.children()</code> instead.',
|
|
132
|
+
inspect: this.key,
|
|
133
|
+
stack: new Error().stack,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
this.children(spawner ?? children);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get the local-to-world matrix for this node.
|
|
140
|
+
*
|
|
141
|
+
* @remarks
|
|
142
|
+
* This matrix transforms vectors from local space of this node to world
|
|
143
|
+
* space.
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* Calculate the absolute position of a point located 200 pixels to the right
|
|
147
|
+
* of the node:
|
|
148
|
+
* ```ts
|
|
149
|
+
* const local = new Vector2(0, 200);
|
|
150
|
+
* const world = transformVectorAsPoint(local, node.localToWorld());
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
localToWorld() {
|
|
154
|
+
const parent = this.parent();
|
|
155
|
+
return parent
|
|
156
|
+
? parent.localToWorld().multiply(this.localToParent())
|
|
157
|
+
: this.localToParent();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get the world-to-local matrix for this node.
|
|
161
|
+
*
|
|
162
|
+
* @remarks
|
|
163
|
+
* This matrix transforms vectors from world space to local space of this
|
|
164
|
+
* node.
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* Calculate the position relative to this node for a point located in the
|
|
168
|
+
* top-left corner of the screen:
|
|
169
|
+
* ```ts
|
|
170
|
+
* const world = new Vector2(0, 0);
|
|
171
|
+
* const local = transformVectorAsPoint(world, node.worldToLocal());
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
worldToLocal() {
|
|
175
|
+
return this.localToWorld().inverse();
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get the world-to-parent matrix for this node.
|
|
179
|
+
*
|
|
180
|
+
* @remarks
|
|
181
|
+
* This matrix transforms vectors from world space to local space of this
|
|
182
|
+
* node's parent.
|
|
183
|
+
*/
|
|
184
|
+
worldToParent() {
|
|
185
|
+
return this.parent()?.worldToLocal() ?? new DOMMatrix();
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get the local-to-parent matrix for this node.
|
|
189
|
+
*
|
|
190
|
+
* @remarks
|
|
191
|
+
* This matrix transforms vectors from local space of this node to local space
|
|
192
|
+
* of this node's parent.
|
|
193
|
+
*/
|
|
194
|
+
localToParent() {
|
|
195
|
+
const matrix = new DOMMatrix();
|
|
196
|
+
matrix.translateSelf(this.x(), this.y());
|
|
197
|
+
matrix.rotateSelf(0, 0, this.rotation());
|
|
198
|
+
matrix.scaleSelf(this.scale.x(), this.scale.y());
|
|
199
|
+
matrix.skewXSelf(this.skew.x());
|
|
200
|
+
matrix.skewYSelf(this.skew.y());
|
|
201
|
+
return matrix;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* A matrix mapping composite space to world space.
|
|
205
|
+
*
|
|
206
|
+
* @remarks
|
|
207
|
+
* Certain effects such as blur and shadows ignore the current transformation.
|
|
208
|
+
* This matrix can be used to transform their parameters so that the effect
|
|
209
|
+
* appears relative to the closest composite root.
|
|
210
|
+
*/
|
|
211
|
+
compositeToWorld() {
|
|
212
|
+
return this.compositeRoot()?.localToWorld() ?? new DOMMatrix();
|
|
213
|
+
}
|
|
214
|
+
compositeRoot() {
|
|
215
|
+
if (this.composite()) {
|
|
216
|
+
return this;
|
|
217
|
+
}
|
|
218
|
+
return this.parent()?.compositeRoot() ?? null;
|
|
219
|
+
}
|
|
220
|
+
compositeToLocal() {
|
|
221
|
+
const root = this.compositeRoot();
|
|
222
|
+
if (root) {
|
|
223
|
+
const worldToLocal = this.worldToLocal();
|
|
224
|
+
worldToLocal.m44 = 1;
|
|
225
|
+
return root.localToWorld().multiply(worldToLocal);
|
|
226
|
+
}
|
|
227
|
+
return new DOMMatrix();
|
|
228
|
+
}
|
|
229
|
+
view() {
|
|
230
|
+
return this.view2D;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Add the given node(s) as the children of this node.
|
|
234
|
+
*
|
|
235
|
+
* @remarks
|
|
236
|
+
* The nodes will be appended at the end of the children list.
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* ```tsx
|
|
240
|
+
* const node = <Layout />;
|
|
241
|
+
* node.add(<Rect />);
|
|
242
|
+
* node.add(<Circle />);
|
|
243
|
+
* ```
|
|
244
|
+
* Result:
|
|
245
|
+
* ```mermaid
|
|
246
|
+
* graph TD;
|
|
247
|
+
* layout([Layout])
|
|
248
|
+
* circle([Circle])
|
|
249
|
+
* rect([Rect])
|
|
250
|
+
* layout-->rect;
|
|
251
|
+
* layout-->circle;
|
|
252
|
+
* ```
|
|
253
|
+
*
|
|
254
|
+
* @param node - A node or an array of nodes to append.
|
|
255
|
+
*/
|
|
256
|
+
add(node) {
|
|
257
|
+
return this.insert(node, Infinity);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Insert the given node(s) at the specified index in the children list.
|
|
261
|
+
*
|
|
262
|
+
* @example
|
|
263
|
+
* ```tsx
|
|
264
|
+
* const node = (
|
|
265
|
+
* <Layout>
|
|
266
|
+
* <Rect />
|
|
267
|
+
* <Circle />
|
|
268
|
+
* </Layout>
|
|
269
|
+
* );
|
|
270
|
+
*
|
|
271
|
+
* node.insert(<Txt />, 1);
|
|
272
|
+
* ```
|
|
273
|
+
*
|
|
274
|
+
* Result:
|
|
275
|
+
* ```mermaid
|
|
276
|
+
* graph TD;
|
|
277
|
+
* layout([Layout])
|
|
278
|
+
* circle([Circle])
|
|
279
|
+
* text([Text])
|
|
280
|
+
* rect([Rect])
|
|
281
|
+
* layout-->rect;
|
|
282
|
+
* layout-->text;
|
|
283
|
+
* layout-->circle;
|
|
284
|
+
* ```
|
|
285
|
+
*
|
|
286
|
+
* @param node - A node or an array of nodes to insert.
|
|
287
|
+
* @param index - An index at which to insert the node(s).
|
|
288
|
+
*/
|
|
289
|
+
insert(node, index = 0) {
|
|
290
|
+
const array = Array.isArray(node) ? node : [node];
|
|
291
|
+
if (array.length === 0) {
|
|
292
|
+
return this;
|
|
293
|
+
}
|
|
294
|
+
const children = this.children();
|
|
295
|
+
const newChildren = children.slice(0, index);
|
|
296
|
+
for (const node of array) {
|
|
297
|
+
if (node instanceof Node_1) {
|
|
298
|
+
newChildren.push(node);
|
|
299
|
+
node.remove();
|
|
300
|
+
node.parent(this);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
newChildren.push(...children.slice(index));
|
|
304
|
+
this.setParsedChildren(newChildren);
|
|
305
|
+
return this;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Remove this node from the tree.
|
|
309
|
+
*/
|
|
310
|
+
remove() {
|
|
311
|
+
const current = this.parent();
|
|
312
|
+
if (current === null) {
|
|
313
|
+
return this;
|
|
314
|
+
}
|
|
315
|
+
current.removeChild(this);
|
|
316
|
+
this.parent(null);
|
|
317
|
+
return this;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Rearrange this node in relation to its siblings.
|
|
321
|
+
*
|
|
322
|
+
* @remarks
|
|
323
|
+
* Children are rendered starting from the beginning of the children list.
|
|
324
|
+
* We can change the rendering order by rearranging said list.
|
|
325
|
+
*
|
|
326
|
+
* A positive `by` arguments move the node up (it will be rendered on top of
|
|
327
|
+
* the elements it has passed). Negative values move it down.
|
|
328
|
+
*
|
|
329
|
+
* @param by - Number of places by which the node should be moved.
|
|
330
|
+
*/
|
|
331
|
+
move(by = 1) {
|
|
332
|
+
const parent = this.parent();
|
|
333
|
+
if (by === 0 || !parent) {
|
|
334
|
+
return this;
|
|
335
|
+
}
|
|
336
|
+
const children = parent.children();
|
|
337
|
+
const newChildren = [];
|
|
338
|
+
if (by > 0) {
|
|
339
|
+
for (let i = 0; i < children.length; i++) {
|
|
340
|
+
const child = children[i];
|
|
341
|
+
if (child === this) {
|
|
342
|
+
const target = i + by;
|
|
343
|
+
for (; i < target && i + 1 < children.length; i++) {
|
|
344
|
+
newChildren[i] = children[i + 1];
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
newChildren[i] = child;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
for (let i = children.length - 1; i >= 0; i--) {
|
|
352
|
+
const child = children[i];
|
|
353
|
+
if (child === this) {
|
|
354
|
+
const target = i + by;
|
|
355
|
+
for (; i > target && i > 0; i--) {
|
|
356
|
+
newChildren[i] = children[i - 1];
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
newChildren[i] = child;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
parent.setParsedChildren(newChildren);
|
|
363
|
+
return this;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Move the node up in relation to its siblings.
|
|
367
|
+
*
|
|
368
|
+
* @remarks
|
|
369
|
+
* The node will exchange places with the sibling right above it (if any) and
|
|
370
|
+
* from then on will be rendered on top of it.
|
|
371
|
+
*/
|
|
372
|
+
moveUp() {
|
|
373
|
+
return this.move(1);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Move the node down in relation to its siblings.
|
|
377
|
+
*
|
|
378
|
+
* @remarks
|
|
379
|
+
* The node will exchange places with the sibling right below it (if any) and
|
|
380
|
+
* from then on will be rendered under it.
|
|
381
|
+
*/
|
|
382
|
+
moveDown() {
|
|
383
|
+
return this.move(-1);
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Move the node to the top in relation to its siblings.
|
|
387
|
+
*
|
|
388
|
+
* @remarks
|
|
389
|
+
* The node will be placed at the end of the children list and from then on
|
|
390
|
+
* will be rendered on top of all of its siblings.
|
|
391
|
+
*/
|
|
392
|
+
moveToTop() {
|
|
393
|
+
return this.move(Infinity);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Move the node to the bottom in relation to its siblings.
|
|
397
|
+
*
|
|
398
|
+
* @remarks
|
|
399
|
+
* The node will be placed at the beginning of the children list and from then
|
|
400
|
+
* on will be rendered below all of its siblings.
|
|
401
|
+
*/
|
|
402
|
+
moveToBottom() {
|
|
403
|
+
return this.move(-Infinity);
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Move the node to the provided position relative to its siblings.
|
|
407
|
+
*
|
|
408
|
+
* @remarks
|
|
409
|
+
* If the node is getting moved to a lower position, it will be placed below
|
|
410
|
+
* the sibling that's currently at the provided index (if any).
|
|
411
|
+
* If the node is getting moved to a higher position, it will be placed above
|
|
412
|
+
* the sibling that's currently at the provided index (if any).
|
|
413
|
+
*
|
|
414
|
+
* @param index - The index to move the node to.
|
|
415
|
+
*/
|
|
416
|
+
moveTo(index) {
|
|
417
|
+
const parent = this.parent();
|
|
418
|
+
if (!parent) {
|
|
419
|
+
return this;
|
|
420
|
+
}
|
|
421
|
+
const currentIndex = parent.children().indexOf(this);
|
|
422
|
+
const by = index - currentIndex;
|
|
423
|
+
return this.move(by);
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Move the node below the provided node in the parent's layout.
|
|
427
|
+
*
|
|
428
|
+
* @remarks
|
|
429
|
+
* The node will be moved below the provided node and from then on will be
|
|
430
|
+
* rendered below it. By default, if the node is already positioned lower than
|
|
431
|
+
* the sibling node, it will not get moved.
|
|
432
|
+
*
|
|
433
|
+
* @param node - The sibling node below which to move.
|
|
434
|
+
* @param directlyBelow - Whether the node should be positioned directly below
|
|
435
|
+
* the sibling. When true, will move the node even if
|
|
436
|
+
* it is already positioned below the sibling.
|
|
437
|
+
*/
|
|
438
|
+
moveBelow(node, directlyBelow = false) {
|
|
439
|
+
const parent = this.parent();
|
|
440
|
+
if (!parent) {
|
|
441
|
+
return this;
|
|
442
|
+
}
|
|
443
|
+
if (node.parent() !== parent) {
|
|
444
|
+
useLogger().error("Cannot position nodes relative to each other if they don't belong to the same parent.");
|
|
445
|
+
return this;
|
|
446
|
+
}
|
|
447
|
+
const children = parent.children();
|
|
448
|
+
const ownIndex = children.indexOf(this);
|
|
449
|
+
const otherIndex = children.indexOf(node);
|
|
450
|
+
if (!directlyBelow && ownIndex < otherIndex) {
|
|
451
|
+
// Nothing to do if the node is already positioned below the target node.
|
|
452
|
+
// We could move the node so it's directly below the sibling node, but
|
|
453
|
+
// that might suddenly move it on top of other nodes. This is likely
|
|
454
|
+
// not what the user wanted to happen when calling this method.
|
|
455
|
+
return this;
|
|
456
|
+
}
|
|
457
|
+
const by = otherIndex - ownIndex - 1;
|
|
458
|
+
return this.move(by);
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Move the node above the provided node in the parent's layout.
|
|
462
|
+
*
|
|
463
|
+
* @remarks
|
|
464
|
+
* The node will be moved above the provided node and from then on will be
|
|
465
|
+
* rendered on top of it. By default, if the node is already positioned
|
|
466
|
+
* higher than the sibling node, it will not get moved.
|
|
467
|
+
*
|
|
468
|
+
* @param node - The sibling node below which to move.
|
|
469
|
+
* @param directlyAbove - Whether the node should be positioned directly above the
|
|
470
|
+
* sibling. When true, will move the node even if it is
|
|
471
|
+
* already positioned above the sibling.
|
|
472
|
+
*/
|
|
473
|
+
moveAbove(node, directlyAbove = false) {
|
|
474
|
+
const parent = this.parent();
|
|
475
|
+
if (!parent) {
|
|
476
|
+
return this;
|
|
477
|
+
}
|
|
478
|
+
if (node.parent() !== parent) {
|
|
479
|
+
useLogger().error("Cannot position nodes relative to each other if they don't belong to the same parent.");
|
|
480
|
+
return this;
|
|
481
|
+
}
|
|
482
|
+
const children = parent.children();
|
|
483
|
+
const ownIndex = children.indexOf(this);
|
|
484
|
+
const otherIndex = children.indexOf(node);
|
|
485
|
+
if (!directlyAbove && ownIndex > otherIndex) {
|
|
486
|
+
// Nothing to do if the node is already positioned above the target node.
|
|
487
|
+
// We could move the node so it's directly above the sibling node, but
|
|
488
|
+
// that might suddenly move it below other nodes. This is likely not what
|
|
489
|
+
// the user wanted to happen when calling this method.
|
|
490
|
+
return this;
|
|
491
|
+
}
|
|
492
|
+
const by = otherIndex - ownIndex + 1;
|
|
493
|
+
return this.move(by);
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Change the parent of this node while keeping the absolute transform.
|
|
497
|
+
*
|
|
498
|
+
* @remarks
|
|
499
|
+
* After performing this operation, the node will stay in the same place
|
|
500
|
+
* visually, but its parent will be changed.
|
|
501
|
+
*
|
|
502
|
+
* @param newParent - The new parent of this node.
|
|
503
|
+
*/
|
|
504
|
+
reparent(newParent) {
|
|
505
|
+
const position = this.absolutePosition();
|
|
506
|
+
const rotation = this.absoluteRotation();
|
|
507
|
+
const scale = this.absoluteScale();
|
|
508
|
+
newParent.add(this);
|
|
509
|
+
this.absolutePosition(position);
|
|
510
|
+
this.absoluteRotation(rotation);
|
|
511
|
+
this.absoluteScale(scale);
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Remove all children of this node.
|
|
515
|
+
*/
|
|
516
|
+
removeChildren() {
|
|
517
|
+
for (const oldChild of this.realChildren) {
|
|
518
|
+
oldChild.parent(null);
|
|
519
|
+
}
|
|
520
|
+
this.setParsedChildren([]);
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Get the current children of this node.
|
|
524
|
+
*
|
|
525
|
+
* @remarks
|
|
526
|
+
* Unlike {@link children}, this method does not have any side effects.
|
|
527
|
+
* It does not register the `children` signal as a dependency, and it does not
|
|
528
|
+
* spawn any children. It can be used to safely retrieve the current state of
|
|
529
|
+
* the scene graph for debugging purposes.
|
|
530
|
+
*/
|
|
531
|
+
peekChildren() {
|
|
532
|
+
return this.realChildren;
|
|
533
|
+
}
|
|
534
|
+
findAll(predicate) {
|
|
535
|
+
const result = [];
|
|
536
|
+
const queue = this.reversedChildren();
|
|
537
|
+
while (queue.length > 0) {
|
|
538
|
+
const node = queue.pop();
|
|
539
|
+
if (predicate(node)) {
|
|
540
|
+
result.push(node);
|
|
541
|
+
}
|
|
542
|
+
const children = node.children();
|
|
543
|
+
for (let i = children.length - 1; i >= 0; i--) {
|
|
544
|
+
queue.push(children[i]);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
return result;
|
|
548
|
+
}
|
|
549
|
+
findFirst(predicate) {
|
|
550
|
+
const queue = this.reversedChildren();
|
|
551
|
+
while (queue.length > 0) {
|
|
552
|
+
const node = queue.pop();
|
|
553
|
+
if (predicate(node)) {
|
|
554
|
+
return node;
|
|
555
|
+
}
|
|
556
|
+
const children = node.children();
|
|
557
|
+
for (let i = children.length - 1; i >= 0; i--) {
|
|
558
|
+
queue.push(children[i]);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
return null;
|
|
562
|
+
}
|
|
563
|
+
findLast(predicate) {
|
|
564
|
+
const search = [];
|
|
565
|
+
const queue = this.reversedChildren();
|
|
566
|
+
while (queue.length > 0) {
|
|
567
|
+
const node = queue.pop();
|
|
568
|
+
search.push(node);
|
|
569
|
+
const children = node.children();
|
|
570
|
+
for (let i = children.length - 1; i >= 0; i--) {
|
|
571
|
+
queue.push(children[i]);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
while (search.length > 0) {
|
|
575
|
+
const node = search.pop();
|
|
576
|
+
if (predicate(node)) {
|
|
577
|
+
return node;
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
return null;
|
|
581
|
+
}
|
|
582
|
+
findAncestor(predicate) {
|
|
583
|
+
let parent = this.parent();
|
|
584
|
+
while (parent) {
|
|
585
|
+
if (predicate(parent)) {
|
|
586
|
+
return parent;
|
|
587
|
+
}
|
|
588
|
+
parent = parent.parent();
|
|
589
|
+
}
|
|
590
|
+
return null;
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Get the nth children cast to the specified type.
|
|
594
|
+
*
|
|
595
|
+
* @param index - The index of the child to retrieve.
|
|
596
|
+
*/
|
|
597
|
+
childAs(index) {
|
|
598
|
+
return this.children()[index] ?? null;
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Get the children array cast to the specified type.
|
|
602
|
+
*/
|
|
603
|
+
childrenAs() {
|
|
604
|
+
return this.children();
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* Get the parent cast to the specified type.
|
|
608
|
+
*/
|
|
609
|
+
parentAs() {
|
|
610
|
+
return this.parent() ?? null;
|
|
611
|
+
}
|
|
612
|
+
/**
|
|
613
|
+
* Prepare this node to be disposed of.
|
|
614
|
+
*
|
|
615
|
+
* @remarks
|
|
616
|
+
* This method is called automatically when a scene is refreshed. It will
|
|
617
|
+
* be called even if the node is not currently attached to the tree.
|
|
618
|
+
*
|
|
619
|
+
* The goal of this method is to clean any external references to allow the
|
|
620
|
+
* node to be garbage collected.
|
|
621
|
+
*/
|
|
622
|
+
dispose() {
|
|
623
|
+
if (!this.unregister) {
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
this.stateStack = [];
|
|
627
|
+
this.unregister();
|
|
628
|
+
this.unregister = null;
|
|
629
|
+
for (const { signal } of this) {
|
|
630
|
+
signal?.context.dispose();
|
|
631
|
+
}
|
|
632
|
+
for (const child of this.realChildren) {
|
|
633
|
+
child.dispose();
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* Create a copy of this node.
|
|
638
|
+
*
|
|
639
|
+
* @param customProps - Properties to override.
|
|
640
|
+
*/
|
|
641
|
+
clone(customProps = {}) {
|
|
642
|
+
const props = { ...customProps };
|
|
643
|
+
if (isReactive(this.children.context.raw())) {
|
|
644
|
+
props.children ?? (props.children = this.children.context.raw());
|
|
645
|
+
}
|
|
646
|
+
else if (this.children().length > 0) {
|
|
647
|
+
props.children ?? (props.children = this.children().map(child => child.clone()));
|
|
648
|
+
}
|
|
649
|
+
for (const { key, meta, signal } of this) {
|
|
650
|
+
if (!meta.cloneable || key in props)
|
|
651
|
+
continue;
|
|
652
|
+
if (meta.compound) {
|
|
653
|
+
for (const [key, property] of meta.compoundEntries) {
|
|
654
|
+
if (property in props)
|
|
655
|
+
continue;
|
|
656
|
+
const component = signal[key];
|
|
657
|
+
if (!component.context.isInitial()) {
|
|
658
|
+
props[property] = component.context.raw();
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
else if (!signal.context.isInitial()) {
|
|
663
|
+
props[key] = signal.context.raw();
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
return this.instantiate(props);
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* Create a copy of this node.
|
|
670
|
+
*
|
|
671
|
+
* @remarks
|
|
672
|
+
* Unlike {@link clone}, a snapshot clone calculates any reactive properties
|
|
673
|
+
* at the moment of cloning and passes the raw values to the copy.
|
|
674
|
+
*
|
|
675
|
+
* @param customProps - Properties to override.
|
|
676
|
+
*/
|
|
677
|
+
snapshotClone(customProps = {}) {
|
|
678
|
+
const props = {
|
|
679
|
+
...this.getState(),
|
|
680
|
+
...customProps,
|
|
681
|
+
};
|
|
682
|
+
if (this.children().length > 0) {
|
|
683
|
+
props.children ?? (props.children = this.children().map(child => child.snapshotClone()));
|
|
684
|
+
}
|
|
685
|
+
return this.instantiate(props);
|
|
686
|
+
}
|
|
687
|
+
/**
|
|
688
|
+
* Create a reactive copy of this node.
|
|
689
|
+
*
|
|
690
|
+
* @remarks
|
|
691
|
+
* A reactive copy has all its properties dynamically updated to match the
|
|
692
|
+
* source node.
|
|
693
|
+
*
|
|
694
|
+
* @param customProps - Properties to override.
|
|
695
|
+
*/
|
|
696
|
+
reactiveClone(customProps = {}) {
|
|
697
|
+
const props = { ...customProps };
|
|
698
|
+
if (this.children().length > 0) {
|
|
699
|
+
props.children ?? (props.children = this.children().map(child => child.reactiveClone()));
|
|
700
|
+
}
|
|
701
|
+
for (const { key, meta, signal } of this) {
|
|
702
|
+
if (!meta.cloneable || key in props)
|
|
703
|
+
continue;
|
|
704
|
+
props[key] = () => signal();
|
|
705
|
+
}
|
|
706
|
+
return this.instantiate(props);
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* Create an instance of this node's class.
|
|
710
|
+
*
|
|
711
|
+
* @param props - Properties to pass to the constructor.
|
|
712
|
+
*/
|
|
713
|
+
instantiate(props = {}) {
|
|
714
|
+
return new this.constructor(props);
|
|
715
|
+
}
|
|
716
|
+
/**
|
|
717
|
+
* Set the children without parsing them.
|
|
718
|
+
*
|
|
719
|
+
* @remarks
|
|
720
|
+
* This method assumes that the caller took care of parsing the children and
|
|
721
|
+
* updating the hierarchy.
|
|
722
|
+
*
|
|
723
|
+
* @param value - The children to set.
|
|
724
|
+
*/
|
|
725
|
+
setParsedChildren(value) {
|
|
726
|
+
this.children.context.setter(value);
|
|
727
|
+
this.realChildren = value;
|
|
728
|
+
}
|
|
729
|
+
spawnChildren(reactive, children) {
|
|
730
|
+
const parsedChildren = this.parseChildren(children);
|
|
731
|
+
const keep = new Set();
|
|
732
|
+
for (const newChild of parsedChildren) {
|
|
733
|
+
const current = newChild.parent.context.raw();
|
|
734
|
+
if (current && current !== this) {
|
|
735
|
+
current.removeChild(newChild);
|
|
736
|
+
}
|
|
737
|
+
keep.add(newChild.key);
|
|
738
|
+
newChild.parent(this);
|
|
739
|
+
}
|
|
740
|
+
for (const oldChild of this.realChildren) {
|
|
741
|
+
if (!keep.has(oldChild.key)) {
|
|
742
|
+
oldChild.parent(null);
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
this.hasSpawnedChildren = reactive;
|
|
746
|
+
this.realChildren = parsedChildren;
|
|
747
|
+
}
|
|
748
|
+
/**
|
|
749
|
+
* Parse any `ComponentChildren` into an array of nodes.
|
|
750
|
+
*
|
|
751
|
+
* @param children - The children to parse.
|
|
752
|
+
*/
|
|
753
|
+
parseChildren(children) {
|
|
754
|
+
const result = [];
|
|
755
|
+
const array = Array.isArray(children) ? children : [children];
|
|
756
|
+
for (const child of array) {
|
|
757
|
+
if (child instanceof Node_1) {
|
|
758
|
+
result.push(child);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
return result;
|
|
762
|
+
}
|
|
763
|
+
/**
|
|
764
|
+
* Remove the given child.
|
|
765
|
+
*/
|
|
766
|
+
removeChild(child) {
|
|
767
|
+
this.setParsedChildren(this.children().filter(node => node !== child));
|
|
768
|
+
}
|
|
769
|
+
/**
|
|
770
|
+
* Whether this node should be cached or not.
|
|
771
|
+
*/
|
|
772
|
+
requiresCache() {
|
|
773
|
+
return (this.cache() ||
|
|
774
|
+
this.opacity() < 1 ||
|
|
775
|
+
this.compositeOperation() !== 'source-over' ||
|
|
776
|
+
this.hasFilters() ||
|
|
777
|
+
this.hasShadow() ||
|
|
778
|
+
this.shaders().length > 0);
|
|
779
|
+
}
|
|
780
|
+
cacheCanvas() {
|
|
781
|
+
const canvas = document.createElement('canvas').getContext('2d');
|
|
782
|
+
if (!canvas) {
|
|
783
|
+
throw new Error('Could not create a cache canvas');
|
|
784
|
+
}
|
|
785
|
+
return canvas;
|
|
786
|
+
}
|
|
787
|
+
/**
|
|
788
|
+
* Get a cache canvas with the contents of this node rendered onto it.
|
|
789
|
+
*/
|
|
790
|
+
async cachedCanvas() {
|
|
791
|
+
const context = this.cacheCanvas();
|
|
792
|
+
const cache = this.worldSpaceCacheBBox();
|
|
793
|
+
const matrix = this.localToWorld();
|
|
794
|
+
context.canvas.width = cache.width;
|
|
795
|
+
context.canvas.height = cache.height;
|
|
796
|
+
context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e - cache.x, matrix.f - cache.y);
|
|
797
|
+
await this.draw(context);
|
|
798
|
+
return context;
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* Get a bounding box for the contents rendered by this node.
|
|
802
|
+
*
|
|
803
|
+
* @remarks
|
|
804
|
+
* The returned bounding box should be in local space.
|
|
805
|
+
*/
|
|
806
|
+
getCacheBBox() {
|
|
807
|
+
return new BBox();
|
|
808
|
+
}
|
|
809
|
+
/**
|
|
810
|
+
* Get a bounding box for the contents rendered by this node as well
|
|
811
|
+
* as its children.
|
|
812
|
+
*/
|
|
813
|
+
cacheBBox() {
|
|
814
|
+
const cache = this.getCacheBBox();
|
|
815
|
+
const children = this.children();
|
|
816
|
+
const padding = this.cachePadding();
|
|
817
|
+
if (children.length === 0) {
|
|
818
|
+
return cache.addSpacing(padding);
|
|
819
|
+
}
|
|
820
|
+
const points = cache.corners;
|
|
821
|
+
for (const child of children) {
|
|
822
|
+
const childCache = child.fullCacheBBox();
|
|
823
|
+
const childMatrix = child.localToParent();
|
|
824
|
+
points.push(...childCache.corners.map(r => transformVectorAsPoint(r, childMatrix)));
|
|
825
|
+
}
|
|
826
|
+
const bbox = BBox.fromPoints(...points);
|
|
827
|
+
return bbox.addSpacing(padding);
|
|
828
|
+
}
|
|
829
|
+
/**
|
|
830
|
+
* Get a bounding box for the contents rendered by this node (including
|
|
831
|
+
* effects applied after caching).
|
|
832
|
+
*
|
|
833
|
+
* @remarks
|
|
834
|
+
* The returned bounding box should be in local space.
|
|
835
|
+
*/
|
|
836
|
+
fullCacheBBox() {
|
|
837
|
+
const matrix = this.compositeToLocal();
|
|
838
|
+
const shadowOffset = transformVector(this.shadowOffset(), matrix);
|
|
839
|
+
const shadowBlur = transformScalar(this.shadowBlur(), matrix);
|
|
840
|
+
const result = this.cacheBBox().expand(this.filters.blur() * 2 + shadowBlur);
|
|
841
|
+
if (shadowOffset.x < 0) {
|
|
842
|
+
result.x += shadowOffset.x;
|
|
843
|
+
result.width -= shadowOffset.x;
|
|
844
|
+
}
|
|
845
|
+
else {
|
|
846
|
+
result.width += shadowOffset.x;
|
|
847
|
+
}
|
|
848
|
+
if (shadowOffset.y < 0) {
|
|
849
|
+
result.y += shadowOffset.y;
|
|
850
|
+
result.height -= shadowOffset.y;
|
|
851
|
+
}
|
|
852
|
+
else {
|
|
853
|
+
result.height += shadowOffset.y;
|
|
854
|
+
}
|
|
855
|
+
return result;
|
|
856
|
+
}
|
|
857
|
+
/**
|
|
858
|
+
* Get a bounding box in world space for the contents rendered by this node as
|
|
859
|
+
* well as its children.
|
|
860
|
+
*
|
|
861
|
+
* @remarks
|
|
862
|
+
* This is the same the bounding box returned by {@link cacheBBox} only
|
|
863
|
+
* transformed to world space.
|
|
864
|
+
*/
|
|
865
|
+
worldSpaceCacheBBox() {
|
|
866
|
+
const viewBBox = BBox.fromSizeCentered(this.view().size());
|
|
867
|
+
const canvasBBox = BBox.fromPoints(...viewBBox.transformCorners(this.view().localToWorld()));
|
|
868
|
+
const cacheBBox = BBox.fromPoints(...this.cacheBBox().transformCorners(this.localToWorld())).pixelPerfect.expand(2);
|
|
869
|
+
return canvasBBox.intersection(cacheBBox);
|
|
870
|
+
}
|
|
871
|
+
parentWorldSpaceCacheBBox() {
|
|
872
|
+
return (this.findAncestor(node => node.requiresCache())?.worldSpaceCacheBBox() ??
|
|
873
|
+
new BBox(Vector2.zero, useScene2D().getSize()));
|
|
874
|
+
}
|
|
875
|
+
/**
|
|
876
|
+
* Prepare the given context for drawing a cached node onto it.
|
|
877
|
+
*
|
|
878
|
+
* @remarks
|
|
879
|
+
* This method is called before the contents of the cache canvas are drawn
|
|
880
|
+
* on the screen. It can be used to apply effects to the entire node together
|
|
881
|
+
* with its children, instead of applying them individually.
|
|
882
|
+
* Effects such as transparency, shadows, and filters use this technique.
|
|
883
|
+
*
|
|
884
|
+
* Whether the node is cached is decided by the {@link requiresCache} method.
|
|
885
|
+
*
|
|
886
|
+
* @param context - The context using which the cache will be drawn.
|
|
887
|
+
*/
|
|
888
|
+
setupDrawFromCache(context) {
|
|
889
|
+
context.globalCompositeOperation = this.compositeOperation();
|
|
890
|
+
context.globalAlpha *= this.opacity();
|
|
891
|
+
if (this.hasFilters()) {
|
|
892
|
+
context.filter = this.filterString();
|
|
893
|
+
}
|
|
894
|
+
if (this.hasShadow()) {
|
|
895
|
+
const matrix = this.compositeToWorld();
|
|
896
|
+
const offset = transformVector(this.shadowOffset(), matrix);
|
|
897
|
+
const blur = transformScalar(this.shadowBlur(), matrix);
|
|
898
|
+
context.shadowColor = this.shadowColor().serialize();
|
|
899
|
+
context.shadowBlur = blur;
|
|
900
|
+
context.shadowOffsetX = offset.x;
|
|
901
|
+
context.shadowOffsetY = offset.y;
|
|
902
|
+
}
|
|
903
|
+
const matrix = this.worldToLocal();
|
|
904
|
+
context.transform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f);
|
|
905
|
+
}
|
|
906
|
+
renderFromSource(context, source, x, y) {
|
|
907
|
+
this.setupDrawFromCache(context);
|
|
908
|
+
const compositeOverride = this.compositeOverride();
|
|
909
|
+
context.drawImage(source, x, y);
|
|
910
|
+
if (compositeOverride > 0) {
|
|
911
|
+
context.save();
|
|
912
|
+
context.globalAlpha *= compositeOverride;
|
|
913
|
+
context.globalCompositeOperation = 'source-over';
|
|
914
|
+
context.drawImage(source, x, y);
|
|
915
|
+
context.restore();
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
shaderCanvas(destination, source) {
|
|
919
|
+
const shaders = this.shaders();
|
|
920
|
+
if (shaders.length === 0) {
|
|
921
|
+
return null;
|
|
922
|
+
}
|
|
923
|
+
const scene = useScene2D();
|
|
924
|
+
const size = scene.getRealSize();
|
|
925
|
+
const parentCacheRect = this.parentWorldSpaceCacheBBox();
|
|
926
|
+
const cameraToWorld = new DOMMatrix()
|
|
927
|
+
.scaleSelf(size.width / parentCacheRect.width, size.height / -parentCacheRect.height)
|
|
928
|
+
.translateSelf(parentCacheRect.x / -size.width, parentCacheRect.y / size.height - 1);
|
|
929
|
+
const cacheRect = this.worldSpaceCacheBBox();
|
|
930
|
+
const cameraToCache = new DOMMatrix()
|
|
931
|
+
.scaleSelf(size.width / cacheRect.width, size.height / -cacheRect.height)
|
|
932
|
+
.translateSelf(cacheRect.x / -size.width, cacheRect.y / size.height - 1)
|
|
933
|
+
.invertSelf();
|
|
934
|
+
const gl = scene.shaders.getGL();
|
|
935
|
+
scene.shaders.copyTextures(destination, source);
|
|
936
|
+
scene.shaders.clear();
|
|
937
|
+
for (const shader of shaders) {
|
|
938
|
+
const program = scene.shaders.getProgram(shader.fragment);
|
|
939
|
+
if (!program) {
|
|
940
|
+
continue;
|
|
941
|
+
}
|
|
942
|
+
if (shader.uniforms) {
|
|
943
|
+
for (const [name, uniform] of Object.entries(shader.uniforms)) {
|
|
944
|
+
const location = gl.getUniformLocation(program, name);
|
|
945
|
+
if (location === null) {
|
|
946
|
+
continue;
|
|
947
|
+
}
|
|
948
|
+
const value = unwrap(uniform);
|
|
949
|
+
if (typeof value === 'number') {
|
|
950
|
+
gl.uniform1f(location, value);
|
|
951
|
+
}
|
|
952
|
+
else if ('toUniform' in value) {
|
|
953
|
+
value.toUniform(gl, location);
|
|
954
|
+
}
|
|
955
|
+
else if (value.length === 1) {
|
|
956
|
+
gl.uniform1f(location, value[0]);
|
|
957
|
+
}
|
|
958
|
+
else if (value.length === 2) {
|
|
959
|
+
gl.uniform2f(location, value[0], value[1]);
|
|
960
|
+
}
|
|
961
|
+
else if (value.length === 3) {
|
|
962
|
+
gl.uniform3f(location, value[0], value[1], value[2]);
|
|
963
|
+
}
|
|
964
|
+
else if (value.length === 4) {
|
|
965
|
+
gl.uniform4f(location, value[0], value[1], value[2], value[3]);
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
gl.uniform1f(gl.getUniformLocation(program, UNIFORM_TIME), this.view2D.globalTime());
|
|
970
|
+
gl.uniform1i(gl.getUniformLocation(program, UNIFORM_TIME), scene.playback.frame);
|
|
971
|
+
gl.uniformMatrix4fv(gl.getUniformLocation(program, UNIFORM_SOURCE_MATRIX), false, cameraToCache.toFloat32Array());
|
|
972
|
+
gl.uniformMatrix4fv(gl.getUniformLocation(program, UNIFORM_DESTINATION_MATRIX), false, cameraToWorld.toFloat32Array());
|
|
973
|
+
shader.setup?.(gl, program);
|
|
974
|
+
scene.shaders.render();
|
|
975
|
+
shader.teardown?.(gl, program);
|
|
976
|
+
}
|
|
977
|
+
return gl.canvas;
|
|
978
|
+
}
|
|
979
|
+
/**
|
|
980
|
+
* Render this node onto the given canvas.
|
|
981
|
+
*
|
|
982
|
+
* @param context - The context to draw with.
|
|
983
|
+
*/
|
|
984
|
+
async render(context) {
|
|
985
|
+
if (this.absoluteOpacity() <= 0) {
|
|
986
|
+
return;
|
|
987
|
+
}
|
|
988
|
+
context.save();
|
|
989
|
+
this.transformContext(context);
|
|
990
|
+
if (this.requiresCache()) {
|
|
991
|
+
const cacheRect = this.worldSpaceCacheBBox();
|
|
992
|
+
if (cacheRect.width !== 0 && cacheRect.height !== 0) {
|
|
993
|
+
const cache = (await this.cachedCanvas()).canvas;
|
|
994
|
+
const source = this.shaderCanvas(context.canvas, cache);
|
|
995
|
+
if (source) {
|
|
996
|
+
this.renderFromSource(context, source, 0, 0);
|
|
997
|
+
}
|
|
998
|
+
else {
|
|
999
|
+
this.renderFromSource(context, cache, cacheRect.position.x, cacheRect.position.y);
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
else {
|
|
1004
|
+
await this.draw(context);
|
|
1005
|
+
}
|
|
1006
|
+
context.restore();
|
|
1007
|
+
}
|
|
1008
|
+
/**
|
|
1009
|
+
* Draw this node onto the canvas.
|
|
1010
|
+
*
|
|
1011
|
+
* @remarks
|
|
1012
|
+
* This method is used when drawing directly onto the screen as well as onto
|
|
1013
|
+
* the cache canvas.
|
|
1014
|
+
* It assumes that the context have already been transformed to local space.
|
|
1015
|
+
*
|
|
1016
|
+
* @param context - The context to draw with.
|
|
1017
|
+
*/
|
|
1018
|
+
async draw(context) {
|
|
1019
|
+
await this.drawChildren(context);
|
|
1020
|
+
}
|
|
1021
|
+
async drawChildren(context) {
|
|
1022
|
+
for (const child of this.sortedChildren()) {
|
|
1023
|
+
await child.render(context);
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
/**
|
|
1027
|
+
* Draw an overlay for this node.
|
|
1028
|
+
*
|
|
1029
|
+
* @remarks
|
|
1030
|
+
* The overlay for the currently inspected node is displayed on top of the
|
|
1031
|
+
* canvas.
|
|
1032
|
+
*
|
|
1033
|
+
* The provided context is in screen space. The local-to-screen matrix can be
|
|
1034
|
+
* used to transform all shapes that need to be displayed.
|
|
1035
|
+
* This approach allows to keep the line widths and gizmo sizes consistent,
|
|
1036
|
+
* no matter how zoomed-in the view is.
|
|
1037
|
+
*
|
|
1038
|
+
* @param context - The context to draw with.
|
|
1039
|
+
* @param matrix - A local-to-screen matrix.
|
|
1040
|
+
*/
|
|
1041
|
+
drawOverlay(context, matrix) {
|
|
1042
|
+
const box = this.cacheBBox().transformCorners(matrix);
|
|
1043
|
+
const cache = this.getCacheBBox().transformCorners(matrix);
|
|
1044
|
+
context.strokeStyle = 'white';
|
|
1045
|
+
context.lineWidth = 1;
|
|
1046
|
+
context.beginPath();
|
|
1047
|
+
drawLine(context, box);
|
|
1048
|
+
context.closePath();
|
|
1049
|
+
context.stroke();
|
|
1050
|
+
context.strokeStyle = 'blue';
|
|
1051
|
+
context.beginPath();
|
|
1052
|
+
drawLine(context, cache);
|
|
1053
|
+
context.closePath();
|
|
1054
|
+
context.stroke();
|
|
1055
|
+
}
|
|
1056
|
+
transformContext(context) {
|
|
1057
|
+
const matrix = this.localToParent();
|
|
1058
|
+
context.transform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f);
|
|
1059
|
+
}
|
|
1060
|
+
/**
|
|
1061
|
+
* Try to find a node intersecting the given position.
|
|
1062
|
+
*
|
|
1063
|
+
* @param position - The searched position.
|
|
1064
|
+
*/
|
|
1065
|
+
hit(position) {
|
|
1066
|
+
let hit = null;
|
|
1067
|
+
const local = transformVectorAsPoint(position, this.localToParent().inverse());
|
|
1068
|
+
const children = this.children();
|
|
1069
|
+
for (let i = children.length - 1; i >= 0; i--) {
|
|
1070
|
+
hit = children[i].hit(local);
|
|
1071
|
+
if (hit) {
|
|
1072
|
+
break;
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
return hit;
|
|
1076
|
+
}
|
|
1077
|
+
/**
|
|
1078
|
+
* Collect all asynchronous resources used by this node.
|
|
1079
|
+
*/
|
|
1080
|
+
collectAsyncResources() {
|
|
1081
|
+
for (const child of this.children()) {
|
|
1082
|
+
child.collectAsyncResources();
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
/**
|
|
1086
|
+
* Wait for any asynchronous resources that this node or its children have.
|
|
1087
|
+
*
|
|
1088
|
+
* @remarks
|
|
1089
|
+
* Certain resources like images are always loaded asynchronously.
|
|
1090
|
+
* Awaiting this method makes sure that all such resources are done loading
|
|
1091
|
+
* before continuing the animation.
|
|
1092
|
+
*/
|
|
1093
|
+
async toPromise() {
|
|
1094
|
+
do {
|
|
1095
|
+
await DependencyContext.consumePromises();
|
|
1096
|
+
this.collectAsyncResources();
|
|
1097
|
+
} while (DependencyContext.hasPromises());
|
|
1098
|
+
return this;
|
|
1099
|
+
}
|
|
1100
|
+
/**
|
|
1101
|
+
* Return a snapshot of the node's current signal values.
|
|
1102
|
+
*
|
|
1103
|
+
* @remarks
|
|
1104
|
+
* This method will calculate the values of any reactive properties of the
|
|
1105
|
+
* node at the time the method is called.
|
|
1106
|
+
*/
|
|
1107
|
+
getState() {
|
|
1108
|
+
const state = {};
|
|
1109
|
+
for (const { key, meta, signal } of this) {
|
|
1110
|
+
if (!meta.cloneable || key in state)
|
|
1111
|
+
continue;
|
|
1112
|
+
state[key] = signal();
|
|
1113
|
+
}
|
|
1114
|
+
return state;
|
|
1115
|
+
}
|
|
1116
|
+
applyState(state, duration, timing = easeInOutCubic) {
|
|
1117
|
+
if (duration === undefined) {
|
|
1118
|
+
for (const key in state) {
|
|
1119
|
+
const signal = this.signalByKey(key);
|
|
1120
|
+
if (signal) {
|
|
1121
|
+
signal(state[key]);
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
const tasks = [];
|
|
1126
|
+
for (const key in state) {
|
|
1127
|
+
const signal = this.signalByKey(key);
|
|
1128
|
+
if (state[key] !== signal.context.raw()) {
|
|
1129
|
+
tasks.push(signal(state[key], duration, timing));
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
return all(...tasks);
|
|
1133
|
+
}
|
|
1134
|
+
/**
|
|
1135
|
+
* Push a snapshot of the node's current state onto the node's state stack.
|
|
1136
|
+
*
|
|
1137
|
+
* @remarks
|
|
1138
|
+
* This method can be used together with the {@link restore} method to save a
|
|
1139
|
+
* node's current state and later restore it. It is possible to store more
|
|
1140
|
+
* than one state by calling `save` method multiple times.
|
|
1141
|
+
*/
|
|
1142
|
+
save() {
|
|
1143
|
+
this.stateStack.push(this.getState());
|
|
1144
|
+
}
|
|
1145
|
+
restore(duration, timing = easeInOutCubic) {
|
|
1146
|
+
const state = this.stateStack.pop();
|
|
1147
|
+
if (state !== undefined) {
|
|
1148
|
+
return this.applyState(state, duration, timing);
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
*[Symbol.iterator]() {
|
|
1152
|
+
for (const key in this.properties) {
|
|
1153
|
+
const meta = this.properties[key];
|
|
1154
|
+
const signal = this.signalByKey(key);
|
|
1155
|
+
yield { meta, signal, key };
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
signalByKey(key) {
|
|
1159
|
+
return this[key];
|
|
1160
|
+
}
|
|
1161
|
+
reversedChildren() {
|
|
1162
|
+
const children = this.children();
|
|
1163
|
+
const result = [];
|
|
1164
|
+
for (let i = children.length - 1; i >= 0; i--) {
|
|
1165
|
+
result.push(children[i]);
|
|
1166
|
+
}
|
|
1167
|
+
return result;
|
|
1168
|
+
}
|
|
1169
|
+
};
|
|
1170
|
+
__decorate([
|
|
1171
|
+
vector2Signal()
|
|
1172
|
+
], Node.prototype, "position", void 0);
|
|
1173
|
+
__decorate([
|
|
1174
|
+
wrapper(Vector2),
|
|
1175
|
+
cloneable(false),
|
|
1176
|
+
signal()
|
|
1177
|
+
], Node.prototype, "absolutePosition", void 0);
|
|
1178
|
+
__decorate([
|
|
1179
|
+
initial(0),
|
|
1180
|
+
signal()
|
|
1181
|
+
], Node.prototype, "rotation", void 0);
|
|
1182
|
+
__decorate([
|
|
1183
|
+
cloneable(false),
|
|
1184
|
+
signal()
|
|
1185
|
+
], Node.prototype, "absoluteRotation", void 0);
|
|
1186
|
+
__decorate([
|
|
1187
|
+
initial(Vector2.one),
|
|
1188
|
+
vector2Signal('scale')
|
|
1189
|
+
], Node.prototype, "scale", void 0);
|
|
1190
|
+
__decorate([
|
|
1191
|
+
initial(Vector2.zero),
|
|
1192
|
+
vector2Signal('skew')
|
|
1193
|
+
], Node.prototype, "skew", void 0);
|
|
1194
|
+
__decorate([
|
|
1195
|
+
wrapper(Vector2),
|
|
1196
|
+
cloneable(false),
|
|
1197
|
+
signal()
|
|
1198
|
+
], Node.prototype, "absoluteScale", void 0);
|
|
1199
|
+
__decorate([
|
|
1200
|
+
initial(0),
|
|
1201
|
+
signal()
|
|
1202
|
+
], Node.prototype, "zIndex", void 0);
|
|
1203
|
+
__decorate([
|
|
1204
|
+
initial(false),
|
|
1205
|
+
signal()
|
|
1206
|
+
], Node.prototype, "cache", void 0);
|
|
1207
|
+
__decorate([
|
|
1208
|
+
spacingSignal('cachePadding')
|
|
1209
|
+
], Node.prototype, "cachePadding", void 0);
|
|
1210
|
+
__decorate([
|
|
1211
|
+
initial(false),
|
|
1212
|
+
signal()
|
|
1213
|
+
], Node.prototype, "composite", void 0);
|
|
1214
|
+
__decorate([
|
|
1215
|
+
initial('source-over'),
|
|
1216
|
+
signal()
|
|
1217
|
+
], Node.prototype, "compositeOperation", void 0);
|
|
1218
|
+
__decorate([
|
|
1219
|
+
threadable()
|
|
1220
|
+
], Node.prototype, "tweenCompositeOperation", null);
|
|
1221
|
+
__decorate([
|
|
1222
|
+
initial(1),
|
|
1223
|
+
parser((value) => clamp(0, 1, value)),
|
|
1224
|
+
signal()
|
|
1225
|
+
], Node.prototype, "opacity", void 0);
|
|
1226
|
+
__decorate([
|
|
1227
|
+
computed()
|
|
1228
|
+
], Node.prototype, "absoluteOpacity", null);
|
|
1229
|
+
__decorate([
|
|
1230
|
+
filtersSignal()
|
|
1231
|
+
], Node.prototype, "filters", void 0);
|
|
1232
|
+
__decorate([
|
|
1233
|
+
initial('#0000'),
|
|
1234
|
+
colorSignal()
|
|
1235
|
+
], Node.prototype, "shadowColor", void 0);
|
|
1236
|
+
__decorate([
|
|
1237
|
+
initial(0),
|
|
1238
|
+
signal()
|
|
1239
|
+
], Node.prototype, "shadowBlur", void 0);
|
|
1240
|
+
__decorate([
|
|
1241
|
+
vector2Signal('shadowOffset')
|
|
1242
|
+
], Node.prototype, "shadowOffset", void 0);
|
|
1243
|
+
__decorate([
|
|
1244
|
+
initial([]),
|
|
1245
|
+
parser(parseShader),
|
|
1246
|
+
signal()
|
|
1247
|
+
], Node.prototype, "shaders", void 0);
|
|
1248
|
+
__decorate([
|
|
1249
|
+
computed()
|
|
1250
|
+
], Node.prototype, "hasFilters", null);
|
|
1251
|
+
__decorate([
|
|
1252
|
+
computed()
|
|
1253
|
+
], Node.prototype, "hasShadow", null);
|
|
1254
|
+
__decorate([
|
|
1255
|
+
computed()
|
|
1256
|
+
], Node.prototype, "filterString", null);
|
|
1257
|
+
__decorate([
|
|
1258
|
+
inspectable(false),
|
|
1259
|
+
cloneable(false),
|
|
1260
|
+
signal()
|
|
1261
|
+
], Node.prototype, "spawner", void 0);
|
|
1262
|
+
__decorate([
|
|
1263
|
+
inspectable(false),
|
|
1264
|
+
cloneable(false),
|
|
1265
|
+
signal()
|
|
1266
|
+
], Node.prototype, "children", void 0);
|
|
1267
|
+
__decorate([
|
|
1268
|
+
computed()
|
|
1269
|
+
], Node.prototype, "spawnedChildren", null);
|
|
1270
|
+
__decorate([
|
|
1271
|
+
computed()
|
|
1272
|
+
], Node.prototype, "sortedChildren", null);
|
|
1273
|
+
__decorate([
|
|
1274
|
+
computed()
|
|
1275
|
+
], Node.prototype, "localToWorld", null);
|
|
1276
|
+
__decorate([
|
|
1277
|
+
computed()
|
|
1278
|
+
], Node.prototype, "worldToLocal", null);
|
|
1279
|
+
__decorate([
|
|
1280
|
+
computed()
|
|
1281
|
+
], Node.prototype, "worldToParent", null);
|
|
1282
|
+
__decorate([
|
|
1283
|
+
computed()
|
|
1284
|
+
], Node.prototype, "localToParent", null);
|
|
1285
|
+
__decorate([
|
|
1286
|
+
computed()
|
|
1287
|
+
], Node.prototype, "compositeToWorld", null);
|
|
1288
|
+
__decorate([
|
|
1289
|
+
computed()
|
|
1290
|
+
], Node.prototype, "compositeRoot", null);
|
|
1291
|
+
__decorate([
|
|
1292
|
+
computed()
|
|
1293
|
+
], Node.prototype, "compositeToLocal", null);
|
|
1294
|
+
__decorate([
|
|
1295
|
+
computed()
|
|
1296
|
+
], Node.prototype, "cacheCanvas", null);
|
|
1297
|
+
__decorate([
|
|
1298
|
+
computed()
|
|
1299
|
+
], Node.prototype, "cachedCanvas", null);
|
|
1300
|
+
__decorate([
|
|
1301
|
+
computed()
|
|
1302
|
+
], Node.prototype, "cacheBBox", null);
|
|
1303
|
+
__decorate([
|
|
1304
|
+
computed()
|
|
1305
|
+
], Node.prototype, "fullCacheBBox", null);
|
|
1306
|
+
__decorate([
|
|
1307
|
+
computed()
|
|
1308
|
+
], Node.prototype, "worldSpaceCacheBBox", null);
|
|
1309
|
+
__decorate([
|
|
1310
|
+
computed()
|
|
1311
|
+
], Node.prototype, "parentWorldSpaceCacheBBox", null);
|
|
1312
|
+
Node = Node_1 = __decorate([
|
|
1313
|
+
nodeName('Node')
|
|
1314
|
+
], Node);
|
|
1315
|
+
export { Node };
|
|
1316
|
+
Node.prototype.isClass = true;
|
|
1317
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9Ob2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFnQkEsT0FBTyxFQUNMLElBQUksRUFDSixpQkFBaUIsRUFDakIsMEJBQTBCLEVBQzFCLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osT0FBTyxFQUNQLEdBQUcsRUFDSCxLQUFLLEVBQ0wsWUFBWSxFQUNaLGNBQWMsRUFDZCxVQUFVLEVBQ1YsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBRUwsU0FBUyxFQUNULFdBQVcsRUFDWCxRQUFRLEVBQ1IsZUFBZSxFQUNmLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLGFBQWEsRUFDYixPQUFPLEdBQ1IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQU0xRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFtRTNCLElBQU0sSUFBSSxZQUFWLE1BQU0sSUFBSTtJQXdDZixJQUFXLENBQUM7UUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBK0IsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsSUFBVyxDQUFDO1FBQ1YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQStCLENBQUM7SUFDdkQsQ0FBQztJQXVCUyxtQkFB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
|