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.
@@ -0,0 +1,5 @@
1
+ export { VEO_BLOCK_MIME, attachBlockDropTarget, attachDesignManipulator, createBuilderSession, initBuilderMode, startElementPicker, stopElementPicker } from './chunk-L5X4AGR7.mjs';
2
+ import './chunk-CWIUNHWA.mjs';
3
+ import './chunk-PTG3BTJE.mjs';
4
+ //# sourceMappingURL=builder-RSWK3RIB.mjs.map
5
+ //# sourceMappingURL=builder-RSWK3RIB.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"builder-HDTWSDJR.mjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"builder-RSWK3RIB.mjs"}
package/dist/builder.cjs CHANGED
@@ -1947,7 +1947,25 @@ function escapeClosing(code, tag) {
1947
1947
  }
1948
1948
 
1949
1949
  // src/plugins/guides/code-block.ts
1950
- function mountCodeBlock(block, doc, context) {
1950
+ function insertRawNodes(anchor, nodes, pos) {
1951
+ const parent = anchor.parentNode;
1952
+ if (pos === "prepend") {
1953
+ const first = anchor.firstChild;
1954
+ for (const n of nodes) anchor.insertBefore(n, first);
1955
+ } else if (pos === "append") {
1956
+ for (const n of nodes) anchor.appendChild(n);
1957
+ } else if (pos === "before") {
1958
+ for (const n of nodes) parent?.insertBefore(n, anchor);
1959
+ } else {
1960
+ let ref = anchor;
1961
+ for (const n of nodes) {
1962
+ parent?.insertBefore(n, ref.nextSibling);
1963
+ ref = n;
1964
+ }
1965
+ }
1966
+ }
1967
+ var codeSlotSeq = 0;
1968
+ function mountCodeBlock(block, doc, context, host, rawInline) {
1951
1969
  if (block.sandboxed) {
1952
1970
  const step = { html: block.html ?? "", css: block.css, js: block.js };
1953
1971
  const { iframe, cleanup } = mountCustomFrame(doc, step, context, { width: "100%" });
@@ -1966,19 +1984,28 @@ function mountCodeBlock(block, doc, context) {
1966
1984
  }
1967
1985
  let node = null;
1968
1986
  if (typeof block.html === "string" && block.html.trim()) {
1969
- node = doc.createElement("div");
1970
- node.className = "veo-code-html";
1971
- const inner = node.attachShadow({ mode: "open" });
1972
- for (const sheet of Array.from(hostDoc.querySelectorAll('link[rel="stylesheet"], style'))) {
1973
- inner.appendChild(sheet.cloneNode(true));
1974
- }
1975
1987
  const holder = doc.createElement("div");
1988
+ holder.className = "veo-code-html";
1976
1989
  holder.innerHTML = block.html;
1977
1990
  for (const old of Array.from(holder.querySelectorAll("script"))) {
1978
1991
  injected.push(runScript(old, hostDoc));
1979
1992
  old.remove();
1980
1993
  }
1981
- inner.appendChild(holder);
1994
+ if (rawInline) {
1995
+ const rawNodes = Array.from(holder.childNodes);
1996
+ insertRawNodes(rawInline.anchor, rawNodes, rawInline.pos);
1997
+ injected.push(...rawNodes);
1998
+ } else if (host) {
1999
+ const slotName = `veo-code-${++codeSlotSeq}`;
2000
+ holder.slot = slotName;
2001
+ host.appendChild(holder);
2002
+ injected.push(holder);
2003
+ const slot = doc.createElement("slot");
2004
+ slot.setAttribute("name", slotName);
2005
+ node = slot;
2006
+ } else {
2007
+ node = holder;
2008
+ }
1982
2009
  }
1983
2010
  if (typeof block.js === "string" && block.js.trim()) {
1984
2011
  const s = hostDoc.createElement("script");
@@ -2277,12 +2304,25 @@ var CompositeRenderer = class extends BaseRenderer {
2277
2304
  const idx = context.nav?.stepIndex ?? 0;
2278
2305
  const step = context.guide.guideSteps[idx];
2279
2306
  if (!step) return;
2280
- const anchorSelector = step.position === "relative-to-element" || step.presentation === "inline" ? step.anchorSelector?.trim() || void 0 : void 0;
2307
+ const badgeMode = step.badge?.enabled === true;
2308
+ const anchorSelector = step.position === "relative-to-element" || step.presentation === "inline" || badgeMode ? step.anchorSelector?.trim() || void 0 : void 0;
2281
2309
  let anchor = null;
2282
2310
  if (anchorSelector) {
2283
2311
  anchor = await waitForElement(anchorSelector);
2284
2312
  if (!anchor) return;
2285
2313
  }
2314
+ const blocks = step.blocks ?? [];
2315
+ const soleCode = blocks.length === 1 && blocks[0]?.type === "code" ? blocks[0] : void 0;
2316
+ if (step.presentation === "inline" && anchor && soleCode && !soleCode.sandboxed) {
2317
+ const rawDoc = anchor.ownerDocument ?? document;
2318
+ const { cleanup } = mountCodeBlock(soleCode, rawDoc, context, void 0, {
2319
+ anchor,
2320
+ pos: inlinePosOf(step.inlinePosition)
2321
+ });
2322
+ this.registerCleanup(cleanup);
2323
+ context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: "shown" });
2324
+ return;
2325
+ }
2286
2326
  const { host, root } = this.createHost();
2287
2327
  const doc = root.ownerDocument ?? document;
2288
2328
  const design = step.design ?? {};
@@ -2299,11 +2339,16 @@ var CompositeRenderer = class extends BaseRenderer {
2299
2339
  });
2300
2340
  };
2301
2341
  const readers = [];
2302
- this.buildContent(card, step.blocks ?? [], doc, context, idx, readers);
2342
+ this.buildContent(card, step.blocks ?? [], doc, context, idx, readers, host);
2303
2343
  const lastBlock = card.lastElementChild;
2304
2344
  if (lastBlock && !lastBlock.style.marginBottom) lastBlock.style.marginBottom = "0";
2345
+ let closeTooltip = null;
2305
2346
  if (design.closeButton !== false) {
2306
2347
  const closeBtn = createCloseButton(doc, () => {
2348
+ if (closeTooltip) {
2349
+ closeTooltip();
2350
+ return;
2351
+ }
2307
2352
  dismiss("dismissed");
2308
2353
  this.closeOrSkip(context);
2309
2354
  });
@@ -2322,6 +2367,21 @@ var CompositeRenderer = class extends BaseRenderer {
2322
2367
  }
2323
2368
  card.appendChild(closeBtn);
2324
2369
  }
2370
+ if (badgeMode && anchor) {
2371
+ closeTooltip = this.renderBadgeMode(
2372
+ step,
2373
+ card,
2374
+ anchor,
2375
+ anchorSelector,
2376
+ host,
2377
+ root,
2378
+ doc,
2379
+ context,
2380
+ idx,
2381
+ design
2382
+ );
2383
+ return;
2384
+ }
2325
2385
  if (step.presentation === "inline" && anchor) {
2326
2386
  host.style.display = "block";
2327
2387
  const pos = inlinePosOf(step.inlinePosition);
@@ -2370,7 +2430,7 @@ var CompositeRenderer = class extends BaseRenderer {
2370
2430
  context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: "shown" });
2371
2431
  }
2372
2432
  /** Recorre los bloques en orden y los pinta en la card. */
2373
- buildContent(card, blocks, doc, context, idx, readers) {
2433
+ buildContent(card, blocks, doc, context, idx, readers, host) {
2374
2434
  const emit = (block) => {
2375
2435
  context.onInteraction({
2376
2436
  guideId: context.guide.guideId,
@@ -2404,7 +2464,7 @@ var CompositeRenderer = class extends BaseRenderer {
2404
2464
  continue;
2405
2465
  }
2406
2466
  if (b.type === "code") {
2407
- const { node: node2, cleanup } = mountCodeBlock(b, doc, context);
2467
+ const { node: node2, cleanup } = mountCodeBlock(b, doc, context, host);
2408
2468
  if (node2) card.appendChild(node2);
2409
2469
  this.registerCleanup(cleanup);
2410
2470
  i++;
@@ -2511,6 +2571,88 @@ var CompositeRenderer = class extends BaseRenderer {
2511
2571
  if (context.nav?.callbacks) context.nav.callbacks.onSkip();
2512
2572
  else context.onClose();
2513
2573
  }
2574
+ /**
2575
+ * Modo BADGE: inserta un MARCADOR permanente (compuesto con `step.badge.blocks`)
2576
+ * junto al ancla, en el flujo del DOM. Al hover/click abre la `card` (los
2577
+ * bloques del paso) como TOOLTIP anclado al marcador. Devuelve una función que
2578
+ * cierra el tooltip (para el ✕). El marcador nunca se descarta.
2579
+ */
2580
+ renderBadgeMode(step, card, anchor, anchorSelector, host, root, doc, context, idx, design) {
2581
+ const trigger = step.badge?.trigger === "click" ? "click" : "hover";
2582
+ const badge = doc.createElement("div");
2583
+ badge.className = "veo-composite-badge";
2584
+ badge.setAttribute("role", "button");
2585
+ badge.tabIndex = 0;
2586
+ badge.style.cursor = "pointer";
2587
+ badge.style.display = "inline-flex";
2588
+ badge.style.alignItems = "center";
2589
+ this.buildContent(badge, step.badge?.blocks ?? [], doc, context, idx, [], host);
2590
+ root.appendChild(badge);
2591
+ const wrapper = doc.createElement("div");
2592
+ wrapper.className = "veo-composite-anchored";
2593
+ wrapper.style.display = "none";
2594
+ const caretEl = design.caret === false ? null : makeCaret(doc, design);
2595
+ if (caretEl) wrapper.appendChild(caretEl);
2596
+ wrapper.appendChild(card);
2597
+ root.appendChild(wrapper);
2598
+ host.style.display = "inline-block";
2599
+ const pos = inlinePosOf(step.inlinePosition);
2600
+ insertHost(anchor, host, pos);
2601
+ this.registerCleanup(keepHostAttached(host, anchorSelector, pos));
2602
+ let open = false;
2603
+ let stopFloat = null;
2604
+ let closeTimer = null;
2605
+ let shownEmitted = false;
2606
+ const openTip = () => {
2607
+ if (open) return;
2608
+ open = true;
2609
+ wrapper.style.display = "block";
2610
+ void anchorPosition(badge, wrapper, caretEl).then((stop) => {
2611
+ if (open) stopFloat = stop;
2612
+ else stop();
2613
+ });
2614
+ if (!shownEmitted) {
2615
+ shownEmitted = true;
2616
+ context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: "shown" });
2617
+ }
2618
+ };
2619
+ const closeTip = () => {
2620
+ open = false;
2621
+ wrapper.style.display = "none";
2622
+ stopFloat?.();
2623
+ stopFloat = null;
2624
+ };
2625
+ if (trigger === "hover") {
2626
+ const cancelClose = () => {
2627
+ if (closeTimer !== null) {
2628
+ clearTimeout(closeTimer);
2629
+ closeTimer = null;
2630
+ }
2631
+ };
2632
+ const scheduleClose = () => {
2633
+ cancelClose();
2634
+ closeTimer = window.setTimeout(closeTip, 150);
2635
+ };
2636
+ badge.addEventListener("mouseenter", () => {
2637
+ cancelClose();
2638
+ openTip();
2639
+ });
2640
+ badge.addEventListener("mouseleave", scheduleClose);
2641
+ badge.addEventListener("focus", openTip);
2642
+ wrapper.addEventListener("mouseenter", cancelClose);
2643
+ wrapper.addEventListener("mouseleave", scheduleClose);
2644
+ } else {
2645
+ badge.addEventListener("click", () => {
2646
+ if (open) closeTip();
2647
+ else openTip();
2648
+ });
2649
+ }
2650
+ this.registerCleanup(() => {
2651
+ stopFloat?.();
2652
+ if (closeTimer !== null) clearTimeout(closeTimer);
2653
+ });
2654
+ return closeTip;
2655
+ }
2514
2656
  };
2515
2657
  function inlinePosOf(p) {
2516
2658
  return p === "before" || p === "prepend" || p === "append" ? p : "after";