veo-sdk 0.5.27 → 0.5.29

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-47RJ4SV7.mjs';
2
+ import './chunk-QQOV35FD.mjs';
3
+ import './chunk-PTG3BTJE.mjs';
4
+ //# sourceMappingURL=builder-HVJ6W5VT.mjs.map
5
+ //# sourceMappingURL=builder-HVJ6W5VT.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"builder-5UDF6IHS.mjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"builder-HVJ6W5VT.mjs"}
package/dist/builder.cjs CHANGED
@@ -2304,7 +2304,8 @@ var CompositeRenderer = class extends BaseRenderer {
2304
2304
  const idx = context.nav?.stepIndex ?? 0;
2305
2305
  const step = context.guide.guideSteps[idx];
2306
2306
  if (!step) return;
2307
- 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;
2308
2309
  let anchor = null;
2309
2310
  if (anchorSelector) {
2310
2311
  anchor = await waitForElement(anchorSelector);
@@ -2341,8 +2342,13 @@ var CompositeRenderer = class extends BaseRenderer {
2341
2342
  this.buildContent(card, step.blocks ?? [], doc, context, idx, readers, host);
2342
2343
  const lastBlock = card.lastElementChild;
2343
2344
  if (lastBlock && !lastBlock.style.marginBottom) lastBlock.style.marginBottom = "0";
2345
+ let closeTooltip = null;
2344
2346
  if (design.closeButton !== false) {
2345
2347
  const closeBtn = createCloseButton(doc, () => {
2348
+ if (closeTooltip) {
2349
+ closeTooltip();
2350
+ return;
2351
+ }
2346
2352
  dismiss("dismissed");
2347
2353
  this.closeOrSkip(context);
2348
2354
  });
@@ -2361,6 +2367,21 @@ var CompositeRenderer = class extends BaseRenderer {
2361
2367
  }
2362
2368
  card.appendChild(closeBtn);
2363
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
+ }
2364
2385
  if (step.presentation === "inline" && anchor) {
2365
2386
  host.style.display = "block";
2366
2387
  const pos = inlinePosOf(step.inlinePosition);
@@ -2550,6 +2571,89 @@ var CompositeRenderer = class extends BaseRenderer {
2550
2571
  if (context.nav?.callbacks) context.nav.callbacks.onSkip();
2551
2572
  else context.onClose();
2552
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 placement = step.badge?.placement === "top" || step.badge?.placement === "left" || step.badge?.placement === "right" ? step.badge.placement : "bottom";
2583
+ const badge = doc.createElement("div");
2584
+ badge.className = "veo-composite-badge";
2585
+ badge.setAttribute("role", "button");
2586
+ badge.tabIndex = 0;
2587
+ badge.style.cursor = "pointer";
2588
+ badge.style.display = "inline-flex";
2589
+ badge.style.alignItems = "center";
2590
+ this.buildContent(badge, step.badge?.blocks ?? [], doc, context, idx, [], host);
2591
+ root.appendChild(badge);
2592
+ const wrapper = doc.createElement("div");
2593
+ wrapper.className = "veo-composite-anchored";
2594
+ wrapper.style.display = "none";
2595
+ const caretEl = design.caret === false ? null : makeCaret(doc, design);
2596
+ if (caretEl) wrapper.appendChild(caretEl);
2597
+ wrapper.appendChild(card);
2598
+ root.appendChild(wrapper);
2599
+ host.style.display = "inline-block";
2600
+ const pos = inlinePosOf(step.inlinePosition);
2601
+ insertHost(anchor, host, pos);
2602
+ this.registerCleanup(keepHostAttached(host, anchorSelector, pos));
2603
+ let open = false;
2604
+ let stopFloat = null;
2605
+ let closeTimer = null;
2606
+ let shownEmitted = false;
2607
+ const openTip = () => {
2608
+ if (open) return;
2609
+ open = true;
2610
+ wrapper.style.display = "block";
2611
+ void anchorPosition(badge, wrapper, caretEl, placement).then((stop) => {
2612
+ if (open) stopFloat = stop;
2613
+ else stop();
2614
+ });
2615
+ if (!shownEmitted) {
2616
+ shownEmitted = true;
2617
+ context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: "shown" });
2618
+ }
2619
+ };
2620
+ const closeTip = () => {
2621
+ open = false;
2622
+ wrapper.style.display = "none";
2623
+ stopFloat?.();
2624
+ stopFloat = null;
2625
+ };
2626
+ if (trigger === "hover") {
2627
+ const cancelClose = () => {
2628
+ if (closeTimer !== null) {
2629
+ clearTimeout(closeTimer);
2630
+ closeTimer = null;
2631
+ }
2632
+ };
2633
+ const scheduleClose = () => {
2634
+ cancelClose();
2635
+ closeTimer = window.setTimeout(closeTip, 150);
2636
+ };
2637
+ badge.addEventListener("mouseenter", () => {
2638
+ cancelClose();
2639
+ openTip();
2640
+ });
2641
+ badge.addEventListener("mouseleave", scheduleClose);
2642
+ badge.addEventListener("focus", openTip);
2643
+ wrapper.addEventListener("mouseenter", cancelClose);
2644
+ wrapper.addEventListener("mouseleave", scheduleClose);
2645
+ } else {
2646
+ badge.addEventListener("click", () => {
2647
+ if (open) closeTip();
2648
+ else openTip();
2649
+ });
2650
+ }
2651
+ this.registerCleanup(() => {
2652
+ stopFloat?.();
2653
+ if (closeTimer !== null) clearTimeout(closeTimer);
2654
+ });
2655
+ return closeTip;
2656
+ }
2553
2657
  };
2554
2658
  function inlinePosOf(p) {
2555
2659
  return p === "before" || p === "prepend" || p === "append" ? p : "after";
@@ -2611,10 +2715,10 @@ function liftTarget(anchor, zIndex) {
2611
2715
  el.style.zIndex = prevZ;
2612
2716
  };
2613
2717
  }
2614
- async function anchorPosition(anchor, wrapper, caret) {
2718
+ async function anchorPosition(anchor, wrapper, caret, preferred = "bottom") {
2615
2719
  const update = async () => {
2616
2720
  const { x, y, placement, middlewareData } = await dom.computePosition(anchor, wrapper, {
2617
- placement: "bottom",
2721
+ placement: preferred,
2618
2722
  strategy: "fixed",
2619
2723
  middleware: [
2620
2724
  dom.offset(caret ? 10 : 8),