@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.
Files changed (183) hide show
  1. package/LICENSE +22 -0
  2. package/editor/index.css +40 -0
  3. package/editor/index.js +525 -0
  4. package/editor/index.js.map +1 -0
  5. package/lib/index-OvpZ-GsA.d.ts +5673 -0
  6. package/lib/index-OvpZ-GsA.d.ts.map +1 -0
  7. package/lib/index.d.ts +2 -0
  8. package/lib/index.js +10326 -0
  9. package/lib/index.js.map +1 -0
  10. package/lib/jsx-dev-runtime.d.ts +2 -0
  11. package/lib/jsx-dev-runtime.js +2 -0
  12. package/lib/jsx-runtime.d.ts +2 -0
  13. package/lib/jsx-runtime.js +28 -0
  14. package/lib/jsx-runtime.js.map +1 -0
  15. package/package.json +79 -0
  16. package/src/editor/NodeInspectorConfig.tsx +76 -0
  17. package/src/editor/PreviewOverlayConfig.tsx +65 -0
  18. package/src/editor/Provider.tsx +109 -0
  19. package/src/editor/SceneGraphTabConfig.tsx +87 -0
  20. package/src/editor/icons/CircleIcon.tsx +7 -0
  21. package/src/editor/icons/CodeIcon.tsx +8 -0
  22. package/src/editor/icons/CurveIcon.tsx +7 -0
  23. package/src/editor/icons/GridIcon.tsx +7 -0
  24. package/src/editor/icons/IconMap.ts +35 -0
  25. package/src/editor/icons/ImgIcon.tsx +8 -0
  26. package/src/editor/icons/LayoutIcon.tsx +9 -0
  27. package/src/editor/icons/LineIcon.tsx +7 -0
  28. package/src/editor/icons/NodeIcon.tsx +7 -0
  29. package/src/editor/icons/RayIcon.tsx +7 -0
  30. package/src/editor/icons/RectIcon.tsx +7 -0
  31. package/src/editor/icons/ShapeIcon.tsx +7 -0
  32. package/src/editor/icons/TxtIcon.tsx +8 -0
  33. package/src/editor/icons/VideoIcon.tsx +7 -0
  34. package/src/editor/icons/View2DIcon.tsx +10 -0
  35. package/src/editor/index.css +0 -0
  36. package/src/editor/index.ts +19 -0
  37. package/src/editor/shortcuts.ts +27 -0
  38. package/src/editor/tree/DetachedRoot.tsx +27 -0
  39. package/src/editor/tree/NodeElement.tsx +72 -0
  40. package/src/editor/tree/TreeElement.tsx +70 -0
  41. package/src/editor/tree/TreeRoot.tsx +10 -0
  42. package/src/editor/tree/ViewRoot.tsx +20 -0
  43. package/src/editor/tree/index.module.scss +45 -0
  44. package/src/editor/tree/index.ts +4 -0
  45. package/src/editor/tree/navigation.ts +145 -0
  46. package/src/editor/tsconfig.build.json +5 -0
  47. package/src/editor/tsconfig.json +12 -0
  48. package/src/editor/tsdoc.json +4 -0
  49. package/src/editor/utils/SignalSet.ts +37 -0
  50. package/src/editor/utils/index.ts +1 -0
  51. package/src/editor/vite-env.d.ts +1 -0
  52. package/src/lib/code/CodeCursor.ts +468 -0
  53. package/src/lib/code/CodeDiffer.ts +77 -0
  54. package/src/lib/code/CodeFragment.ts +96 -0
  55. package/src/lib/code/CodeHighlighter.ts +73 -0
  56. package/src/lib/code/CodeMetrics.ts +47 -0
  57. package/src/lib/code/CodeRange.test.ts +113 -0
  58. package/src/lib/code/CodeRange.ts +222 -0
  59. package/src/lib/code/CodeScope.ts +100 -0
  60. package/src/lib/code/CodeSelection.ts +28 -0
  61. package/src/lib/code/CodeSignal.ts +348 -0
  62. package/src/lib/code/CodeTokenizer.ts +54 -0
  63. package/src/lib/code/DefaultHighlightStyle.ts +98 -0
  64. package/src/lib/code/LezerHighlighter.ts +113 -0
  65. package/src/lib/code/diff.test.ts +311 -0
  66. package/src/lib/code/diff.ts +319 -0
  67. package/src/lib/code/extractRange.ts +125 -0
  68. package/src/lib/code/index.ts +13 -0
  69. package/src/lib/components/Bezier.ts +103 -0
  70. package/src/lib/components/Camera.ts +401 -0
  71. package/src/lib/components/Circle.ts +310 -0
  72. package/src/lib/components/Code.ts +532 -0
  73. package/src/lib/components/CubicBezier.ts +115 -0
  74. package/src/lib/components/Curve.ts +460 -0
  75. package/src/lib/components/Grid.ts +134 -0
  76. package/src/lib/components/Icon.ts +153 -0
  77. package/src/lib/components/Img.ts +328 -0
  78. package/src/lib/components/Knot.ts +156 -0
  79. package/src/lib/components/Latex.ts +537 -0
  80. package/src/lib/components/Layout.ts +1101 -0
  81. package/src/lib/components/Line.ts +394 -0
  82. package/src/lib/components/Node.ts +1941 -0
  83. package/src/lib/components/Path.ts +132 -0
  84. package/src/lib/components/Polygon.ts +266 -0
  85. package/src/lib/components/QuadBezier.ts +103 -0
  86. package/src/lib/components/Ray.ts +126 -0
  87. package/src/lib/components/Rect.ts +219 -0
  88. package/src/lib/components/SVG.ts +853 -0
  89. package/src/lib/components/Shape.ts +322 -0
  90. package/src/lib/components/Spline.ts +318 -0
  91. package/src/lib/components/Txt.test.tsx +81 -0
  92. package/src/lib/components/Txt.ts +204 -0
  93. package/src/lib/components/TxtLeaf.ts +210 -0
  94. package/src/lib/components/Video.ts +368 -0
  95. package/src/lib/components/View2D.ts +85 -0
  96. package/src/lib/components/__logs__/image-without-source.ts +18 -0
  97. package/src/lib/components/__logs__/line-without-points.ts +31 -0
  98. package/src/lib/components/__logs__/reactive-playback-rate.ts +22 -0
  99. package/src/lib/components/__logs__/spline-with-insufficient-knots.ts +25 -0
  100. package/src/lib/components/__tests__/Camera.test.tsx +73 -0
  101. package/src/lib/components/__tests__/children.test.tsx +142 -0
  102. package/src/lib/components/__tests__/clone.test.tsx +126 -0
  103. package/src/lib/components/__tests__/fontInheritance.test.tsx +102 -0
  104. package/src/lib/components/__tests__/generatorTest.ts +27 -0
  105. package/src/lib/components/__tests__/mockScene2D.ts +50 -0
  106. package/src/lib/components/__tests__/query.test.tsx +122 -0
  107. package/src/lib/components/__tests__/state.test.tsx +60 -0
  108. package/src/lib/components/index.ts +26 -0
  109. package/src/lib/components/types.ts +35 -0
  110. package/src/lib/curves/ArcSegment.ts +169 -0
  111. package/src/lib/curves/CircleSegment.ts +99 -0
  112. package/src/lib/curves/CubicBezierSegment.ts +80 -0
  113. package/src/lib/curves/CurveDrawingInfo.ts +11 -0
  114. package/src/lib/curves/CurvePoint.ts +15 -0
  115. package/src/lib/curves/CurveProfile.ts +28 -0
  116. package/src/lib/curves/KnotInfo.ts +10 -0
  117. package/src/lib/curves/LineSegment.ts +75 -0
  118. package/src/lib/curves/Polynomial.ts +355 -0
  119. package/src/lib/curves/Polynomial2D.ts +62 -0
  120. package/src/lib/curves/PolynomialSegment.ts +151 -0
  121. package/src/lib/curves/QuadBezierSegment.ts +66 -0
  122. package/src/lib/curves/Segment.ts +31 -0
  123. package/src/lib/curves/UniformPolynomialCurveSampler.ts +93 -0
  124. package/src/lib/curves/createCurveProfileLerp.ts +471 -0
  125. package/src/lib/curves/getBezierSplineProfile.ts +227 -0
  126. package/src/lib/curves/getCircleProfile.ts +86 -0
  127. package/src/lib/curves/getPathProfile.ts +177 -0
  128. package/src/lib/curves/getPointAtDistance.ts +21 -0
  129. package/src/lib/curves/getPolylineProfile.test.ts +21 -0
  130. package/src/lib/curves/getPolylineProfile.ts +88 -0
  131. package/src/lib/curves/getRectProfile.ts +138 -0
  132. package/src/lib/curves/index.ts +16 -0
  133. package/src/lib/decorators/canvasStyleSignal.ts +15 -0
  134. package/src/lib/decorators/colorSignal.ts +9 -0
  135. package/src/lib/decorators/compound.ts +85 -0
  136. package/src/lib/decorators/computed.ts +18 -0
  137. package/src/lib/decorators/defaultStyle.ts +15 -0
  138. package/src/lib/decorators/filtersSignal.ts +133 -0
  139. package/src/lib/decorators/index.ts +10 -0
  140. package/src/lib/decorators/initializers.ts +32 -0
  141. package/src/lib/decorators/nodeName.ts +13 -0
  142. package/src/lib/decorators/signal.test.ts +89 -0
  143. package/src/lib/decorators/signal.ts +348 -0
  144. package/src/lib/decorators/spacingSignal.ts +15 -0
  145. package/src/lib/decorators/transformSignals.test.ts +858 -0
  146. package/src/lib/decorators/transformSignals.ts +1633 -0
  147. package/src/lib/decorators/vector2Signal.ts +35 -0
  148. package/src/lib/globals.d.ts +2 -0
  149. package/src/lib/index.ts +9 -0
  150. package/src/lib/jsx-dev-runtime.ts +2 -0
  151. package/src/lib/jsx-runtime.ts +45 -0
  152. package/src/lib/morphers/PathMorpher.ts +8 -0
  153. package/src/lib/morphers/defaultMorpher.ts +43 -0
  154. package/src/lib/morphers/index.ts +4 -0
  155. package/src/lib/morphers/manimMorpher.ts +658 -0
  156. package/src/lib/parse-svg-path.d.ts +14 -0
  157. package/src/lib/partials/Filter.ts +185 -0
  158. package/src/lib/partials/Gradient.ts +103 -0
  159. package/src/lib/partials/Pattern.ts +35 -0
  160. package/src/lib/partials/RoughConfig.ts +180 -0
  161. package/src/lib/partials/ShaderConfig.ts +122 -0
  162. package/src/lib/partials/index.ts +5 -0
  163. package/src/lib/partials/types.ts +58 -0
  164. package/src/lib/scenes/Scene2D.ts +167 -0
  165. package/src/lib/scenes/index.ts +3 -0
  166. package/src/lib/scenes/makeScene2D.ts +19 -0
  167. package/src/lib/scenes/useScene2D.ts +6 -0
  168. package/src/lib/tsconfig.build.json +5 -0
  169. package/src/lib/tsconfig.json +11 -0
  170. package/src/lib/tsdoc.json +4 -0
  171. package/src/lib/utils/CanvasUtils.ts +304 -0
  172. package/src/lib/utils/PathDataBuilder.ts +320 -0
  173. package/src/lib/utils/diff.test.ts +453 -0
  174. package/src/lib/utils/diff.ts +148 -0
  175. package/src/lib/utils/index.ts +5 -0
  176. package/src/lib/utils/is.ts +11 -0
  177. package/src/lib/utils/makeSignalExtensions.ts +29 -0
  178. package/src/lib/utils/rough.ts +513 -0
  179. package/src/lib/utils/withDefaults.tsx +26 -0
  180. package/src/tsconfig.base.json +18 -0
  181. package/src/tsconfig.build.json +8 -0
  182. package/src/tsconfig.json +5 -0
  183. 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,5 @@
1
+ export * from './Filter';
2
+ export * from './Gradient';
3
+ export * from './Pattern';
4
+ export * from './RoughConfig';
5
+ export * from './types';
@@ -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;