@autorender/sdk-core 0.1.28 → 0.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -105,6 +105,21 @@ const attrs = AR.responsiveImageAttributes({
105
105
  const dpr = AR.getDPR(); // 1 or 2
106
106
  ```
107
107
 
108
+ ## Playground
109
+
110
+ A **vanilla TypeScript + Vite** sample lives in [`playground/html`](../../playground/html). It uses `createUploader` and `createAR` from `@autorender/sdk-core` (no framework adapter).
111
+
112
+ From the **repository root**:
113
+
114
+ ```bash
115
+ npm install --prefix playground/html
116
+ npm run dev --prefix playground/html
117
+ ```
118
+
119
+ Entry: `playground/html/src/main.ts` and `style.css`.
120
+
121
+ For richer **ViewTag + uploader** examples (React components wrapping the same core), see [`playground/react`](../../playground/react) and the other framework playgrounds in the [root README](../../README.md) (section **Development → Playgrounds**).
122
+
108
123
  ## API Reference
109
124
 
110
125
  ### `createAR(config: CreateARConfig): ARInstance`
@@ -117,7 +132,6 @@ Creates a new AutoRender client instance for image transformations.
117
132
  - `defaults?: { f?: string, q?: string | number }` - Default transformations
118
133
  - `deviceBreakpoints?: number[]` - Device breakpoints for responsive images
119
134
  - `imageBreakpoints?: number[]` - Image breakpoints for responsive images
120
- - `connectionQuality?: 'auto' | '2g' | '3g' | '4g' | 'wifi'` - Connection quality override
121
135
 
122
136
  ### `ARInstance`
123
137
 
package/dist/index.cjs CHANGED
@@ -25,6 +25,7 @@ __export(src_exports, {
25
25
  detectBestFormat: () => detectBestFormat,
26
26
  encodeAssetPathForDelivery: () => encodeAssetPathForDelivery,
27
27
  getBestFormatSync: () => getBestFormatSync,
28
+ isGifFormatOutput: () => isGifFormatOutput,
28
29
  registerAutorenderUploaderElement: () => registerAutorenderUploaderElement,
29
30
  resetFormatCache: () => resetFormatCache
30
31
  });
@@ -2982,7 +2983,35 @@ function getDPR() {
2982
2983
  }
2983
2984
 
2984
2985
  // src/viewtag/transform.ts
2985
- function buildTransformString(transform, defaults, enableDPR = true, connectionQuality) {
2986
+ function normalizePosition(value) {
2987
+ const normalized = value.trim().toLowerCase();
2988
+ const positionMap = {
2989
+ center: "c",
2990
+ "top-left": "tl",
2991
+ "top-right": "tr",
2992
+ "bottom-left": "bl",
2993
+ "bottom-right": "br",
2994
+ top: "t",
2995
+ bottom: "b",
2996
+ left: "l",
2997
+ right: "r",
2998
+ p_c: "c",
2999
+ p_tl: "tl",
3000
+ p_tr: "tr",
3001
+ p_bl: "bl",
3002
+ p_br: "br",
3003
+ p_t: "t",
3004
+ p_b: "b",
3005
+ p_l: "l",
3006
+ p_r: "r"
3007
+ };
3008
+ return positionMap[normalized] || normalized;
3009
+ }
3010
+ function isGifFormatOutput(transform) {
3011
+ const f = transform?.f;
3012
+ return typeof f === "string" && f.toLowerCase() === "gif";
3013
+ }
3014
+ function buildTransformString(transform, defaults, enableDPR = true) {
2986
3015
  const parts = [];
2987
3016
  const addPart = (param, value) => {
2988
3017
  if (value === void 0 || value === null) return;
@@ -3091,16 +3120,24 @@ function buildTransformString(transform, defaults, enableDPR = true, connectionQ
3091
3120
  addPart("c_", fitMap[transform.fit] || transform.fit);
3092
3121
  }
3093
3122
  if (transform.ar) addPart("ar_", transform.ar);
3094
- if (transform.p) addPart("p_", transform.p);
3095
- if (transform.ps) addPart("ps_", transform.ps);
3123
+ if (transform.position) addPart("p_", normalizePosition(transform.position));
3124
+ if (transform.position_startagy) {
3125
+ const strategy = String(transform.position_startagy).trim().toLowerCase().replace(/^ps_/, "");
3126
+ if (strategy === "entropy" || strategy === "attention") {
3127
+ addPart("ps_", strategy);
3128
+ }
3129
+ }
3096
3130
  if (transform.focus) addPart("fo_", transform.focus);
3131
+ if (transform.so !== void 0) addPart("so_", transform.so);
3132
+ if (transform.eo !== void 0) addPart("eo_", transform.eo);
3097
3133
  if (transform.r !== void 0) addPart("r_", transform.r);
3098
3134
  if (transform.z !== void 0) addPart("z_", transform.z);
3099
3135
  if (transform.flip) addPart("flip_", transform.flip);
3100
3136
  if (transform.br !== void 0) addPart("br_", transform.br);
3101
- let format = transform.f ?? defaults?.f;
3102
- if (format && format !== "auto") addPart("f_", format);
3103
- const quality = transform.q ?? defaults?.q;
3137
+ const resolvedFormat = transform.f ?? defaults?.f;
3138
+ const isGifOutput = typeof resolvedFormat === "string" && resolvedFormat.toLowerCase() === "gif";
3139
+ if (resolvedFormat && resolvedFormat !== "auto") addPart("f_", resolvedFormat);
3140
+ const quality = isGifOutput ? transform.q : transform.q ?? defaults?.q;
3104
3141
  if (quality !== void 0 && quality !== "auto") addPart("q_", quality);
3105
3142
  if (transform.bg) {
3106
3143
  if (transform.bg.startsWith("rgb:")) {
@@ -3109,12 +3146,13 @@ function buildTransformString(transform, defaults, enableDPR = true, connectionQ
3109
3146
  addPart("bg_", transform.bg);
3110
3147
  }
3111
3148
  }
3112
- if (transform.k) addPart("k_", transform.k);
3113
- if (enableDPR && transform.dpr === void 0) {
3114
- const dpr = getDPR();
3115
- if (dpr !== 1) addPart("dpr_", dpr);
3116
- } else if (transform.dpr !== void 0) {
3117
- addPart("dpr_", transform.dpr);
3149
+ if (!isGifOutput) {
3150
+ if (enableDPR && transform.dpr === void 0) {
3151
+ const dpr = getDPR();
3152
+ if (dpr !== 1) addPart("dpr_", dpr);
3153
+ } else if (transform.dpr !== void 0) {
3154
+ addPart("dpr_", transform.dpr);
3155
+ }
3118
3156
  }
3119
3157
  if (transform.improve !== void 0) {
3120
3158
  if (typeof transform.improve === "boolean" && transform.improve) {
@@ -3175,9 +3213,11 @@ function buildTransformString(transform, defaults, enableDPR = true, connectionQ
3175
3213
  "h",
3176
3214
  "fit",
3177
3215
  "ar",
3178
- "p",
3179
- "ps",
3216
+ "position",
3217
+ "position_startagy",
3180
3218
  "focus",
3219
+ "so",
3220
+ "eo",
3181
3221
  "r",
3182
3222
  "z",
3183
3223
  "flip",
@@ -3185,7 +3225,6 @@ function buildTransformString(transform, defaults, enableDPR = true, connectionQ
3185
3225
  "f",
3186
3226
  "q",
3187
3227
  "bg",
3188
- "k",
3189
3228
  "dpr",
3190
3229
  "improve",
3191
3230
  "unsharpMask",
@@ -3274,13 +3313,14 @@ function buildTransformString(transform, defaults, enableDPR = true, connectionQ
3274
3313
  if (param.startsWith("lw_")) return 3;
3275
3314
  if (param.startsWith("lh_")) return 4;
3276
3315
  if (param.startsWith("o_")) return 5;
3277
- if (param.startsWith("l")) return 6;
3316
+ if (param.startsWith("l") && !param.startsWith("lzoom_")) return 6;
3278
3317
  if (param.startsWith("co_")) return 7;
3279
3318
  if (param.startsWith("a_")) return 8;
3280
3319
  if (param.startsWith("lr_")) return 8;
3281
- if (param.startsWith("x_") || param.startsWith("y_")) return 9;
3282
- if (param.startsWith("le_")) return 10;
3283
- if (param.startsWith("e_")) return 11;
3320
+ if (param.startsWith("lzoom_")) return 9;
3321
+ if (param.startsWith("x_") || param.startsWith("y_")) return 10;
3322
+ if (param.startsWith("le_")) return 11;
3323
+ if (param.startsWith("e_")) return 12;
3284
3324
  return 100;
3285
3325
  };
3286
3326
  regularParts.sort((a, b) => {
@@ -3384,6 +3424,7 @@ function buildLayerTransform(layer, addPart) {
3384
3424
  addPart("fl_layer_apply", "");
3385
3425
  }
3386
3426
  function normalizePlacement(placement) {
3427
+ const normalized = placement.trim().toLowerCase().replace(/\s+/g, " ");
3387
3428
  const mapping = {
3388
3429
  "north": "n",
3389
3430
  "south": "s",
@@ -3391,12 +3432,16 @@ function normalizePlacement(placement) {
3391
3432
  "west": "w",
3392
3433
  "center": "c",
3393
3434
  "north-west": "nw",
3435
+ "north west": "nw",
3394
3436
  "north-east": "ne",
3437
+ "north east": "ne",
3395
3438
  "south-west": "sw",
3439
+ "south west": "sw",
3396
3440
  "south-east": "se",
3441
+ "south east": "se",
3397
3442
  "none": "none"
3398
3443
  };
3399
- return mapping[placement.toLowerCase()] || placement.toLowerCase();
3444
+ return mapping[normalized] || normalized;
3400
3445
  }
3401
3446
 
3402
3447
  // src/viewtag/url-builder.ts
@@ -3415,9 +3460,9 @@ function encodeAssetPathForDelivery(src) {
3415
3460
  }
3416
3461
  return trimmed.split("/").filter(Boolean).map((segment) => encodeURIComponent(segment)).join("/");
3417
3462
  }
3418
- function buildImageUrl(baseUrl, workspace, src, transform, defaults, enableDPR = true, connectionQuality) {
3463
+ function buildImageUrl(baseUrl, workspace, src, transform, defaults, enableDPR = true) {
3419
3464
  const normalizedBase = baseUrl.replace(/\/+$/, "");
3420
- const transformStr = buildTransformString(transform || {}, defaults, enableDPR, connectionQuality);
3465
+ const transformStr = buildTransformString(transform || {}, defaults, enableDPR);
3421
3466
  const trimmedSrc = src.trim();
3422
3467
  if (ABSOLUTE_URL_RE.test(trimmedSrc)) {
3423
3468
  const fetchPart = `fetch_${trimmedSrc}`;
@@ -3445,7 +3490,7 @@ function parseMinVWFromSizes(sizes) {
3445
3490
  const vwValues = vwMatches.map((m) => parseFloat(m));
3446
3491
  return Math.min(...vwValues);
3447
3492
  }
3448
- function generateResponsiveAttributes(baseUrl, workspace, options, defaults, deviceBreakpoints = DEFAULT_DEVICE_BREAKPOINTS, imageBreakpoints = DEFAULT_IMAGE_BREAKPOINTS, enableDPR = true, connectionQuality) {
3493
+ function generateResponsiveAttributes(baseUrl, workspace, options, defaults, deviceBreakpoints = DEFAULT_DEVICE_BREAKPOINTS, imageBreakpoints = DEFAULT_IMAGE_BREAKPOINTS, enableDPR = true) {
3449
3494
  const { src, width, sizes, transform, breakpoints } = options;
3450
3495
  const effectiveBreakpoints = breakpoints || deviceBreakpoints;
3451
3496
  if (width !== void 0 && !sizes) {
@@ -3457,7 +3502,7 @@ function generateResponsiveAttributes(baseUrl, workspace, options, defaults, dev
3457
3502
  w: baseWidth2,
3458
3503
  dpr: 1
3459
3504
  };
3460
- const url1x = buildImageUrl(baseUrl, workspace, src, transform1x, defaults, false, connectionQuality);
3505
+ const url1x = buildImageUrl(baseUrl, workspace, src, transform1x, defaults, false);
3461
3506
  srcSetParts2.push(`${url1x} 1x`);
3462
3507
  if (dpr >= 2) {
3463
3508
  const transform2x = {
@@ -3465,14 +3510,10 @@ function generateResponsiveAttributes(baseUrl, workspace, options, defaults, dev
3465
3510
  w: baseWidth2,
3466
3511
  dpr: 2
3467
3512
  };
3468
- const url2x = buildImageUrl(baseUrl, workspace, src, transform2x, defaults, false, connectionQuality);
3513
+ const url2x = buildImageUrl(baseUrl, workspace, src, transform2x, defaults, false);
3469
3514
  srcSetParts2.push(`${url2x} 2x`);
3470
3515
  }
3471
- const baseTransform2 = {
3472
- ...transform,
3473
- w: baseWidth2
3474
- };
3475
- const baseSrc2 = buildImageUrl(baseUrl, workspace, src, baseTransform2, defaults, enableDPR, connectionQuality);
3516
+ const baseSrc2 = url1x;
3476
3517
  return {
3477
3518
  src: baseSrc2,
3478
3519
  srcSet: srcSetParts2.join(", "),
@@ -3489,7 +3530,7 @@ function generateResponsiveAttributes(baseUrl, workspace, options, defaults, dev
3489
3530
  ...transform,
3490
3531
  w: bp
3491
3532
  };
3492
- const url = buildImageUrl(baseUrl, workspace, src, transformWithWidth, defaults, enableDPR, connectionQuality);
3533
+ const url = buildImageUrl(baseUrl, workspace, src, transformWithWidth, defaults, enableDPR);
3493
3534
  return `${url} ${bp}w`;
3494
3535
  });
3495
3536
  const baseWidth2 = width || filteredBreakpoints[0] || effectiveBreakpoints[0];
@@ -3497,7 +3538,7 @@ function generateResponsiveAttributes(baseUrl, workspace, options, defaults, dev
3497
3538
  ...transform,
3498
3539
  w: baseWidth2
3499
3540
  };
3500
- const baseSrc2 = buildImageUrl(baseUrl, workspace, src, baseTransform2, defaults, enableDPR, connectionQuality);
3541
+ const baseSrc2 = buildImageUrl(baseUrl, workspace, src, baseTransform2, defaults, enableDPR);
3501
3542
  return {
3502
3543
  src: baseSrc2,
3503
3544
  srcSet: srcSetParts2.join(", "),
@@ -3510,7 +3551,7 @@ function generateResponsiveAttributes(baseUrl, workspace, options, defaults, dev
3510
3551
  ...transform,
3511
3552
  w: bp
3512
3553
  };
3513
- const url = buildImageUrl(baseUrl, workspace, src, transformWithWidth, defaults, enableDPR, connectionQuality);
3554
+ const url = buildImageUrl(baseUrl, workspace, src, transformWithWidth, defaults, enableDPR);
3514
3555
  return `${url} ${bp}w`;
3515
3556
  });
3516
3557
  const baseWidth = effectiveBreakpoints[0];
@@ -3518,7 +3559,7 @@ function generateResponsiveAttributes(baseUrl, workspace, options, defaults, dev
3518
3559
  ...transform,
3519
3560
  w: baseWidth
3520
3561
  };
3521
- const baseSrc = buildImageUrl(baseUrl, workspace, src, baseTransform, defaults, enableDPR, connectionQuality);
3562
+ const baseSrc = buildImageUrl(baseUrl, workspace, src, baseTransform, defaults, enableDPR);
3522
3563
  return {
3523
3564
  src: baseSrc,
3524
3565
  srcSet: srcSetParts.join(", "),
@@ -3850,6 +3891,7 @@ function registerAutorenderUploaderElement() {
3850
3891
  detectBestFormat,
3851
3892
  encodeAssetPathForDelivery,
3852
3893
  getBestFormatSync,
3894
+ isGifFormatOutput,
3853
3895
  registerAutorenderUploaderElement,
3854
3896
  resetFormatCache
3855
3897
  });