@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,135 +1,135 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
PossibleVector2,
|
|
3
|
-
SignalValue,
|
|
4
|
-
SimpleSignal,
|
|
5
|
-
Vector2Signal,
|
|
6
|
-
} from '@twick/core';
|
|
7
|
-
import {map} from '@twick/core';
|
|
8
|
-
import {initial, nodeName, signal, vector2Signal} from '../decorators';
|
|
9
|
-
import type {ShapeProps} from './Shape';
|
|
10
|
-
import {Shape} from './Shape';
|
|
11
|
-
|
|
12
|
-
export interface GridProps extends ShapeProps {
|
|
13
|
-
/**
|
|
14
|
-
* {@inheritDoc Grid.spacing}
|
|
15
|
-
*/
|
|
16
|
-
spacing?: SignalValue<PossibleVector2>;
|
|
17
|
-
/**
|
|
18
|
-
* {@inheritDoc Grid.start}
|
|
19
|
-
*/
|
|
20
|
-
start?: SignalValue<number>;
|
|
21
|
-
/**
|
|
22
|
-
* {@inheritDoc Grid.end}
|
|
23
|
-
*/
|
|
24
|
-
end?: SignalValue<number>;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* A node for drawing a two-dimensional grid.
|
|
29
|
-
*
|
|
30
|
-
* @preview
|
|
31
|
-
* ```tsx editor
|
|
32
|
-
* import {Grid, makeScene2D} from '@twick/2d';
|
|
33
|
-
* import {all, createRef} from '@twick/core';
|
|
34
|
-
*
|
|
35
|
-
* export default makeScene2D(function* (view) {
|
|
36
|
-
* const grid = createRef<Grid>();
|
|
37
|
-
*
|
|
38
|
-
* view.add(
|
|
39
|
-
* <Grid
|
|
40
|
-
* ref={grid}
|
|
41
|
-
* width={'100%'}
|
|
42
|
-
* height={'100%'}
|
|
43
|
-
* stroke={'#666'}
|
|
44
|
-
* start={0}
|
|
45
|
-
* end={1}
|
|
46
|
-
* />,
|
|
47
|
-
* );
|
|
48
|
-
*
|
|
49
|
-
* yield* all(
|
|
50
|
-
* grid().end(0.5, 1).to(1, 1).wait(1),
|
|
51
|
-
* grid().start(0.5, 1).to(0, 1).wait(1),
|
|
52
|
-
* );
|
|
53
|
-
* });
|
|
54
|
-
* ```
|
|
55
|
-
*/
|
|
56
|
-
@nodeName('Grid')
|
|
57
|
-
export class Grid extends Shape {
|
|
58
|
-
/**
|
|
59
|
-
* The spacing between the grid lines.
|
|
60
|
-
*/
|
|
61
|
-
@initial(80)
|
|
62
|
-
@vector2Signal('spacing')
|
|
63
|
-
public declare readonly spacing: Vector2Signal<this>;
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* The percentage that should be clipped from the beginning of each grid line.
|
|
67
|
-
*
|
|
68
|
-
* @remarks
|
|
69
|
-
* The portion of each grid line that comes before the given percentage will
|
|
70
|
-
* be made invisible.
|
|
71
|
-
*
|
|
72
|
-
* This property is useful for animating the grid appearing on-screen.
|
|
73
|
-
*/
|
|
74
|
-
@initial(0)
|
|
75
|
-
@signal()
|
|
76
|
-
public declare readonly start: SimpleSignal<number, this>;
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* The percentage that should be clipped from the end of each grid line.
|
|
80
|
-
*
|
|
81
|
-
* @remarks
|
|
82
|
-
* The portion of each grid line that comes after the given percentage will
|
|
83
|
-
* be made invisible.
|
|
84
|
-
*
|
|
85
|
-
* This property is useful for animating the grid appearing on-screen.
|
|
86
|
-
*/
|
|
87
|
-
@initial(1)
|
|
88
|
-
@signal()
|
|
89
|
-
public declare readonly end: SimpleSignal<number, this>;
|
|
90
|
-
|
|
91
|
-
public constructor(props: GridProps) {
|
|
92
|
-
super(props);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
protected override drawShape(context: CanvasRenderingContext2D) {
|
|
96
|
-
context.save();
|
|
97
|
-
this.applyStyle(context);
|
|
98
|
-
this.drawRipple(context);
|
|
99
|
-
|
|
100
|
-
const spacing = this.spacing();
|
|
101
|
-
const size = this.computedSize().scale(0.5);
|
|
102
|
-
const steps = size.div(spacing).floored;
|
|
103
|
-
|
|
104
|
-
for (let x = -steps.x; x <= steps.x; x++) {
|
|
105
|
-
const [from, to] = this.mapPoints(-size.height, size.height);
|
|
106
|
-
|
|
107
|
-
context.beginPath();
|
|
108
|
-
context.moveTo(spacing.x * x, from);
|
|
109
|
-
context.lineTo(spacing.x * x, to);
|
|
110
|
-
context.stroke();
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
for (let y = -steps.y; y <= steps.y; y++) {
|
|
114
|
-
const [from, to] = this.mapPoints(-size.width, size.width);
|
|
115
|
-
|
|
116
|
-
context.beginPath();
|
|
117
|
-
context.moveTo(from, spacing.y * y);
|
|
118
|
-
context.lineTo(to, spacing.y * y);
|
|
119
|
-
context.stroke();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
context.restore();
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
private mapPoints(start: number, end: number): [number, number] {
|
|
126
|
-
let from = map(start, end, this.start());
|
|
127
|
-
let to = map(start, end, this.end());
|
|
128
|
-
|
|
129
|
-
if (to < from) {
|
|
130
|
-
[from, to] = [to, from];
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return [from, to];
|
|
134
|
-
}
|
|
135
|
-
}
|
|
1
|
+
import type {
|
|
2
|
+
PossibleVector2,
|
|
3
|
+
SignalValue,
|
|
4
|
+
SimpleSignal,
|
|
5
|
+
Vector2Signal,
|
|
6
|
+
} from '@twick/core';
|
|
7
|
+
import {map} from '@twick/core';
|
|
8
|
+
import {initial, nodeName, signal, vector2Signal} from '../decorators';
|
|
9
|
+
import type {ShapeProps} from './Shape';
|
|
10
|
+
import {Shape} from './Shape';
|
|
11
|
+
|
|
12
|
+
export interface GridProps extends ShapeProps {
|
|
13
|
+
/**
|
|
14
|
+
* {@inheritDoc Grid.spacing}
|
|
15
|
+
*/
|
|
16
|
+
spacing?: SignalValue<PossibleVector2>;
|
|
17
|
+
/**
|
|
18
|
+
* {@inheritDoc Grid.start}
|
|
19
|
+
*/
|
|
20
|
+
start?: SignalValue<number>;
|
|
21
|
+
/**
|
|
22
|
+
* {@inheritDoc Grid.end}
|
|
23
|
+
*/
|
|
24
|
+
end?: SignalValue<number>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* A node for drawing a two-dimensional grid.
|
|
29
|
+
*
|
|
30
|
+
* @preview
|
|
31
|
+
* ```tsx editor
|
|
32
|
+
* import {Grid, makeScene2D} from '@twick/2d';
|
|
33
|
+
* import {all, createRef} from '@twick/core';
|
|
34
|
+
*
|
|
35
|
+
* export default makeScene2D(function* (view) {
|
|
36
|
+
* const grid = createRef<Grid>();
|
|
37
|
+
*
|
|
38
|
+
* view.add(
|
|
39
|
+
* <Grid
|
|
40
|
+
* ref={grid}
|
|
41
|
+
* width={'100%'}
|
|
42
|
+
* height={'100%'}
|
|
43
|
+
* stroke={'#666'}
|
|
44
|
+
* start={0}
|
|
45
|
+
* end={1}
|
|
46
|
+
* />,
|
|
47
|
+
* );
|
|
48
|
+
*
|
|
49
|
+
* yield* all(
|
|
50
|
+
* grid().end(0.5, 1).to(1, 1).wait(1),
|
|
51
|
+
* grid().start(0.5, 1).to(0, 1).wait(1),
|
|
52
|
+
* );
|
|
53
|
+
* });
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
@nodeName('Grid')
|
|
57
|
+
export class Grid extends Shape {
|
|
58
|
+
/**
|
|
59
|
+
* The spacing between the grid lines.
|
|
60
|
+
*/
|
|
61
|
+
@initial(80)
|
|
62
|
+
@vector2Signal('spacing')
|
|
63
|
+
public declare readonly spacing: Vector2Signal<this>;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The percentage that should be clipped from the beginning of each grid line.
|
|
67
|
+
*
|
|
68
|
+
* @remarks
|
|
69
|
+
* The portion of each grid line that comes before the given percentage will
|
|
70
|
+
* be made invisible.
|
|
71
|
+
*
|
|
72
|
+
* This property is useful for animating the grid appearing on-screen.
|
|
73
|
+
*/
|
|
74
|
+
@initial(0)
|
|
75
|
+
@signal()
|
|
76
|
+
public declare readonly start: SimpleSignal<number, this>;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The percentage that should be clipped from the end of each grid line.
|
|
80
|
+
*
|
|
81
|
+
* @remarks
|
|
82
|
+
* The portion of each grid line that comes after the given percentage will
|
|
83
|
+
* be made invisible.
|
|
84
|
+
*
|
|
85
|
+
* This property is useful for animating the grid appearing on-screen.
|
|
86
|
+
*/
|
|
87
|
+
@initial(1)
|
|
88
|
+
@signal()
|
|
89
|
+
public declare readonly end: SimpleSignal<number, this>;
|
|
90
|
+
|
|
91
|
+
public constructor(props: GridProps) {
|
|
92
|
+
super(props);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
protected override drawShape(context: CanvasRenderingContext2D) {
|
|
96
|
+
context.save();
|
|
97
|
+
this.applyStyle(context);
|
|
98
|
+
this.drawRipple(context);
|
|
99
|
+
|
|
100
|
+
const spacing = this.spacing();
|
|
101
|
+
const size = this.computedSize().scale(0.5);
|
|
102
|
+
const steps = size.div(spacing).floored;
|
|
103
|
+
|
|
104
|
+
for (let x = -steps.x; x <= steps.x; x++) {
|
|
105
|
+
const [from, to] = this.mapPoints(-size.height, size.height);
|
|
106
|
+
|
|
107
|
+
context.beginPath();
|
|
108
|
+
context.moveTo(spacing.x * x, from);
|
|
109
|
+
context.lineTo(spacing.x * x, to);
|
|
110
|
+
context.stroke();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
for (let y = -steps.y; y <= steps.y; y++) {
|
|
114
|
+
const [from, to] = this.mapPoints(-size.width, size.width);
|
|
115
|
+
|
|
116
|
+
context.beginPath();
|
|
117
|
+
context.moveTo(from, spacing.y * y);
|
|
118
|
+
context.lineTo(to, spacing.y * y);
|
|
119
|
+
context.stroke();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
context.restore();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
private mapPoints(start: number, end: number): [number, number] {
|
|
126
|
+
let from = map(start, end, this.start());
|
|
127
|
+
let to = map(start, end, this.end());
|
|
128
|
+
|
|
129
|
+
if (to < from) {
|
|
130
|
+
[from, to] = [to, from];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return [from, to];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
ColorSignal,
|
|
3
|
-
PossibleColor,
|
|
4
|
-
SignalValue,
|
|
5
|
-
SimpleSignal,
|
|
6
|
-
} from '@twick/core';
|
|
7
|
-
import {useLogger} from '@twick/core';
|
|
8
|
-
import {colorSignal, computed, initial, signal} from '../decorators';
|
|
9
|
-
import type {ImgProps} from './Img';
|
|
10
|
-
import {Img} from './Img';
|
|
11
|
-
|
|
12
|
-
export interface IconProps extends ImgProps {
|
|
13
|
-
/**
|
|
14
|
-
* {@inheritDoc Icon.icon}
|
|
15
|
-
*/
|
|
16
|
-
icon: SignalValue<string>;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* {@inheritDoc Icon.color}
|
|
20
|
-
*/
|
|
21
|
-
color?: SignalValue<PossibleColor>;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* An Icon Component that provides easy access to over 150k icons.
|
|
26
|
-
* See https://icones.js.org/collection/all for all available Icons.
|
|
27
|
-
*/
|
|
28
|
-
export class Icon extends Img {
|
|
29
|
-
/**
|
|
30
|
-
* The identifier of the icon.
|
|
31
|
-
*
|
|
32
|
-
* @remarks
|
|
33
|
-
* You can find identifiers on [Icônes](https://icones.js.org).
|
|
34
|
-
* They can look like this:
|
|
35
|
-
* * `mdi:language-typescript`
|
|
36
|
-
* * `ph:anchor-simple-bold`
|
|
37
|
-
* * `ph:activity-bold`
|
|
38
|
-
*/
|
|
39
|
-
@signal()
|
|
40
|
-
public declare icon: SimpleSignal<string, this>;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* The color of the icon
|
|
44
|
-
*
|
|
45
|
-
* @remarks
|
|
46
|
-
* Provide the color in one of the following formats:
|
|
47
|
-
* * named color like `red`, `darkgray`, …
|
|
48
|
-
* * hexadecimal string with # like `#bada55`, `#141414`
|
|
49
|
-
* Value can be either RGB or RGBA: `#bada55`, `#bada55aa` (latter is partially transparent)
|
|
50
|
-
* The shorthand version (e.g. `#abc` for `#aabbcc` is also possible.)
|
|
51
|
-
*
|
|
52
|
-
* @defaultValue 'white'
|
|
53
|
-
*/
|
|
54
|
-
@initial('white')
|
|
55
|
-
@colorSignal()
|
|
56
|
-
public declare color: ColorSignal<this>;
|
|
57
|
-
|
|
58
|
-
public constructor(props: IconProps) {
|
|
59
|
-
super({
|
|
60
|
-
...props,
|
|
61
|
-
src: null,
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Create the URL that will be used as the Image source
|
|
67
|
-
* @returns Address to Iconify API for the requested Icon.
|
|
68
|
-
*/
|
|
69
|
-
@computed()
|
|
70
|
-
protected svgUrl(): string {
|
|
71
|
-
const iconPathSegment = this.icon().replace(':', '/');
|
|
72
|
-
const encodedColorValue = encodeURIComponent(this.color().hex());
|
|
73
|
-
// Iconify API is documented here: https://docs.iconify.design/api/svg.html#color
|
|
74
|
-
return `https://api.iconify.design/${iconPathSegment}.svg?color=${encodedColorValue}`;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* overrides `Image.src` getter
|
|
79
|
-
*/
|
|
80
|
-
protected getSrc(): string {
|
|
81
|
-
return this.svgUrl();
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* overrides `Image.src` setter to warn the user that the value
|
|
86
|
-
* is not used
|
|
87
|
-
*/
|
|
88
|
-
protected setSrc(src: string | null) {
|
|
89
|
-
if (src === null) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
useLogger().warn(
|
|
93
|
-
"The Icon Component does not accept setting the `src`. If you need access to `src`, use '<Img/>` instead.",
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
1
|
+
import type {
|
|
2
|
+
ColorSignal,
|
|
3
|
+
PossibleColor,
|
|
4
|
+
SignalValue,
|
|
5
|
+
SimpleSignal,
|
|
6
|
+
} from '@twick/core';
|
|
7
|
+
import {useLogger} from '@twick/core';
|
|
8
|
+
import {colorSignal, computed, initial, signal} from '../decorators';
|
|
9
|
+
import type {ImgProps} from './Img';
|
|
10
|
+
import {Img} from './Img';
|
|
11
|
+
|
|
12
|
+
export interface IconProps extends ImgProps {
|
|
13
|
+
/**
|
|
14
|
+
* {@inheritDoc Icon.icon}
|
|
15
|
+
*/
|
|
16
|
+
icon: SignalValue<string>;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* {@inheritDoc Icon.color}
|
|
20
|
+
*/
|
|
21
|
+
color?: SignalValue<PossibleColor>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* An Icon Component that provides easy access to over 150k icons.
|
|
26
|
+
* See https://icones.js.org/collection/all for all available Icons.
|
|
27
|
+
*/
|
|
28
|
+
export class Icon extends Img {
|
|
29
|
+
/**
|
|
30
|
+
* The identifier of the icon.
|
|
31
|
+
*
|
|
32
|
+
* @remarks
|
|
33
|
+
* You can find identifiers on [Icônes](https://icones.js.org).
|
|
34
|
+
* They can look like this:
|
|
35
|
+
* * `mdi:language-typescript`
|
|
36
|
+
* * `ph:anchor-simple-bold`
|
|
37
|
+
* * `ph:activity-bold`
|
|
38
|
+
*/
|
|
39
|
+
@signal()
|
|
40
|
+
public declare icon: SimpleSignal<string, this>;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The color of the icon
|
|
44
|
+
*
|
|
45
|
+
* @remarks
|
|
46
|
+
* Provide the color in one of the following formats:
|
|
47
|
+
* * named color like `red`, `darkgray`, …
|
|
48
|
+
* * hexadecimal string with # like `#bada55`, `#141414`
|
|
49
|
+
* Value can be either RGB or RGBA: `#bada55`, `#bada55aa` (latter is partially transparent)
|
|
50
|
+
* The shorthand version (e.g. `#abc` for `#aabbcc` is also possible.)
|
|
51
|
+
*
|
|
52
|
+
* @defaultValue 'white'
|
|
53
|
+
*/
|
|
54
|
+
@initial('white')
|
|
55
|
+
@colorSignal()
|
|
56
|
+
public declare color: ColorSignal<this>;
|
|
57
|
+
|
|
58
|
+
public constructor(props: IconProps) {
|
|
59
|
+
super({
|
|
60
|
+
...props,
|
|
61
|
+
src: null,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Create the URL that will be used as the Image source
|
|
67
|
+
* @returns Address to Iconify API for the requested Icon.
|
|
68
|
+
*/
|
|
69
|
+
@computed()
|
|
70
|
+
protected svgUrl(): string {
|
|
71
|
+
const iconPathSegment = this.icon().replace(':', '/');
|
|
72
|
+
const encodedColorValue = encodeURIComponent(this.color().hex());
|
|
73
|
+
// Iconify API is documented here: https://docs.iconify.design/api/svg.html#color
|
|
74
|
+
return `https://api.iconify.design/${iconPathSegment}.svg?color=${encodedColorValue}`;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* overrides `Image.src` getter
|
|
79
|
+
*/
|
|
80
|
+
protected getSrc(): string {
|
|
81
|
+
return this.svgUrl();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* overrides `Image.src` setter to warn the user that the value
|
|
86
|
+
* is not used
|
|
87
|
+
*/
|
|
88
|
+
protected setSrc(src: string | null) {
|
|
89
|
+
if (src === null) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
useLogger().warn(
|
|
93
|
+
"The Icon Component does not accept setting the `src`. If you need access to `src`, use '<Img/>` instead.",
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
}
|