@canvas-commons/2d 0.2.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 +22 -0
- package/editor/index.css +40 -0
- package/editor/index.js +525 -0
- package/editor/index.js.map +1 -0
- package/lib/index-OvpZ-GsA.d.ts +5673 -0
- package/lib/index-OvpZ-GsA.d.ts.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +10326 -0
- package/lib/index.js.map +1 -0
- package/lib/jsx-dev-runtime.d.ts +2 -0
- package/lib/jsx-dev-runtime.js +2 -0
- package/lib/jsx-runtime.d.ts +2 -0
- package/lib/jsx-runtime.js +28 -0
- package/lib/jsx-runtime.js.map +1 -0
- package/package.json +79 -0
- package/src/editor/NodeInspectorConfig.tsx +76 -0
- package/src/editor/PreviewOverlayConfig.tsx +65 -0
- package/src/editor/Provider.tsx +109 -0
- package/src/editor/SceneGraphTabConfig.tsx +87 -0
- package/src/editor/icons/CircleIcon.tsx +7 -0
- package/src/editor/icons/CodeIcon.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 +19 -0
- package/src/editor/shortcuts.ts +27 -0
- package/src/editor/tree/DetachedRoot.tsx +27 -0
- package/src/editor/tree/NodeElement.tsx +72 -0
- package/src/editor/tree/TreeElement.tsx +70 -0
- package/src/editor/tree/TreeRoot.tsx +10 -0
- package/src/editor/tree/ViewRoot.tsx +20 -0
- package/src/editor/tree/index.module.scss +45 -0
- package/src/editor/tree/index.ts +4 -0
- package/src/editor/tree/navigation.ts +145 -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/utils/SignalSet.ts +37 -0
- package/src/editor/utils/index.ts +1 -0
- package/src/editor/vite-env.d.ts +1 -0
- package/src/lib/code/CodeCursor.ts +468 -0
- package/src/lib/code/CodeDiffer.ts +77 -0
- package/src/lib/code/CodeFragment.ts +96 -0
- package/src/lib/code/CodeHighlighter.ts +73 -0
- package/src/lib/code/CodeMetrics.ts +47 -0
- package/src/lib/code/CodeRange.test.ts +113 -0
- package/src/lib/code/CodeRange.ts +222 -0
- package/src/lib/code/CodeScope.ts +100 -0
- package/src/lib/code/CodeSelection.ts +28 -0
- package/src/lib/code/CodeSignal.ts +348 -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 +125 -0
- package/src/lib/code/index.ts +13 -0
- package/src/lib/components/Bezier.ts +103 -0
- package/src/lib/components/Camera.ts +401 -0
- package/src/lib/components/Circle.ts +310 -0
- package/src/lib/components/Code.ts +532 -0
- package/src/lib/components/CubicBezier.ts +115 -0
- package/src/lib/components/Curve.ts +460 -0
- package/src/lib/components/Grid.ts +134 -0
- package/src/lib/components/Icon.ts +153 -0
- package/src/lib/components/Img.ts +328 -0
- package/src/lib/components/Knot.ts +156 -0
- package/src/lib/components/Latex.ts +537 -0
- package/src/lib/components/Layout.ts +1101 -0
- package/src/lib/components/Line.ts +394 -0
- package/src/lib/components/Node.ts +1941 -0
- package/src/lib/components/Path.ts +132 -0
- package/src/lib/components/Polygon.ts +266 -0
- package/src/lib/components/QuadBezier.ts +103 -0
- package/src/lib/components/Ray.ts +126 -0
- package/src/lib/components/Rect.ts +219 -0
- package/src/lib/components/SVG.ts +853 -0
- package/src/lib/components/Shape.ts +322 -0
- package/src/lib/components/Spline.ts +318 -0
- package/src/lib/components/Txt.test.tsx +81 -0
- package/src/lib/components/Txt.ts +204 -0
- package/src/lib/components/TxtLeaf.ts +210 -0
- package/src/lib/components/Video.ts +368 -0
- package/src/lib/components/View2D.ts +85 -0
- package/src/lib/components/__logs__/image-without-source.ts +18 -0
- package/src/lib/components/__logs__/line-without-points.ts +31 -0
- package/src/lib/components/__logs__/reactive-playback-rate.ts +22 -0
- package/src/lib/components/__logs__/spline-with-insufficient-knots.ts +25 -0
- package/src/lib/components/__tests__/Camera.test.tsx +73 -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__/fontInheritance.test.tsx +102 -0
- package/src/lib/components/__tests__/generatorTest.ts +27 -0
- package/src/lib/components/__tests__/mockScene2D.ts +50 -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 +26 -0
- package/src/lib/components/types.ts +35 -0
- package/src/lib/curves/ArcSegment.ts +169 -0
- package/src/lib/curves/CircleSegment.ts +99 -0
- package/src/lib/curves/CubicBezierSegment.ts +80 -0
- package/src/lib/curves/CurveDrawingInfo.ts +11 -0
- package/src/lib/curves/CurvePoint.ts +15 -0
- package/src/lib/curves/CurveProfile.ts +28 -0
- package/src/lib/curves/KnotInfo.ts +10 -0
- package/src/lib/curves/LineSegment.ts +75 -0
- package/src/lib/curves/Polynomial.ts +355 -0
- package/src/lib/curves/Polynomial2D.ts +62 -0
- package/src/lib/curves/PolynomialSegment.ts +151 -0
- package/src/lib/curves/QuadBezierSegment.ts +66 -0
- package/src/lib/curves/Segment.ts +31 -0
- package/src/lib/curves/UniformPolynomialCurveSampler.ts +93 -0
- package/src/lib/curves/createCurveProfileLerp.ts +471 -0
- package/src/lib/curves/getBezierSplineProfile.ts +227 -0
- package/src/lib/curves/getCircleProfile.ts +86 -0
- package/src/lib/curves/getPathProfile.ts +177 -0
- package/src/lib/curves/getPointAtDistance.ts +21 -0
- package/src/lib/curves/getPolylineProfile.test.ts +21 -0
- package/src/lib/curves/getPolylineProfile.ts +88 -0
- package/src/lib/curves/getRectProfile.ts +138 -0
- package/src/lib/curves/index.ts +16 -0
- package/src/lib/decorators/canvasStyleSignal.ts +15 -0
- package/src/lib/decorators/colorSignal.ts +9 -0
- package/src/lib/decorators/compound.ts +85 -0
- package/src/lib/decorators/computed.ts +18 -0
- package/src/lib/decorators/defaultStyle.ts +15 -0
- package/src/lib/decorators/filtersSignal.ts +133 -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 +89 -0
- package/src/lib/decorators/signal.ts +348 -0
- package/src/lib/decorators/spacingSignal.ts +15 -0
- package/src/lib/decorators/transformSignals.test.ts +858 -0
- package/src/lib/decorators/transformSignals.ts +1633 -0
- package/src/lib/decorators/vector2Signal.ts +35 -0
- package/src/lib/globals.d.ts +2 -0
- package/src/lib/index.ts +9 -0
- package/src/lib/jsx-dev-runtime.ts +2 -0
- package/src/lib/jsx-runtime.ts +45 -0
- package/src/lib/morphers/PathMorpher.ts +8 -0
- package/src/lib/morphers/defaultMorpher.ts +43 -0
- package/src/lib/morphers/index.ts +4 -0
- package/src/lib/morphers/manimMorpher.ts +658 -0
- package/src/lib/parse-svg-path.d.ts +14 -0
- package/src/lib/partials/Filter.ts +185 -0
- package/src/lib/partials/Gradient.ts +103 -0
- package/src/lib/partials/Pattern.ts +35 -0
- package/src/lib/partials/RoughConfig.ts +180 -0
- package/src/lib/partials/ShaderConfig.ts +122 -0
- package/src/lib/partials/index.ts +5 -0
- package/src/lib/partials/types.ts +58 -0
- package/src/lib/scenes/Scene2D.ts +167 -0
- package/src/lib/scenes/index.ts +3 -0
- package/src/lib/scenes/makeScene2D.ts +19 -0
- package/src/lib/scenes/useScene2D.ts +6 -0
- package/src/lib/tsconfig.build.json +5 -0
- package/src/lib/tsconfig.json +11 -0
- package/src/lib/tsdoc.json +4 -0
- package/src/lib/utils/CanvasUtils.ts +304 -0
- package/src/lib/utils/PathDataBuilder.ts +320 -0
- package/src/lib/utils/diff.test.ts +453 -0
- package/src/lib/utils/diff.ts +148 -0
- package/src/lib/utils/index.ts +5 -0
- package/src/lib/utils/is.ts +11 -0
- package/src/lib/utils/makeSignalExtensions.ts +29 -0
- package/src/lib/utils/rough.ts +513 -0
- package/src/lib/utils/withDefaults.tsx +26 -0
- package/src/tsconfig.base.json +18 -0
- package/src/tsconfig.build.json +8 -0
- package/src/tsconfig.json +5 -0
- package/tsconfig.project.json +7 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createSignal,
|
|
3
|
+
map,
|
|
4
|
+
SignalValue,
|
|
5
|
+
SimpleSignal,
|
|
6
|
+
transformScalar,
|
|
7
|
+
} from '@canvas-commons/core';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* All possible CSS filter names.
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export type FilterName =
|
|
15
|
+
| 'invert'
|
|
16
|
+
| 'sepia'
|
|
17
|
+
| 'grayscale'
|
|
18
|
+
| 'brightness'
|
|
19
|
+
| 'contrast'
|
|
20
|
+
| 'saturate'
|
|
21
|
+
| 'hue'
|
|
22
|
+
| 'blur';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Definitions of all possible CSS filters.
|
|
26
|
+
*
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export const FILTERS: Record<string, Partial<FilterProps>> = {
|
|
30
|
+
invert: {
|
|
31
|
+
name: 'invert',
|
|
32
|
+
},
|
|
33
|
+
sepia: {
|
|
34
|
+
name: 'sepia',
|
|
35
|
+
},
|
|
36
|
+
grayscale: {
|
|
37
|
+
name: 'grayscale',
|
|
38
|
+
},
|
|
39
|
+
brightness: {
|
|
40
|
+
name: 'brightness',
|
|
41
|
+
default: 1,
|
|
42
|
+
},
|
|
43
|
+
contrast: {
|
|
44
|
+
name: 'contrast',
|
|
45
|
+
default: 1,
|
|
46
|
+
},
|
|
47
|
+
saturate: {
|
|
48
|
+
name: 'saturate',
|
|
49
|
+
default: 1,
|
|
50
|
+
},
|
|
51
|
+
hue: {
|
|
52
|
+
name: 'hue-rotate',
|
|
53
|
+
unit: 'deg',
|
|
54
|
+
scale: 1,
|
|
55
|
+
},
|
|
56
|
+
blur: {
|
|
57
|
+
name: 'blur',
|
|
58
|
+
transform: true,
|
|
59
|
+
unit: 'px',
|
|
60
|
+
scale: 1,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* A unified abstraction for all CSS filters.
|
|
66
|
+
*/
|
|
67
|
+
export interface FilterProps {
|
|
68
|
+
name: string;
|
|
69
|
+
value: SignalValue<number>;
|
|
70
|
+
unit: string;
|
|
71
|
+
scale: number;
|
|
72
|
+
transform: boolean;
|
|
73
|
+
default: number;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export class Filter {
|
|
77
|
+
public get name() {
|
|
78
|
+
return this.props.name;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public get default() {
|
|
82
|
+
return this.props.default;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public readonly value: SimpleSignal<number, Filter>;
|
|
86
|
+
private readonly props: FilterProps;
|
|
87
|
+
|
|
88
|
+
public constructor(props: Partial<FilterProps>) {
|
|
89
|
+
this.props = {
|
|
90
|
+
name: 'invert',
|
|
91
|
+
default: 0,
|
|
92
|
+
unit: '%',
|
|
93
|
+
scale: 100,
|
|
94
|
+
transform: false,
|
|
95
|
+
...props,
|
|
96
|
+
value: props.value ?? props.default ?? 0,
|
|
97
|
+
};
|
|
98
|
+
this.value = createSignal(this.props.value, map, this);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
public isActive() {
|
|
102
|
+
return this.value() !== this.props.default;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public serialize(matrix: DOMMatrix): string {
|
|
106
|
+
let value = this.value();
|
|
107
|
+
if (this.props.transform) {
|
|
108
|
+
value = transformScalar(value, matrix);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return `${this.props.name}(${value * this.props.scale}${this.props.unit})`;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Create an {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/invert | invert} filter.
|
|
117
|
+
*
|
|
118
|
+
* @param value - The value of the filter.
|
|
119
|
+
*/
|
|
120
|
+
export function invert(value?: SignalValue<number>) {
|
|
121
|
+
return new Filter({...FILTERS.invert, value});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/sepia | sepia} filter.
|
|
126
|
+
*
|
|
127
|
+
* @param value - The value of the filter.
|
|
128
|
+
*/
|
|
129
|
+
export function sepia(value?: SignalValue<number>) {
|
|
130
|
+
return new Filter({...FILTERS.sepia, value});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/grayscale | grayscale} filter.
|
|
135
|
+
*
|
|
136
|
+
* @param value - The value of the filter.
|
|
137
|
+
*/
|
|
138
|
+
export function grayscale(value?: SignalValue<number>) {
|
|
139
|
+
return new Filter({...FILTERS.grayscale, value});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/brightness | brightness} filter.
|
|
144
|
+
*
|
|
145
|
+
* @param value - The value of the filter.
|
|
146
|
+
*/
|
|
147
|
+
export function brightness(value?: SignalValue<number>) {
|
|
148
|
+
return new Filter({...FILTERS.brightness, value});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/contrast | contrast} filter.
|
|
153
|
+
*
|
|
154
|
+
* @param value - The value of the filter.
|
|
155
|
+
*/
|
|
156
|
+
export function contrast(value?: SignalValue<number>) {
|
|
157
|
+
return new Filter({...FILTERS.contrast, value});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/saturate | saturate} filter.
|
|
162
|
+
*
|
|
163
|
+
* @param value - The value of the filter.
|
|
164
|
+
*/
|
|
165
|
+
export function saturate(value?: SignalValue<number>) {
|
|
166
|
+
return new Filter({...FILTERS.saturate, value});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/hue-rotate | hue} filter.
|
|
171
|
+
*
|
|
172
|
+
* @param value - The value of the filter in degrees.
|
|
173
|
+
*/
|
|
174
|
+
export function hue(value?: SignalValue<number>) {
|
|
175
|
+
return new Filter({...FILTERS.hue, value});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/blur | blur} filter.
|
|
180
|
+
*
|
|
181
|
+
* @param value - The value of the filter in pixels.
|
|
182
|
+
*/
|
|
183
|
+
export function blur(value?: SignalValue<number>) {
|
|
184
|
+
return new Filter({...FILTERS.blur, value});
|
|
185
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Color,
|
|
3
|
+
PossibleColor,
|
|
4
|
+
PossibleVector2,
|
|
5
|
+
SignalValue,
|
|
6
|
+
SimpleSignal,
|
|
7
|
+
Vector2Signal,
|
|
8
|
+
unwrap,
|
|
9
|
+
} from '@canvas-commons/core';
|
|
10
|
+
import {computed} from '../decorators/computed';
|
|
11
|
+
import {initial, initializeSignals, signal} from '../decorators/signal';
|
|
12
|
+
import {vector2Signal} from '../decorators/vector2Signal';
|
|
13
|
+
|
|
14
|
+
export type GradientType = 'linear' | 'conic' | 'radial';
|
|
15
|
+
|
|
16
|
+
export interface GradientStop {
|
|
17
|
+
offset: SignalValue<number>;
|
|
18
|
+
color: SignalValue<PossibleColor>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface GradientProps {
|
|
22
|
+
type?: SignalValue<GradientType>;
|
|
23
|
+
fromX?: SignalValue<number>;
|
|
24
|
+
fromY?: SignalValue<number>;
|
|
25
|
+
from?: SignalValue<PossibleVector2>;
|
|
26
|
+
toX?: SignalValue<number>;
|
|
27
|
+
toY?: SignalValue<number>;
|
|
28
|
+
to?: SignalValue<PossibleVector2>;
|
|
29
|
+
angle?: SignalValue<number>;
|
|
30
|
+
fromRadius?: SignalValue<number>;
|
|
31
|
+
toRadius?: SignalValue<number>;
|
|
32
|
+
stops?: GradientStop[];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class Gradient {
|
|
36
|
+
@initial('linear')
|
|
37
|
+
@signal()
|
|
38
|
+
declare public readonly type: SimpleSignal<GradientType, this>;
|
|
39
|
+
|
|
40
|
+
@vector2Signal('from')
|
|
41
|
+
declare public readonly from: Vector2Signal<this>;
|
|
42
|
+
|
|
43
|
+
@vector2Signal('to')
|
|
44
|
+
declare public readonly to: Vector2Signal<this>;
|
|
45
|
+
|
|
46
|
+
@initial(0)
|
|
47
|
+
@signal()
|
|
48
|
+
declare public readonly angle: SimpleSignal<number, this>;
|
|
49
|
+
@initial(0)
|
|
50
|
+
@signal()
|
|
51
|
+
declare public readonly fromRadius: SimpleSignal<number, this>;
|
|
52
|
+
@initial(0)
|
|
53
|
+
@signal()
|
|
54
|
+
declare public readonly toRadius: SimpleSignal<number, this>;
|
|
55
|
+
@initial([])
|
|
56
|
+
@signal()
|
|
57
|
+
declare public readonly stops: SimpleSignal<GradientStop[], this>;
|
|
58
|
+
|
|
59
|
+
public constructor(props: GradientProps) {
|
|
60
|
+
initializeSignals(this, props);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@computed()
|
|
64
|
+
public canvasGradient(context: CanvasRenderingContext2D): CanvasGradient {
|
|
65
|
+
let gradient: CanvasGradient;
|
|
66
|
+
switch (this.type()) {
|
|
67
|
+
case 'linear':
|
|
68
|
+
gradient = context.createLinearGradient(
|
|
69
|
+
this.from.x(),
|
|
70
|
+
this.from.y(),
|
|
71
|
+
this.to.x(),
|
|
72
|
+
this.to.y(),
|
|
73
|
+
);
|
|
74
|
+
break;
|
|
75
|
+
case 'conic':
|
|
76
|
+
gradient = context.createConicGradient(
|
|
77
|
+
this.angle(),
|
|
78
|
+
this.from.x(),
|
|
79
|
+
this.from.y(),
|
|
80
|
+
);
|
|
81
|
+
break;
|
|
82
|
+
case 'radial':
|
|
83
|
+
gradient = context.createRadialGradient(
|
|
84
|
+
this.from.x(),
|
|
85
|
+
this.from.y(),
|
|
86
|
+
this.fromRadius(),
|
|
87
|
+
this.to.x(),
|
|
88
|
+
this.to.y(),
|
|
89
|
+
this.toRadius(),
|
|
90
|
+
);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
for (const {offset, color} of this.stops()) {
|
|
95
|
+
gradient.addColorStop(
|
|
96
|
+
unwrap(offset),
|
|
97
|
+
new Color(unwrap(color)).serialize(),
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return gradient;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {SimpleSignal} from '@canvas-commons/core';
|
|
2
|
+
import {computed} from '../decorators/computed';
|
|
3
|
+
import {initial, initializeSignals, signal} from '../decorators/signal';
|
|
4
|
+
|
|
5
|
+
export type CanvasRepetition =
|
|
6
|
+
| null
|
|
7
|
+
| 'repeat'
|
|
8
|
+
| 'repeat-x'
|
|
9
|
+
| 'repeat-y'
|
|
10
|
+
| 'no-repeat';
|
|
11
|
+
|
|
12
|
+
// TODO Support custom transformation matrices
|
|
13
|
+
export interface PatternProps {
|
|
14
|
+
image: CanvasImageSource;
|
|
15
|
+
repetition?: CanvasRepetition;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class Pattern {
|
|
19
|
+
@signal()
|
|
20
|
+
declare public readonly image: SimpleSignal<CanvasImageSource, this>;
|
|
21
|
+
@initial(null)
|
|
22
|
+
@signal()
|
|
23
|
+
declare public readonly repetition: SimpleSignal<CanvasRepetition, this>;
|
|
24
|
+
|
|
25
|
+
public constructor(props: PatternProps) {
|
|
26
|
+
initializeSignals(this, props);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@computed()
|
|
30
|
+
public canvasPattern(
|
|
31
|
+
context: CanvasRenderingContext2D,
|
|
32
|
+
): CanvasPattern | null {
|
|
33
|
+
return context.createPattern(this.image(), this.repetition());
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rough.js integration types for Canvas Commons
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* These types define the configuration options for rendering shapes with
|
|
6
|
+
* a hand-drawn, sketchy appearance using Rough.js.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Fill style options for rough shapes.
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* - `hachure`: Parallel lines filling the shape (default)
|
|
14
|
+
* - `solid`: Solid fill with slight irregularity
|
|
15
|
+
* - `zigzag`: Zigzag pattern filling
|
|
16
|
+
* - `cross-hatch`: Crossed parallel lines
|
|
17
|
+
* - `dots`: Dotted pattern filling
|
|
18
|
+
* - `dashed`: Dashed lines filling
|
|
19
|
+
* - `zigzag-line`: Zigzag lines filling
|
|
20
|
+
*/
|
|
21
|
+
export type RoughFillStyle =
|
|
22
|
+
| 'hachure'
|
|
23
|
+
| 'solid'
|
|
24
|
+
| 'zigzag'
|
|
25
|
+
| 'cross-hatch'
|
|
26
|
+
| 'dots'
|
|
27
|
+
| 'dashed'
|
|
28
|
+
| 'zigzag-line';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Configuration options for rough rendering.
|
|
32
|
+
*
|
|
33
|
+
* @remarks
|
|
34
|
+
* These options control the appearance of the hand-drawn style.
|
|
35
|
+
* All numeric values can be animated using signals.
|
|
36
|
+
*/
|
|
37
|
+
export interface RoughConfig {
|
|
38
|
+
/**
|
|
39
|
+
* Numerical value indicating how rough the drawing is.
|
|
40
|
+
*
|
|
41
|
+
* @remarks
|
|
42
|
+
* A value of 0 will produce a smooth shape, while higher values
|
|
43
|
+
* introduce more irregularity. Typical range is 0-10.
|
|
44
|
+
*
|
|
45
|
+
* @defaultValue 1
|
|
46
|
+
*/
|
|
47
|
+
roughness: number;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Controls the curve deviation from a straight line.
|
|
51
|
+
*
|
|
52
|
+
* @remarks
|
|
53
|
+
* A value of 0 will cause lines to be perfectly straight.
|
|
54
|
+
* Higher values introduce more curvature.
|
|
55
|
+
*
|
|
56
|
+
* @defaultValue 1
|
|
57
|
+
*/
|
|
58
|
+
bowing: number;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Seed for the random number generator.
|
|
62
|
+
*
|
|
63
|
+
* @remarks
|
|
64
|
+
* Using the same seed produces consistent results, which is useful
|
|
65
|
+
* for reproducible animations.
|
|
66
|
+
*/
|
|
67
|
+
seed?: number;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Fill style for the shape.
|
|
71
|
+
*
|
|
72
|
+
* @defaultValue 'hachure'
|
|
73
|
+
*/
|
|
74
|
+
fillStyle: RoughFillStyle;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Thickness of the lines used for filling.
|
|
78
|
+
*
|
|
79
|
+
* @remarks
|
|
80
|
+
* Only applicable for hachure, cross-hatch, and similar fill styles.
|
|
81
|
+
*
|
|
82
|
+
* @defaultValue Half of strokeWidth, or 1
|
|
83
|
+
*/
|
|
84
|
+
fillWeight?: number;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Angle of the hachure lines in degrees.
|
|
88
|
+
*
|
|
89
|
+
* @remarks
|
|
90
|
+
* Only applicable for hachure and cross-hatch fill styles.
|
|
91
|
+
*
|
|
92
|
+
* @defaultValue -41
|
|
93
|
+
*/
|
|
94
|
+
hachureAngle: number;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Gap between hachure lines in pixels.
|
|
98
|
+
*
|
|
99
|
+
* @remarks
|
|
100
|
+
* Only applicable for hachure, cross-hatch, and similar fill styles.
|
|
101
|
+
*
|
|
102
|
+
* @defaultValue 4 times strokeWidth
|
|
103
|
+
*/
|
|
104
|
+
hachureGap: number;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Curve tightness for hachure lines.
|
|
108
|
+
*
|
|
109
|
+
* @remarks
|
|
110
|
+
* Lower values create more curved hachure lines.
|
|
111
|
+
*
|
|
112
|
+
* @defaultValue 0.95
|
|
113
|
+
*/
|
|
114
|
+
curveStepCount?: number;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Simplification tolerance for paths.
|
|
118
|
+
*
|
|
119
|
+
* @remarks
|
|
120
|
+
* Higher values simplify the path more aggressively.
|
|
121
|
+
*
|
|
122
|
+
* @defaultValue 0
|
|
123
|
+
*/
|
|
124
|
+
simplification?: number;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Whether to disable multi-stroke rendering.
|
|
128
|
+
*
|
|
129
|
+
* @remarks
|
|
130
|
+
* By default, Rough.js renders strokes with multiple lines for a
|
|
131
|
+
* more sketchy appearance. Set to true to use a single stroke.
|
|
132
|
+
*
|
|
133
|
+
* @defaultValue false
|
|
134
|
+
*/
|
|
135
|
+
disableMultiStroke?: boolean;
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Whether to disable multi-stroke fill.
|
|
139
|
+
*
|
|
140
|
+
* @remarks
|
|
141
|
+
* By default, Rough.js renders fills with multiple passes.
|
|
142
|
+
* Set to true to use a single fill pass.
|
|
143
|
+
*
|
|
144
|
+
* @defaultValue false
|
|
145
|
+
*/
|
|
146
|
+
disableMultiStrokeFill?: boolean;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Partial rough configuration with defaults applied.
|
|
151
|
+
*/
|
|
152
|
+
export type PartialRoughConfig = Partial<RoughConfig>;
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Get default rough configuration.
|
|
156
|
+
*
|
|
157
|
+
* @returns Default configuration values
|
|
158
|
+
*/
|
|
159
|
+
export function getDefaultRoughConfig(): RoughConfig {
|
|
160
|
+
return {
|
|
161
|
+
roughness: 1,
|
|
162
|
+
bowing: 1,
|
|
163
|
+
fillStyle: 'hachure',
|
|
164
|
+
hachureAngle: -41,
|
|
165
|
+
hachureGap: 4,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Merge partial rough configuration with defaults.
|
|
171
|
+
*
|
|
172
|
+
* @param config - Partial configuration to merge
|
|
173
|
+
* @returns Complete configuration with defaults applied
|
|
174
|
+
*/
|
|
175
|
+
export function mergeRoughConfig(config: PartialRoughConfig): RoughConfig {
|
|
176
|
+
return {
|
|
177
|
+
...getDefaultRoughConfig(),
|
|
178
|
+
...config,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import {
|
|
2
|
+
experimentalLog,
|
|
3
|
+
SignalValue,
|
|
4
|
+
useLogger,
|
|
5
|
+
useScene,
|
|
6
|
+
WebGLConvertible,
|
|
7
|
+
} from '@canvas-commons/core';
|
|
8
|
+
import {Node} from '../components';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Describes a shader program used to apply effects to nodes.
|
|
12
|
+
*
|
|
13
|
+
* @experimental
|
|
14
|
+
*/
|
|
15
|
+
export interface ShaderConfig {
|
|
16
|
+
/**
|
|
17
|
+
* The source code of the fragment shader.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```glsl
|
|
21
|
+
* #version 300 es
|
|
22
|
+
* precision highp float;
|
|
23
|
+
*
|
|
24
|
+
* #include "@canvas-commons/core/shaders/common.glsl"
|
|
25
|
+
*
|
|
26
|
+
* void main() {
|
|
27
|
+
* out_color = texture(core_source_tx, source_uv);
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
fragment: string;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Custom uniforms to be passed to the shader.
|
|
35
|
+
*
|
|
36
|
+
* @remarks
|
|
37
|
+
* The keys of this object will be used as the uniform names.
|
|
38
|
+
* The values can be either a number or an array of numbers.
|
|
39
|
+
* The following table shows how the values will be mapped to GLSL types.
|
|
40
|
+
*
|
|
41
|
+
* | TypeScript | GLSL |
|
|
42
|
+
* | ---------------------------------- | ------- |
|
|
43
|
+
* | `number` | `float` |
|
|
44
|
+
* | `[number, number]` | `vec2` |
|
|
45
|
+
* | `[number, number, number]` | `vec3` |
|
|
46
|
+
* | `[number, number, number, number]` | `vec4` |
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* const shader = {
|
|
51
|
+
* // ...
|
|
52
|
+
* uniforms: {
|
|
53
|
+
* my_value: () => 1,
|
|
54
|
+
* my_vector: [1, 2, 3],
|
|
55
|
+
* },
|
|
56
|
+
* };
|
|
57
|
+
* ```
|
|
58
|
+
*
|
|
59
|
+
* ```glsl
|
|
60
|
+
* uniform float my_value;
|
|
61
|
+
* uniform vec3 my_vector;
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
uniforms?: Record<string, SignalValue<number | number[] | WebGLConvertible>>;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* A custom hook run before the shader is used.
|
|
68
|
+
*
|
|
69
|
+
* @remarks
|
|
70
|
+
* Gives you low-level access to the WebGL context and the shader program.
|
|
71
|
+
*
|
|
72
|
+
* @param gl - WebGL context.
|
|
73
|
+
* @param program - The shader program.
|
|
74
|
+
*/
|
|
75
|
+
setup?: (gl: WebGL2RenderingContext, program: WebGLProgram) => void;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* A custom hook run after the shader is used.
|
|
79
|
+
*
|
|
80
|
+
* @remarks
|
|
81
|
+
* Gives you low-level access to the WebGL context and the shader program.
|
|
82
|
+
* Can be used to clean up resources created in the {@link setup} hook.
|
|
83
|
+
*
|
|
84
|
+
* @param gl - WebGL context.
|
|
85
|
+
* @param program - The shader program.
|
|
86
|
+
*/
|
|
87
|
+
teardown?: (gl: WebGL2RenderingContext, program: WebGLProgram) => void;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export type PossibleShaderConfig =
|
|
91
|
+
| (ShaderConfig | string)[]
|
|
92
|
+
| ShaderConfig
|
|
93
|
+
| string
|
|
94
|
+
| null;
|
|
95
|
+
|
|
96
|
+
export function parseShader(
|
|
97
|
+
this: Node,
|
|
98
|
+
value: PossibleShaderConfig,
|
|
99
|
+
): ShaderConfig[] {
|
|
100
|
+
let result: ShaderConfig[];
|
|
101
|
+
if (!value) {
|
|
102
|
+
result = [];
|
|
103
|
+
} else if (typeof value === 'string') {
|
|
104
|
+
result = [{fragment: value}];
|
|
105
|
+
} else if (Array.isArray(value)) {
|
|
106
|
+
result = value.map(item =>
|
|
107
|
+
typeof item === 'string' ? {fragment: item} : item,
|
|
108
|
+
);
|
|
109
|
+
} else {
|
|
110
|
+
result = [value];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (!useScene().experimentalFeatures && result.length > 0) {
|
|
114
|
+
result = [];
|
|
115
|
+
useLogger().log({
|
|
116
|
+
...experimentalLog(`Node uses experimental shaders.`),
|
|
117
|
+
inspect: this.key,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {Color, PossibleColor} from '@canvas-commons/core';
|
|
2
|
+
import type {Gradient} from './Gradient';
|
|
3
|
+
import type {Pattern} from './Pattern';
|
|
4
|
+
|
|
5
|
+
export type FlexDirection = 'row' | 'row-reverse' | 'column' | 'column-reverse';
|
|
6
|
+
|
|
7
|
+
export type FlexWrap = 'nowrap' | 'wrap' | 'wrap-reverse';
|
|
8
|
+
|
|
9
|
+
export type FlexBasis =
|
|
10
|
+
| Length
|
|
11
|
+
| 'content'
|
|
12
|
+
| 'max-content'
|
|
13
|
+
| 'min-content'
|
|
14
|
+
| 'fit-content'
|
|
15
|
+
| null;
|
|
16
|
+
|
|
17
|
+
export type FlexContent =
|
|
18
|
+
| 'center'
|
|
19
|
+
| 'start'
|
|
20
|
+
| 'end'
|
|
21
|
+
| 'space-between'
|
|
22
|
+
| 'space-around'
|
|
23
|
+
| 'space-evenly'
|
|
24
|
+
| 'stretch';
|
|
25
|
+
|
|
26
|
+
export type FlexItems = 'center' | 'start' | 'end' | 'stretch' | 'baseline';
|
|
27
|
+
|
|
28
|
+
export type TextWrap = boolean | 'pre';
|
|
29
|
+
|
|
30
|
+
export type LayoutMode = boolean | null;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Represents a length used by most layout properties.
|
|
34
|
+
*
|
|
35
|
+
* @remarks
|
|
36
|
+
* The value can be either:
|
|
37
|
+
* - `number` - the desired length in pixels
|
|
38
|
+
* - `${number}%` - a string with the desired length in percents, for example
|
|
39
|
+
* `'50%'`
|
|
40
|
+
*/
|
|
41
|
+
export type Length = number | `${number}%`;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Represents a desired length used internally by layout Nodes.
|
|
45
|
+
*
|
|
46
|
+
* @remarks
|
|
47
|
+
* When the desired length is set to `null` it represents a default value for
|
|
48
|
+
* whatever property it describes.
|
|
49
|
+
*/
|
|
50
|
+
export type DesiredLength = Length | null;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Represents a length limit used by layout properties such as `max-width`.
|
|
54
|
+
*/
|
|
55
|
+
export type LengthLimit = Length | null | 'max-content' | 'min-content';
|
|
56
|
+
|
|
57
|
+
export type PossibleCanvasStyle = null | PossibleColor | Gradient | Pattern;
|
|
58
|
+
export type CanvasStyle = null | Color | Gradient | Pattern;
|