@rtsee/utilities-ui 0.0.44 → 0.0.46

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,39 @@
1
+ /**
2
+ * Client-side image optimization (same approach as the cropper: resize + JPEG @ 70% quality).
3
+ * Runs entirely in the browser (canvas), so no server compute is needed.
4
+ */
5
+ export type RTSeeOptimizedImageMimeType = "image/jpeg" | "image/webp" | "image/png";
6
+ export interface IRTSeeImageOptimizeOptions {
7
+ /** Longest edge of the output image, px (images are never upscaled) */
8
+ maxDimension?: number;
9
+ /** 0..1 encoder quality (ignored for png) */
10
+ quality?: number;
11
+ mimeType?: RTSeeOptimizedImageMimeType;
12
+ }
13
+ export interface IRTSeeOptimizedImage {
14
+ blob: Blob;
15
+ width: number;
16
+ height: number;
17
+ /** bytes */
18
+ size: number;
19
+ /** bytes of the source image */
20
+ originalSize: number;
21
+ }
22
+ export declare const RTSEE_IMAGE_OPTIMIZATION_DEFAULTS: Required<IRTSeeImageOptimizeOptions>;
23
+ /** Images above this size are considered not web-optimized */
24
+ export declare const RTSEE_IMAGE_OPTIMIZATION_THRESHOLD_BYTES: number;
25
+ /**
26
+ * Downloads an image as a Blob. S3 objects must be served with CORS headers;
27
+ * `no-store` avoids reusing a cached non-CORS response of the same url (rendered by an <img>).
28
+ */
29
+ export declare function fetchImageBlob(url: string): Promise<Blob>;
30
+ export declare function dataUrlToBlob(dataUrl: string): Blob;
31
+ export declare function blobToDataUrl(blob: Blob): Promise<string>;
32
+ /** Bytes -> megabytes, e.g. 1.23 */
33
+ export declare function bytesToMb(bytes: number, fractionDigits?: number): string;
34
+ /**
35
+ * Resizes (longest edge <= maxDimension) and re-encodes an image.
36
+ * Large downscales are done in halving steps, which keeps the result sharp without heavy filtering.
37
+ */
38
+ export declare function optimizeImage(source: Blob | string, options?: IRTSeeImageOptimizeOptions): Promise<IRTSeeOptimizedImage>;
39
+ //# sourceMappingURL=image-optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-optimizer.d.ts","sourceRoot":"","sources":["../../../../../src/cropper/helpers/image-optimizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,2BAA2B,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;AAEpF,MAAM,WAAW,0BAA0B;IACzC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,2BAA2B,CAAC;CACxC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,iCAAiC,EAAE,QAAQ,CAAC,0BAA0B,CAIlF,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,wCAAwC,EAAE,MAAmB,CAAC;AAI3E;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB/D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAUnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAOzD;AAED,oCAAoC;AACpC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,GAAE,MAAU,GAAG,MAAM,CAE3E;AAwCD;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,IAAI,GAAG,MAAM,EACrB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,oBAAoB,CAAC,CAgE/B"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Client-side image optimization (same approach as the cropper: resize + JPEG @ 70% quality).
3
+ * Runs entirely in the browser (canvas), so no server compute is needed.
4
+ */
5
+ export const RTSEE_IMAGE_OPTIMIZATION_DEFAULTS = {
6
+ maxDimension: 1024,
7
+ quality: 0.7,
8
+ mimeType: "image/jpeg",
9
+ };
10
+ /** Images above this size are considered not web-optimized */
11
+ export const RTSEE_IMAGE_OPTIMIZATION_THRESHOLD_BYTES = 400 * 1024;
12
+ const isBrowser = () => typeof window !== "undefined" && typeof document !== "undefined";
13
+ /**
14
+ * Downloads an image as a Blob. S3 objects must be served with CORS headers;
15
+ * `no-store` avoids reusing a cached non-CORS response of the same url (rendered by an <img>).
16
+ */
17
+ export async function fetchImageBlob(url) {
18
+ if (url.startsWith("data:")) {
19
+ return dataUrlToBlob(url);
20
+ }
21
+ const response = await fetch(url, {
22
+ mode: "cors",
23
+ credentials: "omit",
24
+ cache: "no-store",
25
+ });
26
+ if (!response.ok) {
27
+ throw new Error(`Failed to download image (${response.status})`);
28
+ }
29
+ return response.blob();
30
+ }
31
+ export function dataUrlToBlob(dataUrl) {
32
+ const [header, data] = dataUrl.split(",");
33
+ const mimeType = header.match(/data:([^;]+)/)?.[1] || "application/octet-stream";
34
+ const isBase64 = header.includes(";base64");
35
+ const raw = isBase64 ? atob(data) : decodeURIComponent(data);
36
+ const bytes = new Uint8Array(raw.length);
37
+ for (let i = 0; i < raw.length; i++) {
38
+ bytes[i] = raw.charCodeAt(i);
39
+ }
40
+ return new Blob([bytes], { type: mimeType });
41
+ }
42
+ export function blobToDataUrl(blob) {
43
+ return new Promise((resolve, reject) => {
44
+ const reader = new FileReader();
45
+ reader.onload = () => resolve(reader.result);
46
+ reader.onerror = () => reject(reader.error);
47
+ reader.readAsDataURL(blob);
48
+ });
49
+ }
50
+ /** Bytes -> megabytes, e.g. 1.23 */
51
+ export function bytesToMb(bytes, fractionDigits = 2) {
52
+ return (bytes / (1024 * 1024)).toFixed(fractionDigits);
53
+ }
54
+ async function decodeImage(blob) {
55
+ if (typeof createImageBitmap === "function") {
56
+ try {
57
+ const bitmap = await createImageBitmap(blob);
58
+ return { image: bitmap, width: bitmap.width, height: bitmap.height, release: () => bitmap.close() };
59
+ }
60
+ catch {
61
+ // fall back to <img> decoding below (e.g. older Safari)
62
+ }
63
+ }
64
+ const objectUrl = URL.createObjectURL(blob);
65
+ const image = await new Promise((resolve, reject) => {
66
+ const img = new Image();
67
+ img.onload = () => resolve(img);
68
+ img.onerror = () => reject(new Error("Failed to decode image"));
69
+ img.src = objectUrl;
70
+ });
71
+ return {
72
+ image,
73
+ width: image.naturalWidth || image.width,
74
+ height: image.naturalHeight || image.height,
75
+ release: () => URL.revokeObjectURL(objectUrl),
76
+ };
77
+ }
78
+ function canvasToBlob(canvas, mimeType, quality) {
79
+ return new Promise((resolve, reject) => {
80
+ canvas.toBlob((blob) => (blob ? resolve(blob) : reject(new Error("Failed to encode image"))), mimeType, quality);
81
+ });
82
+ }
83
+ /**
84
+ * Resizes (longest edge <= maxDimension) and re-encodes an image.
85
+ * Large downscales are done in halving steps, which keeps the result sharp without heavy filtering.
86
+ */
87
+ export async function optimizeImage(source, options = {}) {
88
+ if (!isBrowser()) {
89
+ throw new Error("optimizeImage is only available in the browser");
90
+ }
91
+ const { maxDimension, quality, mimeType } = { ...RTSEE_IMAGE_OPTIMIZATION_DEFAULTS, ...options };
92
+ const sourceBlob = typeof source === "string" ? await fetchImageBlob(source) : source;
93
+ const decoded = await decodeImage(sourceBlob);
94
+ try {
95
+ const scale = Math.min(1, maxDimension / Math.max(decoded.width, decoded.height));
96
+ const targetWidth = Math.max(1, Math.round(decoded.width * scale));
97
+ const targetHeight = Math.max(1, Math.round(decoded.height * scale));
98
+ let current = decoded.image;
99
+ let currentWidth = decoded.width;
100
+ let currentHeight = decoded.height;
101
+ // Step down by halves while we're more than 2x away from the target size
102
+ while (currentWidth / 2 > targetWidth && currentHeight / 2 > targetHeight) {
103
+ const step = document.createElement("canvas");
104
+ step.width = Math.round(currentWidth / 2);
105
+ step.height = Math.round(currentHeight / 2);
106
+ const stepCtx = step.getContext("2d");
107
+ if (!stepCtx) {
108
+ break;
109
+ }
110
+ stepCtx.imageSmoothingEnabled = true;
111
+ stepCtx.imageSmoothingQuality = "high";
112
+ stepCtx.drawImage(current, 0, 0, step.width, step.height);
113
+ current = step;
114
+ currentWidth = step.width;
115
+ currentHeight = step.height;
116
+ }
117
+ const canvas = document.createElement("canvas");
118
+ canvas.width = targetWidth;
119
+ canvas.height = targetHeight;
120
+ const ctx = canvas.getContext("2d");
121
+ if (!ctx) {
122
+ throw new Error("Canvas 2d context is not available");
123
+ }
124
+ if (mimeType === "image/jpeg") {
125
+ // JPEG has no alpha channel - flatten transparent pixels on white instead of black
126
+ ctx.fillStyle = "#ffffff";
127
+ ctx.fillRect(0, 0, targetWidth, targetHeight);
128
+ }
129
+ ctx.imageSmoothingEnabled = true;
130
+ ctx.imageSmoothingQuality = "high";
131
+ ctx.drawImage(current, 0, 0, targetWidth, targetHeight);
132
+ const blob = await canvasToBlob(canvas, mimeType, quality);
133
+ return {
134
+ blob,
135
+ width: targetWidth,
136
+ height: targetHeight,
137
+ size: blob.size,
138
+ originalSize: sourceBlob.size,
139
+ };
140
+ }
141
+ finally {
142
+ decoded.release();
143
+ }
144
+ }
145
+ //# sourceMappingURL=image-optimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-optimizer.js","sourceRoot":"","sources":["../../../../../src/cropper/helpers/image-optimizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./image-optimizer";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/cropper/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./image-optimizer";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/cropper/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from "./models";
2
2
  export * from "./interfaces";
3
+ export * from "./helpers";
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cropper/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cropper/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from "./models";
2
2
  export * from "./interfaces";
3
+ export * from "./helpers";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cropper/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cropper/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { EventEmitter } from "events";
2
2
  import { RTSeeCropperImage } from "@rtsee/utilities-ui";
3
3
  import { ImageCroppedEvent } from "ngx-image-cropper";
4
+ import { IRTSeeImageOptimizeOptions, IRTSeeOptimizedImage } from "../helpers/image-optimizer";
4
5
  export interface CropperOptionsInterface {
5
6
  aspectRatio: number;
6
7
  resizeToWidth?: number;
@@ -17,6 +18,11 @@ export declare class RTSeeImageCropper extends EventEmitter {
17
18
  resizeToWidth: number;
18
19
  aspectRatioConfigurable: boolean;
19
20
  constructor(options?: CropperOptionsInterface);
21
+ /**
22
+ * Client-side web optimization (resize to <= 1024px longest edge + JPEG @ 70%),
23
+ * the same output the cropper produces for uploaded images.
24
+ */
25
+ static optimize(source: Blob | string, options?: IRTSeeImageOptimizeOptions): Promise<IRTSeeOptimizedImage>;
20
26
  init(options: CropperOptionsInterface): void;
21
27
  addImage(options: {
22
28
  file: File;
@@ -1 +1 @@
1
- {"version":3,"file":"Cropper.d.ts","sourceRoot":"","sources":["../../../../../src/cropper/models/Cropper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;CAC1D;AAED,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,iBAAiB,EAAE,CAAM;IACjC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,cAAc,EAAE,kBAAkB,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC;gBAErB,OAAO,CAAC,EAAE,uBAAuB;IAO7C,IAAI,CAAC,OAAO,EAAE,uBAAuB;IAMrC,QAAQ,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE;IAQhC,KAAK;IAIL,cAAc,CAAC,KAAK,EAAE,MAAM;IAI5B,mBAAmB,IAAI,IAAI;IAI3B,oBAAoB,IAAI,OAAO;IAK/B,SAAS;IAUT,cAAc,CAAC,IAAI,EAAE,kBAAkB;IAIvC,SAAS,CAAC,IAAI,EAAE,IAAI;IAWpB,IAAI;CAGL"}
1
+ {"version":3,"file":"Cropper.d.ts","sourceRoot":"","sources":["../../../../../src/cropper/models/Cropper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EAErB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;CAC1D;AAED,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,iBAAiB,EAAE,CAAM;IACjC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,cAAc,EAAE,kBAAkB,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC;gBAErB,OAAO,CAAC,EAAE,uBAAuB;IAO7C;;;OAGG;IACH,MAAM,CAAC,QAAQ,CACb,MAAM,EAAE,IAAI,GAAG,MAAM,EACrB,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,oBAAoB,CAAC;IAIhC,IAAI,CAAC,OAAO,EAAE,uBAAuB;IAMrC,QAAQ,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE;IAQhC,KAAK;IAIL,cAAc,CAAC,KAAK,EAAE,MAAM;IAI5B,mBAAmB,IAAI,IAAI;IAI3B,oBAAoB,IAAI,OAAO;IAK/B,SAAS;IAUT,cAAc,CAAC,IAAI,EAAE,kBAAkB;IAIvC,SAAS,CAAC,IAAI,EAAE,IAAI;IAWpB,IAAI;CAGL"}
@@ -1,5 +1,6 @@
1
1
  import { EventEmitter } from "events";
2
2
  import { RTSeeCropperImage } from "@rtsee/utilities-ui";
3
+ import { optimizeImage, } from "../helpers/image-optimizer";
3
4
  export class RTSeeImageCropper extends EventEmitter {
4
5
  aspectRatio;
5
6
  images = [];
@@ -13,6 +14,13 @@ export class RTSeeImageCropper extends EventEmitter {
13
14
  this.init(options);
14
15
  }
15
16
  }
17
+ /**
18
+ * Client-side web optimization (resize to <= 1024px longest edge + JPEG @ 70%),
19
+ * the same output the cropper produces for uploaded images.
20
+ */
21
+ static optimize(source, options) {
22
+ return optimizeImage(source, options);
23
+ }
16
24
  init(options) {
17
25
  this.aspectRatio = options.aspectRatio || 1;
18
26
  this.resizeToWidth = options.resizeToWidth || null;
@@ -1 +1 @@
1
- {"version":3,"file":"Cropper.js","sourceRoot":"","sources":["../../../../../src/cropper/models/Cropper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAaxD,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACjD,WAAW,CAAS;IACpB,MAAM,GAAwB,EAAE,CAAC;IACjC,WAAW,CAAoB;IAC/B,cAAc,CAAqB;IACnC,aAAa,CAAS;IACtB,uBAAuB,CAAU;IAEjC,YAAY,OAAiC;QAC3C,KAAK,EAAE,CAAC;QACR,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAgC;QACnC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;QACnD,IAAI,CAAC,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IACjE,CAAC;IAED,QAAQ,CAAC,OAAuB;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,IAAI,iBAAiB,CAAC;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CACH,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,oBAAoB;QAClB,MAAM,SAAS,GAAW,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,SAAS;QACP,MAAM,SAAS,GAAW,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEhE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,cAAc,CAAC,IAAwB;QACrC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,IAAU;QAClB,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAEtC,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;YAChC,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI;QACF,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;CACF"}
1
+ {"version":3,"file":"Cropper.js","sourceRoot":"","sources":["../../../../../src/cropper/models/Cropper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAGL,aAAa,GACd,MAAM,4BAA4B,CAAC;AAYpC,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACjD,WAAW,CAAS;IACpB,MAAM,GAAwB,EAAE,CAAC;IACjC,WAAW,CAAoB;IAC/B,cAAc,CAAqB;IACnC,aAAa,CAAS;IACtB,uBAAuB,CAAU;IAEjC,YAAY,OAAiC;QAC3C,KAAK,EAAE,CAAC;QACR,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,QAAQ,CACb,MAAqB,EACrB,OAAoC;QAEpC,OAAO,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,OAAgC;QACnC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;QACnD,IAAI,CAAC,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IACjE,CAAC;IAED,QAAQ,CAAC,OAAuB;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,IAAI,iBAAiB,CAAC;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CACH,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,oBAAoB;QAClB,MAAM,SAAS,GAAW,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,SAAS;QACP,MAAM,SAAS,GAAW,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEhE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,cAAc,CAAC,IAAwB;QACrC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,IAAU;QAClB,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAEtC,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;YAChC,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI;QACF,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -14,9 +14,22 @@ export declare class RTSeeImageUploader extends EventEmitter {
14
14
  peer: IPeer;
15
15
  awaitsUploadOrCrop: boolean;
16
16
  uploadedPhotos: IUploadedFile[];
17
- uploadedPhotoPreview: string | null;
18
17
  form?: any;
19
18
  onSubmitForm?: () => void;
19
+ static readonly OPTIMIZATION_THRESHOLD_BYTES: number;
20
+ /** bytes of the currently previewed image (null while unknown) */
21
+ currentImageSize: number | null;
22
+ optimizing: boolean;
23
+ optimizationError: string | null;
24
+ private currentImageBlob;
25
+ private sizeCheckToken;
26
+ private _uploadedPhotoPreview;
27
+ get uploadedPhotoPreview(): string | null;
28
+ /** Preview url is assigned from many places, so the size is re-checked whenever it changes */
29
+ set uploadedPhotoPreview(value: string | null);
30
+ get needsOptimization(): boolean;
31
+ /** e.g. "1.23" */
32
+ get currentImageSizeMb(): string;
20
33
  constructor(options: IRTSeeImageUploaderOptions);
21
34
  init(): void;
22
35
  initializeCropper(): void;
@@ -31,5 +44,17 @@ export declare class RTSeeImageUploader extends EventEmitter {
31
44
  onUploadCompleted(response: IUploadedFile[]): void;
32
45
  uploadAllImages(): void;
33
46
  applyImageUrl(imageUrl: string, autoSubmitForm?: boolean): void;
47
+ /**
48
+ * Downloads the previewed image to learn its size (the blob is kept for optimization).
49
+ * Requires the image host (S3) to serve CORS headers; failures just hide the optimize hint.
50
+ */
51
+ refreshImageSize(): Promise<void>;
52
+ /**
53
+ * Optimizes the current image client-side (RTSeeImageCropper.optimize), uploads it to s3
54
+ * and applies the new url (propagated to the parent form via the `completed` event).
55
+ */
56
+ optimizeCurrentImage(): Promise<string | null>;
57
+ /** Uploads a single blob through the regular s3 upload flow (no dashboard) */
58
+ private uploadBlob;
34
59
  }
35
60
  //# sourceMappingURL=ImageUploader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageUploader.d.ts","sourceRoot":"","sources":["../../../../../src/image-uploader/models/ImageUploader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,aAAa,EAEb,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,OAAO,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,KAAK,CAAC;IAGZ,kBAAkB,EAAE,OAAO,CAAS;IACpC,cAAc,EAAE,aAAa,EAAE,CAAM;IACrC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;gBAEd,OAAO,EAAE,0BAA0B;IAuB/C,IAAI;IAOJ,iBAAiB;IASjB,kBAAkB;IAalB,2BAA2B;IAI3B,4BAA4B;IAM5B,aAAa;IAQb,WAAW,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE;IAQhC,kBAAkB;IAKlB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE;IAW3C,eAAe;IAef,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAE,OAAc;CAwB/D"}
1
+ {"version":3,"file":"ImageUploader.d.ts","sourceRoot":"","sources":["../../../../../src/image-uploader/models/ImageUploader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,aAAa,EAEb,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAa,MAAM,aAAa,CAAC;AAS/C,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,OAAO,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,KAAK,CAAC;IAGZ,kBAAkB,EAAE,OAAO,CAAS;IACpC,cAAc,EAAE,aAAa,EAAE,CAAM;IACrC,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAG1B,MAAM,CAAC,QAAQ,CAAC,4BAA4B,EAAE,MAAM,CAA4C;IAChG,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACvC,UAAU,EAAE,OAAO,CAAS;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,qBAAqB,CAAuB;IAEpD,IAAI,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAExC;IAED,8FAA8F;IAC9F,IAAI,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAM5C;IAED,IAAI,iBAAiB,IAAI,OAAO,CAM/B;IAED,kBAAkB;IAClB,IAAI,kBAAkB,IAAI,MAAM,CAE/B;gBAEW,OAAO,EAAE,0BAA0B;IAuB/C,IAAI;IAOJ,iBAAiB;IASjB,kBAAkB;IAalB,2BAA2B;IAI3B,4BAA4B;IAM5B,aAAa;IAQb,WAAW,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE;IAQhC,kBAAkB;IAKlB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE;IAW3C,eAAe;IAef,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAE,OAAc;IAyB9D;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BvC;;;OAGG;IACG,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmCpD,8EAA8E;YAChE,UAAU;CA+BzB"}
@@ -1,6 +1,8 @@
1
1
  import { EventEmitter } from "events";
2
2
  import { RTSeeFileUploader, RTSeeImageCropper, } from "@rtsee/utilities-ui";
3
+ import { RTSeeCore } from "@rtsee/core";
3
4
  import { sanitizeImageUrl } from "../helpers/url.helper";
5
+ import { bytesToMb, fetchImageBlob, RTSEE_IMAGE_OPTIMIZATION_THRESHOLD_BYTES, } from "../../cropper/helpers/image-optimizer";
4
6
  export class RTSeeImageUploader extends EventEmitter {
5
7
  aspectRatio;
6
8
  resizeTo;
@@ -15,9 +17,37 @@ export class RTSeeImageUploader extends EventEmitter {
15
17
  //ui props
16
18
  awaitsUploadOrCrop = false;
17
19
  uploadedPhotos = [];
18
- uploadedPhotoPreview;
19
20
  form;
20
21
  onSubmitForm;
22
+ // optimization (images > threshold can be re-encoded client-side and re-uploaded)
23
+ static OPTIMIZATION_THRESHOLD_BYTES = RTSEE_IMAGE_OPTIMIZATION_THRESHOLD_BYTES;
24
+ /** bytes of the currently previewed image (null while unknown) */
25
+ currentImageSize = null;
26
+ optimizing = false;
27
+ optimizationError = null;
28
+ currentImageBlob = null;
29
+ sizeCheckToken = 0;
30
+ _uploadedPhotoPreview = null;
31
+ get uploadedPhotoPreview() {
32
+ return this._uploadedPhotoPreview;
33
+ }
34
+ /** Preview url is assigned from many places, so the size is re-checked whenever it changes */
35
+ set uploadedPhotoPreview(value) {
36
+ const changed = value !== this._uploadedPhotoPreview;
37
+ this._uploadedPhotoPreview = value;
38
+ if (changed) {
39
+ void this.refreshImageSize();
40
+ }
41
+ }
42
+ get needsOptimization() {
43
+ return (!!this.uploadedPhotoPreview &&
44
+ this.currentImageSize !== null &&
45
+ this.currentImageSize > RTSeeImageUploader.OPTIMIZATION_THRESHOLD_BYTES);
46
+ }
47
+ /** e.g. "1.23" */
48
+ get currentImageSizeMb() {
49
+ return this.currentImageSize !== null ? bytesToMb(this.currentImageSize) : "";
50
+ }
21
51
  constructor(options) {
22
52
  super();
23
53
  this.peer = options.peer;
@@ -132,5 +162,99 @@ export class RTSeeImageUploader extends EventEmitter {
132
162
  }, 0);
133
163
  }
134
164
  }
165
+ /**
166
+ * Downloads the previewed image to learn its size (the blob is kept for optimization).
167
+ * Requires the image host (S3) to serve CORS headers; failures just hide the optimize hint.
168
+ */
169
+ async refreshImageSize() {
170
+ const token = ++this.sizeCheckToken;
171
+ const url = this.uploadedPhotoPreview;
172
+ this.currentImageSize = null;
173
+ this.currentImageBlob = null;
174
+ this.optimizationError = null;
175
+ if (!url || typeof window === "undefined") {
176
+ return;
177
+ }
178
+ try {
179
+ const blob = await fetchImageBlob(url);
180
+ if (token !== this.sizeCheckToken) {
181
+ return; // preview changed meanwhile
182
+ }
183
+ this.currentImageBlob = blob;
184
+ this.currentImageSize = blob.size;
185
+ this.emit("changed");
186
+ }
187
+ catch (e) {
188
+ if (token === this.sizeCheckToken) {
189
+ console.warn("[RTSeeImageUploader] Unable to determine image size:", e);
190
+ }
191
+ }
192
+ }
193
+ /**
194
+ * Optimizes the current image client-side (RTSeeImageCropper.optimize), uploads it to s3
195
+ * and applies the new url (propagated to the parent form via the `completed` event).
196
+ */
197
+ async optimizeCurrentImage() {
198
+ if (this.optimizing || !this.uploadedPhotoPreview) {
199
+ return null;
200
+ }
201
+ this.optimizing = true;
202
+ this.optimizationError = null;
203
+ this.emit("changed");
204
+ try {
205
+ const source = this.currentImageBlob || (await fetchImageBlob(this.uploadedPhotoPreview));
206
+ const optimized = await RTSeeImageCropper.optimize(source);
207
+ if (optimized.size >= source.size) {
208
+ throw new Error("Image is already optimized");
209
+ }
210
+ const uploadedUrl = await this.uploadBlob(optimized.blob);
211
+ // Same path as cropped uploads: updates preview + emits `completed` (form fields pick it up)
212
+ this.onUploadCompleted([{ url: uploadedUrl, file: optimized.blob }]);
213
+ // The optimized blob is already known - skip re-downloading it
214
+ this.sizeCheckToken++;
215
+ this.currentImageBlob = optimized.blob;
216
+ this.currentImageSize = optimized.size;
217
+ return uploadedUrl;
218
+ }
219
+ catch (e) {
220
+ console.error("[RTSeeImageUploader] Image optimization failed:", e);
221
+ this.optimizationError = e?.message || "Image optimization failed";
222
+ return null;
223
+ }
224
+ finally {
225
+ this.optimizing = false;
226
+ this.emit("changed");
227
+ }
228
+ }
229
+ /** Uploads a single blob through the regular s3 upload flow (no dashboard) */
230
+ async uploadBlob(blob) {
231
+ const uploader = new RTSeeFileUploader({
232
+ isModalWindow: false,
233
+ // headless: no dashboard is mounted without a drag zone
234
+ dragZoneSelector: "",
235
+ maxNumberOfFiles: 1,
236
+ minNumberOfFiles: 1,
237
+ companionUrl: this.companionUrl,
238
+ peer: this.peer,
239
+ });
240
+ try {
241
+ uploader.addFile({
242
+ name: `optimized-${RTSeeCore.uuidv4()}.jpg`,
243
+ type: blob.type || "image/jpeg",
244
+ data: blob,
245
+ });
246
+ const result = await uploader.upload();
247
+ const uploaded = result
248
+ ? uploader.parseUploaderImages(result)[0]
249
+ : undefined;
250
+ if (!uploaded?.url) {
251
+ throw new Error("Optimized image upload failed");
252
+ }
253
+ return uploaded.url;
254
+ }
255
+ finally {
256
+ uploader.uppyInstance?.destroy();
257
+ }
258
+ }
135
259
  }
136
260
  //# sourceMappingURL=ImageUploader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageUploader.js","sourceRoot":"","sources":["../../../../../src/image-uploader/models/ImageUploader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ImageUploader.js","sourceRoot":"","sources":["../../../../../src/image-uploader/models/ImageUploader.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rtsee/utilities-ui",
3
- "version": "0.0.44",
3
+ "version": "0.0.46",
4
4
  "license": "ISC",
5
5
  "private": false,
6
6
  "main": "dist/utilities-ui/src/index",
@@ -40,5 +40,5 @@
40
40
  "publishConfig": {
41
41
  "access": "public"
42
42
  },
43
- "gitHead": "dc10dc47553027689d194c40c00bef8b3c5d45f4"
43
+ "gitHead": "b103c5583d87f361e10ab55e44807600d573b588"
44
44
  }