veo-sdk 0.4.2 → 0.5.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.
@@ -397,12 +397,12 @@ function buildButtonBlock(block, doc, callbacks) {
397
397
  applyBlockStyle(btn, block.style, "button");
398
398
  btn.addEventListener("click", () => {
399
399
  const action = block.action ?? "dismiss";
400
- const url = action === "url" && typeof block.url === "string" && isSafeUrl(block.url) ? block.url : void 0;
400
+ const target = action === "url" && typeof block.url === "string" && isSafeUrl(block.url) ? block.url : action === "guide" && typeof block.targetGuideId === "string" && block.targetGuideId ? block.targetGuideId : void 0;
401
401
  const meta = {
402
402
  ...typeof block.id === "string" && block.id ? { buttonId: block.id } : {},
403
403
  ...typeof block.text === "string" && block.text ? { buttonText: block.text } : {}
404
404
  };
405
- callbacks.onCtaClick(action, url, Object.keys(meta).length ? meta : void 0);
405
+ callbacks.onCtaClick(action, target, Object.keys(meta).length ? meta : void 0);
406
406
  });
407
407
  return btn;
408
408
  }
@@ -1016,10 +1016,22 @@ var GUIDE_STYLES = `
1016
1016
  padding: 3px 9px;
1017
1017
  white-space: nowrap;
1018
1018
  }
1019
+ .veo-badge--text {
1020
+ color: var(--veo-primary);
1021
+ font-weight: 600;
1022
+ white-space: nowrap;
1023
+ text-decoration: underline dotted;
1024
+ text-underline-offset: 3px;
1025
+ }
1019
1026
  .veo-badge--image img { display: block; border-radius: 4px; object-fit: cover; }
1020
1027
  /* El tooltip del badge usa strategy fixed (el host vive dentro del flujo del
1021
- cliente; un absoluto se recortar\xEDa con overflow de ancestros). */
1022
- .veo-badge-tooltip { position: fixed; }
1028
+ cliente; un absoluto se recortar\xEDa con overflow de ancestros). Su ancho es
1029
+ personalizable v\xEDa var dedicada (--veo-width no sirve: el :host la define
1030
+ en 420px siempre y pisar\xEDa el default de 300px de los tooltips). */
1031
+ .veo-badge-tooltip {
1032
+ position: fixed;
1033
+ max-width: var(--veo-badge-tip-width, 300px);
1034
+ }
1023
1035
  @keyframes veo-badge-pulse {
1024
1036
  0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--veo-primary) 45%, transparent); }
1025
1037
  70% { box-shadow: 0 0 0 7px transparent; }
@@ -1203,6 +1215,13 @@ var BadgeRenderer = class extends BaseRenderer {
1203
1215
  const { host, root } = this.createHost();
1204
1216
  const ownerDocument = root.ownerDocument ?? document;
1205
1217
  this.applyDesign(step.style);
1218
+ const tipWidth = step.style?.width;
1219
+ if (typeof tipWidth === "number" && Number.isFinite(tipWidth)) {
1220
+ host.style.setProperty(
1221
+ "--veo-badge-tip-width",
1222
+ `${Math.min(720, Math.max(220, tipWidth))}px`
1223
+ );
1224
+ }
1206
1225
  this.trigger = step.style?.badgeTrigger === "click" ? "click" : "hover";
1207
1226
  const rawSide = step.style?.tooltipPlacement;
1208
1227
  this.side = rawSide === "bottom" || rawSide === "left" || rawSide === "right" ? rawSide : "top";
@@ -1226,20 +1245,14 @@ var BadgeRenderer = class extends BaseRenderer {
1226
1245
  });
1227
1246
  };
1228
1247
  const buildTooltipContent = (s) => buildStepContent(s, ownerDocument, {
1229
- onCtaClick: (action, url, meta) => {
1248
+ onCtaClick: (action, target, meta) => {
1230
1249
  emit("cta_clicked", meta);
1231
- if (action === "url" && url) window.open(url, "_blank", "noopener,noreferrer");
1232
- if (action === "dismiss") {
1233
- emit("dismissed");
1234
- context.onClose();
1235
- return;
1236
- }
1250
+ if (action === "url" && target) window.open(target, "_blank", "noopener,noreferrer");
1237
1251
  this.closeTooltip();
1252
+ if (action === "guide" && target) context.onOpenGuide?.(target);
1238
1253
  },
1239
- onDismiss: () => {
1240
- emit("dismissed");
1241
- context.onClose();
1242
- }
1254
+ // La ✕ también cierra solo el tooltip (nunca el badge, nunca dismissed).
1255
+ onDismiss: () => this.closeTooltip()
1243
1256
  });
1244
1257
  const content = buildTooltipContent(step);
1245
1258
  tooltip.appendChild(content);
@@ -1370,7 +1383,7 @@ function readBadgeConfig(step) {
1370
1383
  const raw = step.style?.badge;
1371
1384
  if (!raw || typeof raw !== "object") return { kind: "icon" };
1372
1385
  const b = raw;
1373
- const kind = b.kind === "dot" || b.kind === "pill" || b.kind === "image" || b.kind === "icon" ? b.kind : "icon";
1386
+ const kind = b.kind === "dot" || b.kind === "pill" || b.kind === "text" || b.kind === "image" || b.kind === "icon" ? b.kind : "icon";
1374
1387
  return {
1375
1388
  kind,
1376
1389
  icon: typeof b.icon === "string" ? b.icon : null,
@@ -1401,6 +1414,12 @@ function buildBadgeElement(config, doc) {
1401
1414
  if (config.color) btn.style.background = config.color;
1402
1415
  break;
1403
1416
  }
1417
+ case "text": {
1418
+ btn.textContent = config.text?.slice(0, 32) || "Nuevo";
1419
+ btn.style.fontSize = `${clamp2(Math.round(size * 0.7), 9, 28)}px`;
1420
+ if (config.color) btn.style.color = config.color;
1421
+ break;
1422
+ }
1404
1423
  case "image": {
1405
1424
  if (config.imageUrl && isSafeUrl(config.imageUrl)) {
1406
1425
  const img = doc.createElement("img");
@@ -1537,7 +1556,10 @@ var BannerRenderer = class extends BaseRenderer {
1537
1556
  ownerDocument,
1538
1557
  context.nav.callbacks
1539
1558
  ) : buildStepContent(step, ownerDocument, {
1540
- onCtaClick: (action, url, meta) => dismiss("cta_clicked", action === "url" ? url : void 0, meta),
1559
+ onCtaClick: (action, target, meta) => {
1560
+ dismiss("cta_clicked", action === "url" ? target : void 0, meta);
1561
+ if (action === "guide" && target) context.onOpenGuide?.(target);
1562
+ },
1541
1563
  onDismiss: () => dismiss("dismissed")
1542
1564
  });
1543
1565
  banner.appendChild(content);
@@ -1552,7 +1574,10 @@ var BannerRenderer = class extends BaseRenderer {
1552
1574
  this.liveContainer = banner;
1553
1575
  this.liveContent = content;
1554
1576
  this.liveBuild = (s) => buildStepContent(s, ownerDocument, {
1555
- onCtaClick: (action, url, meta) => dismiss("cta_clicked", action === "url" ? url : void 0, meta),
1577
+ onCtaClick: (action, target, meta) => {
1578
+ dismiss("cta_clicked", action === "url" ? target : void 0, meta);
1579
+ if (action === "guide" && target) context.onOpenGuide?.(target);
1580
+ },
1556
1581
  onDismiss: () => dismiss("dismissed")
1557
1582
  });
1558
1583
  this.liveKey = this.liveKeyOf(step);
@@ -2188,7 +2213,10 @@ var InlineRenderer = class extends BaseRenderer {
2188
2213
  context.onClose();
2189
2214
  };
2190
2215
  const content = buildStepContent(step, ownerDocument, {
2191
- onCtaClick: (action, url, meta) => dismiss("cta_clicked", action === "url" ? url : void 0, meta),
2216
+ onCtaClick: (action, target, meta) => {
2217
+ dismiss("cta_clicked", action === "url" ? target : void 0, meta);
2218
+ if (action === "guide" && target) context.onOpenGuide?.(target);
2219
+ },
2192
2220
  onDismiss: () => dismiss("dismissed")
2193
2221
  });
2194
2222
  card.appendChild(content);
@@ -2197,7 +2225,10 @@ var InlineRenderer = class extends BaseRenderer {
2197
2225
  this.liveContent = content;
2198
2226
  this.liveKey = `${selector}|${position}`;
2199
2227
  this.liveBuild = (s) => buildStepContent(s, ownerDocument, {
2200
- onCtaClick: (action, url, meta) => dismiss("cta_clicked", action === "url" ? url : void 0, meta),
2228
+ onCtaClick: (action, target, meta) => {
2229
+ dismiss("cta_clicked", action === "url" ? target : void 0, meta);
2230
+ if (action === "guide" && target) context.onOpenGuide?.(target);
2231
+ },
2201
2232
  onDismiss: () => dismiss("dismissed")
2202
2233
  });
2203
2234
  context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: "shown" });
@@ -2249,7 +2280,10 @@ var ModalRenderer = class extends BaseRenderer {
2249
2280
  ownerDocument,
2250
2281
  context.nav.callbacks
2251
2282
  ) : buildStepContent(step, ownerDocument, {
2252
- onCtaClick: (action, url, meta) => dismiss("cta_clicked", action === "url" ? url : void 0, meta),
2283
+ onCtaClick: (action, target, meta) => {
2284
+ dismiss("cta_clicked", action === "url" ? target : void 0, meta);
2285
+ if (action === "guide" && target) context.onOpenGuide?.(target);
2286
+ },
2253
2287
  onDismiss: () => dismiss("dismissed")
2254
2288
  });
2255
2289
  card.appendChild(content);
@@ -2259,7 +2293,10 @@ var ModalRenderer = class extends BaseRenderer {
2259
2293
  this.liveContainer = card;
2260
2294
  this.liveContent = content;
2261
2295
  this.liveBuild = (s) => buildStepContent(s, ownerDocument, {
2262
- onCtaClick: (action, url, meta) => dismiss("cta_clicked", action === "url" ? url : void 0, meta),
2296
+ onCtaClick: (action, target, meta) => {
2297
+ dismiss("cta_clicked", action === "url" ? target : void 0, meta);
2298
+ if (action === "guide" && target) context.onOpenGuide?.(target);
2299
+ },
2263
2300
  onDismiss: () => dismiss("dismissed")
2264
2301
  });
2265
2302
  }
@@ -2315,8 +2352,9 @@ var TooltipRenderer = class extends BaseRenderer {
2315
2352
  context.onClose();
2316
2353
  };
2317
2354
  const content = buildStepContent(step, ownerDocument, {
2318
- onCtaClick: (action, url, meta) => {
2319
- dismiss("cta_clicked", action === "url" ? url : void 0, meta);
2355
+ onCtaClick: (action, target, meta) => {
2356
+ dismiss("cta_clicked", action === "url" ? target : void 0, meta);
2357
+ if (action === "guide" && target) context.onOpenGuide?.(target);
2320
2358
  },
2321
2359
  onDismiss: () => dismiss("dismissed")
2322
2360
  });
@@ -2349,7 +2387,10 @@ var TooltipRenderer = class extends BaseRenderer {
2349
2387
  this.liveContent = content;
2350
2388
  this.liveKey = selector;
2351
2389
  this.liveBuild = (s) => buildStepContent(s, ownerDocument, {
2352
- onCtaClick: (action, url, meta) => dismiss("cta_clicked", action === "url" ? url : void 0, meta),
2390
+ onCtaClick: (action, target, meta) => {
2391
+ dismiss("cta_clicked", action === "url" ? target : void 0, meta);
2392
+ if (action === "guide" && target) context.onOpenGuide?.(target);
2393
+ },
2353
2394
  onDismiss: () => dismiss("dismissed")
2354
2395
  });
2355
2396
  context.onInteraction({
@@ -2481,6 +2522,10 @@ var GuidePreviewController = class {
2481
2522
  onClose: () => this.close(),
2482
2523
  onTrack: () => {
2483
2524
  },
2525
+ // Encadenado en preview: no-op — el editor no puede montar otra guía
2526
+ // guardada; el click igual cierra la preview actual (vía onCtaClick).
2527
+ onOpenGuide: () => {
2528
+ },
2484
2529
  // Preview de forms: por defecto simula el envío SIN escribir props;
2485
2530
  // el caller puede pasar `formSubmit` real (link de preview).
2486
2531
  onFormSubmit: this.input?.formSubmit ?? (() => Promise.resolve(true)),
@@ -2763,5 +2808,5 @@ function buildSelectorPath(element, maxAncestors = 5) {
2763
2808
  }
2764
2809
 
2765
2810
  export { ALWAYS_BLOCK_SELECTORS, BadgeRenderer, BannerRenderer, CustomRenderer, DEFAULT_AUTOCAPTURE_CONFIG, DEFAULT_TRACKER_BATCH_SIZE, DEFAULT_TRACKER_FLUSH_INTERVAL_MS, DEFAULT_TRACKER_MAX_RETRIES, FREQUENCY_CACHE_KEY_PREFIX, FREQUENCY_CACHE_MAX_ENTRIES, FREQUENCY_CACHE_TTL_MS, FormRenderer, InlineCustomRenderer, InlineFormRenderer, InlineRenderer, MAX_ANCESTORS, ModalRenderer, PRIORITY_ATTRIBUTES, SENSITIVE_ATTRIBUTES, TooltipRenderer, WALKTHROUGH_ABANDONMENT_TIMEOUT_MS, WALKTHROUGH_STATE_KEY_PREFIX, WalkthroughRenderer, buildSelectorPath, clearBuilderToken, closeGuidePreview, filterHumanClasses, hasDocument, hasLocalStorage, hasNavigatorSendBeacon, hasWindow, isBuilderMode, previewGuide, resolveBuilderContext, resolveBuilderToken, uuidv7 };
2766
- //# sourceMappingURL=chunk-F2ZWZUTR.mjs.map
2767
- //# sourceMappingURL=chunk-F2ZWZUTR.mjs.map
2811
+ //# sourceMappingURL=chunk-L3JSRBVO.mjs.map
2812
+ //# sourceMappingURL=chunk-L3JSRBVO.mjs.map