textmode.export.js 1.6.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/README.md +88 -159
  2. package/dist/textmode.export.esm.js +1 -6090
  3. package/dist/textmode.export.umd.js +1 -68
  4. package/dist/types/augmentations/index.d.ts +0 -1
  5. package/dist/types/augmentations/textmode.d.ts +0 -1
  6. package/dist/types/exporters/base/CharacterResolver.d.ts +0 -1
  7. package/dist/types/exporters/base/DataExtractor.d.ts +0 -1
  8. package/dist/types/exporters/base/FileHandler.d.ts +0 -1
  9. package/dist/types/exporters/base/FramePreparation.d.ts +10 -0
  10. package/dist/types/exporters/base/LayerTarget.d.ts +4 -3
  11. package/dist/types/exporters/base/index.d.ts +1 -1
  12. package/dist/types/exporters/gif/GIFEncoderWorker.d.ts +1 -0
  13. package/dist/types/exporters/gif/GIFExporter.d.ts +7 -26
  14. package/dist/types/exporters/gif/GIFRecorder.d.ts +2 -3
  15. package/dist/types/exporters/gif/GIFWorkerClient.d.ts +15 -0
  16. package/dist/types/exporters/gif/index.d.ts +0 -1
  17. package/dist/types/exporters/gif/types.d.ts +19 -1
  18. package/dist/types/exporters/image/ImageExporter.d.ts +2 -1
  19. package/dist/types/exporters/image/index.d.ts +0 -1
  20. package/dist/types/exporters/image/types.d.ts +2 -1
  21. package/dist/types/exporters/json/JSONDataExtractor.d.ts +0 -1
  22. package/dist/types/exporters/json/JSONExporter.d.ts +0 -1
  23. package/dist/types/exporters/json/index.d.ts +0 -1
  24. package/dist/types/exporters/json/types.d.ts +8 -1
  25. package/dist/types/exporters/svg/SVGContentGenerator.d.ts +0 -1
  26. package/dist/types/exporters/svg/SVGDataExtractor.d.ts +0 -1
  27. package/dist/types/exporters/svg/SVGExporter.d.ts +0 -1
  28. package/dist/types/exporters/svg/SVGPathGenerator.d.ts +0 -1
  29. package/dist/types/exporters/svg/index.d.ts +0 -1
  30. package/dist/types/exporters/svg/types.d.ts +2 -1
  31. package/dist/types/exporters/txt/TXTExporter.d.ts +0 -1
  32. package/dist/types/exporters/txt/index.d.ts +0 -1
  33. package/dist/types/exporters/txt/types.d.ts +2 -1
  34. package/dist/types/exporters/video/VideoExporter.d.ts +4 -4
  35. package/dist/types/exporters/video/VideoFrameDriver.d.ts +3 -3
  36. package/dist/types/exporters/video/VideoRecorder.d.ts +0 -1
  37. package/dist/types/exporters/video/errors.d.ts +0 -1
  38. package/dist/types/exporters/video/index.d.ts +0 -1
  39. package/dist/types/exporters/video/types.d.ts +34 -6
  40. package/dist/types/exporters/video/withAbortableTimeout.d.ts +0 -1
  41. package/dist/types/index.d.ts +15 -31
  42. package/dist/types/overlay/blades/Blade.d.ts +0 -1
  43. package/dist/types/overlay/blades/GIFBlade.d.ts +0 -1
  44. package/dist/types/overlay/blades/ImageBlade.d.ts +0 -1
  45. package/dist/types/overlay/blades/JSONBlade.d.ts +0 -1
  46. package/dist/types/overlay/blades/RecordingBlade.d.ts +0 -1
  47. package/dist/types/overlay/blades/SVGBlade.d.ts +0 -1
  48. package/dist/types/overlay/blades/TextBlade.d.ts +0 -1
  49. package/dist/types/overlay/blades/VideoBlade.d.ts +0 -1
  50. package/dist/types/overlay/blades/index.d.ts +0 -1
  51. package/dist/types/overlay/components/actions/Button.d.ts +0 -1
  52. package/dist/types/overlay/components/base/Component.d.ts +0 -1
  53. package/dist/types/overlay/components/base/Container.d.ts +0 -1
  54. package/dist/types/overlay/components/base/Field.d.ts +0 -1
  55. package/dist/types/overlay/components/display/Header.d.ts +0 -1
  56. package/dist/types/overlay/components/display/StatusDisplay.d.ts +0 -1
  57. package/dist/types/overlay/components/inputs/CheckboxInput.d.ts +0 -1
  58. package/dist/types/overlay/components/inputs/LayerTargetSelect.d.ts +0 -1
  59. package/dist/types/overlay/components/inputs/NumberInput.d.ts +0 -1
  60. package/dist/types/overlay/components/inputs/SelectInput.d.ts +0 -1
  61. package/dist/types/overlay/components/inputs/TextInput.d.ts +0 -1
  62. package/dist/types/overlay/config/DefaultsStore.d.ts +0 -1
  63. package/dist/types/overlay/config/ExportDefaults.d.ts +0 -1
  64. package/dist/types/overlay/core/EventBus.d.ts +0 -1
  65. package/dist/types/overlay/core/OverlayController.d.ts +0 -1
  66. package/dist/types/overlay/core/StateManager.d.ts +0 -1
  67. package/dist/types/overlay/formatRegistry.d.ts +0 -1
  68. package/dist/types/overlay/index.d.ts +0 -1
  69. package/dist/types/overlay/models/FormatDefinition.d.ts +0 -1
  70. package/dist/types/overlay/models/OverlayEvents.d.ts +0 -1
  71. package/dist/types/overlay/models/OverlayState.d.ts +0 -1
  72. package/dist/types/overlay/services/ClipboardService.d.ts +0 -1
  73. package/dist/types/overlay/services/ExportService.d.ts +0 -1
  74. package/dist/types/overlay/services/OverlayPositionStorage.d.ts +0 -1
  75. package/dist/types/overlay/services/PositionService.d.ts +0 -1
  76. package/dist/types/overlay/types.d.ts +0 -1
  77. package/dist/types/overlay/utils/classes.d.ts +0 -1
  78. package/dist/types/types.d.ts +109 -23
  79. package/dist/types/utils/pixels.d.ts +0 -1
  80. package/package.json +47 -61
  81. package/dist/types/augmentations/index.d.ts.map +0 -1
  82. package/dist/types/augmentations/textmode.d.ts.map +0 -1
  83. package/dist/types/augmentations/textmode.test.d.ts +0 -2
  84. package/dist/types/augmentations/textmode.test.d.ts.map +0 -1
  85. package/dist/types/exporters/base/CharacterResolver.d.ts.map +0 -1
  86. package/dist/types/exporters/base/DataExtractor.d.ts.map +0 -1
  87. package/dist/types/exporters/base/FileHandler.d.ts.map +0 -1
  88. package/dist/types/exporters/base/LayerTarget.d.ts.map +0 -1
  89. package/dist/types/exporters/base/index.d.ts.map +0 -1
  90. package/dist/types/exporters/gif/GIFExporter.d.ts.map +0 -1
  91. package/dist/types/exporters/gif/GIFRecorder.d.ts.map +0 -1
  92. package/dist/types/exporters/gif/index.d.ts.map +0 -1
  93. package/dist/types/exporters/gif/types.d.ts.map +0 -1
  94. package/dist/types/exporters/image/ImageExporter.d.ts.map +0 -1
  95. package/dist/types/exporters/image/index.d.ts.map +0 -1
  96. package/dist/types/exporters/image/types.d.ts.map +0 -1
  97. package/dist/types/exporters/json/JSONDataExtractor.d.ts.map +0 -1
  98. package/dist/types/exporters/json/JSONExporter.d.ts.map +0 -1
  99. package/dist/types/exporters/json/JSONExporter.test.d.ts +0 -2
  100. package/dist/types/exporters/json/JSONExporter.test.d.ts.map +0 -1
  101. package/dist/types/exporters/json/index.d.ts.map +0 -1
  102. package/dist/types/exporters/json/types.d.ts.map +0 -1
  103. package/dist/types/exporters/svg/SVGContentGenerator.d.ts.map +0 -1
  104. package/dist/types/exporters/svg/SVGDataExtractor.d.ts.map +0 -1
  105. package/dist/types/exporters/svg/SVGExporter.d.ts.map +0 -1
  106. package/dist/types/exporters/svg/SVGExporter.test.d.ts +0 -2
  107. package/dist/types/exporters/svg/SVGExporter.test.d.ts.map +0 -1
  108. package/dist/types/exporters/svg/SVGPathGenerator.d.ts.map +0 -1
  109. package/dist/types/exporters/svg/index.d.ts.map +0 -1
  110. package/dist/types/exporters/svg/types.d.ts.map +0 -1
  111. package/dist/types/exporters/txt/TXTExporter.d.ts.map +0 -1
  112. package/dist/types/exporters/txt/TXTExporter.test.d.ts +0 -2
  113. package/dist/types/exporters/txt/TXTExporter.test.d.ts.map +0 -1
  114. package/dist/types/exporters/txt/index.d.ts.map +0 -1
  115. package/dist/types/exporters/txt/types.d.ts.map +0 -1
  116. package/dist/types/exporters/video/VideoExporter.d.ts.map +0 -1
  117. package/dist/types/exporters/video/VideoExporter.test.d.ts +0 -2
  118. package/dist/types/exporters/video/VideoExporter.test.d.ts.map +0 -1
  119. package/dist/types/exporters/video/VideoFrameDriver.d.ts.map +0 -1
  120. package/dist/types/exporters/video/VideoFrameDriver.test.d.ts +0 -2
  121. package/dist/types/exporters/video/VideoFrameDriver.test.d.ts.map +0 -1
  122. package/dist/types/exporters/video/VideoRecorder.d.ts.map +0 -1
  123. package/dist/types/exporters/video/VideoRecorder.test.d.ts +0 -2
  124. package/dist/types/exporters/video/VideoRecorder.test.d.ts.map +0 -1
  125. package/dist/types/exporters/video/errors.d.ts.map +0 -1
  126. package/dist/types/exporters/video/index.d.ts.map +0 -1
  127. package/dist/types/exporters/video/types.d.ts.map +0 -1
  128. package/dist/types/exporters/video/withAbortableTimeout.d.ts.map +0 -1
  129. package/dist/types/index.d.ts.map +0 -1
  130. package/dist/types/overlay/blades/Blade.d.ts.map +0 -1
  131. package/dist/types/overlay/blades/GIFBlade.d.ts.map +0 -1
  132. package/dist/types/overlay/blades/ImageBlade.d.ts.map +0 -1
  133. package/dist/types/overlay/blades/JSONBlade.d.ts.map +0 -1
  134. package/dist/types/overlay/blades/RecordingBlade.d.ts.map +0 -1
  135. package/dist/types/overlay/blades/SVGBlade.d.ts.map +0 -1
  136. package/dist/types/overlay/blades/TextBlade.d.ts.map +0 -1
  137. package/dist/types/overlay/blades/VideoBlade.d.ts.map +0 -1
  138. package/dist/types/overlay/blades/index.d.ts.map +0 -1
  139. package/dist/types/overlay/components/actions/Button.d.ts.map +0 -1
  140. package/dist/types/overlay/components/base/Component.d.ts.map +0 -1
  141. package/dist/types/overlay/components/base/Container.d.ts.map +0 -1
  142. package/dist/types/overlay/components/base/Field.d.ts.map +0 -1
  143. package/dist/types/overlay/components/display/Header.d.ts.map +0 -1
  144. package/dist/types/overlay/components/display/StatusDisplay.d.ts.map +0 -1
  145. package/dist/types/overlay/components/inputs/CheckboxInput.d.ts.map +0 -1
  146. package/dist/types/overlay/components/inputs/LayerTargetSelect.d.ts.map +0 -1
  147. package/dist/types/overlay/components/inputs/NumberInput.d.ts.map +0 -1
  148. package/dist/types/overlay/components/inputs/RangeInput.d.ts +0 -35
  149. package/dist/types/overlay/components/inputs/RangeInput.d.ts.map +0 -1
  150. package/dist/types/overlay/components/inputs/SelectInput.d.ts.map +0 -1
  151. package/dist/types/overlay/components/inputs/TextInput.d.ts.map +0 -1
  152. package/dist/types/overlay/config/DefaultsStore.d.ts.map +0 -1
  153. package/dist/types/overlay/config/DefaultsStore.test.d.ts +0 -2
  154. package/dist/types/overlay/config/DefaultsStore.test.d.ts.map +0 -1
  155. package/dist/types/overlay/config/ExportDefaults.d.ts.map +0 -1
  156. package/dist/types/overlay/config/ExportDefaults.test.d.ts +0 -2
  157. package/dist/types/overlay/config/ExportDefaults.test.d.ts.map +0 -1
  158. package/dist/types/overlay/core/EventBus.d.ts.map +0 -1
  159. package/dist/types/overlay/core/OverlayController.d.ts.map +0 -1
  160. package/dist/types/overlay/core/OverlayController.test.d.ts +0 -2
  161. package/dist/types/overlay/core/OverlayController.test.d.ts.map +0 -1
  162. package/dist/types/overlay/core/StateManager.d.ts.map +0 -1
  163. package/dist/types/overlay/formatRegistry.d.ts.map +0 -1
  164. package/dist/types/overlay/formatRegistry.test.d.ts +0 -2
  165. package/dist/types/overlay/formatRegistry.test.d.ts.map +0 -1
  166. package/dist/types/overlay/index.d.ts.map +0 -1
  167. package/dist/types/overlay/models/FormatDefinition.d.ts.map +0 -1
  168. package/dist/types/overlay/models/OverlayEvents.d.ts.map +0 -1
  169. package/dist/types/overlay/models/OverlayState.d.ts.map +0 -1
  170. package/dist/types/overlay/services/ClipboardService.d.ts.map +0 -1
  171. package/dist/types/overlay/services/ExportService.d.ts.map +0 -1
  172. package/dist/types/overlay/services/OverlayPositionStorage.d.ts.map +0 -1
  173. package/dist/types/overlay/services/PositionService.d.ts.map +0 -1
  174. package/dist/types/overlay/services/PositionService.test.d.ts +0 -2
  175. package/dist/types/overlay/services/PositionService.test.d.ts.map +0 -1
  176. package/dist/types/overlay/types.d.ts.map +0 -1
  177. package/dist/types/overlay/utils/classes.d.ts.map +0 -1
  178. package/dist/types/types.d.ts.map +0 -1
  179. package/dist/types/utils/pixels.d.ts.map +0 -1
  180. package/dist/types/version.d.ts +0 -2
  181. package/dist/types/version.d.ts.map +0 -1
@@ -2,4 +2,3 @@
2
2
  * Augmentation barrel.
3
3
  */
4
4
  import './textmode';
5
- //# sourceMappingURL=index.d.ts.map
@@ -6,4 +6,3 @@ declare module 'textmode.js' {
6
6
  interface Textmodifier extends TextmodeExportAPI {
7
7
  }
8
8
  }
9
- //# sourceMappingURL=textmode.d.ts.map
@@ -26,4 +26,3 @@ export declare function getEncodedGlyphValueFromColor(color: [number, number, nu
26
26
  */
27
27
  export declare function resolveGlyphByEncodedValue(font: ResolvableFont, encodedValue: number): ResolvableGlyph | undefined;
28
28
  export {};
29
- //# sourceMappingURL=CharacterResolver.d.ts.map
@@ -42,4 +42,3 @@ export declare class DataExtractor {
42
42
  rotation: number;
43
43
  };
44
44
  }
45
- //# sourceMappingURL=DataExtractor.d.ts.map
@@ -24,4 +24,3 @@ export declare class FileHandler {
24
24
  */
25
25
  private _generateDefaultFilename;
26
26
  }
27
- //# sourceMappingURL=FileHandler.d.ts.map
@@ -0,0 +1,10 @@
1
+ /** Context supplied before a deterministic export frame is rendered. */
2
+ export interface ExportFrameContext {
3
+ frameIndex: number;
4
+ frameCount: number;
5
+ timeSeconds: number;
6
+ frameRate: number;
7
+ signal?: AbortSignal;
8
+ }
9
+ /** Prepares external media or state before an export frame is redrawn. */
10
+ export type PrepareExportFrame = (context: ExportFrameContext) => void | Promise<void>;
@@ -1,9 +1,11 @@
1
- import type { Textmodifier, TextmodeFramebuffer, TextmodeGrid } from 'textmode.js';
1
+ import { LayerBlendMode, type Textmodifier, type TextmodeFramebuffer, type TextmodeGrid } from 'textmode.js';
2
2
  import type { TextmodeFont, TextmodeTileset } from 'textmode.js';
3
3
  import type { TextmodeLayer } from 'textmode.js';
4
4
  /**
5
5
  * Shared option for exporters that read layer framebuffer data.
6
6
  *
7
+ * @category Layer data export
8
+ *
7
9
  * @see {@link https://code.textmode.art/api/textmode.export.js/interfaces/LayerExportOptions | LayerExportOptions API reference}
8
10
  */
9
11
  export interface LayerExportOptions {
@@ -27,7 +29,7 @@ export interface ResolvedLayerExportTarget {
27
29
  export interface ResolvedLayerStackExportTarget extends ResolvedLayerExportTarget {
28
30
  visible: boolean;
29
31
  opacity: number;
30
- blendMode: string;
32
+ blendMode: LayerBlendMode;
31
33
  offsetX: number;
32
34
  offsetY: number;
33
35
  rotationZ: number;
@@ -47,4 +49,3 @@ export declare function createLayerTargetProvider(textmodifier: Textmodifier): L
47
49
  export declare function getLayerTargetId(textmodifier: Textmodifier, layer: TextmodeLayer): string;
48
50
  export declare function resolveLayerExportTarget(textmodifier: Textmodifier, layer?: TextmodeLayer): ResolvedLayerExportTarget;
49
51
  export declare function resolveLayerStackExportTargets(textmodifier: Textmodifier): ResolvedLayerStackExportTarget[];
50
- //# sourceMappingURL=LayerTarget.d.ts.map
@@ -3,4 +3,4 @@ export { FileHandler } from './FileHandler';
3
3
  export { getEncodedGlyphValueFromColor, resolveGlyphByEncodedValue } from './CharacterResolver';
4
4
  export { createLayerTargetProvider, getLayerTargetId, getLayerTargetOptions, resolveLayerExportTarget, resolveLayerStackExportTargets, } from './LayerTarget';
5
5
  export type { LayerExportOptions, LayerTargetOption, LayerTargetProvider, ResolvedLayerExportTarget, ResolvedLayerStackExportTarget, } from './LayerTarget';
6
- //# sourceMappingURL=index.d.ts.map
6
+ export type { ExportFrameContext, PrepareExportFrame } from './FramePreparation';
@@ -0,0 +1 @@
1
+ export {};
@@ -1,34 +1,15 @@
1
1
  import type { Textmodifier } from 'textmode.js';
2
- import type { TextmodePluginContext } from 'textmode.js';
2
+ import { type PostDrawSubscription } from '../video/VideoFrameDriver';
3
3
  import type { GIFExportOptions } from './types';
4
- /**
5
- * Main GIF exporter for the textmode.js library.
6
- * Orchestrates the GIF export process by coordinating canvas capture,
7
- * frame processing, and file handling.
8
- */
4
+ /** Deterministic, bounded-memory GIF exporter. */
9
5
  export declare class GIFExporter {
10
- private readonly _recorder;
11
6
  private readonly _textmodifier;
12
7
  private readonly _registerPostDrawHook;
13
- /**
14
- * Creates an instance of GIFExporter.
15
- *
16
- * @param textmodifier The Textmodifier instance to capture frames from
17
- * @param registerPostDrawHook Function to register post-draw hooks
18
- */
19
- constructor(textmodifier: Textmodifier, registerPostDrawHook: TextmodePluginContext['registerPostDrawHook']);
20
- /**
21
- * Captures frames and saves them as a GIF file
22
- *
23
- * @param options Export options
24
- */
8
+ constructor(_textmodifier: Textmodifier, _registerPostDrawHook: PostDrawSubscription);
25
9
  $saveGIF(options?: GIFExportOptions): Promise<void>;
26
- /**
27
- * Applies default values to the provided export options
28
- *
29
- * @param options User-provided options
30
- * @returns Complete options with defaults applied
31
- */
10
+ /** Generates a GIF blob without initiating a download. */
11
+ $generateGIFBlob(options?: GIFExportOptions): Promise<Blob>;
32
12
  private _applyDefaultOptions;
13
+ private _throwIfAborted;
14
+ private _yieldToBrowser;
33
15
  }
34
- //# sourceMappingURL=GIFExporter.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { TextmodePluginContext } from 'textmode.js';
1
+ import type { PostDrawSubscription } from '../video/VideoFrameDriver';
2
2
  import type { GIFExportProgress, GIFFrame, GIFGenerationOptions } from './types';
3
3
  /**
4
4
  * Records frames from a canvas for GIF generation.
@@ -19,6 +19,5 @@ export declare class GIFRecorder {
19
19
  * @returns Promise resolving to array of captured frames
20
20
  * @throws {Error} If frame capture fails
21
21
  */
22
- $record(canvas: HTMLCanvasElement, options: GIFGenerationOptions, registerPostDrawHook: TextmodePluginContext['registerPostDrawHook'], onProgress?: (progress: GIFExportProgress) => void): Promise<GIFFrame[]>;
22
+ $record(canvas: HTMLCanvasElement, options: GIFGenerationOptions, registerPostDrawHook: PostDrawSubscription, onProgress?: (progress: GIFExportProgress) => void): Promise<GIFFrame[]>;
23
23
  }
24
- //# sourceMappingURL=GIFRecorder.d.ts.map
@@ -0,0 +1,15 @@
1
+ /** One-at-a-time worker bridge that bounds captured GIF memory to one RGBA frame. */
2
+ export declare class GIFWorkerClient {
3
+ private readonly _worker;
4
+ private readonly _pending;
5
+ private readonly _ready;
6
+ private _requestId;
7
+ private _disposed;
8
+ constructor(width: number, height: number, frameRate: number, repeat: number, signal?: AbortSignal);
9
+ encodeFrame(buffer: ArrayBuffer, frameIndex: number): Promise<void>;
10
+ finish(): Promise<ArrayBuffer>;
11
+ dispose: () => void;
12
+ private _request;
13
+ private _handleMessage;
14
+ private _handleError;
15
+ }
@@ -1,4 +1,3 @@
1
1
  export { GIFExporter } from './GIFExporter';
2
2
  export { GIFRecorder } from './GIFRecorder';
3
3
  export type { GIFExportOptions, GIFExportProgress, GIFGenerationOptions, GIFRecordingState } from './types';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1,7 +1,10 @@
1
+ import type { PrepareExportFrame } from '../base';
1
2
  export type GIFRecordingState = 'idle' | 'recording' | 'encoding' | 'completed' | 'error';
2
3
  /**
3
4
  * Progress information emitted during the GIF export process.
4
5
  *
6
+ * @category Animation export
7
+ *
5
8
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/GIFExportProgress | GIFExportProgress API reference}
6
9
  */
7
10
  export type GIFExportProgress = {
@@ -33,6 +36,8 @@ export type GIFExportProgress = {
33
36
  /**
34
37
  * Options for exporting the textmode content to GIF format.
35
38
  *
39
+ * @category Animation export
40
+ *
36
41
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/GIFExportOptions | GIFExportOptions API reference}
37
42
  */
38
43
  export type GIFExportOptions = {
@@ -70,6 +75,18 @@ export type GIFExportOptions = {
70
75
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/GIFExportOptions#repeat | GIFExportOptions.repeat API reference}
71
76
  */
72
77
  repeat?: number;
78
+ /**
79
+ * Abort signal for cancelling capture or encoding.
80
+ *
81
+ * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/GIFExportOptions#signal | GIFExportOptions.signal API reference}
82
+ */
83
+ signal?: AbortSignal;
84
+ /**
85
+ * Prepares external media before each deterministic frame is redrawn.
86
+ *
87
+ * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/GIFExportOptions#prepareframe | GIFExportOptions.prepareFrame API reference}
88
+ */
89
+ prepareFrame?: PrepareExportFrame;
73
90
  /**
74
91
  * Progress callback invoked throughout the recording lifecycle.
75
92
  *
@@ -83,6 +100,8 @@ export interface GIFGenerationOptions {
83
100
  frameRate: number;
84
101
  scale: number;
85
102
  repeat: number;
103
+ signal?: AbortSignal;
104
+ prepareFrame?: PrepareExportFrame;
86
105
  }
87
106
  export interface GIFFrame {
88
107
  imageData: ImageData;
@@ -90,4 +109,3 @@ export interface GIFFrame {
90
109
  height: number;
91
110
  delayMs?: number;
92
111
  }
93
- //# sourceMappingURL=types.d.ts.map
@@ -34,6 +34,8 @@ export declare class ImageExporter {
34
34
  * @param options Export options
35
35
  */
36
36
  $saveImage(canvas: HTMLCanvasElement, options?: ImageExportOptions): Promise<void>;
37
+ /** Generates an image blob using the public export options. */
38
+ $toImageBlob(canvas: HTMLCanvasElement, options?: ImageExportOptions): Promise<Blob>;
37
39
  /**
38
40
  * Copies the generated image to the clipboard using the modern Clipboard API
39
41
  *
@@ -42,4 +44,3 @@ export declare class ImageExporter {
42
44
  */
43
45
  $copyImageToClipboard(canvas: HTMLCanvasElement, options?: ImageExportOptions): Promise<void>;
44
46
  }
45
- //# sourceMappingURL=ImageExporter.d.ts.map
@@ -1,4 +1,3 @@
1
1
  export { ImageExporter } from './ImageExporter';
2
2
  export type { ImageExportOptions, ImageGenerationOptions, ImageFormat } from './types';
3
3
  export { IMAGE_MIME_TYPES, IMAGE_EXTENSIONS } from './types';
4
- //# sourceMappingURL=index.d.ts.map
@@ -8,6 +8,8 @@ export type ImageFormat = 'png' | 'jpg' | 'webp';
8
8
  /**
9
9
  * Options for exporting the textmode content to image format.
10
10
  *
11
+ * @category Canvas capture
12
+ *
11
13
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/ImageExportOptions | ImageExportOptions API reference}
12
14
  */
13
15
  export type ImageExportOptions = {
@@ -50,4 +52,3 @@ export declare const IMAGE_MIME_TYPES: Record<ImageFormat, string>;
50
52
  * File extension mapping for image formats.
51
53
  */
52
54
  export declare const IMAGE_EXTENSIONS: Record<ImageFormat, string>;
53
- //# sourceMappingURL=types.d.ts.map
@@ -12,4 +12,3 @@ export declare class JSONDataExtractor extends DataExtractor {
12
12
  */
13
13
  $extractCellData(target: ResolvedLayerExportTarget): JSONCellData[];
14
14
  }
15
- //# sourceMappingURL=JSONDataExtractor.d.ts.map
@@ -58,4 +58,3 @@ export declare class JSONExporter {
58
58
  */
59
59
  $saveJSON(textmodifier: Textmodifier, options?: JSONExportOptions): void;
60
60
  }
61
- //# sourceMappingURL=JSONExporter.d.ts.map
@@ -1,4 +1,3 @@
1
1
  export { JSONExporter } from './JSONExporter';
2
2
  export { JSONDataExtractor } from './JSONDataExtractor';
3
3
  export type { JSONDocumentFormat, JSONDocumentVersion, JSONCellCollection, JSONCellData, JSONCellTransform, JSONColorValue, JSONExportColorMode, JSONExportMetadata, JSONExportOptions, JSONExportTarget, JSONGenerationOptions, JSONLayerGrid, JSONObjectRowCell, JSONObjectRowsCellCollection, JSONRGBAColor, TextmodeAllDocumentJSON, TextmodeDocumentJSON, TextmodeDocumentLayer, TextmodeSelectedDocumentJSON, TextmodeSelectedDocumentLayer, } from './types';
4
- //# sourceMappingURL=index.d.ts.map
@@ -2,6 +2,8 @@ import type { LayerExportOptions } from '../base';
2
2
  /**
3
3
  * Target scope for JSON export.
4
4
  *
5
+ * @category JSON document data
6
+ *
5
7
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/JSONExportTarget | JSONExportTarget API reference}
6
8
  */
7
9
  export type JSONExportTarget = 'selected' | 'all';
@@ -20,6 +22,8 @@ export type JSONDocumentVersion = '2.0.0';
20
22
  /**
21
23
  * Supported JSON color output modes.
22
24
  *
25
+ * @category JSON document data
26
+ *
23
27
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/JSONExportColorMode | JSONExportColorMode API reference}
24
28
  */
25
29
  export type JSONExportColorMode = 'hex' | 'rgba';
@@ -163,12 +167,16 @@ export interface TextmodeAllDocumentJSON {
163
167
  /**
164
168
  * JSON document exported by the JSON exporter.
165
169
  *
170
+ * @category JSON document data
171
+ *
166
172
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/TextmodeDocumentJSON | TextmodeDocumentJSON API reference}
167
173
  */
168
174
  export type TextmodeDocumentJSON = TextmodeSelectedDocumentJSON | TextmodeAllDocumentJSON;
169
175
  /**
170
176
  * Options for exporting the textmode content to JSON format.
171
177
  *
178
+ * @category JSON document data
179
+ *
172
180
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/JSONExportOptions | JSONExportOptions API reference}
173
181
  */
174
182
  export type JSONExportOptions = LayerExportOptions & {
@@ -231,4 +239,3 @@ export interface JSONCellData {
231
239
  background: JSONRGBAColor;
232
240
  transform: JSONCellTransform;
233
241
  }
234
- //# sourceMappingURL=types.d.ts.map
@@ -76,4 +76,3 @@ export declare class SVGContentGenerator {
76
76
  */
77
77
  $optimizeSVGContent(svgContent: string): string;
78
78
  }
79
- //# sourceMappingURL=SVGContentGenerator.d.ts.map
@@ -24,4 +24,3 @@ export declare class SVGDataExtractor extends DataExtractor {
24
24
  */
25
25
  $extractSVGCellData(framebufferData: FramebufferData, grid: TextmodeGrid): SVGCellData[];
26
26
  }
27
- //# sourceMappingURL=SVGDataExtractor.d.ts.map
@@ -29,4 +29,3 @@ export declare class SVGExporter {
29
29
  */
30
30
  $saveSVG(textmodifier: Textmodifier, options?: SVGExportOptions): void;
31
31
  }
32
- //# sourceMappingURL=SVGExporter.d.ts.map
@@ -69,4 +69,3 @@ export declare class SVGPathGenerator {
69
69
  $generatePositionedCharacterPath(_character: string, font: TextmodeFont, cellX: number, cellY: number, cellWidth: number, _cellHeight: number, fontSize: number, glyphData: GlyphData | null): string | null;
70
70
  }
71
71
  export {};
72
- //# sourceMappingURL=SVGPathGenerator.d.ts.map
@@ -3,4 +3,3 @@ export { SVGDataExtractor } from './SVGDataExtractor';
3
3
  export { SVGContentGenerator } from './SVGContentGenerator';
4
4
  export { SVGPathGenerator } from './SVGPathGenerator';
5
5
  export type { SVGExportOptions, SVGGenerationOptions, SVGCellData, FramebufferData, RGBA, Position, CellPosition, CellTransform, GlyphPath, } from './types';
6
- //# sourceMappingURL=index.d.ts.map
@@ -54,6 +54,8 @@ export interface FramebufferData {
54
54
  /**
55
55
  * Options for exporting the textmode content to SVG format.
56
56
  *
57
+ * @category Layer data export
58
+ *
57
59
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/SVGExportOptions | SVGExportOptions API reference}
58
60
  */
59
61
  export type SVGExportOptions = LayerExportOptions & {
@@ -110,4 +112,3 @@ export interface SVGGenerationOptions {
110
112
  filename?: string;
111
113
  layer?: LayerExportOptions['layer'];
112
114
  }
113
- //# sourceMappingURL=types.d.ts.map
@@ -37,4 +37,3 @@ export declare class TXTExporter {
37
37
  */
38
38
  $saveTXT(textmodifier: Textmodifier, options?: TXTExportOptions): void;
39
39
  }
40
- //# sourceMappingURL=TXTExporter.d.ts.map
@@ -1,3 +1,2 @@
1
1
  export { TXTExporter } from './TXTExporter';
2
2
  export type { TXTExportOptions, TXTGenerationOptions, FramebufferData } from './types';
3
- //# sourceMappingURL=index.d.ts.map
@@ -2,6 +2,8 @@ import type { LayerExportOptions } from '../base';
2
2
  /**
3
3
  * Options for exporting the textmode content to TXT format.
4
4
  *
5
+ * @category Layer data export
6
+ *
5
7
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/TXTExportOptions | TXTExportOptions API reference}
6
8
  */
7
9
  export type TXTExportOptions = LayerExportOptions & {
@@ -38,4 +40,3 @@ export interface TXTGenerationOptions {
38
40
  * Re-export shared types from SVG module that are also used by TXT exporter
39
41
  */
40
42
  export type { FramebufferData } from '../svg/types';
41
- //# sourceMappingURL=types.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import type { Textmodifier } from 'textmode.js';
2
- import type { TextmodePluginContext } from 'textmode.js';
2
+ import { type PostDrawSubscription } from './VideoFrameDriver';
3
3
  import type { VideoExportOptions } from './types';
4
4
  /**
5
5
  * Main video exporter for the textmode.js library.
@@ -8,14 +8,15 @@ export declare class VideoExporter {
8
8
  private readonly _recorder;
9
9
  private readonly _textmodifier;
10
10
  private readonly _registerPostDrawHook;
11
- constructor(textmodifier: Textmodifier, registerPostDrawHook: TextmodePluginContext['registerPostDrawHook']);
11
+ constructor(textmodifier: Textmodifier, registerPostDrawHook: PostDrawSubscription);
12
12
  /**
13
13
  * Captures deterministic frames and saves them as a video file.
14
14
  *
15
15
  * @param options Export options
16
16
  */
17
17
  $saveVideo(options?: VideoExportOptions): Promise<void>;
18
- private _saveVideo;
18
+ /** Generates a deterministic video without initiating a download. */
19
+ $generateVideoBlob(options?: VideoExportOptions): Promise<Blob>;
19
20
  private _applyDefaultOptions;
20
21
  private _positiveInteger;
21
22
  private _positiveNumber;
@@ -27,4 +28,3 @@ export declare class VideoExporter {
27
28
  private _currentPixelDensity;
28
29
  private _withExtension;
29
30
  }
30
- //# sourceMappingURL=VideoExporter.d.ts.map
@@ -1,5 +1,6 @@
1
- import type { Textmodifier, TextmodePluginContext } from 'textmode.js';
1
+ import type { Textmodifier } from 'textmode.js';
2
2
  import type { VideoRenderFrameOptions } from './types';
3
+ export type PostDrawSubscription = (callback: () => void) => () => void;
3
4
  /**
4
5
  * Drives deterministic video export frames through public textmode APIs.
5
6
  *
@@ -15,7 +16,7 @@ export declare class VideoFrameDriver {
15
16
  private _pendingFrame;
16
17
  private _syntheticFrameCount;
17
18
  private _syntheticMillis;
18
- constructor(textmodifier: Textmodifier, registerPostDrawHook: TextmodePluginContext['registerPostDrawHook'], width: number, height: number);
19
+ constructor(textmodifier: Textmodifier, registerPostDrawHook: PostDrawSubscription, width: number, height: number);
19
20
  $render(options: VideoRenderFrameOptions): Promise<void>;
20
21
  private _renderOneFrame;
21
22
  private _capturePendingFrame;
@@ -29,4 +30,3 @@ export declare class VideoFrameDriver {
29
30
  private _restoreProperties;
30
31
  private _throwIfAborted;
31
32
  }
32
- //# sourceMappingURL=VideoFrameDriver.d.ts.map
@@ -16,4 +16,3 @@ export declare class VideoRecorder {
16
16
  private _normalizeError;
17
17
  private _log;
18
18
  }
19
- //# sourceMappingURL=VideoRecorder.d.ts.map
@@ -7,4 +7,3 @@ export declare class VideoExportError extends Error {
7
7
  export declare function createAbortError(): VideoExportError;
8
8
  export declare function createTimeoutError(message: string, cause?: unknown): VideoExportError;
9
9
  export declare function isAbortError(error: unknown): boolean;
10
- //# sourceMappingURL=errors.d.ts.map
@@ -3,4 +3,3 @@ export { VideoFrameDriver } from './VideoFrameDriver';
3
3
  export { VideoRecorder } from './VideoRecorder';
4
4
  export { VideoExportError } from './errors';
5
5
  export type { VideoBitrateMode, VideoBitratePreset, VideoEncodingPlan, VideoExportErrorCode, VideoExportFormat, VideoExportOptions, VideoExportPhase, VideoFrameDriverLike, VideoHardwareAcceleration, VideoLatencyMode, VideoExportProgress, VideoGenerationOptions, VideoRecordingState, VideoRenderFrameOptions, } from './types';
6
- //# sourceMappingURL=index.d.ts.map
@@ -1,6 +1,9 @@
1
+ import type { PrepareExportFrame } from '../base';
1
2
  /**
2
3
  * Lifecycle state reported while a video export is being prepared, recorded, encoded, or completed.
3
4
  *
5
+ * @category Animation export
6
+ *
4
7
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/VideoRecordingState | VideoRecordingState API reference}
5
8
  */
6
9
  export type VideoRecordingState = 'idle' | 'recording' | 'encoding' | 'completed' | 'error';
@@ -9,6 +12,8 @@ export type VideoRecordingState = 'idle' | 'recording' | 'encoding' | 'completed
9
12
  *
10
13
  * `rendering` is retained for 1.5.x compatibility. Current deterministic video capture emits `capturing`.
11
14
  *
15
+ * @category Animation export
16
+ *
12
17
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/VideoExportPhase | VideoExportPhase API reference}
13
18
  */
14
19
  export type VideoExportPhase = 'probing' | 'rendering' | 'capturing' | 'encoding' | 'draining' | 'finalizing';
@@ -16,8 +21,11 @@ export type VideoCodec = 'vp8' | 'vp9' | 'avc' | (string & {});
16
21
  /**
17
22
  * Subjective bitrate preset used when an exact bits-per-second value is not supplied.
18
23
  *
19
- * Higher presets produce larger files with more detail. For exact control, pass a numeric
20
- * `bitrate` value in bits per second instead.
24
+ * Higher presets produce larger files with more detail. Each preset maps to a fixed bits-per-pixel budget
25
+ * (bits per pixel per second), so a given preset resolves to the same bitrate regardless of the export
26
+ * frame rate. For exact control, pass a numeric `bitrate` value in bits per second instead.
27
+ *
28
+ * @category Animation export
21
29
  *
22
30
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/VideoBitratePreset | VideoBitratePreset API reference}
23
31
  */
@@ -25,6 +33,8 @@ export type VideoBitratePreset = 'low' | 'medium' | 'high';
25
33
  /**
26
34
  * Video container format written by `saveVideo`.
27
35
  *
36
+ * @category Animation export
37
+ *
28
38
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/VideoExportFormat | VideoExportFormat API reference}
29
39
  */
30
40
  export type VideoExportFormat = 'webm' | 'mp4';
@@ -36,6 +46,8 @@ export type VideoExportFormat = 'webm' | 'mp4';
36
46
  * - `'constant'`: asks the encoder to keep the bitrate steadier throughout the export. This can make file size
37
47
  * more predictable, but may waste bits on simple frames or reduce detail on complex frames.
38
48
  *
49
+ * @category Animation export
50
+ *
39
51
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/VideoBitrateMode | VideoBitrateMode API reference}
40
52
  */
41
53
  export type VideoBitrateMode = 'variable' | 'constant';
@@ -46,6 +58,8 @@ export type VideoBitrateMode = 'variable' | 'constant';
46
58
  * - `'realtime'`: prioritizes low-latency encoding. It is intended for live streams and may drop frames when overloaded,
47
59
  * so it is usually not recommended for frame-perfect exports.
48
60
  *
61
+ * @category Animation export
62
+ *
49
63
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/VideoLatencyMode | VideoLatencyMode API reference}
50
64
  */
51
65
  export type VideoLatencyMode = 'quality' | 'realtime';
@@ -58,6 +72,8 @@ export type VideoLatencyMode = 'quality' | 'realtime';
58
72
  * availability and output characteristics vary by device.
59
73
  * - `'prefer-software'`: prefer CPU encoding, often more consistent across machines, but usually slower.
60
74
  *
75
+ * @category Animation export
76
+ *
61
77
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/VideoHardwareAcceleration | VideoHardwareAcceleration API reference}
62
78
  */
63
79
  export type VideoHardwareAcceleration = 'no-preference' | 'prefer-hardware' | 'prefer-software';
@@ -65,6 +81,8 @@ export type VideoExportErrorCode = 'VIDEO_EXPORT_UNSUPPORTED' | 'VIDEO_CODEC_UNS
65
81
  /**
66
82
  * Progress information emitted during the video export process.
67
83
  *
84
+ * @category Animation export
85
+ *
68
86
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/VideoExportProgress | VideoExportProgress API reference}
69
87
  */
70
88
  export type VideoExportProgress = {
@@ -114,6 +132,8 @@ export type VideoExportProgress = {
114
132
  /**
115
133
  * Options for exporting the textmode content to video format.
116
134
  *
135
+ * @category Animation export
136
+ *
117
137
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/VideoExportOptions | VideoExportOptions API reference}
118
138
  */
119
139
  export type VideoExportOptions = {
@@ -142,11 +162,12 @@ export type VideoExportOptions = {
142
162
  */
143
163
  frameRate?: number;
144
164
  /**
145
- * Target bitrate in bits per second or a bitrate preset. Defaults to `'medium'`.
165
+ * Target bitrate in bits per second or a quality preset. Defaults to `'medium'`.
146
166
  *
147
167
  * Bitrate controls how much encoded data is available per second of video. Higher values can preserve more detail
148
- * in noisy or fast-changing sketches, but create larger files. Presets are resolved from the export dimensions and
149
- * frame rate; numeric values are passed directly to the encoder.
168
+ * in noisy or fast-changing sketches, but create larger files. Presets resolve to a fixed bits-per-pixel budget
169
+ * from the export dimensions only, so a given preset targets the same bitrate regardless of the frame rate.
170
+ * Numeric values are passed directly to the encoder.
150
171
  *
151
172
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/VideoExportOptions#bitrate | VideoExportOptions.bitrate API reference}
152
173
  */
@@ -200,6 +221,12 @@ export type VideoExportOptions = {
200
221
  * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/VideoExportOptions#signal | VideoExportOptions.signal API reference}
201
222
  */
202
223
  signal?: AbortSignal;
224
+ /**
225
+ * Prepares external media before each deterministic frame is redrawn.
226
+ *
227
+ * @see {@link https://code.textmode.art/api/textmode.export.js/type-aliases/VideoExportOptions#prepareframe | VideoExportOptions.prepareFrame API reference}
228
+ */
229
+ prepareFrame?: PrepareExportFrame;
203
230
  /**
204
231
  * When true, attempts to preserve alpha data in WebM recordings. MP4 exports reject this option.
205
232
  *
@@ -235,6 +262,7 @@ export interface VideoGenerationOptions {
235
262
  transparent: boolean;
236
263
  debugLogging: boolean;
237
264
  signal?: AbortSignal;
265
+ prepareFrame?: PrepareExportFrame;
238
266
  }
239
267
  export interface VideoEncodingPlan {
240
268
  format: VideoExportFormat;
@@ -256,6 +284,7 @@ export interface VideoRenderFrameOptions {
256
284
  frameCount: number;
257
285
  frameRate: number;
258
286
  signal?: AbortSignal;
287
+ prepareFrame?: PrepareExportFrame;
259
288
  onFrame(frame: {
260
289
  frameIndex: number;
261
290
  canvas: HTMLCanvasElement;
@@ -265,4 +294,3 @@ export interface VideoFrameDriverLike {
265
294
  readonly canvas: HTMLCanvasElement;
266
295
  $render(options: VideoRenderFrameOptions): Promise<void>;
267
296
  }
268
- //# sourceMappingURL=types.d.ts.map
@@ -1,2 +1 @@
1
1
  export declare function withAbortableTimeout<T>(promise: Promise<T>, message: string, signal: AbortSignal | undefined, timeoutMs: number): Promise<T>;
2
- //# sourceMappingURL=withAbortableTimeout.d.ts.map