@omnimedia/omnitool 1.1.0-76 → 1.1.0-78
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/README.md +52 -4
- package/package.json +2 -1
- package/s/driver/fns/schematic.ts +11 -2
- package/s/driver/parts/compositor.ts +46 -2
- package/s/driver/utils/find-pixi-filter.ts +24 -0
- package/s/timeline/index.ts +1 -1
- package/s/timeline/parts/filters.ts +453 -0
- package/s/timeline/parts/item.ts +17 -1
- package/s/timeline/renderers/parts/samplers/visual/parts/sample.ts +9 -3
- package/s/timeline/sugar/helpers.ts +35 -2
- package/s/timeline/sugar/o.ts +38 -1
- package/s/timeline/types.ts +2 -0
- package/x/WebGLRenderer-4CHIZDHY.js +2 -0
- package/x/WebGPURenderer-O6WXU2QR.js +2 -0
- package/x/browserAll-WNIOTNNP.js +2 -0
- package/x/{demo/chunk-USLRKDKD.js → chunk-23FOBGX6.js} +2 -2
- package/x/{chunk-A45M2HJC.js.map → chunk-23FOBGX6.js.map} +1 -1
- package/x/{chunk-MWCIWPRL.js → chunk-73XOWA4F.js} +3 -3
- package/x/{chunk-Q7JBQNE4.js → chunk-IAWJKNX5.js} +2 -2
- package/x/{demo/chunk-Q4MWBZHL.js → chunk-KCMVLWBS.js} +2 -2
- package/x/{chunk-4ONWQOPX.js.map → chunk-KCMVLWBS.js.map} +1 -1
- package/x/{chunk-D5CIWPNS.js → chunk-MR32SQ27.js} +2 -2
- package/x/{chunk-W5CN46AR.js → chunk-VCUJJYRJ.js} +3 -3
- package/x/{chunk-WFT3KTZG.js → chunk-XNIZ4L5W.js} +2 -2
- package/x/{chunk-OTQK6FAJ.js → chunk-ZLGNQFUI.js} +2 -2
- package/x/demo/WebGLRenderer-RSJAHIG2.js +2 -0
- package/x/demo/WebGPURenderer-MGFAJCYY.js +2 -0
- package/x/demo/browserAll-PTRBXBRP.js +2 -0
- package/x/demo/{chunk-P3PTHHFE.js → chunk-CUYOGHWU.js} +2 -2
- package/x/demo/{chunk-P3PTHHFE.js.map → chunk-CUYOGHWU.js.map} +1 -1
- package/x/demo/{chunk-IRDQEA6B.js → chunk-DGTDNJ7W.js} +2 -2
- package/x/demo/{chunk-T3METYEY.js → chunk-FZ5BYF63.js} +2 -2
- package/x/demo/{chunk-T3METYEY.js.map → chunk-FZ5BYF63.js.map} +1 -1
- package/x/demo/{chunk-PYG4RZZ2.js → chunk-KWN4NNES.js} +15 -15
- package/x/demo/{chunk-PYG4RZZ2.js.map → chunk-KWN4NNES.js.map} +1 -1
- package/x/{chunk-4ONWQOPX.js → demo/chunk-OJ3FPXW7.js} +2 -2
- package/x/demo/{chunk-Q4MWBZHL.js.map → chunk-OJ3FPXW7.js.map} +1 -1
- package/x/demo/{chunk-RWJ2UHV4.js → chunk-PSLUOGTZ.js} +3 -3
- package/x/demo/{chunk-RWJ2UHV4.js.map → chunk-PSLUOGTZ.js.map} +1 -1
- package/x/demo/{chunk-YISSXWBT.js → chunk-VLCVEIFU.js} +3 -3
- package/x/demo/{chunk-YISSXWBT.js.map → chunk-VLCVEIFU.js.map} +1 -1
- package/x/demo/chunk-ZWCPT5FR.js +2 -0
- package/x/demo/demo.bundle.min.js +4921 -11
- package/x/demo/demo.bundle.min.js.map +4 -4
- package/x/demo/webworkerAll-JENRT6BT.js +2 -0
- package/x/driver/fns/schematic.d.ts +10 -1
- package/x/driver/parts/compositor.js +32 -1
- package/x/driver/parts/compositor.js.map +1 -1
- package/x/driver/utils/find-pixi-filter.d.ts +5 -0
- package/x/driver/utils/find-pixi-filter.js +13 -0
- package/x/driver/utils/find-pixi-filter.js.map +1 -0
- package/x/index.html +2 -2
- package/x/tests.bundle.min.js +4926 -16
- package/x/tests.bundle.min.js.map +4 -4
- package/x/tests.html +1 -1
- package/x/timeline/index.d.ts +1 -0
- package/x/timeline/index.js +1 -0
- package/x/timeline/index.js.map +1 -1
- package/x/timeline/parts/filters.d.ts +108 -0
- package/x/timeline/parts/filters.js +340 -0
- package/x/timeline/parts/filters.js.map +1 -0
- package/x/timeline/parts/item.d.ts +16 -2
- package/x/timeline/parts/item.js +1 -0
- package/x/timeline/parts/item.js.map +1 -1
- package/x/timeline/parts/waveform/parts/collect.d.ts +1 -1
- package/x/timeline/renderers/parts/samplers/visual/parts/sample.js +8 -2
- package/x/timeline/renderers/parts/samplers/visual/parts/sample.js.map +1 -1
- package/x/timeline/sugar/helpers.d.ts +11 -2
- package/x/timeline/sugar/helpers.js +15 -0
- package/x/timeline/sugar/helpers.js.map +1 -1
- package/x/timeline/sugar/o.d.ts +3 -1
- package/x/timeline/sugar/o.js +31 -0
- package/x/timeline/sugar/o.js.map +1 -1
- package/x/webworkerAll-RLCTMSDD.js +2 -0
- package/x/WebGLRenderer-7X274AYV.js +0 -2
- package/x/WebGPURenderer-XMCMEXAO.js +0 -2
- package/x/browserAll-LRGVU2GN.js +0 -2
- package/x/chunk-A45M2HJC.js +0 -2
- package/x/demo/WebGLRenderer-NLGJGAXK.js +0 -2
- package/x/demo/WebGPURenderer-RBOFXPL5.js +0 -2
- package/x/demo/browserAll-QEV2P3ED.js +0 -2
- package/x/demo/webworkerAll-ELLD4M57.js +0 -2
- package/x/webworkerAll-KR5SWEBU.js +0 -2
- /package/x/{WebGLRenderer-7X274AYV.js.map → WebGLRenderer-4CHIZDHY.js.map} +0 -0
- /package/x/{WebGPURenderer-XMCMEXAO.js.map → WebGPURenderer-O6WXU2QR.js.map} +0 -0
- /package/x/{browserAll-LRGVU2GN.js.map → browserAll-WNIOTNNP.js.map} +0 -0
- /package/x/{chunk-MWCIWPRL.js.map → chunk-73XOWA4F.js.map} +0 -0
- /package/x/{chunk-Q7JBQNE4.js.map → chunk-IAWJKNX5.js.map} +0 -0
- /package/x/{chunk-D5CIWPNS.js.map → chunk-MR32SQ27.js.map} +0 -0
- /package/x/{chunk-W5CN46AR.js.map → chunk-VCUJJYRJ.js.map} +0 -0
- /package/x/{chunk-WFT3KTZG.js.map → chunk-XNIZ4L5W.js.map} +0 -0
- /package/x/{chunk-OTQK6FAJ.js.map → chunk-ZLGNQFUI.js.map} +0 -0
- /package/x/demo/{WebGLRenderer-NLGJGAXK.js.map → WebGLRenderer-RSJAHIG2.js.map} +0 -0
- /package/x/demo/{WebGPURenderer-RBOFXPL5.js.map → WebGPURenderer-MGFAJCYY.js.map} +0 -0
- /package/x/demo/{browserAll-QEV2P3ED.js.map → browserAll-PTRBXBRP.js.map} +0 -0
- /package/x/demo/{chunk-IRDQEA6B.js.map → chunk-DGTDNJ7W.js.map} +0 -0
- /package/x/demo/{chunk-USLRKDKD.js.map → chunk-ZWCPT5FR.js.map} +0 -0
- /package/x/demo/{webworkerAll-ELLD4M57.js.map → webworkerAll-JENRT6BT.js.map} +0 -0
- /package/x/{webworkerAll-KR5SWEBU.js.map → webworkerAll-RLCTMSDD.js.map} +0 -0
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AlphaFilterOptions,
|
|
3
|
+
BlurFilterOptions,
|
|
4
|
+
ColorMatrix,
|
|
5
|
+
FilterOptions as PixiFilterOptions,
|
|
6
|
+
NoiseFilterOptions,
|
|
7
|
+
Point,
|
|
8
|
+
} from "pixi.js"
|
|
9
|
+
import type * as PixiFilters from "pixi-filters"
|
|
10
|
+
import {FilterableItem, Item} from "./item.js"
|
|
11
|
+
|
|
12
|
+
export type PixelateFilterOptions = {size?: number | number[] | Point}
|
|
13
|
+
export type EmbossFilterOptions = {strength?: number}
|
|
14
|
+
|
|
15
|
+
export type ChoiceOptions = string[] | Record<string, string | number> | number[]
|
|
16
|
+
|
|
17
|
+
export type ChoiceFilterProperty = {
|
|
18
|
+
type: "choice"
|
|
19
|
+
options: ChoiceOptions
|
|
20
|
+
default: string | number
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type NumericFilterProperty = {
|
|
24
|
+
type: "number"
|
|
25
|
+
min: number
|
|
26
|
+
max: number
|
|
27
|
+
default: number
|
|
28
|
+
step?: number
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type ColorFilterProperty = {
|
|
32
|
+
type: "color"
|
|
33
|
+
default: string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type BooleanFilterProperty = {
|
|
37
|
+
type: "boolean"
|
|
38
|
+
default: boolean
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export type ObjectFilterProperty = {
|
|
42
|
+
type: "object"
|
|
43
|
+
properties: Record<string, FilterPropertyConfig>
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export type ArrayFilterProperty = {
|
|
47
|
+
type: "array"
|
|
48
|
+
items: FilterPropertyConfig[]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export type FilterPropertyConfig =
|
|
52
|
+
| NumericFilterProperty
|
|
53
|
+
| ColorFilterProperty
|
|
54
|
+
| BooleanFilterProperty
|
|
55
|
+
| ChoiceFilterProperty
|
|
56
|
+
| ObjectFilterProperty
|
|
57
|
+
| ArrayFilterProperty
|
|
58
|
+
|
|
59
|
+
export interface FilterSchema {
|
|
60
|
+
[property: string]: FilterPropertyConfig
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export type SchemaFromOptions<T> = {
|
|
64
|
+
[K in keyof Required<T>]?: FilterPropertyConfig
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
type FilterDefinition<TType extends string, TParams> = {
|
|
68
|
+
type: TType
|
|
69
|
+
schema: SchemaFromOptions<TParams>
|
|
70
|
+
_params?: TParams
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const num =(
|
|
74
|
+
min: number,
|
|
75
|
+
max: number,
|
|
76
|
+
defaultValue: number,
|
|
77
|
+
step?: number,
|
|
78
|
+
): NumericFilterProperty => ({
|
|
79
|
+
type: "number",
|
|
80
|
+
min,
|
|
81
|
+
max,
|
|
82
|
+
default: defaultValue,
|
|
83
|
+
...(step === undefined ? {} : {step}),
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
const color =(defaultValue: string): ColorFilterProperty => ({
|
|
87
|
+
type: "color",
|
|
88
|
+
default: defaultValue,
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
const bool =(defaultValue: boolean): BooleanFilterProperty => ({
|
|
92
|
+
type: "boolean",
|
|
93
|
+
default: defaultValue,
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
const choice =(
|
|
97
|
+
options: ChoiceOptions,
|
|
98
|
+
defaultValue: string | number,
|
|
99
|
+
): ChoiceFilterProperty => ({
|
|
100
|
+
type: "choice",
|
|
101
|
+
options,
|
|
102
|
+
default: defaultValue,
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
const object =(properties: Record<string, FilterPropertyConfig>): ObjectFilterProperty => ({
|
|
106
|
+
type: "object",
|
|
107
|
+
properties,
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
const array =(items: FilterPropertyConfig[]): ArrayFilterProperty => ({
|
|
111
|
+
type: "array",
|
|
112
|
+
items,
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
const kernelSizes = [3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]
|
|
116
|
+
const glitchFillModes = {
|
|
117
|
+
TRANSPARENT: 0,
|
|
118
|
+
ORIGINAL: 1,
|
|
119
|
+
LOOP: 2,
|
|
120
|
+
CLAMP: 3,
|
|
121
|
+
MIRROR: 4,
|
|
122
|
+
} as const
|
|
123
|
+
|
|
124
|
+
const defineFilter = <TParams>() =>
|
|
125
|
+
<TType extends string>(
|
|
126
|
+
type: TType,
|
|
127
|
+
schema: SchemaFromOptions<TParams> = {},
|
|
128
|
+
): FilterDefinition<TType, TParams> => ({type, schema})
|
|
129
|
+
|
|
130
|
+
export const filters = {
|
|
131
|
+
adjustment: defineFilter<PixiFilters.AdjustmentFilterOptions>()("AdjustmentFilter", {
|
|
132
|
+
gamma: num(0, 5, 1),
|
|
133
|
+
saturation: num(0, 5, 1),
|
|
134
|
+
contrast: num(0, 5, 1),
|
|
135
|
+
brightness: num(0, 5, 1),
|
|
136
|
+
red: num(0, 5, 1),
|
|
137
|
+
green: num(0, 5, 1),
|
|
138
|
+
blue: num(0, 5, 1),
|
|
139
|
+
alpha: num(0, 1, 1, 0.01),
|
|
140
|
+
}),
|
|
141
|
+
advancedBloom: defineFilter<PixiFilters.AdvancedBloomFilterOptions>()("AdvancedBloomFilter", {
|
|
142
|
+
threshold: num(0.1, 0.9, 0.5, 0.01),
|
|
143
|
+
bloomScale: num(0.5, 1.5, 1, 0.01),
|
|
144
|
+
brightness: num(0.5, 1.5, 1, 0.01),
|
|
145
|
+
blur: num(0, 20, 8, 0.1),
|
|
146
|
+
quality: num(1, 20, 4, 1),
|
|
147
|
+
}),
|
|
148
|
+
alpha: defineFilter<AlphaFilterOptions>()("AlphaFilter", {
|
|
149
|
+
alpha: num(0, 1, 1, 0.01),
|
|
150
|
+
}),
|
|
151
|
+
ascii: defineFilter<PixiFilters.AsciiFilterOptions>()("AsciiFilter", {
|
|
152
|
+
size: num(2, 20, 8, 1),
|
|
153
|
+
color: color("#ffffff"),
|
|
154
|
+
replaceColor: bool(false),
|
|
155
|
+
}),
|
|
156
|
+
backdropBlur: defineFilter<BlurFilterOptions>()("BackdropBlurFilter", {
|
|
157
|
+
strength: num(0, 100, 8, 0.1),
|
|
158
|
+
quality: num(1, 10, 4, 1),
|
|
159
|
+
}),
|
|
160
|
+
bevel: defineFilter<PixiFilters.BevelFilterOptions>()("BevelFilter", {
|
|
161
|
+
rotation: num(0, 360, 45, 1),
|
|
162
|
+
thickness: num(0, 10, 2, 0.1),
|
|
163
|
+
lightColor: color("#ffffff"),
|
|
164
|
+
lightAlpha: num(0, 1, 0.7, 0.01),
|
|
165
|
+
shadowColor: color("#000000"),
|
|
166
|
+
shadowAlpha: num(0, 1, 0.7, 0.01),
|
|
167
|
+
}),
|
|
168
|
+
bloom: defineFilter<PixiFilters.BloomFilterOptions>()("BloomFilter", {
|
|
169
|
+
strength: object({
|
|
170
|
+
x: num(0, 20, 2, 0.1),
|
|
171
|
+
y: num(0, 20, 2, 0.1),
|
|
172
|
+
}),
|
|
173
|
+
quality: num(1, 20, 4, 1),
|
|
174
|
+
resolution: num(0.25, 4, 1, 0.01),
|
|
175
|
+
kernelSize: choice([5, 7, 9, 11, 13, 15], 5),
|
|
176
|
+
}),
|
|
177
|
+
blur: defineFilter<BlurFilterOptions>()("BlurFilter", {
|
|
178
|
+
strength: num(0, 100, 8, 0.1),
|
|
179
|
+
quality: num(1, 10, 4, 1),
|
|
180
|
+
}),
|
|
181
|
+
bulgePinch: defineFilter<PixiFilters.BulgePinchFilterOptions>()("BulgePinchFilter", {
|
|
182
|
+
radius: num(0, 1000, 100, 1),
|
|
183
|
+
strength: num(-1, 1, 1, 0.01),
|
|
184
|
+
center: object({
|
|
185
|
+
x: num(0, 1, 0.5, 0.01),
|
|
186
|
+
y: num(0, 1, 0.5, 0.01),
|
|
187
|
+
}),
|
|
188
|
+
}),
|
|
189
|
+
colorGradient: defineFilter<PixiFilters.ColorGradientFilterOptions | PixiFilters.ColorGradientFilterCSSOptions>()("ColorGradientFilter"),
|
|
190
|
+
colorMatrix: defineFilter<PixiFilterOptions & {matrix?: ColorMatrix}>()("ColorMatrixFilter"),
|
|
191
|
+
colorOverlay: defineFilter<PixiFilters.ColorOverlayFilterOptions>()("ColorOverlayFilter", {
|
|
192
|
+
color: color("#ff0000"),
|
|
193
|
+
alpha: num(0, 1, 0.5, 0.01),
|
|
194
|
+
}),
|
|
195
|
+
colorReplace: defineFilter<PixiFilters.ColorReplaceFilterOptions>()("ColorReplaceFilter", {
|
|
196
|
+
originalColor: color("#ff0000"),
|
|
197
|
+
targetColor: color("#000000"),
|
|
198
|
+
tolerance: num(0, 1, 0.4, 0.01),
|
|
199
|
+
}),
|
|
200
|
+
convolution: defineFilter<PixiFilters.ConvolutionFilterOptions>()("ConvolutionFilter", {
|
|
201
|
+
width: num(0, 500, 300, 1),
|
|
202
|
+
height: num(0, 500, 300, 1),
|
|
203
|
+
matrix: array([
|
|
204
|
+
num(0, 1, 0),
|
|
205
|
+
num(0, 1, 0.5, 0.01),
|
|
206
|
+
num(0, 1, 0),
|
|
207
|
+
num(0, 1, 0.5, 0.01),
|
|
208
|
+
num(0, 1, 1, 0.01),
|
|
209
|
+
num(0, 1, 0.5, 0.01),
|
|
210
|
+
num(0, 1, 0),
|
|
211
|
+
num(0, 1, 0.5, 0.01),
|
|
212
|
+
num(0, 1, 0),
|
|
213
|
+
]),
|
|
214
|
+
}),
|
|
215
|
+
crossHatch: defineFilter<{}>()("CrossHatchFilter"),
|
|
216
|
+
crt: defineFilter<PixiFilters.CRTFilterOptions>()("CRTFilter", {
|
|
217
|
+
curvature: num(0, 10, 1, 0.01),
|
|
218
|
+
lineWidth: num(0, 5, 3, 0.01),
|
|
219
|
+
lineContrast: num(0, 1, 0.3, 0.01),
|
|
220
|
+
verticalLine: bool(false),
|
|
221
|
+
noise: num(0, 1, 0.2, 0.01),
|
|
222
|
+
noiseSize: num(1, 10, 1, 0.1),
|
|
223
|
+
vignetting: num(0, 1, 0.3, 0.01),
|
|
224
|
+
vignettingAlpha: num(0, 1, 1, 0.01),
|
|
225
|
+
vignettingBlur: num(0, 1, 0.3, 0.01),
|
|
226
|
+
seed: num(0, 1, 0, 0.01),
|
|
227
|
+
time: num(0.5, 20, 0.5, 0.01),
|
|
228
|
+
}),
|
|
229
|
+
dot: defineFilter<PixiFilters.DotFilterOptions>()("DotFilter", {
|
|
230
|
+
scale: num(0.3, 1, 1, 0.01),
|
|
231
|
+
angle: num(0, 5, 5, 0.01),
|
|
232
|
+
grayscale: bool(true),
|
|
233
|
+
}),
|
|
234
|
+
dropShadow: defineFilter<PixiFilters.DropShadowFilterOptions>()("DropShadowFilter", {
|
|
235
|
+
blur: num(0, 20, 2, 0.1),
|
|
236
|
+
quality: num(1, 20, 3, 1),
|
|
237
|
+
alpha: num(0, 1, 0.5, 0.01),
|
|
238
|
+
offset: object({
|
|
239
|
+
x: num(-50, 50, 4, 1),
|
|
240
|
+
y: num(-50, 50, 4, 1),
|
|
241
|
+
}),
|
|
242
|
+
color: color("#000000"),
|
|
243
|
+
shadowOnly: bool(false),
|
|
244
|
+
}),
|
|
245
|
+
emboss: defineFilter<EmbossFilterOptions>()("EmbossFilter", {
|
|
246
|
+
strength: num(0, 20, 5, 0.1),
|
|
247
|
+
}),
|
|
248
|
+
glitch: defineFilter<PixiFilters.GlitchFilterOptions>()("GlitchFilter", {
|
|
249
|
+
slices: num(0, 64, 5, 1),
|
|
250
|
+
seed: num(0, 1, 0.5, 0.01),
|
|
251
|
+
offset: num(-400, 400, 100, 1),
|
|
252
|
+
direction: num(-180, 180, 0, 1),
|
|
253
|
+
fillMode: choice(glitchFillModes, "LOOP"),
|
|
254
|
+
average: bool(false),
|
|
255
|
+
minSize: num(0, 64, 8, 1),
|
|
256
|
+
sampleSize: num(1, 2048, 512, 1),
|
|
257
|
+
red: object({
|
|
258
|
+
x: num(-50, 50, 2, 1),
|
|
259
|
+
y: num(-50, 50, 2, 1),
|
|
260
|
+
}),
|
|
261
|
+
blue: object({
|
|
262
|
+
x: num(-50, 50, 10, 1),
|
|
263
|
+
y: num(-50, 50, -4, 1),
|
|
264
|
+
}),
|
|
265
|
+
green: object({
|
|
266
|
+
x: num(-50, 50, -10, 1),
|
|
267
|
+
y: num(-50, 50, 4, 1),
|
|
268
|
+
}),
|
|
269
|
+
}),
|
|
270
|
+
glow: defineFilter<PixiFilters.GlowFilterOptions>()("GlowFilter", {
|
|
271
|
+
distance: num(0, 20, 15, 0.1),
|
|
272
|
+
innerStrength: num(0, 20, 0, 0.1),
|
|
273
|
+
outerStrength: num(0, 20, 2, 0.1),
|
|
274
|
+
color: color("#ffffff"),
|
|
275
|
+
quality: num(0, 1, 0.2, 0.01),
|
|
276
|
+
alpha: num(0, 1, 1, 0.01),
|
|
277
|
+
knockout: bool(false),
|
|
278
|
+
}),
|
|
279
|
+
godray: defineFilter<PixiFilters.GodrayFilterOptions>()("GodrayFilter", {
|
|
280
|
+
time: num(0, 1, 0, 0.01),
|
|
281
|
+
gain: num(0, 1, 0.6, 0.01),
|
|
282
|
+
lacunarity: num(0, 5, 2.75, 0.01),
|
|
283
|
+
alpha: num(0, 1, 1, 0.01),
|
|
284
|
+
parallel: bool(true),
|
|
285
|
+
angle: num(-60, 60, 30, 1),
|
|
286
|
+
center: object({
|
|
287
|
+
x: num(-100, 2012, 956, 1),
|
|
288
|
+
y: num(-1000, -100, -100, 1),
|
|
289
|
+
}),
|
|
290
|
+
}),
|
|
291
|
+
grayscale: defineFilter<{}>()("GrayscaleFilter"),
|
|
292
|
+
hslAdjustment: defineFilter<PixiFilters.HslAdjustmentFilterOptions>()("HslAdjustmentFilter", {
|
|
293
|
+
hue: num(-180, 180, 0, 1),
|
|
294
|
+
saturation: num(-1, 1, 0, 0.01),
|
|
295
|
+
lightness: num(-1, 1, 0, 0.01),
|
|
296
|
+
colorize: bool(false),
|
|
297
|
+
alpha: num(0, 1, 1, 0.01),
|
|
298
|
+
}),
|
|
299
|
+
kawaseBlur: defineFilter<PixiFilters.KawaseBlurFilterOptions>()("KawaseBlurFilter", {
|
|
300
|
+
strength: num(0, 20, 4, 0.1),
|
|
301
|
+
quality: num(1, 20, 3, 1),
|
|
302
|
+
pixelSize: object({
|
|
303
|
+
x: num(0, 10, 1, 0.1),
|
|
304
|
+
y: num(0, 10, 1, 0.1),
|
|
305
|
+
}),
|
|
306
|
+
}),
|
|
307
|
+
motionBlur: defineFilter<PixiFilters.MotionBlurFilterOptions>()("MotionBlurFilter", {
|
|
308
|
+
velocity: object({
|
|
309
|
+
x: num(-90, 90, 40, 1),
|
|
310
|
+
y: num(-90, 90, 40, 1),
|
|
311
|
+
}),
|
|
312
|
+
kernelSize: choice(kernelSizes, 15),
|
|
313
|
+
offset: num(-150, 150, 0, 1),
|
|
314
|
+
}),
|
|
315
|
+
multiColorReplace: defineFilter<PixiFilters.MultiColorReplaceFilterOptions>()("MultiColorReplaceFilter"),
|
|
316
|
+
noise: defineFilter<NoiseFilterOptions>()("NoiseFilter", {
|
|
317
|
+
noise: num(0, 1, 0.5, 0.01),
|
|
318
|
+
seed: num(0.01, 10, 0.5, 0.01),
|
|
319
|
+
}),
|
|
320
|
+
oldFilm: defineFilter<PixiFilters.OldFilmFilterOptions>()("OldFilmFilter", {
|
|
321
|
+
sepia: num(0, 1, 0.3, 0.01),
|
|
322
|
+
noise: num(0, 1, 0.3, 0.01),
|
|
323
|
+
noiseSize: num(1, 10, 1, 0.1),
|
|
324
|
+
scratch: num(-1, 1, 0.5, 0.01),
|
|
325
|
+
scratchDensity: num(0, 1, 0.3, 0.01),
|
|
326
|
+
scratchWidth: num(1, 20, 1, 0.1),
|
|
327
|
+
vignetting: num(0, 1, 0.3, 0.01),
|
|
328
|
+
vignettingAlpha: num(0, 1, 1, 0.01),
|
|
329
|
+
vignettingBlur: num(0, 1, 0.3, 0.01),
|
|
330
|
+
}),
|
|
331
|
+
outline: defineFilter<PixiFilters.OutlineFilterOptions>()("OutlineFilter", {
|
|
332
|
+
thickness: num(0, 10, 4, 0.1),
|
|
333
|
+
color: color("#000000"),
|
|
334
|
+
alpha: num(0, 1, 1, 0.01),
|
|
335
|
+
knockout: bool(false),
|
|
336
|
+
}),
|
|
337
|
+
pixelate: defineFilter<PixelateFilterOptions>()("PixelateFilter", {
|
|
338
|
+
size: object({
|
|
339
|
+
x: num(4, 40, 10, 1),
|
|
340
|
+
y: num(4, 40, 10, 1),
|
|
341
|
+
}),
|
|
342
|
+
}),
|
|
343
|
+
radialBlur: defineFilter<PixiFilters.RadialBlurFilterOptions>()("RadialBlurFilter", {
|
|
344
|
+
angle: num(-180, 180, 20, 1),
|
|
345
|
+
radius: num(-1, 1912, 300, 1),
|
|
346
|
+
center: object({
|
|
347
|
+
x: num(0, 1912, 956, 1),
|
|
348
|
+
y: num(0, 920, 460, 1),
|
|
349
|
+
}),
|
|
350
|
+
kernelSize: choice(kernelSizes, 15),
|
|
351
|
+
}),
|
|
352
|
+
reflection: defineFilter<PixiFilters.ReflectionFilterOptions>()("ReflectionFilter", {
|
|
353
|
+
mirror: bool(true),
|
|
354
|
+
boundary: num(0, 1, 0.5, 0.01),
|
|
355
|
+
amplitude: object({
|
|
356
|
+
start: num(0, 50, 0, 0.1),
|
|
357
|
+
end: num(0, 50, 20, 0.1),
|
|
358
|
+
}),
|
|
359
|
+
waveLength: object({
|
|
360
|
+
start: num(10, 200, 30, 1),
|
|
361
|
+
end: num(10, 200, 100, 1),
|
|
362
|
+
}),
|
|
363
|
+
alpha: object({
|
|
364
|
+
start: num(0, 1, 1, 0.01),
|
|
365
|
+
end: num(0, 1, 1, 0.01),
|
|
366
|
+
}),
|
|
367
|
+
time: num(0, 20, 0, 0.01),
|
|
368
|
+
}),
|
|
369
|
+
rgbSplit: defineFilter<PixiFilters.RGBSplitFilterOptions>()("RGBSplitFilter", {
|
|
370
|
+
red: object({
|
|
371
|
+
x: num(-20, 20, -10, 1),
|
|
372
|
+
y: num(-20, 20, 0, 1),
|
|
373
|
+
}),
|
|
374
|
+
blue: object({
|
|
375
|
+
x: num(-20, 20, 0, 1),
|
|
376
|
+
y: num(-20, 20, 0, 1),
|
|
377
|
+
}),
|
|
378
|
+
green: object({
|
|
379
|
+
x: num(-20, 20, 0, 1),
|
|
380
|
+
y: num(-20, 20, 10, 1),
|
|
381
|
+
}),
|
|
382
|
+
}),
|
|
383
|
+
shockwave: defineFilter<PixiFilters.ShockwaveFilterOptions>()("ShockwaveFilter", {
|
|
384
|
+
speed: num(500, 2000, 500, 1),
|
|
385
|
+
amplitude: num(1, 100, 30, 1),
|
|
386
|
+
wavelength: num(2, 400, 160, 1),
|
|
387
|
+
brightness: num(0.2, 2, 1, 0.01),
|
|
388
|
+
radius: num(100, 2000, -1, 1),
|
|
389
|
+
center: object({
|
|
390
|
+
x: num(0, 1912, 956, 1),
|
|
391
|
+
y: num(0, 920, 460, 1),
|
|
392
|
+
}),
|
|
393
|
+
}),
|
|
394
|
+
simplexNoise: defineFilter<PixiFilters.SimplexNoiseFilterOptions>()("SimplexNoiseFilter", {
|
|
395
|
+
strength: num(0, 1, 0.5, 0.01),
|
|
396
|
+
noiseScale: num(0, 50, 10, 0.1),
|
|
397
|
+
offsetX: num(0, 5, 0, 0.01),
|
|
398
|
+
offsetY: num(0, 5, 0, 0.01),
|
|
399
|
+
offsetZ: num(0, 5, 0, 0.01),
|
|
400
|
+
step: num(-1, 1, -1, 0.01),
|
|
401
|
+
}),
|
|
402
|
+
tiltShift: defineFilter<PixiFilters.TiltShiftFilterOptions>()("TiltShiftFilter", {
|
|
403
|
+
blur: num(0, 200, 100, 0.1),
|
|
404
|
+
gradientBlur: num(0, 1000, 600, 1),
|
|
405
|
+
start: object({
|
|
406
|
+
x: num(0, 1912, 0, 1),
|
|
407
|
+
y: num(0, 920, 460, 1),
|
|
408
|
+
}),
|
|
409
|
+
end: object({
|
|
410
|
+
x: num(0, 1912, 1912, 1),
|
|
411
|
+
y: num(0, 920, 460, 1),
|
|
412
|
+
}),
|
|
413
|
+
}),
|
|
414
|
+
twist: defineFilter<Partial<PixiFilters.TwistFilterOptions>>()("TwistFilter", {
|
|
415
|
+
angle: num(-10, 10, 4, 0.01),
|
|
416
|
+
radius: num(0, 1912, 200, 1),
|
|
417
|
+
offset: object({
|
|
418
|
+
x: num(0, 1912, 956, 1),
|
|
419
|
+
y: num(0, 920, 460, 1),
|
|
420
|
+
}),
|
|
421
|
+
}),
|
|
422
|
+
zoomBlur: defineFilter<PixiFilters.ZoomBlurFilterOptions>()("ZoomBlurFilter", {
|
|
423
|
+
strength: num(0.01, 0.5, 0.1, 0.01),
|
|
424
|
+
center: object({
|
|
425
|
+
x: num(0, 1912, 956, 1),
|
|
426
|
+
y: num(0, 920, 460, 1),
|
|
427
|
+
}),
|
|
428
|
+
innerRadius: num(0, 956, 80, 1),
|
|
429
|
+
radius: num(0, 956, -1, 1),
|
|
430
|
+
}),
|
|
431
|
+
} as const
|
|
432
|
+
|
|
433
|
+
type FilterDefinitions = typeof filters
|
|
434
|
+
type FilterDefinitionParams<T> =
|
|
435
|
+
T extends FilterDefinition<string, infer TParams>
|
|
436
|
+
? TParams
|
|
437
|
+
: never
|
|
438
|
+
|
|
439
|
+
export type FilterOptions = {
|
|
440
|
+
[TName in keyof FilterDefinitions as FilterDefinitions[TName]["type"]]:
|
|
441
|
+
FilterDefinitionParams<FilterDefinitions[TName]>
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
export type FilterType = FilterDefinitions[keyof FilterDefinitions]["type"]
|
|
445
|
+
export type FilterParams<T extends FilterType = FilterType> = FilterOptions[T]
|
|
446
|
+
|
|
447
|
+
export interface FilterAction<TFilter extends FilterType> {
|
|
448
|
+
<T extends FilterableItem>(item: T, params?: FilterParams<TFilter>): T
|
|
449
|
+
make(params?: FilterParams<TFilter>): Item.Filter<TFilter>
|
|
450
|
+
}
|
|
451
|
+
export type FilterActions = {
|
|
452
|
+
[TName in keyof typeof filters]: FilterAction<(typeof filters)[TName]["type"]>
|
|
453
|
+
}
|
package/s/timeline/parts/item.ts
CHANGED
|
@@ -4,6 +4,7 @@ import {TextStyleOptions} from "pixi.js"
|
|
|
4
4
|
import {Id, Hash} from "./basics.js"
|
|
5
5
|
import {Transform} from "../types.js"
|
|
6
6
|
import {Ms} from "../../units/ms.js"
|
|
7
|
+
import type {FilterParams, FilterType} from "./filters.js"
|
|
7
8
|
|
|
8
9
|
export type Crop = [top: number, right: number, bottom: number, left: number]
|
|
9
10
|
|
|
@@ -16,7 +17,8 @@ export enum Kind {
|
|
|
16
17
|
Gap,
|
|
17
18
|
Spatial,
|
|
18
19
|
Transition,
|
|
19
|
-
TextStyle
|
|
20
|
+
TextStyle,
|
|
21
|
+
Filter
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
export enum Effect {
|
|
@@ -38,6 +40,14 @@ export namespace Item {
|
|
|
38
40
|
enabled: boolean
|
|
39
41
|
}
|
|
40
42
|
|
|
43
|
+
export type Filter<T extends FilterType = FilterType> = {
|
|
44
|
+
id: Id
|
|
45
|
+
kind: Kind.Filter
|
|
46
|
+
type: T
|
|
47
|
+
params?: FilterParams<T>
|
|
48
|
+
enabled: boolean
|
|
49
|
+
}
|
|
50
|
+
|
|
41
51
|
export type Gap = {
|
|
42
52
|
id: Id
|
|
43
53
|
kind: Kind.Gap
|
|
@@ -49,6 +59,7 @@ export namespace Item {
|
|
|
49
59
|
kind: Kind.Sequence
|
|
50
60
|
childrenIds: Id[]
|
|
51
61
|
spatialId?: Id
|
|
62
|
+
filterIds?: Id[]
|
|
52
63
|
}
|
|
53
64
|
|
|
54
65
|
export type Stack = {
|
|
@@ -56,6 +67,7 @@ export namespace Item {
|
|
|
56
67
|
kind: Kind.Stack
|
|
57
68
|
childrenIds: Id[]
|
|
58
69
|
spatialId?: Id
|
|
70
|
+
filterIds?: Id[]
|
|
59
71
|
}
|
|
60
72
|
|
|
61
73
|
export type Video = {
|
|
@@ -65,6 +77,7 @@ export namespace Item {
|
|
|
65
77
|
start: number
|
|
66
78
|
duration: number
|
|
67
79
|
spatialId?: Id
|
|
80
|
+
filterIds?: Id[]
|
|
68
81
|
}
|
|
69
82
|
|
|
70
83
|
export type Audio = {
|
|
@@ -83,6 +96,7 @@ export namespace Item {
|
|
|
83
96
|
duration: number
|
|
84
97
|
spatialId?: Id
|
|
85
98
|
styleId?: Id
|
|
99
|
+
filterIds?: Id[]
|
|
86
100
|
}
|
|
87
101
|
|
|
88
102
|
export type Transition = {
|
|
@@ -102,11 +116,13 @@ export namespace Item {
|
|
|
102
116
|
| Transition
|
|
103
117
|
| Spatial
|
|
104
118
|
| TextStyle
|
|
119
|
+
| Filter
|
|
105
120
|
)
|
|
106
121
|
}
|
|
107
122
|
|
|
108
123
|
export type ContainerItem = Item.Sequence | Item.Stack
|
|
109
124
|
export type NonContainerItem = Exclude<Item.Any, ContainerItem>
|
|
125
|
+
export type FilterableItem = Item.Sequence | Item.Stack | Item.Video | Item.Text
|
|
110
126
|
|
|
111
127
|
export type PlayableItem = Item.Any & {
|
|
112
128
|
start: Ms
|
|
@@ -3,7 +3,7 @@ import {SampleContext} from "./types.js"
|
|
|
3
3
|
import {sampleSequence} from "./sequence.js"
|
|
4
4
|
import {Ms} from "../../../../../../units/ms.js"
|
|
5
5
|
import {computeWorldMatrix} from "../../../handy.js"
|
|
6
|
-
import {Layer} from "../../../../../../driver/fns/schematic.js"
|
|
6
|
+
import {FilterSpec, Layer} from "../../../../../../driver/fns/schematic.js"
|
|
7
7
|
import {ContainerItem, Item, Kind} from "../../../../../parts/item.js"
|
|
8
8
|
|
|
9
9
|
export async function sampleVisual(
|
|
@@ -16,6 +16,12 @@ export async function sampleVisual(
|
|
|
16
16
|
const crop = "spatialId" in item && item.spatialId
|
|
17
17
|
? (ctx.items.get(item.spatialId) as Item.Spatial | undefined)?.crop
|
|
18
18
|
: undefined
|
|
19
|
+
const filters = "filterIds" in item && item.filterIds
|
|
20
|
+
? item.filterIds
|
|
21
|
+
.map(id => ctx.items.get(id) as Item.Filter | undefined)
|
|
22
|
+
.filter((filter): filter is Item.Filter => !!filter?.enabled)
|
|
23
|
+
.map(filter => ({type: filter.type, params: filter.params}) as FilterSpec)
|
|
24
|
+
: undefined
|
|
19
25
|
|
|
20
26
|
switch (item.kind) {
|
|
21
27
|
case Kind.Stack: {
|
|
@@ -38,7 +44,7 @@ export async function sampleVisual(
|
|
|
38
44
|
if (time < 0 || time >= item.duration) return []
|
|
39
45
|
|
|
40
46
|
const frame = await ctx.videoSampler(item, time)
|
|
41
|
-
return frame ? [{kind: "image", frame, matrix, crop, id: item.id}] : []
|
|
47
|
+
return frame ? [{kind: "image", frame, matrix, crop, filters, id: item.id}] : []
|
|
42
48
|
}
|
|
43
49
|
|
|
44
50
|
case Kind.Text: {
|
|
@@ -48,7 +54,7 @@ export async function sampleVisual(
|
|
|
48
54
|
? (ctx.items.get(item.styleId) as Item.TextStyle)?.style
|
|
49
55
|
: undefined
|
|
50
56
|
|
|
51
|
-
return [{id: item.id, kind: "text", content: item.content, style, matrix, crop}]
|
|
57
|
+
return [{id: item.id, kind: "text", content: item.content, style, matrix, crop, filters}]
|
|
52
58
|
}
|
|
53
59
|
|
|
54
60
|
case Kind.Gap: {
|
|
@@ -4,10 +4,12 @@ import {TextStyleOptions} from "pixi.js"
|
|
|
4
4
|
import {O} from "./o.js"
|
|
5
5
|
import {Transform} from "../types.js"
|
|
6
6
|
import {Media} from "../parts/media.js"
|
|
7
|
-
import {Crop, Item} from "../parts/item.js"
|
|
8
7
|
import {TimelineFile} from "../parts/basics.js"
|
|
8
|
+
import {FilterAction} from "../parts/filters.js"
|
|
9
|
+
import {Crop, FilterableItem, Item} from "../parts/item.js"
|
|
10
|
+
import {filters, FilterParams, FilterType} from "../parts/filters.js"
|
|
9
11
|
|
|
10
|
-
type Build<T extends Item.Any = Item.Any> = (o: O) => T
|
|
12
|
+
export type Build<T extends Item.Any = Item.Any> = (o: O) => T
|
|
11
13
|
|
|
12
14
|
function createTimeline(): TimelineFile {
|
|
13
15
|
return {
|
|
@@ -73,6 +75,37 @@ export function spatial(transform?: Transform, crop?: Crop): Build<Item.Spatial>
|
|
|
73
75
|
return o => o.spatial(transform, crop)
|
|
74
76
|
}
|
|
75
77
|
|
|
78
|
+
interface BuildFilterAction<TFilter extends FilterType> {
|
|
79
|
+
<T extends FilterableItem>(item: Build<T>, params?: FilterParams<TFilter>): Build<T>
|
|
80
|
+
make(params?: FilterParams<TFilter>): Build<Item.Filter<TFilter>>
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
type BuildFilterActions = {
|
|
84
|
+
[TName in keyof typeof filters]: BuildFilterAction<(typeof filters)[TName]["type"]>
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function makeFilter<TFilter extends FilterType>(
|
|
88
|
+
get: (o: O) => FilterAction<TFilter>
|
|
89
|
+
): BuildFilterAction<TFilter> {
|
|
90
|
+
const action = (<T extends FilterableItem>(
|
|
91
|
+
item: Build<T>,
|
|
92
|
+
params?: FilterParams<TFilter>
|
|
93
|
+
): Build<T> => o => get(o)(item(o), params)) as BuildFilterAction<TFilter>
|
|
94
|
+
action.make = (params?: FilterParams<TFilter>) => o => get(o).make(params)
|
|
95
|
+
return action
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function makeFilters(): BuildFilterActions {
|
|
99
|
+
const names = Object.keys(filters) as (keyof typeof filters)[]
|
|
100
|
+
const entries = names.map(name => [
|
|
101
|
+
name,
|
|
102
|
+
makeFilter(o => o.filter[name] as FilterAction<any>)
|
|
103
|
+
])
|
|
104
|
+
return Object.fromEntries(entries) as BuildFilterActions
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export const filter = makeFilters()
|
|
108
|
+
|
|
76
109
|
export function textStyle(style: TextStyleOptions): Build<Item.TextStyle> {
|
|
77
110
|
return o => o.textStyle(style)
|
|
78
111
|
}
|
package/s/timeline/sugar/o.ts
CHANGED
|
@@ -3,8 +3,10 @@ import {TextStyleOptions} from "pixi.js"
|
|
|
3
3
|
|
|
4
4
|
import {Media} from "../parts/media.js"
|
|
5
5
|
import {Id, TimelineFile} from "../parts/basics.js"
|
|
6
|
-
import {Crop, Effect, Item, Kind} from "../parts/item.js"
|
|
7
6
|
import {Transform, TransformOptions, Vec2} from "../types.js"
|
|
7
|
+
import {FilterAction, FilterActions} from "../parts/filters.js"
|
|
8
|
+
import {Crop, Effect, FilterableItem, Item, Kind} from "../parts/item.js"
|
|
9
|
+
import {filters, FilterParams, FilterType} from "../parts/filters.js"
|
|
8
10
|
|
|
9
11
|
export class O {
|
|
10
12
|
constructor(public state: {timeline: TimelineFile}) {}
|
|
@@ -57,6 +59,41 @@ export class O {
|
|
|
57
59
|
return item
|
|
58
60
|
}
|
|
59
61
|
|
|
62
|
+
#makeFilter = <TFilter extends FilterType>(type: TFilter) => {
|
|
63
|
+
const make = (params?: FilterParams<TFilter>) => {
|
|
64
|
+
const item: Item.Filter<TFilter> = {
|
|
65
|
+
id: this.getId(),
|
|
66
|
+
kind: Kind.Filter,
|
|
67
|
+
type,
|
|
68
|
+
params,
|
|
69
|
+
enabled: true
|
|
70
|
+
}
|
|
71
|
+
this.register(item)
|
|
72
|
+
return item
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const action = (<T extends FilterableItem>(item: T, params?: FilterParams<TFilter>): T => {
|
|
76
|
+
const filter = make(params)
|
|
77
|
+
const next = {
|
|
78
|
+
...item,
|
|
79
|
+
filterIds: [...(item.filterIds ?? []), filter.id]
|
|
80
|
+
}
|
|
81
|
+
this.set<T>(item.id, next as Partial<T>)
|
|
82
|
+
return next
|
|
83
|
+
}) as FilterAction<TFilter>
|
|
84
|
+
|
|
85
|
+
action.make = make
|
|
86
|
+
return action
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
#makeFilters = (): FilterActions => {
|
|
90
|
+
const entries = Object.entries(filters)
|
|
91
|
+
.map(([name, filter]) => [name, this.#makeFilter(filter.type)])
|
|
92
|
+
return Object.fromEntries(entries) as FilterActions
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
filter = this.#makeFilters()
|
|
96
|
+
|
|
60
97
|
sequence = (...items: Item.Any[]): Item.Sequence => {
|
|
61
98
|
const item = {
|
|
62
99
|
id: this.getId(),
|
package/s/timeline/types.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
|
|
1
2
|
export type Interpolation = "linear" | "catmullRom"
|
|
2
3
|
export type Keyframe<Value = number> = [time: number, value: Value]
|
|
3
4
|
export type Keyframes<Value = number> = Keyframe<Value>[]
|
|
@@ -27,3 +28,4 @@ export type TransformOptions = {
|
|
|
27
28
|
scale?: Vec2
|
|
28
29
|
rotation?: number
|
|
29
30
|
}
|
|
31
|
+
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as i,b as o,c as m,d as p,e}from"./chunk-ZLGNQFUI.js";import"./chunk-MR32SQ27.js";import"./chunk-73XOWA4F.js";import"./chunk-23FOBGX6.js";import{P as t,e as r}from"./chunk-XNIZ4L5W.js";r.add(i);r.mixin(t,o);r.add(m);r.mixin(t,p);r.add(e);
|
|
2
|
+
//# sourceMappingURL=browserAll-WNIOTNNP.js.map
|