@twick/2d 0.14.0 → 1.14.3
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 -21
- package/editor/editor/tsconfig.build.tsbuildinfo +1 -1
- package/lib/components/Audio.d.ts.map +1 -1
- package/lib/components/Audio.js +33 -3
- package/lib/components/CodeBlock.d.ts +1 -1
- package/lib/components/Img.js +23 -23
- package/lib/components/Line.js +31 -31
- package/lib/components/Media.d.ts +6 -0
- package/lib/components/Media.d.ts.map +1 -1
- package/lib/components/Media.js +277 -61
- package/lib/components/Node.d.ts +1 -1
- package/lib/components/Path.d.ts +1 -1
- package/lib/components/SVG.d.ts +1 -1
- package/lib/components/Shape.d.ts +1 -1
- package/lib/components/Spline.js +25 -25
- package/lib/components/Video.d.ts +0 -1
- package/lib/components/Video.d.ts.map +1 -1
- package/lib/components/Video.js +70 -65
- package/lib/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -5
- 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 -131
- 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 -346
- 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 -462
- 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
- package/lib/components/utils/waitUntil.d.ts +0 -7
- package/lib/components/utils/waitUntil.d.ts.map +0 -1
- package/lib/components/utils/waitUntil.js +0 -15
- package/lib/utils/waitUntil.d.ts +0 -7
- package/lib/utils/waitUntil.d.ts.map +0 -1
- package/lib/utils/waitUntil.js +0 -15
- package/src/lib/utils/waitUntil.ts +0 -18
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {Spacing} from '@twick/core';
|
|
2
|
-
import {compound} from './compound';
|
|
3
|
-
import {wrapper} from './signal';
|
|
4
|
-
|
|
5
|
-
export function spacingSignal(prefix?: string): PropertyDecorator {
|
|
6
|
-
return (target, key) => {
|
|
7
|
-
compound({
|
|
8
|
-
top: prefix ? `${prefix}Top` : 'top',
|
|
9
|
-
right: prefix ? `${prefix}Right` : 'right',
|
|
10
|
-
bottom: prefix ? `${prefix}Bottom` : 'bottom',
|
|
11
|
-
left: prefix ? `${prefix}Left` : 'left',
|
|
12
|
-
})(target, key);
|
|
13
|
-
wrapper(Spacing)(target, key);
|
|
14
|
-
};
|
|
15
|
-
}
|
|
1
|
+
import {Spacing} from '@twick/core';
|
|
2
|
+
import {compound} from './compound';
|
|
3
|
+
import {wrapper} from './signal';
|
|
4
|
+
|
|
5
|
+
export function spacingSignal(prefix?: string): PropertyDecorator {
|
|
6
|
+
return (target, key) => {
|
|
7
|
+
compound({
|
|
8
|
+
top: prefix ? `${prefix}Top` : 'top',
|
|
9
|
+
right: prefix ? `${prefix}Right` : 'right',
|
|
10
|
+
bottom: prefix ? `${prefix}Bottom` : 'bottom',
|
|
11
|
+
left: prefix ? `${prefix}Left` : 'left',
|
|
12
|
+
})(target, key);
|
|
13
|
+
wrapper(Spacing)(target, key);
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import type {PossibleVector2, Signal} from '@twick/core';
|
|
2
|
-
import {Vector2} from '@twick/core';
|
|
3
|
-
import type {Length} from '../partials';
|
|
4
|
-
import {compound} from './compound';
|
|
5
|
-
import {wrapper} from './signal';
|
|
6
|
-
|
|
7
|
-
export type Vector2LengthSignal<TOwner> = Signal<
|
|
8
|
-
PossibleVector2<Length>,
|
|
9
|
-
Vector2,
|
|
10
|
-
TOwner
|
|
11
|
-
> & {
|
|
12
|
-
x: Signal<Length, number, TOwner>;
|
|
13
|
-
y: Signal<Length, number, TOwner>;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export function vector2Signal(
|
|
17
|
-
prefix?: string | Record<string, string>,
|
|
18
|
-
): PropertyDecorator {
|
|
19
|
-
return (target, key) => {
|
|
20
|
-
compound(
|
|
21
|
-
typeof prefix === 'object'
|
|
22
|
-
? prefix
|
|
23
|
-
: {
|
|
24
|
-
x: prefix ? `${prefix}X` : 'x',
|
|
25
|
-
y: prefix ? `${prefix}Y` : 'y',
|
|
26
|
-
},
|
|
27
|
-
)(target, key);
|
|
28
|
-
wrapper(Vector2)(target, key);
|
|
29
|
-
};
|
|
30
|
-
}
|
|
1
|
+
import type {PossibleVector2, Signal} from '@twick/core';
|
|
2
|
+
import {Vector2} from '@twick/core';
|
|
3
|
+
import type {Length} from '../partials';
|
|
4
|
+
import {compound} from './compound';
|
|
5
|
+
import {wrapper} from './signal';
|
|
6
|
+
|
|
7
|
+
export type Vector2LengthSignal<TOwner> = Signal<
|
|
8
|
+
PossibleVector2<Length>,
|
|
9
|
+
Vector2,
|
|
10
|
+
TOwner
|
|
11
|
+
> & {
|
|
12
|
+
x: Signal<Length, number, TOwner>;
|
|
13
|
+
y: Signal<Length, number, TOwner>;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export function vector2Signal(
|
|
17
|
+
prefix?: string | Record<string, string>,
|
|
18
|
+
): PropertyDecorator {
|
|
19
|
+
return (target, key) => {
|
|
20
|
+
compound(
|
|
21
|
+
typeof prefix === 'object'
|
|
22
|
+
? prefix
|
|
23
|
+
: {
|
|
24
|
+
x: prefix ? `${prefix}X` : 'x',
|
|
25
|
+
y: prefix ? `${prefix}Y` : 'y',
|
|
26
|
+
},
|
|
27
|
+
)(target, key);
|
|
28
|
+
wrapper(Vector2)(target, key);
|
|
29
|
+
};
|
|
30
|
+
}
|
package/src/lib/globals.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
-
/// <reference types="@twick/core/project" />
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
/// <reference types="@twick/core/project" />
|
package/src/lib/index.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export * from './code';
|
|
2
|
-
export * from './components';
|
|
3
|
-
export * from './curves';
|
|
4
|
-
export * from './decorators';
|
|
5
|
-
export * from './jsx-runtime';
|
|
6
|
-
export * from './partials';
|
|
7
|
-
export * from './scenes';
|
|
8
|
-
export * from './utils';
|
|
1
|
+
export * from './code';
|
|
2
|
+
export * from './components';
|
|
3
|
+
export * from './curves';
|
|
4
|
+
export * from './decorators';
|
|
5
|
+
export * from './jsx-runtime';
|
|
6
|
+
export * from './partials';
|
|
7
|
+
export * from './scenes';
|
|
8
|
+
export * from './utils';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {Fragment, jsx} from './jsx-runtime';
|
|
2
|
-
export {Fragment, jsx as jsxDEV};
|
|
1
|
+
import {Fragment, jsx} from './jsx-runtime';
|
|
2
|
+
export {Fragment, jsx as jsxDEV};
|
package/src/lib/jsx-runtime.ts
CHANGED
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
ComponentChildren,
|
|
3
|
-
FunctionComponent,
|
|
4
|
-
JSXProps,
|
|
5
|
-
Node,
|
|
6
|
-
NodeConstructor,
|
|
7
|
-
} from './components';
|
|
8
|
-
|
|
9
|
-
export namespace JSX {
|
|
10
|
-
export type Element = Node;
|
|
11
|
-
export type ElementClass = Node;
|
|
12
|
-
export interface ElementChildrenAttribute {
|
|
13
|
-
children: any;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function isClassComponent(
|
|
18
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
19
|
-
fn: Function,
|
|
20
|
-
): fn is new (...args: unknown[]) => unknown {
|
|
21
|
-
return !!fn.prototype?.isClass;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export const Fragment: FunctionComponent = ({children}) => children;
|
|
25
|
-
|
|
26
|
-
export function jsx(
|
|
27
|
-
type: NodeConstructor | FunctionComponent | typeof Fragment,
|
|
28
|
-
config: JSXProps,
|
|
29
|
-
key?: any,
|
|
30
|
-
): ComponentChildren {
|
|
31
|
-
const {ref, children, ...rest} = config;
|
|
32
|
-
const flatChildren = Array.isArray(children) ? children.flat() : children;
|
|
33
|
-
|
|
34
|
-
if (type === Fragment) {
|
|
35
|
-
return flatChildren;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (isClassComponent(type)) {
|
|
39
|
-
const node = new type({...rest, children: flatChildren, key});
|
|
40
|
-
ref?.(node);
|
|
41
|
-
return node;
|
|
42
|
-
} else {
|
|
43
|
-
return type({...rest, ref, children: flatChildren, key});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
export {jsx as jsxs};
|
|
1
|
+
import type {
|
|
2
|
+
ComponentChildren,
|
|
3
|
+
FunctionComponent,
|
|
4
|
+
JSXProps,
|
|
5
|
+
Node,
|
|
6
|
+
NodeConstructor,
|
|
7
|
+
} from './components';
|
|
8
|
+
|
|
9
|
+
export namespace JSX {
|
|
10
|
+
export type Element = Node;
|
|
11
|
+
export type ElementClass = Node;
|
|
12
|
+
export interface ElementChildrenAttribute {
|
|
13
|
+
children: any;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function isClassComponent(
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
19
|
+
fn: Function,
|
|
20
|
+
): fn is new (...args: unknown[]) => unknown {
|
|
21
|
+
return !!fn.prototype?.isClass;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const Fragment: FunctionComponent = ({children}) => children;
|
|
25
|
+
|
|
26
|
+
export function jsx(
|
|
27
|
+
type: NodeConstructor | FunctionComponent | typeof Fragment,
|
|
28
|
+
config: JSXProps,
|
|
29
|
+
key?: any,
|
|
30
|
+
): ComponentChildren {
|
|
31
|
+
const {ref, children, ...rest} = config;
|
|
32
|
+
const flatChildren = Array.isArray(children) ? children.flat() : children;
|
|
33
|
+
|
|
34
|
+
if (type === Fragment) {
|
|
35
|
+
return flatChildren;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (isClassComponent(type)) {
|
|
39
|
+
const node = new type({...rest, children: flatChildren, key});
|
|
40
|
+
ref?.(node);
|
|
41
|
+
return node;
|
|
42
|
+
} else {
|
|
43
|
+
return type({...rest, ref, children: flatChildren, key});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export {jsx as jsxs};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
declare module 'parse-svg-path' {
|
|
2
|
-
export type PathCommand = [
|
|
3
|
-
string,
|
|
4
|
-
number,
|
|
5
|
-
number,
|
|
6
|
-
number,
|
|
7
|
-
number,
|
|
8
|
-
number,
|
|
9
|
-
number,
|
|
10
|
-
number,
|
|
11
|
-
];
|
|
12
|
-
function parse(path: string): PathCommand[];
|
|
13
|
-
export default parse;
|
|
14
|
-
}
|
|
1
|
+
declare module 'parse-svg-path' {
|
|
2
|
+
export type PathCommand = [
|
|
3
|
+
string,
|
|
4
|
+
number,
|
|
5
|
+
number,
|
|
6
|
+
number,
|
|
7
|
+
number,
|
|
8
|
+
number,
|
|
9
|
+
number,
|
|
10
|
+
number,
|
|
11
|
+
];
|
|
12
|
+
function parse(path: string): PathCommand[];
|
|
13
|
+
export default parse;
|
|
14
|
+
}
|
|
@@ -1,180 +1,180 @@
|
|
|
1
|
-
import type {SignalValue, SimpleSignal} from '@twick/core';
|
|
2
|
-
import {createSignal, map, transformScalar} from '@twick/core';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* All possible CSS filter names.
|
|
6
|
-
*
|
|
7
|
-
* @internal
|
|
8
|
-
*/
|
|
9
|
-
export type FilterName =
|
|
10
|
-
| 'invert'
|
|
11
|
-
| 'sepia'
|
|
12
|
-
| 'grayscale'
|
|
13
|
-
| 'brightness'
|
|
14
|
-
| 'contrast'
|
|
15
|
-
| 'saturate'
|
|
16
|
-
| 'hue'
|
|
17
|
-
| 'blur';
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Definitions of all possible CSS filters.
|
|
21
|
-
*
|
|
22
|
-
* @internal
|
|
23
|
-
*/
|
|
24
|
-
export const FILTERS: Record<string, Partial<FilterProps>> = {
|
|
25
|
-
invert: {
|
|
26
|
-
name: 'invert',
|
|
27
|
-
},
|
|
28
|
-
sepia: {
|
|
29
|
-
name: 'sepia',
|
|
30
|
-
},
|
|
31
|
-
grayscale: {
|
|
32
|
-
name: 'grayscale',
|
|
33
|
-
},
|
|
34
|
-
brightness: {
|
|
35
|
-
name: 'brightness',
|
|
36
|
-
default: 1,
|
|
37
|
-
},
|
|
38
|
-
contrast: {
|
|
39
|
-
name: 'contrast',
|
|
40
|
-
default: 1,
|
|
41
|
-
},
|
|
42
|
-
saturate: {
|
|
43
|
-
name: 'saturate',
|
|
44
|
-
default: 1,
|
|
45
|
-
},
|
|
46
|
-
hue: {
|
|
47
|
-
name: 'hue-rotate',
|
|
48
|
-
unit: 'deg',
|
|
49
|
-
scale: 1,
|
|
50
|
-
},
|
|
51
|
-
blur: {
|
|
52
|
-
name: 'blur',
|
|
53
|
-
transform: true,
|
|
54
|
-
unit: 'px',
|
|
55
|
-
scale: 1,
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* A unified abstraction for all CSS filters.
|
|
61
|
-
*/
|
|
62
|
-
export interface FilterProps {
|
|
63
|
-
name: string;
|
|
64
|
-
value: SignalValue<number>;
|
|
65
|
-
unit: string;
|
|
66
|
-
scale: number;
|
|
67
|
-
transform: boolean;
|
|
68
|
-
default: number;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export class Filter {
|
|
72
|
-
public get name() {
|
|
73
|
-
return this.props.name;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
public get default() {
|
|
77
|
-
return this.props.default;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
public readonly value: SimpleSignal<number, Filter>;
|
|
81
|
-
private readonly props: FilterProps;
|
|
82
|
-
|
|
83
|
-
public constructor(props: Partial<FilterProps>) {
|
|
84
|
-
this.props = {
|
|
85
|
-
name: 'invert',
|
|
86
|
-
default: 0,
|
|
87
|
-
unit: '%',
|
|
88
|
-
scale: 100,
|
|
89
|
-
transform: false,
|
|
90
|
-
...props,
|
|
91
|
-
value: props.value ?? props.default ?? 0,
|
|
92
|
-
};
|
|
93
|
-
this.value = createSignal(this.props.value, map, this);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
public isActive() {
|
|
97
|
-
return this.value() !== this.props.default;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
public serialize(matrix: DOMMatrix): string {
|
|
101
|
-
let value = this.value();
|
|
102
|
-
if (this.props.transform) {
|
|
103
|
-
value = transformScalar(value, matrix);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return `${this.props.name}(${value * this.props.scale}${this.props.unit})`;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Create an {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/invert | invert} filter.
|
|
112
|
-
*
|
|
113
|
-
* @param value - The value of the filter.
|
|
114
|
-
*/
|
|
115
|
-
export function invert(value?: SignalValue<number>) {
|
|
116
|
-
return new Filter({...FILTERS.invert, value});
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/sepia | sepia} filter.
|
|
121
|
-
*
|
|
122
|
-
* @param value - The value of the filter.
|
|
123
|
-
*/
|
|
124
|
-
export function sepia(value?: SignalValue<number>) {
|
|
125
|
-
return new Filter({...FILTERS.sepia, value});
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/grayscale | grayscale} filter.
|
|
130
|
-
*
|
|
131
|
-
* @param value - The value of the filter.
|
|
132
|
-
*/
|
|
133
|
-
export function grayscale(value?: SignalValue<number>) {
|
|
134
|
-
return new Filter({...FILTERS.grayscale, value});
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/brightness | brightness} filter.
|
|
139
|
-
*
|
|
140
|
-
* @param value - The value of the filter.
|
|
141
|
-
*/
|
|
142
|
-
export function brightness(value?: SignalValue<number>) {
|
|
143
|
-
return new Filter({...FILTERS.brightness, value});
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/contrast | contrast} filter.
|
|
148
|
-
*
|
|
149
|
-
* @param value - The value of the filter.
|
|
150
|
-
*/
|
|
151
|
-
export function contrast(value?: SignalValue<number>) {
|
|
152
|
-
return new Filter({...FILTERS.contrast, value});
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/saturate | saturate} filter.
|
|
157
|
-
*
|
|
158
|
-
* @param value - The value of the filter.
|
|
159
|
-
*/
|
|
160
|
-
export function saturate(value?: SignalValue<number>) {
|
|
161
|
-
return new Filter({...FILTERS.saturate, value});
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/hue-rotate | hue} filter.
|
|
166
|
-
*
|
|
167
|
-
* @param value - The value of the filter in degrees.
|
|
168
|
-
*/
|
|
169
|
-
export function hue(value?: SignalValue<number>) {
|
|
170
|
-
return new Filter({...FILTERS.hue, value});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/blur | blur} filter.
|
|
175
|
-
*
|
|
176
|
-
* @param value - The value of the filter in pixels.
|
|
177
|
-
*/
|
|
178
|
-
export function blur(value?: SignalValue<number>) {
|
|
179
|
-
return new Filter({...FILTERS.blur, value});
|
|
180
|
-
}
|
|
1
|
+
import type {SignalValue, SimpleSignal} from '@twick/core';
|
|
2
|
+
import {createSignal, map, transformScalar} from '@twick/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* All possible CSS filter names.
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export type FilterName =
|
|
10
|
+
| 'invert'
|
|
11
|
+
| 'sepia'
|
|
12
|
+
| 'grayscale'
|
|
13
|
+
| 'brightness'
|
|
14
|
+
| 'contrast'
|
|
15
|
+
| 'saturate'
|
|
16
|
+
| 'hue'
|
|
17
|
+
| 'blur';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Definitions of all possible CSS filters.
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export const FILTERS: Record<string, Partial<FilterProps>> = {
|
|
25
|
+
invert: {
|
|
26
|
+
name: 'invert',
|
|
27
|
+
},
|
|
28
|
+
sepia: {
|
|
29
|
+
name: 'sepia',
|
|
30
|
+
},
|
|
31
|
+
grayscale: {
|
|
32
|
+
name: 'grayscale',
|
|
33
|
+
},
|
|
34
|
+
brightness: {
|
|
35
|
+
name: 'brightness',
|
|
36
|
+
default: 1,
|
|
37
|
+
},
|
|
38
|
+
contrast: {
|
|
39
|
+
name: 'contrast',
|
|
40
|
+
default: 1,
|
|
41
|
+
},
|
|
42
|
+
saturate: {
|
|
43
|
+
name: 'saturate',
|
|
44
|
+
default: 1,
|
|
45
|
+
},
|
|
46
|
+
hue: {
|
|
47
|
+
name: 'hue-rotate',
|
|
48
|
+
unit: 'deg',
|
|
49
|
+
scale: 1,
|
|
50
|
+
},
|
|
51
|
+
blur: {
|
|
52
|
+
name: 'blur',
|
|
53
|
+
transform: true,
|
|
54
|
+
unit: 'px',
|
|
55
|
+
scale: 1,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* A unified abstraction for all CSS filters.
|
|
61
|
+
*/
|
|
62
|
+
export interface FilterProps {
|
|
63
|
+
name: string;
|
|
64
|
+
value: SignalValue<number>;
|
|
65
|
+
unit: string;
|
|
66
|
+
scale: number;
|
|
67
|
+
transform: boolean;
|
|
68
|
+
default: number;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export class Filter {
|
|
72
|
+
public get name() {
|
|
73
|
+
return this.props.name;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public get default() {
|
|
77
|
+
return this.props.default;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public readonly value: SimpleSignal<number, Filter>;
|
|
81
|
+
private readonly props: FilterProps;
|
|
82
|
+
|
|
83
|
+
public constructor(props: Partial<FilterProps>) {
|
|
84
|
+
this.props = {
|
|
85
|
+
name: 'invert',
|
|
86
|
+
default: 0,
|
|
87
|
+
unit: '%',
|
|
88
|
+
scale: 100,
|
|
89
|
+
transform: false,
|
|
90
|
+
...props,
|
|
91
|
+
value: props.value ?? props.default ?? 0,
|
|
92
|
+
};
|
|
93
|
+
this.value = createSignal(this.props.value, map, this);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public isActive() {
|
|
97
|
+
return this.value() !== this.props.default;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
public serialize(matrix: DOMMatrix): string {
|
|
101
|
+
let value = this.value();
|
|
102
|
+
if (this.props.transform) {
|
|
103
|
+
value = transformScalar(value, matrix);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return `${this.props.name}(${value * this.props.scale}${this.props.unit})`;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Create an {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/invert | invert} filter.
|
|
112
|
+
*
|
|
113
|
+
* @param value - The value of the filter.
|
|
114
|
+
*/
|
|
115
|
+
export function invert(value?: SignalValue<number>) {
|
|
116
|
+
return new Filter({...FILTERS.invert, value});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/sepia | sepia} filter.
|
|
121
|
+
*
|
|
122
|
+
* @param value - The value of the filter.
|
|
123
|
+
*/
|
|
124
|
+
export function sepia(value?: SignalValue<number>) {
|
|
125
|
+
return new Filter({...FILTERS.sepia, value});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/grayscale | grayscale} filter.
|
|
130
|
+
*
|
|
131
|
+
* @param value - The value of the filter.
|
|
132
|
+
*/
|
|
133
|
+
export function grayscale(value?: SignalValue<number>) {
|
|
134
|
+
return new Filter({...FILTERS.grayscale, value});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/brightness | brightness} filter.
|
|
139
|
+
*
|
|
140
|
+
* @param value - The value of the filter.
|
|
141
|
+
*/
|
|
142
|
+
export function brightness(value?: SignalValue<number>) {
|
|
143
|
+
return new Filter({...FILTERS.brightness, value});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/contrast | contrast} filter.
|
|
148
|
+
*
|
|
149
|
+
* @param value - The value of the filter.
|
|
150
|
+
*/
|
|
151
|
+
export function contrast(value?: SignalValue<number>) {
|
|
152
|
+
return new Filter({...FILTERS.contrast, value});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/saturate | saturate} filter.
|
|
157
|
+
*
|
|
158
|
+
* @param value - The value of the filter.
|
|
159
|
+
*/
|
|
160
|
+
export function saturate(value?: SignalValue<number>) {
|
|
161
|
+
return new Filter({...FILTERS.saturate, value});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/hue-rotate | hue} filter.
|
|
166
|
+
*
|
|
167
|
+
* @param value - The value of the filter in degrees.
|
|
168
|
+
*/
|
|
169
|
+
export function hue(value?: SignalValue<number>) {
|
|
170
|
+
return new Filter({...FILTERS.hue, value});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Create a {@link https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/blur | blur} filter.
|
|
175
|
+
*
|
|
176
|
+
* @param value - The value of the filter in pixels.
|
|
177
|
+
*/
|
|
178
|
+
export function blur(value?: SignalValue<number>) {
|
|
179
|
+
return new Filter({...FILTERS.blur, value});
|
|
180
|
+
}
|