veo-sdk 0.5.25 → 0.5.28

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/builder.mjs CHANGED
@@ -1,7 +1,7 @@
1
- import './chunk-RDV5GIU7.mjs';
2
- import { initBuilderMode } from './chunk-5F3DX5VP.mjs';
3
- export { createBuilderSession, initBuilderMode, startElementPicker, stopElementPicker } from './chunk-5F3DX5VP.mjs';
4
- export { closeGuidePreview, previewGuide } from './chunk-ZK4HWKL3.mjs';
1
+ import './chunk-WLW5Y5LU.mjs';
2
+ import { initBuilderMode } from './chunk-L5X4AGR7.mjs';
3
+ export { createBuilderSession, initBuilderMode, startElementPicker, stopElementPicker } from './chunk-L5X4AGR7.mjs';
4
+ export { closeGuidePreview, previewGuide } from './chunk-CWIUNHWA.mjs';
5
5
  import './chunk-PTG3BTJE.mjs';
6
6
 
7
7
  // src/builder.ts
@@ -1861,7 +1861,25 @@ function escapeClosing(code, tag) {
1861
1861
  }
1862
1862
 
1863
1863
  // src/plugins/guides/code-block.ts
1864
- function mountCodeBlock(block, doc, context) {
1864
+ function insertRawNodes(anchor, nodes, pos) {
1865
+ const parent = anchor.parentNode;
1866
+ if (pos === "prepend") {
1867
+ const first = anchor.firstChild;
1868
+ for (const n of nodes) anchor.insertBefore(n, first);
1869
+ } else if (pos === "append") {
1870
+ for (const n of nodes) anchor.appendChild(n);
1871
+ } else if (pos === "before") {
1872
+ for (const n of nodes) parent?.insertBefore(n, anchor);
1873
+ } else {
1874
+ let ref = anchor;
1875
+ for (const n of nodes) {
1876
+ parent?.insertBefore(n, ref.nextSibling);
1877
+ ref = n;
1878
+ }
1879
+ }
1880
+ }
1881
+ var codeSlotSeq = 0;
1882
+ function mountCodeBlock(block, doc, context, host, rawInline) {
1865
1883
  if (block.sandboxed) {
1866
1884
  const step = { html: block.html ?? "", css: block.css, js: block.js };
1867
1885
  const { iframe, cleanup } = mountCustomFrame(doc, step, context, { width: "100%" });
@@ -1880,19 +1898,28 @@ function mountCodeBlock(block, doc, context) {
1880
1898
  }
1881
1899
  let node = null;
1882
1900
  if (typeof block.html === "string" && block.html.trim()) {
1883
- node = doc.createElement("div");
1884
- node.className = "veo-code-html";
1885
- const inner = node.attachShadow({ mode: "open" });
1886
- for (const sheet of Array.from(hostDoc.querySelectorAll('link[rel="stylesheet"], style'))) {
1887
- inner.appendChild(sheet.cloneNode(true));
1888
- }
1889
1901
  const holder = doc.createElement("div");
1902
+ holder.className = "veo-code-html";
1890
1903
  holder.innerHTML = block.html;
1891
1904
  for (const old of Array.from(holder.querySelectorAll("script"))) {
1892
1905
  injected.push(runScript(old, hostDoc));
1893
1906
  old.remove();
1894
1907
  }
1895
- inner.appendChild(holder);
1908
+ if (rawInline) {
1909
+ const rawNodes = Array.from(holder.childNodes);
1910
+ insertRawNodes(rawInline.anchor, rawNodes, rawInline.pos);
1911
+ injected.push(...rawNodes);
1912
+ } else if (host) {
1913
+ const slotName = `veo-code-${++codeSlotSeq}`;
1914
+ holder.slot = slotName;
1915
+ host.appendChild(holder);
1916
+ injected.push(holder);
1917
+ const slot = doc.createElement("slot");
1918
+ slot.setAttribute("name", slotName);
1919
+ node = slot;
1920
+ } else {
1921
+ node = holder;
1922
+ }
1896
1923
  }
1897
1924
  if (typeof block.js === "string" && block.js.trim()) {
1898
1925
  const s = hostDoc.createElement("script");
@@ -2191,12 +2218,25 @@ var CompositeRenderer = class extends BaseRenderer {
2191
2218
  const idx = context.nav?.stepIndex ?? 0;
2192
2219
  const step = context.guide.guideSteps[idx];
2193
2220
  if (!step) return;
2194
- const anchorSelector = step.position === "relative-to-element" || step.presentation === "inline" ? step.anchorSelector?.trim() || void 0 : void 0;
2221
+ const badgeMode = step.badge?.enabled === true;
2222
+ const anchorSelector = step.position === "relative-to-element" || step.presentation === "inline" || badgeMode ? step.anchorSelector?.trim() || void 0 : void 0;
2195
2223
  let anchor = null;
2196
2224
  if (anchorSelector) {
2197
2225
  anchor = await waitForElement(anchorSelector);
2198
2226
  if (!anchor) return;
2199
2227
  }
2228
+ const blocks = step.blocks ?? [];
2229
+ const soleCode = blocks.length === 1 && blocks[0]?.type === "code" ? blocks[0] : void 0;
2230
+ if (step.presentation === "inline" && anchor && soleCode && !soleCode.sandboxed) {
2231
+ const rawDoc = anchor.ownerDocument ?? document;
2232
+ const { cleanup } = mountCodeBlock(soleCode, rawDoc, context, void 0, {
2233
+ anchor,
2234
+ pos: inlinePosOf(step.inlinePosition)
2235
+ });
2236
+ this.registerCleanup(cleanup);
2237
+ context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: "shown" });
2238
+ return;
2239
+ }
2200
2240
  const { host, root } = this.createHost();
2201
2241
  const doc = root.ownerDocument ?? document;
2202
2242
  const design = step.design ?? {};
@@ -2213,11 +2253,16 @@ var CompositeRenderer = class extends BaseRenderer {
2213
2253
  });
2214
2254
  };
2215
2255
  const readers = [];
2216
- this.buildContent(card, step.blocks ?? [], doc, context, idx, readers);
2256
+ this.buildContent(card, step.blocks ?? [], doc, context, idx, readers, host);
2217
2257
  const lastBlock = card.lastElementChild;
2218
2258
  if (lastBlock && !lastBlock.style.marginBottom) lastBlock.style.marginBottom = "0";
2259
+ let closeTooltip = null;
2219
2260
  if (design.closeButton !== false) {
2220
2261
  const closeBtn = createCloseButton(doc, () => {
2262
+ if (closeTooltip) {
2263
+ closeTooltip();
2264
+ return;
2265
+ }
2221
2266
  dismiss("dismissed");
2222
2267
  this.closeOrSkip(context);
2223
2268
  });
@@ -2236,6 +2281,21 @@ var CompositeRenderer = class extends BaseRenderer {
2236
2281
  }
2237
2282
  card.appendChild(closeBtn);
2238
2283
  }
2284
+ if (badgeMode && anchor) {
2285
+ closeTooltip = this.renderBadgeMode(
2286
+ step,
2287
+ card,
2288
+ anchor,
2289
+ anchorSelector,
2290
+ host,
2291
+ root,
2292
+ doc,
2293
+ context,
2294
+ idx,
2295
+ design
2296
+ );
2297
+ return;
2298
+ }
2239
2299
  if (step.presentation === "inline" && anchor) {
2240
2300
  host.style.display = "block";
2241
2301
  const pos = inlinePosOf(step.inlinePosition);
@@ -2284,7 +2344,7 @@ var CompositeRenderer = class extends BaseRenderer {
2284
2344
  context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: "shown" });
2285
2345
  }
2286
2346
  /** Recorre los bloques en orden y los pinta en la card. */
2287
- buildContent(card, blocks, doc, context, idx, readers) {
2347
+ buildContent(card, blocks, doc, context, idx, readers, host) {
2288
2348
  const emit = (block) => {
2289
2349
  context.onInteraction({
2290
2350
  guideId: context.guide.guideId,
@@ -2318,7 +2378,7 @@ var CompositeRenderer = class extends BaseRenderer {
2318
2378
  continue;
2319
2379
  }
2320
2380
  if (b.type === "code") {
2321
- const { node: node2, cleanup } = mountCodeBlock(b, doc, context);
2381
+ const { node: node2, cleanup } = mountCodeBlock(b, doc, context, host);
2322
2382
  if (node2) card.appendChild(node2);
2323
2383
  this.registerCleanup(cleanup);
2324
2384
  i++;
@@ -2425,6 +2485,88 @@ var CompositeRenderer = class extends BaseRenderer {
2425
2485
  if (context.nav?.callbacks) context.nav.callbacks.onSkip();
2426
2486
  else context.onClose();
2427
2487
  }
2488
+ /**
2489
+ * Modo BADGE: inserta un MARCADOR permanente (compuesto con `step.badge.blocks`)
2490
+ * junto al ancla, en el flujo del DOM. Al hover/click abre la `card` (los
2491
+ * bloques del paso) como TOOLTIP anclado al marcador. Devuelve una función que
2492
+ * cierra el tooltip (para el ✕). El marcador nunca se descarta.
2493
+ */
2494
+ renderBadgeMode(step, card, anchor, anchorSelector, host, root, doc, context, idx, design) {
2495
+ const trigger = step.badge?.trigger === "click" ? "click" : "hover";
2496
+ const badge = doc.createElement("div");
2497
+ badge.className = "veo-composite-badge";
2498
+ badge.setAttribute("role", "button");
2499
+ badge.tabIndex = 0;
2500
+ badge.style.cursor = "pointer";
2501
+ badge.style.display = "inline-flex";
2502
+ badge.style.alignItems = "center";
2503
+ this.buildContent(badge, step.badge?.blocks ?? [], doc, context, idx, [], host);
2504
+ root.appendChild(badge);
2505
+ const wrapper = doc.createElement("div");
2506
+ wrapper.className = "veo-composite-anchored";
2507
+ wrapper.style.display = "none";
2508
+ const caretEl = design.caret === false ? null : makeCaret(doc, design);
2509
+ if (caretEl) wrapper.appendChild(caretEl);
2510
+ wrapper.appendChild(card);
2511
+ root.appendChild(wrapper);
2512
+ host.style.display = "inline-block";
2513
+ const pos = inlinePosOf(step.inlinePosition);
2514
+ insertHost(anchor, host, pos);
2515
+ this.registerCleanup(keepHostAttached(host, anchorSelector, pos));
2516
+ let open = false;
2517
+ let stopFloat = null;
2518
+ let closeTimer = null;
2519
+ let shownEmitted = false;
2520
+ const openTip = () => {
2521
+ if (open) return;
2522
+ open = true;
2523
+ wrapper.style.display = "block";
2524
+ void anchorPosition(badge, wrapper, caretEl).then((stop) => {
2525
+ if (open) stopFloat = stop;
2526
+ else stop();
2527
+ });
2528
+ if (!shownEmitted) {
2529
+ shownEmitted = true;
2530
+ context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: "shown" });
2531
+ }
2532
+ };
2533
+ const closeTip = () => {
2534
+ open = false;
2535
+ wrapper.style.display = "none";
2536
+ stopFloat?.();
2537
+ stopFloat = null;
2538
+ };
2539
+ if (trigger === "hover") {
2540
+ const cancelClose = () => {
2541
+ if (closeTimer !== null) {
2542
+ clearTimeout(closeTimer);
2543
+ closeTimer = null;
2544
+ }
2545
+ };
2546
+ const scheduleClose = () => {
2547
+ cancelClose();
2548
+ closeTimer = window.setTimeout(closeTip, 150);
2549
+ };
2550
+ badge.addEventListener("mouseenter", () => {
2551
+ cancelClose();
2552
+ openTip();
2553
+ });
2554
+ badge.addEventListener("mouseleave", scheduleClose);
2555
+ badge.addEventListener("focus", openTip);
2556
+ wrapper.addEventListener("mouseenter", cancelClose);
2557
+ wrapper.addEventListener("mouseleave", scheduleClose);
2558
+ } else {
2559
+ badge.addEventListener("click", () => {
2560
+ if (open) closeTip();
2561
+ else openTip();
2562
+ });
2563
+ }
2564
+ this.registerCleanup(() => {
2565
+ stopFloat?.();
2566
+ if (closeTimer !== null) clearTimeout(closeTimer);
2567
+ });
2568
+ return closeTip;
2569
+ }
2428
2570
  };
2429
2571
  function inlinePosOf(p) {
2430
2572
  return p === "before" || p === "prepend" || p === "append" ? p : "after";
@@ -3366,5 +3508,5 @@ function buildSelectorPath(element, maxAncestors = 5) {
3366
3508
  }
3367
3509
 
3368
3510
  export { ALWAYS_BLOCK_SELECTORS, BadgeRenderer, BannerRenderer, CompositeRenderer, 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, stepMatchesPage, uuidv7 };
3369
- //# sourceMappingURL=chunk-ZK4HWKL3.mjs.map
3370
- //# sourceMappingURL=chunk-ZK4HWKL3.mjs.map
3511
+ //# sourceMappingURL=chunk-CWIUNHWA.mjs.map
3512
+ //# sourceMappingURL=chunk-CWIUNHWA.mjs.map