@magicpages/kalotyp-core 0.1.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.
- package/dist/canvas/bake-canvas.d.ts +25 -0
- package/dist/canvas/bake-canvas.d.ts.map +1 -0
- package/dist/canvas/load-image.d.ts +16 -0
- package/dist/canvas/load-image.d.ts.map +1 -0
- package/dist/canvas/viewport-controller.d.ts +46 -0
- package/dist/canvas/viewport-controller.d.ts.map +1 -0
- package/dist/canvas/viewport.d.ts +43 -0
- package/dist/canvas/viewport.d.ts.map +1 -0
- package/dist/events/event-bus.d.ts +10 -0
- package/dist/events/event-bus.d.ts.map +1 -0
- package/dist/geometry/rect.d.ts +35 -0
- package/dist/geometry/rect.d.ts.map +1 -0
- package/dist/history/history.d.ts +38 -0
- package/dist/history/history.d.ts.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1976 -0
- package/dist/index.js.map +1 -0
- package/dist/output/state.d.ts +27 -0
- package/dist/output/state.d.ts.map +1 -0
- package/dist/pipeline/encode.d.ts +27 -0
- package/dist/pipeline/encode.d.ts.map +1 -0
- package/dist/pipeline/exif.d.ts +16 -0
- package/dist/pipeline/exif.d.ts.map +1 -0
- package/dist/pipeline/run-chain.d.ts +10 -0
- package/dist/pipeline/run-chain.d.ts.map +1 -0
- package/dist/plugins/annotate/bake.d.ts +16 -0
- package/dist/plugins/annotate/bake.d.ts.map +1 -0
- package/dist/plugins/annotate/geometry.d.ts +36 -0
- package/dist/plugins/annotate/geometry.d.ts.map +1 -0
- package/dist/plugins/annotate/hit-test.d.ts +8 -0
- package/dist/plugins/annotate/hit-test.d.ts.map +1 -0
- package/dist/plugins/annotate/smooth.d.ts +16 -0
- package/dist/plugins/annotate/smooth.d.ts.map +1 -0
- package/dist/plugins/annotate/state.d.ts +176 -0
- package/dist/plugins/annotate/state.d.ts.map +1 -0
- package/dist/plugins/crop/aspect-ratio.d.ts +15 -0
- package/dist/plugins/crop/aspect-ratio.d.ts.map +1 -0
- package/dist/plugins/crop/bake.d.ts +13 -0
- package/dist/plugins/crop/bake.d.ts.map +1 -0
- package/dist/plugins/crop/preset-filter.d.ts +10 -0
- package/dist/plugins/crop/preset-filter.d.ts.map +1 -0
- package/dist/plugins/crop/resize.d.ts +19 -0
- package/dist/plugins/crop/resize.d.ts.map +1 -0
- package/dist/plugins/crop/state.d.ts +23 -0
- package/dist/plugins/crop/state.d.ts.map +1 -0
- package/dist/plugins/filter/presets.d.ts +19 -0
- package/dist/plugins/filter/presets.d.ts.map +1 -0
- package/dist/plugins/finetune/bake.d.ts +5 -0
- package/dist/plugins/finetune/bake.d.ts.map +1 -0
- package/dist/plugins/finetune/math.d.ts +32 -0
- package/dist/plugins/finetune/math.d.ts.map +1 -0
- package/dist/plugins/finetune/state.d.ts +31 -0
- package/dist/plugins/finetune/state.d.ts.map +1 -0
- package/dist/plugins/flip/bake.d.ts +5 -0
- package/dist/plugins/flip/bake.d.ts.map +1 -0
- package/dist/plugins/flip/state.d.ts +9 -0
- package/dist/plugins/flip/state.d.ts.map +1 -0
- package/dist/plugins/frame/bake.d.ts +16 -0
- package/dist/plugins/frame/bake.d.ts.map +1 -0
- package/dist/plugins/frame/state.d.ts +29 -0
- package/dist/plugins/frame/state.d.ts.map +1 -0
- package/dist/plugins/redact/bake.d.ts +13 -0
- package/dist/plugins/redact/bake.d.ts.map +1 -0
- package/dist/plugins/redact/state.d.ts +112 -0
- package/dist/plugins/redact/state.d.ts.map +1 -0
- package/dist/plugins/resize/bake.d.ts +9 -0
- package/dist/plugins/resize/bake.d.ts.map +1 -0
- package/dist/plugins/resize/state.d.ts +37 -0
- package/dist/plugins/resize/state.d.ts.map +1 -0
- package/dist/plugins/rotate/bake.d.ts +9 -0
- package/dist/plugins/rotate/bake.d.ts.map +1 -0
- package/dist/plugins/rotate/inscribe.d.ts +14 -0
- package/dist/plugins/rotate/inscribe.d.ts.map +1 -0
- package/dist/plugins/rotate/state.d.ts +21 -0
- package/dist/plugins/rotate/state.d.ts.map +1 -0
- package/dist/plugins/utility.d.ts +59 -0
- package/dist/plugins/utility.d.ts.map +1 -0
- package/dist/state/store.d.ts +14 -0
- package/dist/state/store.d.ts.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Allocate a canvas suitable for an off-screen bake operation.
|
|
3
|
+
*
|
|
4
|
+
* The two return shapes are a discriminated union because the `toBlob`
|
|
5
|
+
* vs `convertToBlob` signatures differ — callers pass through whichever
|
|
6
|
+
* they got.
|
|
7
|
+
*/
|
|
8
|
+
export type BakeCanvas = {
|
|
9
|
+
readonly kind: 'offscreen';
|
|
10
|
+
readonly canvas: OffscreenCanvas;
|
|
11
|
+
} | {
|
|
12
|
+
readonly kind: 'html';
|
|
13
|
+
readonly canvas: HTMLCanvasElement;
|
|
14
|
+
};
|
|
15
|
+
export declare function createBakeCanvas(width: number, height: number): BakeCanvas;
|
|
16
|
+
/**
|
|
17
|
+
* Get a 2D rendering context from either canvas shape with a single
|
|
18
|
+
* narrowed type. Branching on `bake.kind` first lets TS narrow each
|
|
19
|
+
* canvas's `getContext('2d')` correctly; calling it on the un-discriminated
|
|
20
|
+
* union collapses the return to the broader `RenderingContext`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getBakeContext2D(bake: BakeCanvas): CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;
|
|
23
|
+
export declare function bakeCanvasToBlob(bake: BakeCanvas, mimeType: string, quality: number): Promise<Blob>;
|
|
24
|
+
export declare function canEncodeMime(mimeType: string): Promise<boolean>;
|
|
25
|
+
//# sourceMappingURL=bake-canvas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bake-canvas.d.ts","sourceRoot":"","sources":["../../src/canvas/bake-canvas.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAElE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAS1E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,UAAU,GACf,wBAAwB,GAAG,iCAAiC,CAS9D;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAcf;AAYD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBhE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface LoadedImage {
|
|
2
|
+
readonly element: ImageBitmap | HTMLImageElement;
|
|
3
|
+
readonly width: number;
|
|
4
|
+
readonly height: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Load a source image and decode it for canvas use.
|
|
8
|
+
*
|
|
9
|
+
* Modern path uses `createImageBitmap(blob, { imageOrientation: 'from-image' })`
|
|
10
|
+
* so EXIF orientation is baked into the pixels — without this, phone photos
|
|
11
|
+
* load sideways because canvas `drawImage` ignores the EXIF flag.
|
|
12
|
+
* Fallback to `HTMLImageElement` when `createImageBitmap` isn't usable;
|
|
13
|
+
* EXIF orientation is not applied on that path.
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadImage(src: string | Blob | File): Promise<LoadedImage>;
|
|
16
|
+
//# sourceMappingURL=load-image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-image.d.ts","sourceRoot":"","sources":["../../src/canvas/load-image.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,gBAAgB,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAc/E"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Point, Size } from '../geometry/rect.js';
|
|
2
|
+
import { type StageDimensions, type Viewport, type ViewportTransform } from './viewport.js';
|
|
3
|
+
export declare const MAX_ZOOM = 8;
|
|
4
|
+
export declare const MIN_ZOOM = 0.25;
|
|
5
|
+
export interface ViewportControllerSnapshot {
|
|
6
|
+
readonly transform: ViewportTransform;
|
|
7
|
+
readonly pinching: boolean;
|
|
8
|
+
}
|
|
9
|
+
export type ViewportControllerListener = (snapshot: ViewportControllerSnapshot) => void;
|
|
10
|
+
/** Editor-level zoom + pan state, shared with every plugin's `UtilityContext`. */
|
|
11
|
+
export declare class ViewportController {
|
|
12
|
+
private current;
|
|
13
|
+
private isPinching;
|
|
14
|
+
private readonly listeners;
|
|
15
|
+
constructor(initial?: ViewportTransform);
|
|
16
|
+
getTransform(): ViewportTransform;
|
|
17
|
+
getSnapshot(): ViewportControllerSnapshot;
|
|
18
|
+
setTransform(transform: ViewportTransform): void;
|
|
19
|
+
/**
|
|
20
|
+
* Apply a multiplicative zoom delta anchored on a stage CSS-pixel point.
|
|
21
|
+
* The point under `anchor` stays under `anchor` after the zoom.
|
|
22
|
+
*
|
|
23
|
+
* Pan is the displaced image-center's offset from the stage center, so the
|
|
24
|
+
* dolly-zoom reduces to `pan_new = ratio · pan_old + (1 − ratio) · (anchor − stageCenter)`,
|
|
25
|
+
* independent of the active plugin's image intrinsic.
|
|
26
|
+
*/
|
|
27
|
+
zoomAt(deltaZoom: number, anchor: Point, stageCenter: Point): ViewportTransform;
|
|
28
|
+
/**
|
|
29
|
+
* Translate pan by `(dx, dy)` in stage CSS pixels at the current zoom.
|
|
30
|
+
* Pan is stored raw; `computeViewport` clamps at emission time so the
|
|
31
|
+
* gesture handler's math stays stable when the user pans past the clamp.
|
|
32
|
+
*/
|
|
33
|
+
panBy(dx: number, dy: number): void;
|
|
34
|
+
resetToFit(): void;
|
|
35
|
+
/** Reset only the pan, preserving zoom. Used on plugin switch. */
|
|
36
|
+
resetPan(): void;
|
|
37
|
+
/** True while a multi-pointer gesture is active. Heavy plugins read this. */
|
|
38
|
+
getPinching(): boolean;
|
|
39
|
+
setPinching(value: boolean): void;
|
|
40
|
+
computeViewport(stage: StageDimensions, image: Size): Viewport;
|
|
41
|
+
/** Subscribe to transform / pinching changes. Handler runs synchronously after every change. */
|
|
42
|
+
subscribe(listener: ViewportControllerListener): () => void;
|
|
43
|
+
clear(): void;
|
|
44
|
+
private emit;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=viewport-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewport-controller.d.ts","sourceRoot":"","sources":["../../src/canvas/viewport-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,iBAAiB,EAEvB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,QAAQ,OAAO,CAAC;AAE7B,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,0BAA0B,GAAG,CAAC,QAAQ,EAAE,0BAA0B,KAAK,IAAI,CAAC;AAExF,kFAAkF;AAClF,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;gBAEhD,OAAO,GAAE,iBAA+C;IAMpE,YAAY,IAAI,iBAAiB;IAIjC,WAAW,IAAI,0BAA0B;IAIzC,YAAY,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAOhD;;;;;;;OAOG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,GAAG,iBAAiB;IAkB/E;;;;OAIG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAUnC,UAAU,IAAI,IAAI;IAMlB,kEAAkE;IAClE,QAAQ,IAAI,IAAI;IAMhB,6EAA6E;IAC7E,WAAW,IAAI,OAAO;IAItB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAMjC,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,GAAG,QAAQ;IAI9D,gGAAgG;IAChG,SAAS,CAAC,QAAQ,EAAE,0BAA0B,GAAG,MAAM,IAAI;IAO3D,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,IAAI;CAIb"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Point, Rect, Size } from '../geometry/rect.js';
|
|
2
|
+
export interface StageDimensions {
|
|
3
|
+
/** Stage width in CSS pixels. */
|
|
4
|
+
readonly width: number;
|
|
5
|
+
/** Stage height in CSS pixels. */
|
|
6
|
+
readonly height: number;
|
|
7
|
+
/** Padding on each side around the image, in CSS pixels. */
|
|
8
|
+
readonly padding: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* User-driven zoom and pan applied on top of the fit-to-screen letterbox.
|
|
12
|
+
* `computeViewport` folds the transform into `displayRect` and `scale` so
|
|
13
|
+
* plugin-level draw calls stay zoom-agnostic. Pan is in stage CSS pixels
|
|
14
|
+
* at the current zoom and is clamped at viewport emission.
|
|
15
|
+
*/
|
|
16
|
+
export interface ViewportTransform {
|
|
17
|
+
/** 1 at fit; > 1 zoomed in; < 1 zoomed out. */
|
|
18
|
+
readonly zoom: number;
|
|
19
|
+
/** CSS pixels of pan offset, applied after the centered-fit baseline. */
|
|
20
|
+
readonly panX: number;
|
|
21
|
+
readonly panY: number;
|
|
22
|
+
}
|
|
23
|
+
export declare const IDENTITY_VIEWPORT_TRANSFORM: ViewportTransform;
|
|
24
|
+
export interface Viewport {
|
|
25
|
+
/** Where the image is drawn in stage CSS pixels (post-zoom, post-pan). */
|
|
26
|
+
readonly displayRect: Rect;
|
|
27
|
+
/** Display CSS pixels per 1 image pixel (uniform on both axes, post-zoom). */
|
|
28
|
+
readonly scale: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Compute the post-zoom, post-pan display rect for an image inside the stage.
|
|
32
|
+
*
|
|
33
|
+
* At identity, the image is fit-scaled inside the stage minus padding and
|
|
34
|
+
* centered. With a non-identity transform the fit scale is multiplied by
|
|
35
|
+
* `zoom`, then the pan offset is added and clamped so at least 1 image
|
|
36
|
+
* pixel remains inside the inner stage area on each axis.
|
|
37
|
+
*/
|
|
38
|
+
export declare function computeViewport(stage: StageDimensions, image: Size, transform?: ViewportTransform): Viewport;
|
|
39
|
+
export declare function pointImageToDisplay(point: Point, viewport: Viewport): Point;
|
|
40
|
+
export declare function pointDisplayToImage(point: Point, viewport: Viewport): Point;
|
|
41
|
+
export declare function rectImageToDisplay(rect: Rect, viewport: Viewport): Rect;
|
|
42
|
+
export declare function rectDisplayToImage(rect: Rect, viewport: Viewport): Rect;
|
|
43
|
+
//# sourceMappingURL=viewport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../../src/canvas/viewport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,2BAA2B,EAAE,iBAIxC,CAAC;AAEH,MAAM,WAAW,QAAQ;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,IAAI,EACX,SAAS,GAAE,iBAA+C,GACzD,QAAQ,CAgCV;AAsBD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAK3E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAM3E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAOvE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAQvE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type EventListener<T> = (payload: T) => void;
|
|
2
|
+
export type Unsubscribe = () => void;
|
|
3
|
+
export declare class EventBus<TEvents extends Record<string, unknown>> {
|
|
4
|
+
private readonly listeners;
|
|
5
|
+
on<K extends keyof TEvents>(event: K, listener: EventListener<TEvents[K]>): Unsubscribe;
|
|
6
|
+
off<K extends keyof TEvents>(event: K, listener: EventListener<TEvents[K]>): void;
|
|
7
|
+
emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void;
|
|
8
|
+
clear(): void;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/events/event-bus.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;AACpD,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,qBAAa,QAAQ,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyD;IAEnF,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW;IAYvF,GAAG,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAIjF,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAclE,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface Point {
|
|
2
|
+
readonly x: number;
|
|
3
|
+
readonly y: number;
|
|
4
|
+
}
|
|
5
|
+
export interface Rect {
|
|
6
|
+
readonly x: number;
|
|
7
|
+
readonly y: number;
|
|
8
|
+
readonly width: number;
|
|
9
|
+
readonly height: number;
|
|
10
|
+
}
|
|
11
|
+
export interface Size {
|
|
12
|
+
readonly width: number;
|
|
13
|
+
readonly height: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function rectFromPoints(a: Point, b: Point): Rect;
|
|
16
|
+
export declare function rectRight(rect: Rect): number;
|
|
17
|
+
export declare function rectBottom(rect: Rect): number;
|
|
18
|
+
export declare function rectCenter(rect: Rect): Point;
|
|
19
|
+
export declare function pointInRect(point: Point, rect: Rect): boolean;
|
|
20
|
+
export declare function rectsEqual(a: Rect, b: Rect): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Translate a rect by `(dx, dy)`, then clamp it inside `bounds` so that the
|
|
23
|
+
* full rect remains inside (clamping translates further if needed; size is
|
|
24
|
+
* preserved). If the rect is larger than the bounds in either axis, that axis
|
|
25
|
+
* is left at the bounds origin.
|
|
26
|
+
*/
|
|
27
|
+
export declare function translateClampedRect(rect: Rect, dx: number, dy: number, bounds: Rect): Rect;
|
|
28
|
+
/**
|
|
29
|
+
* Clamp a rect so it fits entirely inside `bounds`. If the rect is larger
|
|
30
|
+
* than the bounds in either axis, the rect's extent in that axis is shrunk
|
|
31
|
+
* to fit (preserving the upper-left anchor of `bounds`).
|
|
32
|
+
*/
|
|
33
|
+
export declare function clampRectInside(rect: Rect, bounds: Rect): Rect;
|
|
34
|
+
export declare function roundRect(rect: Rect): Rect;
|
|
35
|
+
//# sourceMappingURL=rect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../src/geometry/rect.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,IAAI,CAMvD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE5C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,CAE5C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAO7D;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,CAG3F;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,CAY9D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAO1C"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { UtilityId } from '../plugins/utility.js';
|
|
2
|
+
/**
|
|
3
|
+
* Immutable snapshot of every registered plugin's state at a single moment.
|
|
4
|
+
* `History` deep-clones on capture so live store writes cannot bleed in.
|
|
5
|
+
*/
|
|
6
|
+
export type SessionSnapshot = ReadonlyMap<UtilityId, unknown>;
|
|
7
|
+
export declare const HISTORY_MAX_ENTRIES = 50;
|
|
8
|
+
export interface UndoResult {
|
|
9
|
+
readonly snapshot: SessionSnapshot;
|
|
10
|
+
/** Utility ids whose state changed between the prior and restored snapshot. */
|
|
11
|
+
readonly changed: ReadonlySet<UtilityId>;
|
|
12
|
+
}
|
|
13
|
+
/** Editor-wide undo/redo store using a snapshot stack. State-only; the editor decides when to commit. */
|
|
14
|
+
export declare class History {
|
|
15
|
+
private shadow;
|
|
16
|
+
private undoStack;
|
|
17
|
+
private redoStack;
|
|
18
|
+
constructor(initial: SessionSnapshot);
|
|
19
|
+
/**
|
|
20
|
+
* Capture a commit. Previous shadow → undo stack; `current` → shadow.
|
|
21
|
+
* Redo is cleared because a new commit branches the history. A commit
|
|
22
|
+
* structurally equal to the shadow is a no-op so duplicates (clicking
|
|
23
|
+
* the same preset twice) don't pollute the undo stack.
|
|
24
|
+
*/
|
|
25
|
+
commit(current: SessionSnapshot): void;
|
|
26
|
+
canUndo(): boolean;
|
|
27
|
+
canRedo(): boolean;
|
|
28
|
+
/** Pop the most recent prior snapshot; `current` goes onto the redo stack. Returns null if undo is empty. */
|
|
29
|
+
undo(current: SessionSnapshot): UndoResult | null;
|
|
30
|
+
/** Pop the most recent redo entry; `current` goes onto the undo stack. Returns null if redo is empty. */
|
|
31
|
+
redo(current: SessionSnapshot): UndoResult | null;
|
|
32
|
+
/** Test/debug helpers; not part of the editor's runtime API. */
|
|
33
|
+
size(): {
|
|
34
|
+
undo: number;
|
|
35
|
+
redo: number;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/history/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAE9D,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;CAC1C;AAED,yGAAyG;AACzG,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,SAAS,CAAyB;gBAE9B,OAAO,EAAE,eAAe;IAIpC;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAUtC,OAAO,IAAI,OAAO;IAIlB,OAAO,IAAI,OAAO;IAIlB,6GAA6G;IAC7G,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,UAAU,GAAG,IAAI;IAQjD,yGAAyG;IACzG,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,UAAU,GAAG,IAAI;IAWjD,gEAAgE;IAChE,IAAI,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;CAGvC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public entry point for `@magicpages/kalotyp-core` — the package's
|
|
3
|
+
* published API surface. Internal barrel files are forbidden (see
|
|
4
|
+
* AGENTS.md); this root entry IS the published interface and is the
|
|
5
|
+
* one intentional exception. Vite's library build tree-shakes through it.
|
|
6
|
+
*/
|
|
7
|
+
export { EventBus } from './events/event-bus.js';
|
|
8
|
+
export type { EventListener, Unsubscribe as EventUnsubscribe } from './events/event-bus.js';
|
|
9
|
+
export { loadImage, type LoadedImage } from './canvas/load-image.js';
|
|
10
|
+
export { computeViewport, IDENTITY_VIEWPORT_TRANSFORM, pointDisplayToImage, pointImageToDisplay, rectDisplayToImage, rectImageToDisplay, type StageDimensions, type Viewport, type ViewportTransform, } from './canvas/viewport.js';
|
|
11
|
+
export { MAX_ZOOM, MIN_ZOOM, ViewportController, type ViewportControllerListener, type ViewportControllerSnapshot, } from './canvas/viewport-controller.js';
|
|
12
|
+
export { bakeCanvasToBlob, canEncodeMime, createBakeCanvas, getBakeContext2D, type BakeCanvas, } from './canvas/bake-canvas.js';
|
|
13
|
+
export { clampRectInside, pointInRect, rectBottom, rectCenter, rectFromPoints, rectRight, rectsEqual, roundRect, translateClampedRect, type Point, type Rect, type Size, } from './geometry/rect.js';
|
|
14
|
+
export { createStore, type Store, type StoreListener } from './state/store.js';
|
|
15
|
+
export { History, HISTORY_MAX_ENTRIES, type SessionSnapshot, type UndoResult, } from './history/history.js';
|
|
16
|
+
export type { EditorEvents, SourceImage, UtilityContext, UtilityHandle, UtilityId, UtilityPlugin, } from './plugins/utility.js';
|
|
17
|
+
export { applyAspectRatio, fitRectToBoundsWithRatio, type AspectAnchor, } from './plugins/crop/aspect-ratio.js';
|
|
18
|
+
export { resizeRectFromHandle, type CornerHandle, type EdgeHandle, type HandleDirection, type ResizeOptions, } from './plugins/crop/resize.js';
|
|
19
|
+
export { filterPresets, isPresetVisible, type CropPreset, type CropPresetFilter, } from './plugins/crop/preset-filter.js';
|
|
20
|
+
export { applyPresetByIndex, initialCropState, type CropState, type InitialCropStateInput, } from './plugins/crop/state.js';
|
|
21
|
+
export { bakeCrop, type CropBakeInput } from './plugins/crop/bake.js';
|
|
22
|
+
export { deriveOutputName, encodeSourceImage, resolveOutputMime, type EncodeOptions, } from './pipeline/encode.js';
|
|
23
|
+
export { clampQuality, DEFAULT_OUTPUT_STATE, ENCODABLE_MIMES, type OutputMimeChoice, type OutputState, setOutputMime, setOutputQuality, setStripMetadata, } from './output/state.js';
|
|
24
|
+
export { copyJpegExif } from './pipeline/exif.js';
|
|
25
|
+
export { runUtilityChain, type ChainLink } from './pipeline/run-chain.js';
|
|
26
|
+
export { initialFlipState, isFlipNoOp, toggleFlip, type FlipState, } from './plugins/flip/state.js';
|
|
27
|
+
export { bakeFlip } from './plugins/flip/bake.js';
|
|
28
|
+
export { effectiveAngleDeg, FREE_ANGLE_MAX, FREE_ANGLE_MIN, FREE_ANGLE_STEP, initialRotateState, isRotateNoOp, rotateClockwise, rotateCounterClockwise, setFreeAngle, type RotateState, } from './plugins/rotate/state.js';
|
|
29
|
+
export { bakeRotate } from './plugins/rotate/bake.js';
|
|
30
|
+
export { largestInscribedRect } from './plugins/rotate/inscribe.js';
|
|
31
|
+
export { effectivePercent, initialResizeState, isResizeNoOp, MAX_DIMENSION as RESIZE_MAX_DIMENSION, MIN_DIMENSION as RESIZE_MIN_DIMENSION, resolveOutputSize, setHeightPx, setLockAspect, setPercent, setWidthPx, type ResizeState, } from './plugins/resize/state.js';
|
|
32
|
+
export { bakeResize } from './plugins/resize/bake.js';
|
|
33
|
+
export { DEFAULT_FINETUNE_STATE, FINETUNE_ADJUSTMENTS, FINETUNE_MAX, FINETUNE_MIN, FINETUNE_STEP, type FinetuneKey, type FinetuneState, initialFinetuneState, isFinetuneNoOp, resetAllFinetune, resetFinetune, setFinetune, } from './plugins/finetune/state.js';
|
|
34
|
+
export { applyClarity, applyFinetuneLutAndSaturation, applyFinetuneToImageData, boxBlur3x3, buildFinetuneLut, type RasterImage, } from './plugins/finetune/math.js';
|
|
35
|
+
export { bakeFinetune } from './plugins/finetune/bake.js';
|
|
36
|
+
export { FILTER_PRESETS, type FilterPreset, type FilterPresetId, findActivePreset, finetuneStatesEqual, } from './plugins/filter/presets.js';
|
|
37
|
+
export { type AnnotateState, type AnnotateTool, type ArrowShape, type CreateCenteredShapeContext, type EllipseShape, type FreehandShape, type HighlightShape, type KeyboardPlaceableKind, type KeyboardPlaceableShape, type RectShape, type Shape, type ShapeKind, type StylePalette, type TextShape, addShape, assertNever, createCenteredShape, defaultStylePalette, deleteShape, DEFAULT_PALETTE_COLOR, DEFAULT_STROKE_WIDTH, findShape, FREEHAND_DEFAULT_STROKE, HIGHLIGHT_DEFAULT_COLOR, HIGHLIGHT_DEFAULT_STROKE, initialAnnotateState, isKeyboardPlaceableKind, KEYBOARD_PLACEABLE_KINDS, mintShapeId, mirrorShape, normaliseRectExtent, replaceShape, rotateShape, selectShape, setActiveTool, setStyle, TEXT_DEFAULT_FONT_SIZE, transformShapes, translateShape, } from './plugins/annotate/state.js';
|
|
38
|
+
export { ALL_SELECTION_HANDLES, alignToOrigin, boundingBoxOf, estimateTextSize, rectFromHandleDrag, selectionHandlePositions, type SelectionHandle, } from './plugins/annotate/geometry.js';
|
|
39
|
+
export { hitTest, pickShape, PICK_TOLERANCE, } from './plugins/annotate/hit-test.js';
|
|
40
|
+
export { decimatePoints, MIN_SAMPLE_DISTANCE, tracePath, } from './plugins/annotate/smooth.js';
|
|
41
|
+
export { bakeAnnotate, paintShape, SYSTEM_FONT_STACK, type AnnotateBakeInput, } from './plugins/annotate/bake.js';
|
|
42
|
+
export { type CreateCenteredRegionContext as CreateCenteredRedactRegionContext, DEFAULT_REDACT_COLOR, DEFAULT_REDACT_MODE, type InitialRedactStateInput, REDACT_MODES, type RedactMode, type RedactRegion, type RedactState, addRegion, createCenteredRegion as createCenteredRedactRegion, deleteRegion as deleteRedactRegion, findRegion as findRedactRegion, initialRedactState, mintRegionId, mirrorRegions as mirrorRedactRegions, normaliseRegionExtent as normaliseRedactExtent, regionBoundingBox, replaceRegion as replaceRedactRegion, revalidateAgainstBounds as revalidateRedactAgainstBounds, rotateRegions as rotateRedactRegions, selectRegion as selectRedactRegion, selectedRegionOf as selectedRedactRegionOf, setCurrentColor as setRedactCurrentColor, setCurrentMode as setRedactCurrentMode, setRegionColor as setRedactRegionColor, setRegionMode as setRedactRegionMode, translateRegions as translateRedactRegions, } from './plugins/redact/state.js';
|
|
43
|
+
export { bakeRedact, paintRegion as paintRedactRegion, type RedactBakeInput, } from './plugins/redact/bake.js';
|
|
44
|
+
export { DEFAULT_FRAME_STATE, FRAME_PRESETS, FRAME_PRESET_IDS, type FramePreset, type FramePresetId, type FrameState, findFramePreset, initialFrameState, isFrameNoOp, setFrameColor, setFramePreset, } from './plugins/frame/state.js';
|
|
45
|
+
export { bakeFrame, frameOutputSize, paintInsideFrame } from './plugins/frame/bake.js';
|
|
46
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|