@twick/2d 0.13.0 → 0.14.2
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/tsconfig.build.tsbuildinfo +1 -1
- package/lib/components/Audio.js +3 -3
- package/lib/components/Img.js +23 -23
- package/lib/components/Line.js +31 -31
- package/lib/components/Media.d.ts +1 -1
- package/lib/components/Media.d.ts.map +1 -1
- package/lib/components/Media.js +26 -26
- package/lib/components/Spline.js +25 -25
- package/lib/components/Video.js +3 -3
- package/lib/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +5 -4
- package/src/editor/NodeInspectorConfig.tsx +76 -76
- package/src/editor/PreviewOverlayConfig.tsx +67 -67
- package/src/editor/Provider.tsx +93 -93
- package/src/editor/SceneGraphTabConfig.tsx +81 -81
- package/src/editor/icons/CircleIcon.tsx +7 -7
- package/src/editor/icons/CodeBlockIcon.tsx +8 -8
- package/src/editor/icons/CurveIcon.tsx +7 -7
- package/src/editor/icons/GridIcon.tsx +7 -7
- package/src/editor/icons/IconMap.ts +35 -35
- package/src/editor/icons/ImgIcon.tsx +8 -8
- package/src/editor/icons/LayoutIcon.tsx +9 -9
- package/src/editor/icons/LineIcon.tsx +7 -7
- package/src/editor/icons/NodeIcon.tsx +7 -7
- package/src/editor/icons/RayIcon.tsx +7 -7
- package/src/editor/icons/RectIcon.tsx +7 -7
- package/src/editor/icons/ShapeIcon.tsx +7 -7
- package/src/editor/icons/TxtIcon.tsx +8 -8
- package/src/editor/icons/VideoIcon.tsx +7 -7
- package/src/editor/icons/View2DIcon.tsx +10 -10
- package/src/editor/index.ts +17 -17
- package/src/editor/tree/DetachedRoot.tsx +23 -23
- package/src/editor/tree/NodeElement.tsx +74 -74
- package/src/editor/tree/TreeElement.tsx +72 -72
- package/src/editor/tree/TreeRoot.tsx +10 -10
- package/src/editor/tree/ViewRoot.tsx +20 -20
- package/src/editor/tree/index.module.scss +38 -38
- package/src/editor/tree/index.ts +3 -3
- package/src/editor/tsconfig.build.json +5 -5
- package/src/editor/tsconfig.json +12 -12
- package/src/editor/tsdoc.json +4 -4
- package/src/editor/vite-env.d.ts +1 -1
- package/src/lib/code/CodeCursor.ts +445 -445
- package/src/lib/code/CodeDiffer.ts +78 -78
- package/src/lib/code/CodeFragment.ts +97 -97
- package/src/lib/code/CodeHighlighter.ts +75 -75
- package/src/lib/code/CodeMetrics.ts +47 -47
- package/src/lib/code/CodeRange.test.ts +74 -74
- package/src/lib/code/CodeRange.ts +216 -216
- package/src/lib/code/CodeScope.ts +101 -101
- package/src/lib/code/CodeSelection.ts +24 -24
- package/src/lib/code/CodeSignal.ts +327 -327
- package/src/lib/code/CodeTokenizer.ts +54 -54
- package/src/lib/code/DefaultHighlightStyle.ts +98 -98
- package/src/lib/code/LezerHighlighter.ts +113 -113
- package/src/lib/code/diff.test.ts +311 -311
- package/src/lib/code/diff.ts +319 -319
- package/src/lib/code/extractRange.ts +126 -126
- package/src/lib/code/index.ts +13 -13
- package/src/lib/components/Audio.ts +168 -168
- package/src/lib/components/Bezier.ts +105 -105
- package/src/lib/components/Circle.ts +266 -266
- package/src/lib/components/Code.ts +526 -526
- package/src/lib/components/CodeBlock.ts +576 -576
- package/src/lib/components/CubicBezier.ts +112 -112
- package/src/lib/components/Curve.ts +455 -455
- package/src/lib/components/Grid.ts +135 -135
- package/src/lib/components/Icon.ts +96 -96
- package/src/lib/components/Img.ts +319 -319
- package/src/lib/components/Knot.ts +157 -157
- package/src/lib/components/Latex.ts +122 -122
- package/src/lib/components/Layout.ts +1092 -1092
- package/src/lib/components/Line.ts +429 -429
- package/src/lib/components/Media.ts +576 -576
- package/src/lib/components/Node.ts +1940 -1940
- package/src/lib/components/Path.ts +137 -137
- package/src/lib/components/Polygon.ts +171 -171
- package/src/lib/components/QuadBezier.ts +100 -100
- package/src/lib/components/Ray.ts +125 -125
- package/src/lib/components/Rect.ts +187 -187
- package/src/lib/components/Rive.ts +156 -156
- package/src/lib/components/SVG.ts +797 -797
- package/src/lib/components/Shape.ts +143 -143
- package/src/lib/components/Spline.ts +344 -344
- package/src/lib/components/Txt.test.tsx +81 -81
- package/src/lib/components/Txt.ts +203 -203
- package/src/lib/components/TxtLeaf.ts +205 -205
- package/src/lib/components/Video.ts +461 -461
- package/src/lib/components/View2D.ts +98 -98
- package/src/lib/components/__tests__/children.test.tsx +142 -142
- package/src/lib/components/__tests__/clone.test.tsx +126 -126
- package/src/lib/components/__tests__/generatorTest.ts +28 -28
- package/src/lib/components/__tests__/mockScene2D.ts +45 -45
- package/src/lib/components/__tests__/query.test.tsx +122 -122
- package/src/lib/components/__tests__/state.test.tsx +60 -60
- package/src/lib/components/index.ts +28 -28
- package/src/lib/components/types.ts +35 -35
- package/src/lib/curves/ArcSegment.ts +159 -159
- package/src/lib/curves/CircleSegment.ts +77 -77
- package/src/lib/curves/CubicBezierSegment.ts +78 -78
- package/src/lib/curves/CurveDrawingInfo.ts +11 -11
- package/src/lib/curves/CurvePoint.ts +15 -15
- package/src/lib/curves/CurveProfile.ts +7 -7
- package/src/lib/curves/KnotInfo.ts +10 -10
- package/src/lib/curves/LineSegment.ts +62 -62
- package/src/lib/curves/Polynomial.ts +355 -355
- package/src/lib/curves/Polynomial2D.ts +62 -62
- package/src/lib/curves/PolynomialSegment.ts +124 -124
- package/src/lib/curves/QuadBezierSegment.ts +64 -64
- package/src/lib/curves/Segment.ts +17 -17
- package/src/lib/curves/UniformPolynomialCurveSampler.ts +94 -94
- package/src/lib/curves/createCurveProfileLerp.ts +471 -471
- package/src/lib/curves/getBezierSplineProfile.ts +223 -223
- package/src/lib/curves/getCircleProfile.ts +86 -86
- package/src/lib/curves/getPathProfile.ts +178 -178
- package/src/lib/curves/getPointAtDistance.ts +21 -21
- package/src/lib/curves/getPolylineProfile.test.ts +21 -21
- package/src/lib/curves/getPolylineProfile.ts +89 -89
- package/src/lib/curves/getRectProfile.ts +139 -139
- package/src/lib/curves/index.ts +16 -16
- package/src/lib/decorators/canvasStyleSignal.ts +16 -16
- package/src/lib/decorators/colorSignal.ts +9 -9
- package/src/lib/decorators/compound.ts +72 -72
- package/src/lib/decorators/computed.ts +18 -18
- package/src/lib/decorators/defaultStyle.ts +18 -18
- package/src/lib/decorators/filtersSignal.ts +136 -136
- package/src/lib/decorators/index.ts +10 -10
- package/src/lib/decorators/initializers.ts +32 -32
- package/src/lib/decorators/nodeName.ts +13 -13
- package/src/lib/decorators/signal.test.ts +90 -90
- package/src/lib/decorators/signal.ts +345 -345
- package/src/lib/decorators/spacingSignal.ts +15 -15
- package/src/lib/decorators/vector2Signal.ts +30 -30
- package/src/lib/globals.d.ts +2 -2
- package/src/lib/index.ts +8 -8
- package/src/lib/jsx-dev-runtime.ts +2 -2
- package/src/lib/jsx-runtime.ts +46 -46
- package/src/lib/parse-svg-path.d.ts +14 -14
- package/src/lib/partials/Filter.ts +180 -180
- package/src/lib/partials/Gradient.ts +102 -102
- package/src/lib/partials/Pattern.ts +34 -34
- package/src/lib/partials/ShaderConfig.ts +117 -117
- package/src/lib/partials/index.ts +4 -4
- package/src/lib/partials/types.ts +58 -58
- package/src/lib/scenes/Scene2D.ts +242 -242
- package/src/lib/scenes/index.ts +3 -3
- package/src/lib/scenes/makeScene2D.ts +16 -16
- package/src/lib/scenes/useScene2D.ts +6 -6
- package/src/lib/tsconfig.build.json +5 -5
- package/src/lib/tsconfig.json +10 -10
- package/src/lib/tsdoc.json +4 -4
- package/src/lib/utils/CanvasUtils.ts +306 -306
- package/src/lib/utils/diff.test.ts +453 -453
- package/src/lib/utils/diff.ts +148 -148
- package/src/lib/utils/index.ts +2 -2
- package/src/lib/utils/is.ts +11 -11
- package/src/lib/utils/makeSignalExtensions.ts +30 -30
- package/src/lib/utils/video/declarations.d.ts +1 -1
- package/src/lib/utils/video/ffmpeg-client.ts +50 -50
- package/src/lib/utils/video/mp4-parser-manager.ts +72 -72
- package/src/lib/utils/video/parser/index.ts +1 -1
- package/src/lib/utils/video/parser/parser.ts +257 -257
- package/src/lib/utils/video/parser/sampler.ts +72 -72
- package/src/lib/utils/video/parser/segment.ts +302 -302
- package/src/lib/utils/video/parser/sink.ts +29 -29
- package/src/lib/utils/video/parser/utils.ts +31 -31
- package/src/tsconfig.base.json +19 -19
- package/src/tsconfig.build.json +8 -8
- package/src/tsconfig.json +5 -5
- package/tsconfig.project.json +7 -7
|
@@ -1,143 +1,143 @@
|
|
|
1
|
-
import type {BBox, SignalValue, SimpleSignal} from '@twick/core';
|
|
2
|
-
import {
|
|
3
|
-
createSignal,
|
|
4
|
-
easeOutExpo,
|
|
5
|
-
linear,
|
|
6
|
-
map,
|
|
7
|
-
threadable,
|
|
8
|
-
} from '@twick/core';
|
|
9
|
-
import {computed, initial, nodeName, signal} from '../decorators';
|
|
10
|
-
import type {CanvasStyleSignal} from '../decorators/canvasStyleSignal';
|
|
11
|
-
import {canvasStyleSignal} from '../decorators/canvasStyleSignal';
|
|
12
|
-
import type {PossibleCanvasStyle} from '../partials';
|
|
13
|
-
import {resolveCanvasStyle} from '../utils';
|
|
14
|
-
import type {LayoutProps} from './Layout';
|
|
15
|
-
import {Layout} from './Layout';
|
|
16
|
-
|
|
17
|
-
export interface ShapeProps extends LayoutProps {
|
|
18
|
-
fill?: SignalValue<PossibleCanvasStyle>;
|
|
19
|
-
stroke?: SignalValue<PossibleCanvasStyle>;
|
|
20
|
-
strokeFirst?: SignalValue<boolean>;
|
|
21
|
-
lineWidth?: SignalValue<number>;
|
|
22
|
-
lineJoin?: SignalValue<CanvasLineJoin>;
|
|
23
|
-
lineCap?: SignalValue<CanvasLineCap>;
|
|
24
|
-
lineDash?: SignalValue<number[]>;
|
|
25
|
-
lineDashOffset?: SignalValue<number>;
|
|
26
|
-
antialiased?: SignalValue<boolean>;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
@nodeName('Shape')
|
|
30
|
-
export abstract class Shape extends Layout {
|
|
31
|
-
@canvasStyleSignal()
|
|
32
|
-
public declare readonly fill: CanvasStyleSignal<this>;
|
|
33
|
-
@canvasStyleSignal()
|
|
34
|
-
public declare readonly stroke: CanvasStyleSignal<this>;
|
|
35
|
-
@initial(false)
|
|
36
|
-
@signal()
|
|
37
|
-
public declare readonly strokeFirst: SimpleSignal<boolean, this>;
|
|
38
|
-
@initial(0)
|
|
39
|
-
@signal()
|
|
40
|
-
public declare readonly lineWidth: SimpleSignal<number, this>;
|
|
41
|
-
@initial('miter')
|
|
42
|
-
@signal()
|
|
43
|
-
public declare readonly lineJoin: SimpleSignal<CanvasLineJoin, this>;
|
|
44
|
-
@initial('butt')
|
|
45
|
-
@signal()
|
|
46
|
-
public declare readonly lineCap: SimpleSignal<CanvasLineCap, this>;
|
|
47
|
-
@initial([])
|
|
48
|
-
@signal()
|
|
49
|
-
public declare readonly lineDash: SimpleSignal<number[], this>;
|
|
50
|
-
@initial(0)
|
|
51
|
-
@signal()
|
|
52
|
-
public declare readonly lineDashOffset: SimpleSignal<number, this>;
|
|
53
|
-
@initial(true)
|
|
54
|
-
@signal()
|
|
55
|
-
public declare readonly antialiased: SimpleSignal<boolean, this>;
|
|
56
|
-
|
|
57
|
-
protected readonly rippleStrength = createSignal<number, this>(0);
|
|
58
|
-
|
|
59
|
-
@computed()
|
|
60
|
-
protected rippleSize() {
|
|
61
|
-
return easeOutExpo(this.rippleStrength(), 0, 50);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
public constructor(props: ShapeProps) {
|
|
65
|
-
super(props);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
protected applyText(context: CanvasRenderingContext2D) {
|
|
69
|
-
context.direction = this.textDirection();
|
|
70
|
-
this.element.dir = this.textDirection();
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
protected applyStyle(context: CanvasRenderingContext2D) {
|
|
74
|
-
context.fillStyle = resolveCanvasStyle(this.fill(), context);
|
|
75
|
-
context.strokeStyle = resolveCanvasStyle(this.stroke(), context);
|
|
76
|
-
context.lineWidth = this.lineWidth();
|
|
77
|
-
context.lineJoin = this.lineJoin();
|
|
78
|
-
context.lineCap = this.lineCap();
|
|
79
|
-
context.setLineDash(this.lineDash());
|
|
80
|
-
context.lineDashOffset = this.lineDashOffset();
|
|
81
|
-
if (!this.antialiased()) {
|
|
82
|
-
// from https://stackoverflow.com/a/68372384
|
|
83
|
-
context.filter =
|
|
84
|
-
'url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxmaWx0ZXIgaWQ9ImZpbHRlciIgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVDb21wb25lbnRUcmFuc2Zlcj48ZmVGdW5jUiB0eXBlPSJpZGVudGl0eSIvPjxmZUZ1bmNHIHR5cGU9ImlkZW50aXR5Ii8+PGZlRnVuY0IgdHlwZT0iaWRlbnRpdHkiLz48ZmVGdW5jQSB0eXBlPSJkaXNjcmV0ZSIgdGFibGVWYWx1ZXM9IjAgMSIvPjwvZmVDb21wb25lbnRUcmFuc2Zlcj48L2ZpbHRlcj48L3N2Zz4=#filter)';
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
protected override async draw(context: CanvasRenderingContext2D) {
|
|
89
|
-
this.drawShape(context);
|
|
90
|
-
if (this.clip()) {
|
|
91
|
-
context.clip(this.getPath());
|
|
92
|
-
}
|
|
93
|
-
await this.drawChildren(context);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
protected drawShape(context: CanvasRenderingContext2D) {
|
|
97
|
-
const path = this.getPath();
|
|
98
|
-
const hasStroke = this.lineWidth() > 0 && this.stroke() !== null;
|
|
99
|
-
const hasFill = this.fill() !== null;
|
|
100
|
-
context.save();
|
|
101
|
-
this.applyStyle(context);
|
|
102
|
-
this.drawRipple(context);
|
|
103
|
-
if (this.strokeFirst()) {
|
|
104
|
-
hasStroke && context.stroke(path);
|
|
105
|
-
hasFill && context.fill(path);
|
|
106
|
-
} else {
|
|
107
|
-
hasFill && context.fill(path);
|
|
108
|
-
hasStroke && context.stroke(path);
|
|
109
|
-
}
|
|
110
|
-
context.restore();
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
protected override getCacheBBox(): BBox {
|
|
114
|
-
return super.getCacheBBox().expand(this.lineWidth() / 2);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
@computed()
|
|
118
|
-
protected getPath(): Path2D {
|
|
119
|
-
return new Path2D();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
protected getRipplePath(): Path2D {
|
|
123
|
-
return new Path2D();
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
protected drawRipple(context: CanvasRenderingContext2D) {
|
|
127
|
-
const rippleStrength = this.rippleStrength();
|
|
128
|
-
if (rippleStrength > 0) {
|
|
129
|
-
const ripplePath = this.getRipplePath();
|
|
130
|
-
context.save();
|
|
131
|
-
context.globalAlpha *= map(0.54, 0, rippleStrength);
|
|
132
|
-
context.fill(ripplePath);
|
|
133
|
-
context.restore();
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
@threadable()
|
|
138
|
-
public *ripple(duration = 1) {
|
|
139
|
-
this.rippleStrength(0);
|
|
140
|
-
yield* this.rippleStrength(1, duration, linear);
|
|
141
|
-
this.rippleStrength(0);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
1
|
+
import type {BBox, SignalValue, SimpleSignal} from '@twick/core';
|
|
2
|
+
import {
|
|
3
|
+
createSignal,
|
|
4
|
+
easeOutExpo,
|
|
5
|
+
linear,
|
|
6
|
+
map,
|
|
7
|
+
threadable,
|
|
8
|
+
} from '@twick/core';
|
|
9
|
+
import {computed, initial, nodeName, signal} from '../decorators';
|
|
10
|
+
import type {CanvasStyleSignal} from '../decorators/canvasStyleSignal';
|
|
11
|
+
import {canvasStyleSignal} from '../decorators/canvasStyleSignal';
|
|
12
|
+
import type {PossibleCanvasStyle} from '../partials';
|
|
13
|
+
import {resolveCanvasStyle} from '../utils';
|
|
14
|
+
import type {LayoutProps} from './Layout';
|
|
15
|
+
import {Layout} from './Layout';
|
|
16
|
+
|
|
17
|
+
export interface ShapeProps extends LayoutProps {
|
|
18
|
+
fill?: SignalValue<PossibleCanvasStyle>;
|
|
19
|
+
stroke?: SignalValue<PossibleCanvasStyle>;
|
|
20
|
+
strokeFirst?: SignalValue<boolean>;
|
|
21
|
+
lineWidth?: SignalValue<number>;
|
|
22
|
+
lineJoin?: SignalValue<CanvasLineJoin>;
|
|
23
|
+
lineCap?: SignalValue<CanvasLineCap>;
|
|
24
|
+
lineDash?: SignalValue<number[]>;
|
|
25
|
+
lineDashOffset?: SignalValue<number>;
|
|
26
|
+
antialiased?: SignalValue<boolean>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@nodeName('Shape')
|
|
30
|
+
export abstract class Shape extends Layout {
|
|
31
|
+
@canvasStyleSignal()
|
|
32
|
+
public declare readonly fill: CanvasStyleSignal<this>;
|
|
33
|
+
@canvasStyleSignal()
|
|
34
|
+
public declare readonly stroke: CanvasStyleSignal<this>;
|
|
35
|
+
@initial(false)
|
|
36
|
+
@signal()
|
|
37
|
+
public declare readonly strokeFirst: SimpleSignal<boolean, this>;
|
|
38
|
+
@initial(0)
|
|
39
|
+
@signal()
|
|
40
|
+
public declare readonly lineWidth: SimpleSignal<number, this>;
|
|
41
|
+
@initial('miter')
|
|
42
|
+
@signal()
|
|
43
|
+
public declare readonly lineJoin: SimpleSignal<CanvasLineJoin, this>;
|
|
44
|
+
@initial('butt')
|
|
45
|
+
@signal()
|
|
46
|
+
public declare readonly lineCap: SimpleSignal<CanvasLineCap, this>;
|
|
47
|
+
@initial([])
|
|
48
|
+
@signal()
|
|
49
|
+
public declare readonly lineDash: SimpleSignal<number[], this>;
|
|
50
|
+
@initial(0)
|
|
51
|
+
@signal()
|
|
52
|
+
public declare readonly lineDashOffset: SimpleSignal<number, this>;
|
|
53
|
+
@initial(true)
|
|
54
|
+
@signal()
|
|
55
|
+
public declare readonly antialiased: SimpleSignal<boolean, this>;
|
|
56
|
+
|
|
57
|
+
protected readonly rippleStrength = createSignal<number, this>(0);
|
|
58
|
+
|
|
59
|
+
@computed()
|
|
60
|
+
protected rippleSize() {
|
|
61
|
+
return easeOutExpo(this.rippleStrength(), 0, 50);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public constructor(props: ShapeProps) {
|
|
65
|
+
super(props);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected applyText(context: CanvasRenderingContext2D) {
|
|
69
|
+
context.direction = this.textDirection();
|
|
70
|
+
this.element.dir = this.textDirection();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
protected applyStyle(context: CanvasRenderingContext2D) {
|
|
74
|
+
context.fillStyle = resolveCanvasStyle(this.fill(), context);
|
|
75
|
+
context.strokeStyle = resolveCanvasStyle(this.stroke(), context);
|
|
76
|
+
context.lineWidth = this.lineWidth();
|
|
77
|
+
context.lineJoin = this.lineJoin();
|
|
78
|
+
context.lineCap = this.lineCap();
|
|
79
|
+
context.setLineDash(this.lineDash());
|
|
80
|
+
context.lineDashOffset = this.lineDashOffset();
|
|
81
|
+
if (!this.antialiased()) {
|
|
82
|
+
// from https://stackoverflow.com/a/68372384
|
|
83
|
+
context.filter =
|
|
84
|
+
'url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxmaWx0ZXIgaWQ9ImZpbHRlciIgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj48ZmVDb21wb25lbnRUcmFuc2Zlcj48ZmVGdW5jUiB0eXBlPSJpZGVudGl0eSIvPjxmZUZ1bmNHIHR5cGU9ImlkZW50aXR5Ii8+PGZlRnVuY0IgdHlwZT0iaWRlbnRpdHkiLz48ZmVGdW5jQSB0eXBlPSJkaXNjcmV0ZSIgdGFibGVWYWx1ZXM9IjAgMSIvPjwvZmVDb21wb25lbnRUcmFuc2Zlcj48L2ZpbHRlcj48L3N2Zz4=#filter)';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
protected override async draw(context: CanvasRenderingContext2D) {
|
|
89
|
+
this.drawShape(context);
|
|
90
|
+
if (this.clip()) {
|
|
91
|
+
context.clip(this.getPath());
|
|
92
|
+
}
|
|
93
|
+
await this.drawChildren(context);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
protected drawShape(context: CanvasRenderingContext2D) {
|
|
97
|
+
const path = this.getPath();
|
|
98
|
+
const hasStroke = this.lineWidth() > 0 && this.stroke() !== null;
|
|
99
|
+
const hasFill = this.fill() !== null;
|
|
100
|
+
context.save();
|
|
101
|
+
this.applyStyle(context);
|
|
102
|
+
this.drawRipple(context);
|
|
103
|
+
if (this.strokeFirst()) {
|
|
104
|
+
hasStroke && context.stroke(path);
|
|
105
|
+
hasFill && context.fill(path);
|
|
106
|
+
} else {
|
|
107
|
+
hasFill && context.fill(path);
|
|
108
|
+
hasStroke && context.stroke(path);
|
|
109
|
+
}
|
|
110
|
+
context.restore();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
protected override getCacheBBox(): BBox {
|
|
114
|
+
return super.getCacheBBox().expand(this.lineWidth() / 2);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@computed()
|
|
118
|
+
protected getPath(): Path2D {
|
|
119
|
+
return new Path2D();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
protected getRipplePath(): Path2D {
|
|
123
|
+
return new Path2D();
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
protected drawRipple(context: CanvasRenderingContext2D) {
|
|
127
|
+
const rippleStrength = this.rippleStrength();
|
|
128
|
+
if (rippleStrength > 0) {
|
|
129
|
+
const ripplePath = this.getRipplePath();
|
|
130
|
+
context.save();
|
|
131
|
+
context.globalAlpha *= map(0.54, 0, rippleStrength);
|
|
132
|
+
context.fill(ripplePath);
|
|
133
|
+
context.restore();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@threadable()
|
|
138
|
+
public *ripple(duration = 1) {
|
|
139
|
+
this.rippleStrength(0);
|
|
140
|
+
yield* this.rippleStrength(1, duration, linear);
|
|
141
|
+
this.rippleStrength(0);
|
|
142
|
+
}
|
|
143
|
+
}
|