asciify-engine 1.3.0 → 2.0.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.
@@ -0,0 +1,322 @@
1
+ import * as figlet_fonts_Wavy from 'figlet/fonts/Wavy';
2
+ import * as figlet_fonts_Univers from 'figlet/fonts/Univers';
3
+ import * as figlet_fonts_3_D from 'figlet/fonts/3-D';
4
+ import * as figlet_fonts_Thin from 'figlet/fonts/Thin';
5
+ import * as figlet_fonts_Straight from 'figlet/fonts/Straight';
6
+ import * as figlet_fonts_Stop from 'figlet/fonts/Stop';
7
+ import * as figlet_fonts_Star_Wars from 'figlet/fonts/Star Wars';
8
+ import * as figlet_fonts_Speed from 'figlet/fonts/Speed';
9
+ import * as figlet_fonts_Shadow from 'figlet/fonts/Shadow';
10
+ import * as figlet_fonts_Script from 'figlet/fonts/Script';
11
+ import * as figlet_fonts_Mini from 'figlet/fonts/Mini';
12
+ import * as figlet_fonts_Lean from 'figlet/fonts/Lean';
13
+ import * as figlet_fonts_Doom from 'figlet/fonts/Doom';
14
+ import * as figlet_fonts_Digital from 'figlet/fonts/Digital';
15
+ import * as figlet_fonts_Bubble from 'figlet/fonts/Bubble';
16
+ import * as figlet_fonts_Block from 'figlet/fonts/Block';
17
+ import * as figlet_fonts_Banner from 'figlet/fonts/Banner';
18
+ import * as figlet_fonts_Big from 'figlet/fonts/Big';
19
+ import * as figlet_fonts_Small from 'figlet/fonts/Small';
20
+ import * as figlet_fonts_Slant from 'figlet/fonts/Slant';
21
+ import * as figlet_fonts_Standard from 'figlet/fonts/Standard';
22
+
23
+ /** Serializable, media-independent editing state. No DOM work at import time. */
24
+ declare const STUDIO_STYLES: readonly ["ascii", "blocks", "braille", "dots", "lines", "cross", "diagonal", "diamond", "mixed", "pixel", "mosaic", "lego", "voxel", "disco", "dither"];
25
+ type StudioStyle = (typeof STUDIO_STYLES)[number];
26
+ declare const DITHER_ALGORITHMS: readonly ["none", "bayer2", "bayer4", "bayer8", "bayer16", "floyd-steinberg", "atkinson", "stucki", "sierra", "sierra-lite", "burkes", "jarvis", "halftone", "lines", "noise"];
27
+ type DitherAlgorithm = (typeof DITHER_ALGORITHMS)[number];
28
+ declare const BLEND_MODES: readonly ["source-over", "multiply", "screen", "overlay", "soft-light", "hard-light", "color-dodge", "color-burn", "hue", "saturation", "color", "luminosity"];
29
+ declare const STUDIO_PALETTES: Record<string, readonly string[]>;
30
+ interface StudioMask {
31
+ kind: "rectangle" | "ellipse" | "brush";
32
+ x: number;
33
+ y: number;
34
+ width: number;
35
+ height: number;
36
+ points?: [number, number][];
37
+ size?: number;
38
+ }
39
+ interface StudioLight {
40
+ x: number;
41
+ y: number;
42
+ radius: number;
43
+ intensity: number;
44
+ color: string;
45
+ }
46
+ interface StudioSettings {
47
+ version: 1;
48
+ aspectRatio: "original" | "16:9" | "9:16" | "1:1" | "4:3" | "3:4" | "21:9";
49
+ style: StudioStyle;
50
+ cellSize: number;
51
+ charset: string;
52
+ colorMode: "accent" | "source" | "gray";
53
+ ink: string;
54
+ crop: {
55
+ x: number;
56
+ y: number;
57
+ zoom: number;
58
+ rotation: number;
59
+ };
60
+ backdrop: {
61
+ mode: "solid" | "transparent" | "source" | "blurred" | "gradient";
62
+ color: string;
63
+ color2: string;
64
+ blur: number;
65
+ opacity: number;
66
+ };
67
+ color: {
68
+ brightness: number;
69
+ contrast: number;
70
+ saturation: number;
71
+ grayscale: number;
72
+ tint: string;
73
+ amount: number;
74
+ blend: (typeof BLEND_MODES)[number];
75
+ };
76
+ dither: {
77
+ algorithm: DitherAlgorithm;
78
+ palette: string;
79
+ colors: string[];
80
+ amount: number;
81
+ scale: number;
82
+ threshold: number;
83
+ motion: "none" | "drift" | "shimmer";
84
+ speed: number;
85
+ };
86
+ mask: {
87
+ enabled: boolean;
88
+ invert: boolean;
89
+ shapes: StudioMask[];
90
+ };
91
+ lights: StudioLight[];
92
+ effects: {
93
+ bloom: number;
94
+ characterBloom: number;
95
+ grain: number;
96
+ dust: number;
97
+ scanlines: number;
98
+ crt: number;
99
+ prism: number;
100
+ vignette: number;
101
+ glitch: number;
102
+ pixelate: number;
103
+ blur: number;
104
+ blurType: "gaussian" | "directional" | "radial" | "progressive";
105
+ angle: number;
106
+ focus: number;
107
+ halftone: number;
108
+ };
109
+ motion: {
110
+ type: "none" | "breathe" | "wave" | "reveal" | "glitch" | "rainbow" | "hologram" | "fire" | "chrome" | "ripple" | "vapor";
111
+ speed: number;
112
+ };
113
+ hover: {
114
+ effect: "none" | "trail" | "water" | "contour" | "dissolve" | "silk" | "vortex";
115
+ strength: number;
116
+ radius: number;
117
+ edgeSafe: boolean;
118
+ };
119
+ }
120
+ declare const DEFAULT_STUDIO_SETTINGS: StudioSettings;
121
+ /** Whitelist external settings; reject future versions instead of misinterpreting them. */
122
+ declare function normalizeStudioSettings(input?: unknown): StudioSettings;
123
+ declare function serializeStudioSettings(settings: StudioSettings): string;
124
+ declare function parseStudioSettings(json: string): StudioSettings;
125
+ declare function studioCrop(sw: number, sh: number, w: number, h: number, c: StudioSettings["crop"]): {
126
+ width: number;
127
+ height: number;
128
+ x: number;
129
+ y: number;
130
+ scale: number;
131
+ rotated: boolean;
132
+ };
133
+ /** Dimensions for the saved canvas ratio, including source rotation. */
134
+ declare function studioDimensions(width: number, height: number, settings: StudioSettings): [number, number];
135
+ /** Partial configuration for mounting and incremental updates. Arrays replace previous arrays. */
136
+ type StudioInput = {
137
+ [K in keyof StudioSettings]?: StudioSettings[K] extends readonly unknown[] ? StudioSettings[K] : StudioSettings[K] extends object ? Partial<StudioSettings[K]> : StudioSettings[K];
138
+ };
139
+ declare function updateStudioSettings(current: StudioSettings, patch: StudioInput): StudioSettings;
140
+
141
+ declare const STUDIO_LOOKS: {
142
+ id: string;
143
+ name: string;
144
+ description: string;
145
+ settings: StudioSettings;
146
+ }[];
147
+ /** Return independent state; applying or editing a look never mutates its preset. */
148
+ declare function studioLook(id: string): StudioSettings;
149
+ declare function restyleStudio(current: StudioSettings, random?: () => number): StudioSettings;
150
+
151
+ type StudioSource = HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap;
152
+ declare function studioSourceSize(s: StudioSource): [number, number];
153
+ /** Reusable bounded renderer. Call configure only when settings change; render owns no RAF. */
154
+ declare function createStudioRenderer(canvas: HTMLCanvasElement, settings?: unknown, limits?: {
155
+ maxDimension?: number;
156
+ maxCells?: number;
157
+ pixelRatio?: number;
158
+ }): {
159
+ canvas: HTMLCanvasElement;
160
+ render: (source: StudioSource, time?: number, requestedWidth?: number, requestedHeight?: number) => void;
161
+ setBudget(cells: number): void;
162
+ readonly maxCells: number;
163
+ configure(input: unknown): void;
164
+ pointer: (x: number, y: number, time: number) => void;
165
+ leave(): void;
166
+ readonly active: boolean;
167
+ readonly settings: StudioSettings;
168
+ readonly capabilities: {
169
+ gpuFinish: boolean;
170
+ };
171
+ invalidate(): void;
172
+ destroy(): void;
173
+ };
174
+
175
+ interface StudioMedia {
176
+ source: StudioSource;
177
+ width: number;
178
+ height: number;
179
+ duration: number;
180
+ animated: boolean;
181
+ seek(time: number, signal?: AbortSignal): Promise<void>;
182
+ frame(time: number): StudioSource;
183
+ destroy(): void;
184
+ }
185
+ /** Local File or permitted CORS URL. Caller owns destroy; URLs created here are revoked. */
186
+ declare function loadStudioMedia(input: File | string, signal?: AbortSignal): Promise<StudioMedia>;
187
+
188
+ type StudioExportFormat = "png" | "jpeg" | "mp4" | "webm" | "gif";
189
+ interface StudioExportOptions {
190
+ format: StudioExportFormat;
191
+ width: number;
192
+ height: number;
193
+ duration?: number;
194
+ fps?: number;
195
+ quality?: number;
196
+ signal?: AbortSignal;
197
+ onProgress?: (progress: number) => void;
198
+ maxCells?: number;
199
+ /** Preview canvas width, for identical cell density when upscaling. */
200
+ referenceWidth?: number;
201
+ }
202
+ interface StudioExportSource {
203
+ frame(time: number, signal?: AbortSignal): StudioSource | Promise<StudioSource>;
204
+ }
205
+ /** A separate renderer preserves preview state. The source callback must also be independent for video exports. */
206
+ declare function exportStudio(source: StudioExportSource, settings: StudioSettings, options: StudioExportOptions): Promise<Blob>;
207
+
208
+ interface MountStudioOptions {
209
+ settings?: StudioInput;
210
+ width?: number;
211
+ height?: number;
212
+ fps?: number;
213
+ maxDimension?: number;
214
+ maxCells?: number;
215
+ adaptive?: boolean;
216
+ onQualityChange?: (maxCells: number) => void;
217
+ signal?: AbortSignal;
218
+ onError?: (error: Error) => void;
219
+ onFrame?: (time: number, costMs: number) => void;
220
+ }
221
+ /** Mount one source, update serializable settings, and destroy on unmount. */
222
+ declare function mountStudio(canvas: HTMLCanvasElement, source: File | string, options?: MountStudioOptions): Promise<{
223
+ canvas: HTMLCanvasElement;
224
+ media: StudioMedia;
225
+ update(next: StudioInput): void;
226
+ resize(w: number, h: number): void;
227
+ pause(value?: boolean): void;
228
+ seek(seconds: number): Promise<void>;
229
+ redraw(): void;
230
+ readonly time: number;
231
+ readonly paused: boolean;
232
+ readonly maxCells: number;
233
+ readonly capabilities: {
234
+ gpuFinish: boolean;
235
+ };
236
+ destroy: () => void;
237
+ }>;
238
+ /** Takes ownership of media. Use a second media instance for export. */
239
+ declare function mountStudioMedia(canvas: HTMLCanvasElement, media: StudioMedia, options?: MountStudioOptions): {
240
+ canvas: HTMLCanvasElement;
241
+ media: StudioMedia;
242
+ update(next: StudioInput): void;
243
+ resize(w: number, h: number): void;
244
+ pause(value?: boolean): void;
245
+ seek(seconds: number): Promise<void>;
246
+ redraw(): void;
247
+ readonly time: number;
248
+ readonly paused: boolean;
249
+ readonly maxCells: number;
250
+ readonly capabilities: {
251
+ gpuFinish: boolean;
252
+ };
253
+ destroy: () => void;
254
+ };
255
+
256
+ /** Fonts are loaded individually only when selected; none enter the core renderer. */
257
+ declare const loaders: {
258
+ Standard: () => Promise<typeof figlet_fonts_Standard>;
259
+ Slant: () => Promise<typeof figlet_fonts_Slant>;
260
+ Small: () => Promise<typeof figlet_fonts_Small>;
261
+ Big: () => Promise<typeof figlet_fonts_Big>;
262
+ Banner: () => Promise<typeof figlet_fonts_Banner>;
263
+ Block: () => Promise<typeof figlet_fonts_Block>;
264
+ Bubble: () => Promise<typeof figlet_fonts_Bubble>;
265
+ Digital: () => Promise<typeof figlet_fonts_Digital>;
266
+ Doom: () => Promise<typeof figlet_fonts_Doom>;
267
+ Lean: () => Promise<typeof figlet_fonts_Lean>;
268
+ Mini: () => Promise<typeof figlet_fonts_Mini>;
269
+ Script: () => Promise<typeof figlet_fonts_Script>;
270
+ Shadow: () => Promise<typeof figlet_fonts_Shadow>;
271
+ Speed: () => Promise<typeof figlet_fonts_Speed>;
272
+ Starwars: () => Promise<typeof figlet_fonts_Star_Wars>;
273
+ Stop: () => Promise<typeof figlet_fonts_Stop>;
274
+ Straight: () => Promise<typeof figlet_fonts_Straight>;
275
+ Thin: () => Promise<typeof figlet_fonts_Thin>;
276
+ ThreeD: () => Promise<typeof figlet_fonts_3_D>;
277
+ Univers: () => Promise<typeof figlet_fonts_Univers>;
278
+ Wavy: () => Promise<typeof figlet_fonts_Wavy>;
279
+ };
280
+ declare const STUDIO_TEXT_FONTS: (keyof typeof loaders)[];
281
+ declare function createStudioText(text: string, font?: keyof typeof loaders, ink?: string): Promise<{
282
+ canvas: HTMLCanvasElement;
283
+ ascii: string;
284
+ }>;
285
+
286
+ /** Curated ASCII ramps. Use custom text to supply a different alphabet. */
287
+ declare const STUDIO_CHARACTER_SETS: {
288
+ readonly standard: {
289
+ readonly label: "Classic ASCII";
290
+ readonly chars: " .:-=+*#%@";
291
+ };
292
+ readonly asciify: {
293
+ readonly label: "Asciify";
294
+ readonly chars: " .:-=+ASCIIFY#@";
295
+ };
296
+ readonly minimal: {
297
+ readonly label: "Minimal";
298
+ readonly chars: " .:+";
299
+ };
300
+ readonly detailed: {
301
+ readonly label: "Detailed";
302
+ readonly chars: " .,:;i1tfLCG08@";
303
+ };
304
+ readonly letters: {
305
+ readonly label: "Letters";
306
+ readonly chars: " .ilLCFTYASMW";
307
+ };
308
+ readonly technical: {
309
+ readonly label: "Technical";
310
+ readonly chars: " .:;>_/[{}]=+*#@$";
311
+ };
312
+ readonly blocks: {
313
+ readonly label: "Tonal blocks";
314
+ readonly chars: " ░▒▓█";
315
+ };
316
+ readonly braille: {
317
+ readonly label: "Braille";
318
+ readonly chars: " ⠁⠃⠇⡇⣇⣧⣷⣿";
319
+ };
320
+ };
321
+
322
+ export { BLEND_MODES, DEFAULT_STUDIO_SETTINGS, DITHER_ALGORITHMS, type DitherAlgorithm, type MountStudioOptions, STUDIO_CHARACTER_SETS, STUDIO_LOOKS, STUDIO_PALETTES, STUDIO_STYLES, STUDIO_TEXT_FONTS, type StudioExportFormat, type StudioExportOptions, type StudioExportSource, type StudioInput, type StudioLight, type StudioMask, type StudioMedia, type StudioSettings, type StudioSource, type StudioStyle, createStudioRenderer, createStudioText, exportStudio, loadStudioMedia, mountStudio, mountStudioMedia, normalizeStudioSettings, parseStudioSettings, restyleStudio, serializeStudioSettings, studioCrop, studioDimensions, studioLook, studioSourceSize, updateStudioSettings };
@@ -0,0 +1,322 @@
1
+ import * as figlet_fonts_Wavy from 'figlet/fonts/Wavy';
2
+ import * as figlet_fonts_Univers from 'figlet/fonts/Univers';
3
+ import * as figlet_fonts_3_D from 'figlet/fonts/3-D';
4
+ import * as figlet_fonts_Thin from 'figlet/fonts/Thin';
5
+ import * as figlet_fonts_Straight from 'figlet/fonts/Straight';
6
+ import * as figlet_fonts_Stop from 'figlet/fonts/Stop';
7
+ import * as figlet_fonts_Star_Wars from 'figlet/fonts/Star Wars';
8
+ import * as figlet_fonts_Speed from 'figlet/fonts/Speed';
9
+ import * as figlet_fonts_Shadow from 'figlet/fonts/Shadow';
10
+ import * as figlet_fonts_Script from 'figlet/fonts/Script';
11
+ import * as figlet_fonts_Mini from 'figlet/fonts/Mini';
12
+ import * as figlet_fonts_Lean from 'figlet/fonts/Lean';
13
+ import * as figlet_fonts_Doom from 'figlet/fonts/Doom';
14
+ import * as figlet_fonts_Digital from 'figlet/fonts/Digital';
15
+ import * as figlet_fonts_Bubble from 'figlet/fonts/Bubble';
16
+ import * as figlet_fonts_Block from 'figlet/fonts/Block';
17
+ import * as figlet_fonts_Banner from 'figlet/fonts/Banner';
18
+ import * as figlet_fonts_Big from 'figlet/fonts/Big';
19
+ import * as figlet_fonts_Small from 'figlet/fonts/Small';
20
+ import * as figlet_fonts_Slant from 'figlet/fonts/Slant';
21
+ import * as figlet_fonts_Standard from 'figlet/fonts/Standard';
22
+
23
+ /** Serializable, media-independent editing state. No DOM work at import time. */
24
+ declare const STUDIO_STYLES: readonly ["ascii", "blocks", "braille", "dots", "lines", "cross", "diagonal", "diamond", "mixed", "pixel", "mosaic", "lego", "voxel", "disco", "dither"];
25
+ type StudioStyle = (typeof STUDIO_STYLES)[number];
26
+ declare const DITHER_ALGORITHMS: readonly ["none", "bayer2", "bayer4", "bayer8", "bayer16", "floyd-steinberg", "atkinson", "stucki", "sierra", "sierra-lite", "burkes", "jarvis", "halftone", "lines", "noise"];
27
+ type DitherAlgorithm = (typeof DITHER_ALGORITHMS)[number];
28
+ declare const BLEND_MODES: readonly ["source-over", "multiply", "screen", "overlay", "soft-light", "hard-light", "color-dodge", "color-burn", "hue", "saturation", "color", "luminosity"];
29
+ declare const STUDIO_PALETTES: Record<string, readonly string[]>;
30
+ interface StudioMask {
31
+ kind: "rectangle" | "ellipse" | "brush";
32
+ x: number;
33
+ y: number;
34
+ width: number;
35
+ height: number;
36
+ points?: [number, number][];
37
+ size?: number;
38
+ }
39
+ interface StudioLight {
40
+ x: number;
41
+ y: number;
42
+ radius: number;
43
+ intensity: number;
44
+ color: string;
45
+ }
46
+ interface StudioSettings {
47
+ version: 1;
48
+ aspectRatio: "original" | "16:9" | "9:16" | "1:1" | "4:3" | "3:4" | "21:9";
49
+ style: StudioStyle;
50
+ cellSize: number;
51
+ charset: string;
52
+ colorMode: "accent" | "source" | "gray";
53
+ ink: string;
54
+ crop: {
55
+ x: number;
56
+ y: number;
57
+ zoom: number;
58
+ rotation: number;
59
+ };
60
+ backdrop: {
61
+ mode: "solid" | "transparent" | "source" | "blurred" | "gradient";
62
+ color: string;
63
+ color2: string;
64
+ blur: number;
65
+ opacity: number;
66
+ };
67
+ color: {
68
+ brightness: number;
69
+ contrast: number;
70
+ saturation: number;
71
+ grayscale: number;
72
+ tint: string;
73
+ amount: number;
74
+ blend: (typeof BLEND_MODES)[number];
75
+ };
76
+ dither: {
77
+ algorithm: DitherAlgorithm;
78
+ palette: string;
79
+ colors: string[];
80
+ amount: number;
81
+ scale: number;
82
+ threshold: number;
83
+ motion: "none" | "drift" | "shimmer";
84
+ speed: number;
85
+ };
86
+ mask: {
87
+ enabled: boolean;
88
+ invert: boolean;
89
+ shapes: StudioMask[];
90
+ };
91
+ lights: StudioLight[];
92
+ effects: {
93
+ bloom: number;
94
+ characterBloom: number;
95
+ grain: number;
96
+ dust: number;
97
+ scanlines: number;
98
+ crt: number;
99
+ prism: number;
100
+ vignette: number;
101
+ glitch: number;
102
+ pixelate: number;
103
+ blur: number;
104
+ blurType: "gaussian" | "directional" | "radial" | "progressive";
105
+ angle: number;
106
+ focus: number;
107
+ halftone: number;
108
+ };
109
+ motion: {
110
+ type: "none" | "breathe" | "wave" | "reveal" | "glitch" | "rainbow" | "hologram" | "fire" | "chrome" | "ripple" | "vapor";
111
+ speed: number;
112
+ };
113
+ hover: {
114
+ effect: "none" | "trail" | "water" | "contour" | "dissolve" | "silk" | "vortex";
115
+ strength: number;
116
+ radius: number;
117
+ edgeSafe: boolean;
118
+ };
119
+ }
120
+ declare const DEFAULT_STUDIO_SETTINGS: StudioSettings;
121
+ /** Whitelist external settings; reject future versions instead of misinterpreting them. */
122
+ declare function normalizeStudioSettings(input?: unknown): StudioSettings;
123
+ declare function serializeStudioSettings(settings: StudioSettings): string;
124
+ declare function parseStudioSettings(json: string): StudioSettings;
125
+ declare function studioCrop(sw: number, sh: number, w: number, h: number, c: StudioSettings["crop"]): {
126
+ width: number;
127
+ height: number;
128
+ x: number;
129
+ y: number;
130
+ scale: number;
131
+ rotated: boolean;
132
+ };
133
+ /** Dimensions for the saved canvas ratio, including source rotation. */
134
+ declare function studioDimensions(width: number, height: number, settings: StudioSettings): [number, number];
135
+ /** Partial configuration for mounting and incremental updates. Arrays replace previous arrays. */
136
+ type StudioInput = {
137
+ [K in keyof StudioSettings]?: StudioSettings[K] extends readonly unknown[] ? StudioSettings[K] : StudioSettings[K] extends object ? Partial<StudioSettings[K]> : StudioSettings[K];
138
+ };
139
+ declare function updateStudioSettings(current: StudioSettings, patch: StudioInput): StudioSettings;
140
+
141
+ declare const STUDIO_LOOKS: {
142
+ id: string;
143
+ name: string;
144
+ description: string;
145
+ settings: StudioSettings;
146
+ }[];
147
+ /** Return independent state; applying or editing a look never mutates its preset. */
148
+ declare function studioLook(id: string): StudioSettings;
149
+ declare function restyleStudio(current: StudioSettings, random?: () => number): StudioSettings;
150
+
151
+ type StudioSource = HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap;
152
+ declare function studioSourceSize(s: StudioSource): [number, number];
153
+ /** Reusable bounded renderer. Call configure only when settings change; render owns no RAF. */
154
+ declare function createStudioRenderer(canvas: HTMLCanvasElement, settings?: unknown, limits?: {
155
+ maxDimension?: number;
156
+ maxCells?: number;
157
+ pixelRatio?: number;
158
+ }): {
159
+ canvas: HTMLCanvasElement;
160
+ render: (source: StudioSource, time?: number, requestedWidth?: number, requestedHeight?: number) => void;
161
+ setBudget(cells: number): void;
162
+ readonly maxCells: number;
163
+ configure(input: unknown): void;
164
+ pointer: (x: number, y: number, time: number) => void;
165
+ leave(): void;
166
+ readonly active: boolean;
167
+ readonly settings: StudioSettings;
168
+ readonly capabilities: {
169
+ gpuFinish: boolean;
170
+ };
171
+ invalidate(): void;
172
+ destroy(): void;
173
+ };
174
+
175
+ interface StudioMedia {
176
+ source: StudioSource;
177
+ width: number;
178
+ height: number;
179
+ duration: number;
180
+ animated: boolean;
181
+ seek(time: number, signal?: AbortSignal): Promise<void>;
182
+ frame(time: number): StudioSource;
183
+ destroy(): void;
184
+ }
185
+ /** Local File or permitted CORS URL. Caller owns destroy; URLs created here are revoked. */
186
+ declare function loadStudioMedia(input: File | string, signal?: AbortSignal): Promise<StudioMedia>;
187
+
188
+ type StudioExportFormat = "png" | "jpeg" | "mp4" | "webm" | "gif";
189
+ interface StudioExportOptions {
190
+ format: StudioExportFormat;
191
+ width: number;
192
+ height: number;
193
+ duration?: number;
194
+ fps?: number;
195
+ quality?: number;
196
+ signal?: AbortSignal;
197
+ onProgress?: (progress: number) => void;
198
+ maxCells?: number;
199
+ /** Preview canvas width, for identical cell density when upscaling. */
200
+ referenceWidth?: number;
201
+ }
202
+ interface StudioExportSource {
203
+ frame(time: number, signal?: AbortSignal): StudioSource | Promise<StudioSource>;
204
+ }
205
+ /** A separate renderer preserves preview state. The source callback must also be independent for video exports. */
206
+ declare function exportStudio(source: StudioExportSource, settings: StudioSettings, options: StudioExportOptions): Promise<Blob>;
207
+
208
+ interface MountStudioOptions {
209
+ settings?: StudioInput;
210
+ width?: number;
211
+ height?: number;
212
+ fps?: number;
213
+ maxDimension?: number;
214
+ maxCells?: number;
215
+ adaptive?: boolean;
216
+ onQualityChange?: (maxCells: number) => void;
217
+ signal?: AbortSignal;
218
+ onError?: (error: Error) => void;
219
+ onFrame?: (time: number, costMs: number) => void;
220
+ }
221
+ /** Mount one source, update serializable settings, and destroy on unmount. */
222
+ declare function mountStudio(canvas: HTMLCanvasElement, source: File | string, options?: MountStudioOptions): Promise<{
223
+ canvas: HTMLCanvasElement;
224
+ media: StudioMedia;
225
+ update(next: StudioInput): void;
226
+ resize(w: number, h: number): void;
227
+ pause(value?: boolean): void;
228
+ seek(seconds: number): Promise<void>;
229
+ redraw(): void;
230
+ readonly time: number;
231
+ readonly paused: boolean;
232
+ readonly maxCells: number;
233
+ readonly capabilities: {
234
+ gpuFinish: boolean;
235
+ };
236
+ destroy: () => void;
237
+ }>;
238
+ /** Takes ownership of media. Use a second media instance for export. */
239
+ declare function mountStudioMedia(canvas: HTMLCanvasElement, media: StudioMedia, options?: MountStudioOptions): {
240
+ canvas: HTMLCanvasElement;
241
+ media: StudioMedia;
242
+ update(next: StudioInput): void;
243
+ resize(w: number, h: number): void;
244
+ pause(value?: boolean): void;
245
+ seek(seconds: number): Promise<void>;
246
+ redraw(): void;
247
+ readonly time: number;
248
+ readonly paused: boolean;
249
+ readonly maxCells: number;
250
+ readonly capabilities: {
251
+ gpuFinish: boolean;
252
+ };
253
+ destroy: () => void;
254
+ };
255
+
256
+ /** Fonts are loaded individually only when selected; none enter the core renderer. */
257
+ declare const loaders: {
258
+ Standard: () => Promise<typeof figlet_fonts_Standard>;
259
+ Slant: () => Promise<typeof figlet_fonts_Slant>;
260
+ Small: () => Promise<typeof figlet_fonts_Small>;
261
+ Big: () => Promise<typeof figlet_fonts_Big>;
262
+ Banner: () => Promise<typeof figlet_fonts_Banner>;
263
+ Block: () => Promise<typeof figlet_fonts_Block>;
264
+ Bubble: () => Promise<typeof figlet_fonts_Bubble>;
265
+ Digital: () => Promise<typeof figlet_fonts_Digital>;
266
+ Doom: () => Promise<typeof figlet_fonts_Doom>;
267
+ Lean: () => Promise<typeof figlet_fonts_Lean>;
268
+ Mini: () => Promise<typeof figlet_fonts_Mini>;
269
+ Script: () => Promise<typeof figlet_fonts_Script>;
270
+ Shadow: () => Promise<typeof figlet_fonts_Shadow>;
271
+ Speed: () => Promise<typeof figlet_fonts_Speed>;
272
+ Starwars: () => Promise<typeof figlet_fonts_Star_Wars>;
273
+ Stop: () => Promise<typeof figlet_fonts_Stop>;
274
+ Straight: () => Promise<typeof figlet_fonts_Straight>;
275
+ Thin: () => Promise<typeof figlet_fonts_Thin>;
276
+ ThreeD: () => Promise<typeof figlet_fonts_3_D>;
277
+ Univers: () => Promise<typeof figlet_fonts_Univers>;
278
+ Wavy: () => Promise<typeof figlet_fonts_Wavy>;
279
+ };
280
+ declare const STUDIO_TEXT_FONTS: (keyof typeof loaders)[];
281
+ declare function createStudioText(text: string, font?: keyof typeof loaders, ink?: string): Promise<{
282
+ canvas: HTMLCanvasElement;
283
+ ascii: string;
284
+ }>;
285
+
286
+ /** Curated ASCII ramps. Use custom text to supply a different alphabet. */
287
+ declare const STUDIO_CHARACTER_SETS: {
288
+ readonly standard: {
289
+ readonly label: "Classic ASCII";
290
+ readonly chars: " .:-=+*#%@";
291
+ };
292
+ readonly asciify: {
293
+ readonly label: "Asciify";
294
+ readonly chars: " .:-=+ASCIIFY#@";
295
+ };
296
+ readonly minimal: {
297
+ readonly label: "Minimal";
298
+ readonly chars: " .:+";
299
+ };
300
+ readonly detailed: {
301
+ readonly label: "Detailed";
302
+ readonly chars: " .,:;i1tfLCG08@";
303
+ };
304
+ readonly letters: {
305
+ readonly label: "Letters";
306
+ readonly chars: " .ilLCFTYASMW";
307
+ };
308
+ readonly technical: {
309
+ readonly label: "Technical";
310
+ readonly chars: " .:;>_/[{}]=+*#@$";
311
+ };
312
+ readonly blocks: {
313
+ readonly label: "Tonal blocks";
314
+ readonly chars: " ░▒▓█";
315
+ };
316
+ readonly braille: {
317
+ readonly label: "Braille";
318
+ readonly chars: " ⠁⠃⠇⡇⣇⣧⣷⣿";
319
+ };
320
+ };
321
+
322
+ export { BLEND_MODES, DEFAULT_STUDIO_SETTINGS, DITHER_ALGORITHMS, type DitherAlgorithm, type MountStudioOptions, STUDIO_CHARACTER_SETS, STUDIO_LOOKS, STUDIO_PALETTES, STUDIO_STYLES, STUDIO_TEXT_FONTS, type StudioExportFormat, type StudioExportOptions, type StudioExportSource, type StudioInput, type StudioLight, type StudioMask, type StudioMedia, type StudioSettings, type StudioSource, type StudioStyle, createStudioRenderer, createStudioText, exportStudio, loadStudioMedia, mountStudio, mountStudioMedia, normalizeStudioSettings, parseStudioSettings, restyleStudio, serializeStudioSettings, studioCrop, studioDimensions, studioLook, studioSourceSize, updateStudioSettings };