veo-sdk 0.5.27 → 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/index.cjs CHANGED
@@ -2626,7 +2626,8 @@ var init_composite_renderer = __esm({
2626
2626
  const idx = context.nav?.stepIndex ?? 0;
2627
2627
  const step = context.guide.guideSteps[idx];
2628
2628
  if (!step) return;
2629
- const anchorSelector = step.position === "relative-to-element" || step.presentation === "inline" ? step.anchorSelector?.trim() || void 0 : void 0;
2629
+ const badgeMode = step.badge?.enabled === true;
2630
+ const anchorSelector = step.position === "relative-to-element" || step.presentation === "inline" || badgeMode ? step.anchorSelector?.trim() || void 0 : void 0;
2630
2631
  let anchor = null;
2631
2632
  if (anchorSelector) {
2632
2633
  anchor = await waitForElement(anchorSelector);
@@ -2663,8 +2664,13 @@ var init_composite_renderer = __esm({
2663
2664
  this.buildContent(card, step.blocks ?? [], doc, context, idx, readers, host);
2664
2665
  const lastBlock = card.lastElementChild;
2665
2666
  if (lastBlock && !lastBlock.style.marginBottom) lastBlock.style.marginBottom = "0";
2667
+ let closeTooltip = null;
2666
2668
  if (design.closeButton !== false) {
2667
2669
  const closeBtn = createCloseButton(doc, () => {
2670
+ if (closeTooltip) {
2671
+ closeTooltip();
2672
+ return;
2673
+ }
2668
2674
  dismiss("dismissed");
2669
2675
  this.closeOrSkip(context);
2670
2676
  });
@@ -2683,6 +2689,21 @@ var init_composite_renderer = __esm({
2683
2689
  }
2684
2690
  card.appendChild(closeBtn);
2685
2691
  }
2692
+ if (badgeMode && anchor) {
2693
+ closeTooltip = this.renderBadgeMode(
2694
+ step,
2695
+ card,
2696
+ anchor,
2697
+ anchorSelector,
2698
+ host,
2699
+ root,
2700
+ doc,
2701
+ context,
2702
+ idx,
2703
+ design
2704
+ );
2705
+ return;
2706
+ }
2686
2707
  if (step.presentation === "inline" && anchor) {
2687
2708
  host.style.display = "block";
2688
2709
  const pos = inlinePosOf(step.inlinePosition);
@@ -2872,6 +2893,88 @@ var init_composite_renderer = __esm({
2872
2893
  if (context.nav?.callbacks) context.nav.callbacks.onSkip();
2873
2894
  else context.onClose();
2874
2895
  }
2896
+ /**
2897
+ * Modo BADGE: inserta un MARCADOR permanente (compuesto con `step.badge.blocks`)
2898
+ * junto al ancla, en el flujo del DOM. Al hover/click abre la `card` (los
2899
+ * bloques del paso) como TOOLTIP anclado al marcador. Devuelve una función que
2900
+ * cierra el tooltip (para el ✕). El marcador nunca se descarta.
2901
+ */
2902
+ renderBadgeMode(step, card, anchor, anchorSelector, host, root, doc, context, idx, design) {
2903
+ const trigger = step.badge?.trigger === "click" ? "click" : "hover";
2904
+ const badge = doc.createElement("div");
2905
+ badge.className = "veo-composite-badge";
2906
+ badge.setAttribute("role", "button");
2907
+ badge.tabIndex = 0;
2908
+ badge.style.cursor = "pointer";
2909
+ badge.style.display = "inline-flex";
2910
+ badge.style.alignItems = "center";
2911
+ this.buildContent(badge, step.badge?.blocks ?? [], doc, context, idx, [], host);
2912
+ root.appendChild(badge);
2913
+ const wrapper = doc.createElement("div");
2914
+ wrapper.className = "veo-composite-anchored";
2915
+ wrapper.style.display = "none";
2916
+ const caretEl = design.caret === false ? null : makeCaret(doc, design);
2917
+ if (caretEl) wrapper.appendChild(caretEl);
2918
+ wrapper.appendChild(card);
2919
+ root.appendChild(wrapper);
2920
+ host.style.display = "inline-block";
2921
+ const pos = inlinePosOf(step.inlinePosition);
2922
+ insertHost(anchor, host, pos);
2923
+ this.registerCleanup(keepHostAttached(host, anchorSelector, pos));
2924
+ let open = false;
2925
+ let stopFloat = null;
2926
+ let closeTimer = null;
2927
+ let shownEmitted = false;
2928
+ const openTip = () => {
2929
+ if (open) return;
2930
+ open = true;
2931
+ wrapper.style.display = "block";
2932
+ void anchorPosition(badge, wrapper, caretEl).then((stop) => {
2933
+ if (open) stopFloat = stop;
2934
+ else stop();
2935
+ });
2936
+ if (!shownEmitted) {
2937
+ shownEmitted = true;
2938
+ context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: "shown" });
2939
+ }
2940
+ };
2941
+ const closeTip = () => {
2942
+ open = false;
2943
+ wrapper.style.display = "none";
2944
+ stopFloat?.();
2945
+ stopFloat = null;
2946
+ };
2947
+ if (trigger === "hover") {
2948
+ const cancelClose = () => {
2949
+ if (closeTimer !== null) {
2950
+ clearTimeout(closeTimer);
2951
+ closeTimer = null;
2952
+ }
2953
+ };
2954
+ const scheduleClose = () => {
2955
+ cancelClose();
2956
+ closeTimer = window.setTimeout(closeTip, 150);
2957
+ };
2958
+ badge.addEventListener("mouseenter", () => {
2959
+ cancelClose();
2960
+ openTip();
2961
+ });
2962
+ badge.addEventListener("mouseleave", scheduleClose);
2963
+ badge.addEventListener("focus", openTip);
2964
+ wrapper.addEventListener("mouseenter", cancelClose);
2965
+ wrapper.addEventListener("mouseleave", scheduleClose);
2966
+ } else {
2967
+ badge.addEventListener("click", () => {
2968
+ if (open) closeTip();
2969
+ else openTip();
2970
+ });
2971
+ }
2972
+ this.registerCleanup(() => {
2973
+ stopFloat?.();
2974
+ if (closeTimer !== null) clearTimeout(closeTimer);
2975
+ });
2976
+ return closeTip;
2977
+ }
2875
2978
  };
2876
2979
  CLOSE_INSET = "10px";
2877
2980
  }