veo-sdk 0.5.20 → 0.5.21

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/safe-env.ts","../src/core/builder-constants.ts","../src/core/builder-token.ts","../src/plugins/autocapture/constants.ts","../src/plugins/autocapture/selector-builder.ts","../src/utils/uuid.ts","../src/plugins/guides/constants.ts","../src/plugins/guides/rich-text.ts","../src/plugins/guides/block-builder.ts","../src/plugins/guides/guide-design.ts","../src/plugins/guides/inline-host.ts","../src/plugins/guides/wait-for-element.ts","../src/plugins/guides/styles.ts","../src/plugins/guides/renderers/base-renderer.ts","../src/plugins/guides/renderers/floating-arrow.ts","../src/plugins/guides/renderers/badge-renderer.ts","../src/plugins/guides/walkthrough-block-builder.ts","../src/plugins/guides/renderers/banner-renderer.ts","../src/plugins/guides/renderers/custom-frame.ts","../src/plugins/guides/code-block.ts","../src/plugins/guides/form-content.ts","../src/plugins/guides/renderers/composite-renderer.ts","../src/plugins/guides/renderers/custom-renderer.ts","../src/plugins/guides/renderers/form-renderer.ts","../src/plugins/guides/renderers/inline-custom-renderer.ts","../src/plugins/guides/renderers/inline-form-renderer.ts","../src/plugins/guides/renderers/inline-renderer.ts","../src/plugins/guides/renderers/modal-renderer.ts","../src/plugins/guides/renderers/tooltip-renderer.ts","../src/plugins/guides/renderers/walkthrough-renderer.ts","../src/plugins/guides/guide-preview.ts","../src/plugins/builder/block-drop-target.ts","../src/plugins/builder/bridge-protocol.ts","../src/plugins/builder/builder-panel.ts","../src/plugins/builder/design-manipulator.ts","../src/plugins/builder/element-picker.ts","../src/plugins/builder/builder-mode.ts","../src/plugins/builder/builder-session.ts","../src/plugins/builder/index.ts","../src/contract/v1.ts","../src/core/api-url.ts","../src/core/builder-loader.ts","../src/core/preview-loader.ts","../src/plugins/plugin.ts","../src/plugins/autocapture/dom-listener.ts","../src/plugins/autocapture/element-serializer.ts","../src/plugins/autocapture/pii-guard.ts","../src/plugins/autocapture/throttle.ts","../src/plugins/autocapture/index.ts","../src/plugins/spa-router.ts","../src/core/client.ts","../src/core/queue.ts","../src/core/session.ts","../src/core/storage.ts","../src/core/transport.ts","../src/core/setup.ts","../src/plugins/guides/index.ts","../src/plugins/guides/guides-controller.ts","../src/plugins/guides/guide-frequency-cache.ts","../src/plugins/guides/guide-resolver-client.ts","../src/plugins/guides/guide-tracker-client.ts","../src/plugins/guides/guide-tracker-queue.ts","../src/plugins/guides/url-match.ts","../src/plugins/guides/walkthrough-state.ts","../src/plugins/guides/preview-mode.ts","../src/index.ts"],"names":["classes","classPart","init_constants","rebuilt","nodes","clamp","computePosition","offset","flip","shift","arrow","active","node","ready","renderer","MIN_W","MIN_H","session","isInteractive","END_USER_ID_KEY","RETRY_MAX_DELAY_MS"],"mappings":";;;;;;;;;;;;;;;AAOO,SAAS,SAAA,GAAqB;AACnC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA;AAC3B;AAGO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,OAAO,QAAA,KAAa,WAAA;AAC7B;AAGO,SAAS,eAAA,GAA2B;AACzC,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,KAAA;AAChD,IAAA,MAAM,OAAA,GAAU,cAAA;AAChB,IAAA,YAAA,CAAa,OAAA,CAAQ,SAAS,GAAG,CAAA;AACjC,IAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,SAAS,sBAAA,GAAkC;AAChD,EAAA,OAAO,OAAO,SAAA,KAAc,WAAA,IAAe,OAAO,UAAU,UAAA,KAAe,UAAA;AAC7E;AAhCA,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uBAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAQa,mBAAA,EAEA,oBAAA,EAEA,mBAAA,EAEA,wBAAA,EAEA,mBAAA;AAhBb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAQO,IAAM,mBAAA,GAAsB,YAAA;AAE5B,IAAM,oBAAA,GAAuB,kBAAA;AAE7B,IAAM,mBAAA,GAAsB,iBAAA;AAE5B,IAAM,wBAAA,GAA2B,qBAAA;AAEjC,IAAM,mBAAA,GAAsB,UAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACkDnC,SAAS,OAAA,GAA0B;AACjC,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,cAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,KAAA,GAAwB;AAC/B,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,YAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,MAAM,KAAA,EAA8B;AAC3C,EAAA,OAAO,aAAa,KAAA,IAAS,SAAA,CAAA;AAC/B;AAGA,SAAS,QAAQ,GAAA,EAAiC;AAChD,EAAA,IAAI;AACF,IAAA,OAAA,IAAW,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI;AACF,IAAA,MAAM,SAAoB,EAAE,GAAG,KAAK,OAAA,EAAS,IAAA,CAAK,KAAI,EAAE;AACxD,IAAA,KAAA,EAAM,EAAG,QAAQ,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EAC3D,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAGA,SAAS,kBAAA,GAAkD;AACzD,EAAA,MAAM,QAAQ,KAAA,EAAM;AACpB,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,IAAI,IAAA,GAAyB,IAAA;AAC7B,EAAA,IAAI;AACF,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AACvB,MAAA,IAAI,CAAC,GAAA,EAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC7B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAI,MAAA,GAA2B,IAAA;AAC/B,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,MACzB,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,QAAQ,OAAA,KAAY,QAAA,IAAY,KAAK,GAAA,EAAI,GAAI,MAAA,CAAO,OAAA,GAAU,cAAA,EAAgB;AACvF,QAAA,IAAI;AACF,UAAA,KAAA,CAAM,WAAW,GAAG,CAAA;AAAA,QACtB,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,SAAS,IAAA,GAAO,MAAA;AAAA,IACrD;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,KAAI,GAAI,IAAA;AACtC,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,SAAA,GAAoC;AAC3C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,mBAAmB,CAAA,EAAG,OAAO,MAAA;AAM5C,IAAA,MAAM,OAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,MAAM,EAAE,CAAA;AAClD,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG,mBAAmB,GAAG,CAAA,EAAG,OAAO,IAAI,eAAA,CAAgB,IAAI,CAAA;AAC7E,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAOO,SAAS,qBAAA,GAAqD;AACnE,EAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,IAAA;AACzB,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,OAAA,GAAU,MAAA,EAAQ,GAAA,CAAI,mBAAmB,CAAA;AAC/C,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,GAAA,GAA4B;AAAA,MAChC,KAAA,EAAO,OAAA;AAAA,MACP,MAAA,EAAQ,MAAA,EAAQ,GAAA,CAAI,oBAAoB,CAAA,IAAK,IAAA;AAAA,MAC7C,KAAA,EAAO,MAAA,EAAQ,GAAA,CAAI,mBAAmB,CAAA,KAAM,GAAA;AAAA,MAC5C,KAAA,EAAO,MAAA,EAAQ,GAAA,CAAI,mBAAmB,CAAA,IAAK,IAAA;AAAA,MAC3C,SAAA,EAAW,MAAA,EAAQ,GAAA,CAAI,wBAAwB,CAAA,IAAK;AAAA,KACtD;AACA,IAAA,OAAA,CAAQ,GAAG,CAAA;AACX,IAAA,OAAO,GAAA;AAAA,EACT;AAIA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,OAAA,EAAQ,EAAG,OAAA,CAAQ,OAAO,CAAA;AACtC,IAAA,IAAI,GAAA,EAAK,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,MAAM,YAAY,kBAAA,EAAmB;AACrC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAI;AACF,MAAA,OAAA,IAAW,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,IACvD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,SAAA;AACT;AAGO,SAAS,mBAAA,GAAqC;AACnD,EAAA,OAAO,qBAAA,IAAyB,KAAA,IAAS,IAAA;AAC3C;AAQO,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,uBAAsB,KAAM,IAAA;AACrC;AAOO,SAAS,iBAAA,GAA0B;AACxC,EAAA,IAAI,CAAC,WAAU,EAAG;AAClB,EAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,OAAA,EAAQ,EAAG,OAAA,CAAQ,OAAO,CAAA;AACtC,IAAA,IAAI,KAAK,KAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,EAA2B,KAAA,IAAS,IAAA;AAAA,EACtE,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI;AACF,IAAA,OAAA,EAAQ,EAAG,WAAW,OAAO,CAAA;AAAA,EAC/B,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI;AACF,IAAA,KAAA,EAAM,EAAG,UAAA,CAAW,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAxOA,IA6CM,SAOA,SAAA,EAQA,cAAA;AA5DN,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AAmBA,IAAA,aAAA,EAAA;AACA,IAAA,sBAAA,EAAA;AASA,IAAA,sBAAA,EAAA;AAgBA,IAAM,OAAA,GAAU,iBAAA;AAOhB,IAAM,SAAA,GAAY,kBAAA;AAQlB,IAAM,cAAA,GAAiB,KAAK,EAAA,GAAK,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5DjC,IACa,0BAAA,EAcA,aAAA,EAGA,sBAAA,EAuBA,oBAAA,EAGA,mBAAA,EAcA,qBAAA;AA1Db,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AACO,IAAM,0BAAA,GAA6B;AAAA,MACxC,OAAA,EAAS,IAAA;AAAA,MACT,aAAA,EAAe,IAAA;AAAA,MACf,cAAA,EAAgB,IAAA;AAAA,MAChB,cAAA,EAAgB,IAAA;AAAA,MAChB,aAAA,EAAe,IAAA;AAAA,MACf,WAAA,EAAa,KAAA;AAAA,MACb,UAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAe,GAAA;AAAA,MACf,sBAAA,EAAwB,IAAA;AAAA,MACxB,gBAAA,EAAkB;AAAA,KACpB;AAGO,IAAM,aAAA,GAAgB,EAAA;AAGtB,IAAM,sBAAA,GAAyB;AAAA,MACpC,mBAAA;AAAA,MACA,aAAA;AAAA;AAAA,MAEA,wBAAA;AAAA,MACA,qBAAA;AAAA,MACA,mBAAA;AAAA,MACA,sBAAA;AAAA;AAAA,MAEA,4BAAA;AAAA,MACA,yBAAA;AAAA,MACA,yBAAA;AAAA,MACA,0BAAA;AAAA;AAAA,MAEA,sBAAA;AAAA,MACA,iBAAA;AAAA,MACA,oBAAA;AAAA,MACA,kBAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF;AAGO,IAAM,oBAAA,GAAuB,CAAC,OAAA,EAAS,kBAAA,EAAoB,YAAY,eAAe,CAAA;AAGtF,IAAM,mBAAA,GAAsB;AAAA,MACjC,IAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAGO,IAAM,qBAAA,GAAwB;AAAA,MACnC,qBAAA;AAAA;AAAA,MACA,+BAAA;AAAA;AAAA,MACA,4BAAA;AAAA;AAAA,MACA,iBAAA;AAAA;AAAA,MACA;AAAA;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7DO,SAAS,cAAc,SAAA,EAA4B;AACxD,EAAA,OAAO,sBAAsB,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AACxE;AAGO,SAAS,mBAAmB,OAAA,EAA4B;AAC7D,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,aAAA,CAAc,CAAC,CAAA,IAAK,CAAA,CAAE,SAAS,EAAE,CAAA;AACvF;AA8BA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,IAAI,OAAO,GAAA,KAAQ,WAAA,IAAe,OAAO,GAAA,CAAI,WAAW,UAAA,EAAY;AAClE,IAAA,OAAO,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,qCAAA,EAAuC,MAAM,CAAA;AACpE;AAQA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,MAAM,CAAA;AACvC;AAGA,SAAS,uBAAA,CAAwB,SAAkB,GAAA,EAA4B;AAC7E,EAAA,KAAA,MAAW,QAAQ,iBAAA,EAAmB;AACpC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA;AACvC,IAAA,IAAI,SAAS,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,UAAU,qBAAA,EAAuB;AACtE,MAAA,OAAO,GAAG,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,eAAA,CAAgB,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,IAClD;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,qBAAqB,OAAA,EAA0B;AACtD,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAGxC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,cAAc,CAAA;AAClD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,eAAA,EAAkB,eAAA,CAAgB,MAAM,CAAC,CAAA,EAAA,CAAA;AAAA,EACxD;AAGA,EAAA,IAAI,QAAQ,EAAA,EAAI;AACd,IAAA,MAAMA,QAAAA,GAAU,mBAAmB,OAAO,CAAA;AAC1C,IAAA,MAAMC,UAAAA,GAAYD,QAAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,CAAA,CAAA,EAAIA,QAAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,GAAK,EAAA;AAChF,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,SAAA,CAAU,QAAQ,EAAE,CAAC,GAAGC,UAAS,CAAA,CAAA;AAAA,EACpD;AAGA,EAAA,MAAM,YAAA,GAAe,uBAAA,CAAwB,OAAA,EAAS,GAAG,CAAA;AACzD,EAAA,IAAI,cAAc,OAAO,YAAA;AAGzB,EAAA,MAAM,OAAA,GAAU,mBAAmB,OAAO,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,GAAK,EAAA;AAChF,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,EAAG,SAAS,CAAA,CAAA;AAC3B;AAGO,SAAS,iBAAA,CAAkB,OAAA,EAAkB,YAAA,GAAe,CAAA,EAAW;AAC5E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,OAAA,GAA0B,OAAA;AAC9B,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,OAAO,OAAA,IAAW,OAAA,KAAY,QAAA,CAAS,eAAA,IAAmB,SAAS,YAAA,EAAc;AAC/E,IAAA,KAAA,CAAM,OAAA,CAAQ,oBAAA,CAAqB,OAAO,CAAC,CAAA;AAC3C,IAAA,OAAA,GAAU,OAAA,CAAQ,aAAA;AAClB,IAAA,KAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AACzB;AA5GA,IAkBM,iBAAA,EAmBA,qBAAA;AArCN,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6CAAA,GAAA;AAAA,IAAA,cAAA,EAAA;AAkBA,IAAM,iBAAA,GAAoB;AAAA,MACxB,aAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAM,qBAAA,GAAwB,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3BvB,SAAS,MAAA,GAAiB;AAC/B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,UAAU,SAAA,CAAU,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,IAAI,GAAG,CAAA;AAGvD,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,EAAE,CAAA;AAChC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,oBAAoB,UAAA,EAAY;AACjF,IAAA,MAAA,CAAO,gBAAgB,MAAM,CAAA;AAAA,EAC/B,CAAA,MAAO;AAEL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,KAAW,GAAG,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAA,MAAA,CAAO,CAAC,CAAA,GAAA,CAAM,MAAA,CAAO,CAAC,CAAA,IAAK,KAAK,EAAA,GAAQ,GAAA;AAExC,EAAA,MAAA,CAAO,CAAC,CAAA,GAAA,CAAM,MAAA,CAAO,CAAC,CAAA,IAAK,KAAK,EAAA,GAAQ,GAAA;AAExC,EAAA,MAAM,MAAM,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAE9E,EAAA,OAAO;AAAA,IACL,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IAClB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IACnB,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IACd,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IACd,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE;AAAA,GACjB,CAAE,KAAK,GAAG,CAAA;AACZ;AAvCA,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mBAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IACa,aAAA,EAGA,sBAAA,EAGA,kBAAA,EAGA,eAAA,EAOA,0BAAA,EAGA,iCAAA,EAGA,0BAAA,EAGA,2BAAA,EAGA,2BAAA,EAGA,sBAAA,EAOA,4BAAA,EAOA,kCAAA,EAOA,oCAAA;AArDb,IAAAC,eAAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AACO,IAAM,aAAA,GAAgB,UAAA;AAGtB,IAAM,sBAAA,GAAyB,GAAA;AAG/B,IAAM,kBAAA,GAA4C,CAAC,OAAA,EAAS,QAAQ,CAAA;AAGpE,IAAM,eAAA,GAAkB,gBAAA;AAOxB,IAAM,0BAAA,GAA6B,WAAA;AAGnC,IAAM,iCAAA,GAAoC,GAAA;AAG1C,IAAM,0BAAA,GAA6B,CAAA;AAGnC,IAAM,2BAAA,GAA8B,CAAA;AAGpC,IAAM,2BAAA,GAA8B,GAAA;AAGpC,IAAM,sBAAA,GAAyB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAOnD,IAAM,4BAAA,GAA+B,wBAAA;AAOrC,IAAM,kCAAA,GAAqC,KAAK,EAAA,GAAK,GAAA;AAOrD,IAAM,oCAAA,GAAuC,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACS7C,SAAS,cAAA,CAAe,MAAc,GAAA,EAAiC;AAC5E,EAAA,MAAM,QAAA,GAAW,IAAI,sBAAA,EAAuB;AAC5C,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,QAAA;AAE1D,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,WAAU,CAAE,eAAA;AAAA,MACvB,KAAK,MAAA,GAAS,aAAA,GAAgB,KAAK,KAAA,CAAM,CAAA,EAAG,aAAa,CAAA,GAAI,IAAA;AAAA,MAC7D;AAAA,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,QAAA,CAAS,WAAA,CAAY,GAAA,CAAI,cAAA,CAAe,IAAI,CAAC,CAAA;AAC7C,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,EAAE,KAAA,EAAO,CAAA,EAAG,UAAU,KAAA,EAAM;AAC3C,EAAA,KAAA,MAAW,SAAS,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AACtD,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,EAAO,GAAA,EAAK,GAAG,MAAM,CAAA;AACjD,IAAA,IAAI,OAAA,EAAS,QAAA,CAAS,WAAA,CAAY,OAAO,CAAA;AAAA,EAC3C;AAGA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAI,sBAAA,EAAuB;AACzC,IAAA,KAAA,CAAM,YAAY,GAAA,CAAI,cAAA,CAAe,OAAO,IAAA,CAAK,WAAA,IAAe,EAAE,CAAC,CAAA;AACnE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,WAAA,CACP,IAAA,EACA,GAAA,EACA,KAAA,EACA,MAAA,EACa;AACb,EAAA,IAAI,MAAA,CAAO,UAAU,OAAO,IAAA;AAC5B,EAAA,IAAI,EAAE,MAAA,CAAO,KAAA,GAAQ,SAAA,IAAa,QAAQ,SAAA,EAAW;AACnD,IAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,SAAA,EAAW;AACpC,IAAA,OAAO,GAAA,CAAI,cAAA,CAAe,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA;AAAA,EAClD;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc,OAAO,IAAA;AAEhD,EAAA,MAAM,EAAA,GAAK,IAAA;AACX,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,OAAO,GAAG,OAAO,IAAA;AACtC,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,EAAA,CAAG,OAAO,CAAA;AAGtC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAA,GAAO,IAAI,sBAAA,EAAuB;AACxC,IAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,UAAU,CAAA,EAAG;AAC7C,MAAA,MAAMC,WAAU,WAAA,CAAY,KAAA,EAAO,GAAA,EAAK,KAAA,GAAQ,GAAG,MAAM,CAAA;AACzD,MAAA,IAAIA,QAAAA,EAAS,IAAA,CAAK,WAAA,CAAYA,QAAO,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA,IAAK,EAAA;AACxC,IAAA,IAAI,CAAC,SAAA,CAAU,IAAI,CAAA,EAAG;AACpB,MAAA,MAAM,IAAA,GAAO,IAAI,sBAAA,EAAuB;AACxC,MAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,UAAU,CAAA,EAAG;AAC7C,QAAA,MAAMA,WAAU,WAAA,CAAY,KAAA,EAAO,GAAA,EAAK,KAAA,GAAQ,GAAG,MAAM,CAAA;AACzD,QAAA,IAAIA,QAAAA,EAAS,IAAA,CAAK,WAAA,CAAYA,QAAO,CAAA;AAAA,MACvC;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,GAAG,CAAA;AAC/B,IAAA,CAAA,CAAE,YAAA,CAAa,QAAQ,IAAI,CAAA;AAC3B,IAAA,CAAA,CAAE,YAAA,CAAa,UAAU,QAAQ,CAAA;AACjC,IAAA,CAAA,CAAE,YAAA,CAAa,OAAO,8BAA8B,CAAA;AACpD,IAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,UAAU,CAAA,EAAG;AAC7C,MAAA,MAAMA,WAAU,WAAA,CAAY,KAAA,EAAO,GAAA,EAAK,KAAA,GAAQ,GAAG,MAAM,CAAA;AACzD,MAAA,IAAIA,QAAAA,EAAS,CAAA,CAAE,WAAA,CAAYA,QAAO,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,MAAM,CAAA;AACxC,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,UAAU,CAAA,EAAG;AAC7C,IAAA,MAAM,YAAY,WAAA,CAAY,KAAA,EAAO,GAAA,EAAK,KAAA,GAAQ,GAAG,MAAM,CAAA;AAC3D,IAAA,IAAI,SAAA,EAAW,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,OAAA;AACT;AAxJA,IAkBM,YAAA,EAoBA,SAAA,EAeA,aAAA,EACA,SAAA,EACA,SAAA;AAvDN,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAAA,IAAA,kBAAA,EAAA;AAkBA,IAAM,YAAA,GAAuC;AAAA,MAC3C,CAAA,EAAG,GAAA;AAAA,MACH,EAAA,EAAI,IAAA;AAAA,MACJ,MAAA,EAAQ,QAAA;AAAA,MACR,CAAA,EAAG,QAAA;AAAA,MACH,EAAA,EAAI,IAAA;AAAA,MACJ,CAAA,EAAG,IAAA;AAAA,MACH,CAAA,EAAG,GAAA;AAAA,MACH,CAAA,EAAG,GAAA;AAAA,MACH,EAAA,EAAI,IAAA;AAAA,MACJ,EAAA,EAAI,IAAA;AAAA,MACJ,EAAA,EAAI,IAAA;AAAA,MACJ,CAAA,EAAG;AAAA,KACL;AAOA,IAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA,MACxB,QAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAM,gBAAgB,EAAA,GAAK,IAAA;AAC3B,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,SAAA,GAAY,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/BX,SAAS,gBAAA,CACd,IAAA,EACA,GAAA,EACA,SAAA,EACa;AACb,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACzC,EAAA,SAAA,CAAU,SAAA,GAAY,mBAAA;AAEtB,EAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA;AACnC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,YAAA,CAAa,SAAA,EAAW,MAAA,EAAQ,GAAA,EAAK,SAAS,CAAA;AAAA,EAChD,CAAA,MAAO;AACL,IAAA,gBAAA,CAAiB,SAAA,EAAW,IAAA,EAAM,GAAA,EAAK,SAAS,CAAA;AAAA,EAClD;AAGA,EAAA,SAAA,CAAU,YAAY,iBAAA,CAAkB,GAAA,EAAK,MAAM,SAAA,CAAU,SAAA,EAAW,CAAC,CAAA;AAEzE,EAAA,OAAO,SAAA;AACT;AASO,SAAS,iBAAA,CAAkB,MAAiB,GAAA,EAA8B;AAC/E,EAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA;AACnC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAMC,SAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,EAAE,KAAA,EAAO,GAAA,EAAI,IAAK,MAAA,EAAQ;AACnC,MAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,KAAA,EAAO,GAAG,CAAA;AACzC,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO,GAAG,CAAA;AAChC,MAAAA,MAAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AACA,IAAA,OAAOA,MAAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,IAAI,OAAO,KAAK,QAAA,KAAa,QAAA,IAAY,KAAK,QAAA,IAAY,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA,EAAG;AAClF,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,SAAA,GAAY,iBAAA;AAChB,IAAA,GAAA,CAAI,MAAM,IAAA,CAAK,QAAA;AACf,IAAA,GAAA,CAAI,MAAM,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,GAAQ,EAAA;AACxD,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EAChB;AACA,EAAA,IAAI,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,IAAY,KAAK,KAAA,EAAO;AAChD,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,OAAA,CAAQ,SAAA,GAAY,iBAAA;AACpB,IAAA,OAAA,CAAQ,cAAc,IAAA,CAAK,KAAA;AAC3B,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,EACpB;AACA,EAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,IAAY,KAAK,OAAA,EAAS;AACpD,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,SAAA,CAAU,SAAA,GAAY,gBAAA;AACtB,IAAA,SAAA,CAAU,cAAc,IAAA,CAAK,OAAA;AAC7B,IAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,gBAAA,CACP,SAAA,EACA,IAAA,EACA,GAAA,EACA,SAAA,EACM;AACN,EAAA,IAAI,OAAO,KAAK,QAAA,KAAa,QAAA,IAAY,KAAK,QAAA,IAAY,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA,EAAG;AAClF,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,GAAA,CAAI,SAAA,GAAY,iBAAA;AAChB,IAAA,GAAA,CAAI,MAAM,IAAA,CAAK,QAAA;AACf,IAAA,GAAA,CAAI,MAAM,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,GAAQ,EAAA;AACxD,IAAA,SAAA,CAAU,YAAY,GAAG,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,IAAY,KAAK,KAAA,EAAO;AAChD,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,IAAI,CAAA;AACtC,IAAA,OAAA,CAAQ,SAAA,GAAY,iBAAA;AACpB,IAAA,OAAA,CAAQ,cAAc,IAAA,CAAK,KAAA;AAC3B,IAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,IAAY,KAAK,OAAA,EAAS;AACpD,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,SAAA,CAAU,SAAA,GAAY,gBAAA;AACtB,IAAA,SAAA,CAAU,cAAc,IAAA,CAAK,OAAA;AAC7B,IAAA,SAAA,CAAU,YAAY,SAAS,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACvC,EAAA,OAAA,CAAQ,SAAA,GAAY,mBAAA;AAEpB,EAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,IAAY,KAAK,OAAA,EAAS;AACpD,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACtC,IAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,eAAA;AAChB,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,OAAA;AACvB,IAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAClC,MAAA,MAAM,MAAA,GAAoB,KAAK,SAAA,IAAa,SAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,MAAA,SAAA,CAAU,UAAA,CAAW,QAAQ,MAAM,CAAA;AAAA,IACrC,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AAAA,EACzB;AAEA,EAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAC/B;AAQA,SAAS,gBAAgB,IAAA,EAAkE;AACzF,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACpE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAChB,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,MAAS,EAAE,KAAA,EAAO,GAAA,EAAI,CAAE,CAAA,CACpC,MAAA,CAAO,CAAC,KAAA,KAAsD;AAC7D,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA;AAChB,IAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,UAAU,OAAO,KAAA;AACxC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS,OAAO,OAAO,EAAE,GAAA,KAAQ,QAAA,IAAY,SAAA,CAAU,CAAA,CAAE,GAAG,CAAA;AAC3E,IAAA,OAAO,EAAE,IAAA,KAAS,OAAA,IAAW,EAAE,IAAA,KAAS,MAAA,IAAU,EAAE,IAAA,KAAS,QAAA;AAAA,EAC/D,CAAC,CAAA;AACH,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,IAAA;AACpC;AAOA,SAAS,YAAA,CACP,SAAA,EACA,MAAA,EACA,GAAA,EACA,SAAA,EACM;AACN,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,OAAO,MAAA,EAAQ;AACxB,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACvC,MAAA,OAAA,CAAQ,SAAA,GAAY,mBAAA;AAEpB,MAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAGzC,MAAA,IAAI,QAAA;AACJ,MAAA,OAAO,CAAA,GAAI,OAAO,MAAA,IAAU,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,CAAM,SAAS,QAAA,EAAU;AAC9D,QAAA,MAAM,QAAA,GAAY,MAAA,CAAO,CAAC,CAAA,CAA2B,KAAA;AACrD,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,CAAA,GAAK,SAAS,KAAA,EAAsD,KAAA;AAC1E,UAAA,IAAI,MAAM,MAAA,IAAU,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,SAAS,QAAA,GAAW,CAAA;AAAA,QAClE;AACA,QAAA,OAAA,CAAQ,WAAA,CAAY,gBAAA,CAAiB,QAAA,EAAU,GAAA,EAAK,SAAS,CAAC,CAAA;AAC9D,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,KAAA,CAAM,cAAA,GAAiB,iBAAiB,QAAQ,CAAA;AACtE,MAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAO,KAAA,GAAQ,iBAAA,CAAkB,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA,GAAI,IAAA;AAC3D,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACtC,MAAA,SAAA,CAAU,YAAY,IAAI,CAAA;AAAA,IAC5B;AACA,IAAA,CAAA,EAAA;AAAA,EACF;AACF;AAEO,SAAS,iBAAA,CAAkB,OAAkB,GAAA,EAAmC;AACrF,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,aAAA,CAAc,IAAI,CAAA;AACjC,MAAA,EAAA,CAAG,SAAA,GAAY,iBAAA;AACf,MAAA,EAAA,CAAG,cAAc,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,EAAA;AAC/D,MAAA,eAAA,CAAgB,EAAA,EAAI,KAAA,CAAM,KAAA,EAAO,MAAM,CAAA;AACvC,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,IACA,KAAK,MAAA,EAAQ;AAEX,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AAClC,MAAA,EAAA,CAAG,SAAA,GAAY,gBAAA;AACf,MAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,MAAM,IAAA,EAAM;AAChD,QAAA,EAAA,CAAG,WAAA,CAAY,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,MAChD,CAAA,MAAO;AACL,QAAA,EAAA,CAAG,cAAc,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,EAAA;AAAA,MACjE;AACA,MAAA,eAAA,CAAgB,EAAA,EAAI,KAAA,CAAM,KAAA,EAAO,MAAM,CAAA;AACvC,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,IAAI,OAAO,MAAM,GAAA,KAAQ,QAAA,IAAY,CAAC,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,EAAG,OAAO,IAAA;AACnE,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AAClC,MAAA,EAAA,CAAG,SAAA,GAAY,iBAAA;AACf,MAAA,EAAA,CAAG,MAAM,KAAA,CAAM,GAAA;AACf,MAAA,EAAA,CAAG,GAAA,GAAM,EAAA;AACT,MAAA,eAAA,CAAgB,EAAA,EAAI,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AACxC,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,IACA;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,SAAS,gBAAA,CACP,KAAA,EACA,GAAA,EACA,SAAA,EACmB;AACnB,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACtC,EAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,EAAA,GAAA,CAAI,SAAA,GAAY,eAAA;AAChB,EAAA,GAAA,CAAI,WAAA,GAAc,OAAO,KAAA,CAAM,IAAA,KAAS,YAAY,KAAA,CAAM,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA;AAC9E,EAAA,eAAA,CAAgB,GAAA,EAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAC1C,EAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAIlC,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,IAAU,SAAA;AAC5B,IAAA,MAAM,SAAoB,GAAA,KAAQ,MAAA,IAAU,QAAQ,KAAA,IAAS,GAAA,KAAQ,UAAU,GAAA,GAAM,SAAA;AAGrF,IAAA,MAAM,MAAA,GACJ,WAAW,KAAA,IAAS,OAAO,MAAM,GAAA,KAAQ,QAAA,IAAY,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,GACpE,MAAM,GAAA,GACN,MAAA,KAAW,WAAW,OAAO,KAAA,CAAM,kBAAkB,QAAA,IAAY,KAAA,CAAM,aAAA,GACrE,KAAA,CAAM,aAAA,GACN,MAAA;AACR,IAAA,MAAM,IAAA,GAAiC;AAAA,MACrC,GAAI,OAAO,KAAA,CAAM,EAAA,KAAO,QAAA,IAAY,KAAA,CAAM,EAAA,GAAK,EAAE,QAAA,EAAU,KAAA,CAAM,EAAA,EAAG,GAAI,EAAC;AAAA,MACzE,GAAI,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,IAAA,GAAO,EAAE,UAAA,EAAY,KAAA,CAAM,IAAA,EAAK,GAAI;AAAC,KACnF;AACA,IAAA,SAAA,CAAU,UAAA,CAAW,QAAQ,MAAA,EAAQ,MAAA,CAAO,KAAK,IAAI,CAAA,CAAE,MAAA,GAAS,IAAA,GAAO,MAAS,CAAA;AAAA,EAClF,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAQA,SAAS,QAAA,CAAS,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AAC7D,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AACvC;AAOO,SAAS,eAAA,CACd,EAAA,EACA,KAAA,EACA,IAAA,EACM;AACN,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACzC,EAAA,MAAM,CAAA,GAAI,KAAA;AAIV,EAAA,IAAI,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,KAAA,KAAU,IAAA,EAAM;AACxC,IAAA,EAAA,CAAG,SAAA,CAAU,IAAI,wBAAwB,CAAA;AACzC,IAAA;AAAA,EACF;AACA,EAAA,MAAM,QAAQ,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,GAAQ,IAAA;AACtD,EAAA,IAAI,UAAU,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,QAAA,IAAY,UAAU,OAAA,CAAA,EAAU;AAG1E,IAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,EAAA,CAAG,KAAA,CAAM,SAAA,GAAY,KAAA;AAAA,SAAA,IACjC,SAAS,OAAA,EAAS,EAAA,CAAG,KAAA,CAAM,SAAA,GAAY,iBAAiB,KAAK,CAAA;AAAA,EACxE;AACA,EAAA,IAAI,IAAA,KAAS,WAAW,OAAO,CAAA,CAAE,UAAU,QAAA,EAAU,EAAA,CAAG,KAAA,CAAM,KAAA,GAAQ,CAAA,CAAE,KAAA;AACxE,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,OAAO,CAAA,CAAE,QAAA,KAAa,YAAY,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA,EAAG;AACpF,IAAA,EAAA,CAAG,KAAA,CAAM,WAAW,CAAA,EAAG,QAAA,CAAS,EAAE,QAAA,EAAU,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,EACpD;AACA,EAAA,IAAI,IAAA,KAAS,OAAA,IAAW,OAAO,CAAA,CAAE,KAAA,KAAU,YAAY,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA,EAAG;AAC/E,IAAA,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAA,EAAG,QAAA,CAAS,EAAE,KAAA,EAAO,EAAA,EAAI,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,IAAA,KAAS,OAAA,IAAW,OAAO,CAAA,CAAE,MAAA,KAAW,YAAY,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG;AACjF,IAAA,EAAA,CAAG,KAAA,CAAM,eAAe,CAAA,EAAG,QAAA,CAAS,EAAE,MAAA,EAAQ,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,OAAO,EAAE,SAAA,KAAc,QAAA,IAAY,OAAO,QAAA,CAAS,CAAA,CAAE,SAAS,CAAA,EAAG;AACnE,IAAA,EAAA,CAAG,KAAA,CAAM,YAAY,CAAA,EAAG,QAAA,CAAS,EAAE,SAAA,EAAW,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,OAAO,EAAE,YAAA,KAAiB,QAAA,IAAY,OAAO,QAAA,CAAS,CAAA,CAAE,YAAY,CAAA,EAAG;AACzE,IAAA,EAAA,CAAG,KAAA,CAAM,eAAe,CAAA,EAAG,QAAA,CAAS,EAAE,YAAA,EAAc,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,EAC5D;AAIA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,IAAI,OAAO,EAAE,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA,EAAG;AACjE,MAAA,EAAA,CAAG,KAAA,CAAM,WAAW,CAAA,EAAG,QAAA,CAAS,EAAE,QAAA,EAAU,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,OAAO,EAAE,UAAA,KAAe,QAAA,IAAY,EAAE,UAAA,IAAc,CAAA,CAAE,eAAe,SAAA,EAAW;AAClF,MAAA,EAAA,CAAG,KAAA,CAAM,aAAa,CAAA,CAAE,UAAA;AAAA,IAC1B;AACA,IAAA,IAAI,OAAO,EAAE,UAAA,KAAe,QAAA,IAAY,EAAE,UAAA,EAAY,EAAA,CAAG,KAAA,CAAM,UAAA,GAAa,CAAA,CAAE,UAAA;AAC9E,IAAA,IAAI,OAAO,EAAE,aAAA,KAAkB,QAAA,IAAY,EAAE,aAAA,IAAiB,CAAA,CAAE,kBAAkB,MAAA,EAAQ;AACxF,MAAA,EAAA,CAAG,KAAA,CAAM,gBAAgB,CAAA,CAAE,aAAA;AAAA,IAC7B;AACA,IAAA,IAAI,OAAO,EAAE,UAAA,KAAe,QAAA,IAAY,OAAO,QAAA,CAAS,CAAA,CAAE,UAAU,CAAA,EAAG;AACrE,MAAA,EAAA,CAAG,KAAA,CAAM,aAAa,CAAA,EAAG,QAAA,CAAS,EAAE,UAAA,EAAY,EAAA,EAAI,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,OAAO,EAAE,aAAA,KAAkB,QAAA,IAAY,OAAO,QAAA,CAAS,CAAA,CAAE,aAAa,CAAA,EAAG;AAC3E,MAAA,EAAA,CAAG,KAAA,CAAM,gBAAgB,CAAA,EAAG,QAAA,CAAS,EAAE,aAAA,EAAe,EAAA,EAAI,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,IAC/D;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,EAAE,UAAA,KAAe,QAAA,IAAY,EAAE,UAAA,EAAY,EAAA,CAAG,KAAA,CAAM,UAAA,GAAa,CAAA,CAAE,UAAA;AAC9E,EAAA,IAAI,OAAO,CAAA,CAAE,WAAA,KAAgB,QAAA,IAAY,CAAA,CAAE,cAAc,CAAA,EAAG;AAC1D,IAAA,MAAM,EAAA,GAAK,OAAO,CAAA,CAAE,WAAA,KAAgB,YAAY,CAAA,CAAE,WAAA,GAAc,EAAE,WAAA,GAAc,SAAA;AAChF,IAAA,EAAA,CAAG,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,CAAA,CAAE,aAAa,CAAA,EAAG,EAAE,CAAC,CAAA,SAAA,EAAY,EAAE,CAAA,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,IAAA,KAAS,OAAA,IAAW,OAAO,CAAA,CAAE,MAAA,KAAW,YAAY,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG;AACjF,IAAA,EAAA,CAAG,KAAA,CAAM,eAAe,CAAA,EAAG,QAAA,CAAS,EAAE,MAAA,EAAQ,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,EACtD;AAEA,EAAA,KAAA,MAAW,QAAQ,CAAC,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,MAAM,CAAA,EAAY;AAC9D,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA;AAC5B,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AAC/C,MAAA,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,CAAA,QAAA,EAAW,IAAA,CAAK,WAAA,EAAa,CAAA,CAAA,EAAI,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,IAClF;AACA,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE,CAAA;AAC3B,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AAC/C,MAAA,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,CAAA,OAAA,EAAU,IAAA,CAAK,WAAA,EAAa,CAAA,CAAA,EAAI,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,IACjF;AAAA,EACF;AACF;AAUO,SAAS,iBAAA,CACd,GAAA,EACA,OAAA,EACA,SAAA,GAAY,iBAAA,EACO;AACnB,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AAC3C,EAAA,QAAA,CAAS,IAAA,GAAO,QAAA;AAChB,EAAA,QAAA,CAAS,SAAA,GAAY,SAAA;AACrB,EAAA,QAAA,CAAS,YAAA,CAAa,cAAc,QAAQ,CAAA;AAC5C,EAAA,QAAA,CAAS,WAAA,GAAc,MAAA;AACvB,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,OAAO,CAAA;AAC1C,EAAA,OAAO,QAAA;AACT;AAOO,SAAS,UAAU,GAAA,EAAsB;AAC9C,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAG,OAAO,KAAA;AACxD,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO,mBAAA;AACpE,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAChC,IAAA,OAAO,kBAAA,CAAmB,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQA,SAAS,WAAW,IAAA,EAAqC;AACvD,EAAA,MAAM,SAAA,GAAY,KAAK,KAAA,EAAO,MAAA;AAC9B,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,EAAU,OAAO,MAAA;AAC1C,EAAA,OAAO,SAAA,CAAU,SAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAC5C;AA1ZA,IA2QM,gBAAA;AA3QN,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AAAA,IAAAF,eAAAA,EAAAA;AACA,IAAA,cAAA,EAAA;AA0QA,IAAM,gBAAA,GAA2C;AAAA,MAC/C,IAAA,EAAM,YAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1MA,SAAS,KAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AAC1D,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AACvC;AAMO,SAAS,eAAA,CAAgB,MAAmB,KAAA,EAAiC;AAClF,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACzC,EAAA,MAAM,CAAA,GAAI,KAAA;AAEV,EAAA,IAAI,OAAO,CAAA,CAAE,WAAA,KAAgB,QAAA,IAAY,QAAA,CAAS,KAAK,CAAA,CAAE,WAAA,CAAY,IAAA,EAAM,CAAA,EAAG;AAC5E,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,eAAA,EAAiB,CAAA,CAAE,WAAA,CAAY,MAAM,CAAA;AAAA,EAC9D;AAGA,EAAA,IACE,OAAO,CAAA,CAAE,UAAA,KAAe,QAAA,IACxB,CAAA,CAAE,UAAA,CAAW,MAAA,IAAU,GAAA,IACvB,CAAC,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,UAAU,CAAA,EAC3B;AACA,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,YAAA,EAAc,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,CAAA,CAAE,UAAU,MAAA,EAAQ;AACtB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,MAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,EAAK,KAAK,CAAA;AAAA,IACnC;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,CAAA,CAAE,UAAA,KAAe,QAAA,IAAY,QAAA,CAAS,KAAK,CAAA,CAAE,UAAA,CAAW,IAAA,EAAM,CAAA,EAAG;AAC1E,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,UAAA,EAAY,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,IAAY,QAAA,CAAS,KAAK,CAAA,CAAE,SAAA,CAAU,IAAA,EAAM,CAAA,EAAG;AACxE,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,YAAA,EAAc,CAAA,CAAE,SAAA,CAAU,MAAM,CAAA;AAAA,EACzD;AACA,EAAA,IAAI,OAAO,CAAA,CAAE,kBAAA,KAAuB,QAAA,IAAY,QAAA,CAAS,KAAK,CAAA,CAAE,kBAAA,CAAmB,IAAA,EAAM,CAAA,EAAG;AAC1F,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,sBAAA,EAAwB,CAAA,CAAE,kBAAA,CAAmB,MAAM,CAAA;AAAA,EAC5E;AAEA,EAAA,IAAI,OAAO,EAAE,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG;AAC7D,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,cAAA,EAAgB,CAAA,EAAG,KAAA,CAAM,EAAE,MAAA,EAAQ,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EACtE;AAEA,EAAA,IAAI,OAAO,EAAE,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA,EAAG;AAC3D,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,aAAA,EAAe,CAAA,EAAG,KAAA,CAAM,EAAE,KAAA,EAAO,GAAA,EAAK,GAAG,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EACvE;AAIA,EAAA,IAAI,OAAO,EAAE,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG;AAC7D,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,aAAA,EAAe,CAAA,EAAG,KAAA,CAAM,EAAE,MAAA,EAAQ,GAAA,EAAK,GAAG,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EACxE;AAEA,EAAA,IAAI,CAAA,CAAE,UAAU,MAAA,IAAU,CAAA,CAAE,UAAU,QAAA,IAAY,CAAA,CAAE,UAAU,OAAA,EAAS;AACrE,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,uBAAA,EAAyB,aAAA,CAAc,CAAA,CAAE,KAAK,CAAW,CAAA;AAAA,EAClF;AAEA,EAAA,IAAI,OAAO,EAAE,OAAA,KAAY,QAAA,IAAY,OAAO,QAAA,CAAS,CAAA,CAAE,OAAO,CAAA,EAAG;AAC/D,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,WAAA,EAAa,CAAA,EAAG,KAAA,CAAM,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EACpE;AAEA,EAAA,IAAI,OAAO,EAAE,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG;AAC7D,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,cAAA,EAAgB,CAAA,EAAG,KAAA,CAAM,EAAE,MAAA,EAAQ,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EACtE;AAEA,EAAA,IAAI,OAAO,EAAE,WAAA,KAAgB,QAAA,IAAY,OAAO,QAAA,CAAS,CAAA,CAAE,WAAW,CAAA,EAAG;AACvE,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,oBAAA,EAAsB,CAAA,EAAG,KAAA,CAAM,EAAE,WAAA,EAAa,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EACjF;AAEA,EAAA,IAAI,OAAO,CAAA,CAAE,WAAA,KAAgB,QAAA,IAAY,QAAA,CAAS,KAAK,CAAA,CAAE,WAAA,CAAY,IAAA,EAAM,CAAA,EAAG;AAC5E,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,oBAAA,EAAsB,CAAA,CAAE,WAAA,CAAY,MAAM,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI,OAAO,CAAA,CAAE,MAAA,KAAW,YAAY,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA,EAAG;AACpD,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,cAAA,EAAgB,MAAA,CAAO,CAAA,CAAE,MAAM,CAAW,CAAA;AAAA,EACnE;AAGA,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,YAAY,OAAO,CAAA,CAAE,SAAS,QAAA,EAAU;AAC5D,IAAA,EAAA,GAAK,KAAA,CAAM,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AACvB,IAAA,EAAA,GAAK,KAAA,CAAM,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAAA,EACzB,CAAA,MAAA,IAAW,OAAO,CAAA,CAAE,eAAA,KAAoB,YAAY,UAAA,CAAW,CAAA,CAAE,eAAe,CAAA,EAAG;AACjF,IAAA,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,UAAA,CAAW,EAAE,eAAe,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,EAAW;AACxC,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,aAAA,EAAe,CAAA,EAAG,EAAA,GAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AACpD,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,aAAA,EAAe,CAAA,EAAG,EAAA,GAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,EACtD;AAIA,EAAA,IAAI,CAAA,CAAE,QAAA,IAAY,OAAO,CAAA,CAAE,aAAa,QAAA,EAAU;AAChD,IAAA,MAAM,KAAK,CAAA,CAAE,QAAA;AACb,IAAA,gBAAA,CAAiB,IAAA,EAAM,OAAA,EAAS,EAAA,CAAG,KAAK,CAAA;AACxC,IAAA,gBAAA,CAAiB,IAAA,EAAM,MAAA,EAAQ,EAAA,CAAG,IAAI,CAAA;AACtC,IAAA,gBAAA,CAAiB,IAAA,EAAM,OAAA,EAAS,EAAA,CAAG,KAAK,CAAA;AACxC,IAAA,YAAA,CAAa,IAAA,EAAM,GAAG,GAAG,CAAA;AAAA,EAC3B;AACF;AAOA,SAAS,YAAA,CAAa,MAAmB,GAAA,EAAoB;AAC3D,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACrC,EAAA,MAAM,GAAA,GAAM,GAAA;AACZ,EAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,YAAY,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7D,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,uBAAA,EAAyB,aAAA,CAAc,GAAA,CAAI,KAAK,CAAW,CAAA;AAAA,EACpF;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,IAAY,QAAA,CAAS,KAAK,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,CAAA,EAAG;AAC9E,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,cAAA,EAAgB,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA;AAAA,EAC9D;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,IAAY,QAAA,CAAS,KAAK,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG;AACpE,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,iBAAA,EAAmB,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAAA,EAC5D;AACA,EAAA,IAAI,OAAO,IAAI,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrE,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,gBAAA,EAAkB,CAAA,EAAG,KAAA,CAAM,IAAI,QAAA,EAAU,EAAA,EAAI,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EAC7E;AACA,EAAA,IAAI,OAAO,IAAI,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AACjE,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,kBAAA,EAAoB,CAAA,EAAG,KAAA,CAAM,IAAI,MAAA,EAAQ,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EAC5E;AACF;AAMA,SAAS,gBAAA,CAAiB,IAAA,EAAmB,MAAA,EAAgB,GAAA,EAAoB;AAC/E,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACrC,EAAA,MAAM,EAAA,GAAK,GAAA;AAEX,EAAA,IACE,OAAO,EAAA,CAAG,KAAA,KAAU,QAAA,KACnB,EAAA,CAAG,KAAA,KAAU,MAAA,IAAU,EAAA,CAAG,KAAA,KAAU,QAAA,IAAY,EAAA,CAAG,KAAA,KAAU,OAAA,CAAA,EAC9D;AACA,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,MAAM,CAAA,IAAK,MAAA;AAC3C,IAAA,MAAM,QAAQ,IAAA,KAAS,MAAA,GAAU,WAAW,EAAA,CAAG,KAAK,IAAe,EAAA,CAAG,KAAA;AACtE,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,MAAA,EAAS,MAAM,UAAU,KAAK,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,OAAO,EAAA,CAAG,KAAA,KAAU,QAAA,IAAY,QAAA,CAAS,KAAK,EAAA,CAAG,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG;AAClE,IAAA,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA,MAAA,EAAS,MAAM,UAAU,EAAA,CAAG,KAAA,CAAM,MAAM,CAAA;AAAA,EACjE;AACA,EAAA,IAAI,OAAO,GAAG,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,CAAS,EAAA,CAAG,QAAQ,CAAA,EAAG;AACnE,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,MAAA,EAAS,MAAM,CAAA,KAAA,CAAA,EAAS,CAAA,EAAG,KAAA,CAAM,EAAA,CAAG,QAAA,EAAU,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EACjF;AACA,EAAA,IAAI,OAAO,GAAG,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,EAAA,CAAG,KAAK,CAAA,EAAG;AAC7D,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,MAAA,EAAS,MAAM,CAAA,MAAA,CAAA,EAAU,CAAA,EAAG,KAAA,CAAM,EAAA,CAAG,KAAA,EAAO,EAAA,EAAI,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,OAAO,GAAG,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,CAAS,EAAA,CAAG,MAAM,CAAA,EAAG;AAC/D,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,MAAA,EAAS,MAAM,CAAA,OAAA,CAAA,EAAW,CAAA,EAAG,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EACjF;AACA,EAAA,IAAI,OAAO,GAAG,SAAA,KAAc,QAAA,IAAY,OAAO,QAAA,CAAS,EAAA,CAAG,SAAS,CAAA,EAAG;AACrE,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,MAAA,EAAS,MAAM,CAAA,GAAA,CAAA,EAAO,CAAA,EAAG,KAAA,CAAM,EAAA,CAAG,SAAA,EAAW,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,OAAO,GAAG,YAAA,KAAiB,QAAA,IAAY,OAAO,QAAA,CAAS,EAAA,CAAG,YAAY,CAAA,EAAG;AAC3E,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,MAAA,EAAS,MAAM,CAAA,GAAA,CAAA,EAAO,CAAA,EAAG,KAAA,CAAM,EAAA,CAAG,YAAA,EAAc,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EACnF;AACF;AAzOA,IAcM,UAAA,EAOA,aAAA,EAOA,UAAA,EAOA,kBAAA,EAOA,QAQA,UAAA,EAiBO,QAAA;AAnEb,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AAcA,IAAM,UAAA,GAAqC;AAAA,MACzC,UAAA,EAAY,SAAA;AAAA,MACZ,YAAA,EAAc,SAAA;AAAA,MACd,sBAAA,EAAwB,SAAA;AAAA,MACxB,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAM,aAAA,GAAwC;AAAA,MAC5C,IAAA,EAAM,YAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAGA,IAAM,UAAA,GAAqC;AAAA,MACzC,IAAA,EAAM,YAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAGA,IAAM,kBAAA,GAAsD;AAAA,MAC1D,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAGA,IAAM,MAAA,GAAiC;AAAA,MACrC,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,gCAAA;AAAA,MACN,MAAA,EAAQ,gCAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV;AAGA,IAAM,UAAA,GAA+C;AAAA,MACnD,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAG,CAAA;AAAA,MACjB,GAAA,EAAK,CAAC,GAAA,EAAK,CAAC,CAAA;AAAA,MACZ,MAAA,EAAQ,CAAC,GAAA,EAAK,CAAC,CAAA;AAAA,MACf,IAAA,EAAM,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,MACb,KAAA,EAAO,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,MACd,UAAA,EAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,MACjB,WAAA,EAAa,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,MAClB,aAAA,EAAe,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,MACpB,cAAA,EAAgB,CAAC,CAAA,EAAG,CAAC;AAAA,KACvB;AAOO,IAAM,QAAA,GAAW,yEAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9DjB,SAAS,mBAAmB,KAAA,EAA2C;AAC5E,EAAA,MAAM,IAAK,KAAA,EAAsD,cAAA;AACjE,EAAA,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,SAAA,IAAa,CAAA,KAAM,WAAW,CAAA,GAAI,OAAA;AACnE;AAGO,SAAS,UAAA,CAAW,MAAA,EAAiB,IAAA,EAAmB,QAAA,EAAgC;AAC7F,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,QAAA;AACH,MAAA,MAAA,CAAO,OAAO,IAAI,CAAA;AAClB,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,MAAA,CAAO,MAAM,IAAI,CAAA;AACjB,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,MAAA,CAAO,QAAQ,IAAI,CAAA;AACnB,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,MAAA,CAAO,OAAO,IAAI,CAAA;AAClB,MAAA;AAAA;AAEN;AAUO,SAAS,gBAAA,CACd,IAAA,EACA,QAAA,EACA,QAAA,EACY;AACZ,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,WAAA,CAAY,MAAM;AAClC,IAAA,IAAI,KAAK,WAAA,EAAa;AACtB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,IAAI,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC/C,GAAG,GAAI,CAAA;AACP,EAAA,OAAO,MAAM,MAAA,CAAO,aAAA,CAAc,EAAE,CAAA;AACtC;AA/CA,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACUO,SAAS,cAAA,CACd,QAAA,EACA,SAAA,GAAoB,sBAAA,EACK;AACzB,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,YAAY,MAAsB;AACtC,MAAA,IAAI;AACF,QAAA,OAAO,QAAA,CAAS,cAAc,QAAQ,CAAA;AAAA,MACxC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,WAAW,SAAA,EAAU;AAC3B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAuB;AACrC,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,IACZ,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,MAAM;AAC1C,MAAA,MAAM,KAAK,SAAA,EAAU;AACrB,MAAA,IAAI,EAAA,SAAW,EAAE,CAAA;AAAA,IACnB,CAAC,CAAA;AAED,IAAA,QAAA,CAAS,OAAA,CAAQ,SAAS,IAAA,EAAM,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAElE,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,GAAG,SAAS,CAAA;AAAA,EACxD,CAAC,CAAA;AACH;AA/CA,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAAA,IAAAA,eAAAA,EAAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAOa,YAAA;AAPb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AAAA,IAAAA,eAAAA,EAAAA;AAOO,IAAM,YAAA,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,WAAA,EAiBf,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAoCb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAsBb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,WAAA,EA6Bb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAUb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","file":"index.cjs","sourcesContent":["/**\n * Helpers para detectar el entorno de ejecución (browser vs SSR/Node) y la\n * disponibilidad de APIs del navegador. El SDK debe poder importarse en Node\n * sin romperse, por eso todo acceso a globals del browser pasa por aquí.\n */\n\n/** ¿Existe el objeto global `window`? */\nexport function hasWindow(): boolean {\n return typeof window !== 'undefined';\n}\n\n/** ¿Existe el objeto global `document`? */\nexport function hasDocument(): boolean {\n return typeof document !== 'undefined';\n}\n\n/** ¿`localStorage` está disponible y es escribible? (puede fallar en modo incógnito) */\nexport function hasLocalStorage(): boolean {\n try {\n if (typeof localStorage === 'undefined') return false;\n const testKey = '__veo_test__';\n localStorage.setItem(testKey, '1');\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n/** ¿`navigator.sendBeacon` está disponible? */\nexport function hasNavigatorSendBeacon(): boolean {\n return typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function';\n}\n","/**\n * Nombres de los query params del puente builder. Constantes PURAS (sin DOM ni\n * `window`) para poder compartirlas entre el core (browser: `builder-token.ts`)\n * y el helper de servidor `veo-sdk/next` (`src/next.ts`), sin arrastrar código de\n * navegador al bundle de servidor.\n */\n\n/** Token de correlación del handshake. */\nexport const BUILDER_TOKEN_PARAM = 'veoBuilder';\n/** Origen del dashboard de Veo (para postMessage / frame-ancestors). */\nexport const BUILDER_ORIGIN_PARAM = 'veoBuilderOrigin';\n/** `1` → modo \"panel inyectado\": la app es top-level y el editor se inyecta encima. */\nexport const BUILDER_PANEL_PARAM = 'veoBuilderPanel';\n/** Path del panel del editor en el dashboard (default `/guides/design`). */\nexport const BUILDER_PANEL_PATH_PARAM = 'veoBuilderPanelPath';\n/** Id de la guía que se está editando (para cargar/guardar en el panel). */\nexport const BUILDER_GUIDE_PARAM = 'veoGuide';\n","/**\n * Resolución + persistencia del CONTEXTO de builder.\n *\n * El contexto viaja en la URL (`?veoBuilder=<token>&veoBuilderOrigin=<origen>…`),\n * pero los guards de auth de la app suelen **redirigir y tirar el query string**\n * (p.ej. `/dashboard/home` → `/` para loguearte). Si dependiéramos solo de la URL,\n * el modo builder moriría en ese redirect y nunca podrías diseñar sobre una página\n * detrás de login.\n *\n * Solución (igual que el \"designer mode\" de Pendo): apenas vemos el token en la\n * URL guardamos el contexto en `sessionStorage` y de ahí en más lo leemos como\n * fallback. Así el modo builder **sobrevive a redirects y a un login** dentro de la\n * misma pestaña (incluido el ida-y-vuelta de OAuth). Persiste hasta el teardown o\n * hasta que se cierra la pestaña.\n *\n * Vive en el core (bundle de producción) porque tanto el loader del builder como\n * el gate del runtime de guías necesitan saber si estamos en modo builder. Es\n * mínimo a propósito (ver budget en CLAUDE.md).\n */\nimport { hasWindow } from '../utils/safe-env';\nimport {\n BUILDER_GUIDE_PARAM,\n BUILDER_ORIGIN_PARAM,\n BUILDER_PANEL_PARAM,\n BUILDER_PANEL_PATH_PARAM,\n BUILDER_TOKEN_PARAM,\n} from './builder-constants';\n\n// Re-export para no romper a quien los importa desde aquí (bridge-protocol, etc.).\nexport { BUILDER_ORIGIN_PARAM, BUILDER_TOKEN_PARAM } from './builder-constants';\n\n/** Contexto de la sesión de builder activa en la app. */\nexport interface BuilderClientContext {\n /** Token de correlación del handshake. */\n token: string;\n /** Origen del dashboard de Veo (para postMessage). */\n origin: string | null;\n /** `true` → modo panel inyectado (app top-level, editor encima). */\n panel: boolean;\n /** Id de la guía en edición (para el panel). */\n guide: string | null;\n /** Path del panel del editor en el dashboard (override; default `/guides/design`). */\n panelPath: string | null;\n}\n\nconst CTX_KEY = 'veo:builder_ctx';\n/**\n * Respaldo en localStorage, KEYED POR GUÍA. sessionStorage muere al cerrar la\n * pestaña; para que la sesión del editor \"perdure\" al abrir varias guías o\n * reabrir la misma, además persistimos por guía en localStorage con un TTL.\n * Keyed por guía → dos guías abiertas en pestañas distintas no se pisan.\n */\nconst LS_PREFIX = 'veo:builder_ctx:';\n/**\n * TTL del respaldo. Antes era 12 h y producía \"sesiones fantasma\": cerrabas la\n * pestaña del editor sin teardown y CUALQUIER visita a la app durante 12 h\n * restauraba un contexto viejo (token/plantilla stale) o re-abría el panel.\n * 30 min alcanza para su propósito real — sobrevivir el ida-y-vuelta del login\n * y recuperar un cierre accidental — sin arrastrar sesiones de ayer.\n */\nconst PERSIST_TTL_MS = 30 * 60 * 1000; // 30 min\n\ninterface StoredCtx extends BuilderClientContext {\n savedAt: number;\n}\n\nfunction session(): Storage | null {\n try {\n return window.sessionStorage;\n } catch {\n return null; // sessionStorage puede tirar (modo privado, sandbox)\n }\n}\n\nfunction local(): Storage | null {\n try {\n return window.localStorage;\n } catch {\n return null;\n }\n}\n\nfunction lsKey(guide: string | null): string {\n return LS_PREFIX + (guide || 'default');\n}\n\n/** Persiste el contexto en sessionStorage (pestaña) + localStorage por guía (TTL). */\nfunction persist(ctx: BuilderClientContext): void {\n try {\n session()?.setItem(CTX_KEY, JSON.stringify(ctx));\n } catch {\n // no-op: sin sessionStorage seguimos con el contexto de la URL\n }\n try {\n const stored: StoredCtx = { ...ctx, savedAt: Date.now() };\n local()?.setItem(lsKey(ctx.guide), JSON.stringify(stored));\n } catch {\n // no-op\n }\n}\n\n/** Contexto más reciente no vencido en localStorage (limpia los vencidos de paso). */\nfunction readFreshFromLocal(): BuilderClientContext | null {\n const store = local();\n if (!store) return null;\n let best: StoredCtx | null = null;\n try {\n for (let i = 0; i < store.length; i++) {\n const key = store.key(i);\n if (!key?.startsWith(LS_PREFIX)) continue;\n const raw = store.getItem(key);\n if (!raw) continue;\n let parsed: StoredCtx | null = null;\n try {\n parsed = JSON.parse(raw) as StoredCtx;\n } catch {\n continue;\n }\n if (typeof parsed?.savedAt !== 'number' || Date.now() - parsed.savedAt > PERSIST_TTL_MS) {\n try {\n store.removeItem(key);\n } catch {\n // no-op\n }\n continue;\n }\n if (!best || parsed.savedAt > best.savedAt) best = parsed;\n }\n } catch {\n return null;\n }\n if (!best) return null;\n const { savedAt: _savedAt, ...ctx } = best;\n return ctx;\n}\n\nfunction urlParams(): URLSearchParams | null {\n try {\n const search = new URLSearchParams(window.location.search);\n if (search.get(BUILDER_TOKEN_PARAM)) return search;\n // Fallback: FRAGMENTO (#veoBuilder=…). El dashboard duplica los params en el\n // hash porque, con sesión iniciada en la app, el guard de auth suele\n // redirigir la raíz y el redirect tira el query string — pero los\n // navegadores preservan el fragmento a través de los 3xx. Sin esto, el\n // editor solo abría con el usuario deslogueado.\n const hash = window.location.hash.replace(/^#/, '');\n if (hash.includes(`${BUILDER_TOKEN_PARAM}=`)) return new URLSearchParams(hash);\n return search;\n } catch {\n return null;\n }\n}\n\n/**\n * Contexto de builder activo: el de la URL (que además se persiste) o, si el\n * query string se perdió en un redirect, el guardado en sessionStorage. `null`\n * si no estamos en modo builder.\n */\nexport function resolveBuilderContext(): BuilderClientContext | null {\n if (!hasWindow()) return null;\n const params = urlParams();\n const fromUrl = params?.get(BUILDER_TOKEN_PARAM);\n if (fromUrl) {\n const ctx: BuilderClientContext = {\n token: fromUrl,\n origin: params?.get(BUILDER_ORIGIN_PARAM) ?? null,\n panel: params?.get(BUILDER_PANEL_PARAM) === '1',\n guide: params?.get(BUILDER_GUIDE_PARAM) ?? null,\n panelPath: params?.get(BUILDER_PANEL_PATH_PARAM) ?? null,\n };\n persist(ctx);\n return ctx;\n }\n // Sin token en la URL: primero la pestaña (sessionStorage), y si murió (pestaña\n // nueva / restaurada) caemos al respaldo persistido más reciente y lo\n // re-hidratamos en la sesión para que el resto de la carga sea consistente.\n try {\n const raw = session()?.getItem(CTX_KEY);\n if (raw) return JSON.parse(raw) as BuilderClientContext;\n } catch {\n // sigue al fallback de localStorage\n }\n const fromLocal = readFreshFromLocal();\n if (fromLocal) {\n try {\n session()?.setItem(CTX_KEY, JSON.stringify(fromLocal));\n } catch {\n // no-op\n }\n }\n return fromLocal;\n}\n\n/** Token de builder activo (URL o persistido). */\nexport function resolveBuilderToken(): string | null {\n return resolveBuilderContext()?.token ?? null;\n}\n\n/** Origen del dashboard (URL o persistido). */\nexport function resolveBuilderOrigin(): string | null {\n return resolveBuilderContext()?.origin ?? null;\n}\n\n/** `true` si hay un contexto de builder activo (URL o persistido). */\nexport function isBuilderMode(): boolean {\n return resolveBuilderContext() !== null;\n}\n\n/**\n * Borra el modo builder persistido (al hacer teardown / salir del editor).\n * Limpia la pestaña (sessionStorage) y el respaldo de ESTA guía (localStorage);\n * los respaldos de otras guías siguen (no se pisan al cerrar una).\n */\nexport function clearBuilderToken(): void {\n if (!hasWindow()) return;\n let guide: string | null = null;\n try {\n const raw = session()?.getItem(CTX_KEY);\n if (raw) guide = (JSON.parse(raw) as BuilderClientContext).guide ?? null;\n } catch {\n // no-op\n }\n try {\n session()?.removeItem(CTX_KEY);\n } catch {\n // no-op\n }\n try {\n local()?.removeItem(lsKey(guide));\n } catch {\n // no-op\n }\n}\n","/** Configuración default de autocaptura. */\nexport const DEFAULT_AUTOCAPTURE_CONFIG = {\n enabled: true,\n captureClicks: true,\n captureSubmits: true,\n captureChanges: true,\n maskAllInputs: true,\n maskAllText: false,\n throttleMs: 100,\n maxTextLength: 200,\n captureElementMetadata: true,\n captureAncestors: 5,\n} as const;\n\n/** Máximo de niveles de ancestros que se permiten capturar. */\nexport const MAX_ANCESTORS = 10;\n\n/** Selectores que SIEMPRE se ignoran (incluso si el cliente no configura blockSelectors). */\nexport const ALWAYS_BLOCK_SELECTORS = [\n '[data-veo-ignore]',\n '.veo-ignore',\n // Inputs sensibles\n 'input[type=\"password\"]',\n 'input[type=\"email\"]',\n 'input[type=\"tel\"]',\n 'input[type=\"hidden\"]',\n // Datos de tarjeta\n '[autocomplete=\"cc-number\"]',\n '[autocomplete=\"cc-csc\"]',\n '[autocomplete=\"cc-exp\"]',\n '[autocomplete=\"cc-name\"]',\n // Otros campos sensibles típicos\n '[name*=\"password\" i]',\n '[name*=\"ssn\" i]',\n '[name*=\"credit\" i]',\n '[name*=\"card\" i]',\n '[id*=\"password\" i]',\n '[id*=\"ssn\" i]',\n];\n\n/** Atributos sensibles que NUNCA se capturan. */\nexport const SENSITIVE_ATTRIBUTES = ['value', 'data-credit-card', 'data-ssn', 'data-password'];\n\n/** Atributos útiles que SIEMPRE se intentan capturar si existen. */\nexport const PRIORITY_ATTRIBUTES = [\n 'id',\n 'name',\n 'type',\n 'role',\n 'href',\n 'data-action',\n 'data-veo-tag',\n 'data-testid',\n 'aria-label',\n 'aria-labelledby',\n];\n\n/** Regex para detectar clases generadas dinámicamente. Se descartan del selector. */\nexport const HASHED_CLASS_PATTERNS = [\n /^css-[a-z0-9]{4,}$/i, // emotion, styled-components nuevas\n /^_[a-z0-9]+_[a-z0-9]{4,}_\\d+$/, // CSS Modules con hash\n /^[a-z]{2,4}-[a-z0-9]{6,}$/i, // Tailwind JIT (a veces)\n /^[a-f0-9]{6,}$/i, // hashes hex puros\n /^sc-[a-z0-9]+$/i, // styled-components legacy\n];\n\n/** Eventos sintéticos/internos que ignoramos. */\nexport const IGNORED_EVENT_PROPERTIES = ['$autocapture', 'pageview'];\n","import { HASHED_CLASS_PATTERNS } from './constants';\n\n/** Determina si una clase parece generada dinámicamente (hash de CSS-in-JS, etc.). */\nexport function isHashedClass(className: string): boolean {\n return HASHED_CLASS_PATTERNS.some((pattern) => pattern.test(className));\n}\n\n/** Filtra las clases de un elemento para quedarse solo con las \"humanas\" (estables). */\nexport function filterHumanClasses(element: Element): string[] {\n return Array.from(element.classList).filter((c) => !isHashedClass(c) && c.length < 64);\n}\n\n/**\n * Atributos estables y semánticos que identifican un elemento mejor que sus\n * clases utilitarias (que cambian con el styling). Orden = prioridad. Producen\n * selectores legibles tipo `button[aria-label=\"Abrir menú\"]` que el usuario\n * puede escribir/reconocer en el editor de segmentos.\n */\nconst STABLE_ATTRIBUTES = [\n 'data-testid',\n 'data-test',\n 'data-cy',\n 'name',\n 'aria-label',\n 'placeholder',\n 'alt',\n 'title',\n // `href` identifica muy bien a los links (`<a>`), un target frecuente de\n // autocapture; va después de los atributos semánticos pero antes de los\n // genéricos. Valores largos (URLs absolutas con query) se descartan por\n // MAX_ATTR_VALUE_LENGTH.\n 'href',\n 'role',\n 'type',\n] as const;\n\n/** Valores de atributo más largos que esto se descartan (no son buenos selectores). */\nconst MAX_ATTR_VALUE_LENGTH = 100;\n\n/** Escape básico de caracteres especiales en CSS (usa CSS.escape si está disponible). */\nfunction cssEscape(value: string): string {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value);\n }\n return value.replace(/[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~]/g, '\\\\$&');\n}\n\n/**\n * Escape para un valor que va DENTRO de comillas en `[attr=\"...\"]`. A diferencia\n * de `cssEscape`, no escapa espacios ni acentos (las comillas ya los cubren):\n * solo `\\` y `\"`. Así el valor queda igual al texto real y el match por substring\n * del backend funciona con lo que el usuario escribe.\n */\nfunction escapeAttrValue(value: string): string {\n return value.replace(/[\\\\\"]/g, '\\\\$&');\n}\n\n/** Devuelve un selector por atributo estable si el elemento tiene alguno. */\nfunction stableAttributeSelector(element: Element, tag: string): string | null {\n for (const attr of STABLE_ATTRIBUTES) {\n const value = element.getAttribute(attr);\n if (value && value.length > 0 && value.length <= MAX_ATTR_VALUE_LENGTH) {\n return `${tag}[${attr}=\"${escapeAttrValue(value)}\"]`;\n }\n }\n return null;\n}\n\n/** Construye un selector simple y estable para UN elemento. */\nfunction buildElementSelector(element: Element): string {\n const tag = element.tagName.toLowerCase();\n\n // 1. `data-veo-tag`: el nombre semántico que da el cliente. Máxima prioridad.\n const veoTag = element.getAttribute('data-veo-tag');\n if (veoTag) {\n return `${tag}[data-veo-tag=\"${escapeAttrValue(veoTag)}\"]`;\n }\n\n // 2. `id`: único y estable. Lo combinamos con clases humanas (como antes).\n if (element.id) {\n const classes = filterHumanClasses(element);\n const classPart = classes.length > 0 ? `.${classes.map(cssEscape).join('.')}` : '';\n return `${tag}#${cssEscape(element.id)}${classPart}`;\n }\n\n // 3. Atributo estable (aria-label, name, type, role…): más robusto que clases.\n const attrSelector = stableAttributeSelector(element, tag);\n if (attrSelector) return attrSelector;\n\n // 4. Fallback: clases humanas.\n const classes = filterHumanClasses(element);\n const classPart = classes.length > 0 ? `.${classes.map(cssEscape).join('.')}` : '';\n return `${tag}${classPart}`;\n}\n\n/** Construye un selector CSS legible y razonablemente estable para el elemento. */\nexport function buildSelectorPath(element: Element, maxAncestors = 5): string {\n const parts: string[] = [];\n let current: Element | null = element;\n let depth = 0;\n\n while (current && current !== document.documentElement && depth <= maxAncestors) {\n parts.unshift(buildElementSelector(current));\n current = current.parentElement;\n depth++;\n }\n\n return parts.join(' > ');\n}\n","/**\n * Genera un UUID v7 (timestamp-based, ordenable cronológicamente).\n * Spec: RFC 9562.\n *\n * Formato: tttttttt-tttt-7xxx-yxxx-xxxxxxxxxxxx\n * - 48 bits de timestamp (ms desde epoch)\n * - 4 bits de versión (7)\n * - 2 bits de variante (10)\n * - 74 bits aleatorios\n */\nexport function uuidv7(): string {\n const timestamp = Date.now();\n const timeHex = timestamp.toString(16).padStart(12, '0');\n\n // 10 bytes aleatorios para los 74 bits de entropía (+ bits de versión/variante).\n const random = new Uint8Array(10);\n if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n crypto.getRandomValues(random);\n } else {\n // Fallback inseguro pero funcional (no debería ocurrir en browsers modernos).\n for (let i = 0; i < random.length; i++) {\n random[i] = Math.floor(Math.random() * 256);\n }\n }\n\n // Set version (7) en el primer nibble del 3er grupo.\n random[0] = ((random[0] ?? 0) & 0x0f) | 0x70;\n // Set variant (10) en los 2 bits altos del 4to grupo.\n random[2] = ((random[2] ?? 0) & 0x3f) | 0x80;\n\n const hex = Array.from(random, (b) => b.toString(16).padStart(2, '0')).join('');\n\n return [\n timeHex.slice(0, 8),\n timeHex.slice(8, 12),\n hex.slice(0, 4),\n hex.slice(4, 8),\n hex.slice(8, 20),\n ].join('-');\n}\n","/** z-index muy alto para flotar sobre cualquier UI del cliente sin tapar dev tools. */\nexport const GUIDE_Z_INDEX = 2147483640;\n\n/** Tiempo máximo esperando que aparezca el elemento ancla de un tooltip. */\nexport const DEFAULT_ANCHOR_WAIT_MS = 5000;\n\n/** Protocolos permitidos en `imageUrl` y `style.ctaUrl`. */\nexport const SAFE_URL_PROTOCOLS: ReadonlyArray<string> = ['http:', 'https:'];\n\n/** Atributo data-* que marca un host de guía en el DOM (útil para tests). */\nexport const GUIDE_HOST_ATTR = 'data-veo-guide';\n\n/**\n * Prefijo del key de localStorage donde vive el cache de frequency.\n * Se completa con un identificador derivado del apiKey para evitar\n * contaminación cuando el mismo navegador corre varios workspaces.\n */\nexport const FREQUENCY_CACHE_KEY_PREFIX = 'veo:freq:';\n\n/** Tiempo entre flushes automáticos del tracker (ms). */\nexport const DEFAULT_TRACKER_FLUSH_INTERVAL_MS = 3000;\n\n/** Cuántas interactions se acumulan antes de un flush forzado. */\nexport const DEFAULT_TRACKER_BATCH_SIZE = 5;\n\n/** Reintentos por item antes de descartar (se aplica con backoff implícito por el timer). */\nexport const DEFAULT_TRACKER_MAX_RETRIES = 3;\n\n/** Límite de entradas en el cache local — protege contra bloat de localStorage. */\nexport const FREQUENCY_CACHE_MAX_ENTRIES = 500;\n\n/** TTL para entradas del cache. Tras esto se vuelven a re-evaluar contra el backend. */\nexport const FREQUENCY_CACHE_TTL_MS = 90 * 24 * 60 * 60 * 1000;\n\n/**\n * Prefijo del key de localStorage donde vive el estado del walkthrough\n * activo. Se completa con el mismo `namespaceFromApiKey` que el frequency\n * cache para que dos workspaces en el mismo navegador no se pisen.\n */\nexport const WALKTHROUGH_STATE_KEY_PREFIX = 'veo:walkthrough_state:';\n\n/**\n * Si pasan 30 min sin progreso (`advance`/`back`), el walkthrough se\n * considera abandonado. El estado se limpia de localStorage al detectarlo\n * y NO se envía `completed` al backend (porque no se completó).\n */\nexport const WALKTHROUGH_ABANDONMENT_TIMEOUT_MS = 30 * 60 * 1000;\n\n/**\n * Tiempo máximo esperando que aparezca el selector del step actual en el\n * DOM. Más restrictivo que `DEFAULT_ANCHOR_WAIT_MS` porque en walkthroughs\n * la página correcta debería estar ya cargada al resumir.\n */\nexport const WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS = 5000;\n","import { isSafeUrl } from './block-builder';\n\n/**\n * Render SEGURO del rich text de bloques `text` (negrita/cursiva/subrayado/\n * links/listas). El backend guarda `block.html` ya sanitizado con la misma\n * whitelist, pero acá NO confiamos en eso: re-validamos al renderizar.\n *\n * Cómo mantiene la garantía \"sin innerHTML\" del renderer (regla 8 del\n * CLAUDE.md): el string se parsea con `DOMParser.parseFromString`, que produce\n * un documento INERTE — sus scripts no ejecutan y nada toca el DOM vivo —, y\n * el árbol resultante se RECONSTRUYE a mano: cada nodo cuyo tag está en la\n * whitelist se re-crea con `createElement`/`createTextNode`; los atributos NO\n * se copian (salvo `href` validado con `isSafeUrl`); los tags desconocidos se\n * \"unwrappean\" (se descarta el elemento, se conservan sus hijos de texto).\n * Nunca se inserta HTML crudo en el documento real.\n */\n\n/** Tags permitidos → tag con el que se re-crean (b/i se normalizan). */\nconst ALLOWED_TAGS: Record<string, string> = {\n P: 'p',\n BR: 'br',\n STRONG: 'strong',\n B: 'strong',\n EM: 'em',\n I: 'em',\n U: 'u',\n S: 's',\n UL: 'ul',\n OL: 'ol',\n LI: 'li',\n A: 'a',\n};\n\n/**\n * Tags que se descartan CON su contenido (a diferencia del unwrap): su texto\n * interno es código/markup, no copy — dejarlo visible sería basura (\"window.x\n * = 1;\" pintado en la guía).\n */\nconst DROP_TAGS = new Set([\n 'SCRIPT',\n 'STYLE',\n 'TEMPLATE',\n 'IFRAME',\n 'OBJECT',\n 'EMBED',\n 'NOSCRIPT',\n 'TITLE',\n 'TEXTAREA',\n 'SELECT',\n 'SVG',\n 'MATH',\n]);\n\nconst MAX_INPUT_LEN = 16 * 1024;\nconst MAX_DEPTH = 20;\nconst MAX_NODES = 1000;\n\n/**\n * Convierte un string de rich text whitelisted en un `DocumentFragment` seguro\n * construido nodo a nodo. Si el input excede las guardas (tamaño/nodos), cae a\n * un nodo de texto con el contenido plano — nunca falla ni lanza.\n */\nexport function renderRichText(html: string, doc: Document): DocumentFragment {\n const fragment = doc.createDocumentFragment();\n if (typeof html !== 'string' || html.length === 0) return fragment;\n\n let parsed: Document;\n try {\n parsed = new DOMParser().parseFromString(\n html.length > MAX_INPUT_LEN ? html.slice(0, MAX_INPUT_LEN) : html,\n 'text/html',\n );\n } catch {\n fragment.appendChild(doc.createTextNode(html));\n return fragment;\n }\n\n const budget = { nodes: 0, exceeded: false };\n for (const child of Array.from(parsed.body.childNodes)) {\n const rebuilt = rebuildNode(child, doc, 0, budget);\n if (rebuilt) fragment.appendChild(rebuilt);\n }\n\n // Presupuesto excedido: descartar el árbol parcial y caer a texto plano.\n if (budget.exceeded) {\n const plain = doc.createDocumentFragment();\n plain.appendChild(doc.createTextNode(parsed.body.textContent ?? ''));\n return plain;\n }\n return fragment;\n}\n\nfunction rebuildNode(\n node: Node,\n doc: Document,\n depth: number,\n budget: { nodes: number; exceeded: boolean },\n): Node | null {\n if (budget.exceeded) return null;\n if (++budget.nodes > MAX_NODES || depth > MAX_DEPTH) {\n budget.exceeded = true;\n return null;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n return doc.createTextNode(node.textContent ?? '');\n }\n if (node.nodeType !== Node.ELEMENT_NODE) return null; // comentarios, etc.\n\n const el = node as Element;\n if (DROP_TAGS.has(el.tagName)) return null; // fuera con contenido y todo\n const mapped = ALLOWED_TAGS[el.tagName];\n\n // Tag desconocido → unwrap: se conservan los hijos, sin el elemento.\n if (!mapped) {\n const frag = doc.createDocumentFragment();\n for (const child of Array.from(el.childNodes)) {\n const rebuilt = rebuildNode(child, doc, depth + 1, budget);\n if (rebuilt) frag.appendChild(rebuilt);\n }\n return frag;\n }\n\n // Links: solo con href http(s); si el href no pasa, se unwrappea a texto.\n if (mapped === 'a') {\n const href = el.getAttribute('href') ?? '';\n if (!isSafeUrl(href)) {\n const frag = doc.createDocumentFragment();\n for (const child of Array.from(el.childNodes)) {\n const rebuilt = rebuildNode(child, doc, depth + 1, budget);\n if (rebuilt) frag.appendChild(rebuilt);\n }\n return frag;\n }\n const a = doc.createElement('a');\n a.setAttribute('href', href);\n a.setAttribute('target', '_blank');\n a.setAttribute('rel', 'noopener noreferrer nofollow');\n for (const child of Array.from(el.childNodes)) {\n const rebuilt = rebuildNode(child, doc, depth + 1, budget);\n if (rebuilt) a.appendChild(rebuilt);\n }\n return a;\n }\n\n // Elemento permitido: re-crear SIN copiar atributos.\n const rebuilt = doc.createElement(mapped);\n for (const child of Array.from(el.childNodes)) {\n const childNode = rebuildNode(child, doc, depth + 1, budget);\n if (childNode) rebuilt.appendChild(childNode);\n }\n return rebuilt;\n}\n","import { SAFE_URL_PROTOCOLS } from './constants';\nimport { renderRichText } from './rich-text';\nimport type { CtaAction, GuideInteractionMetadata, GuideStep, StepBlock } from './types';\n\ninterface StepCallbacks {\n /** `meta` identifica QUÉ botón se clickeó (analytics por botón). */\n onCtaClick: (action: CtaAction, url?: string, meta?: GuideInteractionMetadata) => void;\n onDismiss: () => void;\n}\n\n/**\n * Construye el subtree DOM de un step (título, contenido, imagen, CTA,\n * botón de cerrar) de forma segura.\n *\n * Reglas inmutables:\n * - **Nunca** usa `innerHTML` ni `insertAdjacentHTML`.\n * - Todo texto se asigna por `textContent` (escape HTML automático).\n * - URLs (`imageUrl`, `style.ctaUrl`) pasan por `isSafeUrl` — solo\n * `http(s):` permitido, rechaza `javascript:`, `data:`, etc.\n * - Campos opcionales ausentes simplemente no pintan su nodo. Si una\n * guía no trae `ctaText` no se pinta botón.\n *\n * El `doc` se inyecta para soportar tests con jsdom u otros documentos.\n */\nexport function buildStepContent(\n step: GuideStep,\n doc: Document,\n callbacks: StepCallbacks,\n): HTMLElement {\n const container = doc.createElement('div');\n container.className = 'veo-guide-content';\n\n const blocks = normalizeBlocks(step);\n if (blocks) {\n renderBlocks(container, blocks, doc, callbacks);\n } else {\n renderLegacyStep(container, step, doc, callbacks);\n }\n\n // Botón \"✕\" siempre presente (esquina superior derecha).\n container.appendChild(createCloseButton(doc, () => callbacks.onDismiss()));\n\n return container;\n}\n\n/**\n * Nodos de CONTENIDO de un paso (títulos/textos/imágenes — SIN botones ni ✕):\n * respeta `blocks[]` (con rich text y full-bleed) o cae a los escalares\n * legacy. Lo usa el walkthrough, cuya navegación es propia — los bloques\n * `button` del paso se omiten porque atrás/siguiente/omitir los pinta el\n * chrome del tour.\n */\nexport function buildContentNodes(step: GuideStep, doc: Document): HTMLElement[] {\n const blocks = normalizeBlocks(step);\n if (blocks) {\n const nodes: HTMLElement[] = [];\n for (const { block, idx } of blocks) {\n if (block.type === 'button') continue;\n const node = buildContentBlock(block, doc);\n if (!node) continue;\n node.dataset.veoIdx = String(idx);\n nodes.push(node);\n }\n return nodes;\n }\n const nodes: HTMLElement[] = [];\n if (typeof step.imageUrl === 'string' && step.imageUrl && isSafeUrl(step.imageUrl)) {\n const img = doc.createElement('img');\n img.className = 'veo-guide-image';\n img.src = step.imageUrl;\n img.alt = typeof step.title === 'string' ? step.title : '';\n nodes.push(img);\n }\n if (typeof step.title === 'string' && step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n nodes.push(heading);\n }\n if (typeof step.content === 'string' && step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n nodes.push(paragraph);\n }\n return nodes;\n}\n\n/** Render clásico: imagen + un título + un texto + un CTA (campos escalares). */\nfunction renderLegacyStep(\n container: HTMLElement,\n step: GuideStep,\n doc: Document,\n callbacks: StepCallbacks,\n): void {\n if (typeof step.imageUrl === 'string' && step.imageUrl && isSafeUrl(step.imageUrl)) {\n const img = doc.createElement('img');\n img.className = 'veo-guide-image';\n img.src = step.imageUrl;\n img.alt = typeof step.title === 'string' ? step.title : '';\n container.appendChild(img);\n }\n\n if (typeof step.title === 'string' && step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n container.appendChild(heading);\n }\n\n if (typeof step.content === 'string' && step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n container.appendChild(paragraph);\n }\n\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n\n if (typeof step.ctaText === 'string' && step.ctaText) {\n const cta = doc.createElement('button');\n cta.type = 'button';\n cta.className = 'veo-guide-cta';\n cta.textContent = step.ctaText;\n cta.addEventListener('click', () => {\n const action: CtaAction = step.ctaAction ?? 'dismiss';\n const ctaUrl = readCtaUrl(step);\n callbacks.onCtaClick(action, ctaUrl);\n });\n actions.appendChild(cta);\n }\n\n container.appendChild(actions);\n}\n\n/**\n * Devuelve los bloques válidos del paso CON su índice original en\n * `step.blocks[]` (el drop-target del editor lo necesita: los bloques\n * filtrados u omitidos corren los índices del DOM, no los del modelo), o\n * `null` si no hay ninguno (usa el legacy).\n */\nfunction normalizeBlocks(step: GuideStep): Array<{ block: StepBlock; idx: number }> | null {\n if (!Array.isArray(step.blocks) || step.blocks.length === 0) return null;\n const valid = step.blocks\n .map((block, idx) => ({ block, idx }))\n .filter((entry): entry is { block: StepBlock; idx: number } => {\n const b = entry.block;\n if (!b || typeof b !== 'object') return false;\n if (b.type === 'image') return typeof b.url === 'string' && isSafeUrl(b.url);\n return b.type === 'title' || b.type === 'text' || b.type === 'button';\n });\n return valid.length > 0 ? valid : null;\n}\n\n/**\n * Render por bloques: recorre en orden. Los botones consecutivos se agrupan en\n * una misma fila de acciones (para que queden lado a lado). Todo texto por\n * `textContent`; las imágenes por `isSafeUrl`.\n */\nfunction renderBlocks(\n container: HTMLElement,\n blocks: Array<{ block: StepBlock; idx: number }>,\n doc: Document,\n callbacks: StepCallbacks,\n): void {\n let i = 0;\n while (i < blocks.length) {\n const entry = blocks[i];\n if (entry?.block.type === 'button') {\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n // La fila agrupada lleva el índice del PRIMER botón.\n actions.dataset.veoIdx = String(entry.idx);\n // La alineación de un botón mueve la FILA (justify-content), no el botón\n // dentro de ella (align-self sería el eje vertical y no haría nada).\n let rowAlign: string | undefined;\n while (i < blocks.length && blocks[i]?.block.type === 'button') {\n const btnBlock = (blocks[i] as { block: StepBlock }).block;\n if (!rowAlign) {\n const a = (btnBlock.style as Record<string, unknown> | null | undefined)?.align;\n if (a === 'left' || a === 'center' || a === 'right') rowAlign = a;\n }\n actions.appendChild(buildButtonBlock(btnBlock, doc, callbacks));\n i++;\n }\n if (rowAlign) actions.style.justifyContent = BLOCK_ALIGN_SELF[rowAlign] as string;\n container.appendChild(actions);\n continue;\n }\n const node = entry ? buildContentBlock(entry.block, doc) : null;\n if (node && entry) {\n node.dataset.veoIdx = String(entry.idx);\n container.appendChild(node);\n }\n i++;\n }\n}\n\nexport function buildContentBlock(block: StepBlock, doc: Document): HTMLElement | null {\n switch (block.type) {\n case 'title': {\n const el = doc.createElement('h2');\n el.className = 'veo-guide-title';\n el.textContent = typeof block.text === 'string' ? block.text : '';\n applyBlockStyle(el, block.style, 'text');\n return el;\n }\n case 'text': {\n // `div` (no `p`): el rich text puede contener sus propios <p>/<ul>.\n const el = doc.createElement('div');\n el.className = 'veo-guide-text';\n if (typeof block.html === 'string' && block.html) {\n el.appendChild(renderRichText(block.html, doc));\n } else {\n el.textContent = typeof block.text === 'string' ? block.text : '';\n }\n applyBlockStyle(el, block.style, 'text');\n return el;\n }\n case 'image': {\n if (typeof block.url !== 'string' || !isSafeUrl(block.url)) return null;\n const el = doc.createElement('img');\n el.className = 'veo-guide-image';\n el.src = block.url;\n el.alt = '';\n applyBlockStyle(el, block.style, 'image');\n return el;\n }\n default:\n return null;\n }\n}\n\nfunction buildButtonBlock(\n block: StepBlock,\n doc: Document,\n callbacks: StepCallbacks,\n): HTMLButtonElement {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = 'veo-guide-cta';\n btn.textContent = typeof block.text === 'string' && block.text ? block.text : 'OK';\n applyBlockStyle(btn, block.style, 'button');\n btn.addEventListener('click', () => {\n // Camino viejo (renderer clásico): solo maneja CtaAction. Las acciones\n // nuevas del modelo unificado (prev/submit-forms*) las maneja el renderer\n // unificado; acá degradan a `dismiss` (no aparecen en guías viejas).\n const raw = block.action ?? 'dismiss';\n const action: CtaAction = raw === 'next' || raw === 'url' || raw === 'guide' ? raw : 'dismiss';\n // El 2º argumento es \"el destino\" de la acción: la URL para `url`, el\n // guideId para `guide` (encadenado). Para el resto, undefined.\n const target =\n action === 'url' && typeof block.url === 'string' && isSafeUrl(block.url)\n ? block.url\n : action === 'guide' && typeof block.targetGuideId === 'string' && block.targetGuideId\n ? block.targetGuideId\n : undefined;\n const meta: GuideInteractionMetadata = {\n ...(typeof block.id === 'string' && block.id ? { buttonId: block.id } : {}),\n ...(typeof block.text === 'string' && block.text ? { buttonText: block.text } : {}),\n };\n callbacks.onCtaClick(action, target, Object.keys(meta).length ? meta : undefined);\n });\n return btn;\n}\n\nconst BLOCK_ALIGN_SELF: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\nfunction clampNum(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Aplica el estilo por-bloque como estilos INLINE (cada bloque es único, no\n * puede usar las CSS vars compartidas del host). Setear `el.style.*` es seguro:\n * el browser descarta valores inválidos (no hay inyección de CSS crudo).\n */\nexport function applyBlockStyle(\n el: HTMLElement,\n style: StepBlock['style'],\n kind: 'text' | 'image' | 'button',\n): void {\n if (!style || typeof style !== 'object') return;\n const s = style as Record<string, unknown>;\n // Imagen \"a sangre\": ocupa todo el ancho de la tarjeta ignorando el padding\n // (hero image estilo anuncio). El CSS de la clase manda — se saltan las\n // props inline de tamaño/alineación que la contradirían.\n if (kind === 'image' && s.bleed === true) {\n el.classList.add('veo-guide-image--bleed');\n return;\n }\n const align = typeof s.align === 'string' ? s.align : null;\n if (align && (align === 'left' || align === 'center' || align === 'right')) {\n // text → text-align; image → align-self (se encoge y se ubica);\n // button → NO aquí (la fila de acciones maneja su justify-content).\n if (kind === 'text') el.style.textAlign = align;\n else if (kind === 'image') el.style.alignSelf = BLOCK_ALIGN_SELF[align] as string;\n }\n if (kind !== 'image' && typeof s.color === 'string') el.style.color = s.color;\n if (kind === 'text' && typeof s.fontSize === 'number' && Number.isFinite(s.fontSize)) {\n el.style.fontSize = `${clampNum(s.fontSize, 8, 72)}px`;\n }\n if (kind === 'image' && typeof s.width === 'number' && Number.isFinite(s.width)) {\n el.style.width = `${clampNum(s.width, 10, 100)}%`;\n }\n if (kind === 'image' && typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n el.style.borderRadius = `${clampNum(s.radius, 0, 48)}px`;\n }\n if (typeof s.marginTop === 'number' && Number.isFinite(s.marginTop)) {\n el.style.marginTop = `${clampNum(s.marginTop, 0, 64)}px`;\n }\n if (typeof s.marginBottom === 'number' && Number.isFinite(s.marginBottom)) {\n el.style.marginBottom = `${clampNum(s.marginBottom, 0, 64)}px`;\n }\n\n // ── Estilos por-bloque extendidos (panel de estilos del editor) ──\n // Tipografía (texto/título/botón; no imagen).\n if (kind !== 'image') {\n if (typeof s.fontSize === 'number' && Number.isFinite(s.fontSize)) {\n el.style.fontSize = `${clampNum(s.fontSize, 8, 96)}px`;\n }\n if (typeof s.fontFamily === 'string' && s.fontFamily && s.fontFamily !== 'inherit') {\n el.style.fontFamily = s.fontFamily;\n }\n if (typeof s.fontWeight === 'string' && s.fontWeight) el.style.fontWeight = s.fontWeight;\n if (typeof s.textTransform === 'string' && s.textTransform && s.textTransform !== 'none') {\n el.style.textTransform = s.textTransform;\n }\n if (typeof s.lineHeight === 'number' && Number.isFinite(s.lineHeight)) {\n el.style.lineHeight = `${clampNum(s.lineHeight, 50, 300)}%`;\n }\n if (typeof s.letterSpacing === 'number' && Number.isFinite(s.letterSpacing)) {\n el.style.letterSpacing = `${clampNum(s.letterSpacing, -5, 20)}px`;\n }\n }\n // Fondo, borde, radio (todos los tipos).\n if (typeof s.background === 'string' && s.background) el.style.background = s.background;\n if (typeof s.borderWidth === 'number' && s.borderWidth > 0) {\n const bc = typeof s.borderColor === 'string' && s.borderColor ? s.borderColor : '#bbbbbb';\n el.style.border = `${clampNum(s.borderWidth, 0, 20)}px solid ${bc}`;\n }\n if (kind !== 'image' && typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n el.style.borderRadius = `${clampNum(s.radius, 0, 64)}px`;\n }\n // Padding y margen — los 4 lados.\n for (const side of ['Top', 'Right', 'Bottom', 'Left'] as const) {\n const p = s[`padding${side}`];\n if (typeof p === 'number' && Number.isFinite(p)) {\n el.style.setProperty(`padding-${side.toLowerCase()}`, `${clampNum(p, 0, 128)}px`);\n }\n const m = s[`margin${side}`];\n if (typeof m === 'number' && Number.isFinite(m)) {\n el.style.setProperty(`margin-${side.toLowerCase()}`, `${clampNum(m, 0, 128)}px`);\n }\n }\n}\n\n/**\n * Botón \"✕\" de cerrar reutilizable. Universal: modal/banner/tooltip/inline (vía\n * `buildStepContent`), walkthrough, forms y guías custom lo usan, para que toda\n * guía tenga siempre una salida en la esquina superior derecha.\n *\n * `className` permite un estilo distinto por chrome (las custom usan\n * `veo-custom-close`, un botón visible sobre HTML arbitrario del cliente).\n */\nexport function createCloseButton(\n doc: Document,\n onClose: () => void,\n className = 'veo-guide-close',\n): HTMLButtonElement {\n const closeBtn = doc.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = className;\n closeBtn.setAttribute('aria-label', 'Cerrar');\n closeBtn.textContent = '×';\n closeBtn.addEventListener('click', onClose);\n return closeBtn;\n}\n\n/**\n * Acepta solo `http:` y `https:`. Resuelve relativas contra la página\n * actual cuando hay `window`; en SSR (sin window) toma la URL como\n * absoluta. Rechaza cualquier protocolo no listado y URLs malformadas.\n */\nexport function isSafeUrl(url: string): boolean {\n if (typeof url !== 'string' || url.length === 0) return false;\n try {\n const base = typeof window !== 'undefined' ? window.location.href : 'http://localhost/';\n const parsed = new URL(url, base);\n return SAFE_URL_PROTOCOLS.includes(parsed.protocol);\n } catch {\n return false;\n }\n}\n\n/**\n * El backend no tiene aún un campo `ctaUrl` en el GuideStep — la URL\n * destino para `ctaAction === 'url'` se guarda como convención en\n * `style.ctaUrl`. Esta función la extrae validando que sea una URL\n * segura. Devuelve `undefined` si falta o no pasa el chequeo.\n */\nfunction readCtaUrl(step: GuideStep): string | undefined {\n const candidate = step.style?.ctaUrl;\n if (typeof candidate !== 'string') return undefined;\n return isSafeUrl(candidate) ? candidate : undefined;\n}\n","import type { GuideStep } from './types';\n\n/**\n * Tematización de guías dirigida por datos. El autor (dashboard no-code)\n * guarda props de diseño en `step.style`; aquí las traducimos a las\n * variables CSS `--veo-*` que ya define `GUIDE_STYLES`.\n *\n * Seguridad: solo asignamos *custom properties* sobre el host (valores,\n * nunca selectores ni código). Validamos cada valor; lo inválido se ignora\n * y queda el default del stylesheet. Ningún valor llega a `innerHTML` ni a\n * `eval` — coherente con las reglas del renderer.\n */\n\n/** Overrides del tema oscuro (claro = defaults del stylesheet). */\nconst DARK_THEME: Record<string, string> = {\n '--veo-bg': '#1f2937',\n '--veo-text': '#f9fafb',\n '--veo-text-secondary': '#d1d5db',\n '--veo-shadow': '0 20px 60px rgba(0, 0, 0, 0.55)',\n};\n\nconst ALIGN_JUSTIFY: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\n/** `align-self` en el contenedor flex del step (para elementos tipo imagen). */\nconst ALIGN_SELF: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\n/** Elementos con estilo propio + qué usan para alinear (text-align vs align-self). */\nconst ELEMENT_ALIGN_MODE: Record<string, 'text' | 'self'> = {\n title: 'text',\n text: 'text',\n image: 'self',\n};\n\n/** Presets de sombra → box-shadow. */\nconst SHADOW: Record<string, string> = {\n none: 'none',\n soft: '0 4px 14px rgba(0, 0, 0, 0.10)',\n medium: '0 8px 30px rgba(0, 0, 0, 0.18)',\n strong: '0 24px 60px rgba(0, 0, 0, 0.32)',\n};\n\n/** Presets de posición del modal → fracción [x, y] del overlay (0..1). */\nconst PRESET_POS: Record<string, [number, number]> = {\n center: [0.5, 0.5],\n top: [0.5, 0],\n bottom: [0.5, 1],\n left: [0, 0.5],\n right: [1, 0.5],\n 'top-left': [0, 0],\n 'top-right': [1, 0],\n 'bottom-left': [0, 1],\n 'bottom-right': [1, 1],\n};\n\n/**\n * Acepta colores CSS razonables: hex (#rgb..#rrggbbaa), funcional\n * (rgb/rgba/hsl/hsla) o keyword simple. No interpola en CSS arbitrario:\n * el valor solo se usa como valor de una custom property.\n */\nexport const COLOR_RE = /^#[0-9a-f]{3,8}$|^(rgb|rgba|hsl|hsla)\\([\\d.,%/\\sdeg]+\\)$|^[a-z]{3,20}$/i;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Aplica las props de diseño de `step.style` como variables CSS sobre el\n * host del shadow root. No-op si no hay style. Idempotente.\n */\nexport function applyDesignVars(host: HTMLElement, style: GuideStep['style']): void {\n if (!style || typeof style !== 'object') return;\n const s = style as Record<string, unknown>;\n\n if (typeof s.accentColor === 'string' && COLOR_RE.test(s.accentColor.trim())) {\n host.style.setProperty('--veo-primary', s.accentColor.trim());\n }\n\n // Fuente (del design system del workspace). Sin `<>{}` para no romper el CSS.\n if (\n typeof s.fontFamily === 'string' &&\n s.fontFamily.length <= 200 &&\n !/[<>{}]/.test(s.fontFamily)\n ) {\n host.style.setProperty('--veo-font', s.fontFamily.trim());\n }\n\n if (s.theme === 'dark') {\n for (const [key, value] of Object.entries(DARK_THEME)) {\n host.style.setProperty(key, value);\n }\n }\n\n // Colores del tema PERSONALIZADOS (design system): pisan el preset claro/oscuro.\n if (typeof s.background === 'string' && COLOR_RE.test(s.background.trim())) {\n host.style.setProperty('--veo-bg', s.background.trim());\n }\n if (typeof s.textColor === 'string' && COLOR_RE.test(s.textColor.trim())) {\n host.style.setProperty('--veo-text', s.textColor.trim());\n }\n if (typeof s.textSecondaryColor === 'string' && COLOR_RE.test(s.textSecondaryColor.trim())) {\n host.style.setProperty('--veo-text-secondary', s.textSecondaryColor.trim());\n }\n\n if (typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n host.style.setProperty('--veo-radius', `${clamp(s.radius, 0, 48)}px`);\n }\n\n if (typeof s.width === 'number' && Number.isFinite(s.width)) {\n host.style.setProperty('--veo-width', `${clamp(s.width, 220, 720)}px`);\n }\n\n // Alto mínimo de la tarjeta (modal). min-height y no height: el contenido\n // nunca se recorta. Lo setea el resize por arrastre del editor.\n if (typeof s.height === 'number' && Number.isFinite(s.height)) {\n host.style.setProperty('--veo-min-h', `${clamp(s.height, 120, 900)}px`);\n }\n\n if (s.align === 'left' || s.align === 'center' || s.align === 'right') {\n host.style.setProperty('--veo-actions-justify', ALIGN_JUSTIFY[s.align] as string);\n }\n\n if (typeof s.padding === 'number' && Number.isFinite(s.padding)) {\n host.style.setProperty('--veo-pad', `${clamp(s.padding, 0, 64)}px`);\n }\n\n if (typeof s.margin === 'number' && Number.isFinite(s.margin)) {\n host.style.setProperty('--veo-margin', `${clamp(s.margin, 0, 64)}px`);\n }\n\n if (typeof s.borderWidth === 'number' && Number.isFinite(s.borderWidth)) {\n host.style.setProperty('--veo-border-width', `${clamp(s.borderWidth, 0, 16)}px`);\n }\n\n if (typeof s.borderColor === 'string' && COLOR_RE.test(s.borderColor.trim())) {\n host.style.setProperty('--veo-border-color', s.borderColor.trim());\n }\n\n if (typeof s.shadow === 'string' && SHADOW[s.shadow]) {\n host.style.setProperty('--veo-shadow', SHADOW[s.shadow] as string);\n }\n\n // Posición del modal: libre (posX/posY en 0..1) tiene prioridad sobre el preset.\n let px: number | undefined;\n let py: number | undefined;\n if (typeof s.posX === 'number' && typeof s.posY === 'number') {\n px = clamp(s.posX, 0, 1);\n py = clamp(s.posY, 0, 1);\n } else if (typeof s.overlayPosition === 'string' && PRESET_POS[s.overlayPosition]) {\n [px, py] = PRESET_POS[s.overlayPosition] as [number, number];\n }\n if (px !== undefined && py !== undefined) {\n host.style.setProperty('--veo-pos-x', `${px * 100}%`);\n host.style.setProperty('--veo-pos-y', `${py * 100}%`);\n }\n\n // Estilo POR ELEMENTO (title/text/image/cta): cada bloque puede sobrescribir\n // alineación, color, tamaño y márgenes de forma independiente del step.\n if (s.elements && typeof s.elements === 'object') {\n const el = s.elements as Record<string, unknown>;\n applyElementVars(host, 'title', el.title);\n applyElementVars(host, 'text', el.text);\n applyElementVars(host, 'image', el.image);\n applyCtaVars(host, el.cta);\n }\n}\n\n/**\n * Estilo del BOTÓN (cta): fondo (default = --veo-primary), color del texto,\n * tamaño, redondeo y alineación de la fila de acciones. Personalizable desde\n * el design system del workspace (\"Botones\") o por guía.\n */\nfunction applyCtaVars(host: HTMLElement, raw: unknown): void {\n if (!raw || typeof raw !== 'object') return;\n const cta = raw as Record<string, unknown>;\n if (typeof cta.align === 'string' && ALIGN_JUSTIFY[cta.align]) {\n host.style.setProperty('--veo-actions-justify', ALIGN_JUSTIFY[cta.align] as string);\n }\n if (typeof cta.background === 'string' && COLOR_RE.test(cta.background.trim())) {\n host.style.setProperty('--veo-cta-bg', cta.background.trim());\n }\n if (typeof cta.color === 'string' && COLOR_RE.test(cta.color.trim())) {\n host.style.setProperty('--veo-cta-color', cta.color.trim());\n }\n if (typeof cta.fontSize === 'number' && Number.isFinite(cta.fontSize)) {\n host.style.setProperty('--veo-cta-size', `${clamp(cta.fontSize, 10, 24)}px`);\n }\n if (typeof cta.radius === 'number' && Number.isFinite(cta.radius)) {\n host.style.setProperty('--veo-cta-radius', `${clamp(cta.radius, 0, 48)}px`);\n }\n}\n\n/**\n * Emite las variables CSS de un elemento (`--veo-{prefix}-*`). Cada prop es\n * opcional y se valida; lo inválido se ignora y queda el default del stylesheet.\n */\nfunction applyElementVars(host: HTMLElement, prefix: string, raw: unknown): void {\n if (!raw || typeof raw !== 'object') return;\n const el = raw as Record<string, unknown>;\n\n if (\n typeof el.align === 'string' &&\n (el.align === 'left' || el.align === 'center' || el.align === 'right')\n ) {\n const mode = ELEMENT_ALIGN_MODE[prefix] ?? 'text';\n const value = mode === 'self' ? (ALIGN_SELF[el.align] as string) : el.align;\n host.style.setProperty(`--veo-${prefix}-align`, value);\n }\n if (typeof el.color === 'string' && COLOR_RE.test(el.color.trim())) {\n host.style.setProperty(`--veo-${prefix}-color`, el.color.trim());\n }\n if (typeof el.fontSize === 'number' && Number.isFinite(el.fontSize)) {\n host.style.setProperty(`--veo-${prefix}-size`, `${clamp(el.fontSize, 8, 72)}px`);\n }\n if (typeof el.width === 'number' && Number.isFinite(el.width)) {\n host.style.setProperty(`--veo-${prefix}-width`, `${clamp(el.width, 10, 100)}%`);\n }\n if (typeof el.radius === 'number' && Number.isFinite(el.radius)) {\n host.style.setProperty(`--veo-${prefix}-radius`, `${clamp(el.radius, 0, 48)}px`);\n }\n if (typeof el.marginTop === 'number' && Number.isFinite(el.marginTop)) {\n host.style.setProperty(`--veo-${prefix}-mt`, `${clamp(el.marginTop, 0, 64)}px`);\n }\n if (typeof el.marginBottom === 'number' && Number.isFinite(el.marginBottom)) {\n host.style.setProperty(`--veo-${prefix}-mb`, `${clamp(el.marginBottom, 0, 64)}px`);\n }\n}\n","import type { GuideStep } from './types';\n\n/** Dónde insertar la guía respecto al elemento ancla. Default `after`. */\nexport type InlinePosition = 'before' | 'after' | 'prepend' | 'append';\n\nexport function readInlinePosition(style: GuideStep['style']): InlinePosition {\n const p = (style as Record<string, unknown> | null | undefined)?.inlinePosition;\n return p === 'before' || p === 'prepend' || p === 'append' ? p : 'after';\n}\n\n/** Inserta el host en el flujo del DOM relativo al ancla. */\nexport function insertHost(anchor: Element, host: HTMLElement, position: InlinePosition): void {\n switch (position) {\n case 'before':\n anchor.before(host);\n break;\n case 'after':\n anchor.after(host);\n break;\n case 'prepend':\n anchor.prepend(host);\n break;\n case 'append':\n anchor.append(host);\n break;\n }\n}\n\n/**\n * Mantiene el host PEGADO al DOM. Los frameworks del host (React/Next)\n * reconcilian sus contenedores al hidratar/re-renderizar y BORRAN nodos que\n * no reconocen — la guía inline aparecía durante la carga y desaparecía al\n * montar el contenido real. Chequea cada 1s: si el host quedó desconectado,\n * re-busca el ancla y se re-inserta. Devuelve el stop() (registrarlo como\n * cleanup del renderer para que el dismiss/destroy lo corte).\n */\nexport function keepHostAttached(\n host: HTMLElement,\n selector: string,\n position: InlinePosition,\n): () => void {\n const id = window.setInterval(() => {\n if (host.isConnected) return;\n const anchor = document.querySelector(selector);\n if (anchor) insertHost(anchor, host, position);\n }, 1000);\n return () => window.clearInterval(id);\n}\n","import { DEFAULT_ANCHOR_WAIT_MS } from './constants';\n\n/**\n * Resuelve un selector CSS de forma robusta para SPAs: chequea inmediato\n * y, si no existe, observa el DOM con MutationObserver hasta `timeoutMs`.\n * Devuelve `null` si no apareció antes del timeout.\n *\n * Esta función nunca lanza. Si el selector es inválido devuelve `null`\n * silenciosamente — un selector roto en la DB no debe romper la app.\n */\nexport function waitForElement(\n selector: string,\n timeoutMs: number = DEFAULT_ANCHOR_WAIT_MS,\n): Promise<Element | null> {\n return new Promise((resolve) => {\n const safeQuery = (): Element | null => {\n try {\n return document.querySelector(selector);\n } catch {\n return null;\n }\n };\n\n const existing = safeQuery();\n if (existing) {\n resolve(existing);\n return;\n }\n\n let resolved = false;\n const finish = (el: Element | null) => {\n if (resolved) return;\n resolved = true;\n observer.disconnect();\n clearTimeout(timer);\n resolve(el);\n };\n\n const observer = new MutationObserver(() => {\n const el = safeQuery();\n if (el) finish(el);\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n\n const timer = setTimeout(() => finish(null), timeoutMs);\n });\n}\n","import { GUIDE_Z_INDEX } from './constants';\n\n/**\n * CSS inyectado en cada shadow DOM. Como `:host { all: initial }` rompe\n * con la herencia del host, todos los estilos viven aquí. Las variables\n * CSS (`--veo-*`) son los puntos de extensión para tematización futura.\n */\nexport const GUIDE_STYLES = `\n:host {\n --veo-primary: #FF5B35;\n --veo-text: #1f2937;\n --veo-text-secondary: #4b5563;\n --veo-bg: #ffffff;\n --veo-radius: 12px;\n --veo-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);\n --veo-width: 420px;\n --veo-actions-justify: flex-end;\n all: initial;\n}\n* { box-sizing: border-box; font-family: var(--veo-font, -apple-system, system-ui, \"Segoe UI\", Roboto, sans-serif); }\n\n.veo-modal-overlay {\n position: fixed; inset: 0;\n background: rgba(15, 15, 30, 0.45);\n z-index: ${GUIDE_Z_INDEX};\n animation: veo-fade-in 180ms ease-out;\n}\n/* Sin backdrop (style.backdrop === false): la app queda usable detrás; solo la\n tarjeta captura el mouse. El click-en-backdrop deja de cerrar (no hay backdrop). */\n.veo-modal-overlay--none {\n background: transparent;\n pointer-events: none;\n}\n.veo-modal-overlay--none .veo-modal-card { pointer-events: auto; }\n/*\n * Posición libre/preset: --veo-pos-x/y son porcentajes (default 50% = centro).\n * El truco translate(-pos) alinea la MISMA fracción de la tarjeta con esa\n * fracción del overlay, así la tarjeta nunca se sale (0% = pegada izquierda,\n * 100% = pegada derecha, 50% = centrada) sea cual sea su ancho.\n */\n.veo-modal-card {\n position: absolute;\n left: var(--veo-pos-x, 50%);\n top: var(--veo-pos-y, 50%);\n transform: translate(calc(var(--veo-pos-x, 50%) * -1), calc(var(--veo-pos-y, 50%) * -1));\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 24px);\n max-width: var(--veo-width); width: 90%;\n min-height: var(--veo-min-h, auto);\n box-shadow: var(--veo-shadow);\n animation: veo-fade-in 180ms ease-out;\n}\n\n.veo-banner {\n position: fixed; left: 0; right: 0;\n background: var(--veo-bg);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 16px);\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: var(--veo-shadow, 0 2px 12px rgba(0, 0, 0, 0.12));\n animation: veo-slide-down 200ms ease-out;\n}\n.veo-banner-top { top: 0; }\n.veo-banner-bottom { bottom: 0; }\n/* Banner EMBEBIDO en un contenedor (step.selector): fluye dentro del contenedor\n y empuja su contenido, en vez de flotar fijo sobre la pantalla. */\n.veo-banner-embedded {\n position: static;\n left: auto; right: auto;\n width: 100%;\n border-radius: var(--veo-radius, 0);\n}\n\n.veo-tooltip {\n position: absolute;\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 15px);\n max-width: 300px;\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: var(--veo-shadow, 0 8px 30px rgba(0, 0, 0, 0.18));\n animation: veo-fade-in 150ms ease-out;\n}\n.veo-tooltip-arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: var(--veo-bg);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n transform: rotate(45deg);\n pointer-events: none;\n}\n\n.veo-inline {\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 20px);\n max-width: var(--veo-width);\n margin: var(--veo-margin, 12px) 0;\n position: relative;\n box-shadow: var(--veo-shadow);\n animation: veo-fade-in 160ms ease-out;\n}\n\n/* ── Modelo unificado (composite) ── */\n.veo-composite-overlay {\n position: fixed; inset: 0;\n z-index: ${GUIDE_Z_INDEX};\n pointer-events: none;\n}\n/* Backdrop atenuado (cualquier posición flotante con backdrop activo). */\n.veo-composite-overlay--dim {\n background: rgba(0, 0, 0, 0.5);\n pointer-events: auto;\n}\n.veo-composite-anchored {\n position: fixed;\n z-index: ${GUIDE_Z_INDEX};\n}\n/* Card genérica del modelo unificado. El diseño (bg/borde/padding/…) lo aplica\n el renderer como estilos inline desde step.design; acá van los defaults. */\n.veo-card {\n pointer-events: auto;\n background: var(--veo-bg, #ffffff);\n color: var(--veo-text, #1f2937);\n border-radius: var(--veo-radius, 12px);\n padding: 20px;\n max-width: 90vw;\n box-shadow: var(--veo-shadow, 0 12px 40px rgba(0, 0, 0, 0.18));\n animation: veo-fade-in 160ms ease-out;\n}\n.veo-composite-anchored .veo-card, .veo-composite-overlay .veo-card { position: relative; }\n\n.veo-guide-content {\n position: relative;\n display: flex; flex-direction: column;\n}\n/* Reserva espacio para la ✕ (esquina sup. derecha) SOLO en el primer bloque:\n así el texto alineado a la derecha no queda tapado por el botón de cerrar. */\n.veo-guide-content > .veo-guide-title:first-child,\n.veo-guide-content > .veo-guide-text:first-child {\n padding-right: 20px;\n}\n.veo-guide-image {\n display: block;\n width: var(--veo-image-width, 100%);\n max-height: 180px;\n object-fit: cover;\n align-self: var(--veo-image-align, stretch);\n border-radius: var(--veo-image-radius, 8px);\n margin: var(--veo-image-mt, 0) 0 var(--veo-image-mb, 12px);\n}\n/* Imagen A SANGRE: rompe el padding de la tarjeta y ocupa el ancho completo\n (hero estilo anuncio). Como primer bloque, hereda el redondeo superior. */\n.veo-guide-image--bleed {\n width: calc(100% + var(--veo-pad, 24px) * 2);\n max-width: none;\n max-height: 280px;\n align-self: auto;\n border-radius: 0;\n margin: 0 calc(var(--veo-pad, 24px) * -1) 12px;\n}\n.veo-guide-content > .veo-guide-image--bleed:first-child {\n margin-top: calc(var(--veo-pad, 24px) * -1);\n border-radius: calc(var(--veo-radius, 12px) - var(--veo-border-width, 0px))\n calc(var(--veo-radius, 12px) - var(--veo-border-width, 0px)) 0 0;\n}\n.veo-guide-title {\n font-size: var(--veo-title-size, 18px); font-weight: 600; line-height: 1.3;\n text-align: var(--veo-title-align, left);\n margin: var(--veo-title-mt, 0) 0 var(--veo-title-mb, 6px);\n color: var(--veo-title-color, var(--veo-text));\n}\n.veo-guide-text {\n font-size: var(--veo-text-size, 14px); line-height: 1.5;\n text-align: var(--veo-text-align, left);\n margin: var(--veo-text-mt, 0) 0 var(--veo-text-mb, 16px);\n color: var(--veo-text-color, var(--veo-text-secondary));\n}\n/* Rich text dentro de un bloque de texto (p/listas/links/énfasis). */\n.veo-guide-text p { margin: 0 0 8px; }\n.veo-guide-text p:last-child { margin-bottom: 0; }\n.veo-guide-text ul, .veo-guide-text ol { margin: 0 0 8px; padding-left: 20px; }\n.veo-guide-text ul { list-style: disc; }\n.veo-guide-text ol { list-style: decimal; }\n.veo-guide-text li { margin: 2px 0; display: list-item; }\n.veo-guide-text a { color: var(--veo-primary); text-decoration: underline; cursor: pointer; }\n.veo-guide-text strong { font-weight: 600; }\n.veo-guide-text em { font-style: italic; }\n.veo-guide-text u { text-decoration: underline; }\n.veo-guide-text s { text-decoration: line-through; }\n/*\n * El ÚLTIMO bloque de contenido no deja su margin-bottom colgando: ese margen\n * existe para separar del bloque SIGUIENTE, y sin siguiente se suma al padding\n * de la tarjeta y parece un \"hueco fantasma\" (p.ej. quitar el botón de un\n * tooltip dejaba el espacio como si siguiera ahí). El penúltimo hijo es el\n * último bloque real (el ✕ de cerrar siempre va último y es absoluto). La\n * mayor especificidad le gana a las reglas por clase, pero NO a un margen\n * inline elegido explícitamente por el autor (block.style.marginBottom).\n */\n.veo-guide-content > :nth-last-child(2) {\n margin-bottom: 0;\n}\n.veo-guide-actions {\n display: flex; gap: 8px; justify-content: var(--veo-actions-justify);\n}\n.veo-guide-cta {\n background: var(--veo-cta-bg, var(--veo-primary));\n color: var(--veo-cta-color, #fff); border: none;\n padding: 9px 18px; border-radius: var(--veo-cta-radius, 8px);\n font-size: var(--veo-cta-size, 14px); font-weight: 500; cursor: pointer;\n transition: opacity 120ms ease;\n}\n.veo-guide-cta:hover { opacity: 0.9; }\n.veo-guide-cta:active { transform: translateY(1px); }\n.veo-guide-close {\n position: absolute; top: -6px; right: -6px;\n width: 24px; height: 24px;\n background: none; border: none;\n font-size: 22px; line-height: 1;\n cursor: pointer; color: #9ca3af; padding: 0;\n}\n.veo-guide-close:hover { color: var(--veo-text); }\n/*\n * Si el PRIMER bloque es una imagen, la ✕ quedaría sobre la esquina de la foto\n * (invisible según el color). En ese caso pasa a ser una pastilla flotante con\n * fondo propio, legible sobre cualquier imagen. (Sin soporte de :has() queda el\n * estilo base — mismo comportamiento de antes, sin regresión.)\n */\n.veo-guide-content:has(> .veo-guide-image:first-child) > .veo-guide-close {\n top: 2px; right: 2px;\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; color: #374151;\n background: rgba(255, 255, 255, 0.92);\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);\n}\n.veo-guide-content:has(> .veo-guide-image:first-child) > .veo-guide-close:hover {\n color: #111827;\n}\n\n.veo-form { display: flex; flex-direction: column; gap: 14px; margin-bottom: 16px; }\n.veo-form-field { display: flex; flex-direction: column; gap: 6px; }\n.veo-form-label { font-size: 13px; font-weight: 500; color: var(--veo-text); }\n.veo-form-input {\n font-size: 14px; color: var(--veo-text);\n background: var(--veo-bg);\n border: 1px solid #d1d5db; border-radius: 8px;\n padding: 8px 10px; width: 100%;\n}\n.veo-form-input:focus { outline: 2px solid var(--veo-primary); outline-offset: -1px; border-color: transparent; }\n.veo-form-options { display: flex; flex-direction: column; gap: 6px; }\n.veo-form-option {\n display: flex; align-items: center; gap: 8px;\n font-size: 14px; color: var(--veo-text); cursor: pointer;\n}\n.veo-form-option input { accent-color: var(--veo-primary); margin: 0; cursor: pointer; }\n.veo-form-scale { display: flex; gap: 4px; flex-wrap: wrap; }\n.veo-nps-btn {\n min-width: 30px; height: 30px; padding: 0 4px;\n font-size: 13px; font-weight: 500; color: var(--veo-text);\n background: var(--veo-bg); border: 1px solid #d1d5db; border-radius: 6px;\n cursor: pointer; transition: all 100ms ease;\n}\n.veo-nps-btn:hover { border-color: var(--veo-primary); }\n.veo-rating-btn {\n background: none; border: none; padding: 0 2px;\n font-size: 26px; line-height: 1; color: #d1d5db;\n cursor: pointer; transition: color 100ms ease;\n}\n.veo-scale-active.veo-nps-btn { background: var(--veo-primary); color: #fff; border-color: var(--veo-primary); }\n.veo-scale-active.veo-rating-btn { color: #f59e0b; }\n.veo-form-error { font-size: 13px; color: #dc2626; margin: 0; }\n.veo-form-thanks {\n text-align: center; padding: 24px 8px;\n font-size: 16px; font-weight: 600; color: var(--veo-text);\n}\n.veo-form-preview-note {\n text-align: center; margin: 0 0 12px;\n font-size: 12px; color: #b45309;\n}\n\n.veo-walkthrough {\n position: absolute;\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 16px);\n max-width: 340px;\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: var(--veo-shadow, 0 8px 30px rgba(0, 0, 0, 0.2));\n animation: veo-fade-in 150ms ease-out;\n}\n.veo-walkthrough-arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: var(--veo-bg);\n transform: rotate(45deg);\n pointer-events: none;\n}\n.veo-walkthrough-counter {\n font-size: 11px; color: #9ca3af;\n margin-bottom: 8px; letter-spacing: 0.02em;\n}\n.veo-walkthrough-progress {\n display: flex; gap: 4px;\n margin-bottom: 12px;\n}\n.veo-walkthrough-progress-dot {\n width: 8px; height: 8px;\n border-radius: 50%;\n background: #e5e7eb;\n transition: background 200ms ease;\n}\n.veo-walkthrough-progress-dot.active { background: var(--veo-primary); }\n.veo-walkthrough-progress-dot.completed { background: var(--veo-primary); opacity: 0.5; }\n.veo-walkthrough-actions {\n display: flex; align-items: center;\n margin-top: 16px; gap: 8px;\n}\n.veo-walkthrough-actions-right {\n display: flex; gap: 8px;\n margin-left: auto;\n}\n.veo-walkthrough-btn-secondary {\n background: transparent; color: #6b7280;\n border: 1px solid #e5e7eb;\n padding: 8px 16px; border-radius: 8px;\n font-size: 13px; cursor: pointer;\n transition: background 120ms ease;\n}\n.veo-walkthrough-btn-secondary:hover { background: #f9fafb; }\n.veo-walkthrough-skip {\n background: transparent; color: #9ca3af;\n border: none; padding: 4px 8px;\n font-size: 12px; cursor: pointer;\n}\n.veo-walkthrough-skip:hover { color: var(--veo-text); }\n\n/* ── Badge (elemento inyectado junto al ancla que abre un tooltip) ── */\n.veo-badge {\n display: inline-flex; align-items: center; justify-content: center;\n border: none; padding: 0; margin: 0 4px;\n background: none; cursor: pointer;\n line-height: 1; vertical-align: middle;\n font-family: inherit;\n}\n.veo-badge:focus-visible { outline: 2px solid var(--veo-primary); outline-offset: 2px; }\n.veo-badge--icon {\n border-radius: 50%;\n background: color-mix(in srgb, var(--veo-primary) 14%, transparent);\n color: var(--veo-primary);\n font-weight: 600;\n}\n.veo-badge--dot {\n border-radius: 50%;\n background: var(--veo-primary);\n animation: veo-badge-pulse 2s ease-out infinite;\n}\n.veo-badge--pill {\n border-radius: 999px;\n background: var(--veo-primary);\n color: #fff;\n font-weight: 600;\n padding: 3px 9px;\n white-space: nowrap;\n}\n.veo-badge--text {\n color: var(--veo-primary);\n font-weight: 600;\n white-space: nowrap;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n}\n.veo-badge--image img { display: block; border-radius: 4px; object-fit: cover; }\n/* El tooltip del badge usa strategy fixed (el host vive dentro del flujo del\n cliente; un absoluto se recortaría con overflow de ancestros). Su ancho es\n personalizable vía var dedicada (--veo-width no sirve: el :host la define\n en 420px siempre y pisaría el default de 300px de los tooltips). */\n.veo-badge-tooltip {\n position: fixed;\n max-width: var(--veo-badge-tip-width, 300px);\n}\n@keyframes veo-badge-pulse {\n 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--veo-primary) 45%, transparent); }\n 70% { box-shadow: 0 0 0 7px transparent; }\n 100% { box-shadow: 0 0 0 0 transparent; }\n}\n\n.veo-custom-floating {\n position: fixed;\n z-index: ${GUIDE_Z_INDEX};\n max-width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n animation: veo-fade-in 160ms ease;\n}\n.veo-custom-anchored {\n position: fixed;\n top: 0; left: 0;\n z-index: ${GUIDE_Z_INDEX};\n max-width: calc(100vw - 16px);\n animation: veo-fade-in 160ms ease;\n}\n.veo-custom-inline {\n display: block;\n position: relative;\n margin: 12px 0;\n}\n.veo-custom-frame {\n display: block;\n border: 0;\n width: 360px;\n background: transparent;\n color-scheme: normal;\n}\n\n@keyframes veo-fade-in { from { opacity: 0; } to { opacity: 1; } }\n@keyframes veo-slide-up {\n from { transform: translateY(10px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n@keyframes veo-slide-down {\n from { transform: translateY(-10px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n`;\n","import { GUIDE_HOST_ATTR } from '../constants';\nimport { applyDesignVars } from '../guide-design';\nimport { GUIDE_STYLES } from '../styles';\nimport type { GuideRenderContext, GuideStep } from '../types';\n\n/**\n * Base de los renderers de guías. Encapsula:\n * - creación del host con Shadow DOM (aislamiento de estilos)\n * - inyección del CSS común\n * - limpieza del DOM y de listeners en `destroy()`\n *\n * Cada subclase implementa `render(context)`. La subclase puede registrar\n * cleanup adicional con `registerCleanup` para que se ejecute en destroy.\n *\n * Tipos genéricos:\n * - `TContext` (default `GuideRenderContext`): el shape que recibe la\n * subclase. WalkthroughRenderer usa uno propio con step + callbacks.\n * - `TResult` (default `void`): lo que `render` devuelve. El walkthrough\n * usa `boolean` para señalar éxito al controller cuando el ancla no\n * aparece. El resto sigue devolviendo `void`/`Promise<void>`.\n */\nexport abstract class BaseRenderer<TContext = GuideRenderContext, TResult = void> {\n protected host: HTMLElement | null = null;\n protected shadow: ShadowRoot | null = null;\n private cleanups: Array<() => void> = [];\n\n // ── Update in-place (preview en vivo del editor) ──\n // La subclase setea estas piezas en render() para habilitarlo: el contenedor\n // del contenido, el nodo de contenido actual y cómo reconstruirlo.\n protected liveContainer: HTMLElement | null = null;\n protected liveContent: HTMLElement | null = null;\n protected liveBuild: ((step: GuideStep) => HTMLElement) | null = null;\n /** Clave de anclaje/estructura fijada en render(); si cambia → remontar. */\n protected liveKey = '';\n\n /** Clave de anclaje derivada del step (override por subclase). */\n protected liveKeyOf(_step: GuideStep): string {\n return '';\n }\n\n /** Hook post-swap (reposicionar tooltip, actualizar clase del banner…). */\n protected onLiveUpdate(_step: GuideStep): void {}\n\n /**\n * Actualiza el contenido del step SIN remontar el host — así el preview del\n * editor no parpadea en cada tecla. Devuelve `false` cuando el renderer no\n * lo soporta o el cambio requiere remontar (cambió el ancla/estructura);\n * en ese caso el caller hace el re-render completo.\n */\n updateStep(step: GuideStep): boolean {\n if (!this.host || !this.liveContainer || !this.liveContent || !this.liveBuild) return false;\n if (this.liveKeyOf(step) !== this.liveKey) return false;\n const next = this.liveBuild(step);\n this.liveContainer.replaceChild(next, this.liveContent);\n this.liveContent = next;\n this.applyDesign(step.style);\n this.onLiveUpdate(step);\n return true;\n }\n\n /**\n * Crea un `<div data-veo-guide>` adjunto a `document.body`, le adjunta\n * un ShadowRoot abierto e inyecta los estilos. Retorna el nodo raíz\n * donde la subclase puede insertar el contenido específico.\n */\n protected createHost(): { host: HTMLElement; shadow: ShadowRoot; root: HTMLElement } {\n const host = document.createElement('div');\n host.setAttribute(GUIDE_HOST_ATTR, '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = GUIDE_STYLES;\n shadow.appendChild(style);\n\n const root = document.createElement('div');\n shadow.appendChild(root);\n\n document.body.appendChild(host);\n\n this.host = host;\n this.shadow = shadow;\n return { host, shadow, root };\n }\n\n /**\n * Aplica la tematización por datos del step (`step.style`) como variables\n * CSS sobre el host. Llamar tras `createHost()`. No-op si no hay host o\n * style. Ver `guide-design.ts`.\n */\n protected applyDesign(style: GuideStep['style']): void {\n if (this.host) applyDesignVars(this.host, style);\n }\n\n /**\n * Registra una función a ejecutar en `destroy()`. Útil para limpiar\n * listeners globales (scroll, resize) o intervalos.\n */\n protected registerCleanup(fn: () => void): void {\n this.cleanups.push(fn);\n }\n\n /**\n * Host de la guía montada (o `null` si aún no se montó / ya se destruyó).\n * Lo usa el modo builder para adjuntar manipulación directa (drag/resize)\n * sobre el shadow root abierto sin tocar los renderers.\n */\n hostElement(): HTMLElement | null {\n return this.host;\n }\n\n /** Remueve el host del DOM y corre todas las funciones de cleanup. */\n destroy(): void {\n for (const fn of this.cleanups) {\n try {\n fn();\n } catch {\n // No propagar: un cleanup roto no debe romper el resto.\n }\n }\n this.cleanups = [];\n\n if (this.host?.parentNode) {\n this.host.parentNode.removeChild(this.host);\n }\n this.host = null;\n this.shadow = null;\n }\n\n abstract render(context: TContext): TResult | Promise<TResult>;\n}\n","/**\n * Posicionamiento del caret (flecha) que apunta al elemento anclado, compartido\n * por el tooltip y el walkthrough. Floating UI (middleware `arrow`) da el\n * desplazamiento a lo largo del borde; aquí lo aplicamos y \"pegamos\" el caret al\n * lado del tooltip enfrentado al ancla.\n */\n\n/** Lado del tooltip donde se \"pega\" el caret, opuesto al placement resuelto. */\nconst STATIC_SIDE: Record<string, 'top' | 'bottom' | 'left' | 'right'> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\n/**\n * Ubica el caret sobre el borde del tooltip enfrentado al ancla. Floating UI\n * da el desplazamiento a lo largo del borde (`x` o `y`); el otro eje se fija a\n * `-6px` (mitad del caret) para que sobresalga.\n */\nexport function positionArrow(\n arrowEl: HTMLElement,\n placement: string,\n data: { x?: number; y?: number } | undefined,\n): void {\n const side = STATIC_SIDE[placement.split('-')[0] ?? 'bottom'] ?? 'top';\n for (const prop of ['top', 'bottom', 'left', 'right'] as const) {\n arrowEl.style.setProperty(prop, '');\n }\n if (data?.x != null) arrowEl.style.setProperty('left', `${data.x}px`);\n if (data?.y != null) arrowEl.style.setProperty('top', `${data.y}px`);\n arrowEl.style.setProperty(side, '-6px');\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { buildStepContent, isSafeUrl } from '../block-builder';\nimport { COLOR_RE } from '../guide-design';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type {\n BadgeConfig,\n BadgeTrigger,\n GuideInteractionMetadata,\n GuideRenderContext,\n GuideStep,\n} from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/** Retardo de gracia del hover: permite mover el mouse del badge al tooltip. */\nconst HOVER_CLOSE_DELAY_MS = 150;\n\n/**\n * Renderiza una guía tipo `badge` (estilo Pendo): un elemento CHICO —\n * icono/punto/cápsula/imagen — inyectado EN EL FLUJO del DOM junto al ancla\n * (`step.selector` + `style.inlinePosition`), que al hover o click\n * (`style.badgeTrigger`) abre un tooltip con el contenido del paso.\n *\n * Composición (no herencia): reusa `insertHost`/`keepHostAttached` del inline\n * (watchdog contra re-renders de React), `buildStepContent` (bloques) y el\n * posicionamiento Floating UI + caret del tooltip — con `strategy: 'fixed'`\n * porque el host vive DENTRO del flujo del cliente y un ancestro con\n * `overflow: hidden` recortaría un tooltip absoluto.\n *\n * EL BADGE ES PERMANENTE (como en Pendo): nada de lo que haga el usuario lo\n * quita — lo único que se abre y se cierra es el TOOLTIP. La ✕ del tooltip, el\n * hover-out, el click afuera, Esc y los CTA solo cierran el tooltip; el badge\n * queda para volver a consultarlo cuando quiera. Por eso el badge nunca emite\n * `dismissed` (no hay forma de descartarlo) y su frecuencia natural es `always`.\n *\n * Analytics (deliberado):\n * - `shown` la PRIMERA vez que se ABRE el tooltip (no al inyectar el badge):\n * mide cuánta gente abrió la ayuda, no en cuántas páginas existía el icono.\n * - `cta_clicked` en los botones del tooltip (con buttonId si lo tienen).\n */\nexport class BadgeRenderer extends BaseRenderer {\n private tooltip: HTMLElement | null = null;\n private arrowEl: HTMLElement | null = null;\n private badgeBtn: HTMLButtonElement | null = null;\n private open = false;\n private shownEmitted = false;\n private trigger: BadgeTrigger = 'hover';\n private side: 'top' | 'bottom' | 'left' | 'right' = 'top';\n private closeTimer: number | null = null;\n private stopFloat: (() => void) | null = null;\n\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n const ownerDocument = root.ownerDocument ?? document;\n this.applyDesign(step.style);\n // Ancho del tooltip personalizable (slider «Ancho» del editor). Var\n // dedicada: --veo-width no distingue \"no seteado\" (el :host la define).\n const tipWidth = step.style?.width;\n if (typeof tipWidth === 'number' && Number.isFinite(tipWidth)) {\n host.style.setProperty(\n '--veo-badge-tip-width',\n `${Math.min(720, Math.max(220, tipWidth))}px`,\n );\n }\n this.trigger = step.style?.badgeTrigger === 'click' ? 'click' : 'hover';\n const rawSide = step.style?.tooltipPlacement;\n this.side = rawSide === 'bottom' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'top';\n\n // ── Badge en el flujo del DOM, pegado al ancla ──\n const position = readInlinePosition(step.style);\n host.style.display = 'inline-flex';\n host.style.verticalAlign = 'middle';\n const badge = buildBadgeElement(readBadgeConfig(step), ownerDocument);\n root.appendChild(badge);\n this.badgeBtn = badge;\n insertHost(anchor, host, position);\n this.registerCleanup(keepHostAttached(host, selector, position));\n\n // ── Tooltip (cerrado hasta el trigger) ──\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-tooltip veo-badge-tooltip';\n tooltip.style.display = 'none';\n\n const emit = (action: 'shown' | 'cta_clicked', meta?: GuideInteractionMetadata): void => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n };\n\n const buildTooltipContent = (s: GuideStep): HTMLElement =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n emit('cta_clicked', meta);\n if (action === 'url' && target) window.open(target, '_blank', 'noopener,noreferrer');\n // TODO cierra solo el TOOLTIP — el badge es permanente.\n this.closeTooltip();\n // Encadenado: además abre la otra guía.\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n // La ✕ también cierra solo el tooltip (nunca el badge, nunca dismissed).\n onDismiss: () => this.closeTooltip(),\n });\n\n const content = buildTooltipContent(step);\n tooltip.appendChild(content);\n\n const arrowEl = ownerDocument.createElement('div');\n arrowEl.className = 'veo-tooltip-arrow';\n tooltip.appendChild(arrowEl);\n root.appendChild(tooltip);\n this.tooltip = tooltip;\n this.arrowEl = arrowEl;\n\n // Update in-place (preview del editor).\n this.liveContainer = tooltip;\n this.liveContent = content;\n this.liveKey = this.liveKeyOf(step);\n this.liveBuild = buildTooltipContent;\n\n // ── Trigger ──\n const openNow = (): void => {\n this.cancelClose();\n if (!this.open) {\n this.openTooltip(badge);\n if (!this.shownEmitted) {\n this.shownEmitted = true;\n emit('shown');\n }\n }\n };\n if (this.trigger === 'hover') {\n const scheduleClose = (): void => {\n this.cancelClose();\n this.closeTimer = window.setTimeout(() => this.closeTooltip(), HOVER_CLOSE_DELAY_MS);\n };\n badge.addEventListener('mouseenter', openNow);\n badge.addEventListener('focus', openNow);\n badge.addEventListener('mouseleave', scheduleClose);\n badge.addEventListener('blur', scheduleClose);\n tooltip.addEventListener('mouseenter', () => this.cancelClose());\n tooltip.addEventListener('mouseleave', scheduleClose);\n } else {\n badge.addEventListener('click', () => {\n if (this.open) this.closeTooltip();\n else openNow();\n });\n const onDocClick = (e: MouseEvent): void => {\n if (!this.open) return;\n // El shadow host encapsula badge y tooltip: un click cuyo path no pasa\n // por el host es \"afuera\".\n if (e.composedPath().includes(host)) return;\n this.closeTooltip();\n };\n document.addEventListener('click', onDocClick, true);\n this.registerCleanup(() => document.removeEventListener('click', onDocClick, true));\n }\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.open) this.closeTooltip();\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n // En el editor, el autor edita el CONTENIDO del tooltip: abrirlo de entrada\n // (si no, se edita a ciegas). No emite shown (isPreview no trackea igual).\n if (context.isPreview) openNow();\n }\n\n /** Cambiar de ancla/posición/trigger requiere re-montar y re-cablear. */\n protected override liveKeyOf(step: GuideStep): string {\n const selector = step.selector ?? '';\n const position = readInlinePosition(step.style);\n const trigger = step.style?.badgeTrigger === 'click' ? 'click' : 'hover';\n return `${selector}|${position}|${trigger}`;\n }\n\n protected override onLiveUpdate(step: GuideStep): void {\n // Re-pintar el badge (kind/color/size) y reposicionar si está abierto.\n if (this.badgeBtn) {\n const doc = this.badgeBtn.ownerDocument;\n const next = buildBadgeElement(readBadgeConfig(step), doc);\n // Conservar listeners del botón: solo se actualiza el interior + clases.\n this.badgeBtn.className = next.className;\n this.badgeBtn.setAttribute('style', next.getAttribute('style') ?? '');\n this.badgeBtn.replaceChildren(...Array.from(next.childNodes));\n }\n const rawSide = step.style?.tooltipPlacement;\n this.side = rawSide === 'bottom' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'top';\n if (this.open && this.badgeBtn) this.position(this.badgeBtn);\n }\n\n override destroy(): void {\n this.cancelClose();\n this.stopFloat?.();\n this.stopFloat = null;\n this.tooltip = null;\n this.arrowEl = null;\n this.badgeBtn = null;\n this.open = false;\n super.destroy();\n }\n\n private openTooltip(badge: HTMLElement): void {\n if (!this.tooltip) return;\n this.tooltip.style.display = 'block';\n this.open = true;\n void this.position(badge);\n const reposition = (): void => {\n void this.position(badge);\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.stopFloat = () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }\n\n private closeTooltip(): void {\n this.cancelClose();\n if (!this.tooltip || !this.open) return;\n this.tooltip.style.display = 'none';\n this.open = false;\n this.stopFloat?.();\n this.stopFloat = null;\n }\n\n private cancelClose(): void {\n if (this.closeTimer !== null) {\n window.clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private async position(badge: HTMLElement): Promise<void> {\n const tooltip = this.tooltip;\n const arrowEl = this.arrowEl;\n if (!tooltip || !arrowEl) return;\n const { x, y, placement, middlewareData } = await computePosition(badge, tooltip, {\n strategy: 'fixed',\n placement: this.side,\n middleware: [offset(8), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n positionArrow(arrowEl, placement, middlewareData.arrow);\n }\n}\n\n/** Lee y normaliza `style.badge` (defaults seguros). */\nfunction readBadgeConfig(step: GuideStep): BadgeConfig {\n const raw = step.style?.badge;\n if (!raw || typeof raw !== 'object') return { kind: 'icon' };\n const b = raw as Record<string, unknown>;\n const kind =\n b.kind === 'dot' ||\n b.kind === 'pill' ||\n b.kind === 'text' ||\n b.kind === 'image' ||\n b.kind === 'icon'\n ? b.kind\n : 'icon';\n return {\n kind,\n icon: typeof b.icon === 'string' ? b.icon : null,\n text: typeof b.text === 'string' ? b.text : null,\n imageUrl: typeof b.imageUrl === 'string' ? b.imageUrl : null,\n color: typeof b.color === 'string' && COLOR_RE.test(b.color.trim()) ? b.color.trim() : null,\n size: typeof b.size === 'number' && Number.isFinite(b.size) ? b.size : null,\n };\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Construye el elemento visual del badge. `<button>` por accesibilidad\n * (focus/teclado). Texto por `textContent`; imagen por `isSafeUrl`.\n */\nfunction buildBadgeElement(config: BadgeConfig, doc: Document): HTMLButtonElement {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = `veo-badge veo-badge--${config.kind}`;\n btn.setAttribute('aria-label', 'Más información');\n const size = clamp(config.size ?? 18, 8, 48);\n\n switch (config.kind) {\n case 'dot':\n btn.style.width = `${size}px`;\n btn.style.height = `${size}px`;\n if (config.color) btn.style.background = config.color;\n break;\n case 'pill': {\n btn.textContent = config.text?.slice(0, 24) || 'Nuevo';\n btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 24)}px`;\n if (config.color) btn.style.background = config.color;\n break;\n }\n case 'text': {\n // Texto plano, sin cápsula: hereda el color de acento (o el custom).\n btn.textContent = config.text?.slice(0, 32) || 'Nuevo';\n btn.style.fontSize = `${clamp(Math.round(size * 0.7), 9, 28)}px`;\n if (config.color) btn.style.color = config.color;\n break;\n }\n case 'image': {\n if (config.imageUrl && isSafeUrl(config.imageUrl)) {\n const img = doc.createElement('img');\n img.src = config.imageUrl;\n img.alt = '';\n img.style.width = `${size}px`;\n img.style.height = `${size}px`;\n btn.appendChild(img);\n } else {\n // Sin imagen válida degrada a icono para que el badge no sea invisible.\n btn.className = 'veo-badge veo-badge--icon';\n btn.textContent = '?';\n btn.style.width = `${size}px`;\n btn.style.height = `${size}px`;\n btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 32)}px`;\n }\n break;\n }\n default: {\n // icon: carácter/emoji dentro de un circulito.\n btn.textContent = (config.icon || 'ℹ️').slice(0, 4);\n btn.style.width = `${size}px`;\n btn.style.height = `${size}px`;\n btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 32)}px`;\n if (config.color) btn.style.color = config.color;\n break;\n }\n }\n return btn;\n}\n","import { buildContentNodes, createCloseButton } from './block-builder';\nimport type { GuideStep, WalkthroughCallbacks } from './types';\n\n/**\n * Construye el subtree DOM de un step de walkthrough con navegación\n * (counter, dots, contenido, botones atrás/siguiente/finalizar/omitir).\n *\n * Aplica las mismas reglas de seguridad que `buildStepContent`:\n * - `textContent` para todo string del backend (cero `innerHTML`).\n * - `imageUrl` validada con `isSafeUrl`.\n *\n * El botón primario cambia su label según el step:\n * - último step → \"Finalizar\" → llama `onComplete`\n * - otro → `step.ctaText` o \"Siguiente\" → llama `onNext`\n *\n * El botón \"Atrás\" solo se pinta a partir del segundo step. El botón\n * \"Omitir\" siempre se pinta — el usuario debe poder salir en cualquier\n * momento.\n */\nexport function buildWalkthroughStepContent(\n step: GuideStep,\n stepIndex: number,\n totalSteps: number,\n doc: Document,\n callbacks: WalkthroughCallbacks,\n): HTMLElement {\n const container = doc.createElement('div');\n container.className = 'veo-guide-content';\n\n const counter = doc.createElement('div');\n counter.className = 'veo-walkthrough-counter';\n counter.textContent = `Paso ${stepIndex + 1} de ${totalSteps}`;\n container.appendChild(counter);\n\n const progress = doc.createElement('div');\n progress.className = 'veo-walkthrough-progress';\n for (let i = 0; i < totalSteps; i++) {\n const dot = doc.createElement('span');\n dot.className = 'veo-walkthrough-progress-dot';\n if (i < stepIndex) dot.classList.add('completed');\n if (i === stepIndex) dot.classList.add('active');\n progress.appendChild(dot);\n }\n container.appendChild(progress);\n\n // Contenido del paso: respeta blocks[] (imágenes, rich text, full-bleed) o\n // cae a los escalares. Los bloques `button` se omiten — la navegación\n // (atrás/siguiente/omitir) es del chrome del tour, abajo.\n for (const node of buildContentNodes(step, doc)) {\n container.appendChild(node);\n }\n\n const actions = doc.createElement('div');\n actions.className = 'veo-walkthrough-actions';\n\n const skipBtn = doc.createElement('button');\n skipBtn.type = 'button';\n skipBtn.className = 'veo-walkthrough-skip';\n skipBtn.textContent = 'Omitir';\n skipBtn.addEventListener('click', () => callbacks.onSkip());\n actions.appendChild(skipBtn);\n\n const rightGroup = doc.createElement('div');\n rightGroup.className = 'veo-walkthrough-actions-right';\n\n if (stepIndex > 0) {\n const backBtn = doc.createElement('button');\n backBtn.type = 'button';\n backBtn.className = 'veo-walkthrough-btn-secondary';\n backBtn.textContent = 'Atrás';\n backBtn.addEventListener('click', () => callbacks.onBack());\n rightGroup.appendChild(backBtn);\n }\n\n const isLastStep = stepIndex === totalSteps - 1;\n const primaryBtn = doc.createElement('button');\n primaryBtn.type = 'button';\n primaryBtn.className = 'veo-guide-cta';\n const defaultLabel = isLastStep ? 'Finalizar' : 'Siguiente';\n primaryBtn.textContent =\n typeof step.ctaText === 'string' && step.ctaText ? step.ctaText : defaultLabel;\n primaryBtn.addEventListener('click', () => {\n if (isLastStep) callbacks.onComplete();\n else callbacks.onNext();\n });\n rightGroup.appendChild(primaryBtn);\n\n actions.appendChild(rightGroup);\n container.appendChild(actions);\n\n // \"✕\" universal (esquina superior derecha): salir en cualquier momento.\n // Mismo efecto que \"Omitir\" → reporta `dismissed`.\n container.appendChild(createCloseButton(doc, () => callbacks.onSkip()));\n\n return container;\n}\n","import { buildStepContent } from '../block-builder';\nimport { insertHost, keepHostAttached } from '../inline-host';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía tipo `banner`. Dos modos:\n *\n * - **Pantalla completa** (default): barra fija arriba o abajo del viewport.\n * La posición se lee de `step.style.position` (`top` | `bottom`).\n * - **Embebido en un contenedor** (`step.selector` presente): el banner se\n * inserta DENTRO del contenedor elegido (prepend con `top`, append con\n * `bottom`) y empuja su contenido — como los \"element banners\" de Pendo.\n * Reusa el watchdog inline (`keepHostAttached`) porque los frameworks del\n * host borran nodos ajenos al re-renderizar.\n *\n * No tiene backdrop ni atrapa el foco. Con `context.nav` (paso de un\n * walkthrough heterogéneo) muestra botones de navegación y delega\n * tracking/avance al controller — solo en modo pantalla completa.\n */\nexport class BannerRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const idx = context.nav?.stepIndex ?? 0;\n const step = context.guide.guideSteps[idx];\n if (!step) return;\n\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n // Con selector el banner se EMBEBE en ese contenedor — también en pasos de\n // secuencia (el chrome de navegación viaja adentro). En un paso-tooltip el\n // selector es el ancla; en un paso-banner es el contenedor: no colisionan\n // porque cada paso tiene UNA presentación.\n const selector = step.selector?.trim() || null;\n\n let anchor: Element | null = null;\n if (selector) {\n anchor = await waitForElement(selector);\n if (!anchor) return; // contenedor ausente → no pintar (como tooltip/inline)\n }\n\n const { host, root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const banner = ownerDocument.createElement('div');\n banner.className = bannerClassOf(position, Boolean(anchor));\n\n const dismiss = (\n action: 'dismissed' | 'cta_clicked',\n ctaUrl?: string,\n meta?: GuideInteractionMetadata,\n ) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = context.nav\n ? buildWalkthroughStepContent(\n step,\n context.nav.stepIndex,\n context.nav.totalSteps,\n ownerDocument,\n context.nav.callbacks,\n )\n : buildStepContent(step, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n banner.appendChild(content);\n root.appendChild(banner);\n\n if (selector && anchor) {\n host.style.display = 'block';\n const insertAt = position === 'top' ? 'prepend' : 'append';\n insertHost(anchor, host, insertAt);\n this.registerCleanup(keepHostAttached(host, selector, insertAt));\n }\n\n if (!context.nav) {\n this.liveContainer = banner;\n this.liveContent = content;\n this.liveBuild = (s) =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n this.liveKey = this.liveKeyOf(step);\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n }\n\n /** Cambiar de contenedor o de top/bottom embebido requiere re-insertar → remontar. */\n protected override liveKeyOf(step: GuideStep): string {\n const selector = step.selector?.trim() ?? '';\n if (!selector) return '';\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n return `${selector}|${position}`;\n }\n\n protected override onLiveUpdate(step: GuideStep): void {\n // La posición del banner de pantalla completa (top/bottom) es solo una\n // clase del wrapper — se actualiza en vivo. (El embebido remonta vía liveKey.)\n if (this.liveContainer) {\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n const embedded = Boolean(step.selector?.trim());\n this.liveContainer.className = bannerClassOf(position, embedded);\n }\n }\n}\n\nfunction bannerClassOf(position: 'top' | 'bottom', embedded: boolean): string {\n return embedded ? 'veo-banner veo-banner-embedded' : `veo-banner veo-banner-${position}`;\n}\n","import { uuidv7 } from '../../../utils/uuid';\nimport { isSafeUrl } from '../block-builder';\nimport type { GuideRenderContext, GuideStep } from '../types';\n\ninterface VeoBridgeMessage {\n __veo?: unknown;\n type?: unknown;\n url?: unknown;\n name?: unknown;\n props?: unknown;\n height?: unknown;\n close?: unknown;\n}\n\n/**\n * Monta el `<iframe sandbox>` con el HTML/CSS/JS del cliente (origen `null`,\n * sin acceso al host) y cablea el puente postMessage (`dismiss`/`cta`/`track`/\n * `navigate`/`resize`) validando `source` + token. Compartido por las guías\n * `custom` (flotante/anclada) e `inline-custom` (embebida en el flujo).\n *\n * El caller crea el wrapper y posiciona/inserta el iframe; aquí sólo va la\n * lógica del documento + el bridge. Devuelve el iframe y un cleanup.\n */\nexport function mountCustomFrame(\n doc: Document,\n step: GuideStep,\n context: GuideRenderContext,\n opts: { width: string; fixedHeight?: number | string | null },\n): { iframe: HTMLIFrameElement; cleanup: () => void } {\n const iframe = doc.createElement('iframe');\n iframe.className = 'veo-custom-frame';\n // allow-scripts SIN allow-same-origin → origen null, sin acceso al host.\n iframe.setAttribute('sandbox', 'allow-scripts');\n iframe.setAttribute('title', context.guide.guideName || 'OnUser');\n iframe.style.width = opts.width;\n\n const hasFixedHeight = opts.fixedHeight !== undefined && opts.fixedHeight !== null;\n if (hasFixedHeight) iframe.style.height = toCssSize(opts.fixedHeight as number | string);\n\n const token = uuidv7();\n // fix: las apps modernas usan design tokens/Tailwind. Reenviamos las custom\n // properties del host (`:root`) al iframe para que el CSS del cliente pueda\n // usar `var(--su-token)`; y opcionalmente inyectamos Tailwind (Play CDN) si el\n // autor lo pidió en `style.tailwind` (sujeto al CSP de la app — ver más abajo).\n const wantsTailwind = (step.style as Record<string, unknown> | undefined)?.tailwind === true;\n iframe.srcdoc = buildSrcdoc(step.html ?? '', step.css ?? '', step.js ?? '', token, {\n hostCss: collectHostStyles(),\n htmlAttrs: hostHtmlAttrs(),\n tailwind: wantsTailwind,\n });\n\n const close = (): void => context.onClose();\n\n const onMessage = (event: MessageEvent): void => {\n if (event.source !== iframe.contentWindow) return;\n const data = event.data as VeoBridgeMessage | null;\n if (!data || typeof data !== 'object' || data.__veo !== token) return;\n\n switch (data.type) {\n case 'dismiss':\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'dismissed',\n });\n close();\n break;\n case 'cta':\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'cta_clicked',\n });\n if (typeof data.url === 'string' && isSafeUrl(data.url)) {\n window.open(data.url, '_blank', 'noopener,noreferrer');\n }\n if (data.close !== false) close();\n break;\n case 'navigate':\n if (typeof data.url === 'string' && isSafeUrl(data.url)) {\n window.location.assign(data.url);\n }\n break;\n case 'track':\n if (typeof data.name === 'string' && context.onTrack) {\n context.onTrack(data.name, isRecord(data.props) ? data.props : undefined);\n }\n break;\n case 'resize':\n if (!hasFixedHeight && typeof data.height === 'number' && data.height > 0) {\n iframe.style.height = `${Math.ceil(data.height)}px`;\n }\n break;\n }\n };\n window.addEventListener('message', onMessage);\n\n return { iframe, cleanup: () => window.removeEventListener('message', onMessage) };\n}\n\nexport function toCssSize(value: number | string): string {\n return typeof value === 'number' ? `${value}px` : value;\n}\n\n/** Tope del CSS del host que inyectamos (evita un srcdoc gigante). */\nconst MAX_HOST_CSS = 800 * 1024;\n\n/**\n * Recolecta TODO el CSS legible del host (stylesheets + `<style>`) para\n * inyectarlo en el iframe de una guía custom. Así un HTML copiado desde la app\n * se ve IDÉNTICO: toma las utilidades de Tailwind COMPILADAS por la app (con su\n * config real — colores/radios custom como `text-brand`, `rounded-control`…) Y\n * las clases CSS propias (no-Tailwind), además de las variables de `:root`.\n *\n * Las hojas cross-origin (CDN de fuentes, etc.) lanzan `SecurityError` al leer\n * sus reglas y se saltan — no podemos copiarlas. Acotado a ~800KB.\n */\nfunction collectHostStyles(): string {\n if (typeof document === 'undefined') return '';\n let out = '';\n try {\n for (const sheet of Array.from(document.styleSheets)) {\n let rules: CSSRuleList | null = null;\n try {\n rules = sheet.cssRules;\n } catch {\n continue; // hoja de otro origen: no legible\n }\n if (!rules) continue;\n for (const rule of Array.from(rules)) {\n out += `${rule.cssText}\\n`;\n if (out.length > MAX_HOST_CSS) return out;\n }\n }\n } catch {\n return out;\n }\n return out;\n}\n\n/**\n * Copia atributos \"de tema\" del `<html>` del host al iframe: `class` (estrategia\n * de dark-mode por clase de Tailwind, p. ej. `dark`), `style` (variables CSS\n * seteadas inline en `:root`) y `data-theme`/`data-mode`. Sin esto, una guía\n * copiada de una app oscura renderizaría en claro (los tokens cambian según el\n * tema). Se sanitiza (sin `\"`/`<`/`>`) porque va dentro de la etiqueta `<html>`.\n */\nfunction hostHtmlAttrs(): string {\n if (typeof document === 'undefined') return '';\n try {\n const el = document.documentElement;\n const attrs: string[] = [];\n for (const name of ['class', 'style', 'data-theme', 'data-mode', 'data-color-mode']) {\n const v = el.getAttribute(name);\n if (v && v.length <= 1000 && !/[\"<>]/.test(v)) attrs.push(`${name}=\"${v}\"`);\n }\n return attrs.join(' ');\n } catch {\n return '';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Arma el documento del iframe. El JS del cliente puede llamar a `window.veo`\n * (bridge inyectado). `</script>`/`</style>` dentro del código se neutralizan\n * para que no corten sus bloques.\n *\n * `opts.hostCss` = CSS compilado del host (utilidades Tailwind reales + clases\n * propias + `:root`), para que el HTML copiado de la app se vea idéntico.\n * `opts.tailwind` inyecta ADEMÁS el Play CDN de Tailwind (para utilidades que la\n * app no usa y por ende no están en su CSS compilado) — sujeto al CSP de la app.\n */\nfunction buildSrcdoc(\n html: string,\n css: string,\n js: string,\n token: string,\n opts: { hostCss: string; htmlAttrs: string; tailwind: boolean },\n): string {\n const bridge =\n `(function(){var T=${JSON.stringify(token)};` +\n `function P(m){m.__veo=T;parent.postMessage(m,'*');}` +\n `window.veo={` +\n `dismiss:function(){P({type:'dismiss'});},` +\n `cta:function(u){P({type:'cta',url:u});},` +\n `track:function(n,p){P({type:'track',name:n,props:p||{}});},` +\n `navigate:function(u){P({type:'navigate',url:u});}};` +\n // Los <a href> dentro del iframe sandbox navegarían el iframe (la cajita),\n // no la app del host. Interceptamos el click y reenviamos la navegación al\n // host: links normales → navigate (misma pestaña); target=_blank → nueva\n // pestaña. Así los links de una guía custom \"simplemente funcionan\".\n `document.addEventListener('click',function(e){` +\n `var a=e.target&&e.target.closest?e.target.closest('a[href]'):null;` +\n `if(!a)return;` +\n `var h=a.getAttribute('href');` +\n `if(!h||h.charAt(0)==='#'||/^(javascript|mailto|tel):/i.test(h))return;` +\n `e.preventDefault();` +\n `if(a.target==='_blank'){P({type:'cta',url:a.href,close:false});}` +\n `else{P({type:'navigate',url:h});}` +\n `},true);` +\n // Medimos el alto del CONTENEDOR del contenido (`#__veo_root`), no el del\n // documento: el CSS de la app puede poner `body{min-height:100vh}` y estirar\n // el <html> a toda la pantalla (caja negra). El contenedor mide solo el\n // contenido real, así el iframe embebido se ajusta a lo que el autor definió.\n `function H(){var r=document.getElementById('__veo_root');` +\n `var h=r?r.getBoundingClientRect().height:document.documentElement.scrollHeight;` +\n `P({type:'resize',height:Math.ceil(h)});}` +\n `window.addEventListener('load',H);` +\n `try{if(typeof ResizeObserver!=='undefined'){var _r=document.getElementById('__veo_root');` +\n `new ResizeObserver(H).observe(_r||document.documentElement);}}catch(e){}` +\n `})();`;\n\n // CSS del host (todas las hojas de la app) para que el HTML se vea idéntico.\n const hostStyle = opts.hostCss ? `<style>${escapeClosing(opts.hostCss, 'style')}</style>` : '';\n // Tailwind Play CDN (opt-in). El src remoto depende del CSP de la app.\n const tailwind = opts.tailwind ? '<script src=\"https://cdn.tailwindcss.com\"></script>' : '';\n\n return (\n // Orden: base → CSS del host (utilidades+clases propias+:root) → reset\n // flotante (fondo transparente, sin márgenes) → Tailwind → CSS del autor (gana).\n `<!DOCTYPE html><html ${opts.htmlAttrs}><head><meta charset=\"utf-8\">` +\n '<style>html,body{margin:0;padding:0;}body{font-family:system-ui,-apple-system,sans-serif;}</style>' +\n hostStyle +\n // Reset flotante: el CSS de la app trae reglas de PÁGINA (body{min-height:100vh},\n // html{height:100%}, fondo del layout…) que en un iframe embebido lo estirarían a\n // toda la pantalla (caja negra) en vez de ajustarse al contenido. Neutralizamos\n // tamaño/fondo/overflow (mantenemos color y fuente heredados de la app).\n // `color-scheme:normal` es CLAVE para la transparencia: si el CSS de la app\n // declara `:root{color-scheme:dark}` y no coincide con el del elemento iframe\n // del host (normal), el navegador pinta el canvas OPACO (negro) en vez de\n // transparente — igualamos ambos lados para conservar el fondo transparente.\n '<style>html,body{margin:0!important;padding:0!important;background:transparent!important;' +\n 'height:auto!important;min-height:0!important;max-height:none!important;' +\n 'width:auto!important;min-width:0!important;overflow:visible!important;' +\n 'color-scheme:normal!important;}</style>' +\n tailwind +\n // Inline en <body>: gana incluso sobre reglas `!important` de la app (p. ej.\n // `.dark body{background:#000!important}`) porque el estilo inline tiene la\n // mayor especificidad dentro de la capa important-author.\n `<style>${escapeClosing(css, 'style')}</style></head>` +\n '<body style=\"margin:0!important;background:transparent!important;min-height:0!important;height:auto!important;\">' +\n // Contenedor del contenido: el iframe se dimensiona por SU alto (no el del\n // documento), así el layout de página de la app no lo estira.\n `<div id=\"__veo_root\">${html}</div>` +\n `<script>${bridge}</script>` +\n (js ? `<script>${escapeClosing(js, 'script')}</script>` : '') +\n '</body></html>'\n );\n}\n\nfunction escapeClosing(code: string, tag: 'script' | 'style'): string {\n const rx = tag === 'script' ? /<\\/script/gi : /<\\/style/gi;\n return code.replace(rx, `<\\\\/${tag}`);\n}\n","import { mountCustomFrame } from './renderers/custom-frame';\nimport type { GuideRenderContext, GuideStep, StepBlock } from './types';\n\n/**\n * Ejecutor de un bloque `code`.\n *\n * ⚠️ **Excepción sancionada #3 a la regla no-eval/no-innerHTML del SDK**\n * (ver CLAUDE.md regla 8). El bloque `code` es un escape hatch DELIBERADO tipo\n * Google Tag Manager: corre código del autor con acceso a la página host. El\n * usuario lo aprobó explícitamente asumiendo el riesgo (es SU app).\n *\n * Dos modos:\n * - `sandboxed: true` → iframe aislado (origen null, sin acceso al host). Es\n * el comportamiento viejo de las guías `custom`; reusa `custom-frame.ts`.\n * - `sandboxed: false` (default) → inyecta CSS/JS/HTML en la PÁGINA HOST: el\n * JS corre con acceso total al DOM real (puede tocar cualquier elemento de\n * la web, no solo la guía). Los `<script>` del HTML se re-crean para que\n * ejecuten. Todo lo inyectado se limpia al desmontar el paso.\n */\nexport interface MountedCode {\n /** Nodo visible a insertar en la card (o `null` en modo host sin HTML). */\n node: HTMLElement | null;\n cleanup: () => void;\n}\n\nexport function mountCodeBlock(\n block: StepBlock,\n doc: Document,\n context: GuideRenderContext,\n): MountedCode {\n if (block.sandboxed) {\n const step = { html: block.html ?? '', css: block.css, js: block.js } as GuideStep;\n const { iframe, cleanup } = mountCustomFrame(doc, step, context, { width: '100%' });\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-code-sandbox';\n wrapper.appendChild(iframe);\n return { node: wrapper, cleanup };\n }\n\n // ── Modo host: acceso total al DOM real ──\n // Se ejecuta SIEMPRE en la página real, SIN iframe — en runtime, en el link de\n // preview y también en el editor. Es un pedido explícito del usuario: quiere\n // ver el código correr de verdad al previsualizar. (Al re-renderizar la preview\n // el cleanup remueve la inyección previa, así no se acumula.)\n const hostDoc = doc; // el ownerDocument del shadow root ES el documento host\n const injected: ChildNode[] = [];\n\n if (typeof block.css === 'string' && block.css.trim()) {\n const style = hostDoc.createElement('style');\n style.textContent = block.css;\n hostDoc.head.appendChild(style);\n injected.push(style);\n }\n\n let node: HTMLElement | null = null;\n if (typeof block.html === 'string' && block.html.trim()) {\n node = doc.createElement('div');\n node.className = 'veo-code-html';\n // EXCEPCIÓN #3: innerHTML sobre un nodo del shadow (no ejecuta scripts por sí\n // solo). Los `<script>` se re-crean abajo para que corran en el host.\n node.innerHTML = block.html;\n for (const old of Array.from(node.querySelectorAll('script'))) {\n injected.push(runScript(old, hostDoc));\n old.remove();\n }\n }\n\n if (typeof block.js === 'string' && block.js.trim()) {\n const s = hostDoc.createElement('script');\n s.textContent = block.js;\n hostDoc.body.appendChild(s);\n injected.push(s);\n }\n\n return {\n node,\n cleanup: () => {\n for (const n of injected) n.parentNode?.removeChild(n);\n },\n };\n}\n\n/** Re-crea un `<script>` (inerte al venir de innerHTML) para que EJECUTE en el host. */\nfunction runScript(old: HTMLScriptElement, hostDoc: Document): HTMLScriptElement {\n const s = hostDoc.createElement('script');\n for (const attr of Array.from(old.attributes)) s.setAttribute(attr.name, attr.value);\n if (!old.src) s.textContent = old.textContent;\n hostDoc.body.appendChild(s);\n return s;\n}\n","import { createCloseButton } from './block-builder';\nimport type { FormField, GuideRenderContext } from './types';\n\n/**\n * Construcción COMPARTIDA del contenido de una guía `form` (overlay) e\n * `inline-form` (embebida): título/texto, campos, validación de requeridos,\n * envío vía `context.onFormSubmit`, estado \"¡Gracias!\" y cierre diferido.\n * El caller pone el chrome (modal-card u tarjeta inline) y pasa la `card`\n * donde se reemplaza el contenido por el agradecimiento.\n *\n * Mismas reglas de seguridad que block-builder: cero `innerHTML`, todo texto\n * por `textContent`.\n */\nexport function mountFormContent(\n card: HTMLElement,\n context: GuideRenderContext,\n doc: Document,\n): void {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n const fields = step.fields ?? [];\n\n const dismiss = (): void => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'dismissed' });\n context.onClose();\n };\n\n const content = doc.createElement('div');\n content.className = 'veo-guide-content';\n\n if (step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n content.appendChild(heading);\n }\n if (step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n content.appendChild(paragraph);\n }\n\n const readers: Array<{ field: FormField; read: () => unknown }> = [];\n const form = doc.createElement('form');\n form.className = 'veo-form';\n form.noValidate = true;\n for (const field of fields) {\n const { wrapper, read } = buildField(field, doc);\n readers.push({ field, read });\n form.appendChild(wrapper);\n }\n\n const error = doc.createElement('p');\n error.className = 'veo-form-error';\n error.style.display = 'none';\n form.appendChild(error);\n\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n const submit = doc.createElement('button');\n submit.type = 'submit';\n submit.className = 'veo-guide-cta';\n submit.textContent = step.ctaText || 'Enviar';\n actions.appendChild(submit);\n form.appendChild(actions);\n\n form.addEventListener('submit', (e) => {\n e.preventDefault();\n error.style.display = 'none';\n\n const answers: Record<string, unknown> = {};\n for (const { field, read } of readers) {\n const value = read();\n const empty = value === undefined || value === null || value === '';\n if (empty) {\n if (field.required) {\n error.textContent = `Completa \"${field.label}\"`;\n error.style.display = 'block';\n return;\n }\n continue;\n }\n answers[field.key] = value;\n }\n if (Object.keys(answers).length === 0) {\n error.textContent = 'Responde al menos un campo';\n error.style.display = 'block';\n return;\n }\n\n submit.disabled = true;\n const submitFn = context.onFormSubmit ?? (() => Promise.resolve(true));\n void submitFn(answers).then((ok) => {\n if (!ok) {\n submit.disabled = false;\n error.textContent = 'No se pudo enviar. Prueba de nuevo.';\n error.style.display = 'block';\n return;\n }\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'completed' });\n const note = context.isPreview\n ? (context.previewNote ?? 'Vista previa: la respuesta NO se guardó.')\n : null;\n showThanks(card, doc, note);\n window.setTimeout(() => context.onClose(), note ? 2200 : 1400);\n });\n });\n\n content.appendChild(form);\n content.appendChild(createCloseButton(doc, dismiss));\n\n card.appendChild(content);\n}\n\n/** Reemplaza el contenido de la tarjeta por un \"¡Gracias!\" breve. */\nfunction showThanks(card: HTMLElement, doc: Document, note: string | null): void {\n while (card.firstChild) card.removeChild(card.firstChild);\n const thanks = doc.createElement('div');\n thanks.className = 'veo-form-thanks';\n thanks.textContent = '✓ ¡Gracias por tu respuesta!';\n card.appendChild(thanks);\n if (note) {\n const noteEl = doc.createElement('p');\n noteEl.className = 'veo-form-preview-note';\n noteEl.textContent = note;\n card.appendChild(noteEl);\n }\n}\n\n/** Construye el DOM de un campo y devuelve su lector de valor. */\nexport function buildField(\n field: FormField,\n doc: Document,\n): { wrapper: HTMLElement; read: () => unknown } {\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-form-field';\n\n const label = doc.createElement('label');\n label.className = 'veo-form-label';\n label.textContent = field.required ? `${field.label} *` : field.label;\n wrapper.appendChild(label);\n\n switch (field.type) {\n case 'textarea': {\n const input = doc.createElement('textarea');\n input.className = 'veo-form-input';\n input.rows = 3;\n if (field.placeholder) input.placeholder = field.placeholder;\n wrapper.appendChild(input);\n return { wrapper, read: () => input.value.trim() };\n }\n case 'number': {\n const input = doc.createElement('input');\n input.type = 'number';\n input.className = 'veo-form-input';\n if (field.placeholder) input.placeholder = field.placeholder;\n wrapper.appendChild(input);\n return {\n wrapper,\n read: () => (input.value.trim() === '' ? undefined : Number(input.value)),\n };\n }\n case 'select': {\n const select = doc.createElement('select');\n select.className = 'veo-form-input';\n const blank = doc.createElement('option');\n blank.value = '';\n blank.textContent = field.placeholder || 'Elige una opción…';\n select.appendChild(blank);\n for (const opt of field.options ?? []) {\n const option = doc.createElement('option');\n option.value = opt;\n option.textContent = opt;\n select.appendChild(option);\n }\n wrapper.appendChild(select);\n return { wrapper, read: () => select.value || undefined };\n }\n case 'radio': {\n const group = doc.createElement('div');\n group.className = 'veo-form-options';\n const name = `veo-${field.key}`;\n const inputs: HTMLInputElement[] = [];\n for (const opt of field.options ?? []) {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const radio = doc.createElement('input');\n radio.type = 'radio';\n radio.name = name;\n radio.value = opt;\n inputs.push(radio);\n const text = doc.createElement('span');\n text.textContent = opt;\n optionLabel.appendChild(radio);\n optionLabel.appendChild(text);\n group.appendChild(optionLabel);\n }\n wrapper.appendChild(group);\n return { wrapper, read: () => inputs.find((i) => i.checked)?.value };\n }\n case 'multiselect': {\n // Grupo de checkboxes: la respuesta es un ARRAY con las opciones marcadas.\n const group = doc.createElement('div');\n group.className = 'veo-form-options';\n const inputs: HTMLInputElement[] = [];\n for (const opt of field.options ?? []) {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const checkbox = doc.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.value = opt;\n inputs.push(checkbox);\n const text = doc.createElement('span');\n text.textContent = opt;\n optionLabel.appendChild(checkbox);\n optionLabel.appendChild(text);\n group.appendChild(optionLabel);\n }\n wrapper.appendChild(group);\n return {\n wrapper,\n read: () => {\n const values = inputs.filter((i) => i.checked).map((i) => i.value);\n return values.length > 0 ? values : undefined;\n },\n };\n }\n case 'checkbox': {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const checkbox = doc.createElement('input');\n checkbox.type = 'checkbox';\n const text = doc.createElement('span');\n text.textContent = field.placeholder || 'Sí';\n optionLabel.appendChild(checkbox);\n optionLabel.appendChild(text);\n wrapper.appendChild(optionLabel);\n // Checkbox siempre responde true/false (no “vacío”): required pide marcarlo.\n return { wrapper, read: () => (checkbox.checked ? true : field.required ? '' : false) };\n }\n case 'yesno': {\n // Radio Sí/No: dos opciones visibles, pero la respuesta es BOOLEANA\n // (true/false) — el widget \"amigable\" para props de tipo sí/no.\n const group = doc.createElement('div');\n group.className = 'veo-form-options';\n const name = `veo-${field.key}`;\n const [yesLabel, noLabel] =\n field.options?.length === 2 ? (field.options as [string, string]) : ['Sí', 'No'];\n const inputs: Array<{ input: HTMLInputElement; value: boolean }> = [];\n for (const { label: optText, value } of [\n { label: yesLabel, value: true },\n { label: noLabel, value: false },\n ]) {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const radio = doc.createElement('input');\n radio.type = 'radio';\n radio.name = name;\n inputs.push({ input: radio, value });\n const text = doc.createElement('span');\n text.textContent = optText;\n optionLabel.appendChild(radio);\n optionLabel.appendChild(text);\n group.appendChild(optionLabel);\n }\n wrapper.appendChild(group);\n return { wrapper, read: () => inputs.find((i) => i.input.checked)?.value };\n }\n case 'nps':\n return buildScale(wrapper, doc, 0, 10, 'veo-nps-btn');\n case 'rating':\n return buildScale(wrapper, doc, 1, 5, 'veo-rating-btn', '★');\n default: {\n const input = doc.createElement('input');\n input.type = 'text';\n input.className = 'veo-form-input';\n if (field.placeholder) input.placeholder = field.placeholder;\n wrapper.appendChild(input);\n return { wrapper, read: () => input.value.trim() };\n }\n }\n}\n\n/** Fila de botones numerados (NPS 0-10) o de estrellas (rating 1-5). */\nfunction buildScale(\n wrapper: HTMLElement,\n doc: Document,\n min: number,\n max: number,\n btnClass: string,\n symbol?: string,\n): { wrapper: HTMLElement; read: () => unknown } {\n const row = doc.createElement('div');\n row.className = 'veo-form-scale';\n let selected: number | undefined;\n const buttons: HTMLButtonElement[] = [];\n for (let n = min; n <= max; n++) {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = btnClass;\n btn.textContent = symbol ?? String(n);\n btn.setAttribute('aria-label', String(n));\n btn.addEventListener('click', () => {\n selected = n;\n buttons.forEach((b, i) => {\n // Rating pinta acumulado (★★★☆☆); NPS solo el elegido.\n const active = symbol ? i + min <= n : i + min === n;\n b.classList.toggle('veo-scale-active', active);\n });\n });\n buttons.push(btn);\n row.appendChild(btn);\n }\n wrapper.appendChild(row);\n return { wrapper, read: () => selected };\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { applyBlockStyle, buildContentBlock, createCloseButton, isSafeUrl } from '../block-builder';\nimport { mountCodeBlock } from '../code-block';\nimport { buildField } from '../form-content';\nimport { insertHost, keepHostAttached } from '../inline-host';\nimport type {\n CompositeStep,\n FormField,\n GuideRenderContext,\n InlinePosition,\n StepBlock,\n StepPosition,\n} from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/** Lector de un campo de formulario (para los botones submit-forms). */\ninterface FormReader {\n field: FormField;\n read: () => unknown;\n}\n\n/** align de un botón → justify-content de su fila de acciones. */\nconst ROW_ALIGN: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\n/**\n * Renderer UNIFICADO del modelo `composite`. Renderiza UN paso componiendo\n * presentación (floating/inline) × posición (9 esquinas / centro /\n * relative-to-element) + diseño + bloques. Reemplaza los 10 renderers por-tipo.\n *\n * El SDK normaliza toda guía a `composite` (`normalizeGuide`) antes de llegar\n * acá, así que este renderer no conoce los tipos viejos.\n *\n * Multi-paso: si `context.nav` está, los botones next/prev/dismiss delegan en\n * las callbacks de navegación (el controller orquesta el avance, igual que en\n * los walkthroughs heterogéneos).\n */\nexport class CompositeRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const idx = context.nav?.stepIndex ?? 0;\n const step = context.guide.guideSteps[idx] as unknown as CompositeStep | undefined;\n if (!step) return;\n\n // Ancla (relative-to-element o inline) — sin ella no pintamos.\n const anchorSelector =\n step.position === 'relative-to-element' || step.presentation === 'inline'\n ? step.anchorSelector?.trim() || undefined\n : undefined;\n let anchor: Element | null = null;\n if (anchorSelector) {\n anchor = await waitForElement(anchorSelector);\n if (!anchor) return;\n }\n\n const { host, root } = this.createHost();\n const doc = root.ownerDocument ?? document;\n const design = (step.design ?? {}) as Record<string, unknown>;\n\n // Z-index del host (contenedor de la guía) desde el diseño.\n if (typeof design.zIndex === 'number') host.style.zIndex = String(design.zIndex);\n\n // ── Card + diseño ──\n const card = doc.createElement('div');\n card.className = 'veo-card';\n applyCompositeDesign(card, design);\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', meta?: StepBlock): void => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action,\n ...(meta?.id ? { metadata: { buttonId: meta.id } } : {}),\n });\n };\n\n // ── Contenido: recorre los bloques EN ORDEN (title/text/image/code/form\n // intercalados con filas de botones). Los form-blocks registran readers que\n // los botones submit-forms recogen. ──\n const readers: FormReader[] = [];\n this.buildContent(card, step.blocks ?? [], doc, context, idx, readers);\n // ✕ de cierre (a menos que el diseño lo desactive), con color configurable.\n if (design.closeButton !== false) {\n const closeBtn = createCloseButton(doc, () => {\n dismiss('dismissed');\n this.closeOrSkip(context);\n });\n const closeColor = typeof design.closeColor === 'string' ? design.closeColor : null;\n const hoverColor = typeof design.closeHoverColor === 'string' ? design.closeHoverColor : null;\n if (closeColor) closeBtn.style.color = closeColor;\n // Posición del ✕: por defecto arriba-derecha, DENTRO de la tarjeta (el CSS\n // base lo deja a -6px, medio afuera y clavado en esa esquina). El usuario\n // lo puede mover a cualquiera de las 4 esquinas.\n const closePos =\n typeof design.closePosition === 'string' ? design.closePosition : 'top-right';\n applyClosePosition(closeBtn, closePos);\n // Reserva espacio para que el ✕ no se monte sobre el texto de esa esquina\n // (p.ej. arriba-izquierda tapaba el título).\n reserveCloseSpace(card, closePos);\n // El hover del ✕ no se puede con inline CSS (:hover) → listeners que\n // intercambian el color (base ↔ hover).\n if (hoverColor) {\n closeBtn.addEventListener('mouseenter', () => {\n closeBtn.style.color = hoverColor;\n });\n closeBtn.addEventListener('mouseleave', () => {\n closeBtn.style.color = closeColor ?? '';\n });\n }\n card.appendChild(closeBtn);\n }\n\n // ── Posicionamiento ──\n if (step.presentation === 'inline' && anchor) {\n host.style.display = 'block';\n const pos = inlinePosOf(step.inlinePosition);\n root.appendChild(card);\n insertHost(anchor, host, pos);\n this.registerCleanup(keepHostAttached(host, anchorSelector as string, pos));\n } else if (step.position === 'relative-to-element' && anchor) {\n // Backdrop opcional para el anclado (spotlight): oscurece la página y,\n // con targetAbove, eleva el elemento objetivo por encima del oscurecido.\n if (design.backdrop === true) {\n const bg = doc.createElement('div');\n bg.className = 'veo-composite-overlay veo-composite-overlay--dim';\n if (typeof design.backdropColor === 'string') bg.style.background = design.backdropColor;\n const bz = typeof design.backdropZIndex === 'number' ? design.backdropZIndex : 200000;\n bg.style.zIndex = String(bz);\n root.appendChild(bg);\n if (design.targetAbove === true) this.registerCleanup(liftTarget(anchor, bz + 1));\n }\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-composite-anchored';\n // Flecha (caret) que apunta al ancla, salvo que el diseño la desactive.\n const caretEl = design.caret === false ? null : makeCaret(doc, design);\n if (caretEl) wrapper.appendChild(caretEl);\n wrapper.appendChild(card);\n root.appendChild(wrapper);\n this.registerCleanup(await anchorPosition(anchor, wrapper, caretEl));\n } else {\n // Flotante en el viewport (centro o esquina). El fondo oscuro (backdrop)\n // se aplica según el toggle del usuario, INDEPENDIENTE de la posición:\n // una guía en una esquina también puede comportarse como modal (fondo\n // oscuro + click-fuera cierra). Antes solo se pintaba en 'center', así que\n // al mover la guía fuera del centro se perdía el backdrop.\n const overlay = doc.createElement('div');\n overlay.className = 'veo-composite-overlay';\n if (design.backdrop !== false) {\n overlay.classList.add('veo-composite-overlay--dim');\n if (typeof design.backdropColor === 'string') {\n overlay.style.background = design.backdropColor;\n }\n if (typeof design.backdropZIndex === 'number') {\n overlay.style.zIndex = String(design.backdropZIndex);\n }\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) {\n dismiss('dismissed');\n this.closeOrSkip(context);\n }\n });\n }\n applyViewportPosition(card, step.position, design);\n overlay.appendChild(card);\n root.appendChild(overlay);\n }\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: 'shown' });\n }\n\n /** Recorre los bloques en orden y los pinta en la card. */\n private buildContent(\n card: HTMLElement,\n blocks: StepBlock[],\n doc: Document,\n context: GuideRenderContext,\n idx: number,\n readers: FormReader[],\n ): void {\n const emit = (block: StepBlock): void => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action: 'cta_clicked',\n ...(block.id ? { metadata: { buttonId: block.id } } : {}),\n });\n };\n let i = 0;\n while (i < blocks.length) {\n const b = blocks[i];\n if (!b) {\n i++;\n continue;\n }\n if (b.type === 'button') {\n const row = doc.createElement('div');\n row.className = 'veo-guide-actions';\n // La alineación de un botón mueve la FILA (justify-content), no el botón\n // dentro. La toma del PRIMER botón del grupo.\n let rowAlign: string | undefined;\n while (i < blocks.length && blocks[i]?.type === 'button') {\n const bb = blocks[i] as StepBlock;\n if (!rowAlign) {\n const a = (bb.style as Record<string, unknown> | null | undefined)?.align;\n if (a === 'left' || a === 'center' || a === 'right') rowAlign = a;\n }\n row.appendChild(this.buildButton(bb, doc, context, idx, readers, emit));\n i++;\n }\n if (rowAlign) row.style.justifyContent = ROW_ALIGN[rowAlign] ?? 'flex-end';\n card.appendChild(row);\n continue;\n }\n if (b.type === 'code') {\n const { node, cleanup } = mountCodeBlock(b, doc, context);\n if (node) card.appendChild(node);\n this.registerCleanup(cleanup);\n i++;\n continue;\n }\n if (b.type === 'form') {\n const form = doc.createElement('div');\n form.className = 'veo-form';\n for (const field of b.fields ?? []) {\n const { wrapper, read } = buildField(field, doc);\n readers.push({ field, read });\n form.appendChild(wrapper);\n }\n card.appendChild(form);\n i++;\n continue;\n }\n const node = buildContentBlock(b, doc);\n if (node) card.appendChild(node);\n i++;\n }\n }\n\n /** Botón con enrutado de acción (navegación / cierre / url / guía / envío de forms). */\n private buildButton(\n block: StepBlock,\n doc: Document,\n context: GuideRenderContext,\n idx: number,\n readers: FormReader[],\n emit: (block: StepBlock) => void,\n ): HTMLButtonElement {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = 'veo-guide-cta';\n btn.textContent = block.text?.trim() || 'OK';\n // Estilos por-bloque del botón (color/fondo/borde/tamaño/tipografía/…).\n applyBlockStyle(btn, block.style, 'button');\n const nav = context.nav?.callbacks;\n btn.addEventListener('click', () => {\n switch (block.action) {\n case 'next':\n emit(block);\n if (nav) nav.onNext();\n else context.onClose();\n break;\n case 'prev':\n emit(block);\n nav?.onBack();\n break;\n case 'url':\n emit(block);\n if (typeof block.url === 'string' && isSafeUrl(block.url)) {\n window.open(block.url, '_blank', 'noopener,noreferrer');\n }\n break;\n case 'guide':\n emit(block);\n if (block.targetGuideId) context.onOpenGuide?.(block.targetGuideId);\n this.closeOrSkip(context);\n break;\n case 'submit-forms':\n case 'submit-forms-advance':\n case 'submit-forms-goto':\n this.submitForms(readers, context, idx, btn, () => {\n emit(block);\n if (block.action === 'submit-forms' || !nav) {\n context.onClose();\n } else if (\n block.action === 'submit-forms-goto' &&\n typeof block.targetStep === 'number' &&\n nav.onGoto\n ) {\n nav.onGoto(block.targetStep);\n } else {\n nav.onNext();\n }\n });\n break;\n default:\n emit(block);\n this.closeOrSkip(context);\n }\n });\n return btn;\n }\n\n /** Recoge respuestas de todos los form-blocks del paso, valida y envía. */\n private submitForms(\n readers: FormReader[],\n context: GuideRenderContext,\n idx: number,\n btn: HTMLButtonElement,\n onDone: () => void,\n ): void {\n const answers: Record<string, unknown> = {};\n for (const { field, read } of readers) {\n const value = read();\n const empty = value === undefined || value === null || value === '';\n if (empty) {\n if (field.required) {\n btn.textContent = `Completa \"${field.label}\"`;\n return;\n }\n continue;\n }\n answers[field.key] = value;\n }\n if (readers.length > 0 && Object.keys(answers).length === 0) return;\n btn.disabled = true;\n const submitFn = context.onFormSubmit ?? (() => Promise.resolve(true));\n void submitFn(answers).then((ok) => {\n btn.disabled = false;\n if (!ok) return;\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action: 'completed',\n });\n onDone();\n });\n }\n\n private closeOrSkip(context: GuideRenderContext): void {\n if (context.nav?.callbacks) context.nav.callbacks.onSkip();\n else context.onClose();\n }\n}\n\nfunction inlinePosOf(p: InlinePosition | null | undefined): InlinePosition {\n return p === 'before' || p === 'prepend' || p === 'append' ? p : 'after';\n}\n\n/** Fija la card en una esquina/centro del viewport. `hAlign` fuerza izq/der. */\nfunction applyViewportPosition(\n card: HTMLElement,\n position: StepPosition,\n design: Record<string, unknown>,\n): void {\n const s = card.style;\n s.position = 'fixed';\n const M = '16px';\n const hAlign = design.hAlign === 'left' ? 'left' : design.hAlign === 'right' ? 'right' : null;\n const v = position.includes('top') ? 'top' : position.includes('bottom') ? 'bottom' : 'middle';\n // hAlign (Alineación > Horizontal) gana sobre el eje horizontal de la posición.\n const h =\n hAlign ??\n (position.includes('left') ? 'left' : position.includes('right') ? 'right' : 'middle');\n\n if (v === 'top') s.top = M;\n else if (v === 'bottom') s.bottom = M;\n else s.top = '50%';\n\n if (h === 'left') s.left = M;\n else if (h === 'right') s.right = M;\n else s.left = '50%';\n\n // Transform para centrar el/los ejes que quedaron en 50%.\n const tx = h === 'middle' ? '-50%' : '0';\n const ty = v === 'middle' ? '-50%' : '0';\n s.transform = tx === '0' && ty === '0' ? '' : `translate(${tx}, ${ty})`;\n}\n\n/** Caret (flecha) que apunta al ancla, con el fondo/borde de la card. */\n/** Espacio del ✕ respecto a la esquina elegida (dentro de la tarjeta). */\nconst CLOSE_INSET = '10px';\n\n/**\n * Ubica el ✕ de cierre en una de las 4 esquinas, DENTRO de la tarjeta. Limpia\n * los `top/right` negativos del CSS base (que lo dejaban medio afuera).\n */\nfunction applyClosePosition(btn: HTMLElement, position: string): void {\n const s = btn.style;\n s.top = 'auto';\n s.right = 'auto';\n s.bottom = 'auto';\n s.left = 'auto';\n const vertical = position.includes('bottom') ? 'bottom' : 'top';\n const horizontal = position.includes('left') ? 'left' : 'right';\n s.setProperty(vertical, CLOSE_INSET);\n s.setProperty(horizontal, CLOSE_INSET);\n}\n\n/** Padding reservado para el ✕ en el bloque de su esquina (≈ inset + ancho). */\nconst CLOSE_RESERVE = '34px';\n\n/**\n * Evita que el ✕ tape el contenido de su esquina: agrega padding en el bloque\n * adyacente (el primero si el ✕ va arriba, el último si va abajo) del lado\n * horizontal donde queda el ✕.\n */\nfunction reserveCloseSpace(card: HTMLElement, position: string): void {\n const blocks = Array.from(card.children).filter(\n (c): c is HTMLElement => c instanceof HTMLElement && !c.classList.contains('veo-guide-close'),\n );\n if (blocks.length === 0) return;\n const target = position.includes('bottom') ? blocks[blocks.length - 1] : blocks[0];\n if (!target) return;\n target.style[position.includes('left') ? 'paddingLeft' : 'paddingRight'] = CLOSE_RESERVE;\n}\n\nfunction makeCaret(doc: Document, design: Record<string, unknown>): HTMLElement {\n const caret = doc.createElement('div');\n caret.className = 'veo-composite-caret';\n const w = typeof design.caretWidth === 'number' ? design.caretWidth : 12;\n const h = typeof design.caretHeight === 'number' ? design.caretHeight : 12;\n const s = caret.style;\n s.position = 'absolute';\n s.width = `${w}px`;\n s.height = `${h}px`;\n s.transform = 'rotate(45deg)';\n s.background = typeof design.background === 'string' ? design.background : '#ffffff';\n if (typeof design.borderWidth === 'number' && design.borderWidth > 0) {\n const bc = typeof design.borderColor === 'string' ? design.borderColor : '#bbbbbb';\n s.border = `${design.borderWidth}px solid ${bc}`;\n }\n return caret;\n}\n\n/**\n * Eleva el elemento objetivo por encima del backdrop (targetAbove): lo resalta\n * dejándolo visible/clickeable sobre el oscurecido. Devuelve un restore.\n */\nfunction liftTarget(anchor: Element, zIndex: number): () => void {\n const el = anchor as HTMLElement;\n const prevPosition = el.style.position;\n const prevZ = el.style.zIndex;\n if (getComputedStyle(el).position === 'static') el.style.position = 'relative';\n el.style.zIndex = String(zIndex);\n return () => {\n el.style.position = prevPosition;\n el.style.zIndex = prevZ;\n };\n}\n\n/** Ancla la card a un elemento con Floating UI + reposiciona en scroll/resize. */\nasync function anchorPosition(\n anchor: Element,\n wrapper: HTMLElement,\n caret: HTMLElement | null,\n): Promise<() => void> {\n const update = async (): Promise<void> => {\n const { x, y, placement, middlewareData } = await computePosition(anchor, wrapper, {\n placement: 'bottom',\n strategy: 'fixed',\n middleware: [\n offset(caret ? 10 : 8),\n flip(),\n shift({ padding: 8 }),\n ...(caret ? [arrow({ element: caret })] : []),\n ],\n });\n wrapper.style.left = `${x}px`;\n wrapper.style.top = `${y}px`;\n if (caret) positionArrow(caret, placement, middlewareData.arrow);\n };\n await update();\n const reposition = (): void => void update();\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n}\n\n/** Aplica el objeto `design` (font/border/bg/padding/margin) como estilos inline. */\nfunction applyCompositeDesign(card: HTMLElement, design: Record<string, unknown>): void {\n const s = card.style;\n const px = (v: unknown): string | null =>\n typeof v === 'number' && Number.isFinite(v) ? `${v}px` : null;\n const strv = (v: unknown): string | null => (typeof v === 'string' && v ? v : null);\n\n if (strv(design.background)) s.background = design.background as string;\n // `color` (panel de estilos nuevo) con fallback `textColor` (guías viejas).\n const textColor = strv(design.color) ?? strv(design.textColor);\n if (textColor) s.color = textColor;\n if (px(design.fontSize)) s.fontSize = px(design.fontSize) as string;\n if (strv(design.fontWeight)) s.fontWeight = design.fontWeight as string;\n if (strv(design.fontFamily) && design.fontFamily !== 'inherit') {\n s.fontFamily = design.fontFamily as string;\n }\n if (strv(design.textTransform) && design.textTransform !== 'none') {\n s.textTransform = design.textTransform as string;\n }\n if (typeof design.letterSpacing === 'number') s.letterSpacing = `${design.letterSpacing}px`;\n if (strv(design.align)) s.textAlign = design.align as string;\n if (typeof design.lineHeight === 'number') s.lineHeight = `${design.lineHeight}%`;\n if (px(design.radius)) s.borderRadius = px(design.radius) as string;\n const bw = px(design.borderWidth);\n if (bw) s.border = `${bw} solid ${strv(design.borderColor) ?? '#e5e5e5'}`;\n // Sombra (X Y Blur Spread Color).\n if (strv(design.shadowColor) || typeof design.shadowBlur === 'number') {\n const n = (k: string) => (typeof design[k] === 'number' ? (design[k] as number) : 0);\n s.boxShadow = `${n('shadowX')}px ${n('shadowY')}px ${n('shadowBlur')}px ${n('shadowSpread')}px ${strv(design.shadowColor) ?? 'rgba(0,0,0,0.2)'}`;\n }\n // Dimensiones: ancho completo / fijo / fluido.\n if (design.fullWidth === true) {\n s.width = '100%';\n } else if (design.widthType === 'fluid') {\n s.width = 'auto';\n if (px(design.width)) s.maxWidth = px(design.width) as string;\n } else if (px(design.width)) {\n s.width = px(design.width) as string;\n }\n for (const side of ['Top', 'Right', 'Bottom', 'Left'] as const) {\n const p = px(design[`padding${side}`]);\n if (p) s.setProperty(`padding-${side.toLowerCase()}`, p);\n const m = px(design[`margin${side}`]);\n if (m) s.setProperty(`margin-${side.toLowerCase()}`, m);\n }\n}\n","import { computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport type { CustomPlacement, GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { mountCustomFrame, toCssSize } from './custom-frame';\n\nconst DEFAULT_PLACEMENT: CustomPlacement = { mode: 'floating', position: 'bottom-right' };\nconst DEFAULT_OFFSET = 16;\nconst DEFAULT_WIDTH = 360;\n\n/**\n * Renderiza una guía `custom` montando el HTML/CSS/JS del cliente en un\n * **iframe sandbox** (ver `custom-frame.ts`). Ubicación: `floating`\n * (esquina/centro del viewport) o `anchored` (Floating UI contra un selector\n * del host). La variante embebida en el flujo es `inline-custom`.\n */\nexport class CustomRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || typeof step.html !== 'string' || step.html.length === 0) return;\n\n const placement: CustomPlacement = step.placement ?? DEFAULT_PLACEMENT;\n\n let anchor: Element | null = null;\n if (placement.mode === 'anchored') {\n const selector =\n placement.selector ?? step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n anchor = await waitForElement(selector);\n if (!anchor) return; // sin ancla no mostramos (guía fantasma = peor UX)\n }\n\n const { root } = this.createHost();\n const doc = root.ownerDocument ?? document;\n\n const wrapper = doc.createElement('div');\n wrapper.className =\n placement.mode === 'anchored' ? 'veo-custom-anchored' : 'veo-custom-floating';\n\n const { iframe, cleanup } = mountCustomFrame(doc, step, context, {\n width: toCssSize(placement.width ?? DEFAULT_WIDTH),\n fixedHeight: placement.height ?? null,\n });\n this.registerCleanup(cleanup);\n\n wrapper.appendChild(iframe);\n // Sin ✕ del host: las guías custom controlan su propio cierre desde su HTML\n // (`window.veo.dismiss()`). Un botón inyectado no encaja con su diseño.\n root.appendChild(wrapper);\n\n if (placement.mode === 'floating') {\n applyFloatingPosition(wrapper, placement);\n } else if (anchor) {\n this.registerCleanup(await this.setupAnchoredPosition(anchor, wrapper, placement));\n }\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n\n private async setupAnchoredPosition(\n anchor: Element,\n wrapper: HTMLElement,\n placement: CustomPlacement,\n ): Promise<() => void> {\n const side = placement.side ?? 'bottom';\n const update = async (): Promise<void> => {\n const { x, y } = await computePosition(anchor, wrapper, {\n placement: side,\n strategy: 'fixed',\n middleware: [offset(placement.offsetY ?? 8), flip(), shift({ padding: 8 })],\n });\n wrapper.style.left = `${x}px`;\n wrapper.style.top = `${y}px`;\n };\n await update();\n\n const reposition = (): void => {\n void update();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }\n}\n\n/** Fija el wrapper en una esquina/centro del viewport según `position`. */\nfunction applyFloatingPosition(wrapper: HTMLElement, placement: CustomPlacement): void {\n const position = placement.position ?? 'bottom-right';\n const ox = `${placement.offsetX ?? DEFAULT_OFFSET}px`;\n const oy = `${placement.offsetY ?? DEFAULT_OFFSET}px`;\n const s = wrapper.style;\n\n if (position === 'center') {\n s.top = '50%';\n s.left = '50%';\n s.transform = 'translate(-50%, -50%)';\n return;\n }\n\n const [vertical, horizontal] = position.split('-');\n if (vertical === 'top') s.top = oy;\n else s.bottom = oy;\n\n if (horizontal === 'left') {\n s.left = ox;\n } else if (horizontal === 'right') {\n s.right = ox;\n } else {\n s.left = '50%';\n s.transform = 'translateX(-50%)';\n }\n}\n","import { mountFormContent } from '../form-content';\nimport type { GuideRenderContext } from '../types';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `form` (encuesta/NPS estilo Pendo): backdrop + tarjeta\n * centrada (mismo chrome que el modal) con los campos de `step.fields`.\n * Al enviar, las respuestas viajan vía `context.onFormSubmit` y el backend\n * las mergea como PROPIEDADES (`user_traits`) del usuario que respondió.\n *\n * El contenido (campos/envío/gracias) es compartido con `inline-form`\n * (ver `form-content.ts`); aquí solo va el chrome flotante.\n */\nexport class FormRenderer extends BaseRenderer {\n render(context: GuideRenderContext): void {\n const step = context.guide.guideSteps[0];\n if (!step || (step.fields ?? []).length === 0) return;\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const doc = root.ownerDocument ?? document;\n\n const overlay = doc.createElement('div');\n overlay.className = 'veo-modal-overlay';\n const card = doc.createElement('div');\n card.className = 'veo-modal-card';\n\n mountFormContent(card, context, doc);\n overlay.appendChild(card);\n root.appendChild(overlay);\n\n const dismiss = (): void => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'dismissed' });\n context.onClose();\n };\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) dismiss();\n });\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') dismiss();\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { mountCustomFrame } from './custom-frame';\n\n/**\n * Guía `inline-custom`: HTML/CSS/JS del cliente (iframe sandbox, ver\n * `custom-frame.ts`) EMBEBIDO en el flujo del DOM, junto a un elemento ancla\n * (`step.selector` + `step.style.inlinePosition`). Como el inline estándar pero\n * con código propio en vez de bloques.\n */\nexport class InlineCustomRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || typeof step.html !== 'string' || step.html.length === 0) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n host.style.display = 'block';\n const position = readInlinePosition(step.style);\n insertHost(anchor, host, position);\n // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n this.registerCleanup(keepHostAttached(host, selector, position));\n const doc = root.ownerDocument ?? document;\n\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-custom-inline';\n\n const { iframe, cleanup } = mountCustomFrame(doc, step, context, { width: '100%' });\n this.registerCleanup(cleanup);\n\n wrapper.appendChild(iframe);\n // Sin ✕ del host: las guías inline-custom cierran desde su propio HTML.\n root.appendChild(wrapper);\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import { mountFormContent } from '../form-content';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `inline-form`: el MISMO formulario que `form` (campos →\n * props del usuario) pero EMBEBIDO en el flujo del DOM junto a un elemento\n * ancla, como `inline`. `step.selector` = ancla; `step.style.inlinePosition`\n * = dónde insertarse. El contenido compartido vive en `form-content.ts`.\n */\nexport class InlineFormRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || (step.fields ?? []).length === 0) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n // createHost adjuntó el host a <body>; lo movemos al flujo del DOM, junto\n // al ancla. `display:block` vence el `:host{all:initial}` (que sería inline).\n host.style.display = 'block';\n const position = readInlinePosition(step.style);\n insertHost(anchor, host, position);\n // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n this.registerCleanup(keepHostAttached(host, selector, position));\n\n this.applyDesign(step.style);\n const doc = root.ownerDocument ?? document;\n\n const card = doc.createElement('div');\n card.className = 'veo-inline';\n mountFormContent(card, context, doc);\n root.appendChild(card);\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import { buildStepContent } from '../block-builder';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `inline`: EMBEBIDA en el flujo del DOM, junto a un\n * elemento ancla (no flota como overlay). A diferencia de modal/banner/tooltip\n * (host fijo/absoluto sobre `body`), aquí el host se mueve al flujo del\n * documento — ocupa su propio espacio en el layout.\n *\n * `step.selector` = elemento ancla; `step.style.inlinePosition`\n * (`before`|`after`|`prepend`|`append`) = dónde insertarse. Single-step.\n */\nexport class InlineRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n // createHost adjuntó el host a <body>; lo movemos al flujo del DOM, junto\n // al ancla. `display:block` vence el `:host{all:initial}` (que sería inline).\n host.style.display = 'block';\n const position = readInlinePosition(step.style);\n insertHost(anchor, host, position);\n // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n this.registerCleanup(keepHostAttached(host, selector, position));\n\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const card = ownerDocument.createElement('div');\n card.className = 'veo-inline';\n\n const dismiss = (\n action: 'dismissed' | 'cta_clicked',\n ctaUrl?: string,\n meta?: GuideInteractionMetadata,\n ) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = buildStepContent(step, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n card.appendChild(content);\n root.appendChild(card);\n\n // Update in-place (preview): misma ancla/posición → solo cambia contenido.\n this.liveContainer = card;\n this.liveContent = content;\n this.liveKey = `${selector}|${position}`;\n this.liveBuild = (s) =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n\n protected override liveKeyOf(step: GuideStep): string {\n return `${step.selector ?? ''}|${readInlinePosition(step.style)}`;\n }\n}\n","import { buildStepContent } from '../block-builder';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\n/** `style.backdrop === false` = modal sin fondo oscuro (la app queda usable). */\nfunction overlayClassOf(step: GuideStep): string {\n return step.style?.backdrop === false\n ? 'veo-modal-overlay veo-modal-overlay--none'\n : 'veo-modal-overlay';\n}\n\n/**\n * Renderiza una guía de tipo `modal`: backdrop oscuro + tarjeta centrada.\n * Cierra al clickear el backdrop o presionar Escape.\n *\n * Con `style.backdrop === false` no hay fondo: el overlay es transparente y\n * deja pasar el mouse (solo la tarjeta es interactiva) — la modal se comporta\n * como una tarjeta flotante posicionable (posX/posY/width/height).\n *\n * Single-step normal: consume `guideSteps[0]`. Si el contexto trae `nav`\n * (paso de un walkthrough heterogéneo modal→banner→tooltip), consume\n * `guideSteps[nav.stepIndex]`, muestra botones de navegación y delega\n * tracking/avance al controller (backdrop/Esc → `nav.callbacks.onSkip`).\n */\nexport class ModalRenderer extends BaseRenderer {\n private overlay: HTMLElement | null = null;\n\n render(context: GuideRenderContext): void {\n const idx = context.nav?.stepIndex ?? 0;\n const step = context.guide.guideSteps[idx];\n if (!step) return;\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const overlay = ownerDocument.createElement('div');\n overlay.className = overlayClassOf(step);\n this.overlay = overlay;\n\n const card = ownerDocument.createElement('div');\n card.className = 'veo-modal-card';\n\n const dismiss = (\n action: 'dismissed' | 'cta_clicked',\n ctaUrl?: string,\n meta?: GuideInteractionMetadata,\n ) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n // En modo navegación el cierre lo maneja el controller vía onSkip.\n const onBackdropOrEsc = (): void => {\n if (context.nav) context.nav.callbacks.onSkip();\n else dismiss('dismissed');\n };\n\n const content = context.nav\n ? buildWalkthroughStepContent(\n step,\n context.nav.stepIndex,\n context.nav.totalSteps,\n ownerDocument,\n context.nav.callbacks,\n )\n : buildStepContent(step, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n card.appendChild(content);\n overlay.appendChild(card);\n root.appendChild(overlay);\n\n // Update in-place (preview del editor) — solo en modo single-step.\n if (!context.nav) {\n this.liveContainer = card;\n this.liveContent = content;\n this.liveBuild = (s) =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n }\n\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) onBackdropOrEsc();\n });\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onBackdropOrEsc();\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n // El `shown` de un walkthrough lo emite el controller (step 0) / step_advanced.\n if (!context.nav) {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n }\n\n protected override onLiveUpdate(step: GuideStep): void {\n // El toggle de backdrop desde el editor aplica en vivo, sin remontar.\n if (this.overlay) this.overlay.className = overlayClassOf(step);\n }\n\n override destroy(): void {\n this.overlay = null;\n super.destroy();\n }\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { buildStepContent } from '../block-builder';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/**\n * Renderiza una guía tipo `tooltip` anclada a un elemento del host.\n * Espera el ancla con MutationObserver (selector puede no existir aún\n * en SPAs), la posiciona con Floating UI y la re-posiciona en scroll\n * y resize.\n *\n * Si el ancla no aparece dentro del timeout, no muestra nada. Esto es\n * deliberado: las guías \"fantasma\" sin destino son peor UX que no\n * mostrar.\n */\nexport class TooltipRenderer extends BaseRenderer {\n /** Lado preferido (mutable: el update in-place puede cambiarlo). */\n private side: 'top' | 'bottom' | 'left' | 'right' = 'bottom';\n private reposition: (() => void) | null = null;\n\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n // Lado preferido del tooltip respecto al ancla (arriba/abajo/izq/der).\n // `flip()` igual lo reubica si no entra; default `bottom`.\n const rawSide = (step.style as Record<string, unknown> | null | undefined)?.tooltipPlacement;\n this.side = rawSide === 'top' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'bottom';\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-tooltip';\n\n const dismiss = (\n action: 'dismissed' | 'cta_clicked',\n ctaUrl?: string,\n meta?: GuideInteractionMetadata,\n ) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = buildStepContent(step, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n tooltip.appendChild(content);\n\n // Caret que apunta al elemento anclado (se reposiciona junto al tooltip).\n const arrowEl = ownerDocument.createElement('div');\n arrowEl.className = 'veo-tooltip-arrow';\n tooltip.appendChild(arrowEl);\n\n root.appendChild(tooltip);\n\n const updatePosition = async (): Promise<void> => {\n const { x, y, placement, middlewareData } = await computePosition(anchor, tooltip, {\n placement: this.side,\n middleware: [offset(10), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n positionArrow(arrowEl, placement, middlewareData.arrow);\n };\n\n await updatePosition();\n\n const reposition = (): void => {\n void updatePosition();\n };\n this.reposition = reposition;\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.registerCleanup(() => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n });\n\n // Update in-place (preview del editor): mismo ancla → solo cambia contenido.\n this.liveContainer = tooltip;\n this.liveContent = content;\n this.liveKey = selector;\n this.liveBuild = (s) =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'shown',\n });\n }\n\n protected override liveKeyOf(step: GuideStep): string {\n return step.selector ?? '';\n }\n\n protected override onLiveUpdate(step: GuideStep): void {\n const raw = (step.style as Record<string, unknown> | null | undefined)?.tooltipPlacement;\n this.side = raw === 'top' || raw === 'left' || raw === 'right' ? raw : 'bottom';\n this.reposition?.();\n }\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS } from '../constants';\nimport type { ResolvedGuide, WalkthroughCallbacks } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\nexport interface WalkthroughRenderContext {\n guide: ResolvedGuide;\n currentStepIndex: number;\n callbacks: WalkthroughCallbacks;\n}\n\n/**\n * Renderiza UN step de un walkthrough — variante de tooltip con\n * navegación. Se destruye y re-crea por step en lugar de actualizar el\n * DOM en sitio: como cada step puede anclarse a un selector distinto,\n * recomputar todo es más simple y barato que tracking diffs.\n *\n * `render` retorna `boolean` (a diferencia de los demás renderers) para\n * señalar al controller si el ancla apareció a tiempo. Si devuelve\n * `false`, el controller cancela el walkthrough limpiamente.\n */\nexport class WalkthroughRenderer extends BaseRenderer<WalkthroughRenderContext, boolean> {\n async render(context: WalkthroughRenderContext): Promise<boolean> {\n const step = context.guide.guideSteps[context.currentStepIndex];\n if (!step) return false;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return false;\n\n const anchor = await waitForElement(selector, WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS);\n if (!anchor) return false;\n\n const rawSide = (step.style as Record<string, unknown> | null | undefined)?.tooltipPlacement;\n const side: 'top' | 'bottom' | 'left' | 'right' =\n rawSide === 'top' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'bottom';\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-walkthrough';\n\n const content = buildWalkthroughStepContent(\n step,\n context.currentStepIndex,\n context.guide.guideSteps.length,\n ownerDocument,\n context.callbacks,\n );\n tooltip.appendChild(content);\n\n // Caret que apunta al elemento anclado (se reposiciona junto al tooltip).\n const arrowEl = ownerDocument.createElement('div');\n arrowEl.className = 'veo-walkthrough-arrow';\n tooltip.appendChild(arrowEl);\n\n root.appendChild(tooltip);\n\n const updatePosition = async (): Promise<void> => {\n const { x, y, placement, middlewareData } = await computePosition(anchor, tooltip, {\n placement: side,\n middleware: [offset(10), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n positionArrow(arrowEl, placement, middlewareData.arrow);\n };\n\n await updatePosition();\n\n const reposition = (): void => {\n void updatePosition();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.registerCleanup(() => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n });\n\n return true;\n }\n}\n","/**\n * Modo preview de guías. Pinta una guía con los MISMOS renderers que el\n * runtime real, pero SIN resolver, cache de frecuencia, estado de\n * walkthrough ni tracking de interacciones. Pensado para el builder\n * no-code del dashboard: ver cómo queda una guía antes de publicarla.\n *\n * No requiere un `VeoClient` ni apiKey — es una función pura sobre el DOM.\n * Solo puede haber UNA preview activa a la vez; abrir otra cierra la\n * anterior (igual que el dashboard al cambiar de guía o de step).\n *\n * Diferencias de comportamiento vs. runtime real (deliberadas):\n * - Las interacciones NO se reportan al backend.\n * - `displayFrequency`/`activationRules` (url/trigger/delay) se ignoran:\n * la preview siempre pinta de inmediato. Solo se respeta el `selector`\n * del step (o el `activationRules.selector` como fallback) para anclar\n * tooltips/walkthroughs.\n * - CTA con `ctaAction: 'url'` sigue abriendo la URL en una pestaña nueva\n * (igual que en producción) para poder probar el enlace.\n */\nimport { hasDocument } from '../../utils/safe-env';\nimport { BadgeRenderer } from './renderers/badge-renderer';\nimport { BannerRenderer } from './renderers/banner-renderer';\nimport { BaseRenderer } from './renderers/base-renderer';\nimport { CompositeRenderer } from './renderers/composite-renderer';\nimport { CustomRenderer } from './renderers/custom-renderer';\nimport { FormRenderer } from './renderers/form-renderer';\nimport { InlineCustomRenderer } from './renderers/inline-custom-renderer';\nimport { InlineFormRenderer } from './renderers/inline-form-renderer';\nimport { InlineRenderer } from './renderers/inline-renderer';\nimport { ModalRenderer } from './renderers/modal-renderer';\nimport { TooltipRenderer } from './renderers/tooltip-renderer';\nimport { WalkthroughRenderer } from './renderers/walkthrough-renderer';\nimport type {\n ActivationRules,\n GuideInteractionEvent,\n GuideStep,\n GuideType,\n ResolvedGuide,\n WalkthroughCallbacks,\n} from './types';\n\n/** Entrada mínima para previsualizar una guía. */\nexport interface PreviewGuideInput {\n guideType: GuideType;\n guideSteps: GuideStep[];\n /**\n * Opcional. Solo se usa `activationRules.selector` como fallback del\n * ancla para tooltip/walkthrough cuando el step no trae su propio\n * `selector`. El resto de reglas (url/trigger/delay) se ignoran.\n */\n activationRules?: Partial<ActivationRules>;\n /** Nombre mostrado (p.ej. en el `title` del iframe de guías `custom`). */\n guideName?: string;\n /**\n * Solo walkthrough: paso inicial a mostrar (default 0). Lo usa el editor del\n * dashboard para que la preview salte al paso que se está editando.\n */\n startStepIndex?: number;\n /**\n * Solo guías form: envío REAL de respuestas. Sin esto, el submit en preview\n * es un no-op (no escribe props). Lo usa el modo preview-por-link, que sí\n * guarda en el usuario que responde.\n */\n formSubmit?: (answers: Record<string, unknown>) => Promise<boolean>;\n /** Nota bajo el \"¡Gracias!\" cuando hay `formSubmit` propio. */\n formSubmitNote?: string;\n}\n\n/** Resultado del primer render de una preview. */\nexport interface PreviewResult {\n /**\n * `false` cuando la guía no pudo pintarse — típicamente un\n * tooltip/walkthrough cuyo `selector` no existe en la página de preview.\n */\n rendered: boolean;\n}\n\n/** Handle de una preview activa. */\nexport interface PreviewHandle {\n /** Cierra y limpia la preview. Idempotente. */\n close(): void;\n /** Resuelve cuando el primer render terminó. */\n ready: Promise<PreviewResult>;\n /**\n * Host de la guía activa (o `null` si no hay nada montado). Lo usa el modo\n * builder para adjuntar la manipulación directa (drag/resize) del editor.\n */\n host(): HTMLElement | null;\n}\n\nconst PREVIEW_GUIDE_ID = '__veo_preview__';\n\n/**\n * Orquesta una única preview activa. A diferencia del `GuidesController`,\n * no toca queue, cache ni estado persistido: instancia el renderer y lo\n * monta directo, y maneja localmente la navegación de walkthroughs.\n */\nclass GuidePreviewController {\n private singleStep: BaseRenderer | null = null;\n /** Renderer del paso de walkthrough activo (walkthrough tooltip o modal/banner). */\n private walkthrough: { destroy(): void } | null = null;\n private walkthroughGuide: ResolvedGuide | null = null;\n private walkthroughIndex = 0;\n /** Input de la preview ACTIVA (para formSubmit/nota de forms). */\n private input: PreviewGuideInput | null = null;\n\n preview(input: PreviewGuideInput): PreviewHandle {\n // Update IN-PLACE: si el tipo no cambió y el renderer activo puede\n // actualizar su contenido (mismo ancla), evitamos remontar — el preview\n // del editor deja de parpadear en cada tecla.\n const nextStep = input.guideSteps[0];\n if (\n this.singleStep &&\n this.input &&\n input.guideType === this.input.guideType &&\n input.guideType !== 'walkthrough' &&\n nextStep &&\n this.singleStep.updateStep(nextStep)\n ) {\n this.input = input;\n return {\n close: () => this.close(),\n ready: Promise.resolve({ rendered: true }),\n host: () => this.activeHost(),\n };\n }\n\n this.close(); // solo una preview a la vez\n this.input = input;\n\n const guide = normalize(input);\n const start = typeof input.startStepIndex === 'number' ? input.startStepIndex : 0;\n // Composite: la preview muestra el PASO ACTIVO (el que se edita) como paso\n // único; el CompositeRenderer lee guideSteps[0].\n if (guide.guideType === 'composite') {\n const s = Math.min(Math.max(0, start), guide.guideSteps.length - 1);\n const active = guide.guideSteps[s];\n if (active) guide.guideSteps = [active];\n const ready = this.renderSingleStep(guide);\n return { close: () => this.close(), ready, host: () => this.activeHost() };\n }\n const ready =\n guide.guideType === 'walkthrough'\n ? this.startWalkthrough(guide, start)\n : this.renderSingleStep(guide);\n\n return { close: () => this.close(), ready, host: () => this.activeHost() };\n }\n\n /** Host de la guía montada (single-step o paso de walkthrough activo). */\n activeHost(): HTMLElement | null {\n if (this.singleStep) return this.singleStep.hostElement();\n if (this.walkthrough instanceof BaseRenderer) {\n return this.walkthrough.hostElement();\n }\n return null;\n }\n\n close(): void {\n if (this.singleStep) {\n safeDestroy(this.singleStep);\n this.singleStep = null;\n }\n if (this.walkthrough) {\n safeDestroy(this.walkthrough);\n this.walkthrough = null;\n }\n this.walkthroughGuide = null;\n this.walkthroughIndex = 0;\n this.input = null;\n }\n\n private async renderSingleStep(guide: ResolvedGuide): Promise<PreviewResult> {\n const renderer = createSingleStepRenderer(guide.guideType);\n if (!renderer) return { rendered: false };\n this.singleStep = renderer;\n\n // Los renderers single-step solo emiten `shown` tras montar con éxito\n // (tooltip/custom esperan a su ancla). Lo usamos como señal de render.\n let shown = false;\n try {\n await renderer.render({\n guide,\n onInteraction: (event: GuideInteractionEvent) => {\n if (event.action === 'shown') shown = true;\n },\n onClose: () => this.close(),\n onTrack: () => {},\n // Encadenado en preview: no-op — el editor no puede montar otra guía\n // guardada; el click igual cierra la preview actual (vía onCtaClick).\n onOpenGuide: () => {},\n // Preview de forms: por defecto simula el envío SIN escribir props;\n // el caller puede pasar `formSubmit` real (link de preview).\n onFormSubmit: this.input?.formSubmit ?? (() => Promise.resolve(true)),\n isPreview: true,\n ...(this.input?.formSubmit && this.input.formSubmitNote !== undefined\n ? { previewNote: this.input.formSubmitNote }\n : {}),\n });\n } catch {\n this.close();\n return { rendered: false };\n }\n\n // El usuario pudo haber cerrado/reemplazado la preview mientras el render\n // esperaba el ancla (los renderers async como inline/inline-custom hacen\n // `await waitForElement` ANTES de insertar su host). En ese caso este\n // renderer quedó HUÉRFANO: su host ya entró al DOM pero `singleStep` apunta\n // a otro, así que el `close()` que lo reemplazó no lo borró. Lo destruimos\n // aquí para no apilar copias fantasma (causa de la guía duplicada).\n if (this.singleStep !== renderer) {\n safeDestroy(renderer);\n return { rendered: false };\n }\n\n return { rendered: shown };\n }\n\n private async startWalkthrough(guide: ResolvedGuide, startIndex = 0): Promise<PreviewResult> {\n if (guide.guideSteps.length === 0) return { rendered: false };\n this.walkthroughGuide = guide;\n const idx = Math.min(Math.max(0, Math.floor(startIndex)), guide.guideSteps.length - 1);\n this.walkthroughIndex = idx;\n const rendered = await this.renderWalkthroughStep(idx);\n return { rendered };\n }\n\n private async renderWalkthroughStep(index: number): Promise<boolean> {\n const guide = this.walkthroughGuide;\n if (!guide) return false;\n\n if (this.walkthrough) {\n safeDestroy(this.walkthrough);\n this.walkthrough = null;\n }\n\n const callbacks: WalkthroughCallbacks = {\n onNext: () => {\n const next = this.walkthroughIndex + 1;\n if (next >= guide.guideSteps.length) {\n this.close();\n return;\n }\n this.walkthroughIndex = next;\n void this.renderWalkthroughStep(next);\n },\n onBack: () => {\n const prev = this.walkthroughIndex - 1;\n if (prev < 0) return;\n this.walkthroughIndex = prev;\n void this.renderWalkthroughStep(prev);\n },\n onSkip: () => this.close(),\n onComplete: () => this.close(),\n };\n\n // Walkthrough heterogéneo: el paso puede pedir modal/banner (con navegación).\n const step = guide.guideSteps[index];\n const render = (step?.style as Record<string, unknown> | null | undefined)?.render;\n if (render === 'modal' || render === 'banner') {\n const renderer = render === 'modal' ? new ModalRenderer() : new BannerRenderer();\n try {\n renderer.render({\n guide,\n onInteraction: () => {},\n onClose: () => this.close(),\n nav: { stepIndex: index, totalSteps: guide.guideSteps.length, callbacks },\n });\n } catch {\n safeDestroy(renderer);\n return false;\n }\n if (this.walkthroughGuide !== guide) {\n safeDestroy(renderer);\n return false;\n }\n this.walkthrough = renderer;\n return true;\n }\n\n const renderer = new WalkthroughRenderer();\n let success = false;\n try {\n success = await renderer.render({ guide, currentStepIndex: index, callbacks });\n } catch {\n success = false;\n }\n\n // Misma carrera que en single-step: si otra preview reemplazó esta\n // mientras esperábamos, no adoptamos el renderer (sería huérfano).\n if (!success || this.walkthroughGuide !== guide) {\n safeDestroy(renderer);\n return false;\n }\n this.walkthrough = renderer;\n return true;\n }\n}\n\nlet activeController: GuidePreviewController | null = null;\n\n/**\n * Previsualiza una guía en la página actual usando los renderers reales\n * del SDK. Devuelve un handle con `close()` y una promesa `ready`.\n *\n * Pensado para el builder no-code: no necesita `init()` ni apiKey. Abrir\n * una nueva preview cierra automáticamente la anterior.\n *\n * @example\n * ```ts\n * import { previewGuide } from '@veo/sdk';\n *\n * const preview = previewGuide({\n * guideType: 'modal',\n * guideSteps: [{ title: 'Hola', content: 'Esto es una preview' }],\n * });\n * const { rendered } = await preview.ready;\n * // ...más tarde:\n * preview.close();\n * ```\n */\nexport function previewGuide(input: PreviewGuideInput): PreviewHandle {\n if (!hasDocument()) {\n return { close: () => {}, ready: Promise.resolve({ rendered: false }), host: () => null };\n }\n if (!activeController) activeController = new GuidePreviewController();\n return activeController.preview(input);\n}\n\n/** Cierra la preview activa, si la hay. Idempotente. */\nexport function closeGuidePreview(): void {\n activeController?.close();\n}\n\n/** Construye un `ResolvedGuide` sintético con defaults inocuos para preview. */\nfunction normalize(input: PreviewGuideInput): ResolvedGuide {\n const selector = input.activationRules?.selector;\n const activationRules: ActivationRules = {\n url: input.activationRules?.url ?? { type: 'prefix', pattern: '/' },\n trigger: 'immediate',\n ...(selector !== undefined ? { selector } : {}),\n };\n\n return {\n guideId: PREVIEW_GUIDE_ID,\n guideName: input.guideName ?? 'Preview',\n guideType: input.guideType,\n guideSteps: input.guideSteps,\n activationRules,\n displayFrequency: 'always',\n displayPriority: 0,\n };\n}\n\nfunction createSingleStepRenderer(type: GuideType): BaseRenderer | null {\n switch (type) {\n case 'modal':\n return new ModalRenderer();\n case 'banner':\n return new BannerRenderer();\n case 'tooltip':\n return new TooltipRenderer();\n case 'custom':\n return new CustomRenderer();\n case 'inline':\n return new InlineRenderer();\n case 'inline-custom':\n return new InlineCustomRenderer();\n case 'form':\n return new FormRenderer();\n case 'inline-form':\n return new InlineFormRenderer();\n case 'badge':\n return new BadgeRenderer();\n case 'composite':\n return new CompositeRenderer();\n case 'walkthrough':\n return null;\n default:\n return null;\n }\n}\n\nfunction safeDestroy(renderer: { destroy(): void }): void {\n try {\n renderer.destroy();\n } catch {\n // swallow — un cleanup roto no debe romper la preview.\n }\n}\n","/**\n * Drop-target de bloques sobre la preview (editor in-app).\n *\n * El autor arrastra un bloque de la paleta del panel (iframe del dashboard) y\n * lo suelta SOBRE la guía pintada en la app. El drag & drop HTML5 cruza\n * iframes de forma nativa, así que acá solo escuchamos `dragover`/`drop` en el\n * host de la guía, mostramos una línea de inserción entre bloques y avisamos\n * dónde cayó (el panel inserta el bloque en su estado y re-previsualiza).\n *\n * Contrato con el panel: el MIME `application/x-veo-block`. El `dragstart` de\n * la paleta lo setea con el tipo de bloque; durante `dragover` solo los TYPES\n * del dataTransfer son visibles (el valor recién se puede leer en el `drop`) —\n * alcanza para filtrar drags ajenos.\n *\n * La posición se expresa como `beforeIndex`: índice del bloque del paso ANTES\n * del cual insertar (`null` = al final). Los renderers estampan\n * `data-veo-idx` en cada elemento top-level con el índice ORIGINAL dentro de\n * `step.blocks[]` (una fila de botones agrupados lleva el del primero), así el\n * índice sobrevive a bloques filtrados u ocultos (p.ej. botones en pasos de\n * tour).\n */\n\nexport const VEO_BLOCK_MIME = 'application/x-veo-block';\n\n/** Dónde soltó el autor un bloque nuevo. */\nexport interface BlockDropPayload {\n stepIndex: number;\n /** Tipo de bloque arrastrado (title/text/button/image — lo valida el panel). */\n blockType: string;\n /** Índice del bloque ANTES del cual insertar; `null` = al final. */\n beforeIndex: number | null;\n}\n\nexport interface BlockDropTargetHandle {\n /**\n * Drag por POINTER (el camino principal): el panel manda las coordenadas del\n * puntero ya convertidas a la página de la app. Muestra/mueve la línea de\n * inserción; devuelve `true` si el punto está sobre la guía.\n */\n hoverAt(x: number, y: number): boolean;\n /**\n * Suelta en esas coordenadas: devuelve el punto de inserción, o `null` si el\n * puntero no estaba sobre la guía (el drop se descarta). Siempre borra la línea.\n */\n dropAt(x: number, y: number): { beforeIndex: number | null } | null;\n /** Cancela el hover (borra la línea sin soltar). */\n cancelHover(): void;\n detach(): void;\n}\n\ninterface AttachOptions {\n host: HTMLElement;\n stepIndex: number;\n onDrop: (payload: BlockDropPayload) => void;\n}\n\n/** Punto de inserción calculado bajo el cursor. */\ninterface DropSpot {\n beforeIndex: number | null;\n /** Coordenada Y (viewport) de la línea indicadora. */\n y: number;\n rect: DOMRect;\n}\n\n/**\n * Adjunta el drop-target al host de la guía en preview. Devuelve un handle\n * para desmontarlo (cambio de preview / cierre del editor).\n */\nexport function attachBlockDropTarget(options: AttachOptions): BlockDropTargetHandle {\n const { host, stepIndex, onDrop } = options;\n const doc = host.ownerDocument;\n let line: HTMLElement | null = null;\n let spot: DropSpot | null = null;\n\n const contentEl = (): HTMLElement | null =>\n host.shadowRoot?.querySelector<HTMLElement>('.veo-guide-content') ?? null;\n\n /** Hijos top-level que representan bloques (estampados por los renderers). */\n const blockChildren = (container: HTMLElement): HTMLElement[] =>\n Array.from(container.children).filter(\n (el): el is HTMLElement => el instanceof HTMLElement && el.dataset.veoIdx !== undefined,\n );\n\n const hideLine = (): void => {\n line?.remove();\n line = null;\n spot = null;\n };\n\n const showLine = (at: DropSpot): void => {\n if (!line) {\n line = doc.createElement('div');\n // Inline (no hay hoja de estilos del builder en el shadow de la guía).\n line.style.cssText =\n 'position:fixed;height:3px;border-radius:2px;background:#FF5B35;' +\n 'box-shadow:0 0 0 1px rgba(255,255,255,0.65);pointer-events:none;z-index:2147483647;';\n host.shadowRoot?.appendChild(line);\n }\n line.style.left = `${at.rect.left + 4}px`;\n line.style.width = `${Math.max(0, at.rect.width - 8)}px`;\n line.style.top = `${at.y - 1.5}px`;\n };\n\n const isBlockDrag = (event: DragEvent): boolean => {\n const types = event.dataTransfer?.types;\n return !!types && Array.from(types).includes(VEO_BLOCK_MIME);\n };\n\n /** Margen alrededor del contenido dentro del cual el drop sigue activo. */\n const NEAR_PX = 48;\n\n /** Boundary de inserción más cercano al cursor (por el eje Y). */\n const locate = (clientY: number): DropSpot | null => {\n const container = contentEl();\n if (!container) return null;\n const rect = container.getBoundingClientRect();\n const kids = blockChildren(container);\n let beforeIndex: number | null = null;\n let y = kids.length === 0 ? rect.top + rect.height / 2 : 0;\n for (const kid of kids) {\n const r = kid.getBoundingClientRect();\n if (clientY < r.top + r.height / 2) {\n const idx = Number(kid.dataset.veoIdx);\n beforeIndex = Number.isFinite(idx) ? idx : null;\n y = r.top;\n break;\n }\n y = r.bottom; // el cursor quedó debajo: candidato \"después del último\"\n }\n return { beforeIndex, y, rect };\n };\n\n /** ¿El punto está sobre (o cerca de) el contenido de la guía? */\n const overContent = (x: number, y: number, rect: DOMRect): boolean =>\n x >= rect.left - NEAR_PX &&\n x <= rect.right + NEAR_PX &&\n y >= rect.top - NEAR_PX &&\n y <= rect.bottom + NEAR_PX;\n\n const hoverAt = (x: number, y: number): boolean => {\n const at = locate(y);\n if (!at || !overContent(x, y, at.rect)) {\n hideLine();\n return false;\n }\n spot = at;\n showLine(at);\n return true;\n };\n\n const dropAt = (x: number, y: number): { beforeIndex: number | null } | null => {\n const at = locate(y);\n hideLine();\n if (!at || !overContent(x, y, at.rect)) return null;\n return { beforeIndex: at.beforeIndex };\n };\n\n const onDragOver = (event: DragEvent): void => {\n if (!isBlockDrag(event)) return;\n const at = locate(event.clientY);\n if (!at) return;\n event.preventDefault(); // habilita el drop\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n spot = at;\n showLine(at);\n };\n\n const onDropEvent = (event: DragEvent): void => {\n if (!isBlockDrag(event)) return;\n event.preventDefault();\n const blockType = event.dataTransfer?.getData(VEO_BLOCK_MIME) ?? '';\n const at = spot ?? locate(event.clientY);\n hideLine();\n if (!blockType || !at) return;\n onDrop({ stepIndex, blockType, beforeIndex: at.beforeIndex });\n };\n\n const onDragLeave = (event: DragEvent): void => {\n // Solo al salir del host de verdad (los cruces internos del shadow se\n // re-targetean al host y no llegan acá).\n const to = event.relatedTarget;\n if (to instanceof Node && (to === host || host.contains(to))) return;\n hideLine();\n };\n\n host.addEventListener('dragover', onDragOver);\n host.addEventListener('drop', onDropEvent);\n host.addEventListener('dragleave', onDragLeave);\n\n return {\n hoverAt,\n dropAt,\n cancelHover: hideLine,\n detach(): void {\n host.removeEventListener('dragover', onDragOver);\n host.removeEventListener('drop', onDropEvent);\n host.removeEventListener('dragleave', onDragLeave);\n hideLine();\n },\n };\n}\n","/**\n * Contrato de mensajes del puente builder (app del cliente ↔ dashboard).\n * Ambos lados validan `event.origin` y que `token` coincida antes de actuar.\n *\n * Flujo:\n * 1. El dashboard abre la app con `?veoBuilder=<token>&veoBuilderOrigin=<origen>`.\n * 2. La app (veo-builder.js) postea `ready` a la ventana que la abrió.\n * 3. El dashboard manda comandos (`start-picker`, `preview`, …).\n * 4. La app responde con eventos (`picked`, `pick-cancelled`, …).\n */\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport type { BlockDropPayload } from './block-drop-target';\nimport type { DesignPatch } from './design-manipulator';\nimport type { PickedElement } from './element-picker';\n\nexport const VEO_BUILDER_SOURCE = 'veo-builder';\n// Los nombres de los query params viven en el core (`builder-token.ts`), única\n// fuente de verdad compartida con el loader y el gate del runtime de guías.\nexport { BUILDER_ORIGIN_PARAM, BUILDER_TOKEN_PARAM } from '../../core/builder-token';\n\n/** Eventos que la app del cliente envía al dashboard. */\nexport type BuilderEvent =\n | { type: 'ready' }\n | { type: 'picked'; payload: PickedElement }\n | { type: 'pick-cancelled' }\n // Manipulación directa: el autor arrastró/redimensionó la guía en la app;\n // el panel mergea `payload.style` sobre el `style` del paso indicado.\n | { type: 'design-updated'; payload: DesignPatch }\n // Drag & drop de bloques: el autor soltó un bloque de la paleta SOBRE la\n // guía en preview; el panel lo inserta en `step.blocks[]` en esa posición.\n | { type: 'block-dropped'; payload: BlockDropPayload }\n | { type: 'closed' };\n\n/** Comandos que el dashboard/panel envía a la app del cliente. */\nexport type BuilderCommand =\n | { type: 'start-picker'; maxAncestors?: number; hint?: string }\n | { type: 'stop-picker' }\n // `editable: true` (editor in-app) adjunta drag/resize sobre la preview.\n | { type: 'preview'; guide: PreviewGuideInput; editable?: boolean }\n // Drag de un bloque de la paleta POR POINTER (el DnD HTML5 no cruza bien el\n // iframe del panel): el panel captura el puntero y streamea sus coordenadas\n // RELATIVAS AL IFRAME; la app las convierte con el rect del panel, mueve la\n // línea de inserción y en `drop` responde con el evento `block-dropped`.\n | {\n type: 'block-drag';\n phase: 'move' | 'drop' | 'cancel';\n x: number;\n y: number;\n blockType: string;\n label?: string;\n }\n | { type: 'close-preview' }\n | { type: 'teardown' }\n // Modo panel inyectado: el panel avisa que cargó y está listo para recibir\n // eventos; la app responde con `ready`. Resuelve la carrera de que el iframe\n // del panel todavía no tenga su listener cuando la app postea `ready`.\n | { type: 'panel-ready' };\n\n/** Sobre común: todo mensaje del puente lleva `source` + `token`. */\nexport interface BuilderEnvelope {\n source: typeof VEO_BUILDER_SOURCE;\n token: string;\n}\n\nexport type BuilderEventMessage = BuilderEnvelope & BuilderEvent;\nexport type BuilderCommandMessage = BuilderEnvelope & BuilderCommand;\n","/**\n * Modo \"panel inyectado\" (editor en la pestaña de la app).\n *\n * La app es la pestaña top-level (login real) y el editor de Veo se inyecta\n * ENCIMA como una tarjeta flotante **arrastrable y redimensionable** (un iframe\n * al dashboard). Además se puede **sacar a una ventana independiente** del\n * navegador (\"pop-out\").\n *\n * El panel corre en el origen del dashboard (sesión de Veo para guardar guías) y\n * habla con la app (`window.parent` si está anclado, `window.opener` si está en\n * ventana aparte) por el puente postMessage. Este módulo inyecta/gestiona el\n * panel y expone su ventana destino.\n */\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\n\nconst DEFAULT_PANEL_PATH = '/guides/design';\nconst PANEL_W = 400;\nconst PANEL_H = 640;\nconst MIN_W = 320;\nconst MIN_H = 320;\nconst MARGIN = 16;\n\nexport interface BuilderPanelOptions {\n dashboardOrigin: string;\n token: string;\n appOrigin: string;\n guide: string | null;\n panelPath: string | null;\n onClose: () => void;\n}\n\nexport interface BuilderPanelHandle {\n /** Ventana destino de los mensajes: el iframe anclado o la ventana pop-out. */\n target(): Window | null;\n /**\n * Rect del IFRAME del panel en coordenadas de la página de la app, o `null`\n * si el editor está en pop-out (ventana aparte: no hay mapeo de coordenadas).\n * Lo usa el drag de bloques para convertir el puntero panel → página.\n */\n frameRect(): DOMRect | null;\n /** Quita el panel del DOM (y cierra la ventana pop-out si hay). */\n teardown(): void;\n}\n\n/** Inyecta el panel del editor (arrastrable, redimensionable, pop-out). */\nexport function injectBuilderPanel(opts: BuilderPanelOptions): BuilderPanelHandle {\n if (!hasWindow() || !hasDocument()) {\n return { target: () => null, frameRect: () => null, teardown: () => {} };\n }\n\n const panelUrl = buildPanelUrl(opts);\n\n const host = document.createElement('div');\n host.setAttribute('data-veo-builder-panel', '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = PANEL_CSS;\n\n const card = document.createElement('div');\n card.className = 'veo-panel';\n let left = Math.max(MARGIN, window.innerWidth - PANEL_W - MARGIN);\n let top = MARGIN;\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n card.style.width = `${PANEL_W}px`;\n card.style.height = `${PANEL_H}px`;\n\n // Header: título + pop-out + cerrar.\n const header = document.createElement('div');\n header.className = 'veo-panel-header';\n const title = document.createElement('span');\n title.className = 'veo-panel-title';\n title.textContent = 'OnUser · Editor';\n const actions = document.createElement('div');\n actions.className = 'veo-panel-actions';\n const popout = document.createElement('button');\n popout.className = 'veo-panel-btn';\n popout.type = 'button';\n popout.title = 'Abrir en ventana aparte';\n popout.setAttribute('aria-label', 'Abrir en ventana aparte');\n popout.textContent = '⧉';\n const close = document.createElement('button');\n close.className = 'veo-panel-btn veo-panel-close';\n close.type = 'button';\n close.title = 'Cerrar';\n close.setAttribute('aria-label', 'Cerrar');\n close.textContent = '✕';\n actions.append(popout, close);\n header.append(title, actions);\n\n const iframe = document.createElement('iframe');\n iframe.className = 'veo-panel-frame';\n iframe.title = 'Editor de Veo';\n iframe.src = panelUrl;\n\n const grip = document.createElement('div');\n grip.className = 'veo-panel-resize';\n grip.setAttribute('aria-hidden', 'true');\n\n card.append(header, iframe, grip);\n shadow.append(style, card);\n document.body.appendChild(host);\n\n // ── Pop-out: sacar el editor a una ventana independiente ────────────────\n let popped: Window | null = null;\n let pollTimer: ReturnType<typeof setInterval> | undefined;\n\n const stopPoll = (): void => {\n if (pollTimer !== undefined) {\n clearInterval(pollTimer);\n pollTimer = undefined;\n }\n };\n\n close.addEventListener('click', () => opts.onClose());\n popout.addEventListener('click', () => {\n const win = window.open(\n panelUrl,\n 'veo-editor',\n `popup,width=${Math.round(card.offsetWidth)},height=${Math.round(card.offsetHeight) + 60}`,\n );\n if (!win) return; // bloqueado por el navegador\n popped = win;\n card.style.display = 'none'; // el editor ahora vive en la ventana aparte\n pollTimer = setInterval(() => {\n if (popped?.closed) {\n stopPoll();\n opts.onClose(); // cerrar la ventana = salir del modo editor\n }\n }, 600);\n });\n\n // ── Arrastre por el header ──────────────────────────────────────────────\n header.addEventListener('mousedown', (e) => {\n if ((e.target as HTMLElement)?.classList.contains('veo-panel-btn')) return;\n e.preventDefault();\n const sx = e.clientX;\n const sy = e.clientY;\n const ol = left;\n const ot = top;\n iframe.style.pointerEvents = 'none';\n const move = (ev: MouseEvent): void => {\n left = clamp(ol + (ev.clientX - sx), 0, Math.max(0, window.innerWidth - card.offsetWidth));\n top = clamp(ot + (ev.clientY - sy), 0, Math.max(0, window.innerHeight - 40));\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n iframe.style.pointerEvents = '';\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n });\n\n // ── Redimensionar por el grip (esquina inferior derecha) ────────────────\n grip.addEventListener('mousedown', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const sx = e.clientX;\n const sy = e.clientY;\n const sw = card.offsetWidth;\n const sh = card.offsetHeight;\n iframe.style.pointerEvents = 'none';\n const move = (ev: MouseEvent): void => {\n card.style.width = `${clamp(sw + (ev.clientX - sx), MIN_W, window.innerWidth)}px`;\n card.style.height = `${clamp(sh + (ev.clientY - sy), MIN_H, window.innerHeight)}px`;\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n iframe.style.pointerEvents = '';\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n });\n\n return {\n target: () => (popped && !popped.closed ? popped : iframe.contentWindow),\n frameRect: () => (popped && !popped.closed ? null : iframe.getBoundingClientRect()),\n teardown: () => {\n stopPoll();\n if (popped && !popped.closed) popped.close();\n host.remove();\n },\n };\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction buildPanelUrl(opts: BuilderPanelOptions): string {\n const path = opts.panelPath ?? DEFAULT_PANEL_PATH;\n const url = new URL(path, opts.dashboardOrigin);\n url.searchParams.set('veoToken', opts.token);\n url.searchParams.set('veoApp', opts.appOrigin);\n if (opts.guide) url.searchParams.set('veoGuide', opts.guide);\n return url.toString();\n}\n\nconst PANEL_CSS = `\n:host { all: initial; }\n.veo-panel {\n position: fixed;\n min-width: ${MIN_W}px; min-height: ${MIN_H}px;\n max-width: 96vw; max-height: 94vh;\n display: flex; flex-direction: column;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 12px 40px rgba(0,0,0,0.28);\n overflow: hidden;\n z-index: 2147483647;\n font-family: system-ui, -apple-system, sans-serif;\n}\n.veo-panel-header {\n flex: 0 0 auto;\n display: flex; align-items: center; justify-content: space-between;\n padding: 8px 10px 8px 12px;\n background: #1b1714; color: #f7f1eb;\n font-size: 13px; font-weight: 600;\n cursor: grab;\n}\n.veo-panel-header:active { cursor: grabbing; }\n.veo-panel-actions { display: flex; gap: 2px; }\n.veo-panel-btn {\n border: 0; background: transparent; color: #fff;\n font-size: 14px; cursor: pointer; line-height: 1;\n padding: 4px 7px; border-radius: 6px;\n}\n.veo-panel-btn:hover { background: rgba(255,255,255,0.15); }\n.veo-panel-frame { flex: 1 1 auto; width: 100%; border: 0; background: #fff; }\n.veo-panel-resize {\n position: absolute; right: 0; bottom: 0;\n width: 16px; height: 16px;\n cursor: nwse-resize;\n background:\n linear-gradient(135deg, transparent 50%, rgba(0,0,0,0.25) 50%, rgba(0,0,0,0.25) 60%,\n transparent 60%, transparent 72%, rgba(0,0,0,0.25) 72%, rgba(0,0,0,0.25) 82%, transparent 82%);\n}\n`;\n","/**\n * Manipulación DIRECTA del diseño en modo editor: arrastrar la tarjeta de una\n * modal para posicionarla, redimensionarla desde bordes/esquinas, y arrastrar\n * un banner para alternar top/bottom. Vive en el bundle builder (veo-builder.js)\n * — el runtime de guías no carga nada de esto.\n *\n * Funciona como DECORATOR: se adjunta DESPUÉS del render sobre el shadow root\n * abierto del host de la guía (no toca los renderers). Durante el gesto aplica\n * las variables CSS localmente (feedback a 60fps, sin postMessage); al soltar\n * (`pointerup`) emite UN `onCommit(patch)` con los valores finales, que el\n * builder-mode postea al panel como `design-updated`. El panel actualiza su\n * estado y re-manda `preview` — que entra por el update in-place con las\n * MISMAS variables → no hay loop ni parpadeo.\n *\n * Geometría del modal (ver styles.ts): la card usa `left: posX%` +\n * `translate(-posX%)`, o sea `cardLeft = posX * (viewportW - cardW)` →\n * `posX = cardLeft / (viewportW - cardW)`. Mismo modelo que serializa el\n * dashboard (`style.posX/posY` en 0..1) y consume `applyDesignVars`.\n */\nimport type { GuideType } from '../guides/types';\n\n/** Merge superficial sobre `step.style` del paso activo (lo aplica el panel). */\nexport interface DesignPatch {\n stepIndex: number;\n style: {\n posX?: number;\n posY?: number;\n width?: number;\n height?: number;\n position?: 'top' | 'bottom';\n };\n}\n\nexport interface DesignManipulatorOptions {\n /** Host de la guía (de `PreviewHandle.host()`), con shadow root abierto. */\n host: HTMLElement;\n guideType: GuideType;\n stepIndex: number;\n /** Se emite UNA vez por gesto, al soltar. */\n onCommit: (patch: DesignPatch) => void;\n /** Fin de cualquier gesto (con o sin cambios). Para aplicar previews encolados. */\n onGestureEnd?: () => void;\n}\n\nexport interface DesignManipulatorHandle {\n /** `true` mientras hay un gesto de drag/resize en curso. */\n isDragging(): boolean;\n /** Remueve handles, estilos y listeners. Idempotente. */\n detach(): void;\n}\n\nconst MIN_W = 220;\nconst MAX_W = 720;\nconst MIN_H = 120;\nconst MAX_H = 900;\n/** Zonas de agarre de los bordes (px). */\nconst EDGE = 8;\n\ntype ResizeDir = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\nconst RESIZE_DIRS: ResizeDir[] = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\n\nconst MANIPULATOR_CSS = `\n.veo-mnp-card {\n outline: 1.5px dashed rgba(255, 91, 53, 0.75);\n outline-offset: 2px;\n}\n.veo-mnp-card:hover { cursor: move; }\n.veo-mnp-handle {\n position: absolute;\n z-index: 10;\n background: transparent;\n}\n.veo-mnp-handle::after {\n content: '';\n position: absolute;\n width: 8px; height: 8px;\n background: #fff;\n border: 1.5px solid rgba(255, 91, 53, 0.9);\n border-radius: 2px;\n top: 50%; left: 50%;\n transform: translate(-50%, -50%);\n opacity: 0;\n transition: opacity 100ms ease;\n}\n.veo-mnp-card:hover .veo-mnp-handle::after,\n.veo-mnp-handle:hover::after { opacity: 1; }\n.veo-mnp-n { top: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-s { bottom: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-e { right: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-w { left: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-ne { top: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-nw { top: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-se { bottom: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-sw { bottom: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-banner { outline: 1.5px dashed rgba(255, 91, 53, 0.75); outline-offset: -2px; cursor: grab; }\n.veo-mnp-banner:active { cursor: grabbing; }\n`;\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction round3(v: number): number {\n return Math.round(v * 1000) / 1000;\n}\n\n/** true si el mousedown cayó sobre algo interactivo (no iniciar drag ahí). */\nfunction isInteractive(target: EventTarget | null): boolean {\n return Boolean(\n target instanceof Element && target.closest('button, a, input, textarea, select, label'),\n );\n}\n\n/**\n * Adjunta la manipulación directa al host de una guía montada. Devuelve el\n * handle, o `null` si el tipo de guía no la soporta o el DOM esperado no está.\n * Idempotente: si la card ya está decorada, no re-adjunta.\n */\nexport function attachDesignManipulator(\n opts: DesignManipulatorOptions,\n): DesignManipulatorHandle | null {\n const shadow = opts.host.shadowRoot;\n if (!shadow) return null;\n\n const card = shadow.querySelector<HTMLElement>('.veo-modal-card');\n if (card) return attachModal(opts, shadow, card);\n\n const banner = shadow.querySelector<HTMLElement>('.veo-banner');\n // El banner embebido se posiciona con prepend/append en el contenedor: su\n // top/bottom se cambia desde el panel (remonta). Solo el fijo se arrastra.\n if (banner && !banner.classList.contains('veo-banner-embedded')) {\n return attachBanner(opts, shadow, banner);\n }\n\n return null;\n}\n\n// ── Modal: drag libre + resize por 8 handles ────────────────────────────────\n\nfunction attachModal(\n opts: DesignManipulatorOptions,\n shadow: ShadowRoot,\n card: HTMLElement,\n): DesignManipulatorHandle | null {\n if (card.dataset.veoManipulated === '1') return null;\n card.dataset.veoManipulated = '1';\n card.classList.add('veo-mnp-card');\n\n const doc = card.ownerDocument;\n const style = doc.createElement('style');\n style.textContent = MANIPULATOR_CSS;\n shadow.appendChild(style);\n\n const handles: HTMLElement[] = [];\n for (const dir of RESIZE_DIRS) {\n const h = doc.createElement('div');\n h.className = `veo-mnp-handle veo-mnp-${dir}`;\n h.dataset.veoDir = dir;\n card.appendChild(h);\n handles.push(h);\n }\n\n let dragging = false;\n let detached = false;\n\n /** Últimos valores aplicados durante el gesto (para el commit del up). */\n let patch: DesignPatch['style'] = {};\n\n const setVars = (v: { px?: number; py?: number; w?: number; h?: number }): void => {\n const host = opts.host;\n if (v.px !== undefined) host.style.setProperty('--veo-pos-x', `${v.px * 100}%`);\n if (v.py !== undefined) host.style.setProperty('--veo-pos-y', `${v.py * 100}%`);\n if (v.w !== undefined) host.style.setProperty('--veo-width', `${v.w}px`);\n if (v.h !== undefined) host.style.setProperty('--veo-min-h', `${v.h}px`);\n };\n\n /**\n * Un gesto genérico: guarda el rect inicial, traduce cada mousemove a\n * variables CSS (rAF-throttled) y al soltar emite el commit acumulado.\n */\n const startGesture = (\n e: MouseEvent,\n apply: (dx: number, dy: number, start: DOMRect) => DesignPatch['style'],\n ): void => {\n e.preventDefault();\n e.stopPropagation();\n dragging = true;\n patch = {};\n const start = card.getBoundingClientRect();\n const sx = e.clientX;\n const sy = e.clientY;\n let raf = 0;\n let lastEv: MouseEvent | null = null;\n\n const flush = (): void => {\n raf = 0;\n if (!lastEv) return;\n const next = apply(lastEv.clientX - sx, lastEv.clientY - sy, start);\n patch = { ...patch, ...next };\n setVars({\n ...(next.posX !== undefined ? { px: next.posX } : {}),\n ...(next.posY !== undefined ? { py: next.posY } : {}),\n ...(next.width !== undefined ? { w: next.width } : {}),\n ...(next.height !== undefined ? { h: next.height } : {}),\n });\n };\n\n const move = (ev: MouseEvent): void => {\n lastEv = ev;\n // rAF-throttle del feedback; fallback síncrono si el entorno no tiene rAF.\n if (typeof window.requestAnimationFrame !== 'function') flush();\n else if (!raf) raf = window.requestAnimationFrame(flush);\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n if (raf) window.cancelAnimationFrame(raf);\n flush();\n dragging = false;\n if (Object.keys(patch).length > 0 && !detached) {\n opts.onCommit({ stepIndex: opts.stepIndex, style: patch });\n }\n opts.onGestureEnd?.();\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n };\n\n /** posX para que el borde izquierdo quede en `left` con ancho `w`. */\n const posXFor = (left: number, w: number): number => {\n const span = window.innerWidth - w;\n return span <= 0 ? 0.5 : round3(clamp(left / span, 0, 1));\n };\n const posYFor = (top: number, h: number): number => {\n const span = window.innerHeight - h;\n return span <= 0 ? 0.5 : round3(clamp(top / span, 0, 1));\n };\n\n const onCardDown = (e: MouseEvent): void => {\n if (isInteractive(e.target)) return;\n if (e.target instanceof Element && e.target.closest('.veo-mnp-handle')) return;\n startGesture(e, (dx, dy, start) => ({\n posX: posXFor(start.left + dx, start.width),\n posY: posYFor(start.top + dy, start.height),\n }));\n };\n\n const onHandleDown = (e: MouseEvent): void => {\n const dir = (e.currentTarget as HTMLElement).dataset.veoDir as ResizeDir;\n startGesture(e, (dx, dy, start) => {\n const out: DesignPatch['style'] = {};\n if (dir.includes('e')) out.width = Math.round(clamp(start.width + dx, MIN_W, MAX_W));\n if (dir.includes('w')) {\n out.width = Math.round(clamp(start.width - dx, MIN_W, MAX_W));\n // El borde derecho queda fijo: la card se re-ancla donde corresponde.\n out.posX = posXFor(start.right - out.width, out.width);\n }\n if (dir.includes('s')) out.height = Math.round(clamp(start.height + dy, MIN_H, MAX_H));\n if (dir.includes('n')) {\n out.height = Math.round(clamp(start.height - dy, MIN_H, MAX_H));\n out.posY = posYFor(start.bottom - out.height, out.height);\n }\n return out;\n });\n };\n\n card.addEventListener('mousedown', onCardDown);\n for (const h of handles) h.addEventListener('mousedown', onHandleDown);\n\n return {\n isDragging: () => dragging,\n detach: () => {\n if (detached) return;\n detached = true;\n card.removeEventListener('mousedown', onCardDown);\n for (const h of handles) h.remove();\n style.remove();\n card.classList.remove('veo-mnp-card');\n delete card.dataset.veoManipulated;\n },\n };\n}\n\n// ── Banner fijo: drag vertical con snap top/bottom ──────────────────────────\n\nfunction attachBanner(\n opts: DesignManipulatorOptions,\n shadow: ShadowRoot,\n banner: HTMLElement,\n): DesignManipulatorHandle | null {\n if (banner.dataset.veoManipulated === '1') return null;\n banner.dataset.veoManipulated = '1';\n banner.classList.add('veo-mnp-banner');\n\n const doc = banner.ownerDocument;\n const style = doc.createElement('style');\n style.textContent = MANIPULATOR_CSS;\n shadow.appendChild(style);\n\n let dragging = false;\n let detached = false;\n\n const positionOf = (): 'top' | 'bottom' =>\n banner.classList.contains('veo-banner-bottom') ? 'bottom' : 'top';\n\n const onDown = (e: MouseEvent): void => {\n if (isInteractive(e.target)) return;\n e.preventDefault();\n dragging = true;\n const startPos = positionOf();\n let current = startPos;\n\n const move = (ev: MouseEvent): void => {\n // Snap: la mitad del viewport decide top/bottom, con feedback en vivo.\n const next = ev.clientY < window.innerHeight / 2 ? 'top' : 'bottom';\n if (next !== current) {\n current = next;\n banner.classList.remove('veo-banner-top', 'veo-banner-bottom');\n banner.classList.add(`veo-banner-${next}`);\n }\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n dragging = false;\n if (current !== startPos && !detached) {\n opts.onCommit({ stepIndex: opts.stepIndex, style: { position: current } });\n }\n opts.onGestureEnd?.();\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n };\n\n banner.addEventListener('mousedown', onDown);\n\n return {\n isDragging: () => dragging,\n detach: () => {\n if (detached) return;\n detached = true;\n banner.removeEventListener('mousedown', onDown);\n style.remove();\n banner.classList.remove('veo-mnp-banner');\n delete banner.dataset.veoManipulated;\n },\n };\n}\n","/**\n * Element picker — el \"inspeccionar\" del navegador, pero del SDK. Corre\n * DENTRO de la app del cliente (no en el dashboard: son orígenes distintos\n * y el dashboard no puede leer el DOM de la app). Resalta el elemento bajo\n * el cursor, muestra su selector + dimensiones, y al hacer click captura un\n * selector CSS estable reutilizando `buildSelectorPath` del autocapture.\n *\n * Es la base del builder no-code: el dashboard abre la app del cliente en\n * modo builder, el usuario \"pincha\" un elemento y el selector resultante se\n * usa como ancla de un tooltip/walkthrough. El puente con el dashboard\n * (postMessage) es la fase siguiente; aquí exponemos el primitivo\n * `startElementPicker(onPick)`.\n *\n * No usa `innerHTML` — todo por `textContent`/DOM, igual que los renderers.\n */\n\nimport { hasDocument } from '../../utils/safe-env';\nimport { buildSelectorPath, filterHumanClasses } from '../autocapture/selector-builder';\n\n/** z-index por encima de las guías (2147483640) para tapar también una preview. */\nconst PICKER_Z = 2147483646;\nconst PICKER_HOST_ATTR = 'data-veo-picker';\nconst DEFAULT_MAX_ANCESTORS = 5;\n\n/** Datos del elemento elegido que se entregan al caller. */\nexport interface PickedElement {\n /** Selector CSS estable con ancestros (lo que se guarda como ancla). */\n selector: string;\n /** Selector corto solo del elemento (tag + id/atributo/clases). */\n shortSelector: string;\n tag: string;\n id: string | null;\n classes: string[];\n text: string;\n rect: { x: number; y: number; width: number; height: number };\n}\n\nexport interface ElementPickerOptions {\n /** Llamado al hacer click en un elemento. El picker se cierra tras esto. */\n onPick: (picked: PickedElement) => void;\n /** Llamado al cancelar (Esc). El picker se cierra. */\n onCancel?: () => void;\n /** Niveles de ancestros del selector. Default 5 (igual que autocapture). */\n maxAncestors?: number;\n /** Texto del banner superior. Default en español. */\n hint?: string;\n}\n\nexport interface ElementPickerHandle {\n /** Cierra el picker sin elegir nada. Idempotente. */\n stop(): void;\n}\n\nconst PICKER_STYLES = `\n:host { all: initial; }\n.veo-pick-box {\n position: fixed;\n z-index: ${PICKER_Z};\n pointer-events: none;\n box-sizing: border-box;\n background: rgba(99, 102, 241, 0.22);\n border: 1px dashed rgba(99, 102, 241, 0.95);\n border-radius: 2px;\n transition: top 60ms ease-out, left 60ms ease-out, width 60ms ease-out, height 60ms ease-out;\n}\n.veo-pick-label {\n position: fixed;\n z-index: ${PICKER_Z};\n pointer-events: none;\n max-width: 360px;\n background: #1e1b4b;\n color: #e0e7ff;\n font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace;\n padding: 6px 9px;\n border-radius: 6px;\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35);\n}\n.veo-pick-label .veo-pick-sel { color: #c7d2fe; word-break: break-all; }\n.veo-pick-label .veo-pick-dim { color: #a5b4fc; margin-top: 3px; }\n.veo-pick-hint {\n position: fixed;\n top: 12px;\n left: 50%;\n transform: translateX(-50%);\n z-index: ${PICKER_Z};\n pointer-events: none;\n background: #4338ca;\n color: #fff;\n font: 13px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n padding: 8px 14px;\n border-radius: 999px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);\n}\n`;\n\n/**\n * Controla un picker activo. Singleton a nivel de módulo: empezar otro\n * cierra el anterior. Los listeners van en fase de captura para poder\n * cancelar el click ANTES de que la app del cliente reaccione.\n */\nclass ElementPicker {\n private host: HTMLElement | null = null;\n private box: HTMLElement | null = null;\n private label: HTMLElement | null = null;\n private current: Element | null = null;\n private maxAncestors = DEFAULT_MAX_ANCESTORS;\n private onPick: ((p: PickedElement) => void) | null = null;\n private onCancel: (() => void) | null = null;\n\n start(options: ElementPickerOptions): void {\n this.stop(); // solo un picker a la vez\n\n this.maxAncestors = options.maxAncestors ?? DEFAULT_MAX_ANCESTORS;\n this.onPick = options.onPick;\n this.onCancel = options.onCancel ?? null;\n\n const host = document.createElement('div');\n host.setAttribute(PICKER_HOST_ATTR, '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = PICKER_STYLES;\n\n this.box = document.createElement('div');\n this.box.className = 'veo-pick-box';\n this.box.style.display = 'none';\n\n this.label = document.createElement('div');\n this.label.className = 'veo-pick-label';\n this.label.style.display = 'none';\n\n const hint = document.createElement('div');\n hint.className = 'veo-pick-hint';\n hint.textContent = options.hint ?? 'Selecciona un elemento · Esc para cancelar';\n\n shadow.append(style, this.box, this.label, hint);\n document.body.appendChild(host);\n this.host = host;\n\n document.addEventListener('mousemove', this.onMove, true);\n document.addEventListener('click', this.onClick, true);\n document.addEventListener('mousedown', this.swallow, true);\n document.addEventListener('mouseup', this.swallow, true);\n document.addEventListener('keydown', this.onKey, true);\n window.addEventListener('scroll', this.reposition, true);\n window.addEventListener('resize', this.reposition);\n }\n\n stop(): void {\n document.removeEventListener('mousemove', this.onMove, true);\n document.removeEventListener('click', this.onClick, true);\n document.removeEventListener('mousedown', this.swallow, true);\n document.removeEventListener('mouseup', this.swallow, true);\n document.removeEventListener('keydown', this.onKey, true);\n window.removeEventListener('scroll', this.reposition, true);\n window.removeEventListener('resize', this.reposition);\n\n if (this.host?.parentNode) this.host.parentNode.removeChild(this.host);\n this.host = null;\n this.box = null;\n this.label = null;\n this.current = null;\n this.onPick = null;\n this.onCancel = null;\n }\n\n /** ¿Es un nodo de nuestro propio overlay? (no debe ser seleccionable). */\n private isOwn(target: EventTarget | null): boolean {\n return target instanceof Node && this.host !== null && this.host.contains(target);\n }\n\n private onMove = (event: MouseEvent): void => {\n const target = event.target;\n if (!(target instanceof Element) || this.isOwn(target)) return;\n this.current = target;\n this.draw(target);\n };\n\n private onClick = (event: MouseEvent): void => {\n const target = this.current ?? (event.target instanceof Element ? event.target : null);\n if (!target || this.isOwn(target)) return;\n\n // Evitar que la app reaccione al click de selección.\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n const picked = this.describe(target);\n const cb = this.onPick;\n this.stop();\n cb?.(picked);\n };\n\n private onKey = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n event.stopPropagation();\n const cb = this.onCancel;\n this.stop();\n cb?.();\n };\n\n /** Traga mousedown/mouseup durante el picking (evita focus/active de la app). */\n private swallow = (event: MouseEvent): void => {\n if (this.isOwn(event.target)) return;\n event.preventDefault();\n event.stopPropagation();\n };\n\n private reposition = (): void => {\n if (this.current) this.draw(this.current);\n };\n\n /** Dibuja el recuadro de resalte y la etiqueta sobre el elemento dado. */\n private draw(element: Element): void {\n if (!this.box || !this.label) return;\n const rect = element.getBoundingClientRect();\n\n this.box.style.display = 'block';\n this.box.style.top = `${rect.top}px`;\n this.box.style.left = `${rect.left}px`;\n this.box.style.width = `${rect.width}px`;\n this.box.style.height = `${rect.height}px`;\n\n const shortSel = buildSelectorPath(element, 0);\n this.label.textContent = '';\n const sel = document.createElement('div');\n sel.className = 'veo-pick-sel';\n sel.textContent = shortSel;\n const dim = document.createElement('div');\n dim.className = 'veo-pick-dim';\n dim.textContent = `${Math.round(rect.width)} × ${Math.round(rect.height)}`;\n this.label.append(sel, dim);\n\n // Etiqueta debajo del recuadro; si no hay espacio, arriba.\n this.label.style.display = 'block';\n const LABEL_H = 48;\n const placeAbove = rect.bottom + 8 + LABEL_H > window.innerHeight;\n this.label.style.top = placeAbove\n ? `${Math.max(8, rect.top - LABEL_H - 8)}px`\n : `${rect.bottom + 8}px`;\n this.label.style.left = `${Math.max(8, rect.left)}px`;\n }\n\n private describe(element: Element): PickedElement {\n const rect = element.getBoundingClientRect();\n return {\n selector: buildSelectorPath(element, this.maxAncestors),\n shortSelector: buildSelectorPath(element, 0),\n tag: element.tagName.toLowerCase(),\n id: element.id || null,\n classes: filterHumanClasses(element),\n text: (element.textContent ?? '').trim().slice(0, 120),\n rect: {\n x: Math.round(rect.left),\n y: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n };\n }\n}\n\nlet activePicker: ElementPicker | null = null;\n\n/**\n * Inicia el modo de selección de elementos (inspector). Resalta lo que está\n * bajo el cursor y, al hacer click, entrega un selector CSS estable.\n * Devuelve un handle con `stop()`. Iniciar otro picker cierra el anterior.\n *\n * @example\n * ```ts\n * import { startElementPicker } from '@veo/sdk';\n *\n * const picker = startElementPicker({\n * onPick: ({ selector }) => console.log('elegido:', selector),\n * onCancel: () => console.log('cancelado'),\n * });\n * // picker.stop() para abortar manualmente.\n * ```\n */\nexport function startElementPicker(options: ElementPickerOptions): ElementPickerHandle {\n if (!hasDocument()) {\n return { stop: () => {} };\n }\n if (!activePicker) activePicker = new ElementPicker();\n activePicker.start(options);\n return { stop: () => activePicker?.stop() };\n}\n\n/** Cierra el picker activo, si lo hay. Idempotente. */\nexport function stopElementPicker(): void {\n activePicker?.stop();\n}\n","/**\n * Lado APP del puente builder. Corre dentro de la app del cliente (vía\n * veo-builder.js). Si el contexto trae `?veoBuilder=<token>`, se conecta con el\n * editor de Veo, atiende comandos y devuelve el elemento elegido.\n *\n * Dos transportes:\n * - **iframe/popup** (`resolveTarget` = opener/parent): el dashboard es la\n * ventana principal y embebe/abre la app; le hablamos a esa ventana.\n * - **panel inyectado** (`ctx.panel`): la app es top-level (login real) y NOSOTROS\n * inyectamos el panel del editor encima (iframe al dashboard); le hablamos a\n * ese iframe. Es el modo sin adaptación por app.\n *\n * Seguridad: solo acepta mensajes cuyo `origin` coincida con el del dashboard\n * (`veoBuilderOrigin` / `document.referrer`) y cuyo `token` coincida.\n */\nimport {\n type BuilderClientContext,\n clearBuilderToken,\n resolveBuilderContext,\n} from '../../core/builder-token';\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\nimport { closeGuidePreview, previewGuide } from '../guides/guide-preview';\nimport { attachBlockDropTarget, type BlockDropTargetHandle } from './block-drop-target';\nimport { type BuilderCommand, type BuilderEvent, VEO_BUILDER_SOURCE } from './bridge-protocol';\nimport { type BuilderPanelHandle, injectBuilderPanel } from './builder-panel';\nimport { attachDesignManipulator, type DesignManipulatorHandle } from './design-manipulator';\nimport { type ElementPickerHandle, startElementPicker } from './element-picker';\n\nexport interface BuilderModeHandle {\n /** Desconecta el puente y limpia picker/preview/panel. */\n teardown(): void;\n}\n\n/**\n * Inicializa el modo builder si hay contexto (URL o persistido). Devuelve un\n * handle, o `null` si no estamos en modo builder o no hay canal con el editor.\n * Es seguro llamarla siempre.\n */\nexport function initBuilderMode(): BuilderModeHandle | null {\n if (!hasWindow() || !hasDocument()) return null;\n\n // Contexto de la URL o de sessionStorage: sobrevive al redirect del guard de\n // auth (que suele tirar el query string) y a un login en la misma pestaña.\n const ctx = resolveBuilderContext();\n if (!ctx) return null;\n\n const token = ctx.token;\n const dashboardOrigin = resolveDashboardOrigin(ctx.origin);\n if (!dashboardOrigin) return null;\n\n let picker: ElementPickerHandle | null = null;\n let panel: BuilderPanelHandle | null = null;\n let staticTarget: Window | null = null;\n let manipulator: DesignManipulatorHandle | null = null;\n let dropTarget: BlockDropTargetHandle | null = null;\n /** Fantasma que sigue el cursor durante el drag de un bloque de la paleta. */\n let dragGhost: HTMLElement | null = null;\n /** Paso mostrado por la preview activa (destino de los drops de bloque). */\n let previewStepIndex = 0;\n /** Preview que llegó DURANTE un drag: se aplica al terminar el gesto. */\n let pendingPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n const getTarget = (): Window | null => (panel ? panel.target() : staticTarget);\n\n const post = (event: BuilderEvent): void => {\n getTarget()?.postMessage({ source: VEO_BUILDER_SOURCE, token, ...event }, dashboardOrigin);\n };\n\n const applyPreview = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n manipulator?.detach();\n manipulator = null;\n dropTarget?.detach();\n dropTarget = null;\n previewStepIndex = cmd.guide.startStepIndex ?? 0;\n const handle = previewGuide(cmd.guide);\n if (!cmd.editable) return;\n void handle.ready.then((result) => {\n if (!result.rendered) return;\n const host = handle.host();\n if (!host) return;\n manipulator = attachDesignManipulator({\n host,\n guideType: cmd.guide.guideType,\n stepIndex: cmd.guide.startStepIndex ?? 0,\n onCommit: (payload) => post({ type: 'design-updated', payload }),\n onGestureEnd: () => {\n if (!pendingPreview) return;\n const queued = pendingPreview;\n pendingPreview = null;\n applyPreview(queued);\n },\n });\n // Paleta → guía: soltar un bloque del panel sobre la preview lo inserta.\n dropTarget = attachBlockDropTarget({\n host,\n stepIndex: cmd.guide.startStepIndex ?? 0,\n onDrop: (payload) => post({ type: 'block-dropped', payload }),\n });\n });\n };\n\n const hideDragGhost = (): void => {\n dragGhost?.remove();\n dragGhost = null;\n };\n\n const moveDragGhost = (x: number, y: number, label: string): void => {\n if (!dragGhost) {\n dragGhost = document.createElement('div');\n dragGhost.style.cssText =\n 'position:fixed;padding:4px 10px;border-radius:999px;background:#1c1917;color:#fff;' +\n 'font:12px/1.4 system-ui,sans-serif;box-shadow:0 4px 14px rgba(0,0,0,0.35);' +\n 'border:1px solid rgba(255,255,255,0.25);pointer-events:none;z-index:2147483647;';\n document.body.appendChild(dragGhost);\n }\n dragGhost.textContent = label;\n dragGhost.style.left = `${x + 14}px`;\n dragGhost.style.top = `${y + 12}px`;\n };\n\n /**\n * Drag de bloque por pointer: coords relativas al iframe del panel → página.\n * En pop-out no hay mapeo (otra ventana) — se ignora.\n */\n const handleBlockDrag = (cmd: Extract<BuilderCommand, { type: 'block-drag' }>): void => {\n const rect = panel?.frameRect();\n if (!rect || !dropTarget) {\n if (cmd.phase !== 'move') hideDragGhost();\n dropTarget?.cancelHover();\n return;\n }\n const x = rect.left + cmd.x;\n const y = rect.top + cmd.y;\n if (cmd.phase === 'move') {\n moveDragGhost(x, y, cmd.label || cmd.blockType);\n dropTarget.hoverAt(x, y);\n return;\n }\n hideDragGhost();\n if (cmd.phase === 'cancel') {\n dropTarget.cancelHover();\n return;\n }\n const spotAt = dropTarget.dropAt(x, y);\n if (spotAt) {\n post({\n type: 'block-dropped',\n payload: { stepIndex: previewStepIndex, blockType: cmd.blockType, ...spotAt },\n });\n }\n };\n\n const handleCommand = (cmd: BuilderCommand): void => {\n switch (cmd.type) {\n case 'panel-ready':\n // El panel cargó y ya escucha → recién ahora le mandamos `ready`.\n post({ type: 'ready' });\n break;\n case 'start-picker':\n picker?.stop();\n picker = startElementPicker({\n onPick: (payload) => {\n picker = null;\n post({ type: 'picked', payload });\n },\n onCancel: () => {\n picker = null;\n post({ type: 'pick-cancelled' });\n },\n ...(cmd.maxAncestors !== undefined ? { maxAncestors: cmd.maxAncestors } : {}),\n ...(cmd.hint !== undefined ? { hint: cmd.hint } : {}),\n });\n break;\n case 'stop-picker':\n picker?.stop();\n picker = null;\n break;\n case 'preview':\n if (!cmd.guide) break;\n // Mientras hay un drag en curso, no remontar la preview debajo del\n // mouse del autor: se encola el ÚLTIMO comando y se aplica al soltar.\n if (manipulator?.isDragging()) pendingPreview = cmd;\n else applyPreview(cmd);\n break;\n case 'block-drag':\n handleBlockDrag(cmd);\n break;\n case 'close-preview':\n manipulator?.detach();\n manipulator = null;\n dropTarget?.detach();\n dropTarget = null;\n hideDragGhost();\n pendingPreview = null;\n closeGuidePreview();\n break;\n case 'teardown':\n teardown();\n break;\n }\n };\n\n const onMessage = (event: MessageEvent): void => {\n if (event.origin !== dashboardOrigin) return;\n const data = event.data as { source?: unknown; token?: unknown } | null;\n if (!data || data.source !== VEO_BUILDER_SOURCE || data.token !== token) return;\n handleCommand(data as BuilderCommand);\n };\n\n const onPageHide = (): void => post({ type: 'closed' });\n\n const teardown = (): void => {\n window.removeEventListener('message', onMessage);\n window.removeEventListener('pagehide', onPageHide);\n picker?.stop();\n picker = null;\n manipulator?.detach();\n manipulator = null;\n dropTarget?.detach();\n dropTarget = null;\n hideDragGhost();\n pendingPreview = null;\n closeGuidePreview();\n post({ type: 'closed' }); // avisar al editor ANTES de sacar el panel\n panel?.teardown();\n panel = null;\n clearBuilderToken(); // salir del modo builder: no re-activar en la próxima carga\n };\n\n // Transporte: panel inyectado (app top-level) o iframe/popup (embebida).\n if (ctx.panel) {\n panel = injectBuilderPanel({\n dashboardOrigin,\n token,\n appOrigin: window.location.origin,\n guide: ctx.guide,\n panelPath: ctx.panelPath,\n onClose: () => teardown(),\n });\n } else {\n staticTarget = resolveTarget();\n if (!staticTarget) return null;\n }\n\n const activate = (): void => {\n window.addEventListener('message', onMessage);\n window.addEventListener('pagehide', onPageHide);\n // Panel: esperamos el `panel-ready` del iframe para postear `ready` (todavía\n // puede no tener su listener). iframe/popup: el opener ya escucha → posteamos ya.\n if (!ctx.panel) post({ type: 'ready' });\n };\n\n // Modo panel inyectado: la seguridad ya la da la sesión AUTENTICADA del\n // dashboard (el panel es un iframe del dashboard con Clerk) — el token es solo\n // correlación. Activamos directo, SIN verify: el verify contra el backend\n // podría fallar por expiración del token durante el login (que tarda), dejando\n // el panel para siempre en \"conectando…\".\n //\n // Modo iframe/popup (embebido): verificamos el token firmado antes de activar\n // (si `init()` dejó la config). Solo bloquea si el backend dice {valid:false}.\n const cfg = (window as unknown as { __veoBuilder?: { apiKey?: string; apiUrl?: string } })\n .__veoBuilder;\n if (!ctx.panel && cfg?.apiKey && cfg?.apiUrl) {\n void verifyBuilderToken(cfg.apiUrl, cfg.apiKey, token).then((ok) => {\n if (ok) activate();\n else if (window.console) console.warn('[veo] token de builder inválido — modo no activado');\n });\n } else {\n activate();\n }\n\n return { teardown };\n}\n\n/**\n * Verifica el token con el backend. Solo devuelve `false` (no activar) cuando el\n * backend responde explícitamente `{valid:false}` (token forjado/expirado/de\n * otro workspace). Ante 404/red caída/errores transitorios devuelve `true`\n * (best-effort) para no brickear el modo builder.\n */\nasync function verifyBuilderToken(apiUrl: string, apiKey: string, token: string): Promise<boolean> {\n try {\n const url = `${apiUrl.replace(/\\/+$/, '')}/v1/builder/verify`;\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': apiKey },\n body: JSON.stringify({ token }),\n });\n if (!res.ok) return true; // no pudimos verificar → best-effort\n const data = (await res.json().catch(() => null)) as { valid?: unknown } | null;\n return data?.valid !== false;\n } catch {\n return true; // red caída / sin backend → best-effort\n }\n}\n\n/** Ventana con la que hablar en modo iframe/popup: el opener o el parent. */\nfunction resolveTarget(): Window | null {\n if (window.opener && window.opener !== window) return window.opener as Window;\n if (window.parent && window.parent !== window) return window.parent;\n return null;\n}\n\nfunction resolveDashboardOrigin(originHint: string | null): string | null {\n // Origen de la URL o persistido en el primer arranque (antes del redirect).\n if (originHint) {\n try {\n return new URL(originHint).origin;\n } catch {\n return null;\n }\n }\n // Fallback: el referrer. Poco fiable tras un redirect same-origin (apunta a la\n // propia app), por eso el origen persistido va primero.\n if (hasDocument() && document.referrer) {\n try {\n return new URL(document.referrer).origin;\n } catch {\n return null;\n }\n }\n return null;\n}\n\n// Tipo re-exportado para consumidores que tipan el contexto.\nexport type { BuilderClientContext };\n","/**\n * Lado DASHBOARD del puente builder. Abre la app del cliente en un popup,\n * en modo builder, y expone una API para pedirle que seleccione un elemento\n * o previsualice una guía. Pensado para importarse en el dashboard\n * (`import { createBuilderSession } from '@veo/sdk/builder'`).\n *\n * Seguridad: solo procesa mensajes cuyo `origin` sea el de la app y cuyo\n * `token` coincida con el de esta sesión.\n */\nimport { hasWindow } from '../../utils/safe-env';\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport {\n BUILDER_ORIGIN_PARAM,\n BUILDER_TOKEN_PARAM,\n type BuilderCommand,\n VEO_BUILDER_SOURCE,\n} from './bridge-protocol';\nimport type { PickedElement } from './element-picker';\n\nexport interface BuilderSessionOptions {\n /** URL de la app del cliente a abrir en modo builder. */\n appUrl: string;\n /** Token de la sesión (idealmente emitido/firmado por el backend). */\n token: string;\n /** Origen al que la app debe responder. Default: `location.origin`. */\n dashboardOrigin?: string;\n /** La app está lista y escuchando comandos. */\n onReady?: () => void;\n /** El usuario eligió un elemento. */\n onPicked?: (picked: PickedElement) => void;\n /** El usuario canceló la selección (Esc). */\n onCancelled?: () => void;\n /** La app cerró el modo builder (o el popup se cerró). */\n onClosed?: () => void;\n /**\n * Si se pasa, la app se embebe en este `<iframe>` (modo estudio in-app) en\n * lugar de abrirse en un popup. El lado app ya habla con `window.parent`,\n * así que el puente funciona igual. La sesión setea el `src` del iframe.\n */\n frame?: HTMLIFrameElement;\n /** Nombre de la ventana popup. Default: `veo-builder`. */\n windowName?: string;\n /** Features del popup. Default: ventana de ~1280×860. */\n windowFeatures?: string;\n}\n\nexport interface BuilderSession {\n /** Pide a la app que entre en modo selección de elemento. */\n startPicker(options?: { maxAncestors?: number; hint?: string }): void;\n /** Cancela la selección en curso. */\n stopPicker(): void;\n /** Pide a la app que previsualice una guía. */\n preview(guide: PreviewGuideInput): void;\n /** Cierra la preview activa en la app. */\n closePreview(): void;\n /** Cierra el popup y desconecta el puente. */\n close(): void;\n}\n\nconst DEFAULT_FEATURES = 'popup,width=1280,height=860';\nconst POPUP_POLL_MS = 600;\n\nexport function createBuilderSession(options: BuilderSessionOptions): BuilderSession {\n if (!hasWindow()) return noopSession();\n\n const dashboardOrigin = options.dashboardOrigin ?? window.location.origin;\n const appOrigin = safeOrigin(options.appUrl);\n const url = buildAppUrl(options.appUrl, options.token, dashboardOrigin);\n\n const frame = options.frame ?? null;\n const useFrame = frame !== null;\n\n let popup: Window | null = null;\n if (useFrame) {\n // biome-ignore lint/style/noNonNullAssertion: useFrame garantiza frame\n frame!.src = url;\n } else {\n popup = window.open(\n url,\n options.windowName ?? 'veo-builder',\n options.windowFeatures ?? DEFAULT_FEATURES,\n );\n }\n\n /** Ventana destino de los comandos: el popup o el contentWindow del iframe. */\n const targetWindow = (): Window | null => (useFrame ? (frame?.contentWindow ?? null) : popup);\n\n const post = (command: BuilderCommand): void => {\n const w = targetWindow();\n if (!w) return;\n if (!useFrame && popup?.closed) return;\n w.postMessage(\n { source: VEO_BUILDER_SOURCE, token: options.token, ...command },\n appOrigin ?? '*',\n );\n };\n\n let pollTimer: ReturnType<typeof setInterval> | undefined;\n\n const cleanup = (): void => {\n window.removeEventListener('message', onMessage);\n if (pollTimer !== undefined) {\n clearInterval(pollTimer);\n pollTimer = undefined;\n }\n };\n\n const onMessage = (event: MessageEvent): void => {\n if (appOrigin && event.origin !== appOrigin) return;\n const data = event.data as {\n source?: unknown;\n token?: unknown;\n type?: unknown;\n payload?: unknown;\n } | null;\n if (!data || data.source !== VEO_BUILDER_SOURCE || data.token !== options.token) return;\n\n switch (data.type) {\n case 'ready':\n options.onReady?.();\n break;\n case 'picked':\n if (data.payload) options.onPicked?.(data.payload as PickedElement);\n break;\n case 'pick-cancelled':\n options.onCancelled?.();\n break;\n case 'closed':\n cleanup();\n options.onClosed?.();\n break;\n }\n };\n\n window.addEventListener('message', onMessage);\n\n // Detectar cierre manual del popup (el usuario cierra la ventana). En modo\n // iframe el ciclo de vida lo controla el dashboard (no hay nada que pollear).\n if (!useFrame) {\n pollTimer = setInterval(() => {\n if (popup?.closed) {\n cleanup();\n options.onClosed?.();\n }\n }, POPUP_POLL_MS);\n }\n\n return {\n startPicker: (o) =>\n post({\n type: 'start-picker',\n ...(o?.maxAncestors !== undefined ? { maxAncestors: o.maxAncestors } : {}),\n ...(o?.hint !== undefined ? { hint: o.hint } : {}),\n }),\n stopPicker: () => post({ type: 'stop-picker' }),\n preview: (guide) => post({ type: 'preview', guide }),\n closePreview: () => post({ type: 'close-preview' }),\n close: () => {\n post({ type: 'teardown' });\n if (useFrame) {\n if (frame) frame.src = 'about:blank';\n } else if (popup && !popup.closed) {\n popup.close();\n }\n cleanup();\n },\n };\n}\n\nfunction buildAppUrl(appUrl: string, token: string, dashboardOrigin: string): string {\n try {\n const u = new URL(appUrl, window.location.href);\n u.searchParams.set(BUILDER_TOKEN_PARAM, token);\n u.searchParams.set(BUILDER_ORIGIN_PARAM, dashboardOrigin);\n return u.toString();\n } catch {\n return appUrl;\n }\n}\n\nfunction safeOrigin(url: string): string | null {\n try {\n return new URL(url, window.location.href).origin;\n } catch {\n return null;\n }\n}\n\nfunction noopSession(): BuilderSession {\n return {\n startPicker: () => {},\n stopPicker: () => {},\n preview: () => {},\n closePreview: () => {},\n close: () => {},\n };\n}\n","/**\n * Plugin builder — herramientas no-code que corren DENTRO de la app del\n * cliente (no en el dashboard). Hoy: el element picker (inspector) para\n * elegir el ancla de una guía. Próximo: el puente postMessage con el\n * dashboard y la activación segura por `?veoBuilder=<token>`.\n */\n\nexport type {\n BlockDropPayload,\n BlockDropTargetHandle,\n} from './block-drop-target';\nexport { attachBlockDropTarget, VEO_BLOCK_MIME } from './block-drop-target';\nexport type {\n BuilderCommand,\n BuilderEvent,\n} from './bridge-protocol';\nexport type { BuilderModeHandle } from './builder-mode';\nexport { initBuilderMode } from './builder-mode';\nexport type { BuilderSession, BuilderSessionOptions } from './builder-session';\nexport { createBuilderSession } from './builder-session';\nexport type {\n DesignManipulatorHandle,\n DesignManipulatorOptions,\n DesignPatch,\n} from './design-manipulator';\nexport { attachDesignManipulator } from './design-manipulator';\nexport type { ElementPickerHandle, ElementPickerOptions, PickedElement } from './element-picker';\nexport { startElementPicker, stopElementPicker } from './element-picker';\n","/**\n * Tipos del contrato HTTP entre el SDK y el backend.\n * Versión 1.\n *\n * IMPORTANTE: Si cambias algo aquí, debes actualizar también:\n * - veo-backend/src/modules/identity/dto/*.dto.ts\n * - veo-backend/src/modules/ingest/dto/*.dto.ts\n * - CONTRACT.md\n */\n\nexport const SDK_VERSION = '0.0.1';\nexport const MAX_BATCH_SIZE = 100;\nexport const DEFAULT_FLUSH_INTERVAL_MS = 5000;\nexport const DEFAULT_FLUSH_BATCH_SIZE = 20;\n\n/**\n * Backend de Veo, horneado en el bundle. El consumidor NO configura la URL.\n * El valor se inyecta en build-time desde `VEO_API_URL` (ver tsup.config.ts);\n * el literal de aquí es solo el fallback para tests / builds sin esa env.\n * NO es secreta: va al bundle del navegador, igual que la `pk_`.\n */\nexport const DEFAULT_API_URL =\n process.env.VEO_API_URL || 'https://veo-backend-production-8c78.up.railway.app';\n\n/**\n * Tipos de eventos que el SDK envía.\n * Debe coincidir con el CHECK constraint de veo_user_actions.action_type.\n */\nexport type ActionType = 'pageview' | 'track' | 'identify' | 'guide';\n\n/**\n * Payload de un evento individual enviado al endpoint POST /v1/events.\n */\nexport interface ActionPayload {\n actionId: string; // UUID v7 generado en cliente\n endUserId: string;\n organizationId?: string;\n sessionId: string;\n actionType: ActionType;\n actionName?: string;\n occurredAt: string; // ISO 8601\n pageUrl?: string;\n pagePath?: string;\n pageTitle?: string;\n pageReferrer?: string;\n actionProperties?: Record<string, unknown>;\n}\n\n/**\n * Request del endpoint POST /v1/events.\n */\nexport interface IngestEventsRequest {\n events: ActionPayload[]; // máx 100\n}\n\n/**\n * Response del endpoint POST /v1/events.\n */\nexport interface IngestEventsResponse {\n accepted: number;\n deduped: number;\n}\n\n/**\n * Request del endpoint POST /v1/identify.\n */\nexport interface IdentifyRequest {\n endUser: {\n id: string;\n anonymousId?: string;\n traits?: Record<string, unknown>;\n };\n organization?: {\n id: string;\n attributes?: Record<string, unknown>;\n };\n}\n\n/**\n * Response del endpoint POST /v1/identify.\n */\nexport interface IdentifyResponse {\n endUserId: string;\n organizationId: string | null;\n workspaceId: string;\n}\n\n/**\n * Response de error estándar del backend.\n */\nexport interface ErrorResponse {\n error: string;\n details?: unknown;\n statusCode: number;\n}\n","import { DEFAULT_API_URL } from '../contract/v1';\n\n/**\n * Resuelve la URL del backend de Veo. NO es parte de la API pública: el\n * consumidor solo pasa `apiKey` y la URL va quemada en `DEFAULT_API_URL`.\n *\n * Orden de resolución (para desarrollo local / self-host, sin recompilar):\n * 1. `config.apiUrl` si viene (override interno, no tipado en `VeoConfig`).\n * 2. `window.__VEO_API_URL__` si está seteado ANTES de `init()`.\n * 3. `DEFAULT_API_URL` (el backend gestionado).\n */\nexport function resolveApiUrl(config?: unknown): string {\n const fromConfig = (config as { apiUrl?: unknown } | undefined)?.apiUrl;\n if (typeof fromConfig === 'string' && fromConfig.trim()) return fromConfig;\n\n const fromGlobal = (globalThis as { __VEO_API_URL__?: unknown }).__VEO_API_URL__;\n if (typeof fromGlobal === 'string' && fromGlobal.trim()) return fromGlobal;\n\n return DEFAULT_API_URL;\n}\n","/**\n * Carga perezosa del bundle del builder. El SDK de producción (`veo.js`) es\n * lo único que el cliente integra; cuando el dashboard abre la app con\n * `?veoBuilder=<token>`, este loader inyecta `veo-builder.js` (que se\n * auto-conecta). Así el modo no-code \"simplemente funciona\" sin que el\n * cliente tenga que instalar nada extra.\n *\n * No importa nada del plugin builder para no arrastrar su código al bundle\n * de producción (ver budget en CLAUDE.md). El nombre del query param debe\n * coincidir con `BUILDER_TOKEN_PARAM` de `plugins/builder/bridge-protocol`.\n */\nimport { hasDocument, hasWindow } from '../utils/safe-env';\nimport { resolveBuilderToken } from './builder-token';\n\n/**\n * `true` cuando la app corre en modo builder (URL con `?veoBuilder=<token>`, o\n * el token persistido en sessionStorage tras un redirect de auth). En ese modo\n * el editor pinta las guías vía PREVIEW; el runtime NO debe resolver/renderizar\n * las guías `live` o se duplicarían (la live del runtime + la preview del editor).\n */\nexport { isBuilderMode } from './builder-token';\n\nexport function maybeLoadBuilder(opts: {\n builderUrl?: string;\n debug?: boolean;\n apiKey?: string;\n apiUrl?: string;\n /**\n * Fallback para integraciones por bundler (sin `<script>` de dónde derivar la\n * URL): carga el builder con un `import()` dinámico. Lo pasa SOLO el entry\n * ESM/CJS (`index.ts`), así el bundler lo code-splitea (cero costo en prod, se\n * descarga solo en modo builder). El IIFE NO lo pasa (usa el `<script>`).\n */\n loadBuilder?: () => Promise<unknown>;\n}): void {\n if (!hasWindow() || !hasDocument()) return;\n\n // Lee el token de la URL o de sessionStorage (sobrevive al redirect que tira\n // el query string) y persiste el de la URL apenas lo ve. Sin token → no-op.\n if (resolveBuilderToken() === null) return;\n\n // Dejamos apiKey/apiUrl en un global para que el modo builder VERIFIQUE el\n // token contra el backend (`/v1/builder/verify`) antes de activarse. Solo se\n // setea cuando el builder se carga desde `init()` (integración real); en\n // demos que cargan veo-builder.js a mano no existe → verificación best-effort.\n if (opts.apiKey && opts.apiUrl) {\n (window as unknown as { __veoBuilder?: unknown }).__veoBuilder = {\n apiKey: opts.apiKey,\n apiUrl: opts.apiUrl,\n };\n }\n\n // Ya cargado (el IIFE expone window.veoBuilder).\n if ((window as unknown as { veoBuilder?: unknown }).veoBuilder) return;\n\n const url = opts.builderUrl ?? deriveBuilderUrl();\n if (url) {\n if (document.querySelector(`script[src=\"${url}\"]`)) return;\n const script = document.createElement('script');\n script.src = url;\n script.async = true;\n if (opts.debug) {\n script.addEventListener('error', () => console.error('[veo] no pude cargar', url));\n }\n document.head.appendChild(script);\n return;\n }\n\n // Integración por bundler: no hay `<script>` que derivar. Cargamos el builder\n // con el `import()` dinámico que pasó el entry ESM/CJS. El consumidor NO tiene\n // que copiar `veo-builder.js` ni setear `builderUrl`: \"simplemente funciona\".\n if (opts.loadBuilder) {\n void opts.loadBuilder().catch((err) => {\n if (opts.debug) console.error('[veo] no pude cargar el builder (import dinámico)', err);\n });\n return;\n }\n\n if (opts.debug) {\n console.warn('[veo] builder mode pedido pero no pude resolver la URL de veo-builder.js');\n }\n}\n\n/** Deriva `veo-builder.js` del `<script>` que cargó `veo.js`. */\nfunction deriveBuilderUrl(): string | null {\n const scripts = document.querySelectorAll<HTMLScriptElement>('script[src]');\n for (const script of Array.from(scripts)) {\n if (/\\bveo(\\.min)?\\.js(\\?.*)?$/.test(script.src)) {\n return script.src.replace(/\\bveo(\\.min)?\\.js/, 'veo-builder$1.js');\n }\n }\n return null;\n}\n","/**\n * Detección del modo PREVIEW POR LINK (`?veoPreview=<token>`). El core solo\n * detecta el param — el canje del token y el render viven en el bundle de\n * guías (`plugins/guides/preview-mode.ts`), que el caller carga\n * (estático en `index.ts`, lazy en `veo.ts`).\n *\n * El nombre del query param es parte del contrato con el dashboard (el link\n * generado por «Previsualizar en mi app»).\n */\nimport { hasWindow } from '../utils/safe-env';\n\nexport const PREVIEW_TOKEN_PARAM = 'veoPreview';\n/**\n * El token se PERSISTE en sessionStorage: al navegar entre páginas de la app la\n * URL pierde `?veoPreview`, y sin esto el modo preview (y su chip de control) se\n * apagaba al saltar de página. sessionStorage sobrevive la navegación de la\n * pestaña y muere al cerrarla — justo el alcance de una sesión de preview.\n */\nconst PREVIEW_TOKEN_KEY = 'veo:preview_token';\n\nfunction session(): Storage | null {\n try {\n return window.sessionStorage;\n } catch {\n return null; // modo privado / sandbox: seguimos solo con la URL\n }\n}\n\n/**\n * Token del link de preview. Lo toma de la URL (`?veoPreview`) y lo persiste; si\n * la URL no lo trae (navegó a otra página), lo recupera de sessionStorage.\n * `null` si no hay ninguno. Se limpia con {@link clearPreviewToken}.\n */\nexport function getPreviewToken(): string | null {\n if (!hasWindow()) return null;\n let fromUrl: string | null = null;\n try {\n const value = new URLSearchParams(window.location.search).get(PREVIEW_TOKEN_PARAM);\n fromUrl = value ? value : null;\n } catch {\n fromUrl = null;\n }\n const store = session();\n if (fromUrl) {\n try {\n store?.setItem(PREVIEW_TOKEN_KEY, fromUrl);\n } catch {\n // no-op: sin storage seguimos con el token de la URL\n }\n return fromUrl;\n }\n try {\n return store?.getItem(PREVIEW_TOKEN_KEY) || null;\n } catch {\n return null;\n }\n}\n\n/** Sale del modo preview: borra el token persistido (lo llama el chip al cerrar). */\nexport function clearPreviewToken(): void {\n try {\n session()?.removeItem(PREVIEW_TOKEN_KEY);\n } catch {\n // no-op\n }\n}\n\n/**\n * `true` cuando la app corre en modo preview-por-link. Igual que en modo\n * builder, el runtime NO debe instalar el plugin de guías: las guías live\n * taparían/duplicarían la guía que se está previsualizando.\n */\nexport function isPreviewMode(): boolean {\n return getPreviewToken() !== null;\n}\n","import type { VeoPlugin } from '../types';\n\n/**\n * Helper de identidad para definir un plugin con inferencia de tipos.\n * No transforma nada; mejora la ergonomía y deja un punto de extensión futuro.\n */\nexport function definePlugin(plugin: VeoPlugin): VeoPlugin {\n return plugin;\n}\n","import type { VeoAutocaptureConfig, VeoClient } from '../../types';\nimport { hasDocument } from '../../utils/safe-env';\nimport { DEFAULT_AUTOCAPTURE_CONFIG, MAX_ANCESTORS } from './constants';\nimport { buildAutocapturePayload } from './element-serializer';\nimport { isElementBlocked } from './pii-guard';\nimport { ElementThrottle } from './throttle';\n\ntype AutocaptureEvent = 'click' | 'submit' | 'change';\n\n/**\n * Instala listeners delegados en `document` y traduce las interacciones del\n * usuario en eventos `$autocapture`. Nunca lanza hacia la app del cliente:\n * cada handler está envuelto en try/catch.\n */\nexport class DomListener {\n private readonly throttle: ElementThrottle;\n private readonly config: Required<VeoAutocaptureConfig>;\n private cleanups: Array<() => void> = [];\n\n constructor(\n private readonly client: VeoClient,\n config: VeoAutocaptureConfig,\n ) {\n const d = DEFAULT_AUTOCAPTURE_CONFIG;\n // Resolver el config de forma explícita: el merge por spread reintroduce\n // `| undefined` y no satisface `Required<VeoAutocaptureConfig>`.\n this.config = {\n enabled: config.enabled ?? d.enabled,\n captureClicks: config.captureClicks ?? d.captureClicks,\n captureSubmits: config.captureSubmits ?? d.captureSubmits,\n captureChanges: config.captureChanges ?? d.captureChanges,\n maskAllInputs: config.maskAllInputs ?? d.maskAllInputs,\n maskAllText: config.maskAllText ?? d.maskAllText,\n blockSelectors: config.blockSelectors ?? [],\n throttleMs: config.throttleMs ?? d.throttleMs,\n maxTextLength: config.maxTextLength ?? d.maxTextLength,\n captureElementMetadata: config.captureElementMetadata ?? d.captureElementMetadata,\n captureAncestors: Math.min(config.captureAncestors ?? d.captureAncestors, MAX_ANCESTORS),\n };\n this.throttle = new ElementThrottle(this.config.throttleMs);\n }\n\n install(): void {\n if (!hasDocument() || !this.config.enabled) return;\n\n if (this.config.captureClicks) this.attach('click', (e) => this.handleClick(e));\n if (this.config.captureSubmits) this.attach('submit', (e) => this.handleSubmit(e), true);\n if (this.config.captureChanges) this.attach('change', (e) => this.handleChange(e), true);\n }\n\n destroy(): void {\n for (const cleanup of this.cleanups) cleanup();\n this.cleanups = [];\n }\n\n private attach(\n eventName: AutocaptureEvent,\n handler: (e: Event) => void,\n useCapture = false,\n ): void {\n const listener = (e: Event) => {\n // Solo eventos reales del usuario (los sintéticos tienen isTrusted=false).\n if (!e.isTrusted) return;\n try {\n handler(e);\n } catch {\n // Nunca romper la app del cliente; descartamos el evento silenciosamente.\n }\n };\n document.addEventListener(eventName, listener, useCapture);\n this.cleanups.push(() => document.removeEventListener(eventName, listener, useCapture));\n }\n\n private handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n // Subir hasta el elemento \"interesante\" (botón, link, [role], etc.).\n // Si NO hay ninguno (click en zona vacía/no interactiva, p. ej. <html>),\n // no emitimos: evita ruido y volumen innecesario de eventos.\n const meaningful = this.findMeaningfulAncestor(target);\n if (!meaningful) return;\n if (isElementBlocked(meaningful, this.config.blockSelectors)) return;\n if (!this.throttle.shouldFire(meaningful)) return;\n\n this.emit('click', meaningful);\n }\n\n private handleSubmit(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element) || target.tagName.toLowerCase() !== 'form') return;\n if (isElementBlocked(target, this.config.blockSelectors)) return;\n if (!this.throttle.shouldFire(target)) return;\n\n this.emit('submit', target);\n }\n\n private handleChange(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const tag = target.tagName.toLowerCase();\n if (tag !== 'select' && tag !== 'input' && tag !== 'textarea') return;\n\n // Para text inputs el change sería spam/PII; solo checkbox/radio (y selects).\n if (\n target instanceof HTMLInputElement &&\n target.type !== 'checkbox' &&\n target.type !== 'radio'\n ) {\n return;\n }\n if (isElementBlocked(target, this.config.blockSelectors)) return;\n if (!this.throttle.shouldFire(target)) return;\n\n this.emit('change', target);\n }\n\n /** Busca hacia arriba un ancestro \"interactivo\". Devuelve null si no hay ninguno. */\n private findMeaningfulAncestor(element: Element): Element | null {\n let current: Element | null = element;\n let depth = 0;\n\n while (current && current !== document.documentElement && depth < 5) {\n const tag = current.tagName.toLowerCase();\n const isInteractive =\n tag === 'button' ||\n tag === 'a' ||\n tag === 'input' ||\n tag === 'select' ||\n tag === 'textarea' ||\n current.hasAttribute('data-veo-tag') ||\n current.hasAttribute('role') ||\n current.hasAttribute('onclick') ||\n (current instanceof HTMLElement && current.style.cursor === 'pointer');\n\n if (isInteractive) return current;\n current = current.parentElement;\n depth++;\n }\n\n return null;\n }\n\n private emit(eventType: AutocaptureEvent, element: Element): void {\n const payload = buildAutocapturePayload(eventType, element, this.config);\n this.client.track('$autocapture', payload as unknown as Record<string, unknown>);\n }\n}\n","import { PRIORITY_ATTRIBUTES } from './constants';\nimport { isSensitiveAttribute, safeGetText } from './pii-guard';\nimport { buildSelectorPath, filterHumanClasses } from './selector-builder';\n\nexport interface SerializedElement {\n tag: string;\n id: string | null;\n classes: string[];\n text: string;\n attributes: Record<string, string>;\n position: { x: number; y: number; w: number; h: number };\n}\n\nexport interface SerializedAncestor {\n tag: string;\n id: string | null;\n classes: string[];\n veoTag: string | null;\n}\n\nexport interface AutocapturePayload {\n $event_type: 'click' | 'submit' | 'change';\n $element: SerializedElement;\n $ancestors: SerializedAncestor[];\n $selector_path: string;\n $page_url: string;\n $page_path: string;\n}\n\ninterface SerializeConfig {\n maxTextLength: number;\n maskAllText: boolean;\n captureElementMetadata: boolean;\n}\n\n/** Extrae los atributos relevantes del elemento, filtrando los sensibles. */\nfunction extractPriorityAttributes(element: Element): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const attrName of PRIORITY_ATTRIBUTES) {\n const value = element.getAttribute(attrName);\n if (value !== null && !isSensitiveAttribute(attrName) && value.length < 256) {\n result[attrName] = value;\n }\n }\n\n return result;\n}\n\n/** Serializa un elemento DOM a un objeto plano para enviar al backend. */\nexport function serializeElement(element: Element, config: SerializeConfig): SerializedElement {\n const rect = element.getBoundingClientRect();\n\n return {\n tag: element.tagName.toLowerCase(),\n id: element.id || null,\n classes: filterHumanClasses(element),\n text: safeGetText(element, config.maxTextLength, config.maskAllText),\n attributes: config.captureElementMetadata ? extractPriorityAttributes(element) : {},\n position: {\n x: Math.round(rect.left + window.scrollX),\n y: Math.round(rect.top + window.scrollY),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n },\n };\n}\n\n/** Captura los ancestros del elemento (para tagging contextual en el dashboard). */\nexport function serializeAncestors(element: Element, maxDepth: number): SerializedAncestor[] {\n const ancestors: SerializedAncestor[] = [];\n let current: Element | null = element.parentElement;\n let depth = 0;\n\n while (current && current !== document.documentElement && depth < maxDepth) {\n ancestors.push({\n tag: current.tagName.toLowerCase(),\n id: current.id || null,\n classes: filterHumanClasses(current),\n veoTag: current.getAttribute('data-veo-tag') || null,\n });\n current = current.parentElement;\n depth++;\n }\n\n return ancestors;\n}\n\n/** Construye el payload completo para el evento `$autocapture`. */\nexport function buildAutocapturePayload(\n eventType: 'click' | 'submit' | 'change',\n element: Element,\n config: SerializeConfig & { captureAncestors: number },\n): AutocapturePayload {\n return {\n $event_type: eventType,\n $element: serializeElement(element, config),\n $ancestors: serializeAncestors(element, config.captureAncestors),\n $selector_path: buildSelectorPath(element, config.captureAncestors),\n $page_url: window.location.href,\n $page_path: window.location.pathname,\n };\n}\n","import { ALWAYS_BLOCK_SELECTORS, SENSITIVE_ATTRIBUTES } from './constants';\n\n/**\n * Verifica si un elemento o ALGUNO de sus ancestros está en la blacklist.\n * Recorre hacia arriba para que bloquear un contenedor bloquee su subárbol.\n */\nexport function isElementBlocked(element: Element, extraBlockSelectors: string[] = []): boolean {\n const allBlockers = [...ALWAYS_BLOCK_SELECTORS, ...extraBlockSelectors];\n let current: Element | null = element;\n\n while (current && current !== document.documentElement) {\n for (const selector of allBlockers) {\n try {\n if (current.matches(selector)) return true;\n } catch {\n // Selector inválido o no soportado por el motor: ignorar y seguir.\n }\n }\n current = current.parentElement;\n }\n\n return false;\n}\n\n/** Verifica si un atributo es sensible y debe omitirse. */\nexport function isSensitiveAttribute(attrName: string): boolean {\n const lower = attrName.toLowerCase();\n return SENSITIVE_ATTRIBUTES.includes(lower) || /password|secret|token|ssn|credit/i.test(attrName);\n}\n\n/** Obtiene el texto visible de un elemento, respetando privacidad. */\nexport function safeGetText(element: Element, maxLength: number, mask: boolean): string {\n if (mask) return '';\n\n // Nunca capturar texto de campos de entrada (puede contener lo que el usuario escribe).\n const tagName = element.tagName.toLowerCase();\n if (tagName === 'input' || tagName === 'textarea') return '';\n\n // `innerText` no existe en jsdom; el fallback a `textContent` lo cubre.\n const raw =\n (element instanceof HTMLElement ? element.innerText : '') || element.textContent || '';\n const trimmed = raw.trim().replace(/\\s+/g, ' ');\n\n return trimmed.length > maxLength ? `${trimmed.slice(0, maxLength)}…` : trimmed;\n}\n","/**\n * Throttle por elemento: evita duplicar eventos del mismo target dentro de una\n * ventana de N ms. Usa un WeakMap para no retener elementos en memoria.\n */\nexport class ElementThrottle {\n private lastFired = new WeakMap<Element, number>();\n\n constructor(private readonly windowMs: number) {}\n\n /** Devuelve true si el elemento puede emitir ahora (y registra el disparo). */\n shouldFire(element: Element): boolean {\n const now = Date.now();\n const last = this.lastFired.get(element) ?? 0;\n\n if (now - last < this.windowMs) return false;\n\n this.lastFired.set(element, now);\n return true;\n }\n}\n","import type { VeoAutocaptureConfig, VeoPlugin } from '../../types';\nimport { definePlugin } from '../plugin';\nimport { DomListener } from './dom-listener';\n\n/**\n * Plugin de autocaptura de eventos del DOM.\n * Captura clicks, submits y changes automáticamente y los emite como\n * eventos `track('$autocapture', …)` por la Queue del cliente.\n */\nexport function autocapturePlugin(config: VeoAutocaptureConfig = {}): VeoPlugin {\n let listener: DomListener | null = null;\n\n return definePlugin({\n name: 'autocapture',\n install(client) {\n listener = new DomListener(client, config);\n listener.install();\n },\n destroy() {\n listener?.destroy();\n listener = null;\n },\n });\n}\n\nexport { DomListener } from './dom-listener';\nexport type { AutocapturePayload } from './element-serializer';\n","import type { VeoPlugin } from '../types';\nimport { hasWindow } from '../utils/safe-env';\nimport { definePlugin } from './plugin';\n\n/**\n * Plugin que auto-emite `pageview` en cambios de ruta de una SPA.\n * Cubre `history.pushState`, `history.replaceState`, `popstate` y `hashchange`.\n */\nexport function spaRouterPlugin(): VeoPlugin {\n return definePlugin({\n name: 'spa-router',\n install(client) {\n if (!hasWindow()) return;\n\n // Pageview inicial.\n client.pageview();\n\n const fire = () => {\n // Diferir para que el router del host actualice location.pathname primero.\n queueMicrotask(() => client.pageview());\n };\n\n const origPushState = window.history.pushState;\n const origReplaceState = window.history.replaceState;\n\n window.history.pushState = function (\n this: History,\n ...args: Parameters<History['pushState']>\n ): void {\n origPushState.apply(this, args);\n fire();\n };\n\n window.history.replaceState = function (\n this: History,\n ...args: Parameters<History['replaceState']>\n ): void {\n origReplaceState.apply(this, args);\n fire();\n };\n\n window.addEventListener('popstate', fire);\n window.addEventListener('hashchange', fire);\n },\n });\n}\n","import type { ActionPayload, ActionType, IdentifyRequest } from '../contract/v1';\nimport { DEFAULT_FLUSH_BATCH_SIZE, DEFAULT_FLUSH_INTERVAL_MS, SDK_VERSION } from '../contract/v1';\nimport type {\n VeoClient,\n VeoClientEventListener,\n VeoClientEventName,\n VeoClientEvents,\n VeoConfig,\n VeoOrganization,\n VeoPlugin,\n VeoVisitor,\n} from '../types';\nimport { hasDocument, hasWindow } from '../utils/safe-env';\nimport { uuidv7 } from '../utils/uuid';\nimport { resolveApiUrl } from './api-url';\nimport { Queue } from './queue';\nimport { Session } from './session';\nimport { createStorage, type StorageAdapter } from './storage';\nimport { Transport } from './transport';\n\nconst ORGANIZATION_ID_KEY = 'organization_id';\nconst END_USER_ID_KEY = 'end_user_id';\nconst IDENTIFY_SIG_KEY = 'identify_signature';\n\n/**\n * `JSON.stringify` con claves ordenadas (recursivo) para que la firma de\n * identidad sea estable sin importar el orden en que la app arme el objeto\n * de traits/attributes. Sin esto, `{a,b}` y `{b,a}` darían firmas distintas\n * y el identify se reenviaría sin que nada haya cambiado.\n */\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? 'null';\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`;\n const entries = Object.keys(value as Record<string, unknown>)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${stableStringify((value as Record<string, unknown>)[k])}`);\n return `{${entries.join(',')}}`;\n}\n\n/** Campos opcionales que cada API pública aporta al construir el evento. */\ninterface EnqueueInput {\n actionType: ActionType;\n actionName?: string;\n pageUrl?: string;\n pagePath?: string;\n pageTitle?: string;\n pageReferrer?: string;\n actionProperties?: Record<string, unknown>;\n}\n\n/**\n * Cliente principal del SDK. Expone la API pública (`identify`, `track`,\n * `pageview`, `reset`, `flush`, `use`). Toda la API salvo `flush()` es síncrona:\n * los eventos se encolan y la llamada retorna de inmediato.\n */\nexport class Client implements VeoClient {\n private readonly transport: Transport;\n private readonly storage: StorageAdapter;\n private readonly session: Session;\n private readonly queue: Queue<ActionPayload>;\n private readonly plugins: VeoPlugin[] = [];\n private currentOrganizationId: string | null = null;\n private readonly listeners: {\n [E in VeoClientEventName]: Set<VeoClientEventListener<E>>;\n } = {\n pageview: new Set(),\n identify: new Set(),\n };\n\n constructor(private readonly config: VeoConfig) {\n if (!config.apiKey) throw new Error('apiKey is required');\n\n this.storage = createStorage(config.storage ?? 'localStorage');\n this.session = new Session(this.storage);\n\n this.transport = new Transport({\n apiKey: config.apiKey,\n apiUrl: resolveApiUrl(config).replace(/\\/$/, ''),\n sdkVersion: SDK_VERSION,\n });\n\n this.queue = new Queue<ActionPayload>({\n transport: this.transport,\n flushIntervalMs: config.flushInterval ?? DEFAULT_FLUSH_INTERVAL_MS,\n batchSize: config.flushBatchSize ?? DEFAULT_FLUSH_BATCH_SIZE,\n onError: (err) => {\n if (config.debug) console.error('[veo] flush error:', err);\n },\n });\n\n // Rehidratar identidad persistida.\n const persistedUserId = this.storage.get(END_USER_ID_KEY);\n if (persistedUserId) this.session.setEndUserId(persistedUserId);\n\n const persistedOrgId = this.storage.get(ORGANIZATION_ID_KEY);\n if (persistedOrgId) this.currentOrganizationId = persistedOrgId;\n\n this.setupUnloadHandlers();\n\n if (config.debug) {\n console.log('[veo] initialized', {\n anonymousId: this.session.anonymousId,\n sessionId: this.session.sessionId,\n endUserId: this.session.endUserId,\n });\n }\n }\n\n identify(payload: { visitor: VeoVisitor; organization?: VeoOrganization }): void {\n const { visitor, organization } = payload;\n\n // Idempotencia: si ya estamos identificados como este visitor y ni los\n // traits ni la organización cambiaron, no reenviamos. Esto evita el spam\n // de identify cuando la app lo llama en cada carga/navegación (un patrón\n // común y recomendado): el SDK absorbe la repetición en vez de generar un\n // evento `identify` y un POST /v1/identify por cada render.\n const signature = stableStringify({\n id: visitor.id,\n traits: visitor.traits ?? {},\n org: organization ? { id: organization.id, attributes: organization.attributes ?? {} } : null,\n });\n if (this.session.endUserId === visitor.id && this.storage.get(IDENTIFY_SIG_KEY) === signature) {\n if (this.config.debug) console.debug('[veo] identify: sin cambios, omitido');\n return;\n }\n\n // Capturar el anonymous previo ANTES de mutar la identidad, para el merge en backend.\n const previousAnonymousId =\n this.session.endUserId === null ? this.session.anonymousId : undefined;\n\n this.session.setEndUserId(visitor.id);\n if (organization) {\n this.currentOrganizationId = organization.id;\n this.storage.set(ORGANIZATION_ID_KEY, organization.id);\n }\n\n // 1. Upsert de traits/attributes en /v1/identify (fire-and-forget).\n const endUser: IdentifyRequest['endUser'] = {\n id: visitor.id,\n traits: visitor.traits ?? {},\n ...(previousAnonymousId !== undefined ? { anonymousId: previousAnonymousId } : {}),\n };\n const body: IdentifyRequest = {\n endUser,\n ...(organization\n ? { organization: { id: organization.id, attributes: organization.attributes ?? {} } }\n : {}),\n };\n void this.transport.send('/v1/identify', body).catch((err) => {\n if (this.config.debug) console.error('[veo] identify failed:', err);\n });\n\n // 2. Registrar el evento \"identify\" en el log de acciones.\n this.enqueue({\n actionType: 'identify',\n actionProperties: {\n traits: visitor.traits,\n organizationAttributes: organization?.attributes,\n },\n });\n\n this.storage.set(IDENTIFY_SIG_KEY, signature);\n\n this.emit('identify', { endUserId: visitor.id, sessionId: this.session.sessionId });\n }\n\n track(name: string, properties?: Record<string, unknown>): void {\n if (!name || typeof name !== 'string') {\n if (this.config.debug) console.error('[veo] track: name is required');\n return;\n }\n this.enqueue({\n actionType: 'track',\n actionName: name,\n ...(properties !== undefined ? { actionProperties: properties } : {}),\n });\n }\n\n pageview(path?: string): void {\n if (!hasDocument()) return;\n\n const url = window.location.href;\n const pagePath = path ?? window.location.pathname;\n\n this.enqueue({\n actionType: 'pageview',\n pageUrl: url,\n pagePath,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n });\n\n this.emit('pageview', {\n url,\n path: pagePath,\n sessionId: this.session.sessionId,\n endUserId: this.session.endUserId,\n });\n }\n\n reset(): void {\n this.session.reset();\n this.currentOrganizationId = null;\n this.storage.remove(ORGANIZATION_ID_KEY);\n this.storage.remove(END_USER_ID_KEY);\n this.storage.remove(IDENTIFY_SIG_KEY);\n }\n\n flush(): Promise<void> {\n return this.queue.flush();\n }\n\n use(plugin: VeoPlugin): VeoClient {\n this.plugins.push(plugin);\n plugin.install(this);\n return this;\n }\n\n getEndUserId(): string | null {\n return this.session.endUserId;\n }\n\n getAnonymousId(): string {\n return this.session.anonymousId;\n }\n\n getSessionId(): string {\n return this.session.sessionId;\n }\n\n /**\n * Suscribe `listener` a `event`. Devuelve una función para desuscribir.\n * Los errores en listeners se logean en debug mode pero NO se propagan\n * (un plugin no debe poder romper a otro).\n */\n on<E extends VeoClientEventName>(event: E, listener: VeoClientEventListener<E>): () => void {\n this.listeners[event].add(listener);\n return () => {\n this.listeners[event].delete(listener);\n };\n }\n\n private emit<E extends VeoClientEventName>(event: E, payload: VeoClientEvents[E]): void {\n for (const listener of this.listeners[event]) {\n try {\n listener(payload);\n } catch (err) {\n if (this.config.debug) console.error(`[veo] listener for '${event}' failed:`, err);\n }\n }\n }\n\n /**\n * Construye el evento completo y lo agrega a la queue. Omite los campos\n * opcionales no definidos (exigido por `exactOptionalPropertyTypes`).\n * @internal\n */\n private enqueue(input: EnqueueInput): void {\n this.session.touch();\n\n const organizationId = this.currentOrganizationId ?? undefined;\n const pageUrl = input.pageUrl ?? (hasWindow() ? window.location.href : undefined);\n const pagePath = input.pagePath ?? (hasWindow() ? window.location.pathname : undefined);\n const pageTitle = input.pageTitle ?? (hasDocument() ? document.title : undefined);\n const pageReferrer = input.pageReferrer ?? (hasDocument() ? document.referrer : undefined);\n\n const event: ActionPayload = {\n actionId: uuidv7(),\n endUserId: this.session.effectiveUserId,\n sessionId: this.session.sessionId,\n actionType: input.actionType,\n occurredAt: new Date().toISOString(),\n ...(organizationId !== undefined ? { organizationId } : {}),\n ...(input.actionName !== undefined ? { actionName: input.actionName } : {}),\n ...(pageUrl !== undefined ? { pageUrl } : {}),\n ...(pagePath !== undefined ? { pagePath } : {}),\n ...(pageTitle !== undefined ? { pageTitle } : {}),\n ...(pageReferrer !== undefined ? { pageReferrer } : {}),\n ...(input.actionProperties !== undefined ? { actionProperties: input.actionProperties } : {}),\n };\n\n this.queue.add(event);\n }\n\n private setupUnloadHandlers(): void {\n if (!hasWindow()) return;\n\n window.addEventListener('pagehide', () => this.queue.flushBeacon());\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.queue.flushBeacon();\n }\n });\n }\n}\n","import type { Transport } from './transport';\n\nexport interface QueueConfig {\n transport: Transport;\n flushIntervalMs: number;\n batchSize: number;\n maxRetries?: number;\n onError?: (error: Error) => void;\n}\n\nconst RETRY_MAX_DELAY_MS = 30000;\n\n/**\n * Buffer de eventos con envío en batch, flush por intervalo o por tamaño, y\n * reintentos con backoff exponencial ante fallos de red. Los eventos que fallan\n * se re-encolan al inicio para preservar el orden.\n */\nexport class Queue<T = unknown> {\n private buffer: T[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushing = false;\n private retryCount = 0;\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private readonly config: QueueConfig) {\n this.startTimer();\n }\n\n /** Encola un evento; dispara flush si se alcanza `batchSize`. */\n add(item: T): void {\n this.buffer.push(item);\n if (this.buffer.length >= this.config.batchSize) {\n void this.flush();\n }\n }\n\n /** Flush manual vía `fetch`. Resuelve cuando termina (los retries son diferidos). */\n async flush(): Promise<void> {\n if (this.flushing || this.buffer.length === 0) return;\n\n this.flushing = true;\n const batch = this.buffer.splice(0, this.buffer.length);\n\n try {\n await this.config.transport.send('/v1/events', { events: batch });\n this.retryCount = 0;\n } catch (error) {\n // Re-encolar al INICIO para preservar el orden cronológico.\n this.buffer.unshift(...batch);\n this.scheduleRetry();\n this.config.onError?.(error as Error);\n } finally {\n this.flushing = false;\n }\n }\n\n /** Flush síncrono vía `sendBeacon`, para `pagehide`/`visibilitychange`. */\n flushBeacon(): void {\n if (this.buffer.length === 0) return;\n const batch = this.buffer.splice(0, this.buffer.length);\n const success = this.config.transport.sendBeacon('/v1/events', { events: batch });\n if (!success) {\n // La página se está cerrando; re-encolar es poco útil pero evita pérdida si no se cierra.\n this.buffer.unshift(...batch);\n }\n }\n\n /** Detiene timers internos. Llamar al destruir el cliente. */\n destroy(): void {\n if (this.timer) clearInterval(this.timer);\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.timer = null;\n this.retryTimer = null;\n }\n\n private startTimer(): void {\n this.timer = setInterval(() => {\n void this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private scheduleRetry(): void {\n const maxRetries = this.config.maxRetries ?? 3;\n if (this.retryCount >= maxRetries) {\n this.retryCount = 0;\n return;\n }\n\n this.retryCount++;\n // Backoff exponencial: 1s, 2s, 4s, 8s... con tope de 30s, MÁS jitter.\n // Sin jitter, ante un 5xx del backend TODOS los clientes reintentan en\n // lockstep (1s, 2s, 4s…) y amplifican el pico justo cuando está degradado.\n // Equal jitter: mitad fija + mitad aleatoria → desincroniza la horda.\n const base = Math.min(1000 * 2 ** (this.retryCount - 1), RETRY_MAX_DELAY_MS);\n const delayMs = base / 2 + Math.random() * (base / 2);\n\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.retryTimer = setTimeout(() => {\n void this.flush();\n }, delayMs);\n }\n}\n","import { uuidv7 } from '../utils/uuid';\nimport type { StorageAdapter } from './storage';\n\nconst ANONYMOUS_ID_KEY = 'anonymous_user_id';\nconst END_USER_ID_KEY = 'end_user_id';\nconst SESSION_ID_KEY = 'session_id';\nconst SESSION_LAST_ACTIVE_KEY = 'session_last_active';\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutos\n\n/**\n * Gestiona la identidad triple del SDK:\n * - `anonymousId`: persiste indefinidamente (≥ 1 año).\n * - `endUserId`: presente tras `identify()`.\n * - `sessionId`: se renueva tras 30 min de inactividad.\n */\nexport class Session {\n private _anonymousId: string;\n private _sessionId: string;\n private _endUserId: string | null = null;\n\n constructor(private readonly storage: StorageAdapter) {\n this._anonymousId = this.loadOrCreateAnonymousId();\n this._sessionId = this.loadOrCreateSession();\n // Restaurar la identidad persistida: sin esto el SDK \"olvida\" al usuario\n // en cada recarga y los eventos posteriores caen al anonymous_id hasta\n // que la app vuelva a llamar identify(). Persistimos end_user_id en\n // setEndUserId(), así que también hay que rehidratarlo aquí.\n this._endUserId = this.storage.get(END_USER_ID_KEY);\n }\n\n get anonymousId(): string {\n return this._anonymousId;\n }\n\n get sessionId(): string {\n return this._sessionId;\n }\n\n get endUserId(): string | null {\n return this._endUserId;\n }\n\n /** ID a usar como visitor en eventos (end_user_id si está identificado, si no anonymous). */\n get effectiveUserId(): string {\n return this._endUserId ?? this._anonymousId;\n }\n\n setEndUserId(id: string): void {\n this._endUserId = id;\n this.storage.set(END_USER_ID_KEY, id);\n }\n\n /** Renueva el timestamp de actividad. Si pasaron > 30 min, genera nueva sesión. */\n touch(): void {\n const lastActive = this.storage.get(SESSION_LAST_ACTIVE_KEY);\n const now = Date.now();\n\n if (lastActive && now - Number.parseInt(lastActive, 10) > SESSION_TIMEOUT_MS) {\n this._sessionId = uuidv7();\n this.storage.set(SESSION_ID_KEY, this._sessionId);\n }\n\n this.storage.set(SESSION_LAST_ACTIVE_KEY, String(now));\n }\n\n /** Limpia la identidad (reset) pero conserva el anonymous_id. */\n reset(): void {\n this._endUserId = null;\n this.storage.remove(END_USER_ID_KEY);\n // Regenerar sesión.\n this._sessionId = uuidv7();\n this.storage.set(SESSION_ID_KEY, this._sessionId);\n this.storage.set(SESSION_LAST_ACTIVE_KEY, String(Date.now()));\n }\n\n private loadOrCreateAnonymousId(): string {\n let id = this.storage.get(ANONYMOUS_ID_KEY);\n if (!id) {\n id = uuidv7();\n this.storage.set(ANONYMOUS_ID_KEY, id);\n }\n return id;\n }\n\n private loadOrCreateSession(): string {\n const existing = this.storage.get(SESSION_ID_KEY);\n const lastActive = this.storage.get(SESSION_LAST_ACTIVE_KEY);\n\n if (existing && lastActive) {\n const elapsed = Date.now() - Number.parseInt(lastActive, 10);\n if (elapsed < SESSION_TIMEOUT_MS) {\n return existing;\n }\n }\n\n const newId = uuidv7();\n this.storage.set(SESSION_ID_KEY, newId);\n this.storage.set(SESSION_LAST_ACTIVE_KEY, String(Date.now()));\n return newId;\n }\n}\n","import { hasDocument, hasLocalStorage } from '../utils/safe-env';\n\n/**\n * Contrato común de todos los backends de almacenamiento persistente.\n * Las claves se guardan internamente con el prefijo `veo:`.\n */\nexport interface StorageAdapter {\n get(key: string): string | null;\n set(key: string, value: string, options?: { ttlMs?: number }): void;\n remove(key: string): void;\n /** Borra únicamente las claves del SDK (prefijo `veo:`). */\n clear(): void;\n}\n\nconst STORAGE_PREFIX = 'veo:';\n/** TTL por defecto para cookies (1 año), satisface la persistencia del anonymous id. */\nconst ONE_YEAR_MS = 365 * 24 * 60 * 60 * 1000;\n\n/** Backend basado en `localStorage`. Persistencia indefinida (ignora `ttlMs`). */\nclass LocalStorageAdapter implements StorageAdapter {\n get(key: string): string | null {\n return localStorage.getItem(STORAGE_PREFIX + key);\n }\n\n set(key: string, value: string): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + key, value);\n } catch {\n // Cuota llena o storage bloqueado: ignorar silenciosamente.\n }\n }\n\n remove(key: string): void {\n localStorage.removeItem(STORAGE_PREFIX + key);\n }\n\n clear(): void {\n const toRemove: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(STORAGE_PREFIX)) toRemove.push(key);\n }\n for (const key of toRemove) localStorage.removeItem(key);\n }\n}\n\n/** Lee y trocea `document.cookie`. Solo se invoca cuando hay `document`. */\nfunction readCookies(): string[] {\n const raw = document.cookie;\n return raw === '' ? [] : raw.split('; ');\n}\n\n/** Backend basado en cookies de primer nivel. Usa `ttlMs` (default 1 año). */\nclass CookieAdapter implements StorageAdapter {\n get(key: string): string | null {\n const name = `${STORAGE_PREFIX}${key}=`;\n for (const cookie of readCookies()) {\n if (cookie.startsWith(name)) {\n return decodeURIComponent(cookie.slice(name.length));\n }\n }\n return null;\n }\n\n set(key: string, value: string, options?: { ttlMs?: number }): void {\n const maxAgeSec = Math.floor((options?.ttlMs ?? ONE_YEAR_MS) / 1000);\n const secure =\n typeof location !== 'undefined' && location.protocol === 'https:' ? '; Secure' : '';\n // biome-ignore lint/suspicious/noDocumentCookie: necesitamos escritura síncrona y cero deps; la Cookie Store API es async y no universal.\n document.cookie = `${STORAGE_PREFIX}${key}=${encodeURIComponent(\n value,\n )}; Path=/; Max-Age=${maxAgeSec}; SameSite=Lax${secure}`;\n }\n\n remove(key: string): void {\n // biome-ignore lint/suspicious/noDocumentCookie: ver set(); expiramos la cookie con Max-Age=0.\n document.cookie = `${STORAGE_PREFIX}${key}=; Path=/; Max-Age=0; SameSite=Lax`;\n }\n\n clear(): void {\n for (const cookie of readCookies()) {\n const eq = cookie.indexOf('=');\n const name = eq === -1 ? cookie : cookie.slice(0, eq);\n if (name.startsWith(STORAGE_PREFIX)) {\n this.remove(name.slice(STORAGE_PREFIX.length));\n }\n }\n }\n}\n\n/** Backend en memoria. Fallback cuando no hay browser storage (SSR, incógnito). */\nclass MemoryAdapter implements StorageAdapter {\n private store = new Map<string, string>();\n\n get(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n\n/**\n * Crea el adapter de almacenamiento, respetando la preferencia del usuario y\n * cayendo a la mejor alternativa disponible si la preferida no existe.\n */\nexport function createStorage(\n preferred: 'localStorage' | 'cookie' | 'memory' = 'localStorage',\n): StorageAdapter {\n if (preferred === 'localStorage' && hasLocalStorage()) return new LocalStorageAdapter();\n if (preferred === 'cookie' && hasDocument()) return new CookieAdapter();\n if (preferred === 'memory') return new MemoryAdapter();\n\n // Cadena de fallback.\n if (hasLocalStorage()) return new LocalStorageAdapter();\n if (hasDocument()) return new CookieAdapter();\n return new MemoryAdapter();\n}\n","import { hasNavigatorSendBeacon } from '../utils/safe-env';\n\nexport interface TransportConfig {\n apiUrl: string;\n apiKey: string;\n sdkVersion: string;\n timeoutMs?: number;\n}\n\n/** Error de transporte con el código HTTP asociado (0 si fue un fallo de red). */\nexport class TransportError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n ) {\n super(message);\n this.name = 'TransportError';\n }\n}\n\n/**\n * Capa de red del SDK. Envía JSON al backend vía `fetch` (con timeout) y\n * ofrece `sendBeacon` para descargas fiables al cerrar la página.\n */\nexport class Transport {\n constructor(private readonly config: TransportConfig) {}\n\n /** Envío normal con `fetch`. Lanza `TransportError` si la respuesta no es OK. */\n async send<T = unknown>(path: string, body: unknown): Promise<T> {\n const url = `${this.config.apiUrl}${path}`;\n const controller = new AbortController();\n const timeoutMs = this.config.timeoutMs ?? 10000;\n // Abortamos con un motivo explícito para que el log sea claro\n // (`TimeoutError`) en vez del confuso \"signal is aborted without reason\".\n const timeoutId = setTimeout(\n () =>\n controller.abort(new DOMException(`Veo request timeout (${timeoutMs}ms)`, 'TimeoutError')),\n timeoutMs,\n );\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Api-Key': this.config.apiKey,\n 'X-Sdk-Version': this.config.sdkVersion,\n },\n body: JSON.stringify(body),\n // NO usar `keepalive: true` en los flushes normales: tiene límites\n // estrictos del navegador (cuota de requests/64KB) y produce abortos\n // espurios cuando hay varios envíos seguidos. El envío fiable al cerrar\n // la página ya lo cubre `sendBeacon()` (ver Queue.flushBeacon).\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new TransportError(`HTTP ${response.status}`, response.status);\n }\n\n return (await response.json()) as T;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Envío con `navigator.sendBeacon`. Fire-and-forget, pensado para `pagehide`.\n * Como sendBeacon no admite headers, la API key viaja por query string.\n */\n sendBeacon(path: string, body: unknown): boolean {\n if (!hasNavigatorSendBeacon()) return false;\n\n const url = new URL(`${this.config.apiUrl}${path}`);\n url.searchParams.set('key', this.config.apiKey);\n url.searchParams.set('v', this.config.sdkVersion);\n\n const blob = new Blob([JSON.stringify(body)], { type: 'application/json' });\n return navigator.sendBeacon(url.toString(), blob);\n }\n}\n","import { autocapturePlugin } from '../plugins/autocapture';\nimport { spaRouterPlugin } from '../plugins/spa-router';\nimport type { VeoClient, VeoConfig } from '../types';\nimport { resolveApiUrl } from './api-url';\nimport { maybeLoadBuilder } from './builder-loader';\nimport { Client } from './client';\n\n/**\n * Setup común del cliente, compartido por el entry ESM/CJS (`index.ts`, guías\n * estáticas) y el IIFE (`veo.ts`, guías perezosas). NO importa el plugin de\n * guías: la instalación va por el callback `onGuides`, así el bundle IIFE puede\n * quedar sin los renderers.\n *\n * Hace: client + spa-router + autocapture, instala guías vía callback, asigna\n * `window.veo` drenando la cola del snippet, y dispara el loader del builder.\n */\nexport function setupClient(\n config: VeoConfig,\n onGuides: (client: VeoClient) => void,\n loadBuilder?: () => Promise<unknown>,\n): VeoClient {\n const client = new Client(config);\n\n client.use(spaRouterPlugin());\n\n if (config.autocapture !== false) {\n const autocaptureConfig = typeof config.autocapture === 'object' ? config.autocapture : {};\n client.use(autocapturePlugin(autocaptureConfig));\n }\n\n // Guías (opt-in): el caller decide instalarlas sync (bundler) o lazy (IIFE).\n onGuides(client);\n\n if (typeof window !== 'undefined') {\n const stub = (window as unknown as { veo?: { _q?: unknown[][] } }).veo;\n const pending = stub?._q ?? [];\n\n (window as unknown as { veo: VeoClient }).veo = client;\n\n for (const entry of pending) {\n const [method, args] = entry;\n if (method === 'init') continue; // ya inicializado\n const fn = (client as unknown as Record<string, (...a: unknown[]) => unknown>)[\n method as string\n ];\n if (typeof fn === 'function') {\n try {\n fn.apply(client, Array.from(args as ArrayLike<unknown>));\n } catch (err) {\n if (config.debug) console.error('[veo] drain error:', err);\n }\n }\n }\n\n maybeLoadBuilder({\n ...(config.builderUrl !== undefined ? { builderUrl: config.builderUrl } : {}),\n ...(config.debug !== undefined ? { debug: config.debug } : {}),\n ...(config.apiKey !== undefined ? { apiKey: config.apiKey } : {}),\n apiUrl: resolveApiUrl(config),\n ...(loadBuilder ? { loadBuilder } : {}),\n });\n }\n\n return client;\n}\n","import type { VeoPlugin } from '../../types';\nimport { hasWindow } from '../../utils/safe-env';\nimport { definePlugin } from '../plugin';\nimport { GuidesController } from './guides-controller';\n\nexport interface GuidesPluginConfig {\n apiUrl: string;\n apiKey: string;\n debug?: boolean;\n}\n\n/** Resultado del install — expone el controller para debugging desde el demo. */\nexport interface GuidesPluginHandle {\n controller: GuidesController;\n}\n\n/**\n * Plugin que renderiza guías in-app (modal/banner/tooltip) consultando\n * `GET /v1/guides/resolve` y registra las interacciones en\n * `POST /v1/guides/:id/interactions` vía queue dedicada con retry y\n * sendBeacon en pagehide.\n *\n * Opt-in: `init({ ..., guides: true })`. El plugin escucha\n * `pageview` e `identify` del client; el payload del evento ya trae\n * `sessionId` y `endUserId` para que no necesitemos consultar al\n * client en cada disparo.\n *\n * Frequency híbrida: el backend filtra autoritariamente; el cache\n * local (`GuideFrequencyCache`) solo previene el flash visual cuando\n * la interaction aún no se persistió.\n */\nexport function guidesPlugin(config: GuidesPluginConfig): VeoPlugin {\n return definePlugin({\n name: 'guides',\n install(client) {\n if (!hasWindow()) return;\n const controller = new GuidesController(client, config);\n\n // Exponer el controller en window para que el demo y tests E2E\n // puedan inspeccionar el cache y la queue.\n (window as unknown as { __veoGuides?: GuidesPluginHandle }).__veoGuides = { controller };\n\n client.on('identify', ({ sessionId }) => {\n void controller.checkGuides(window.location.href, sessionId);\n });\n\n client.on('pageview', ({ url, sessionId }) => {\n void controller.checkGuides(url, sessionId);\n });\n\n // Como el bundle de guías se carga PEREZOSAMENTE, el plugin puede\n // instalarse DESPUÉS del pageview/identify inicial — esos eventos ya\n // pasaron. Chequeamos la página actual ahora mismo para que la guía\n // aparezca apenas se entra (sin necesitar una 2ª acción). Si todavía no\n // hay endUserId, checkGuides no hace nada y el listener de `identify` la\n // mostrará; el dedupe por guideId evita un doble render.\n void controller.checkGuides(window.location.href, client.getSessionId());\n },\n });\n}\n\nexport type { PreviewGuideInput, PreviewHandle, PreviewResult } from './guide-preview';\nexport { closeGuidePreview, previewGuide } from './guide-preview';\nexport type { PreviewModeHandle, PreviewModeOptions } from './preview-mode';\nexport { runPreviewMode } from './preview-mode';\nexport type { GuideInteractionEvent, GuideStep, ResolvedGuide } from './types';\n","import type { VeoClient } from '../../types';\nimport {\n DEFAULT_TRACKER_BATCH_SIZE,\n DEFAULT_TRACKER_FLUSH_INTERVAL_MS,\n DEFAULT_TRACKER_MAX_RETRIES,\n} from './constants';\nimport { GuideFrequencyCache, namespaceFromApiKey } from './guide-frequency-cache';\nimport { GuideResolverClient } from './guide-resolver-client';\nimport { GuideTrackerClient } from './guide-tracker-client';\nimport { GuideTrackerQueue } from './guide-tracker-queue';\nimport { BadgeRenderer } from './renderers/badge-renderer';\nimport { BannerRenderer } from './renderers/banner-renderer';\nimport type { BaseRenderer } from './renderers/base-renderer';\nimport { CompositeRenderer } from './renderers/composite-renderer';\nimport { CustomRenderer } from './renderers/custom-renderer';\nimport { FormRenderer } from './renderers/form-renderer';\nimport { InlineCustomRenderer } from './renderers/inline-custom-renderer';\nimport { InlineFormRenderer } from './renderers/inline-form-renderer';\nimport { InlineRenderer } from './renderers/inline-renderer';\nimport { ModalRenderer } from './renderers/modal-renderer';\nimport { TooltipRenderer } from './renderers/tooltip-renderer';\nimport { WalkthroughRenderer } from './renderers/walkthrough-renderer';\nimport type {\n CompositeStep,\n FrequencyStatus,\n GuideInteractionAction,\n GuideInteractionEvent,\n GuideType,\n ResolvedGuide,\n WalkthroughCallbacks,\n} from './types';\nimport { stepMatchesPage } from './url-match';\nimport { WalkthroughStateManager } from './walkthrough-state';\n\nexport interface GuidesControllerConfig {\n apiUrl: string;\n apiKey: string;\n debug?: boolean;\n /** Override del resolver (tests). */\n resolver?: GuideResolverClient;\n /** Override del tracker queue (tests). */\n trackerQueue?: GuideTrackerQueue;\n /** Override del cache (tests). */\n frequencyCache?: GuideFrequencyCache;\n /** Override del walkthrough state manager (tests). */\n walkthroughState?: WalkthroughStateManager;\n}\n\n/**\n * Ventana durante la cual un `resolve` de la MISMA `(endUserId, url)` se sirve\n * de memoria sin pegarle al backend. Corta el doble disparo identify+pageview\n * en la carga y los pageviews repetidos de una SPA (mismo URL re-montado). Las\n * guías no son tiempo-real: 30 s de staleness es imperceptible y baja el\n * volumen de `/v1/guides/resolve` drásticamente con muchos usuarios.\n */\nconst RESOLVE_CACHE_TTL_MS = 30_000;\n\n/** Mapeo `action → cache status`. Solo acciones terminales mutan el cache. */\nconst STATUS_BY_ACTION: Record<GuideInteractionAction, FrequencyStatus | null> = {\n shown: 'shown',\n dismissed: 'dismissed',\n cta_clicked: null,\n step_advanced: null,\n step_back: null,\n completed: 'completed',\n};\n\n/**\n * Orquesta el ciclo de vida de las guías:\n *\n * 1. `pageview`/`identify` → `checkGuides(url, sessionId)`.\n * 2. Si hay un walkthrough activo (estado persistido en localStorage),\n * tiene prioridad: se intenta resumir en la página actual antes de\n * consultar nuevas guías. Si el selector del step actual aparece,\n * se pinta; si no, se cancela el walkthrough limpiamente.\n * 3. Si no hay walkthrough activo, se consulta `/v1/guides/resolve` y\n * se procesa cada guía:\n * - `walkthrough` con varios steps → arranca un walkthrough\n * (uno a la vez; el resto se ignora si ya hay uno).\n * - single-step → modal/banner/tooltip como antes.\n * 4. Cada interaction actualiza el cache local Y se encola para\n * `POST /v1/guides/:id/interactions`.\n *\n * Dedupe: `dispatched` guarda `${guideId}:${action}` ya encolados en la\n * sesión actual del SDK. Las acciones por-step de walkthroughs no\n * usan dedupe — cada `step_advanced` puede repetirse y representa una\n * navegación distinta.\n */\nexport class GuidesController {\n private readonly resolver: GuideResolverClient;\n private readonly trackerQueue: GuideTrackerQueue;\n private readonly frequencyCache: GuideFrequencyCache;\n private readonly walkthroughState: WalkthroughStateManager;\n private readonly debug: boolean;\n /** Para `POST /v1/guides/:id/form-response` (respuestas de guías form). */\n private readonly apiUrl: string;\n private readonly apiKey: string;\n private readonly activeRenderers = new Set<BaseRenderer>();\n /**\n * Guías single-step actualmente en pantalla, por `guideId`. Evita repintar/\n * duplicar la misma guía en cada pageview de una SPA (p.ej. una guía inline\n * anclada a un elemento persistente). Se libera al cerrarse la guía.\n */\n private readonly activeByGuideId = new Map<string, BaseRenderer>();\n private readonly dispatched = new Set<string>();\n /**\n * Renderer del paso de walkthrough activo. Puede ser el `WalkthroughRenderer`\n * (tooltip anclado) o un Modal/Banner con navegación (walkthrough heterogéneo);\n * tipamos por `destroy()`, lo único que el controller necesita.\n */\n private activeWalkthroughRenderer: { destroy(): void } | null = null;\n private activeWalkthroughGuide: ResolvedGuide | null = null;\n /** Última resolución cacheada (mismo `(endUserId, url)` → sin red). */\n private resolveCache: { key: string; at: number; guides: ResolvedGuide[] } | null = null;\n /** Resolución idéntica en vuelo, para coalescer llamadas concurrentes. */\n private inflightResolve: { key: string; promise: Promise<ResolvedGuide[]> } | null = null;\n /**\n * Disparadores por interacción armados (`on_click`/`on_hover`): guideId →\n * desarme del listener. Se re-arman desde cero en cada `checkGuides` (el\n * resolve fresco manda) y se limpian en `destroy()`.\n */\n private readonly armedTriggers = new Map<string, () => void>();\n /**\n * Tour composite ESPERANDO navegación: el usuario avanzó a un paso cuya\n * `pageLocation` apunta a otra página. Se resume en `checkGuides` cuando llega\n * a esa página (tours multi-página estilo Pendo).\n */\n private pendingComposite: { guide: ResolvedGuide; stepIndex: number } | null = null;\n\n constructor(\n private readonly client: VeoClient,\n config: GuidesControllerConfig,\n ) {\n this.debug = config.debug === true;\n this.apiUrl = config.apiUrl;\n this.apiKey = config.apiKey;\n this.resolver =\n config.resolver ?? new GuideResolverClient(config.apiUrl, config.apiKey, this.debug);\n\n if (config.trackerQueue) {\n this.trackerQueue = config.trackerQueue;\n } else {\n const httpClient = new GuideTrackerClient(config.apiUrl, config.apiKey);\n this.trackerQueue = new GuideTrackerQueue({\n client: httpClient,\n flushIntervalMs: DEFAULT_TRACKER_FLUSH_INTERVAL_MS,\n batchSize: DEFAULT_TRACKER_BATCH_SIZE,\n maxRetries: DEFAULT_TRACKER_MAX_RETRIES,\n onError: (err, item) => {\n if (this.debug) {\n console.warn(\n `[veo] dropped guide interaction after retries: guideId=${item.guideId} action=${item.payload.action}`,\n err,\n );\n }\n },\n });\n }\n\n const namespace = namespaceFromApiKey(config.apiKey);\n this.frequencyCache = config.frequencyCache ?? new GuideFrequencyCache(namespace);\n this.walkthroughState = config.walkthroughState ?? new WalkthroughStateManager(namespace);\n }\n\n /** Cuántas interactions hay pendientes de envío. Útil para debug en demo. */\n get pendingInteractions(): number {\n return this.trackerQueue.size;\n }\n\n /** Limpia el cache local (botón \"reset\" del demo, tests). */\n clearFrequencyCache(): void {\n this.frequencyCache.clear();\n }\n\n /** Limpia el walkthrough activo (debug del demo). */\n clearWalkthroughState(): void {\n this.tearDownWalkthrough();\n }\n\n /** Punto de entrada principal. Llamado en cada pageview/identify. */\n async checkGuides(pageUrl: string, sessionId: string): Promise<void> {\n const endUserId = this.client.getEndUserId();\n if (!endUserId) {\n if (this.debug) console.log('[veo] guides: skipped, no endUserId yet');\n return;\n }\n\n if (await this.tryResumeWalkthrough(endUserId, sessionId, pageUrl)) {\n return;\n }\n\n // Tour composite multi-página: si hay un paso pendiente que aplica a ESTA\n // página, resúmelo. No corta el resto del flujo (otras guías pueden mostrarse).\n this.tryResumeComposite(sessionId, pageUrl);\n\n let guides: ResolvedGuide[];\n try {\n guides = await this.resolveGuides(endUserId, pageUrl);\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolver threw:', err);\n return;\n }\n if (this.debug) console.log(`[veo] guides: ${guides.length} eligible at ${pageUrl}`);\n\n // Los disparadores por interacción se re-arman desde el resolve fresco:\n // desarmar todo primero es idempotente y maneja las SPAs (la guía que ya\n // no aplica a esta URL no queda armada de una navegación anterior).\n this.disarmTriggers();\n\n for (const guide of guides) {\n const trigger = guide.activationRules.trigger;\n if ((trigger === 'on_click' || trigger === 'on_hover') && guide.activationRules.selector) {\n this.armInteractionTrigger(guide, endUserId, sessionId, pageUrl);\n continue;\n }\n await this.showGuide(guide, endUserId, sessionId, pageUrl);\n }\n }\n\n /**\n * Muestra una guía elegible (filtro de frecuencia + dedupe + dispatch por\n * tipo). Cuerpo original del loop de `checkGuides`, extraído para que los\n * disparadores por interacción pasen por LOS MISMOS chequeos al disparar.\n */\n private async showGuide(\n guide: ResolvedGuide,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<void> {\n if (this.frequencyCache.shouldFilter(guide.guideId, guide.displayFrequency)) {\n if (this.debug) console.log(`[veo] guides: filtered locally guideId=${guide.guideId}`);\n return;\n }\n\n // Ya está en pantalla → no repintar/duplicar (clave en SPAs: cada\n // navegación dispara un pageview, pero la guía sigue montada).\n if (this.activeByGuideId.has(guide.guideId)) {\n if (this.debug) console.log(`[veo] guides: already shown guideId=${guide.guideId}`);\n return;\n }\n\n if (guide.guideType === 'walkthrough' && guide.guideSteps.length > 1) {\n if (this.walkthroughState.hasActive()) {\n if (this.debug)\n console.log(`[veo] guides: walkthrough ${guide.guideId} skipped (another active)`);\n return;\n }\n await this.startWalkthrough(guide, endUserId, sessionId, pageUrl);\n // Las guías single-step pueden seguir mostrándose en paralelo. Solo se\n // bloquean OTROS walkthroughs vía hasActive().\n return;\n }\n\n // Modelo unificado: targeting de página POR-PASO + navegación multi-paso.\n if (guide.guideType === 'composite') {\n this.startComposite(guide, sessionId, pageUrl);\n return;\n }\n\n this.runSingleStepRender(guide, sessionId, pageUrl);\n }\n\n /**\n * Arma un disparador por interacción: la guía NO se muestra al cargar, sino\n * cuando el usuario hace click / pasa el mouse sobre `activationRules.selector`.\n * Listener DELEGADO en `document` (fase captura, sin preventDefault — el click\n * original de la app sigue funcionando). Al disparar se desarma y la guía pasa\n * por `showGuide` (mismos chequeos de frecuencia/dedupe). Tras cerrarse, el\n * próximo pageview/identify la re-arma — hover/click vuelve a mostrarla\n * mientras la frecuencia lo permita.\n */\n private armInteractionTrigger(\n guide: ResolvedGuide,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): void {\n // Armar solo lo que tiene sentido mostrar: si la frecuencia ya la filtra o\n // ya está en pantalla, no escuchamos de más.\n if (this.frequencyCache.shouldFilter(guide.guideId, guide.displayFrequency)) return;\n if (this.activeByGuideId.has(guide.guideId)) return;\n if (this.armedTriggers.has(guide.guideId)) return;\n\n const selector = guide.activationRules.selector as string;\n const eventName = guide.activationRules.trigger === 'on_hover' ? 'mouseover' : 'click';\n\n const onFire = (e: Event): void => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n try {\n if (!target.closest(selector)) return;\n } catch {\n return; // selector inválido en la DB: no romper la app\n }\n disarm();\n void this.showGuide(guide, endUserId, sessionId, pageUrl);\n };\n const disarm = (): void => {\n document.removeEventListener(eventName, onFire, true);\n this.armedTriggers.delete(guide.guideId);\n };\n\n document.addEventListener(eventName, onFire, true);\n this.armedTriggers.set(guide.guideId, disarm);\n if (this.debug)\n console.log(`[veo] guides: armed ${eventName} trigger for ${guide.guideId} on ${selector}`);\n }\n\n /** Desarma todos los disparadores por interacción pendientes. */\n private disarmTriggers(): void {\n for (const disarm of this.armedTriggers.values()) disarm();\n this.armedTriggers.clear();\n }\n\n /**\n * `resolve` con cache de corta duración + coalescing:\n * - Mismo `(endUserId, url)` resuelto hace < {@link RESOLVE_CACHE_TTL_MS} →\n * se reusa sin red. Colapsa el doble disparo identify+pageview y los\n * pageviews repetidos de una SPA hacia la misma URL.\n * - Si ya hay un resolve idéntico en vuelo, se espera ESE (no se abre otro).\n * El re-render sigue siendo idempotente (dedupe por `activeByGuideId` +\n * `frequencyCache`), así que reusar el resultado no duplica guías.\n */\n private async resolveGuides(endUserId: string, pageUrl: string): Promise<ResolvedGuide[]> {\n const key = `${endUserId}\\n${pageUrl}`;\n const now = Date.now();\n\n if (this.resolveCache?.key === key && now - this.resolveCache.at < RESOLVE_CACHE_TTL_MS) {\n if (this.debug) console.log('[veo] guides: resolve cache hit');\n return this.resolveCache.guides;\n }\n\n if (this.inflightResolve?.key === key) {\n return this.inflightResolve.promise;\n }\n\n const promise = this.resolver.resolve(endUserId, pageUrl);\n this.inflightResolve = { key, promise };\n try {\n const guides = await promise;\n this.resolveCache = { key, at: Date.now(), guides };\n return guides;\n } finally {\n if (this.inflightResolve?.key === key) this.inflightResolve = null;\n }\n }\n\n /** Cierra todas las guías activas, limpia cache de dispatch y para timers. */\n destroy(): void {\n for (const renderer of this.activeRenderers) {\n try {\n renderer.destroy();\n } catch (err) {\n if (this.debug) console.error('[veo] renderer destroy failed:', err);\n }\n }\n this.activeRenderers.clear();\n this.activeByGuideId.clear();\n if (this.activeWalkthroughRenderer) {\n try {\n this.activeWalkthroughRenderer.destroy();\n } catch {\n // swallow — el cleanup no debe propagar\n }\n this.activeWalkthroughRenderer = null;\n this.activeWalkthroughGuide = null;\n }\n this.disarmTriggers();\n this.dispatched.clear();\n this.resolveCache = null;\n this.inflightResolve = null;\n this.trackerQueue.destroy();\n }\n\n private runSingleStepRender(guide: ResolvedGuide, sessionId: string, pageUrl: string): void {\n const renderer = this.createSingleStepRenderer(guide.guideType);\n if (!renderer) return;\n\n // Reservar el slot YA (antes del delay) para que pageviews rápidos no\n // disparen dos renders de la misma guía.\n this.activeByGuideId.set(guide.guideId, renderer);\n\n const delayMs = guide.activationRules.delayMs ?? 0;\n window.setTimeout(\n () => this.mountSingleStepRenderer(guide, renderer, sessionId, pageUrl),\n delayMs,\n );\n }\n\n /**\n * Camino del modelo unificado (`composite`). Elige el PRIMER paso cuya\n * `pageLocation` matchea la URL actual (targeting por-paso) y lo pinta con el\n * `CompositeRenderer`. Si ningún paso aplica a esta página, no muestra nada.\n */\n private startComposite(guide: ResolvedGuide, sessionId: string, pageUrl: string): void {\n // Ya hay un tour de esta guía a mitad de camino (esperando navegación) → no\n // reiniciar desde el paso 0; el resume lo maneja `tryResumeComposite`.\n if (this.pendingComposite?.guide.guideId === guide.guideId) return;\n const steps = guide.guideSteps as unknown as CompositeStep[];\n const start = steps.findIndex((s) => stepMatchesPage(s.pageLocation, pageUrl));\n if (start === -1) return; // ningún paso aplica a esta URL\n this.renderCompositeStep(guide, start, sessionId, pageUrl);\n }\n\n /**\n * Resume un tour composite que quedó esperando navegación: si el paso\n * pendiente aplica a la página actual, lo pinta. Devuelve `true` si resumió.\n */\n private tryResumeComposite(sessionId: string, pageUrl: string): boolean {\n const pending = this.pendingComposite;\n if (!pending) return false;\n const steps = pending.guide.guideSteps as unknown as CompositeStep[];\n const step = steps[pending.stepIndex];\n if (!step) {\n this.pendingComposite = null;\n return false;\n }\n if (!stepMatchesPage(step.pageLocation, pageUrl)) return false; // aún no llegó\n this.pendingComposite = null;\n this.renderCompositeStep(pending.guide, pending.stepIndex, sessionId, pageUrl);\n return true;\n }\n\n /**\n * Pinta UN paso composite. En guías multi-paso pasa `nav` al renderer para\n * que los botones next/prev avancen (misma página); en single-step los\n * botones cierran. Cada avance destruye el paso anterior y monta el siguiente.\n */\n private renderCompositeStep(\n guide: ResolvedGuide,\n idx: number,\n sessionId: string,\n pageUrl: string,\n ): void {\n const steps = guide.guideSteps as unknown as CompositeStep[];\n const renderer = new CompositeRenderer();\n this.activeRenderers.add(renderer);\n this.activeByGuideId.set(guide.guideId, renderer);\n\n const cleanup = (): void => {\n renderer.destroy();\n this.activeRenderers.delete(renderer);\n if (this.activeByGuideId.get(guide.guideId) === renderer) {\n this.activeByGuideId.delete(guide.guideId);\n }\n };\n\n // Avanza a `target`: si ese paso aplica a la página ACTUAL lo pinta ya\n // (tour misma-página); si apunta a OTRA página, guarda el pendiente y espera\n // a que el usuario navegue (tour multi-página, se resume en `checkGuides`).\n const goToStep = (target: number): void => {\n cleanup();\n if (target < 0 || target >= steps.length) return; // fuera de rango → fin\n const step = steps[target];\n if (step && stepMatchesPage(step.pageLocation, pageUrl)) {\n this.renderCompositeStep(guide, target, sessionId, pageUrl);\n } else {\n this.pendingComposite = { guide, stepIndex: target };\n }\n };\n\n const nav =\n steps.length > 1\n ? {\n stepIndex: idx,\n totalSteps: steps.length,\n callbacks: {\n onNext: (): void => goToStep(idx + 1),\n onBack: (): void => goToStep(idx - 1),\n onGoto: (target: number): void => goToStep(target),\n onSkip: cleanup,\n onComplete: cleanup,\n },\n }\n : undefined;\n\n try {\n void renderer.render({\n guide,\n onInteraction: (e) => this.handleInteraction(guide, sessionId, pageUrl, e),\n onClose: cleanup,\n onTrack: (name, props) => this.client.track(name, props),\n onFormSubmit: (answers) => this.submitFormResponse(guide.guideId, answers),\n onOpenGuide: (targetGuideId) => {\n void this.openGuideById(targetGuideId, sessionId, pageUrl);\n },\n ...(nav ? { nav } : {}),\n });\n } catch (err) {\n if (this.debug) console.error('[veo] composite renderer threw:', err);\n cleanup();\n }\n }\n\n private mountSingleStepRenderer(\n guide: ResolvedGuide,\n renderer: BaseRenderer,\n sessionId: string,\n pageUrl: string,\n ): void {\n this.activeRenderers.add(renderer);\n this.activeByGuideId.set(guide.guideId, renderer);\n\n const onClose = (): void => {\n renderer.destroy();\n this.activeRenderers.delete(renderer);\n if (this.activeByGuideId.get(guide.guideId) === renderer) {\n this.activeByGuideId.delete(guide.guideId);\n }\n };\n\n const onInteraction = (event: GuideInteractionEvent): void => {\n this.handleInteraction(guide, sessionId, pageUrl, event);\n };\n\n const onTrack = (eventName: string, properties?: Record<string, unknown>): void => {\n this.client.track(eventName, properties);\n };\n\n const onFormSubmit = (answers: Record<string, unknown>): Promise<boolean> =>\n this.submitFormResponse(guide.guideId, answers);\n\n // Encadenado: un botón `action:'guide'` abre otra guía por id.\n const onOpenGuide = (targetGuideId: string): void => {\n void this.openGuideById(targetGuideId, sessionId, pageUrl);\n };\n\n try {\n void renderer.render({ guide, onInteraction, onClose, onTrack, onFormSubmit, onOpenGuide });\n } catch (err) {\n if (this.debug) console.error('[veo] renderer.render threw:', err);\n this.activeRenderers.delete(renderer);\n if (this.activeByGuideId.get(guide.guideId) === renderer) {\n this.activeByGuideId.delete(guide.guideId);\n }\n }\n }\n\n /**\n * Abre una guía POR ID, disparada desde el botón de otra guía (encadenado).\n * Ignora las URL rules y el trigger (el autor lo pidió explícitamente desde\n * un botón); respeta el dedupe de guías activas y el flujo normal de\n * tracking. 404/red → no-op (la guía destino pudo borrarse).\n */\n private async openGuideById(guideId: string, sessionId: string, pageUrl: string): Promise<void> {\n if (this.activeByGuideId.has(guideId)) return;\n const guide = await this.resolver.fetchById(guideId);\n if (!guide) {\n if (this.debug) console.warn(`[veo] guides: chained guide ${guideId} not found`);\n return;\n }\n const endUserId = this.client.getEndUserId() ?? this.client.getAnonymousId();\n if (guide.guideType === 'walkthrough' && guide.guideSteps.length > 1) {\n if (!this.walkthroughState.hasActive()) {\n await this.startWalkthrough(guide, endUserId, sessionId, pageUrl);\n }\n return;\n }\n this.runSingleStepRender(guide, sessionId, pageUrl);\n }\n\n /**\n * Si hay un walkthrough persistido, intenta pintar el step actual en\n * la página actual. Retorna `true` si lo intentó (sea éxito o cancel),\n * `false` si no había walkthrough activo.\n *\n * Cancela limpiamente (sin enviar `dismissed` falso) cuando:\n * - La guía fue eliminada en el backend (404 → `fetchById` devuelve null).\n * - La guía cambió de tipo y ya no es walkthrough.\n * - El selector del step actual no aparece dentro del timeout.\n */\n private async tryResumeWalkthrough(\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<boolean> {\n const state = this.walkthroughState.current();\n if (!state) return false;\n\n const guide = await this.resolver.fetchById(state.guideId);\n if (!guide || guide.guideType !== 'walkthrough') {\n if (this.debug)\n console.log(`[veo] guides: walkthrough ${state.guideId} no longer available, cleaning up`);\n this.tearDownWalkthrough();\n return true;\n }\n\n // El cache local podría tener una versión más vieja del total; usamos\n // siempre el del backend.\n const stepIndex = Math.min(state.currentStepIndex, guide.guideSteps.length - 1);\n await this.renderWalkthroughStep(guide, stepIndex, endUserId, sessionId, pageUrl);\n return true;\n }\n\n private async startWalkthrough(\n guide: ResolvedGuide,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<void> {\n this.walkthroughState.start(guide.guideId, guide.guideSteps.length);\n const rendered = await this.renderWalkthroughStep(guide, 0, endUserId, sessionId, pageUrl);\n if (!rendered) return; // teardown ya corrió, no reportamos shown.\n // Reportamos `shown` SOLO al arrancar (step 0). Steps siguientes\n // se cubren con `step_advanced`/`step_back`. Marcamos cache local\n // también para que `displayFrequency='once'` filtre en la próxima\n // pageview aunque la interaction aún esté en la queue.\n this.enqueueInteractionOnce(guide.guideId, endUserId, sessionId, pageUrl, 'shown', 0);\n this.frequencyCache.record(guide.guideId, 'shown');\n }\n\n /**\n * Pinta el step indicado. Reusa la guía (no fetcha): el caller debe\n * traerla. Retorna `true` si el render fue exitoso. En caso contrario\n * ya disparó el teardown — el caller no debe seguir reportando.\n */\n private async renderWalkthroughStep(\n guide: ResolvedGuide,\n stepIndex: number,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<boolean> {\n if (this.activeWalkthroughRenderer) {\n this.activeWalkthroughRenderer.destroy();\n this.activeWalkthroughRenderer = null;\n }\n\n this.activeWalkthroughGuide = guide;\n\n const callbacks: WalkthroughCallbacks = {\n onNext: () => this.handleWalkthroughNext(endUserId, sessionId, pageUrl),\n onBack: () => this.handleWalkthroughBack(endUserId, sessionId, pageUrl),\n onSkip: () => this.handleWalkthroughSkip(endUserId, sessionId, pageUrl),\n onComplete: () => this.handleWalkthroughComplete(endUserId, sessionId, pageUrl),\n };\n\n // Walkthrough HETEROGÉNEO: un paso puede pedir renderizarse como modal o\n // banner (via `step.style.render`). Esos renderers siempre montan (no\n // dependen de un ancla), así que reportamos éxito directo. El resto\n // (tooltip/default) usa el WalkthroughRenderer anclado.\n const step = guide.guideSteps[stepIndex];\n const render = readStepRender(step);\n if (render === 'modal' || render === 'banner') {\n const renderer = render === 'modal' ? new ModalRenderer() : new BannerRenderer();\n try {\n renderer.render({\n guide,\n onInteraction: () => {},\n onClose: () => {},\n nav: { stepIndex, totalSteps: guide.guideSteps.length, callbacks },\n });\n } catch (err) {\n if (this.debug) console.error('[veo] sequence renderer threw:', err);\n this.tearDownWalkthrough();\n return false;\n }\n this.activeWalkthroughRenderer = renderer;\n return true;\n }\n\n const renderer = new WalkthroughRenderer();\n let success = false;\n try {\n success = await renderer.render({ guide, currentStepIndex: stepIndex, callbacks });\n } catch (err) {\n if (this.debug) console.error('[veo] walkthrough renderer threw:', err);\n }\n\n if (!success) {\n if (this.debug)\n console.warn(\n `[veo] walkthrough ${guide.guideId} step ${stepIndex} could not render, cancelling`,\n );\n this.tearDownWalkthrough();\n return false;\n }\n\n this.activeWalkthroughRenderer = renderer;\n return true;\n }\n\n private handleWalkthroughNext(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n if (!guide) return;\n\n const newState = this.walkthroughState.advance();\n if (!newState) {\n // Ya estábamos en el último step. No debería pasar (el botón\n // dispara onComplete en ese caso), pero por defensa lo manejamos.\n this.handleWalkthroughComplete(endUserId, sessionId, pageUrl);\n return;\n }\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'step_advanced',\n newState.currentStepIndex,\n );\n void this.renderWalkthroughStep(\n guide,\n newState.currentStepIndex,\n endUserId,\n sessionId,\n pageUrl,\n );\n }\n\n private handleWalkthroughBack(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n if (!guide) return;\n\n const state = this.walkthroughState.current();\n if (!state || state.currentStepIndex === 0) return;\n\n const newState = this.walkthroughState.back();\n if (!newState) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'step_back',\n newState.currentStepIndex,\n );\n void this.renderWalkthroughStep(\n guide,\n newState.currentStepIndex,\n endUserId,\n sessionId,\n pageUrl,\n );\n }\n\n private handleWalkthroughSkip(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n const state = this.walkthroughState.current();\n if (!guide || !state) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'dismissed',\n state.currentStepIndex,\n );\n this.frequencyCache.record(guide.guideId, 'dismissed');\n this.tearDownWalkthrough();\n }\n\n private handleWalkthroughComplete(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n const state = this.walkthroughState.current();\n if (!guide || !state) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'completed',\n state.currentStepIndex,\n );\n this.frequencyCache.record(guide.guideId, 'completed');\n this.tearDownWalkthrough();\n }\n\n private tearDownWalkthrough(): void {\n if (this.activeWalkthroughRenderer) {\n try {\n this.activeWalkthroughRenderer.destroy();\n } catch {\n // swallow\n }\n }\n this.activeWalkthroughRenderer = null;\n this.activeWalkthroughGuide = null;\n this.walkthroughState.clear();\n }\n\n /**\n * Tras cada interaction single-step:\n * 1. dedupe (no enviar 2× la misma `(guideId, action)` por sesión)\n * 2. actualizar el cache local si corresponde\n * 3. encolar el POST\n *\n * El endUserId se lee del client EN ESTE MOMENTO (no en el render),\n * por si el usuario se identificó después de que la guía apareció.\n */\n private handleInteraction(\n guide: ResolvedGuide,\n sessionId: string,\n pageUrl: string,\n event: GuideInteractionEvent,\n ): void {\n // Con varios botones por paso, cada botón cuenta aparte: el buttonId entra\n // a la key (si no, el segundo botón clickeado se perdería por dedup).\n const buttonKey = event.metadata?.buttonId ? `:${event.metadata.buttonId}` : '';\n const dedupKey = `${guide.guideId}:${event.action}${buttonKey}`;\n if (this.dispatched.has(dedupKey)) {\n if (this.debug) console.log(`[veo] guides: dedup hit ${dedupKey}`);\n return;\n }\n this.dispatched.add(dedupKey);\n\n const cacheStatus = STATUS_BY_ACTION[event.action];\n if (cacheStatus) this.frequencyCache.record(guide.guideId, cacheStatus);\n\n const endUserId = this.client.getEndUserId();\n if (!endUserId) {\n if (this.debug)\n console.warn('[veo] guides: interaction without endUserId — skipping enqueue');\n return;\n }\n\n this.trackerQueue.enqueue({\n guideId: guide.guideId,\n payload: {\n endUserId,\n sessionId,\n action: event.action,\n stepIndex: event.stepIndex,\n pageUrl,\n pagePath: extractPath(pageUrl),\n ...(event.metadata ? { metadata: event.metadata } : {}),\n },\n });\n }\n\n /**\n * Encola una interacción de walkthrough SIN pasar por el dedup set.\n * Acciones como `step_advanced` se repiten naturalmente (cada next es\n * una navegación distinta) y deduplicarlas perdería datos.\n */\n private enqueueInteraction(\n guideId: string,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n action: GuideInteractionAction,\n stepIndex: number,\n ): void {\n this.trackerQueue.enqueue({\n guideId,\n payload: {\n endUserId,\n sessionId,\n action,\n stepIndex,\n pageUrl,\n pagePath: extractPath(pageUrl),\n },\n });\n }\n\n /**\n * Encola con dedup por sesión del SDK. Para `shown` del primer step:\n * no queremos re-emitirlo si el usuario navega entre dos páginas que\n * matchean el mismo step.\n */\n private enqueueInteractionOnce(\n guideId: string,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n action: GuideInteractionAction,\n stepIndex: number,\n ): void {\n const dedupKey = `${guideId}:${action}:${stepIndex}`;\n if (this.dispatched.has(dedupKey)) return;\n this.dispatched.add(dedupKey);\n this.enqueueInteraction(guideId, endUserId, sessionId, pageUrl, action, stepIndex);\n }\n\n private createSingleStepRenderer(type: GuideType): BaseRenderer | null {\n switch (type) {\n case 'modal':\n return new ModalRenderer();\n case 'banner':\n return new BannerRenderer();\n case 'tooltip':\n return new TooltipRenderer();\n case 'custom':\n return new CustomRenderer();\n case 'inline':\n return new InlineRenderer();\n case 'inline-custom':\n return new InlineCustomRenderer();\n case 'form':\n return new FormRenderer();\n case 'inline-form':\n return new InlineFormRenderer();\n case 'badge':\n return new BadgeRenderer();\n case 'composite':\n return new CompositeRenderer();\n case 'walkthrough':\n return null;\n default:\n return null;\n }\n }\n\n /**\n * Envía las respuestas de una guía `form` al backend, que las mergea como\n * propiedades del usuario. Usa el endUserId actual (o el anónimo si aún no\n * hubo identify — el backend pre-crea la fila igual que identify).\n */\n private async submitFormResponse(\n guideId: string,\n answers: Record<string, unknown>,\n ): Promise<boolean> {\n const endUserId = this.client.getEndUserId() ?? this.client.getAnonymousId();\n try {\n const res = await fetch(`${this.apiUrl}/v1/guides/${guideId}/form-response`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': this.apiKey },\n body: JSON.stringify({ endUserId, answers }),\n });\n if (!res.ok && this.debug) {\n console.warn('[veo] form-response respondió', res.status);\n }\n return res.ok;\n } catch (err) {\n if (this.debug) console.warn('[veo] form-response falló:', err);\n return false;\n }\n }\n}\n\nfunction extractPath(url: string): string {\n try {\n return new URL(url).pathname;\n } catch {\n return '/';\n }\n}\n\n/**\n * Cómo se presenta un paso dentro de un walkthrough. `style.render` ∈\n * `modal`/`banner` usa esos renderers (con navegación); cualquier otro valor\n * (incluido ausente o `tooltip`) usa el WalkthroughRenderer anclado.\n */\nfunction readStepRender(step: ResolvedGuide['guideSteps'][number] | undefined): string {\n const r = (step?.style as Record<string, unknown> | null | undefined)?.render;\n return typeof r === 'string' ? r : 'walkthrough';\n}\n","import {\n FREQUENCY_CACHE_KEY_PREFIX,\n FREQUENCY_CACHE_MAX_ENTRIES,\n FREQUENCY_CACHE_TTL_MS,\n} from './constants';\nimport type { DisplayFrequency, FrequencyCacheEntry, FrequencyStatus } from './types';\n\n/** Prioridad de status para no degradar shown→dismissed→… */\nconst STATUS_PRIORITY: Record<FrequencyStatus, number> = {\n shown: 1,\n dismissed: 2,\n completed: 2,\n};\n\n/**\n * Namespace short y estable derivado del apiKey. NO es cripto: solo evita\n * que dos apps que comparten el navegador pisen sus caches. El apiKey\n * público (`pk_*`) ya es workspace-único, así que usar sus últimos 16\n * caracteres alcanza para diferenciar.\n */\nexport function namespaceFromApiKey(apiKey: string): string {\n return apiKey.slice(-16) || 'default';\n}\n\n/**\n * Cache persistente de \"qué guías ya vio/cerró este usuario\". Vive en\n * `localStorage` con key namespaceada para evitar colisión entre\n * workspaces que corren en el mismo navegador.\n *\n * No es source of truth — el backend siempre manda. Esta cache solo\n * evita el flash visual de re-pintar una guía que el usuario ya cerró\n * antes de que el roundtrip al backend termine.\n */\nexport class GuideFrequencyCache {\n private readonly storageKey: string;\n private cache: Map<string, FrequencyCacheEntry>;\n\n constructor(namespace: string) {\n this.storageKey = `${FREQUENCY_CACHE_KEY_PREFIX}${namespace}`;\n this.cache = this.load();\n this.prune();\n }\n\n /**\n * Decide si una guía debe filtrarse localmente antes de pintarla.\n *\n * - `every_visit` / `always` → nunca filtra (siempre re-pinta).\n * - `once` → cualquier entry registrada filtra (verla ya cuenta).\n * - `until_dismissed` → si fue descartada O COMPLETADA (responder un\n * form / terminar un walkthrough es más fuerte que descartar — sin\n * esto, una encuesta seguiría preguntando después de respondida).\n */\n shouldFilter(guideId: string, displayFrequency: DisplayFrequency): boolean {\n if (displayFrequency === 'every_visit' || displayFrequency === 'always') return false;\n\n const entry = this.cache.get(guideId);\n if (!entry) return false;\n\n if (displayFrequency === 'once') return true;\n if (displayFrequency === 'until_dismissed') {\n return entry.status === 'dismissed' || entry.status === 'completed';\n }\n // `until_answered` (forms): solo COMPLETAR filtra localmente. El descarte\n // no la silencia — y si las props ya tienen valor por otro medio, es el\n // BACKEND quien la excluye del resolve (aquí no conocemos los traits).\n if (displayFrequency === 'until_answered') return entry.status === 'completed';\n return false;\n }\n\n /**\n * Registra/actualiza la entry de una guía. Nunca degrada un estado más\n * fuerte (no convierte `dismissed` en `shown` por un re-render). Persiste\n * cada llamada — escribir a localStorage es lo bastante barato.\n */\n record(guideId: string, status: FrequencyStatus): void {\n const existing = this.cache.get(guideId);\n if (existing && STATUS_PRIORITY[status] < STATUS_PRIORITY[existing.status]) {\n return;\n }\n this.cache.set(guideId, {\n guideId,\n status,\n lastInteractionAt: Date.now(),\n });\n this.persist();\n }\n\n /** Limpia el cache (botón \"reset\" del demo, tests). */\n clear(): void {\n this.cache.clear();\n this.persist();\n }\n\n /** Útil para debugging — devuelve un snapshot. */\n snapshot(): FrequencyCacheEntry[] {\n return Array.from(this.cache.values());\n }\n\n /**\n * Limpia entries expiradas por TTL y, si aún excede el límite, descarta\n * las más viejas hasta caber. Se ejecuta una vez en el constructor; no\n * vale la pena correrlo a cada lectura.\n */\n private prune(): void {\n const now = Date.now();\n let mutated = false;\n\n for (const [id, entry] of this.cache) {\n if (now - entry.lastInteractionAt > FREQUENCY_CACHE_TTL_MS) {\n this.cache.delete(id);\n mutated = true;\n }\n }\n\n if (this.cache.size > FREQUENCY_CACHE_MAX_ENTRIES) {\n const sorted = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].lastInteractionAt - b[1].lastInteractionAt,\n );\n const excess = this.cache.size - FREQUENCY_CACHE_MAX_ENTRIES;\n for (let i = 0; i < excess; i++) {\n const tuple = sorted[i];\n if (tuple) this.cache.delete(tuple[0]);\n }\n mutated = true;\n }\n\n if (mutated) this.persist();\n }\n\n private load(): Map<string, FrequencyCacheEntry> {\n if (typeof localStorage === 'undefined') return new Map();\n try {\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return new Map();\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) return new Map();\n const entries: Array<[string, FrequencyCacheEntry]> = [];\n for (const item of parsed) {\n if (\n item &&\n typeof item === 'object' &&\n typeof (item as FrequencyCacheEntry).guideId === 'string' &&\n typeof (item as FrequencyCacheEntry).lastInteractionAt === 'number' &&\n ['shown', 'dismissed', 'completed'].includes((item as FrequencyCacheEntry).status)\n ) {\n const e = item as FrequencyCacheEntry;\n entries.push([e.guideId, e]);\n }\n }\n return new Map(entries);\n } catch {\n return new Map();\n }\n }\n\n private persist(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n const serialized = JSON.stringify(Array.from(this.cache.values()));\n localStorage.setItem(this.storageKey, serialized);\n } catch {\n // QuotaExceeded o similar — el cache es opcional, no rompemos la app.\n }\n }\n}\n","import type { ResolvedGuide, ResolveGuidesResponse } from './types';\n\n/**\n * Wrapper sobre `GET /v1/guides/resolve`. Nunca lanza: cualquier error de\n * red o de parsing devuelve un array vacío, para que el plugin no rompa\n * la app del cliente.\n *\n * Importante: el endpoint usa `?pageUrl=...` (no `?url=...`) — el backend\n * valida con class-validator `IsUrl({ require_protocol: true })`.\n */\nexport class GuideResolverClient {\n constructor(\n private readonly apiUrl: string,\n private readonly apiKey: string,\n private readonly debug = false,\n ) {}\n\n async resolve(endUserId: string, pageUrl: string): Promise<ResolvedGuide[]> {\n const params = new URLSearchParams({ endUserId, pageUrl });\n let response: Response;\n try {\n response = await fetch(`${this.apiUrl}/v1/guides/resolve?${params.toString()}`, {\n method: 'GET',\n headers: { 'X-Api-Key': this.apiKey },\n credentials: 'omit',\n });\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolve fetch failed:', err);\n return [];\n }\n\n if (!response.ok) {\n if (this.debug) console.warn('[veo] guides resolve HTTP', response.status);\n return [];\n }\n\n try {\n const data = (await response.json()) as ResolveGuidesResponse;\n return Array.isArray(data.guides) ? data.guides : [];\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolve parse failed:', err);\n return [];\n }\n }\n\n /**\n * Trae una guía específica por ID, sin pasar por la lógica de\n * activación. La usa el controller para resumir un walkthrough entre\n * páginas: el `resolve` no devuelve la guía si la URL actual no\n * matchea, pero el walkthrough activo debe poder consultarla igual.\n *\n * El endpoint backend (`GET /v1/guides/:guideId`) devuelve `GuideResponse`,\n * un superset de `ResolvedGuide` con campos de audit. Aquí descartamos los\n * extra y nos quedamos con el shape que el resto del SDK ya consume.\n *\n * Devuelve `null` en cualquier error (404, red, parse) — el caller debe\n * tratarlo como \"guía ya no existe\" y cancelar el walkthrough limpiamente.\n */\n async fetchById(guideId: string): Promise<ResolvedGuide | null> {\n let response: Response;\n try {\n response = await fetch(`${this.apiUrl}/v1/guides/${encodeURIComponent(guideId)}`, {\n method: 'GET',\n headers: { 'X-Api-Key': this.apiKey },\n credentials: 'omit',\n });\n } catch (err) {\n if (this.debug) console.error('[veo] guides fetchById network failed:', err);\n return null;\n }\n\n if (!response.ok) {\n if (this.debug) console.warn('[veo] guides fetchById HTTP', response.status);\n return null;\n }\n\n try {\n const data = (await response.json()) as Partial<ResolvedGuide>;\n if (\n typeof data.guideId !== 'string' ||\n typeof data.guideName !== 'string' ||\n typeof data.guideType !== 'string' ||\n !Array.isArray(data.guideSteps) ||\n !data.activationRules ||\n typeof data.displayFrequency !== 'string' ||\n typeof data.displayPriority !== 'number'\n ) {\n if (this.debug) console.warn('[veo] guides fetchById: unexpected shape');\n return null;\n }\n return {\n guideId: data.guideId,\n guideName: data.guideName,\n guideType: data.guideType,\n guideSteps: data.guideSteps,\n activationRules: data.activationRules,\n displayFrequency: data.displayFrequency,\n displayPriority: data.displayPriority,\n };\n } catch (err) {\n if (this.debug) console.error('[veo] guides fetchById parse failed:', err);\n return null;\n }\n }\n}\n","import type { GuideInteractionMetadata, GuideInteractionPayload } from './types';\n\nexport interface InteractionRequest {\n guideId: string;\n payload: GuideInteractionPayload;\n}\n\n/**\n * Wire shape esperada por `POST /v1/guides/:id/interactions` en el backend.\n * Nuestro tipo interno (`GuideInteractionPayload`) usa `action`/`stepIndex`;\n * el backend exige `interactionType`/`stepPosition`. Esta función centraliza\n * la traducción.\n */\ninterface WireInteraction {\n endUserId: string;\n sessionId?: string;\n interactionType: GuideInteractionPayload['action'];\n stepPosition?: number;\n pageUrl?: string;\n pagePath?: string;\n metadata?: GuideInteractionMetadata;\n}\n\nfunction toWire(payload: GuideInteractionPayload): WireInteraction {\n const wire: WireInteraction = {\n endUserId: payload.endUserId,\n interactionType: payload.action,\n };\n if (payload.sessionId) wire.sessionId = payload.sessionId;\n if (typeof payload.stepIndex === 'number') wire.stepPosition = payload.stepIndex;\n if (payload.pageUrl) wire.pageUrl = payload.pageUrl;\n if (payload.pagePath) wire.pagePath = payload.pagePath;\n if (payload.metadata) wire.metadata = payload.metadata;\n return wire;\n}\n\n/**\n * Cliente HTTP puro para registrar interacciones de guías. No hace retry\n * ni queue — esa responsabilidad vive en `GuideTrackerQueue`.\n *\n * `send` lanza en error (queue puede reintentar). `sendBeacon` es síncrono,\n * \"best effort\", para el cierre de página: usa `navigator.sendBeacon` con\n * el apiKey como query param `?key=` (la única forma de autenticar con\n * sendBeacon, ya que no permite headers custom — el backend lo soporta\n * desde el ApiKeyGuard).\n */\nexport class GuideTrackerClient {\n constructor(\n private readonly apiUrl: string,\n private readonly apiKey: string,\n ) {}\n\n async send(request: InteractionRequest): Promise<void> {\n const url = this.buildUrl(request.guideId);\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'X-Api-Key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(toWire(request.payload)),\n credentials: 'omit',\n });\n\n if (!response.ok) {\n throw new Error(`guide interaction send failed: HTTP ${response.status}`);\n }\n }\n\n /**\n * Envío \"fire-and-forget\" en pagehide. Devuelve `false` si el navegador\n * no acepta el beacon (cola llena, no soportado) — en ese caso la queue\n * sabrá que perdió el envío.\n */\n sendBeacon(request: InteractionRequest): boolean {\n if (typeof navigator === 'undefined' || typeof navigator.sendBeacon !== 'function') {\n return false;\n }\n const url = `${this.buildUrl(request.guideId)}?key=${encodeURIComponent(this.apiKey)}`;\n const blob = new Blob([JSON.stringify(toWire(request.payload))], {\n type: 'application/json',\n });\n try {\n return navigator.sendBeacon(url, blob);\n } catch {\n return false;\n }\n }\n\n private buildUrl(guideId: string): string {\n return `${this.apiUrl}/v1/guides/${encodeURIComponent(guideId)}/interactions`;\n }\n}\n","import type { GuideTrackerClient, InteractionRequest } from './guide-tracker-client';\nimport type { QueuedInteraction } from './types';\n\n/** Base del backoff de reintento (ms); crece exponencial hasta el tope. */\nconst RETRY_BASE_MS = 3000;\nconst RETRY_MAX_DELAY_MS = 30_000;\n\nexport interface GuideTrackerQueueConfig {\n client: GuideTrackerClient;\n flushIntervalMs: number;\n batchSize: number;\n maxRetries: number;\n /**\n * Llamado cuando un item se descarta tras agotar `maxRetries`. El\n * plugin puede usarlo para `console.warn` en debug mode. Nunca debe\n * lanzar — si lo hace, se ignora silenciosamente.\n */\n onError?: (error: Error, item: QueuedInteraction) => void;\n}\n\n/**\n * Queue dedicada para `POST /v1/guides/:id/interactions`.\n *\n * Cada item es independiente (URL distinto por `guideId`), así que el\n * \"batch\" en realidad dispara N requests en paralelo. El `batchSize` es\n * el umbral para forzar un flush — no agrupa requests en uno solo.\n *\n * Retry:\n * - Si `send()` lanza, el item se devuelve al buffer con `attempts++`.\n * - El timer regular vuelve a intentar en el próximo tick.\n * - Al alcanzar `maxRetries`, se descarta llamando `onError`.\n *\n * En `pagehide`/`visibilitychange` (hidden) drena el buffer vía\n * `navigator.sendBeacon`. Best effort — no re-encola lo que el beacon\n * rechace porque la página ya se va.\n */\nexport class GuideTrackerQueue {\n private buffer: QueuedInteraction[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushing = false;\n private unloadCleanup: (() => void) | null = null;\n\n constructor(private readonly config: GuideTrackerQueueConfig) {\n this.startTimer();\n this.installUnloadHandler();\n }\n\n /** Tamaño actual del buffer (útil para debug/stats en el demo). */\n get size(): number {\n return this.buffer.length;\n }\n\n /**\n * Encola una interaction. Si el buffer alcanza `batchSize`, dispara\n * `flush()` inmediato.\n */\n enqueue(request: InteractionRequest): void {\n this.buffer.push({\n guideId: request.guideId,\n payload: request.payload,\n attempts: 0,\n enqueuedAt: Date.now(),\n });\n if (this.buffer.length >= this.config.batchSize) {\n void this.flush();\n }\n }\n\n /**\n * Envía todo el buffer en paralelo. Items que fallan vuelven al buffer\n * si todavía tienen reintentos disponibles. Idempotente con respecto a\n * flushes concurrentes (el segundo es un no-op).\n */\n async flush(): Promise<void> {\n if (this.flushing || this.buffer.length === 0) return;\n\n // Solo enviamos los items VENCIDOS (nextRetryAt en el pasado). Los que\n // esperan su backoff+jitter tras un fallo quedan en el buffer para un\n // tick futuro — así los reintentos de distintos clientes no se sincronizan.\n const now = Date.now();\n const due = this.buffer.filter((item) => (item.nextRetryAt ?? 0) <= now);\n if (due.length === 0) return;\n this.flushing = true;\n\n const dueSet = new Set(due);\n this.buffer = this.buffer.filter((item) => !dueSet.has(item));\n\n const results = await Promise.allSettled(\n due.map((item) => this.config.client.send({ guideId: item.guideId, payload: item.payload })),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const item = due[i];\n if (!result || !item) continue;\n if (result.status === 'fulfilled') continue;\n\n item.attempts += 1;\n if (item.attempts < this.config.maxRetries) {\n item.nextRetryAt = Date.now() + this.retryDelayMs(item.attempts);\n this.buffer.push(item);\n } else {\n this.safeOnError(result.reason, item);\n }\n }\n\n this.flushing = false;\n }\n\n /**\n * Backoff exponencial (base = intervalo de flush) con equal-jitter: mitad\n * fija + mitad aleatoria. Desincroniza los reintentos entre clientes ante\n * una caída del backend.\n */\n private retryDelayMs(attempts: number): number {\n const base = Math.min(RETRY_BASE_MS * 2 ** (attempts - 1), RETRY_MAX_DELAY_MS);\n return base / 2 + Math.random() * (base / 2);\n }\n\n /**\n * Drena el buffer vía `sendBeacon`. Síncrono, sin retry. Para pagehide.\n */\n flushBeacon(): void {\n if (this.buffer.length === 0) return;\n const batch = this.buffer.splice(0, this.buffer.length);\n for (const item of batch) {\n this.config.client.sendBeacon({ guideId: item.guideId, payload: item.payload });\n }\n }\n\n destroy(): void {\n if (this.timer) clearInterval(this.timer);\n this.timer = null;\n this.unloadCleanup?.();\n this.unloadCleanup = null;\n }\n\n private startTimer(): void {\n if (typeof window === 'undefined') return;\n this.timer = setInterval(() => {\n void this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private installUnloadHandler(): void {\n if (typeof window === 'undefined') return;\n const onPagehide = (): void => this.flushBeacon();\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') this.flushBeacon();\n };\n window.addEventListener('pagehide', onPagehide);\n window.addEventListener('visibilitychange', onVisibility);\n this.unloadCleanup = () => {\n window.removeEventListener('pagehide', onPagehide);\n window.removeEventListener('visibilitychange', onVisibility);\n };\n }\n\n private safeOnError(reason: unknown, item: QueuedInteraction): void {\n if (!this.config.onError) return;\n const error = reason instanceof Error ? reason : new Error(String(reason));\n try {\n this.config.onError(error, item);\n } catch {\n // Un onError roto no debe afectar al resto del flush.\n }\n }\n}\n","import type { StepPageLocation, UrlMatcher } from './types';\n\n/**\n * Matching de URL en CLIENTE (portado del backend `url-matcher.ts`). Lo usa el\n * motor composite para el targeting de página POR-PASO: como cada paso puede\n * apuntar a una página distinta (tours multi-página estilo Pendo), el SDK evalúa\n * la coincidencia en el navegador en cada navegación, no solo el backend.\n *\n * Errores de regex → `false` (no lanza): el patrón se validó al crear, pero una\n * fila corrupta no debe romper el render de una guía ajena.\n */\nexport function matchesUrl(matcher: UrlMatcher, pageUrl: string): boolean {\n switch (matcher.type) {\n case 'exact':\n return matcher.pattern === pageUrl;\n case 'prefix':\n return pageUrl.startsWith(matcher.pattern);\n case 'regex':\n try {\n return new RegExp(matcher.pattern).test(pageUrl);\n } catch {\n return false;\n }\n }\n}\n\n/** ¿El paso composite debe mostrarse en esta URL? Sitewide siempre; page → patrón. */\nexport function stepMatchesPage(\n loc: StepPageLocation | null | undefined,\n pageUrl: string,\n): boolean {\n if (!loc || loc.scope === 'sitewide' || !loc.pattern) return true;\n return matchesUrl({ type: loc.matchType ?? 'prefix', pattern: loc.pattern }, pageUrl);\n}\n","import { WALKTHROUGH_ABANDONMENT_TIMEOUT_MS, WALKTHROUGH_STATE_KEY_PREFIX } from './constants';\nimport type { WalkthroughState } from './types';\n\n/**\n * Estado persistente del walkthrough activo. Solo permite UNO por\n * workspace (namespace de apiKey). Vive en `localStorage` para sobrevivir\n * recargas de página: el step actual + el guideId alcanzan para resumir\n * desde donde quedó el usuario.\n *\n * Si pasan más de `WALKTHROUGH_ABANDONMENT_TIMEOUT_MS` sin progreso, se\n * considera abandonado: la próxima llamada a `current()` lo limpia\n * silenciosamente. NO se reporta `dismissed` al backend en ese caso —\n * abandonarse no es un acto del usuario.\n */\nexport class WalkthroughStateManager {\n private readonly storageKey: string;\n private state: WalkthroughState | null = null;\n\n constructor(namespace: string) {\n this.storageKey = `${WALKTHROUGH_STATE_KEY_PREFIX}${namespace}`;\n this.state = this.load();\n if (this.state && this.isAbandoned(this.state)) {\n this.clear();\n }\n }\n\n /**\n * Estado del walkthrough activo. Devuelve `null` si no hay ninguno o si\n * el último progreso fue hace más del timeout (en ese caso también\n * limpia el storage como side-effect).\n */\n current(): WalkthroughState | null {\n if (!this.state) return null;\n if (this.isAbandoned(this.state)) {\n this.clear();\n return null;\n }\n return this.state;\n }\n\n /** Atajo legible para el controller. */\n hasActive(): boolean {\n return this.current() !== null;\n }\n\n /**\n * Inicia un nuevo walkthrough en step 0. Sobreescribe cualquier estado\n * previo — los callers (controller) son responsables de verificar\n * `hasActive()` antes si necesitan exclusividad.\n */\n start(guideId: string, totalSteps: number): WalkthroughState {\n const now = Date.now();\n this.state = {\n guideId,\n totalSteps,\n currentStepIndex: 0,\n startedAt: now,\n lastProgressAt: now,\n };\n this.persist();\n return this.state;\n }\n\n /**\n * Avanza al siguiente step. Si el step resultante excede `totalSteps`,\n * devuelve `null` y NO toca el estado — el controller debe interpretar\n * eso como \"ya estamos en el último, no hay próximo\" y disparar\n * `complete` vía el handler del botón \"Finalizar\".\n */\n advance(): WalkthroughState | null {\n if (!this.state) return null;\n\n const next = this.state.currentStepIndex + 1;\n if (next >= this.state.totalSteps) return null;\n\n this.state = {\n ...this.state,\n currentStepIndex: next,\n lastProgressAt: Date.now(),\n };\n this.persist();\n return this.state;\n }\n\n /**\n * Retrocede al step anterior. En step 0 no hace nada y devuelve el\n * estado tal cual (el botón \"Atrás\" no debería estar visible en el\n * primer step, pero por defensa el manager también lo guard-ea).\n */\n back(): WalkthroughState | null {\n if (!this.state) return null;\n if (this.state.currentStepIndex === 0) return this.state;\n\n this.state = {\n ...this.state,\n currentStepIndex: this.state.currentStepIndex - 1,\n lastProgressAt: Date.now(),\n };\n this.persist();\n return this.state;\n }\n\n /** Limpia el estado activo (skip, complete, abandono, guía borrada). */\n clear(): void {\n this.state = null;\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(this.storageKey);\n } catch {\n // Storage bloqueado — no rompemos la app.\n }\n }\n\n private isAbandoned(state: WalkthroughState): boolean {\n return Date.now() - state.lastProgressAt > WALKTHROUGH_ABANDONMENT_TIMEOUT_MS;\n }\n\n private load(): WalkthroughState | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object') return null;\n const candidate = parsed as Partial<WalkthroughState>;\n if (\n typeof candidate.guideId !== 'string' ||\n typeof candidate.totalSteps !== 'number' ||\n typeof candidate.currentStepIndex !== 'number' ||\n typeof candidate.startedAt !== 'number' ||\n typeof candidate.lastProgressAt !== 'number'\n ) {\n return null;\n }\n return candidate as WalkthroughState;\n } catch {\n return null;\n }\n }\n\n private persist(): void {\n if (typeof localStorage === 'undefined' || !this.state) return;\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(this.state));\n } catch {\n // Quota exceeded — silently fail. El walkthrough en memoria sigue.\n }\n }\n}\n","/**\n * Modo PREVIEW POR LINK: la app del cliente se abre con\n * `?veoPreview=<token>` (link generado desde el dashboard) y el SDK canjea\n * el token contra `POST /v1/guides/preview-resolve` para renderizar ESA\n * guía como vista previa — aunque esté en draft — sobre la app real.\n *\n * A diferencia del modo builder no hay puente postMessage ni dashboard\n * abierto: es un link compartible para que el equipo pruebe la guía sin\n * publicarla. Reusa `previewGuide` (sin tracking/frecuencia/resolver) y\n * monta un chip flotante con \"volver a mostrar\" y \"cerrar\".\n *\n * Vive en el bundle de guías (`veo-guides.js`), NO en el `veo.js` core —\n * el core solo detecta el query param y dispara la carga del bundle.\n */\nimport { clearPreviewToken } from '../../core/preview-loader';\nimport { hasDocument } from '../../utils/safe-env';\nimport { previewGuide } from './guide-preview';\nimport type { ResolvedGuide } from './types';\n\nexport interface PreviewModeOptions {\n apiKey: string;\n apiUrl: string;\n /** Token firmado del link (`?veoPreview=<token>`). */\n token: string;\n debug?: boolean;\n}\n\nexport interface PreviewModeHandle {\n /** Cierra la preview y quita el chip. Idempotente. */\n teardown(): void;\n}\n\nlet active: PreviewModeHandle | null = null;\n\n/**\n * Canjea el token y renderiza la guía como vista previa + chip de control.\n * Si el token es inválido/expirado, el chip lo informa (solo quien tiene el\n * link lo ve). Solo una sesión de preview activa a la vez.\n */\nexport async function runPreviewMode(opts: PreviewModeOptions): Promise<PreviewModeHandle | null> {\n if (!hasDocument()) return null;\n active?.teardown();\n\n let guide: ResolvedGuide | null = null;\n try {\n const res = await fetch(`${opts.apiUrl}/v1/guides/preview-resolve`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': opts.apiKey },\n body: JSON.stringify({ token: opts.token }),\n });\n if (res.ok) {\n const data = (await res.json()) as { guide?: ResolvedGuide };\n guide = data.guide ?? null;\n } else if (opts.debug) {\n console.warn('[veo] preview-resolve respondió', res.status);\n }\n } catch (err) {\n if (opts.debug) console.warn('[veo] preview-resolve falló:', err);\n }\n\n /**\n * En el link de preview el envío de forms es REAL: corre sobre la app del\n * cliente con el SDK inicializado, así que la respuesta se guarda en el\n * usuario que está probando (su propia identidad) — permite verificar el\n * flujo completo props→segmentos sin tocar a nadie más.\n */\n const submitToBackend = async (answers: Record<string, unknown>): Promise<boolean> => {\n if (!guide) return false;\n const veo = (\n window as unknown as {\n veo?: { getEndUserId?: () => string | null; getAnonymousId?: () => string };\n }\n ).veo;\n const endUserId = veo?.getEndUserId?.() ?? veo?.getAnonymousId?.() ?? null;\n if (!endUserId) return false;\n try {\n const res = await fetch(`${opts.apiUrl}/v1/guides/${guide.guideId}/form-response`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': opts.apiKey },\n body: JSON.stringify({ endUserId, answers }),\n });\n return res.ok;\n } catch {\n return false;\n }\n };\n\n let preview: { close(): void } | null = null;\n const show = (): void => {\n if (!guide) return;\n preview?.close();\n preview = previewGuide({\n guideType: guide.guideType,\n guideSteps: guide.guideSteps,\n activationRules: guide.activationRules,\n guideName: guide.guideName,\n formSubmit: submitToBackend,\n formSubmitNote: 'Vista previa: guardado en TU usuario para probar el flujo.',\n });\n };\n\n const chip = mountChip({\n label: guide ? `Vista previa: ${guide.guideName}` : 'Link de preview inválido o vencido',\n error: !guide,\n onReshow: guide ? show : null,\n onClose: () => handle.teardown(),\n });\n\n const handle: PreviewModeHandle = {\n teardown() {\n preview?.close();\n preview = null;\n chip.remove();\n // Salir de verdad: borra el token persistido para que NO reaparezca al\n // navegar (si no, sessionStorage lo reviviría en la próxima página).\n clearPreviewToken();\n if (active === handle) active = null;\n },\n };\n active = handle;\n show();\n return handle;\n}\n\ninterface ChipOptions {\n label: string;\n error: boolean;\n onReshow: (() => void) | null;\n onClose: () => void;\n}\n\n/** Chip flotante (Shadow DOM, abajo-derecha) con re-mostrar y cerrar. */\nfunction mountChip(opts: ChipOptions): { remove(): void } {\n const host = document.createElement('div');\n host.setAttribute('data-veo-preview-chip', '');\n const root = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = `\n .chip { position: fixed; bottom: 16px; right: 16px; z-index: 2147483647;\n display: flex; align-items: center; gap: 8px; padding: 8px 12px;\n background: #111827; color: #f9fafb; border-radius: 9999px;\n font: 500 12px/1.2 system-ui, sans-serif; box-shadow: 0 4px 12px rgba(0,0,0,.25); }\n .chip.error { background: #7f1d1d; }\n .label { max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n button { all: unset; cursor: pointer; padding: 2px 6px; border-radius: 9999px;\n font-size: 12px; line-height: 1; }\n button:hover { background: rgba(255,255,255,.15); }\n `;\n root.appendChild(style);\n\n const chip = document.createElement('div');\n chip.className = opts.error ? 'chip error' : 'chip';\n\n const label = document.createElement('span');\n label.className = 'label';\n label.textContent = opts.label;\n chip.appendChild(label);\n\n if (opts.onReshow) {\n const reshow = document.createElement('button');\n reshow.textContent = '↻';\n reshow.title = 'Volver a mostrar la guía';\n reshow.addEventListener('click', opts.onReshow);\n chip.appendChild(reshow);\n }\n\n const close = document.createElement('button');\n close.textContent = '✕';\n close.title = 'Salir de la vista previa';\n close.addEventListener('click', opts.onClose);\n chip.appendChild(close);\n\n root.appendChild(chip);\n document.body.appendChild(host);\n return { remove: () => host.remove() };\n}\n","/**\n * @veo/sdk - SDK oficial de Veo para web (entry ESM/CJS para bundlers).\n *\n * Aquí las guías se importan ESTÁTICAMENTE (el bundler las incluye/treeshake).\n * El entry IIFE (`veo.ts` → `veo.js`) las carga PEREZOSAMENTE para quedar chico.\n */\nimport { resolveApiUrl } from './core/api-url';\nimport { isBuilderMode } from './core/builder-loader';\nimport { getPreviewToken } from './core/preview-loader';\nimport { setupClient } from './core/setup';\nimport { closeGuidePreview, guidesPlugin, previewGuide, runPreviewMode } from './plugins/guides';\nimport type { VeoClient, VeoConfig } from './types';\n\nexport { SDK_VERSION } from './contract/v1';\nexport { Client } from './core/client';\nexport { autocapturePlugin } from './plugins/autocapture';\nexport type { PreviewGuideInput, PreviewHandle, PreviewResult } from './plugins/guides';\nexport { closeGuidePreview, guidesPlugin, previewGuide } from './plugins/guides';\nexport { definePlugin } from './plugins/plugin';\n// El element picker (inspector) vive en un bundle aparte para no inflar el SDK\n// de producción: `import { startElementPicker } from '@veo/sdk/builder'`.\nexport { spaRouterPlugin } from './plugins/spa-router';\nexport type {\n VeoAutocaptureConfig,\n VeoClient,\n VeoConfig,\n VeoOrganization,\n VeoPlugin,\n VeoVisitor,\n} from './types';\n\n/**\n * Inicializa el SDK de Veo. Instala por defecto el plugin de SPA router\n * (auto-pageview) y, en browser, expone la instancia en `window.veo` drenando\n * la cola del snippet stub si existe.\n *\n * @example\n * ```ts\n * import { init } from '@veo/sdk';\n *\n * // apiUrl es opcional: por defecto apunta al backend gestionado de Veo.\n * const veo = init({ apiKey: 'pk_xxx' });\n *\n * veo.identify({ visitor: { id: 'user_123' } });\n * veo.track('button_clicked');\n * ```\n */\nexport function init(config: VeoConfig): VeoClient {\n const apiUrl = resolveApiUrl(config);\n return setupClient(\n config,\n (client) => {\n // Renderer de guías: opt-in. Reusa apiUrl/apiKey/debug del client.\n // En modo builder o preview-por-link NO se instala (ahí pinta la preview;\n // el runtime duplicaría/taparía con las guías live).\n const previewToken = getPreviewToken();\n if (config.guides === true && !isBuilderMode() && previewToken === null) {\n client.use(\n guidesPlugin({\n apiUrl,\n apiKey: config.apiKey,\n ...(config.debug !== undefined ? { debug: config.debug } : {}),\n }),\n );\n }\n\n // Modo preview-por-link (`?veoPreview=<token>`): renderiza la guía del\n // token como vista previa sobre la app real.\n if (previewToken !== null) {\n void runPreviewMode({\n apiKey: config.apiKey,\n apiUrl,\n token: previewToken,\n ...(config.debug !== undefined ? { debug: config.debug } : {}),\n });\n }\n\n // Conveniencia: `veo.preview(def)` / `veo.closePreview()` en la instancia.\n (client as unknown as Record<string, unknown>).preview = previewGuide;\n (client as unknown as Record<string, unknown>).closePreview = closeGuidePreview;\n },\n // Fallback de carga del builder para bundlers: `import()` dinámico → el bundler\n // lo code-splitea (solo se descarga en modo builder). Así el consumidor por\n // bundler NO necesita copiar `veo-builder.js` ni setear `builderUrl`.\n () => import('./plugins/builder').then((m) => m.initBuilderMode()),\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/safe-env.ts","../src/core/builder-constants.ts","../src/core/builder-token.ts","../src/plugins/autocapture/constants.ts","../src/plugins/autocapture/selector-builder.ts","../src/utils/uuid.ts","../src/plugins/guides/constants.ts","../src/plugins/guides/rich-text.ts","../src/plugins/guides/block-builder.ts","../src/plugins/guides/guide-design.ts","../src/plugins/guides/inline-host.ts","../src/plugins/guides/wait-for-element.ts","../src/plugins/guides/styles.ts","../src/plugins/guides/renderers/base-renderer.ts","../src/plugins/guides/renderers/floating-arrow.ts","../src/plugins/guides/renderers/badge-renderer.ts","../src/plugins/guides/walkthrough-block-builder.ts","../src/plugins/guides/renderers/banner-renderer.ts","../src/plugins/guides/renderers/custom-frame.ts","../src/plugins/guides/code-block.ts","../src/plugins/guides/form-content.ts","../src/plugins/guides/renderers/composite-renderer.ts","../src/plugins/guides/renderers/custom-renderer.ts","../src/plugins/guides/renderers/form-renderer.ts","../src/plugins/guides/renderers/inline-custom-renderer.ts","../src/plugins/guides/renderers/inline-form-renderer.ts","../src/plugins/guides/renderers/inline-renderer.ts","../src/plugins/guides/renderers/modal-renderer.ts","../src/plugins/guides/renderers/tooltip-renderer.ts","../src/plugins/guides/renderers/walkthrough-renderer.ts","../src/plugins/guides/guide-preview.ts","../src/plugins/builder/block-drop-target.ts","../src/plugins/builder/bridge-protocol.ts","../src/plugins/builder/builder-panel.ts","../src/plugins/builder/design-manipulator.ts","../src/plugins/builder/element-picker.ts","../src/plugins/builder/builder-mode.ts","../src/plugins/builder/builder-session.ts","../src/plugins/builder/index.ts","../src/contract/v1.ts","../src/core/api-url.ts","../src/core/builder-loader.ts","../src/core/preview-loader.ts","../src/plugins/plugin.ts","../src/plugins/autocapture/dom-listener.ts","../src/plugins/autocapture/element-serializer.ts","../src/plugins/autocapture/pii-guard.ts","../src/plugins/autocapture/throttle.ts","../src/plugins/autocapture/index.ts","../src/plugins/spa-router.ts","../src/core/client.ts","../src/core/queue.ts","../src/core/session.ts","../src/core/storage.ts","../src/core/transport.ts","../src/core/setup.ts","../src/plugins/guides/index.ts","../src/plugins/guides/guides-controller.ts","../src/plugins/guides/guide-frequency-cache.ts","../src/plugins/guides/guide-resolver-client.ts","../src/plugins/guides/guide-tracker-client.ts","../src/plugins/guides/guide-tracker-queue.ts","../src/plugins/guides/url-match.ts","../src/plugins/guides/walkthrough-state.ts","../src/plugins/guides/preview-mode.ts","../src/index.ts"],"names":["classes","classPart","init_constants","rebuilt","nodes","clamp","computePosition","offset","flip","shift","arrow","active","node","ready","renderer","MIN_W","MIN_H","session","isInteractive","END_USER_ID_KEY","RETRY_MAX_DELAY_MS"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAoCb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAsBb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,WAAA,EA6Bb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAUb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","file":"index.cjs","sourcesContent":["/**\n * Helpers para detectar el entorno de ejecución (browser vs SSR/Node) y la\n * disponibilidad de APIs del navegador. El SDK debe poder importarse en Node\n * sin romperse, por eso todo acceso a globals del browser pasa por aquí.\n */\n\n/** ¿Existe el objeto global `window`? */\nexport function hasWindow(): boolean {\n return typeof window !== 'undefined';\n}\n\n/** ¿Existe el objeto global `document`? */\nexport function hasDocument(): boolean {\n return typeof document !== 'undefined';\n}\n\n/** ¿`localStorage` está disponible y es escribible? (puede fallar en modo incógnito) */\nexport function hasLocalStorage(): boolean {\n try {\n if (typeof localStorage === 'undefined') return false;\n const testKey = '__veo_test__';\n localStorage.setItem(testKey, '1');\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n/** ¿`navigator.sendBeacon` está disponible? */\nexport function hasNavigatorSendBeacon(): boolean {\n return typeof navigator !== 'undefined' && typeof navigator.sendBeacon === 'function';\n}\n","/**\n * Nombres de los query params del puente builder. Constantes PURAS (sin DOM ni\n * `window`) para poder compartirlas entre el core (browser: `builder-token.ts`)\n * y el helper de servidor `veo-sdk/next` (`src/next.ts`), sin arrastrar código de\n * navegador al bundle de servidor.\n */\n\n/** Token de correlación del handshake. */\nexport const BUILDER_TOKEN_PARAM = 'veoBuilder';\n/** Origen del dashboard de Veo (para postMessage / frame-ancestors). */\nexport const BUILDER_ORIGIN_PARAM = 'veoBuilderOrigin';\n/** `1` → modo \"panel inyectado\": la app es top-level y el editor se inyecta encima. */\nexport const BUILDER_PANEL_PARAM = 'veoBuilderPanel';\n/** Path del panel del editor en el dashboard (default `/guides/design`). */\nexport const BUILDER_PANEL_PATH_PARAM = 'veoBuilderPanelPath';\n/** Id de la guía que se está editando (para cargar/guardar en el panel). */\nexport const BUILDER_GUIDE_PARAM = 'veoGuide';\n","/**\n * Resolución + persistencia del CONTEXTO de builder.\n *\n * El contexto viaja en la URL (`?veoBuilder=<token>&veoBuilderOrigin=<origen>…`),\n * pero los guards de auth de la app suelen **redirigir y tirar el query string**\n * (p.ej. `/dashboard/home` → `/` para loguearte). Si dependiéramos solo de la URL,\n * el modo builder moriría en ese redirect y nunca podrías diseñar sobre una página\n * detrás de login.\n *\n * Solución (igual que el \"designer mode\" de Pendo): apenas vemos el token en la\n * URL guardamos el contexto en `sessionStorage` y de ahí en más lo leemos como\n * fallback. Así el modo builder **sobrevive a redirects y a un login** dentro de la\n * misma pestaña (incluido el ida-y-vuelta de OAuth). Persiste hasta el teardown o\n * hasta que se cierra la pestaña.\n *\n * Vive en el core (bundle de producción) porque tanto el loader del builder como\n * el gate del runtime de guías necesitan saber si estamos en modo builder. Es\n * mínimo a propósito (ver budget en CLAUDE.md).\n */\nimport { hasWindow } from '../utils/safe-env';\nimport {\n BUILDER_GUIDE_PARAM,\n BUILDER_ORIGIN_PARAM,\n BUILDER_PANEL_PARAM,\n BUILDER_PANEL_PATH_PARAM,\n BUILDER_TOKEN_PARAM,\n} from './builder-constants';\n\n// Re-export para no romper a quien los importa desde aquí (bridge-protocol, etc.).\nexport { BUILDER_ORIGIN_PARAM, BUILDER_TOKEN_PARAM } from './builder-constants';\n\n/** Contexto de la sesión de builder activa en la app. */\nexport interface BuilderClientContext {\n /** Token de correlación del handshake. */\n token: string;\n /** Origen del dashboard de Veo (para postMessage). */\n origin: string | null;\n /** `true` → modo panel inyectado (app top-level, editor encima). */\n panel: boolean;\n /** Id de la guía en edición (para el panel). */\n guide: string | null;\n /** Path del panel del editor en el dashboard (override; default `/guides/design`). */\n panelPath: string | null;\n}\n\nconst CTX_KEY = 'veo:builder_ctx';\n/**\n * Respaldo en localStorage, KEYED POR GUÍA. sessionStorage muere al cerrar la\n * pestaña; para que la sesión del editor \"perdure\" al abrir varias guías o\n * reabrir la misma, además persistimos por guía en localStorage con un TTL.\n * Keyed por guía → dos guías abiertas en pestañas distintas no se pisan.\n */\nconst LS_PREFIX = 'veo:builder_ctx:';\n/**\n * TTL del respaldo. Antes era 12 h y producía \"sesiones fantasma\": cerrabas la\n * pestaña del editor sin teardown y CUALQUIER visita a la app durante 12 h\n * restauraba un contexto viejo (token/plantilla stale) o re-abría el panel.\n * 30 min alcanza para su propósito real — sobrevivir el ida-y-vuelta del login\n * y recuperar un cierre accidental — sin arrastrar sesiones de ayer.\n */\nconst PERSIST_TTL_MS = 30 * 60 * 1000; // 30 min\n\ninterface StoredCtx extends BuilderClientContext {\n savedAt: number;\n}\n\nfunction session(): Storage | null {\n try {\n return window.sessionStorage;\n } catch {\n return null; // sessionStorage puede tirar (modo privado, sandbox)\n }\n}\n\nfunction local(): Storage | null {\n try {\n return window.localStorage;\n } catch {\n return null;\n }\n}\n\nfunction lsKey(guide: string | null): string {\n return LS_PREFIX + (guide || 'default');\n}\n\n/** Persiste el contexto en sessionStorage (pestaña) + localStorage por guía (TTL). */\nfunction persist(ctx: BuilderClientContext): void {\n try {\n session()?.setItem(CTX_KEY, JSON.stringify(ctx));\n } catch {\n // no-op: sin sessionStorage seguimos con el contexto de la URL\n }\n try {\n const stored: StoredCtx = { ...ctx, savedAt: Date.now() };\n local()?.setItem(lsKey(ctx.guide), JSON.stringify(stored));\n } catch {\n // no-op\n }\n}\n\n/** Contexto más reciente no vencido en localStorage (limpia los vencidos de paso). */\nfunction readFreshFromLocal(): BuilderClientContext | null {\n const store = local();\n if (!store) return null;\n let best: StoredCtx | null = null;\n try {\n for (let i = 0; i < store.length; i++) {\n const key = store.key(i);\n if (!key?.startsWith(LS_PREFIX)) continue;\n const raw = store.getItem(key);\n if (!raw) continue;\n let parsed: StoredCtx | null = null;\n try {\n parsed = JSON.parse(raw) as StoredCtx;\n } catch {\n continue;\n }\n if (typeof parsed?.savedAt !== 'number' || Date.now() - parsed.savedAt > PERSIST_TTL_MS) {\n try {\n store.removeItem(key);\n } catch {\n // no-op\n }\n continue;\n }\n if (!best || parsed.savedAt > best.savedAt) best = parsed;\n }\n } catch {\n return null;\n }\n if (!best) return null;\n const { savedAt: _savedAt, ...ctx } = best;\n return ctx;\n}\n\nfunction urlParams(): URLSearchParams | null {\n try {\n const search = new URLSearchParams(window.location.search);\n if (search.get(BUILDER_TOKEN_PARAM)) return search;\n // Fallback: FRAGMENTO (#veoBuilder=…). El dashboard duplica los params en el\n // hash porque, con sesión iniciada en la app, el guard de auth suele\n // redirigir la raíz y el redirect tira el query string — pero los\n // navegadores preservan el fragmento a través de los 3xx. Sin esto, el\n // editor solo abría con el usuario deslogueado.\n const hash = window.location.hash.replace(/^#/, '');\n if (hash.includes(`${BUILDER_TOKEN_PARAM}=`)) return new URLSearchParams(hash);\n return search;\n } catch {\n return null;\n }\n}\n\n/**\n * Contexto de builder activo: el de la URL (que además se persiste) o, si el\n * query string se perdió en un redirect, el guardado en sessionStorage. `null`\n * si no estamos en modo builder.\n */\nexport function resolveBuilderContext(): BuilderClientContext | null {\n if (!hasWindow()) return null;\n const params = urlParams();\n const fromUrl = params?.get(BUILDER_TOKEN_PARAM);\n if (fromUrl) {\n const ctx: BuilderClientContext = {\n token: fromUrl,\n origin: params?.get(BUILDER_ORIGIN_PARAM) ?? null,\n panel: params?.get(BUILDER_PANEL_PARAM) === '1',\n guide: params?.get(BUILDER_GUIDE_PARAM) ?? null,\n panelPath: params?.get(BUILDER_PANEL_PATH_PARAM) ?? null,\n };\n persist(ctx);\n return ctx;\n }\n // Sin token en la URL: primero la pestaña (sessionStorage), y si murió (pestaña\n // nueva / restaurada) caemos al respaldo persistido más reciente y lo\n // re-hidratamos en la sesión para que el resto de la carga sea consistente.\n try {\n const raw = session()?.getItem(CTX_KEY);\n if (raw) return JSON.parse(raw) as BuilderClientContext;\n } catch {\n // sigue al fallback de localStorage\n }\n const fromLocal = readFreshFromLocal();\n if (fromLocal) {\n try {\n session()?.setItem(CTX_KEY, JSON.stringify(fromLocal));\n } catch {\n // no-op\n }\n }\n return fromLocal;\n}\n\n/** Token de builder activo (URL o persistido). */\nexport function resolveBuilderToken(): string | null {\n return resolveBuilderContext()?.token ?? null;\n}\n\n/** Origen del dashboard (URL o persistido). */\nexport function resolveBuilderOrigin(): string | null {\n return resolveBuilderContext()?.origin ?? null;\n}\n\n/** `true` si hay un contexto de builder activo (URL o persistido). */\nexport function isBuilderMode(): boolean {\n return resolveBuilderContext() !== null;\n}\n\n/**\n * Borra el modo builder persistido (al hacer teardown / salir del editor).\n * Limpia la pestaña (sessionStorage) y el respaldo de ESTA guía (localStorage);\n * los respaldos de otras guías siguen (no se pisan al cerrar una).\n */\nexport function clearBuilderToken(): void {\n if (!hasWindow()) return;\n let guide: string | null = null;\n try {\n const raw = session()?.getItem(CTX_KEY);\n if (raw) guide = (JSON.parse(raw) as BuilderClientContext).guide ?? null;\n } catch {\n // no-op\n }\n try {\n session()?.removeItem(CTX_KEY);\n } catch {\n // no-op\n }\n try {\n local()?.removeItem(lsKey(guide));\n } catch {\n // no-op\n }\n}\n","/** Configuración default de autocaptura. */\nexport const DEFAULT_AUTOCAPTURE_CONFIG = {\n enabled: true,\n captureClicks: true,\n captureSubmits: true,\n captureChanges: true,\n maskAllInputs: true,\n maskAllText: false,\n throttleMs: 100,\n maxTextLength: 200,\n captureElementMetadata: true,\n captureAncestors: 5,\n} as const;\n\n/** Máximo de niveles de ancestros que se permiten capturar. */\nexport const MAX_ANCESTORS = 10;\n\n/** Selectores que SIEMPRE se ignoran (incluso si el cliente no configura blockSelectors). */\nexport const ALWAYS_BLOCK_SELECTORS = [\n '[data-veo-ignore]',\n '.veo-ignore',\n // Inputs sensibles\n 'input[type=\"password\"]',\n 'input[type=\"email\"]',\n 'input[type=\"tel\"]',\n 'input[type=\"hidden\"]',\n // Datos de tarjeta\n '[autocomplete=\"cc-number\"]',\n '[autocomplete=\"cc-csc\"]',\n '[autocomplete=\"cc-exp\"]',\n '[autocomplete=\"cc-name\"]',\n // Otros campos sensibles típicos\n '[name*=\"password\" i]',\n '[name*=\"ssn\" i]',\n '[name*=\"credit\" i]',\n '[name*=\"card\" i]',\n '[id*=\"password\" i]',\n '[id*=\"ssn\" i]',\n];\n\n/** Atributos sensibles que NUNCA se capturan. */\nexport const SENSITIVE_ATTRIBUTES = ['value', 'data-credit-card', 'data-ssn', 'data-password'];\n\n/** Atributos útiles que SIEMPRE se intentan capturar si existen. */\nexport const PRIORITY_ATTRIBUTES = [\n 'id',\n 'name',\n 'type',\n 'role',\n 'href',\n 'data-action',\n 'data-veo-tag',\n 'data-testid',\n 'aria-label',\n 'aria-labelledby',\n];\n\n/** Regex para detectar clases generadas dinámicamente. Se descartan del selector. */\nexport const HASHED_CLASS_PATTERNS = [\n /^css-[a-z0-9]{4,}$/i, // emotion, styled-components nuevas\n /^_[a-z0-9]+_[a-z0-9]{4,}_\\d+$/, // CSS Modules con hash\n /^[a-z]{2,4}-[a-z0-9]{6,}$/i, // Tailwind JIT (a veces)\n /^[a-f0-9]{6,}$/i, // hashes hex puros\n /^sc-[a-z0-9]+$/i, // styled-components legacy\n];\n\n/** Eventos sintéticos/internos que ignoramos. */\nexport const IGNORED_EVENT_PROPERTIES = ['$autocapture', 'pageview'];\n","import { HASHED_CLASS_PATTERNS } from './constants';\n\n/** Determina si una clase parece generada dinámicamente (hash de CSS-in-JS, etc.). */\nexport function isHashedClass(className: string): boolean {\n return HASHED_CLASS_PATTERNS.some((pattern) => pattern.test(className));\n}\n\n/** Filtra las clases de un elemento para quedarse solo con las \"humanas\" (estables). */\nexport function filterHumanClasses(element: Element): string[] {\n return Array.from(element.classList).filter((c) => !isHashedClass(c) && c.length < 64);\n}\n\n/**\n * Atributos estables y semánticos que identifican un elemento mejor que sus\n * clases utilitarias (que cambian con el styling). Orden = prioridad. Producen\n * selectores legibles tipo `button[aria-label=\"Abrir menú\"]` que el usuario\n * puede escribir/reconocer en el editor de segmentos.\n */\nconst STABLE_ATTRIBUTES = [\n 'data-testid',\n 'data-test',\n 'data-cy',\n 'name',\n 'aria-label',\n 'placeholder',\n 'alt',\n 'title',\n // `href` identifica muy bien a los links (`<a>`), un target frecuente de\n // autocapture; va después de los atributos semánticos pero antes de los\n // genéricos. Valores largos (URLs absolutas con query) se descartan por\n // MAX_ATTR_VALUE_LENGTH.\n 'href',\n 'role',\n 'type',\n] as const;\n\n/** Valores de atributo más largos que esto se descartan (no son buenos selectores). */\nconst MAX_ATTR_VALUE_LENGTH = 100;\n\n/** Escape básico de caracteres especiales en CSS (usa CSS.escape si está disponible). */\nfunction cssEscape(value: string): string {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value);\n }\n return value.replace(/[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~]/g, '\\\\$&');\n}\n\n/**\n * Escape para un valor que va DENTRO de comillas en `[attr=\"...\"]`. A diferencia\n * de `cssEscape`, no escapa espacios ni acentos (las comillas ya los cubren):\n * solo `\\` y `\"`. Así el valor queda igual al texto real y el match por substring\n * del backend funciona con lo que el usuario escribe.\n */\nfunction escapeAttrValue(value: string): string {\n return value.replace(/[\\\\\"]/g, '\\\\$&');\n}\n\n/** Devuelve un selector por atributo estable si el elemento tiene alguno. */\nfunction stableAttributeSelector(element: Element, tag: string): string | null {\n for (const attr of STABLE_ATTRIBUTES) {\n const value = element.getAttribute(attr);\n if (value && value.length > 0 && value.length <= MAX_ATTR_VALUE_LENGTH) {\n return `${tag}[${attr}=\"${escapeAttrValue(value)}\"]`;\n }\n }\n return null;\n}\n\n/** Construye un selector simple y estable para UN elemento. */\nfunction buildElementSelector(element: Element): string {\n const tag = element.tagName.toLowerCase();\n\n // 1. `data-veo-tag`: el nombre semántico que da el cliente. Máxima prioridad.\n const veoTag = element.getAttribute('data-veo-tag');\n if (veoTag) {\n return `${tag}[data-veo-tag=\"${escapeAttrValue(veoTag)}\"]`;\n }\n\n // 2. `id`: único y estable. Lo combinamos con clases humanas (como antes).\n if (element.id) {\n const classes = filterHumanClasses(element);\n const classPart = classes.length > 0 ? `.${classes.map(cssEscape).join('.')}` : '';\n return `${tag}#${cssEscape(element.id)}${classPart}`;\n }\n\n // 3. Atributo estable (aria-label, name, type, role…): más robusto que clases.\n const attrSelector = stableAttributeSelector(element, tag);\n if (attrSelector) return attrSelector;\n\n // 4. Fallback: clases humanas.\n const classes = filterHumanClasses(element);\n const classPart = classes.length > 0 ? `.${classes.map(cssEscape).join('.')}` : '';\n return `${tag}${classPart}`;\n}\n\n/** Construye un selector CSS legible y razonablemente estable para el elemento. */\nexport function buildSelectorPath(element: Element, maxAncestors = 5): string {\n const parts: string[] = [];\n let current: Element | null = element;\n let depth = 0;\n\n while (current && current !== document.documentElement && depth <= maxAncestors) {\n parts.unshift(buildElementSelector(current));\n current = current.parentElement;\n depth++;\n }\n\n return parts.join(' > ');\n}\n","/**\n * Genera un UUID v7 (timestamp-based, ordenable cronológicamente).\n * Spec: RFC 9562.\n *\n * Formato: tttttttt-tttt-7xxx-yxxx-xxxxxxxxxxxx\n * - 48 bits de timestamp (ms desde epoch)\n * - 4 bits de versión (7)\n * - 2 bits de variante (10)\n * - 74 bits aleatorios\n */\nexport function uuidv7(): string {\n const timestamp = Date.now();\n const timeHex = timestamp.toString(16).padStart(12, '0');\n\n // 10 bytes aleatorios para los 74 bits de entropía (+ bits de versión/variante).\n const random = new Uint8Array(10);\n if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {\n crypto.getRandomValues(random);\n } else {\n // Fallback inseguro pero funcional (no debería ocurrir en browsers modernos).\n for (let i = 0; i < random.length; i++) {\n random[i] = Math.floor(Math.random() * 256);\n }\n }\n\n // Set version (7) en el primer nibble del 3er grupo.\n random[0] = ((random[0] ?? 0) & 0x0f) | 0x70;\n // Set variant (10) en los 2 bits altos del 4to grupo.\n random[2] = ((random[2] ?? 0) & 0x3f) | 0x80;\n\n const hex = Array.from(random, (b) => b.toString(16).padStart(2, '0')).join('');\n\n return [\n timeHex.slice(0, 8),\n timeHex.slice(8, 12),\n hex.slice(0, 4),\n hex.slice(4, 8),\n hex.slice(8, 20),\n ].join('-');\n}\n","/** z-index muy alto para flotar sobre cualquier UI del cliente sin tapar dev tools. */\nexport const GUIDE_Z_INDEX = 2147483640;\n\n/** Tiempo máximo esperando que aparezca el elemento ancla de un tooltip. */\nexport const DEFAULT_ANCHOR_WAIT_MS = 5000;\n\n/** Protocolos permitidos en `imageUrl` y `style.ctaUrl`. */\nexport const SAFE_URL_PROTOCOLS: ReadonlyArray<string> = ['http:', 'https:'];\n\n/** Atributo data-* que marca un host de guía en el DOM (útil para tests). */\nexport const GUIDE_HOST_ATTR = 'data-veo-guide';\n\n/**\n * Prefijo del key de localStorage donde vive el cache de frequency.\n * Se completa con un identificador derivado del apiKey para evitar\n * contaminación cuando el mismo navegador corre varios workspaces.\n */\nexport const FREQUENCY_CACHE_KEY_PREFIX = 'veo:freq:';\n\n/** Tiempo entre flushes automáticos del tracker (ms). */\nexport const DEFAULT_TRACKER_FLUSH_INTERVAL_MS = 3000;\n\n/** Cuántas interactions se acumulan antes de un flush forzado. */\nexport const DEFAULT_TRACKER_BATCH_SIZE = 5;\n\n/** Reintentos por item antes de descartar (se aplica con backoff implícito por el timer). */\nexport const DEFAULT_TRACKER_MAX_RETRIES = 3;\n\n/** Límite de entradas en el cache local — protege contra bloat de localStorage. */\nexport const FREQUENCY_CACHE_MAX_ENTRIES = 500;\n\n/** TTL para entradas del cache. Tras esto se vuelven a re-evaluar contra el backend. */\nexport const FREQUENCY_CACHE_TTL_MS = 90 * 24 * 60 * 60 * 1000;\n\n/**\n * Prefijo del key de localStorage donde vive el estado del walkthrough\n * activo. Se completa con el mismo `namespaceFromApiKey` que el frequency\n * cache para que dos workspaces en el mismo navegador no se pisen.\n */\nexport const WALKTHROUGH_STATE_KEY_PREFIX = 'veo:walkthrough_state:';\n\n/**\n * Si pasan 30 min sin progreso (`advance`/`back`), el walkthrough se\n * considera abandonado. El estado se limpia de localStorage al detectarlo\n * y NO se envía `completed` al backend (porque no se completó).\n */\nexport const WALKTHROUGH_ABANDONMENT_TIMEOUT_MS = 30 * 60 * 1000;\n\n/**\n * Tiempo máximo esperando que aparezca el selector del step actual en el\n * DOM. Más restrictivo que `DEFAULT_ANCHOR_WAIT_MS` porque en walkthroughs\n * la página correcta debería estar ya cargada al resumir.\n */\nexport const WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS = 5000;\n","import { isSafeUrl } from './block-builder';\n\n/**\n * Render SEGURO del rich text de bloques `text` (negrita/cursiva/subrayado/\n * links/listas). El backend guarda `block.html` ya sanitizado con la misma\n * whitelist, pero acá NO confiamos en eso: re-validamos al renderizar.\n *\n * Cómo mantiene la garantía \"sin innerHTML\" del renderer (regla 8 del\n * CLAUDE.md): el string se parsea con `DOMParser.parseFromString`, que produce\n * un documento INERTE — sus scripts no ejecutan y nada toca el DOM vivo —, y\n * el árbol resultante se RECONSTRUYE a mano: cada nodo cuyo tag está en la\n * whitelist se re-crea con `createElement`/`createTextNode`; los atributos NO\n * se copian (salvo `href` validado con `isSafeUrl`); los tags desconocidos se\n * \"unwrappean\" (se descarta el elemento, se conservan sus hijos de texto).\n * Nunca se inserta HTML crudo en el documento real.\n */\n\n/** Tags permitidos → tag con el que se re-crean (b/i se normalizan). */\nconst ALLOWED_TAGS: Record<string, string> = {\n P: 'p',\n BR: 'br',\n STRONG: 'strong',\n B: 'strong',\n EM: 'em',\n I: 'em',\n U: 'u',\n S: 's',\n UL: 'ul',\n OL: 'ol',\n LI: 'li',\n A: 'a',\n};\n\n/**\n * Tags que se descartan CON su contenido (a diferencia del unwrap): su texto\n * interno es código/markup, no copy — dejarlo visible sería basura (\"window.x\n * = 1;\" pintado en la guía).\n */\nconst DROP_TAGS = new Set([\n 'SCRIPT',\n 'STYLE',\n 'TEMPLATE',\n 'IFRAME',\n 'OBJECT',\n 'EMBED',\n 'NOSCRIPT',\n 'TITLE',\n 'TEXTAREA',\n 'SELECT',\n 'SVG',\n 'MATH',\n]);\n\nconst MAX_INPUT_LEN = 16 * 1024;\nconst MAX_DEPTH = 20;\nconst MAX_NODES = 1000;\n\n/**\n * Convierte un string de rich text whitelisted en un `DocumentFragment` seguro\n * construido nodo a nodo. Si el input excede las guardas (tamaño/nodos), cae a\n * un nodo de texto con el contenido plano — nunca falla ni lanza.\n */\nexport function renderRichText(html: string, doc: Document): DocumentFragment {\n const fragment = doc.createDocumentFragment();\n if (typeof html !== 'string' || html.length === 0) return fragment;\n\n let parsed: Document;\n try {\n parsed = new DOMParser().parseFromString(\n html.length > MAX_INPUT_LEN ? html.slice(0, MAX_INPUT_LEN) : html,\n 'text/html',\n );\n } catch {\n fragment.appendChild(doc.createTextNode(html));\n return fragment;\n }\n\n const budget = { nodes: 0, exceeded: false };\n for (const child of Array.from(parsed.body.childNodes)) {\n const rebuilt = rebuildNode(child, doc, 0, budget);\n if (rebuilt) fragment.appendChild(rebuilt);\n }\n\n // Presupuesto excedido: descartar el árbol parcial y caer a texto plano.\n if (budget.exceeded) {\n const plain = doc.createDocumentFragment();\n plain.appendChild(doc.createTextNode(parsed.body.textContent ?? ''));\n return plain;\n }\n return fragment;\n}\n\nfunction rebuildNode(\n node: Node,\n doc: Document,\n depth: number,\n budget: { nodes: number; exceeded: boolean },\n): Node | null {\n if (budget.exceeded) return null;\n if (++budget.nodes > MAX_NODES || depth > MAX_DEPTH) {\n budget.exceeded = true;\n return null;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n return doc.createTextNode(node.textContent ?? '');\n }\n if (node.nodeType !== Node.ELEMENT_NODE) return null; // comentarios, etc.\n\n const el = node as Element;\n if (DROP_TAGS.has(el.tagName)) return null; // fuera con contenido y todo\n const mapped = ALLOWED_TAGS[el.tagName];\n\n // Tag desconocido → unwrap: se conservan los hijos, sin el elemento.\n if (!mapped) {\n const frag = doc.createDocumentFragment();\n for (const child of Array.from(el.childNodes)) {\n const rebuilt = rebuildNode(child, doc, depth + 1, budget);\n if (rebuilt) frag.appendChild(rebuilt);\n }\n return frag;\n }\n\n // Links: solo con href http(s); si el href no pasa, se unwrappea a texto.\n if (mapped === 'a') {\n const href = el.getAttribute('href') ?? '';\n if (!isSafeUrl(href)) {\n const frag = doc.createDocumentFragment();\n for (const child of Array.from(el.childNodes)) {\n const rebuilt = rebuildNode(child, doc, depth + 1, budget);\n if (rebuilt) frag.appendChild(rebuilt);\n }\n return frag;\n }\n const a = doc.createElement('a');\n a.setAttribute('href', href);\n a.setAttribute('target', '_blank');\n a.setAttribute('rel', 'noopener noreferrer nofollow');\n for (const child of Array.from(el.childNodes)) {\n const rebuilt = rebuildNode(child, doc, depth + 1, budget);\n if (rebuilt) a.appendChild(rebuilt);\n }\n return a;\n }\n\n // Elemento permitido: re-crear SIN copiar atributos.\n const rebuilt = doc.createElement(mapped);\n for (const child of Array.from(el.childNodes)) {\n const childNode = rebuildNode(child, doc, depth + 1, budget);\n if (childNode) rebuilt.appendChild(childNode);\n }\n return rebuilt;\n}\n","import { SAFE_URL_PROTOCOLS } from './constants';\nimport { renderRichText } from './rich-text';\nimport type { CtaAction, GuideInteractionMetadata, GuideStep, StepBlock } from './types';\n\ninterface StepCallbacks {\n /** `meta` identifica QUÉ botón se clickeó (analytics por botón). */\n onCtaClick: (action: CtaAction, url?: string, meta?: GuideInteractionMetadata) => void;\n onDismiss: () => void;\n}\n\n/**\n * Construye el subtree DOM de un step (título, contenido, imagen, CTA,\n * botón de cerrar) de forma segura.\n *\n * Reglas inmutables:\n * - **Nunca** usa `innerHTML` ni `insertAdjacentHTML`.\n * - Todo texto se asigna por `textContent` (escape HTML automático).\n * - URLs (`imageUrl`, `style.ctaUrl`) pasan por `isSafeUrl` — solo\n * `http(s):` permitido, rechaza `javascript:`, `data:`, etc.\n * - Campos opcionales ausentes simplemente no pintan su nodo. Si una\n * guía no trae `ctaText` no se pinta botón.\n *\n * El `doc` se inyecta para soportar tests con jsdom u otros documentos.\n */\nexport function buildStepContent(\n step: GuideStep,\n doc: Document,\n callbacks: StepCallbacks,\n): HTMLElement {\n const container = doc.createElement('div');\n container.className = 'veo-guide-content';\n\n const blocks = normalizeBlocks(step);\n if (blocks) {\n renderBlocks(container, blocks, doc, callbacks);\n } else {\n renderLegacyStep(container, step, doc, callbacks);\n }\n\n // Botón \"✕\" siempre presente (esquina superior derecha).\n container.appendChild(createCloseButton(doc, () => callbacks.onDismiss()));\n\n return container;\n}\n\n/**\n * Nodos de CONTENIDO de un paso (títulos/textos/imágenes — SIN botones ni ✕):\n * respeta `blocks[]` (con rich text y full-bleed) o cae a los escalares\n * legacy. Lo usa el walkthrough, cuya navegación es propia — los bloques\n * `button` del paso se omiten porque atrás/siguiente/omitir los pinta el\n * chrome del tour.\n */\nexport function buildContentNodes(step: GuideStep, doc: Document): HTMLElement[] {\n const blocks = normalizeBlocks(step);\n if (blocks) {\n const nodes: HTMLElement[] = [];\n for (const { block, idx } of blocks) {\n if (block.type === 'button') continue;\n const node = buildContentBlock(block, doc);\n if (!node) continue;\n node.dataset.veoIdx = String(idx);\n nodes.push(node);\n }\n return nodes;\n }\n const nodes: HTMLElement[] = [];\n if (typeof step.imageUrl === 'string' && step.imageUrl && isSafeUrl(step.imageUrl)) {\n const img = doc.createElement('img');\n img.className = 'veo-guide-image';\n img.src = step.imageUrl;\n img.alt = typeof step.title === 'string' ? step.title : '';\n nodes.push(img);\n }\n if (typeof step.title === 'string' && step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n nodes.push(heading);\n }\n if (typeof step.content === 'string' && step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n nodes.push(paragraph);\n }\n return nodes;\n}\n\n/** Render clásico: imagen + un título + un texto + un CTA (campos escalares). */\nfunction renderLegacyStep(\n container: HTMLElement,\n step: GuideStep,\n doc: Document,\n callbacks: StepCallbacks,\n): void {\n if (typeof step.imageUrl === 'string' && step.imageUrl && isSafeUrl(step.imageUrl)) {\n const img = doc.createElement('img');\n img.className = 'veo-guide-image';\n img.src = step.imageUrl;\n img.alt = typeof step.title === 'string' ? step.title : '';\n container.appendChild(img);\n }\n\n if (typeof step.title === 'string' && step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n container.appendChild(heading);\n }\n\n if (typeof step.content === 'string' && step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n container.appendChild(paragraph);\n }\n\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n\n if (typeof step.ctaText === 'string' && step.ctaText) {\n const cta = doc.createElement('button');\n cta.type = 'button';\n cta.className = 'veo-guide-cta';\n cta.textContent = step.ctaText;\n cta.addEventListener('click', () => {\n const action: CtaAction = step.ctaAction ?? 'dismiss';\n const ctaUrl = readCtaUrl(step);\n callbacks.onCtaClick(action, ctaUrl);\n });\n actions.appendChild(cta);\n }\n\n container.appendChild(actions);\n}\n\n/**\n * Devuelve los bloques válidos del paso CON su índice original en\n * `step.blocks[]` (el drop-target del editor lo necesita: los bloques\n * filtrados u omitidos corren los índices del DOM, no los del modelo), o\n * `null` si no hay ninguno (usa el legacy).\n */\nfunction normalizeBlocks(step: GuideStep): Array<{ block: StepBlock; idx: number }> | null {\n if (!Array.isArray(step.blocks) || step.blocks.length === 0) return null;\n const valid = step.blocks\n .map((block, idx) => ({ block, idx }))\n .filter((entry): entry is { block: StepBlock; idx: number } => {\n const b = entry.block;\n if (!b || typeof b !== 'object') return false;\n if (b.type === 'image') return typeof b.url === 'string' && isSafeUrl(b.url);\n return b.type === 'title' || b.type === 'text' || b.type === 'button';\n });\n return valid.length > 0 ? valid : null;\n}\n\n/**\n * Render por bloques: recorre en orden. Los botones consecutivos se agrupan en\n * una misma fila de acciones (para que queden lado a lado). Todo texto por\n * `textContent`; las imágenes por `isSafeUrl`.\n */\nfunction renderBlocks(\n container: HTMLElement,\n blocks: Array<{ block: StepBlock; idx: number }>,\n doc: Document,\n callbacks: StepCallbacks,\n): void {\n let i = 0;\n while (i < blocks.length) {\n const entry = blocks[i];\n if (entry?.block.type === 'button') {\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n // La fila agrupada lleva el índice del PRIMER botón.\n actions.dataset.veoIdx = String(entry.idx);\n // La alineación de un botón mueve la FILA (justify-content), no el botón\n // dentro de ella (align-self sería el eje vertical y no haría nada).\n let rowAlign: string | undefined;\n while (i < blocks.length && blocks[i]?.block.type === 'button') {\n const btnBlock = (blocks[i] as { block: StepBlock }).block;\n if (!rowAlign) {\n const a = (btnBlock.style as Record<string, unknown> | null | undefined)?.align;\n if (a === 'left' || a === 'center' || a === 'right') rowAlign = a;\n }\n actions.appendChild(buildButtonBlock(btnBlock, doc, callbacks));\n i++;\n }\n if (rowAlign) actions.style.justifyContent = BLOCK_ALIGN_SELF[rowAlign] as string;\n container.appendChild(actions);\n continue;\n }\n const node = entry ? buildContentBlock(entry.block, doc) : null;\n if (node && entry) {\n node.dataset.veoIdx = String(entry.idx);\n container.appendChild(node);\n }\n i++;\n }\n}\n\nexport function buildContentBlock(block: StepBlock, doc: Document): HTMLElement | null {\n switch (block.type) {\n case 'title': {\n const el = doc.createElement('h2');\n el.className = 'veo-guide-title';\n el.textContent = typeof block.text === 'string' ? block.text : '';\n applyBlockStyle(el, block.style, 'text');\n return el;\n }\n case 'text': {\n // `div` (no `p`): el rich text puede contener sus propios <p>/<ul>.\n const el = doc.createElement('div');\n el.className = 'veo-guide-text';\n if (typeof block.html === 'string' && block.html) {\n el.appendChild(renderRichText(block.html, doc));\n } else {\n el.textContent = typeof block.text === 'string' ? block.text : '';\n }\n applyBlockStyle(el, block.style, 'text');\n return el;\n }\n case 'image': {\n if (typeof block.url !== 'string' || !isSafeUrl(block.url)) return null;\n const el = doc.createElement('img');\n el.className = 'veo-guide-image';\n el.src = block.url;\n el.alt = '';\n applyBlockStyle(el, block.style, 'image');\n return el;\n }\n default:\n return null;\n }\n}\n\nfunction buildButtonBlock(\n block: StepBlock,\n doc: Document,\n callbacks: StepCallbacks,\n): HTMLButtonElement {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = 'veo-guide-cta';\n btn.textContent = typeof block.text === 'string' && block.text ? block.text : 'OK';\n applyBlockStyle(btn, block.style, 'button');\n btn.addEventListener('click', () => {\n // Camino viejo (renderer clásico): solo maneja CtaAction. Las acciones\n // nuevas del modelo unificado (prev/submit-forms*) las maneja el renderer\n // unificado; acá degradan a `dismiss` (no aparecen en guías viejas).\n const raw = block.action ?? 'dismiss';\n const action: CtaAction = raw === 'next' || raw === 'url' || raw === 'guide' ? raw : 'dismiss';\n // El 2º argumento es \"el destino\" de la acción: la URL para `url`, el\n // guideId para `guide` (encadenado). Para el resto, undefined.\n const target =\n action === 'url' && typeof block.url === 'string' && isSafeUrl(block.url)\n ? block.url\n : action === 'guide' && typeof block.targetGuideId === 'string' && block.targetGuideId\n ? block.targetGuideId\n : undefined;\n const meta: GuideInteractionMetadata = {\n ...(typeof block.id === 'string' && block.id ? { buttonId: block.id } : {}),\n ...(typeof block.text === 'string' && block.text ? { buttonText: block.text } : {}),\n };\n callbacks.onCtaClick(action, target, Object.keys(meta).length ? meta : undefined);\n });\n return btn;\n}\n\nconst BLOCK_ALIGN_SELF: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\nfunction clampNum(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Aplica el estilo por-bloque como estilos INLINE (cada bloque es único, no\n * puede usar las CSS vars compartidas del host). Setear `el.style.*` es seguro:\n * el browser descarta valores inválidos (no hay inyección de CSS crudo).\n */\nexport function applyBlockStyle(\n el: HTMLElement,\n style: StepBlock['style'],\n kind: 'text' | 'image' | 'button',\n): void {\n if (!style || typeof style !== 'object') return;\n const s = style as Record<string, unknown>;\n // Imagen \"a sangre\": ocupa todo el ancho de la tarjeta ignorando el padding\n // (hero image estilo anuncio). El CSS de la clase manda — se saltan las\n // props inline de tamaño/alineación que la contradirían.\n if (kind === 'image' && s.bleed === true) {\n el.classList.add('veo-guide-image--bleed');\n return;\n }\n const align = typeof s.align === 'string' ? s.align : null;\n if (align && (align === 'left' || align === 'center' || align === 'right')) {\n // text → text-align; image → align-self (se encoge y se ubica);\n // button → NO aquí (la fila de acciones maneja su justify-content).\n if (kind === 'text') el.style.textAlign = align;\n else if (kind === 'image') el.style.alignSelf = BLOCK_ALIGN_SELF[align] as string;\n }\n if (kind !== 'image' && typeof s.color === 'string') el.style.color = s.color;\n if (kind === 'text' && typeof s.fontSize === 'number' && Number.isFinite(s.fontSize)) {\n el.style.fontSize = `${clampNum(s.fontSize, 8, 72)}px`;\n }\n if (kind === 'image' && typeof s.width === 'number' && Number.isFinite(s.width)) {\n el.style.width = `${clampNum(s.width, 10, 100)}%`;\n }\n if (kind === 'image' && typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n el.style.borderRadius = `${clampNum(s.radius, 0, 48)}px`;\n }\n if (typeof s.marginTop === 'number' && Number.isFinite(s.marginTop)) {\n el.style.marginTop = `${clampNum(s.marginTop, 0, 64)}px`;\n }\n if (typeof s.marginBottom === 'number' && Number.isFinite(s.marginBottom)) {\n el.style.marginBottom = `${clampNum(s.marginBottom, 0, 64)}px`;\n }\n\n // ── Estilos por-bloque extendidos (panel de estilos del editor) ──\n // Tipografía (texto/título/botón; no imagen).\n if (kind !== 'image') {\n if (typeof s.fontSize === 'number' && Number.isFinite(s.fontSize)) {\n el.style.fontSize = `${clampNum(s.fontSize, 8, 96)}px`;\n }\n if (typeof s.fontFamily === 'string' && s.fontFamily && s.fontFamily !== 'inherit') {\n el.style.fontFamily = s.fontFamily;\n }\n if (typeof s.fontWeight === 'string' && s.fontWeight) el.style.fontWeight = s.fontWeight;\n if (typeof s.textTransform === 'string' && s.textTransform && s.textTransform !== 'none') {\n el.style.textTransform = s.textTransform;\n }\n if (typeof s.lineHeight === 'number' && Number.isFinite(s.lineHeight)) {\n el.style.lineHeight = `${clampNum(s.lineHeight, 50, 300)}%`;\n }\n if (typeof s.letterSpacing === 'number' && Number.isFinite(s.letterSpacing)) {\n el.style.letterSpacing = `${clampNum(s.letterSpacing, -5, 20)}px`;\n }\n }\n // Fondo, borde, radio (todos los tipos).\n if (typeof s.background === 'string' && s.background) el.style.background = s.background;\n if (typeof s.borderWidth === 'number' && s.borderWidth > 0) {\n const bc = typeof s.borderColor === 'string' && s.borderColor ? s.borderColor : '#bbbbbb';\n el.style.border = `${clampNum(s.borderWidth, 0, 20)}px solid ${bc}`;\n }\n if (kind !== 'image' && typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n el.style.borderRadius = `${clampNum(s.radius, 0, 64)}px`;\n }\n // Padding y margen — los 4 lados.\n for (const side of ['Top', 'Right', 'Bottom', 'Left'] as const) {\n const p = s[`padding${side}`];\n if (typeof p === 'number' && Number.isFinite(p)) {\n el.style.setProperty(`padding-${side.toLowerCase()}`, `${clampNum(p, 0, 128)}px`);\n }\n const m = s[`margin${side}`];\n if (typeof m === 'number' && Number.isFinite(m)) {\n el.style.setProperty(`margin-${side.toLowerCase()}`, `${clampNum(m, 0, 128)}px`);\n }\n }\n}\n\n/**\n * Botón \"✕\" de cerrar reutilizable. Universal: modal/banner/tooltip/inline (vía\n * `buildStepContent`), walkthrough, forms y guías custom lo usan, para que toda\n * guía tenga siempre una salida en la esquina superior derecha.\n *\n * `className` permite un estilo distinto por chrome (las custom usan\n * `veo-custom-close`, un botón visible sobre HTML arbitrario del cliente).\n */\nexport function createCloseButton(\n doc: Document,\n onClose: () => void,\n className = 'veo-guide-close',\n): HTMLButtonElement {\n const closeBtn = doc.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = className;\n closeBtn.setAttribute('aria-label', 'Cerrar');\n closeBtn.textContent = '×';\n closeBtn.addEventListener('click', onClose);\n return closeBtn;\n}\n\n/**\n * Acepta solo `http:` y `https:`. Resuelve relativas contra la página\n * actual cuando hay `window`; en SSR (sin window) toma la URL como\n * absoluta. Rechaza cualquier protocolo no listado y URLs malformadas.\n */\nexport function isSafeUrl(url: string): boolean {\n if (typeof url !== 'string' || url.length === 0) return false;\n try {\n const base = typeof window !== 'undefined' ? window.location.href : 'http://localhost/';\n const parsed = new URL(url, base);\n return SAFE_URL_PROTOCOLS.includes(parsed.protocol);\n } catch {\n return false;\n }\n}\n\n/**\n * El backend no tiene aún un campo `ctaUrl` en el GuideStep — la URL\n * destino para `ctaAction === 'url'` se guarda como convención en\n * `style.ctaUrl`. Esta función la extrae validando que sea una URL\n * segura. Devuelve `undefined` si falta o no pasa el chequeo.\n */\nfunction readCtaUrl(step: GuideStep): string | undefined {\n const candidate = step.style?.ctaUrl;\n if (typeof candidate !== 'string') return undefined;\n return isSafeUrl(candidate) ? candidate : undefined;\n}\n","import type { GuideStep } from './types';\n\n/**\n * Tematización de guías dirigida por datos. El autor (dashboard no-code)\n * guarda props de diseño en `step.style`; aquí las traducimos a las\n * variables CSS `--veo-*` que ya define `GUIDE_STYLES`.\n *\n * Seguridad: solo asignamos *custom properties* sobre el host (valores,\n * nunca selectores ni código). Validamos cada valor; lo inválido se ignora\n * y queda el default del stylesheet. Ningún valor llega a `innerHTML` ni a\n * `eval` — coherente con las reglas del renderer.\n */\n\n/** Overrides del tema oscuro (claro = defaults del stylesheet). */\nconst DARK_THEME: Record<string, string> = {\n '--veo-bg': '#1f2937',\n '--veo-text': '#f9fafb',\n '--veo-text-secondary': '#d1d5db',\n '--veo-shadow': '0 20px 60px rgba(0, 0, 0, 0.55)',\n};\n\nconst ALIGN_JUSTIFY: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\n/** `align-self` en el contenedor flex del step (para elementos tipo imagen). */\nconst ALIGN_SELF: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\n/** Elementos con estilo propio + qué usan para alinear (text-align vs align-self). */\nconst ELEMENT_ALIGN_MODE: Record<string, 'text' | 'self'> = {\n title: 'text',\n text: 'text',\n image: 'self',\n};\n\n/** Presets de sombra → box-shadow. */\nconst SHADOW: Record<string, string> = {\n none: 'none',\n soft: '0 4px 14px rgba(0, 0, 0, 0.10)',\n medium: '0 8px 30px rgba(0, 0, 0, 0.18)',\n strong: '0 24px 60px rgba(0, 0, 0, 0.32)',\n};\n\n/** Presets de posición del modal → fracción [x, y] del overlay (0..1). */\nconst PRESET_POS: Record<string, [number, number]> = {\n center: [0.5, 0.5],\n top: [0.5, 0],\n bottom: [0.5, 1],\n left: [0, 0.5],\n right: [1, 0.5],\n 'top-left': [0, 0],\n 'top-right': [1, 0],\n 'bottom-left': [0, 1],\n 'bottom-right': [1, 1],\n};\n\n/**\n * Acepta colores CSS razonables: hex (#rgb..#rrggbbaa), funcional\n * (rgb/rgba/hsl/hsla) o keyword simple. No interpola en CSS arbitrario:\n * el valor solo se usa como valor de una custom property.\n */\nexport const COLOR_RE = /^#[0-9a-f]{3,8}$|^(rgb|rgba|hsl|hsla)\\([\\d.,%/\\sdeg]+\\)$|^[a-z]{3,20}$/i;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Aplica las props de diseño de `step.style` como variables CSS sobre el\n * host del shadow root. No-op si no hay style. Idempotente.\n */\nexport function applyDesignVars(host: HTMLElement, style: GuideStep['style']): void {\n if (!style || typeof style !== 'object') return;\n const s = style as Record<string, unknown>;\n\n if (typeof s.accentColor === 'string' && COLOR_RE.test(s.accentColor.trim())) {\n host.style.setProperty('--veo-primary', s.accentColor.trim());\n }\n\n // Fuente (del design system del workspace). Sin `<>{}` para no romper el CSS.\n if (\n typeof s.fontFamily === 'string' &&\n s.fontFamily.length <= 200 &&\n !/[<>{}]/.test(s.fontFamily)\n ) {\n host.style.setProperty('--veo-font', s.fontFamily.trim());\n }\n\n if (s.theme === 'dark') {\n for (const [key, value] of Object.entries(DARK_THEME)) {\n host.style.setProperty(key, value);\n }\n }\n\n // Colores del tema PERSONALIZADOS (design system): pisan el preset claro/oscuro.\n if (typeof s.background === 'string' && COLOR_RE.test(s.background.trim())) {\n host.style.setProperty('--veo-bg', s.background.trim());\n }\n if (typeof s.textColor === 'string' && COLOR_RE.test(s.textColor.trim())) {\n host.style.setProperty('--veo-text', s.textColor.trim());\n }\n if (typeof s.textSecondaryColor === 'string' && COLOR_RE.test(s.textSecondaryColor.trim())) {\n host.style.setProperty('--veo-text-secondary', s.textSecondaryColor.trim());\n }\n\n if (typeof s.radius === 'number' && Number.isFinite(s.radius)) {\n host.style.setProperty('--veo-radius', `${clamp(s.radius, 0, 48)}px`);\n }\n\n if (typeof s.width === 'number' && Number.isFinite(s.width)) {\n host.style.setProperty('--veo-width', `${clamp(s.width, 220, 720)}px`);\n }\n\n // Alto mínimo de la tarjeta (modal). min-height y no height: el contenido\n // nunca se recorta. Lo setea el resize por arrastre del editor.\n if (typeof s.height === 'number' && Number.isFinite(s.height)) {\n host.style.setProperty('--veo-min-h', `${clamp(s.height, 120, 900)}px`);\n }\n\n if (s.align === 'left' || s.align === 'center' || s.align === 'right') {\n host.style.setProperty('--veo-actions-justify', ALIGN_JUSTIFY[s.align] as string);\n }\n\n if (typeof s.padding === 'number' && Number.isFinite(s.padding)) {\n host.style.setProperty('--veo-pad', `${clamp(s.padding, 0, 64)}px`);\n }\n\n if (typeof s.margin === 'number' && Number.isFinite(s.margin)) {\n host.style.setProperty('--veo-margin', `${clamp(s.margin, 0, 64)}px`);\n }\n\n if (typeof s.borderWidth === 'number' && Number.isFinite(s.borderWidth)) {\n host.style.setProperty('--veo-border-width', `${clamp(s.borderWidth, 0, 16)}px`);\n }\n\n if (typeof s.borderColor === 'string' && COLOR_RE.test(s.borderColor.trim())) {\n host.style.setProperty('--veo-border-color', s.borderColor.trim());\n }\n\n if (typeof s.shadow === 'string' && SHADOW[s.shadow]) {\n host.style.setProperty('--veo-shadow', SHADOW[s.shadow] as string);\n }\n\n // Posición del modal: libre (posX/posY en 0..1) tiene prioridad sobre el preset.\n let px: number | undefined;\n let py: number | undefined;\n if (typeof s.posX === 'number' && typeof s.posY === 'number') {\n px = clamp(s.posX, 0, 1);\n py = clamp(s.posY, 0, 1);\n } else if (typeof s.overlayPosition === 'string' && PRESET_POS[s.overlayPosition]) {\n [px, py] = PRESET_POS[s.overlayPosition] as [number, number];\n }\n if (px !== undefined && py !== undefined) {\n host.style.setProperty('--veo-pos-x', `${px * 100}%`);\n host.style.setProperty('--veo-pos-y', `${py * 100}%`);\n }\n\n // Estilo POR ELEMENTO (title/text/image/cta): cada bloque puede sobrescribir\n // alineación, color, tamaño y márgenes de forma independiente del step.\n if (s.elements && typeof s.elements === 'object') {\n const el = s.elements as Record<string, unknown>;\n applyElementVars(host, 'title', el.title);\n applyElementVars(host, 'text', el.text);\n applyElementVars(host, 'image', el.image);\n applyCtaVars(host, el.cta);\n }\n}\n\n/**\n * Estilo del BOTÓN (cta): fondo (default = --veo-primary), color del texto,\n * tamaño, redondeo y alineación de la fila de acciones. Personalizable desde\n * el design system del workspace (\"Botones\") o por guía.\n */\nfunction applyCtaVars(host: HTMLElement, raw: unknown): void {\n if (!raw || typeof raw !== 'object') return;\n const cta = raw as Record<string, unknown>;\n if (typeof cta.align === 'string' && ALIGN_JUSTIFY[cta.align]) {\n host.style.setProperty('--veo-actions-justify', ALIGN_JUSTIFY[cta.align] as string);\n }\n if (typeof cta.background === 'string' && COLOR_RE.test(cta.background.trim())) {\n host.style.setProperty('--veo-cta-bg', cta.background.trim());\n }\n if (typeof cta.color === 'string' && COLOR_RE.test(cta.color.trim())) {\n host.style.setProperty('--veo-cta-color', cta.color.trim());\n }\n if (typeof cta.fontSize === 'number' && Number.isFinite(cta.fontSize)) {\n host.style.setProperty('--veo-cta-size', `${clamp(cta.fontSize, 10, 24)}px`);\n }\n if (typeof cta.radius === 'number' && Number.isFinite(cta.radius)) {\n host.style.setProperty('--veo-cta-radius', `${clamp(cta.radius, 0, 48)}px`);\n }\n}\n\n/**\n * Emite las variables CSS de un elemento (`--veo-{prefix}-*`). Cada prop es\n * opcional y se valida; lo inválido se ignora y queda el default del stylesheet.\n */\nfunction applyElementVars(host: HTMLElement, prefix: string, raw: unknown): void {\n if (!raw || typeof raw !== 'object') return;\n const el = raw as Record<string, unknown>;\n\n if (\n typeof el.align === 'string' &&\n (el.align === 'left' || el.align === 'center' || el.align === 'right')\n ) {\n const mode = ELEMENT_ALIGN_MODE[prefix] ?? 'text';\n const value = mode === 'self' ? (ALIGN_SELF[el.align] as string) : el.align;\n host.style.setProperty(`--veo-${prefix}-align`, value);\n }\n if (typeof el.color === 'string' && COLOR_RE.test(el.color.trim())) {\n host.style.setProperty(`--veo-${prefix}-color`, el.color.trim());\n }\n if (typeof el.fontSize === 'number' && Number.isFinite(el.fontSize)) {\n host.style.setProperty(`--veo-${prefix}-size`, `${clamp(el.fontSize, 8, 72)}px`);\n }\n if (typeof el.width === 'number' && Number.isFinite(el.width)) {\n host.style.setProperty(`--veo-${prefix}-width`, `${clamp(el.width, 10, 100)}%`);\n }\n if (typeof el.radius === 'number' && Number.isFinite(el.radius)) {\n host.style.setProperty(`--veo-${prefix}-radius`, `${clamp(el.radius, 0, 48)}px`);\n }\n if (typeof el.marginTop === 'number' && Number.isFinite(el.marginTop)) {\n host.style.setProperty(`--veo-${prefix}-mt`, `${clamp(el.marginTop, 0, 64)}px`);\n }\n if (typeof el.marginBottom === 'number' && Number.isFinite(el.marginBottom)) {\n host.style.setProperty(`--veo-${prefix}-mb`, `${clamp(el.marginBottom, 0, 64)}px`);\n }\n}\n","import type { GuideStep } from './types';\n\n/** Dónde insertar la guía respecto al elemento ancla. Default `after`. */\nexport type InlinePosition = 'before' | 'after' | 'prepend' | 'append';\n\nexport function readInlinePosition(style: GuideStep['style']): InlinePosition {\n const p = (style as Record<string, unknown> | null | undefined)?.inlinePosition;\n return p === 'before' || p === 'prepend' || p === 'append' ? p : 'after';\n}\n\n/** Inserta el host en el flujo del DOM relativo al ancla. */\nexport function insertHost(anchor: Element, host: HTMLElement, position: InlinePosition): void {\n switch (position) {\n case 'before':\n anchor.before(host);\n break;\n case 'after':\n anchor.after(host);\n break;\n case 'prepend':\n anchor.prepend(host);\n break;\n case 'append':\n anchor.append(host);\n break;\n }\n}\n\n/**\n * Mantiene el host PEGADO al DOM. Los frameworks del host (React/Next)\n * reconcilian sus contenedores al hidratar/re-renderizar y BORRAN nodos que\n * no reconocen — la guía inline aparecía durante la carga y desaparecía al\n * montar el contenido real. Chequea cada 1s: si el host quedó desconectado,\n * re-busca el ancla y se re-inserta. Devuelve el stop() (registrarlo como\n * cleanup del renderer para que el dismiss/destroy lo corte).\n */\nexport function keepHostAttached(\n host: HTMLElement,\n selector: string,\n position: InlinePosition,\n): () => void {\n const id = window.setInterval(() => {\n if (host.isConnected) return;\n const anchor = document.querySelector(selector);\n if (anchor) insertHost(anchor, host, position);\n }, 1000);\n return () => window.clearInterval(id);\n}\n","import { DEFAULT_ANCHOR_WAIT_MS } from './constants';\n\n/**\n * Resuelve un selector CSS de forma robusta para SPAs: chequea inmediato\n * y, si no existe, observa el DOM con MutationObserver hasta `timeoutMs`.\n * Devuelve `null` si no apareció antes del timeout.\n *\n * Esta función nunca lanza. Si el selector es inválido devuelve `null`\n * silenciosamente — un selector roto en la DB no debe romper la app.\n */\nexport function waitForElement(\n selector: string,\n timeoutMs: number = DEFAULT_ANCHOR_WAIT_MS,\n): Promise<Element | null> {\n return new Promise((resolve) => {\n const safeQuery = (): Element | null => {\n try {\n return document.querySelector(selector);\n } catch {\n return null;\n }\n };\n\n const existing = safeQuery();\n if (existing) {\n resolve(existing);\n return;\n }\n\n let resolved = false;\n const finish = (el: Element | null) => {\n if (resolved) return;\n resolved = true;\n observer.disconnect();\n clearTimeout(timer);\n resolve(el);\n };\n\n const observer = new MutationObserver(() => {\n const el = safeQuery();\n if (el) finish(el);\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n\n const timer = setTimeout(() => finish(null), timeoutMs);\n });\n}\n","import { GUIDE_Z_INDEX } from './constants';\n\n/**\n * CSS inyectado en cada shadow DOM. Como `:host { all: initial }` rompe\n * con la herencia del host, todos los estilos viven aquí. Las variables\n * CSS (`--veo-*`) son los puntos de extensión para tematización futura.\n */\nexport const GUIDE_STYLES = `\n:host {\n --veo-primary: #FF5B35;\n --veo-text: #1f2937;\n --veo-text-secondary: #4b5563;\n --veo-bg: #ffffff;\n --veo-radius: 12px;\n --veo-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);\n --veo-width: 420px;\n --veo-actions-justify: flex-end;\n all: initial;\n}\n* { box-sizing: border-box; font-family: var(--veo-font, -apple-system, system-ui, \"Segoe UI\", Roboto, sans-serif); }\n\n.veo-modal-overlay {\n position: fixed; inset: 0;\n background: rgba(15, 15, 30, 0.45);\n z-index: ${GUIDE_Z_INDEX};\n animation: veo-fade-in 180ms ease-out;\n}\n/* Sin backdrop (style.backdrop === false): la app queda usable detrás; solo la\n tarjeta captura el mouse. El click-en-backdrop deja de cerrar (no hay backdrop). */\n.veo-modal-overlay--none {\n background: transparent;\n pointer-events: none;\n}\n.veo-modal-overlay--none .veo-modal-card { pointer-events: auto; }\n/*\n * Posición libre/preset: --veo-pos-x/y son porcentajes (default 50% = centro).\n * El truco translate(-pos) alinea la MISMA fracción de la tarjeta con esa\n * fracción del overlay, así la tarjeta nunca se sale (0% = pegada izquierda,\n * 100% = pegada derecha, 50% = centrada) sea cual sea su ancho.\n */\n.veo-modal-card {\n position: absolute;\n left: var(--veo-pos-x, 50%);\n top: var(--veo-pos-y, 50%);\n transform: translate(calc(var(--veo-pos-x, 50%) * -1), calc(var(--veo-pos-y, 50%) * -1));\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 24px);\n max-width: var(--veo-width); width: 90%;\n min-height: var(--veo-min-h, auto);\n box-shadow: var(--veo-shadow);\n animation: veo-fade-in 180ms ease-out;\n}\n\n.veo-banner {\n position: fixed; left: 0; right: 0;\n background: var(--veo-bg);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 16px);\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: var(--veo-shadow, 0 2px 12px rgba(0, 0, 0, 0.12));\n animation: veo-slide-down 200ms ease-out;\n}\n.veo-banner-top { top: 0; }\n.veo-banner-bottom { bottom: 0; }\n/* Banner EMBEBIDO en un contenedor (step.selector): fluye dentro del contenedor\n y empuja su contenido, en vez de flotar fijo sobre la pantalla. */\n.veo-banner-embedded {\n position: static;\n left: auto; right: auto;\n width: 100%;\n border-radius: var(--veo-radius, 0);\n}\n\n.veo-tooltip {\n position: absolute;\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 15px);\n max-width: 300px;\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: var(--veo-shadow, 0 8px 30px rgba(0, 0, 0, 0.18));\n animation: veo-fade-in 150ms ease-out;\n}\n.veo-tooltip-arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: var(--veo-bg);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n transform: rotate(45deg);\n pointer-events: none;\n}\n\n.veo-inline {\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 20px);\n max-width: var(--veo-width);\n margin: var(--veo-margin, 12px) 0;\n position: relative;\n box-shadow: var(--veo-shadow);\n animation: veo-fade-in 160ms ease-out;\n}\n\n/* ── Modelo unificado (composite) ── */\n.veo-composite-overlay {\n position: fixed; inset: 0;\n z-index: ${GUIDE_Z_INDEX};\n pointer-events: none;\n}\n/* Backdrop atenuado (cualquier posición flotante con backdrop activo). */\n.veo-composite-overlay--dim {\n background: rgba(0, 0, 0, 0.5);\n pointer-events: auto;\n}\n.veo-composite-anchored {\n position: fixed;\n z-index: ${GUIDE_Z_INDEX};\n}\n/* Card genérica del modelo unificado. El diseño (bg/borde/padding/…) lo aplica\n el renderer como estilos inline desde step.design; acá van los defaults. */\n.veo-card {\n pointer-events: auto;\n background: var(--veo-bg, #ffffff);\n color: var(--veo-text, #1f2937);\n border-radius: var(--veo-radius, 12px);\n padding: 20px;\n max-width: 90vw;\n box-shadow: var(--veo-shadow, 0 12px 40px rgba(0, 0, 0, 0.18));\n animation: veo-fade-in 160ms ease-out;\n}\n.veo-composite-anchored .veo-card, .veo-composite-overlay .veo-card { position: relative; }\n\n.veo-guide-content {\n position: relative;\n display: flex; flex-direction: column;\n}\n/* Reserva espacio para la ✕ (esquina sup. derecha) SOLO en el primer bloque:\n así el texto alineado a la derecha no queda tapado por el botón de cerrar. */\n.veo-guide-content > .veo-guide-title:first-child,\n.veo-guide-content > .veo-guide-text:first-child {\n padding-right: 20px;\n}\n.veo-guide-image {\n display: block;\n width: var(--veo-image-width, 100%);\n max-height: 180px;\n object-fit: cover;\n align-self: var(--veo-image-align, stretch);\n border-radius: var(--veo-image-radius, 8px);\n margin: var(--veo-image-mt, 0) 0 var(--veo-image-mb, 12px);\n}\n/* Imagen A SANGRE: rompe el padding de la tarjeta y ocupa el ancho completo\n (hero estilo anuncio). Como primer bloque, hereda el redondeo superior. */\n.veo-guide-image--bleed {\n width: calc(100% + var(--veo-pad, 24px) * 2);\n max-width: none;\n max-height: 280px;\n align-self: auto;\n border-radius: 0;\n margin: 0 calc(var(--veo-pad, 24px) * -1) 12px;\n}\n.veo-guide-content > .veo-guide-image--bleed:first-child {\n margin-top: calc(var(--veo-pad, 24px) * -1);\n border-radius: calc(var(--veo-radius, 12px) - var(--veo-border-width, 0px))\n calc(var(--veo-radius, 12px) - var(--veo-border-width, 0px)) 0 0;\n}\n.veo-guide-title {\n font-size: var(--veo-title-size, 18px); font-weight: 600; line-height: 1.3;\n text-align: var(--veo-title-align, left);\n margin: var(--veo-title-mt, 0) 0 var(--veo-title-mb, 6px);\n color: var(--veo-title-color, var(--veo-text));\n}\n.veo-guide-text {\n font-size: var(--veo-text-size, 14px); line-height: 1.5;\n text-align: var(--veo-text-align, left);\n margin: var(--veo-text-mt, 0) 0 var(--veo-text-mb, 16px);\n color: var(--veo-text-color, var(--veo-text-secondary));\n}\n/* Rich text dentro de un bloque de texto (p/listas/links/énfasis). */\n.veo-guide-text p { margin: 0 0 8px; }\n.veo-guide-text p:last-child { margin-bottom: 0; }\n.veo-guide-text ul, .veo-guide-text ol { margin: 0 0 8px; padding-left: 20px; }\n.veo-guide-text ul { list-style: disc; }\n.veo-guide-text ol { list-style: decimal; }\n.veo-guide-text li { margin: 2px 0; display: list-item; }\n.veo-guide-text a { color: var(--veo-primary); text-decoration: underline; cursor: pointer; }\n.veo-guide-text strong { font-weight: 600; }\n.veo-guide-text em { font-style: italic; }\n.veo-guide-text u { text-decoration: underline; }\n.veo-guide-text s { text-decoration: line-through; }\n/*\n * El ÚLTIMO bloque de contenido no deja su margin-bottom colgando: ese margen\n * existe para separar del bloque SIGUIENTE, y sin siguiente se suma al padding\n * de la tarjeta y parece un \"hueco fantasma\" (p.ej. quitar el botón de un\n * tooltip dejaba el espacio como si siguiera ahí). El penúltimo hijo es el\n * último bloque real (el ✕ de cerrar siempre va último y es absoluto). La\n * mayor especificidad le gana a las reglas por clase, pero NO a un margen\n * inline elegido explícitamente por el autor (block.style.marginBottom).\n */\n.veo-guide-content > :nth-last-child(2) {\n margin-bottom: 0;\n}\n.veo-guide-actions {\n display: flex; gap: 8px; justify-content: var(--veo-actions-justify);\n}\n.veo-guide-cta {\n background: var(--veo-cta-bg, var(--veo-primary));\n color: var(--veo-cta-color, #fff); border: none;\n padding: 9px 18px; border-radius: var(--veo-cta-radius, 8px);\n font-size: var(--veo-cta-size, 14px); font-weight: 500; cursor: pointer;\n transition: opacity 120ms ease;\n}\n.veo-guide-cta:hover { opacity: 0.9; }\n.veo-guide-cta:active { transform: translateY(1px); }\n.veo-guide-close {\n position: absolute; top: -6px; right: -6px;\n width: 24px; height: 24px;\n background: none; border: none;\n font-size: 22px; line-height: 1;\n cursor: pointer; color: #9ca3af; padding: 0;\n}\n.veo-guide-close:hover { color: var(--veo-text); }\n/*\n * Si el PRIMER bloque es una imagen, la ✕ quedaría sobre la esquina de la foto\n * (invisible según el color). En ese caso pasa a ser una pastilla flotante con\n * fondo propio, legible sobre cualquier imagen. (Sin soporte de :has() queda el\n * estilo base — mismo comportamiento de antes, sin regresión.)\n */\n.veo-guide-content:has(> .veo-guide-image:first-child) > .veo-guide-close {\n top: 2px; right: 2px;\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; color: #374151;\n background: rgba(255, 255, 255, 0.92);\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 50%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);\n}\n.veo-guide-content:has(> .veo-guide-image:first-child) > .veo-guide-close:hover {\n color: #111827;\n}\n\n.veo-form { display: flex; flex-direction: column; gap: 14px; margin-bottom: 16px; }\n.veo-form-field { display: flex; flex-direction: column; gap: 6px; }\n.veo-form-label { font-size: 13px; font-weight: 500; color: var(--veo-text); }\n.veo-form-input {\n font-size: 14px; color: var(--veo-text);\n background: var(--veo-bg);\n border: 1px solid #d1d5db; border-radius: 8px;\n padding: 8px 10px; width: 100%;\n}\n.veo-form-input:focus { outline: 2px solid var(--veo-primary); outline-offset: -1px; border-color: transparent; }\n.veo-form-options { display: flex; flex-direction: column; gap: 6px; }\n.veo-form-option {\n display: flex; align-items: center; gap: 8px;\n font-size: 14px; color: var(--veo-text); cursor: pointer;\n}\n.veo-form-option input { accent-color: var(--veo-primary); margin: 0; cursor: pointer; }\n.veo-form-scale { display: flex; gap: 4px; flex-wrap: wrap; }\n.veo-nps-btn {\n min-width: 30px; height: 30px; padding: 0 4px;\n font-size: 13px; font-weight: 500; color: var(--veo-text);\n background: var(--veo-bg); border: 1px solid #d1d5db; border-radius: 6px;\n cursor: pointer; transition: all 100ms ease;\n}\n.veo-nps-btn:hover { border-color: var(--veo-primary); }\n.veo-rating-btn {\n background: none; border: none; padding: 0 2px;\n font-size: 26px; line-height: 1; color: #d1d5db;\n cursor: pointer; transition: color 100ms ease;\n}\n.veo-scale-active.veo-nps-btn { background: var(--veo-primary); color: #fff; border-color: var(--veo-primary); }\n.veo-scale-active.veo-rating-btn { color: #f59e0b; }\n.veo-form-error { font-size: 13px; color: #dc2626; margin: 0; }\n.veo-form-thanks {\n text-align: center; padding: 24px 8px;\n font-size: 16px; font-weight: 600; color: var(--veo-text);\n}\n.veo-form-preview-note {\n text-align: center; margin: 0 0 12px;\n font-size: 12px; color: #b45309;\n}\n\n.veo-walkthrough {\n position: absolute;\n background: var(--veo-bg);\n border-radius: var(--veo-radius);\n border: var(--veo-border-width, 0) solid var(--veo-border-color, transparent);\n padding: var(--veo-pad, 16px);\n max-width: 340px;\n z-index: ${GUIDE_Z_INDEX};\n box-shadow: var(--veo-shadow, 0 8px 30px rgba(0, 0, 0, 0.2));\n animation: veo-fade-in 150ms ease-out;\n}\n.veo-walkthrough-arrow {\n position: absolute;\n width: 12px;\n height: 12px;\n background: var(--veo-bg);\n transform: rotate(45deg);\n pointer-events: none;\n}\n.veo-walkthrough-counter {\n font-size: 11px; color: #9ca3af;\n margin-bottom: 8px; letter-spacing: 0.02em;\n}\n.veo-walkthrough-progress {\n display: flex; gap: 4px;\n margin-bottom: 12px;\n}\n.veo-walkthrough-progress-dot {\n width: 8px; height: 8px;\n border-radius: 50%;\n background: #e5e7eb;\n transition: background 200ms ease;\n}\n.veo-walkthrough-progress-dot.active { background: var(--veo-primary); }\n.veo-walkthrough-progress-dot.completed { background: var(--veo-primary); opacity: 0.5; }\n.veo-walkthrough-actions {\n display: flex; align-items: center;\n margin-top: 16px; gap: 8px;\n}\n.veo-walkthrough-actions-right {\n display: flex; gap: 8px;\n margin-left: auto;\n}\n.veo-walkthrough-btn-secondary {\n background: transparent; color: #6b7280;\n border: 1px solid #e5e7eb;\n padding: 8px 16px; border-radius: 8px;\n font-size: 13px; cursor: pointer;\n transition: background 120ms ease;\n}\n.veo-walkthrough-btn-secondary:hover { background: #f9fafb; }\n.veo-walkthrough-skip {\n background: transparent; color: #9ca3af;\n border: none; padding: 4px 8px;\n font-size: 12px; cursor: pointer;\n}\n.veo-walkthrough-skip:hover { color: var(--veo-text); }\n\n/* ── Badge (elemento inyectado junto al ancla que abre un tooltip) ── */\n.veo-badge {\n display: inline-flex; align-items: center; justify-content: center;\n border: none; padding: 0; margin: 0 4px;\n background: none; cursor: pointer;\n line-height: 1; vertical-align: middle;\n font-family: inherit;\n}\n.veo-badge:focus-visible { outline: 2px solid var(--veo-primary); outline-offset: 2px; }\n.veo-badge--icon {\n border-radius: 50%;\n background: color-mix(in srgb, var(--veo-primary) 14%, transparent);\n color: var(--veo-primary);\n font-weight: 600;\n}\n.veo-badge--dot {\n border-radius: 50%;\n background: var(--veo-primary);\n animation: veo-badge-pulse 2s ease-out infinite;\n}\n.veo-badge--pill {\n border-radius: 999px;\n background: var(--veo-primary);\n color: #fff;\n font-weight: 600;\n padding: 3px 9px;\n white-space: nowrap;\n}\n.veo-badge--text {\n color: var(--veo-primary);\n font-weight: 600;\n white-space: nowrap;\n text-decoration: underline dotted;\n text-underline-offset: 3px;\n}\n.veo-badge--image img { display: block; border-radius: 4px; object-fit: cover; }\n/* El tooltip del badge usa strategy fixed (el host vive dentro del flujo del\n cliente; un absoluto se recortaría con overflow de ancestros). Su ancho es\n personalizable vía var dedicada (--veo-width no sirve: el :host la define\n en 420px siempre y pisaría el default de 300px de los tooltips). */\n.veo-badge-tooltip {\n position: fixed;\n max-width: var(--veo-badge-tip-width, 300px);\n}\n@keyframes veo-badge-pulse {\n 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--veo-primary) 45%, transparent); }\n 70% { box-shadow: 0 0 0 7px transparent; }\n 100% { box-shadow: 0 0 0 0 transparent; }\n}\n\n.veo-custom-floating {\n position: fixed;\n z-index: ${GUIDE_Z_INDEX};\n max-width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n animation: veo-fade-in 160ms ease;\n}\n.veo-custom-anchored {\n position: fixed;\n top: 0; left: 0;\n z-index: ${GUIDE_Z_INDEX};\n max-width: calc(100vw - 16px);\n animation: veo-fade-in 160ms ease;\n}\n.veo-custom-inline {\n display: block;\n position: relative;\n margin: 12px 0;\n}\n.veo-custom-frame {\n display: block;\n border: 0;\n width: 360px;\n background: transparent;\n color-scheme: normal;\n}\n\n@keyframes veo-fade-in { from { opacity: 0; } to { opacity: 1; } }\n@keyframes veo-slide-up {\n from { transform: translateY(10px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n@keyframes veo-slide-down {\n from { transform: translateY(-10px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n`;\n","import { GUIDE_HOST_ATTR } from '../constants';\nimport { applyDesignVars } from '../guide-design';\nimport { GUIDE_STYLES } from '../styles';\nimport type { GuideRenderContext, GuideStep } from '../types';\n\n/**\n * Base de los renderers de guías. Encapsula:\n * - creación del host con Shadow DOM (aislamiento de estilos)\n * - inyección del CSS común\n * - limpieza del DOM y de listeners en `destroy()`\n *\n * Cada subclase implementa `render(context)`. La subclase puede registrar\n * cleanup adicional con `registerCleanup` para que se ejecute en destroy.\n *\n * Tipos genéricos:\n * - `TContext` (default `GuideRenderContext`): el shape que recibe la\n * subclase. WalkthroughRenderer usa uno propio con step + callbacks.\n * - `TResult` (default `void`): lo que `render` devuelve. El walkthrough\n * usa `boolean` para señalar éxito al controller cuando el ancla no\n * aparece. El resto sigue devolviendo `void`/`Promise<void>`.\n */\nexport abstract class BaseRenderer<TContext = GuideRenderContext, TResult = void> {\n protected host: HTMLElement | null = null;\n protected shadow: ShadowRoot | null = null;\n private cleanups: Array<() => void> = [];\n\n // ── Update in-place (preview en vivo del editor) ──\n // La subclase setea estas piezas en render() para habilitarlo: el contenedor\n // del contenido, el nodo de contenido actual y cómo reconstruirlo.\n protected liveContainer: HTMLElement | null = null;\n protected liveContent: HTMLElement | null = null;\n protected liveBuild: ((step: GuideStep) => HTMLElement) | null = null;\n /** Clave de anclaje/estructura fijada en render(); si cambia → remontar. */\n protected liveKey = '';\n\n /** Clave de anclaje derivada del step (override por subclase). */\n protected liveKeyOf(_step: GuideStep): string {\n return '';\n }\n\n /** Hook post-swap (reposicionar tooltip, actualizar clase del banner…). */\n protected onLiveUpdate(_step: GuideStep): void {}\n\n /**\n * Actualiza el contenido del step SIN remontar el host — así el preview del\n * editor no parpadea en cada tecla. Devuelve `false` cuando el renderer no\n * lo soporta o el cambio requiere remontar (cambió el ancla/estructura);\n * en ese caso el caller hace el re-render completo.\n */\n updateStep(step: GuideStep): boolean {\n if (!this.host || !this.liveContainer || !this.liveContent || !this.liveBuild) return false;\n if (this.liveKeyOf(step) !== this.liveKey) return false;\n const next = this.liveBuild(step);\n this.liveContainer.replaceChild(next, this.liveContent);\n this.liveContent = next;\n this.applyDesign(step.style);\n this.onLiveUpdate(step);\n return true;\n }\n\n /**\n * Crea un `<div data-veo-guide>` adjunto a `document.body`, le adjunta\n * un ShadowRoot abierto e inyecta los estilos. Retorna el nodo raíz\n * donde la subclase puede insertar el contenido específico.\n */\n protected createHost(): { host: HTMLElement; shadow: ShadowRoot; root: HTMLElement } {\n const host = document.createElement('div');\n host.setAttribute(GUIDE_HOST_ATTR, '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = GUIDE_STYLES;\n shadow.appendChild(style);\n\n const root = document.createElement('div');\n shadow.appendChild(root);\n\n document.body.appendChild(host);\n\n this.host = host;\n this.shadow = shadow;\n return { host, shadow, root };\n }\n\n /**\n * Aplica la tematización por datos del step (`step.style`) como variables\n * CSS sobre el host. Llamar tras `createHost()`. No-op si no hay host o\n * style. Ver `guide-design.ts`.\n */\n protected applyDesign(style: GuideStep['style']): void {\n if (this.host) applyDesignVars(this.host, style);\n }\n\n /**\n * Registra una función a ejecutar en `destroy()`. Útil para limpiar\n * listeners globales (scroll, resize) o intervalos.\n */\n protected registerCleanup(fn: () => void): void {\n this.cleanups.push(fn);\n }\n\n /**\n * Host de la guía montada (o `null` si aún no se montó / ya se destruyó).\n * Lo usa el modo builder para adjuntar manipulación directa (drag/resize)\n * sobre el shadow root abierto sin tocar los renderers.\n */\n hostElement(): HTMLElement | null {\n return this.host;\n }\n\n /** Remueve el host del DOM y corre todas las funciones de cleanup. */\n destroy(): void {\n for (const fn of this.cleanups) {\n try {\n fn();\n } catch {\n // No propagar: un cleanup roto no debe romper el resto.\n }\n }\n this.cleanups = [];\n\n if (this.host?.parentNode) {\n this.host.parentNode.removeChild(this.host);\n }\n this.host = null;\n this.shadow = null;\n }\n\n abstract render(context: TContext): TResult | Promise<TResult>;\n}\n","/**\n * Posicionamiento del caret (flecha) que apunta al elemento anclado, compartido\n * por el tooltip y el walkthrough. Floating UI (middleware `arrow`) da el\n * desplazamiento a lo largo del borde; aquí lo aplicamos y \"pegamos\" el caret al\n * lado del tooltip enfrentado al ancla.\n */\n\n/** Lado del tooltip donde se \"pega\" el caret, opuesto al placement resuelto. */\nconst STATIC_SIDE: Record<string, 'top' | 'bottom' | 'left' | 'right'> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\n/**\n * Ubica el caret sobre el borde del tooltip enfrentado al ancla. Floating UI\n * da el desplazamiento a lo largo del borde (`x` o `y`); el otro eje se fija a\n * `-6px` (mitad del caret) para que sobresalga.\n */\nexport function positionArrow(\n arrowEl: HTMLElement,\n placement: string,\n data: { x?: number; y?: number } | undefined,\n): void {\n const side = STATIC_SIDE[placement.split('-')[0] ?? 'bottom'] ?? 'top';\n for (const prop of ['top', 'bottom', 'left', 'right'] as const) {\n arrowEl.style.setProperty(prop, '');\n }\n if (data?.x != null) arrowEl.style.setProperty('left', `${data.x}px`);\n if (data?.y != null) arrowEl.style.setProperty('top', `${data.y}px`);\n arrowEl.style.setProperty(side, '-6px');\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { buildStepContent, isSafeUrl } from '../block-builder';\nimport { COLOR_RE } from '../guide-design';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type {\n BadgeConfig,\n BadgeTrigger,\n GuideInteractionMetadata,\n GuideRenderContext,\n GuideStep,\n} from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/** Retardo de gracia del hover: permite mover el mouse del badge al tooltip. */\nconst HOVER_CLOSE_DELAY_MS = 150;\n\n/**\n * Renderiza una guía tipo `badge` (estilo Pendo): un elemento CHICO —\n * icono/punto/cápsula/imagen — inyectado EN EL FLUJO del DOM junto al ancla\n * (`step.selector` + `style.inlinePosition`), que al hover o click\n * (`style.badgeTrigger`) abre un tooltip con el contenido del paso.\n *\n * Composición (no herencia): reusa `insertHost`/`keepHostAttached` del inline\n * (watchdog contra re-renders de React), `buildStepContent` (bloques) y el\n * posicionamiento Floating UI + caret del tooltip — con `strategy: 'fixed'`\n * porque el host vive DENTRO del flujo del cliente y un ancestro con\n * `overflow: hidden` recortaría un tooltip absoluto.\n *\n * EL BADGE ES PERMANENTE (como en Pendo): nada de lo que haga el usuario lo\n * quita — lo único que se abre y se cierra es el TOOLTIP. La ✕ del tooltip, el\n * hover-out, el click afuera, Esc y los CTA solo cierran el tooltip; el badge\n * queda para volver a consultarlo cuando quiera. Por eso el badge nunca emite\n * `dismissed` (no hay forma de descartarlo) y su frecuencia natural es `always`.\n *\n * Analytics (deliberado):\n * - `shown` la PRIMERA vez que se ABRE el tooltip (no al inyectar el badge):\n * mide cuánta gente abrió la ayuda, no en cuántas páginas existía el icono.\n * - `cta_clicked` en los botones del tooltip (con buttonId si lo tienen).\n */\nexport class BadgeRenderer extends BaseRenderer {\n private tooltip: HTMLElement | null = null;\n private arrowEl: HTMLElement | null = null;\n private badgeBtn: HTMLButtonElement | null = null;\n private open = false;\n private shownEmitted = false;\n private trigger: BadgeTrigger = 'hover';\n private side: 'top' | 'bottom' | 'left' | 'right' = 'top';\n private closeTimer: number | null = null;\n private stopFloat: (() => void) | null = null;\n\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n const ownerDocument = root.ownerDocument ?? document;\n this.applyDesign(step.style);\n // Ancho del tooltip personalizable (slider «Ancho» del editor). Var\n // dedicada: --veo-width no distingue \"no seteado\" (el :host la define).\n const tipWidth = step.style?.width;\n if (typeof tipWidth === 'number' && Number.isFinite(tipWidth)) {\n host.style.setProperty(\n '--veo-badge-tip-width',\n `${Math.min(720, Math.max(220, tipWidth))}px`,\n );\n }\n this.trigger = step.style?.badgeTrigger === 'click' ? 'click' : 'hover';\n const rawSide = step.style?.tooltipPlacement;\n this.side = rawSide === 'bottom' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'top';\n\n // ── Badge en el flujo del DOM, pegado al ancla ──\n const position = readInlinePosition(step.style);\n host.style.display = 'inline-flex';\n host.style.verticalAlign = 'middle';\n const badge = buildBadgeElement(readBadgeConfig(step), ownerDocument);\n root.appendChild(badge);\n this.badgeBtn = badge;\n insertHost(anchor, host, position);\n this.registerCleanup(keepHostAttached(host, selector, position));\n\n // ── Tooltip (cerrado hasta el trigger) ──\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-tooltip veo-badge-tooltip';\n tooltip.style.display = 'none';\n\n const emit = (action: 'shown' | 'cta_clicked', meta?: GuideInteractionMetadata): void => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n };\n\n const buildTooltipContent = (s: GuideStep): HTMLElement =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n emit('cta_clicked', meta);\n if (action === 'url' && target) window.open(target, '_blank', 'noopener,noreferrer');\n // TODO cierra solo el TOOLTIP — el badge es permanente.\n this.closeTooltip();\n // Encadenado: además abre la otra guía.\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n // La ✕ también cierra solo el tooltip (nunca el badge, nunca dismissed).\n onDismiss: () => this.closeTooltip(),\n });\n\n const content = buildTooltipContent(step);\n tooltip.appendChild(content);\n\n const arrowEl = ownerDocument.createElement('div');\n arrowEl.className = 'veo-tooltip-arrow';\n tooltip.appendChild(arrowEl);\n root.appendChild(tooltip);\n this.tooltip = tooltip;\n this.arrowEl = arrowEl;\n\n // Update in-place (preview del editor).\n this.liveContainer = tooltip;\n this.liveContent = content;\n this.liveKey = this.liveKeyOf(step);\n this.liveBuild = buildTooltipContent;\n\n // ── Trigger ──\n const openNow = (): void => {\n this.cancelClose();\n if (!this.open) {\n this.openTooltip(badge);\n if (!this.shownEmitted) {\n this.shownEmitted = true;\n emit('shown');\n }\n }\n };\n if (this.trigger === 'hover') {\n const scheduleClose = (): void => {\n this.cancelClose();\n this.closeTimer = window.setTimeout(() => this.closeTooltip(), HOVER_CLOSE_DELAY_MS);\n };\n badge.addEventListener('mouseenter', openNow);\n badge.addEventListener('focus', openNow);\n badge.addEventListener('mouseleave', scheduleClose);\n badge.addEventListener('blur', scheduleClose);\n tooltip.addEventListener('mouseenter', () => this.cancelClose());\n tooltip.addEventListener('mouseleave', scheduleClose);\n } else {\n badge.addEventListener('click', () => {\n if (this.open) this.closeTooltip();\n else openNow();\n });\n const onDocClick = (e: MouseEvent): void => {\n if (!this.open) return;\n // El shadow host encapsula badge y tooltip: un click cuyo path no pasa\n // por el host es \"afuera\".\n if (e.composedPath().includes(host)) return;\n this.closeTooltip();\n };\n document.addEventListener('click', onDocClick, true);\n this.registerCleanup(() => document.removeEventListener('click', onDocClick, true));\n }\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.open) this.closeTooltip();\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n // En el editor, el autor edita el CONTENIDO del tooltip: abrirlo de entrada\n // (si no, se edita a ciegas). No emite shown (isPreview no trackea igual).\n if (context.isPreview) openNow();\n }\n\n /** Cambiar de ancla/posición/trigger requiere re-montar y re-cablear. */\n protected override liveKeyOf(step: GuideStep): string {\n const selector = step.selector ?? '';\n const position = readInlinePosition(step.style);\n const trigger = step.style?.badgeTrigger === 'click' ? 'click' : 'hover';\n return `${selector}|${position}|${trigger}`;\n }\n\n protected override onLiveUpdate(step: GuideStep): void {\n // Re-pintar el badge (kind/color/size) y reposicionar si está abierto.\n if (this.badgeBtn) {\n const doc = this.badgeBtn.ownerDocument;\n const next = buildBadgeElement(readBadgeConfig(step), doc);\n // Conservar listeners del botón: solo se actualiza el interior + clases.\n this.badgeBtn.className = next.className;\n this.badgeBtn.setAttribute('style', next.getAttribute('style') ?? '');\n this.badgeBtn.replaceChildren(...Array.from(next.childNodes));\n }\n const rawSide = step.style?.tooltipPlacement;\n this.side = rawSide === 'bottom' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'top';\n if (this.open && this.badgeBtn) this.position(this.badgeBtn);\n }\n\n override destroy(): void {\n this.cancelClose();\n this.stopFloat?.();\n this.stopFloat = null;\n this.tooltip = null;\n this.arrowEl = null;\n this.badgeBtn = null;\n this.open = false;\n super.destroy();\n }\n\n private openTooltip(badge: HTMLElement): void {\n if (!this.tooltip) return;\n this.tooltip.style.display = 'block';\n this.open = true;\n void this.position(badge);\n const reposition = (): void => {\n void this.position(badge);\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.stopFloat = () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }\n\n private closeTooltip(): void {\n this.cancelClose();\n if (!this.tooltip || !this.open) return;\n this.tooltip.style.display = 'none';\n this.open = false;\n this.stopFloat?.();\n this.stopFloat = null;\n }\n\n private cancelClose(): void {\n if (this.closeTimer !== null) {\n window.clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private async position(badge: HTMLElement): Promise<void> {\n const tooltip = this.tooltip;\n const arrowEl = this.arrowEl;\n if (!tooltip || !arrowEl) return;\n const { x, y, placement, middlewareData } = await computePosition(badge, tooltip, {\n strategy: 'fixed',\n placement: this.side,\n middleware: [offset(8), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n positionArrow(arrowEl, placement, middlewareData.arrow);\n }\n}\n\n/** Lee y normaliza `style.badge` (defaults seguros). */\nfunction readBadgeConfig(step: GuideStep): BadgeConfig {\n const raw = step.style?.badge;\n if (!raw || typeof raw !== 'object') return { kind: 'icon' };\n const b = raw as Record<string, unknown>;\n const kind =\n b.kind === 'dot' ||\n b.kind === 'pill' ||\n b.kind === 'text' ||\n b.kind === 'image' ||\n b.kind === 'icon'\n ? b.kind\n : 'icon';\n return {\n kind,\n icon: typeof b.icon === 'string' ? b.icon : null,\n text: typeof b.text === 'string' ? b.text : null,\n imageUrl: typeof b.imageUrl === 'string' ? b.imageUrl : null,\n color: typeof b.color === 'string' && COLOR_RE.test(b.color.trim()) ? b.color.trim() : null,\n size: typeof b.size === 'number' && Number.isFinite(b.size) ? b.size : null,\n };\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, n));\n}\n\n/**\n * Construye el elemento visual del badge. `<button>` por accesibilidad\n * (focus/teclado). Texto por `textContent`; imagen por `isSafeUrl`.\n */\nfunction buildBadgeElement(config: BadgeConfig, doc: Document): HTMLButtonElement {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = `veo-badge veo-badge--${config.kind}`;\n btn.setAttribute('aria-label', 'Más información');\n const size = clamp(config.size ?? 18, 8, 48);\n\n switch (config.kind) {\n case 'dot':\n btn.style.width = `${size}px`;\n btn.style.height = `${size}px`;\n if (config.color) btn.style.background = config.color;\n break;\n case 'pill': {\n btn.textContent = config.text?.slice(0, 24) || 'Nuevo';\n btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 24)}px`;\n if (config.color) btn.style.background = config.color;\n break;\n }\n case 'text': {\n // Texto plano, sin cápsula: hereda el color de acento (o el custom).\n btn.textContent = config.text?.slice(0, 32) || 'Nuevo';\n btn.style.fontSize = `${clamp(Math.round(size * 0.7), 9, 28)}px`;\n if (config.color) btn.style.color = config.color;\n break;\n }\n case 'image': {\n if (config.imageUrl && isSafeUrl(config.imageUrl)) {\n const img = doc.createElement('img');\n img.src = config.imageUrl;\n img.alt = '';\n img.style.width = `${size}px`;\n img.style.height = `${size}px`;\n btn.appendChild(img);\n } else {\n // Sin imagen válida degrada a icono para que el badge no sea invisible.\n btn.className = 'veo-badge veo-badge--icon';\n btn.textContent = '?';\n btn.style.width = `${size}px`;\n btn.style.height = `${size}px`;\n btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 32)}px`;\n }\n break;\n }\n default: {\n // icon: carácter/emoji dentro de un circulito.\n btn.textContent = (config.icon || 'ℹ️').slice(0, 4);\n btn.style.width = `${size}px`;\n btn.style.height = `${size}px`;\n btn.style.fontSize = `${clamp(Math.round(size * 0.62), 8, 32)}px`;\n if (config.color) btn.style.color = config.color;\n break;\n }\n }\n return btn;\n}\n","import { buildContentNodes, createCloseButton } from './block-builder';\nimport type { GuideStep, WalkthroughCallbacks } from './types';\n\n/**\n * Construye el subtree DOM de un step de walkthrough con navegación\n * (counter, dots, contenido, botones atrás/siguiente/finalizar/omitir).\n *\n * Aplica las mismas reglas de seguridad que `buildStepContent`:\n * - `textContent` para todo string del backend (cero `innerHTML`).\n * - `imageUrl` validada con `isSafeUrl`.\n *\n * El botón primario cambia su label según el step:\n * - último step → \"Finalizar\" → llama `onComplete`\n * - otro → `step.ctaText` o \"Siguiente\" → llama `onNext`\n *\n * El botón \"Atrás\" solo se pinta a partir del segundo step. El botón\n * \"Omitir\" siempre se pinta — el usuario debe poder salir en cualquier\n * momento.\n */\nexport function buildWalkthroughStepContent(\n step: GuideStep,\n stepIndex: number,\n totalSteps: number,\n doc: Document,\n callbacks: WalkthroughCallbacks,\n): HTMLElement {\n const container = doc.createElement('div');\n container.className = 'veo-guide-content';\n\n const counter = doc.createElement('div');\n counter.className = 'veo-walkthrough-counter';\n counter.textContent = `Paso ${stepIndex + 1} de ${totalSteps}`;\n container.appendChild(counter);\n\n const progress = doc.createElement('div');\n progress.className = 'veo-walkthrough-progress';\n for (let i = 0; i < totalSteps; i++) {\n const dot = doc.createElement('span');\n dot.className = 'veo-walkthrough-progress-dot';\n if (i < stepIndex) dot.classList.add('completed');\n if (i === stepIndex) dot.classList.add('active');\n progress.appendChild(dot);\n }\n container.appendChild(progress);\n\n // Contenido del paso: respeta blocks[] (imágenes, rich text, full-bleed) o\n // cae a los escalares. Los bloques `button` se omiten — la navegación\n // (atrás/siguiente/omitir) es del chrome del tour, abajo.\n for (const node of buildContentNodes(step, doc)) {\n container.appendChild(node);\n }\n\n const actions = doc.createElement('div');\n actions.className = 'veo-walkthrough-actions';\n\n const skipBtn = doc.createElement('button');\n skipBtn.type = 'button';\n skipBtn.className = 'veo-walkthrough-skip';\n skipBtn.textContent = 'Omitir';\n skipBtn.addEventListener('click', () => callbacks.onSkip());\n actions.appendChild(skipBtn);\n\n const rightGroup = doc.createElement('div');\n rightGroup.className = 'veo-walkthrough-actions-right';\n\n if (stepIndex > 0) {\n const backBtn = doc.createElement('button');\n backBtn.type = 'button';\n backBtn.className = 'veo-walkthrough-btn-secondary';\n backBtn.textContent = 'Atrás';\n backBtn.addEventListener('click', () => callbacks.onBack());\n rightGroup.appendChild(backBtn);\n }\n\n const isLastStep = stepIndex === totalSteps - 1;\n const primaryBtn = doc.createElement('button');\n primaryBtn.type = 'button';\n primaryBtn.className = 'veo-guide-cta';\n const defaultLabel = isLastStep ? 'Finalizar' : 'Siguiente';\n primaryBtn.textContent =\n typeof step.ctaText === 'string' && step.ctaText ? step.ctaText : defaultLabel;\n primaryBtn.addEventListener('click', () => {\n if (isLastStep) callbacks.onComplete();\n else callbacks.onNext();\n });\n rightGroup.appendChild(primaryBtn);\n\n actions.appendChild(rightGroup);\n container.appendChild(actions);\n\n // \"✕\" universal (esquina superior derecha): salir en cualquier momento.\n // Mismo efecto que \"Omitir\" → reporta `dismissed`.\n container.appendChild(createCloseButton(doc, () => callbacks.onSkip()));\n\n return container;\n}\n","import { buildStepContent } from '../block-builder';\nimport { insertHost, keepHostAttached } from '../inline-host';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía tipo `banner`. Dos modos:\n *\n * - **Pantalla completa** (default): barra fija arriba o abajo del viewport.\n * La posición se lee de `step.style.position` (`top` | `bottom`).\n * - **Embebido en un contenedor** (`step.selector` presente): el banner se\n * inserta DENTRO del contenedor elegido (prepend con `top`, append con\n * `bottom`) y empuja su contenido — como los \"element banners\" de Pendo.\n * Reusa el watchdog inline (`keepHostAttached`) porque los frameworks del\n * host borran nodos ajenos al re-renderizar.\n *\n * No tiene backdrop ni atrapa el foco. Con `context.nav` (paso de un\n * walkthrough heterogéneo) muestra botones de navegación y delega\n * tracking/avance al controller — solo en modo pantalla completa.\n */\nexport class BannerRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const idx = context.nav?.stepIndex ?? 0;\n const step = context.guide.guideSteps[idx];\n if (!step) return;\n\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n // Con selector el banner se EMBEBE en ese contenedor — también en pasos de\n // secuencia (el chrome de navegación viaja adentro). En un paso-tooltip el\n // selector es el ancla; en un paso-banner es el contenedor: no colisionan\n // porque cada paso tiene UNA presentación.\n const selector = step.selector?.trim() || null;\n\n let anchor: Element | null = null;\n if (selector) {\n anchor = await waitForElement(selector);\n if (!anchor) return; // contenedor ausente → no pintar (como tooltip/inline)\n }\n\n const { host, root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const banner = ownerDocument.createElement('div');\n banner.className = bannerClassOf(position, Boolean(anchor));\n\n const dismiss = (\n action: 'dismissed' | 'cta_clicked',\n ctaUrl?: string,\n meta?: GuideInteractionMetadata,\n ) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = context.nav\n ? buildWalkthroughStepContent(\n step,\n context.nav.stepIndex,\n context.nav.totalSteps,\n ownerDocument,\n context.nav.callbacks,\n )\n : buildStepContent(step, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n banner.appendChild(content);\n root.appendChild(banner);\n\n if (selector && anchor) {\n host.style.display = 'block';\n const insertAt = position === 'top' ? 'prepend' : 'append';\n insertHost(anchor, host, insertAt);\n this.registerCleanup(keepHostAttached(host, selector, insertAt));\n }\n\n if (!context.nav) {\n this.liveContainer = banner;\n this.liveContent = content;\n this.liveBuild = (s) =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n this.liveKey = this.liveKeyOf(step);\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n }\n\n /** Cambiar de contenedor o de top/bottom embebido requiere re-insertar → remontar. */\n protected override liveKeyOf(step: GuideStep): string {\n const selector = step.selector?.trim() ?? '';\n if (!selector) return '';\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n return `${selector}|${position}`;\n }\n\n protected override onLiveUpdate(step: GuideStep): void {\n // La posición del banner de pantalla completa (top/bottom) es solo una\n // clase del wrapper — se actualiza en vivo. (El embebido remonta vía liveKey.)\n if (this.liveContainer) {\n const position = step.style?.position === 'bottom' ? 'bottom' : 'top';\n const embedded = Boolean(step.selector?.trim());\n this.liveContainer.className = bannerClassOf(position, embedded);\n }\n }\n}\n\nfunction bannerClassOf(position: 'top' | 'bottom', embedded: boolean): string {\n return embedded ? 'veo-banner veo-banner-embedded' : `veo-banner veo-banner-${position}`;\n}\n","import { uuidv7 } from '../../../utils/uuid';\nimport { isSafeUrl } from '../block-builder';\nimport type { GuideRenderContext, GuideStep } from '../types';\n\ninterface VeoBridgeMessage {\n __veo?: unknown;\n type?: unknown;\n url?: unknown;\n name?: unknown;\n props?: unknown;\n height?: unknown;\n close?: unknown;\n}\n\n/**\n * Monta el `<iframe sandbox>` con el HTML/CSS/JS del cliente (origen `null`,\n * sin acceso al host) y cablea el puente postMessage (`dismiss`/`cta`/`track`/\n * `navigate`/`resize`) validando `source` + token. Compartido por las guías\n * `custom` (flotante/anclada) e `inline-custom` (embebida en el flujo).\n *\n * El caller crea el wrapper y posiciona/inserta el iframe; aquí sólo va la\n * lógica del documento + el bridge. Devuelve el iframe y un cleanup.\n */\nexport function mountCustomFrame(\n doc: Document,\n step: GuideStep,\n context: GuideRenderContext,\n opts: { width: string; fixedHeight?: number | string | null },\n): { iframe: HTMLIFrameElement; cleanup: () => void } {\n const iframe = doc.createElement('iframe');\n iframe.className = 'veo-custom-frame';\n // allow-scripts SIN allow-same-origin → origen null, sin acceso al host.\n iframe.setAttribute('sandbox', 'allow-scripts');\n iframe.setAttribute('title', context.guide.guideName || 'OnUser');\n iframe.style.width = opts.width;\n\n const hasFixedHeight = opts.fixedHeight !== undefined && opts.fixedHeight !== null;\n if (hasFixedHeight) iframe.style.height = toCssSize(opts.fixedHeight as number | string);\n\n const token = uuidv7();\n // fix: las apps modernas usan design tokens/Tailwind. Reenviamos las custom\n // properties del host (`:root`) al iframe para que el CSS del cliente pueda\n // usar `var(--su-token)`; y opcionalmente inyectamos Tailwind (Play CDN) si el\n // autor lo pidió en `style.tailwind` (sujeto al CSP de la app — ver más abajo).\n const wantsTailwind = (step.style as Record<string, unknown> | undefined)?.tailwind === true;\n iframe.srcdoc = buildSrcdoc(step.html ?? '', step.css ?? '', step.js ?? '', token, {\n hostCss: collectHostStyles(),\n htmlAttrs: hostHtmlAttrs(),\n tailwind: wantsTailwind,\n });\n\n const close = (): void => context.onClose();\n\n const onMessage = (event: MessageEvent): void => {\n if (event.source !== iframe.contentWindow) return;\n const data = event.data as VeoBridgeMessage | null;\n if (!data || typeof data !== 'object' || data.__veo !== token) return;\n\n switch (data.type) {\n case 'dismiss':\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'dismissed',\n });\n close();\n break;\n case 'cta':\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'cta_clicked',\n });\n if (typeof data.url === 'string' && isSafeUrl(data.url)) {\n window.open(data.url, '_blank', 'noopener,noreferrer');\n }\n if (data.close !== false) close();\n break;\n case 'navigate':\n if (typeof data.url === 'string' && isSafeUrl(data.url)) {\n window.location.assign(data.url);\n }\n break;\n case 'track':\n if (typeof data.name === 'string' && context.onTrack) {\n context.onTrack(data.name, isRecord(data.props) ? data.props : undefined);\n }\n break;\n case 'resize':\n if (!hasFixedHeight && typeof data.height === 'number' && data.height > 0) {\n iframe.style.height = `${Math.ceil(data.height)}px`;\n }\n break;\n }\n };\n window.addEventListener('message', onMessage);\n\n return { iframe, cleanup: () => window.removeEventListener('message', onMessage) };\n}\n\nexport function toCssSize(value: number | string): string {\n return typeof value === 'number' ? `${value}px` : value;\n}\n\n/** Tope del CSS del host que inyectamos (evita un srcdoc gigante). */\nconst MAX_HOST_CSS = 800 * 1024;\n\n/**\n * Recolecta TODO el CSS legible del host (stylesheets + `<style>`) para\n * inyectarlo en el iframe de una guía custom. Así un HTML copiado desde la app\n * se ve IDÉNTICO: toma las utilidades de Tailwind COMPILADAS por la app (con su\n * config real — colores/radios custom como `text-brand`, `rounded-control`…) Y\n * las clases CSS propias (no-Tailwind), además de las variables de `:root`.\n *\n * Las hojas cross-origin (CDN de fuentes, etc.) lanzan `SecurityError` al leer\n * sus reglas y se saltan — no podemos copiarlas. Acotado a ~800KB.\n */\nfunction collectHostStyles(): string {\n if (typeof document === 'undefined') return '';\n let out = '';\n try {\n for (const sheet of Array.from(document.styleSheets)) {\n let rules: CSSRuleList | null = null;\n try {\n rules = sheet.cssRules;\n } catch {\n continue; // hoja de otro origen: no legible\n }\n if (!rules) continue;\n for (const rule of Array.from(rules)) {\n out += `${rule.cssText}\\n`;\n if (out.length > MAX_HOST_CSS) return out;\n }\n }\n } catch {\n return out;\n }\n return out;\n}\n\n/**\n * Copia atributos \"de tema\" del `<html>` del host al iframe: `class` (estrategia\n * de dark-mode por clase de Tailwind, p. ej. `dark`), `style` (variables CSS\n * seteadas inline en `:root`) y `data-theme`/`data-mode`. Sin esto, una guía\n * copiada de una app oscura renderizaría en claro (los tokens cambian según el\n * tema). Se sanitiza (sin `\"`/`<`/`>`) porque va dentro de la etiqueta `<html>`.\n */\nfunction hostHtmlAttrs(): string {\n if (typeof document === 'undefined') return '';\n try {\n const el = document.documentElement;\n const attrs: string[] = [];\n for (const name of ['class', 'style', 'data-theme', 'data-mode', 'data-color-mode']) {\n const v = el.getAttribute(name);\n if (v && v.length <= 1000 && !/[\"<>]/.test(v)) attrs.push(`${name}=\"${v}\"`);\n }\n return attrs.join(' ');\n } catch {\n return '';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Arma el documento del iframe. El JS del cliente puede llamar a `window.veo`\n * (bridge inyectado). `</script>`/`</style>` dentro del código se neutralizan\n * para que no corten sus bloques.\n *\n * `opts.hostCss` = CSS compilado del host (utilidades Tailwind reales + clases\n * propias + `:root`), para que el HTML copiado de la app se vea idéntico.\n * `opts.tailwind` inyecta ADEMÁS el Play CDN de Tailwind (para utilidades que la\n * app no usa y por ende no están en su CSS compilado) — sujeto al CSP de la app.\n */\nfunction buildSrcdoc(\n html: string,\n css: string,\n js: string,\n token: string,\n opts: { hostCss: string; htmlAttrs: string; tailwind: boolean },\n): string {\n const bridge =\n `(function(){var T=${JSON.stringify(token)};` +\n `function P(m){m.__veo=T;parent.postMessage(m,'*');}` +\n `window.veo={` +\n `dismiss:function(){P({type:'dismiss'});},` +\n `cta:function(u){P({type:'cta',url:u});},` +\n `track:function(n,p){P({type:'track',name:n,props:p||{}});},` +\n `navigate:function(u){P({type:'navigate',url:u});}};` +\n // Los <a href> dentro del iframe sandbox navegarían el iframe (la cajita),\n // no la app del host. Interceptamos el click y reenviamos la navegación al\n // host: links normales → navigate (misma pestaña); target=_blank → nueva\n // pestaña. Así los links de una guía custom \"simplemente funcionan\".\n `document.addEventListener('click',function(e){` +\n `var a=e.target&&e.target.closest?e.target.closest('a[href]'):null;` +\n `if(!a)return;` +\n `var h=a.getAttribute('href');` +\n `if(!h||h.charAt(0)==='#'||/^(javascript|mailto|tel):/i.test(h))return;` +\n `e.preventDefault();` +\n `if(a.target==='_blank'){P({type:'cta',url:a.href,close:false});}` +\n `else{P({type:'navigate',url:h});}` +\n `},true);` +\n // Medimos el alto del CONTENEDOR del contenido (`#__veo_root`), no el del\n // documento: el CSS de la app puede poner `body{min-height:100vh}` y estirar\n // el <html> a toda la pantalla (caja negra). El contenedor mide solo el\n // contenido real, así el iframe embebido se ajusta a lo que el autor definió.\n `function H(){var r=document.getElementById('__veo_root');` +\n `var h=r?r.getBoundingClientRect().height:document.documentElement.scrollHeight;` +\n `P({type:'resize',height:Math.ceil(h)});}` +\n `window.addEventListener('load',H);` +\n `try{if(typeof ResizeObserver!=='undefined'){var _r=document.getElementById('__veo_root');` +\n `new ResizeObserver(H).observe(_r||document.documentElement);}}catch(e){}` +\n `})();`;\n\n // CSS del host (todas las hojas de la app) para que el HTML se vea idéntico.\n const hostStyle = opts.hostCss ? `<style>${escapeClosing(opts.hostCss, 'style')}</style>` : '';\n // Tailwind Play CDN (opt-in). El src remoto depende del CSP de la app.\n const tailwind = opts.tailwind ? '<script src=\"https://cdn.tailwindcss.com\"></script>' : '';\n\n return (\n // Orden: base → CSS del host (utilidades+clases propias+:root) → reset\n // flotante (fondo transparente, sin márgenes) → Tailwind → CSS del autor (gana).\n `<!DOCTYPE html><html ${opts.htmlAttrs}><head><meta charset=\"utf-8\">` +\n '<style>html,body{margin:0;padding:0;}body{font-family:system-ui,-apple-system,sans-serif;}</style>' +\n hostStyle +\n // Reset flotante: el CSS de la app trae reglas de PÁGINA (body{min-height:100vh},\n // html{height:100%}, fondo del layout…) que en un iframe embebido lo estirarían a\n // toda la pantalla (caja negra) en vez de ajustarse al contenido. Neutralizamos\n // tamaño/fondo/overflow (mantenemos color y fuente heredados de la app).\n // `color-scheme:normal` es CLAVE para la transparencia: si el CSS de la app\n // declara `:root{color-scheme:dark}` y no coincide con el del elemento iframe\n // del host (normal), el navegador pinta el canvas OPACO (negro) en vez de\n // transparente — igualamos ambos lados para conservar el fondo transparente.\n '<style>html,body{margin:0!important;padding:0!important;background:transparent!important;' +\n 'height:auto!important;min-height:0!important;max-height:none!important;' +\n 'width:auto!important;min-width:0!important;overflow:visible!important;' +\n 'color-scheme:normal!important;}</style>' +\n tailwind +\n // Inline en <body>: gana incluso sobre reglas `!important` de la app (p. ej.\n // `.dark body{background:#000!important}`) porque el estilo inline tiene la\n // mayor especificidad dentro de la capa important-author.\n `<style>${escapeClosing(css, 'style')}</style></head>` +\n '<body style=\"margin:0!important;background:transparent!important;min-height:0!important;height:auto!important;\">' +\n // Contenedor del contenido: el iframe se dimensiona por SU alto (no el del\n // documento), así el layout de página de la app no lo estira.\n `<div id=\"__veo_root\">${html}</div>` +\n `<script>${bridge}</script>` +\n (js ? `<script>${escapeClosing(js, 'script')}</script>` : '') +\n '</body></html>'\n );\n}\n\nfunction escapeClosing(code: string, tag: 'script' | 'style'): string {\n const rx = tag === 'script' ? /<\\/script/gi : /<\\/style/gi;\n return code.replace(rx, `<\\\\/${tag}`);\n}\n","import { mountCustomFrame } from './renderers/custom-frame';\nimport type { GuideRenderContext, GuideStep, StepBlock } from './types';\n\n/**\n * Ejecutor de un bloque `code`.\n *\n * ⚠️ **Excepción sancionada #3 a la regla no-eval/no-innerHTML del SDK**\n * (ver CLAUDE.md regla 8). El bloque `code` es un escape hatch DELIBERADO tipo\n * Google Tag Manager: corre código del autor con acceso a la página host. El\n * usuario lo aprobó explícitamente asumiendo el riesgo (es SU app).\n *\n * Dos modos:\n * - `sandboxed: true` → iframe aislado (origen null, sin acceso al host). Es\n * el comportamiento viejo de las guías `custom`; reusa `custom-frame.ts`.\n * - `sandboxed: false` (default) → inyecta CSS/JS/HTML en la PÁGINA HOST: el\n * JS corre con acceso total al DOM real (puede tocar cualquier elemento de\n * la web, no solo la guía). Los `<script>` del HTML se re-crean para que\n * ejecuten. Todo lo inyectado se limpia al desmontar el paso.\n */\nexport interface MountedCode {\n /** Nodo visible a insertar en la card (o `null` en modo host sin HTML). */\n node: HTMLElement | null;\n cleanup: () => void;\n}\n\nexport function mountCodeBlock(\n block: StepBlock,\n doc: Document,\n context: GuideRenderContext,\n): MountedCode {\n if (block.sandboxed) {\n const step = { html: block.html ?? '', css: block.css, js: block.js } as GuideStep;\n const { iframe, cleanup } = mountCustomFrame(doc, step, context, { width: '100%' });\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-code-sandbox';\n wrapper.appendChild(iframe);\n return { node: wrapper, cleanup };\n }\n\n // ── Modo host: acceso total al DOM real ──\n // Se ejecuta SIEMPRE en la página real, SIN iframe — en runtime, en el link de\n // preview y también en el editor. Es un pedido explícito del usuario: quiere\n // ver el código correr de verdad al previsualizar. (Al re-renderizar la preview\n // el cleanup remueve la inyección previa, así no se acumula.)\n const hostDoc = doc; // el ownerDocument del shadow root ES el documento host\n const injected: ChildNode[] = [];\n\n if (typeof block.css === 'string' && block.css.trim()) {\n const style = hostDoc.createElement('style');\n style.textContent = block.css;\n hostDoc.head.appendChild(style);\n injected.push(style);\n }\n\n let node: HTMLElement | null = null;\n if (typeof block.html === 'string' && block.html.trim()) {\n node = doc.createElement('div');\n node.className = 'veo-code-html';\n // EXCEPCIÓN #3: innerHTML sobre un nodo del shadow (no ejecuta scripts por sí\n // solo). Los `<script>` se re-crean abajo para que corran en el host.\n node.innerHTML = block.html;\n for (const old of Array.from(node.querySelectorAll('script'))) {\n injected.push(runScript(old, hostDoc));\n old.remove();\n }\n }\n\n if (typeof block.js === 'string' && block.js.trim()) {\n const s = hostDoc.createElement('script');\n s.textContent = block.js;\n hostDoc.body.appendChild(s);\n injected.push(s);\n }\n\n return {\n node,\n cleanup: () => {\n for (const n of injected) n.parentNode?.removeChild(n);\n },\n };\n}\n\n/** Re-crea un `<script>` (inerte al venir de innerHTML) para que EJECUTE en el host. */\nfunction runScript(old: HTMLScriptElement, hostDoc: Document): HTMLScriptElement {\n const s = hostDoc.createElement('script');\n for (const attr of Array.from(old.attributes)) s.setAttribute(attr.name, attr.value);\n if (!old.src) s.textContent = old.textContent;\n hostDoc.body.appendChild(s);\n return s;\n}\n","import { createCloseButton } from './block-builder';\nimport type { FormField, GuideRenderContext } from './types';\n\n/**\n * Construcción COMPARTIDA del contenido de una guía `form` (overlay) e\n * `inline-form` (embebida): título/texto, campos, validación de requeridos,\n * envío vía `context.onFormSubmit`, estado \"¡Gracias!\" y cierre diferido.\n * El caller pone el chrome (modal-card u tarjeta inline) y pasa la `card`\n * donde se reemplaza el contenido por el agradecimiento.\n *\n * Mismas reglas de seguridad que block-builder: cero `innerHTML`, todo texto\n * por `textContent`.\n */\nexport function mountFormContent(\n card: HTMLElement,\n context: GuideRenderContext,\n doc: Document,\n): void {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n const fields = step.fields ?? [];\n\n const dismiss = (): void => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'dismissed' });\n context.onClose();\n };\n\n const content = doc.createElement('div');\n content.className = 'veo-guide-content';\n\n if (step.title) {\n const heading = doc.createElement('h2');\n heading.className = 'veo-guide-title';\n heading.textContent = step.title;\n content.appendChild(heading);\n }\n if (step.content) {\n const paragraph = doc.createElement('p');\n paragraph.className = 'veo-guide-text';\n paragraph.textContent = step.content;\n content.appendChild(paragraph);\n }\n\n const readers: Array<{ field: FormField; read: () => unknown }> = [];\n const form = doc.createElement('form');\n form.className = 'veo-form';\n form.noValidate = true;\n for (const field of fields) {\n const { wrapper, read } = buildField(field, doc);\n readers.push({ field, read });\n form.appendChild(wrapper);\n }\n\n const error = doc.createElement('p');\n error.className = 'veo-form-error';\n error.style.display = 'none';\n form.appendChild(error);\n\n const actions = doc.createElement('div');\n actions.className = 'veo-guide-actions';\n const submit = doc.createElement('button');\n submit.type = 'submit';\n submit.className = 'veo-guide-cta';\n submit.textContent = step.ctaText || 'Enviar';\n actions.appendChild(submit);\n form.appendChild(actions);\n\n form.addEventListener('submit', (e) => {\n e.preventDefault();\n error.style.display = 'none';\n\n const answers: Record<string, unknown> = {};\n for (const { field, read } of readers) {\n const value = read();\n const empty = value === undefined || value === null || value === '';\n if (empty) {\n if (field.required) {\n error.textContent = `Completa \"${field.label}\"`;\n error.style.display = 'block';\n return;\n }\n continue;\n }\n answers[field.key] = value;\n }\n if (Object.keys(answers).length === 0) {\n error.textContent = 'Responde al menos un campo';\n error.style.display = 'block';\n return;\n }\n\n submit.disabled = true;\n const submitFn = context.onFormSubmit ?? (() => Promise.resolve(true));\n void submitFn(answers).then((ok) => {\n if (!ok) {\n submit.disabled = false;\n error.textContent = 'No se pudo enviar. Prueba de nuevo.';\n error.style.display = 'block';\n return;\n }\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'completed' });\n const note = context.isPreview\n ? (context.previewNote ?? 'Vista previa: la respuesta NO se guardó.')\n : null;\n showThanks(card, doc, note);\n window.setTimeout(() => context.onClose(), note ? 2200 : 1400);\n });\n });\n\n content.appendChild(form);\n content.appendChild(createCloseButton(doc, dismiss));\n\n card.appendChild(content);\n}\n\n/** Reemplaza el contenido de la tarjeta por un \"¡Gracias!\" breve. */\nfunction showThanks(card: HTMLElement, doc: Document, note: string | null): void {\n while (card.firstChild) card.removeChild(card.firstChild);\n const thanks = doc.createElement('div');\n thanks.className = 'veo-form-thanks';\n thanks.textContent = '✓ ¡Gracias por tu respuesta!';\n card.appendChild(thanks);\n if (note) {\n const noteEl = doc.createElement('p');\n noteEl.className = 'veo-form-preview-note';\n noteEl.textContent = note;\n card.appendChild(noteEl);\n }\n}\n\n/** Construye el DOM de un campo y devuelve su lector de valor. */\nexport function buildField(\n field: FormField,\n doc: Document,\n): { wrapper: HTMLElement; read: () => unknown } {\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-form-field';\n\n const label = doc.createElement('label');\n label.className = 'veo-form-label';\n label.textContent = field.required ? `${field.label} *` : field.label;\n wrapper.appendChild(label);\n\n switch (field.type) {\n case 'textarea': {\n const input = doc.createElement('textarea');\n input.className = 'veo-form-input';\n input.rows = 3;\n if (field.placeholder) input.placeholder = field.placeholder;\n wrapper.appendChild(input);\n return { wrapper, read: () => input.value.trim() };\n }\n case 'number': {\n const input = doc.createElement('input');\n input.type = 'number';\n input.className = 'veo-form-input';\n if (field.placeholder) input.placeholder = field.placeholder;\n wrapper.appendChild(input);\n return {\n wrapper,\n read: () => (input.value.trim() === '' ? undefined : Number(input.value)),\n };\n }\n case 'select': {\n const select = doc.createElement('select');\n select.className = 'veo-form-input';\n const blank = doc.createElement('option');\n blank.value = '';\n blank.textContent = field.placeholder || 'Elige una opción…';\n select.appendChild(blank);\n for (const opt of field.options ?? []) {\n const option = doc.createElement('option');\n option.value = opt;\n option.textContent = opt;\n select.appendChild(option);\n }\n wrapper.appendChild(select);\n return { wrapper, read: () => select.value || undefined };\n }\n case 'radio': {\n const group = doc.createElement('div');\n group.className = 'veo-form-options';\n const name = `veo-${field.key}`;\n const inputs: HTMLInputElement[] = [];\n for (const opt of field.options ?? []) {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const radio = doc.createElement('input');\n radio.type = 'radio';\n radio.name = name;\n radio.value = opt;\n inputs.push(radio);\n const text = doc.createElement('span');\n text.textContent = opt;\n optionLabel.appendChild(radio);\n optionLabel.appendChild(text);\n group.appendChild(optionLabel);\n }\n wrapper.appendChild(group);\n return { wrapper, read: () => inputs.find((i) => i.checked)?.value };\n }\n case 'multiselect': {\n // Grupo de checkboxes: la respuesta es un ARRAY con las opciones marcadas.\n const group = doc.createElement('div');\n group.className = 'veo-form-options';\n const inputs: HTMLInputElement[] = [];\n for (const opt of field.options ?? []) {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const checkbox = doc.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.value = opt;\n inputs.push(checkbox);\n const text = doc.createElement('span');\n text.textContent = opt;\n optionLabel.appendChild(checkbox);\n optionLabel.appendChild(text);\n group.appendChild(optionLabel);\n }\n wrapper.appendChild(group);\n return {\n wrapper,\n read: () => {\n const values = inputs.filter((i) => i.checked).map((i) => i.value);\n return values.length > 0 ? values : undefined;\n },\n };\n }\n case 'checkbox': {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const checkbox = doc.createElement('input');\n checkbox.type = 'checkbox';\n const text = doc.createElement('span');\n text.textContent = field.placeholder || 'Sí';\n optionLabel.appendChild(checkbox);\n optionLabel.appendChild(text);\n wrapper.appendChild(optionLabel);\n // Checkbox siempre responde true/false (no “vacío”): required pide marcarlo.\n return { wrapper, read: () => (checkbox.checked ? true : field.required ? '' : false) };\n }\n case 'yesno': {\n // Radio Sí/No: dos opciones visibles, pero la respuesta es BOOLEANA\n // (true/false) — el widget \"amigable\" para props de tipo sí/no.\n const group = doc.createElement('div');\n group.className = 'veo-form-options';\n const name = `veo-${field.key}`;\n const [yesLabel, noLabel] =\n field.options?.length === 2 ? (field.options as [string, string]) : ['Sí', 'No'];\n const inputs: Array<{ input: HTMLInputElement; value: boolean }> = [];\n for (const { label: optText, value } of [\n { label: yesLabel, value: true },\n { label: noLabel, value: false },\n ]) {\n const optionLabel = doc.createElement('label');\n optionLabel.className = 'veo-form-option';\n const radio = doc.createElement('input');\n radio.type = 'radio';\n radio.name = name;\n inputs.push({ input: radio, value });\n const text = doc.createElement('span');\n text.textContent = optText;\n optionLabel.appendChild(radio);\n optionLabel.appendChild(text);\n group.appendChild(optionLabel);\n }\n wrapper.appendChild(group);\n return { wrapper, read: () => inputs.find((i) => i.input.checked)?.value };\n }\n case 'nps':\n return buildScale(wrapper, doc, 0, 10, 'veo-nps-btn');\n case 'rating':\n return buildScale(wrapper, doc, 1, 5, 'veo-rating-btn', '★');\n default: {\n const input = doc.createElement('input');\n input.type = 'text';\n input.className = 'veo-form-input';\n if (field.placeholder) input.placeholder = field.placeholder;\n wrapper.appendChild(input);\n return { wrapper, read: () => input.value.trim() };\n }\n }\n}\n\n/** Fila de botones numerados (NPS 0-10) o de estrellas (rating 1-5). */\nfunction buildScale(\n wrapper: HTMLElement,\n doc: Document,\n min: number,\n max: number,\n btnClass: string,\n symbol?: string,\n): { wrapper: HTMLElement; read: () => unknown } {\n const row = doc.createElement('div');\n row.className = 'veo-form-scale';\n let selected: number | undefined;\n const buttons: HTMLButtonElement[] = [];\n for (let n = min; n <= max; n++) {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = btnClass;\n btn.textContent = symbol ?? String(n);\n btn.setAttribute('aria-label', String(n));\n btn.addEventListener('click', () => {\n selected = n;\n buttons.forEach((b, i) => {\n // Rating pinta acumulado (★★★☆☆); NPS solo el elegido.\n const active = symbol ? i + min <= n : i + min === n;\n b.classList.toggle('veo-scale-active', active);\n });\n });\n buttons.push(btn);\n row.appendChild(btn);\n }\n wrapper.appendChild(row);\n return { wrapper, read: () => selected };\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { applyBlockStyle, buildContentBlock, createCloseButton, isSafeUrl } from '../block-builder';\nimport { mountCodeBlock } from '../code-block';\nimport { buildField } from '../form-content';\nimport { insertHost, keepHostAttached } from '../inline-host';\nimport type {\n CompositeStep,\n FormField,\n GuideRenderContext,\n InlinePosition,\n StepBlock,\n StepPosition,\n} from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/** Lector de un campo de formulario (para los botones submit-forms). */\ninterface FormReader {\n field: FormField;\n read: () => unknown;\n}\n\n/** align de un botón → justify-content de su fila de acciones. */\nconst ROW_ALIGN: Record<string, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\n/**\n * Renderer UNIFICADO del modelo `composite`. Renderiza UN paso componiendo\n * presentación (floating/inline) × posición (9 esquinas / centro /\n * relative-to-element) + diseño + bloques. Reemplaza los 10 renderers por-tipo.\n *\n * El SDK normaliza toda guía a `composite` (`normalizeGuide`) antes de llegar\n * acá, así que este renderer no conoce los tipos viejos.\n *\n * Multi-paso: si `context.nav` está, los botones next/prev/dismiss delegan en\n * las callbacks de navegación (el controller orquesta el avance, igual que en\n * los walkthroughs heterogéneos).\n */\nexport class CompositeRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const idx = context.nav?.stepIndex ?? 0;\n const step = context.guide.guideSteps[idx] as unknown as CompositeStep | undefined;\n if (!step) return;\n\n // Ancla (relative-to-element o inline) — sin ella no pintamos.\n const anchorSelector =\n step.position === 'relative-to-element' || step.presentation === 'inline'\n ? step.anchorSelector?.trim() || undefined\n : undefined;\n let anchor: Element | null = null;\n if (anchorSelector) {\n anchor = await waitForElement(anchorSelector);\n if (!anchor) return;\n }\n\n const { host, root } = this.createHost();\n const doc = root.ownerDocument ?? document;\n const design = (step.design ?? {}) as Record<string, unknown>;\n\n // Z-index del host (contenedor de la guía) desde el diseño.\n if (typeof design.zIndex === 'number') host.style.zIndex = String(design.zIndex);\n\n // ── Card + diseño ──\n const card = doc.createElement('div');\n card.className = 'veo-card';\n applyCompositeDesign(card, design);\n\n const dismiss = (action: 'dismissed' | 'cta_clicked', meta?: StepBlock): void => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action,\n ...(meta?.id ? { metadata: { buttonId: meta.id } } : {}),\n });\n };\n\n // ── Contenido: recorre los bloques EN ORDEN (title/text/image/code/form\n // intercalados con filas de botones). Los form-blocks registran readers que\n // los botones submit-forms recogen. ──\n const readers: FormReader[] = [];\n this.buildContent(card, step.blocks ?? [], doc, context, idx, readers);\n // ✕ de cierre (a menos que el diseño lo desactive), con color configurable.\n if (design.closeButton !== false) {\n const closeBtn = createCloseButton(doc, () => {\n dismiss('dismissed');\n this.closeOrSkip(context);\n });\n const closeColor = typeof design.closeColor === 'string' ? design.closeColor : null;\n const hoverColor = typeof design.closeHoverColor === 'string' ? design.closeHoverColor : null;\n if (closeColor) closeBtn.style.color = closeColor;\n // Posición del ✕: por defecto arriba-derecha, DENTRO de la tarjeta (el CSS\n // base lo deja a -6px, medio afuera y clavado en esa esquina). El usuario\n // lo puede mover a cualquiera de las 4 esquinas.\n const closePos =\n typeof design.closePosition === 'string' ? design.closePosition : 'top-right';\n applyClosePosition(closeBtn, closePos);\n // Reserva espacio para que el ✕ no se monte sobre el texto de esa esquina\n // (p.ej. arriba-izquierda tapaba el título).\n reserveCloseSpace(card, closePos);\n // El hover del ✕ no se puede con inline CSS (:hover) → listeners que\n // intercambian el color (base ↔ hover).\n if (hoverColor) {\n closeBtn.addEventListener('mouseenter', () => {\n closeBtn.style.color = hoverColor;\n });\n closeBtn.addEventListener('mouseleave', () => {\n closeBtn.style.color = closeColor ?? '';\n });\n }\n card.appendChild(closeBtn);\n }\n\n // ── Posicionamiento ──\n if (step.presentation === 'inline' && anchor) {\n host.style.display = 'block';\n const pos = inlinePosOf(step.inlinePosition);\n root.appendChild(card);\n insertHost(anchor, host, pos);\n this.registerCleanup(keepHostAttached(host, anchorSelector as string, pos));\n } else if (step.position === 'relative-to-element' && anchor) {\n // Backdrop opcional para el anclado (spotlight): oscurece la página y,\n // con targetAbove, eleva el elemento objetivo por encima del oscurecido.\n if (design.backdrop === true) {\n const bg = doc.createElement('div');\n bg.className = 'veo-composite-overlay veo-composite-overlay--dim';\n if (typeof design.backdropColor === 'string') bg.style.background = design.backdropColor;\n const bz = typeof design.backdropZIndex === 'number' ? design.backdropZIndex : 200000;\n bg.style.zIndex = String(bz);\n root.appendChild(bg);\n if (design.targetAbove === true) this.registerCleanup(liftTarget(anchor, bz + 1));\n }\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-composite-anchored';\n // Flecha (caret) que apunta al ancla, salvo que el diseño la desactive.\n const caretEl = design.caret === false ? null : makeCaret(doc, design);\n if (caretEl) wrapper.appendChild(caretEl);\n wrapper.appendChild(card);\n root.appendChild(wrapper);\n this.registerCleanup(await anchorPosition(anchor, wrapper, caretEl));\n } else {\n // Flotante en el viewport (centro o esquina). El fondo oscuro (backdrop)\n // se aplica según el toggle del usuario, INDEPENDIENTE de la posición:\n // una guía en una esquina también puede comportarse como modal (fondo\n // oscuro + click-fuera cierra). Antes solo se pintaba en 'center', así que\n // al mover la guía fuera del centro se perdía el backdrop.\n const overlay = doc.createElement('div');\n overlay.className = 'veo-composite-overlay';\n if (design.backdrop !== false) {\n overlay.classList.add('veo-composite-overlay--dim');\n if (typeof design.backdropColor === 'string') {\n overlay.style.background = design.backdropColor;\n }\n if (typeof design.backdropZIndex === 'number') {\n overlay.style.zIndex = String(design.backdropZIndex);\n }\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) {\n dismiss('dismissed');\n this.closeOrSkip(context);\n }\n });\n }\n applyViewportPosition(card, step.position, design);\n overlay.appendChild(card);\n root.appendChild(overlay);\n }\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: idx, action: 'shown' });\n }\n\n /** Recorre los bloques en orden y los pinta en la card. */\n private buildContent(\n card: HTMLElement,\n blocks: StepBlock[],\n doc: Document,\n context: GuideRenderContext,\n idx: number,\n readers: FormReader[],\n ): void {\n const emit = (block: StepBlock): void => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action: 'cta_clicked',\n ...(block.id ? { metadata: { buttonId: block.id } } : {}),\n });\n };\n let i = 0;\n while (i < blocks.length) {\n const b = blocks[i];\n if (!b) {\n i++;\n continue;\n }\n if (b.type === 'button') {\n const row = doc.createElement('div');\n row.className = 'veo-guide-actions';\n // La alineación de un botón mueve la FILA (justify-content), no el botón\n // dentro. La toma del PRIMER botón del grupo.\n let rowAlign: string | undefined;\n while (i < blocks.length && blocks[i]?.type === 'button') {\n const bb = blocks[i] as StepBlock;\n if (!rowAlign) {\n const a = (bb.style as Record<string, unknown> | null | undefined)?.align;\n if (a === 'left' || a === 'center' || a === 'right') rowAlign = a;\n }\n row.appendChild(this.buildButton(bb, doc, context, idx, readers, emit));\n i++;\n }\n if (rowAlign) row.style.justifyContent = ROW_ALIGN[rowAlign] ?? 'flex-end';\n card.appendChild(row);\n continue;\n }\n if (b.type === 'code') {\n const { node, cleanup } = mountCodeBlock(b, doc, context);\n if (node) card.appendChild(node);\n this.registerCleanup(cleanup);\n i++;\n continue;\n }\n if (b.type === 'form') {\n const form = doc.createElement('div');\n form.className = 'veo-form';\n for (const field of b.fields ?? []) {\n const { wrapper, read } = buildField(field, doc);\n readers.push({ field, read });\n form.appendChild(wrapper);\n }\n card.appendChild(form);\n i++;\n continue;\n }\n const node = buildContentBlock(b, doc);\n if (node) card.appendChild(node);\n i++;\n }\n }\n\n /** Botón con enrutado de acción (navegación / cierre / url / guía / envío de forms). */\n private buildButton(\n block: StepBlock,\n doc: Document,\n context: GuideRenderContext,\n idx: number,\n readers: FormReader[],\n emit: (block: StepBlock) => void,\n ): HTMLButtonElement {\n const btn = doc.createElement('button');\n btn.type = 'button';\n btn.className = 'veo-guide-cta';\n btn.textContent = block.text?.trim() || 'OK';\n // Estilos por-bloque del botón (color/fondo/borde/tamaño/tipografía/…).\n applyBlockStyle(btn, block.style, 'button');\n const nav = context.nav?.callbacks;\n btn.addEventListener('click', () => {\n switch (block.action) {\n case 'next':\n emit(block);\n if (nav) nav.onNext();\n else context.onClose();\n break;\n case 'prev':\n emit(block);\n nav?.onBack();\n break;\n case 'url':\n emit(block);\n if (typeof block.url === 'string' && isSafeUrl(block.url)) {\n window.open(block.url, '_blank', 'noopener,noreferrer');\n }\n break;\n case 'guide':\n emit(block);\n if (block.targetGuideId) context.onOpenGuide?.(block.targetGuideId);\n this.closeOrSkip(context);\n break;\n case 'submit-forms':\n case 'submit-forms-advance':\n case 'submit-forms-goto':\n this.submitForms(readers, context, idx, btn, () => {\n emit(block);\n if (block.action === 'submit-forms' || !nav) {\n context.onClose();\n } else if (\n block.action === 'submit-forms-goto' &&\n typeof block.targetStep === 'number' &&\n nav.onGoto\n ) {\n nav.onGoto(block.targetStep);\n } else {\n nav.onNext();\n }\n });\n break;\n default:\n emit(block);\n this.closeOrSkip(context);\n }\n });\n return btn;\n }\n\n /** Recoge respuestas de todos los form-blocks del paso, valida y envía. */\n private submitForms(\n readers: FormReader[],\n context: GuideRenderContext,\n idx: number,\n btn: HTMLButtonElement,\n onDone: () => void,\n ): void {\n const answers: Record<string, unknown> = {};\n for (const { field, read } of readers) {\n const value = read();\n const empty = value === undefined || value === null || value === '';\n if (empty) {\n if (field.required) {\n btn.textContent = `Completa \"${field.label}\"`;\n return;\n }\n continue;\n }\n answers[field.key] = value;\n }\n if (readers.length > 0 && Object.keys(answers).length === 0) return;\n btn.disabled = true;\n const submitFn = context.onFormSubmit ?? (() => Promise.resolve(true));\n void submitFn(answers).then((ok) => {\n btn.disabled = false;\n if (!ok) return;\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action: 'completed',\n });\n onDone();\n });\n }\n\n private closeOrSkip(context: GuideRenderContext): void {\n if (context.nav?.callbacks) context.nav.callbacks.onSkip();\n else context.onClose();\n }\n}\n\nfunction inlinePosOf(p: InlinePosition | null | undefined): InlinePosition {\n return p === 'before' || p === 'prepend' || p === 'append' ? p : 'after';\n}\n\n/** Fija la card en una esquina/centro del viewport. `hAlign` fuerza izq/der. */\nfunction applyViewportPosition(\n card: HTMLElement,\n position: StepPosition,\n design: Record<string, unknown>,\n): void {\n const s = card.style;\n s.position = 'fixed';\n const M = '16px';\n const hAlign = design.hAlign === 'left' ? 'left' : design.hAlign === 'right' ? 'right' : null;\n const v = position.includes('top') ? 'top' : position.includes('bottom') ? 'bottom' : 'middle';\n // hAlign (Alineación > Horizontal) gana sobre el eje horizontal de la posición.\n const h =\n hAlign ??\n (position.includes('left') ? 'left' : position.includes('right') ? 'right' : 'middle');\n\n if (v === 'top') s.top = M;\n else if (v === 'bottom') s.bottom = M;\n else s.top = '50%';\n\n if (h === 'left') s.left = M;\n else if (h === 'right') s.right = M;\n else s.left = '50%';\n\n // Transform para centrar el/los ejes que quedaron en 50%.\n const tx = h === 'middle' ? '-50%' : '0';\n const ty = v === 'middle' ? '-50%' : '0';\n s.transform = tx === '0' && ty === '0' ? '' : `translate(${tx}, ${ty})`;\n}\n\n/** Caret (flecha) que apunta al ancla, con el fondo/borde de la card. */\n/** Espacio del ✕ respecto a la esquina elegida (dentro de la tarjeta). */\nconst CLOSE_INSET = '10px';\n\n/**\n * Ubica el ✕ de cierre en una de las 4 esquinas, DENTRO de la tarjeta. Limpia\n * los `top/right` negativos del CSS base (que lo dejaban medio afuera).\n */\nfunction applyClosePosition(btn: HTMLElement, position: string): void {\n const s = btn.style;\n s.top = 'auto';\n s.right = 'auto';\n s.bottom = 'auto';\n s.left = 'auto';\n const vertical = position.includes('bottom') ? 'bottom' : 'top';\n const horizontal = position.includes('left') ? 'left' : 'right';\n s.setProperty(vertical, CLOSE_INSET);\n s.setProperty(horizontal, CLOSE_INSET);\n}\n\n/** Padding reservado para el ✕ en el bloque de su esquina (≈ inset + ancho). */\nconst CLOSE_RESERVE = '34px';\n\n/**\n * Evita que el ✕ tape el contenido de su esquina: agrega padding en el bloque\n * adyacente (el primero si el ✕ va arriba, el último si va abajo) del lado\n * horizontal donde queda el ✕.\n */\nfunction reserveCloseSpace(card: HTMLElement, position: string): void {\n const blocks = Array.from(card.children).filter(\n (c): c is HTMLElement => c instanceof HTMLElement && !c.classList.contains('veo-guide-close'),\n );\n if (blocks.length === 0) return;\n const target = position.includes('bottom') ? blocks[blocks.length - 1] : blocks[0];\n if (!target) return;\n target.style[position.includes('left') ? 'paddingLeft' : 'paddingRight'] = CLOSE_RESERVE;\n}\n\nfunction makeCaret(doc: Document, design: Record<string, unknown>): HTMLElement {\n const caret = doc.createElement('div');\n caret.className = 'veo-composite-caret';\n const w = typeof design.caretWidth === 'number' ? design.caretWidth : 12;\n const h = typeof design.caretHeight === 'number' ? design.caretHeight : 12;\n const s = caret.style;\n s.position = 'absolute';\n s.width = `${w}px`;\n s.height = `${h}px`;\n s.transform = 'rotate(45deg)';\n s.background = typeof design.background === 'string' ? design.background : '#ffffff';\n if (typeof design.borderWidth === 'number' && design.borderWidth > 0) {\n const bc = typeof design.borderColor === 'string' ? design.borderColor : '#bbbbbb';\n s.border = `${design.borderWidth}px solid ${bc}`;\n }\n return caret;\n}\n\n/**\n * Eleva el elemento objetivo por encima del backdrop (targetAbove): lo resalta\n * dejándolo visible/clickeable sobre el oscurecido. Devuelve un restore.\n */\nfunction liftTarget(anchor: Element, zIndex: number): () => void {\n const el = anchor as HTMLElement;\n const prevPosition = el.style.position;\n const prevZ = el.style.zIndex;\n if (getComputedStyle(el).position === 'static') el.style.position = 'relative';\n el.style.zIndex = String(zIndex);\n return () => {\n el.style.position = prevPosition;\n el.style.zIndex = prevZ;\n };\n}\n\n/** Ancla la card a un elemento con Floating UI + reposiciona en scroll/resize. */\nasync function anchorPosition(\n anchor: Element,\n wrapper: HTMLElement,\n caret: HTMLElement | null,\n): Promise<() => void> {\n const update = async (): Promise<void> => {\n const { x, y, placement, middlewareData } = await computePosition(anchor, wrapper, {\n placement: 'bottom',\n strategy: 'fixed',\n middleware: [\n offset(caret ? 10 : 8),\n flip(),\n shift({ padding: 8 }),\n ...(caret ? [arrow({ element: caret })] : []),\n ],\n });\n wrapper.style.left = `${x}px`;\n wrapper.style.top = `${y}px`;\n if (caret) positionArrow(caret, placement, middlewareData.arrow);\n };\n await update();\n const reposition = (): void => void update();\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n}\n\n/** Aplica el objeto `design` (font/border/bg/padding/margin) como estilos inline. */\nfunction applyCompositeDesign(card: HTMLElement, design: Record<string, unknown>): void {\n const s = card.style;\n const px = (v: unknown): string | null =>\n typeof v === 'number' && Number.isFinite(v) ? `${v}px` : null;\n const strv = (v: unknown): string | null => (typeof v === 'string' && v ? v : null);\n\n if (strv(design.background)) s.background = design.background as string;\n // `color` (panel de estilos nuevo) con fallback `textColor` (guías viejas).\n const textColor = strv(design.color) ?? strv(design.textColor);\n if (textColor) s.color = textColor;\n if (px(design.fontSize)) s.fontSize = px(design.fontSize) as string;\n if (strv(design.fontWeight)) s.fontWeight = design.fontWeight as string;\n if (strv(design.fontFamily) && design.fontFamily !== 'inherit') {\n s.fontFamily = design.fontFamily as string;\n }\n if (strv(design.textTransform) && design.textTransform !== 'none') {\n s.textTransform = design.textTransform as string;\n }\n if (typeof design.letterSpacing === 'number') s.letterSpacing = `${design.letterSpacing}px`;\n if (strv(design.align)) s.textAlign = design.align as string;\n if (typeof design.lineHeight === 'number') s.lineHeight = `${design.lineHeight}%`;\n if (px(design.radius)) s.borderRadius = px(design.radius) as string;\n const bw = px(design.borderWidth);\n if (bw) s.border = `${bw} solid ${strv(design.borderColor) ?? '#e5e5e5'}`;\n // Sombra (X Y Blur Spread Color).\n if (strv(design.shadowColor) || typeof design.shadowBlur === 'number') {\n const n = (k: string) => (typeof design[k] === 'number' ? (design[k] as number) : 0);\n s.boxShadow = `${n('shadowX')}px ${n('shadowY')}px ${n('shadowBlur')}px ${n('shadowSpread')}px ${strv(design.shadowColor) ?? 'rgba(0,0,0,0.2)'}`;\n }\n // Dimensiones: ancho completo / fijo / fluido.\n if (design.fullWidth === true) {\n s.width = '100%';\n } else if (design.widthType === 'fluid') {\n s.width = 'auto';\n if (px(design.width)) s.maxWidth = px(design.width) as string;\n } else if (px(design.width)) {\n s.width = px(design.width) as string;\n }\n for (const side of ['Top', 'Right', 'Bottom', 'Left'] as const) {\n const p = px(design[`padding${side}`]);\n if (p) s.setProperty(`padding-${side.toLowerCase()}`, p);\n const m = px(design[`margin${side}`]);\n if (m) s.setProperty(`margin-${side.toLowerCase()}`, m);\n }\n}\n","import { computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport type { CustomPlacement, GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { mountCustomFrame, toCssSize } from './custom-frame';\n\nconst DEFAULT_PLACEMENT: CustomPlacement = { mode: 'floating', position: 'bottom-right' };\nconst DEFAULT_OFFSET = 16;\nconst DEFAULT_WIDTH = 360;\n\n/**\n * Renderiza una guía `custom` montando el HTML/CSS/JS del cliente en un\n * **iframe sandbox** (ver `custom-frame.ts`). Ubicación: `floating`\n * (esquina/centro del viewport) o `anchored` (Floating UI contra un selector\n * del host). La variante embebida en el flujo es `inline-custom`.\n */\nexport class CustomRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || typeof step.html !== 'string' || step.html.length === 0) return;\n\n const placement: CustomPlacement = step.placement ?? DEFAULT_PLACEMENT;\n\n let anchor: Element | null = null;\n if (placement.mode === 'anchored') {\n const selector =\n placement.selector ?? step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n anchor = await waitForElement(selector);\n if (!anchor) return; // sin ancla no mostramos (guía fantasma = peor UX)\n }\n\n const { root } = this.createHost();\n const doc = root.ownerDocument ?? document;\n\n const wrapper = doc.createElement('div');\n wrapper.className =\n placement.mode === 'anchored' ? 'veo-custom-anchored' : 'veo-custom-floating';\n\n const { iframe, cleanup } = mountCustomFrame(doc, step, context, {\n width: toCssSize(placement.width ?? DEFAULT_WIDTH),\n fixedHeight: placement.height ?? null,\n });\n this.registerCleanup(cleanup);\n\n wrapper.appendChild(iframe);\n // Sin ✕ del host: las guías custom controlan su propio cierre desde su HTML\n // (`window.veo.dismiss()`). Un botón inyectado no encaja con su diseño.\n root.appendChild(wrapper);\n\n if (placement.mode === 'floating') {\n applyFloatingPosition(wrapper, placement);\n } else if (anchor) {\n this.registerCleanup(await this.setupAnchoredPosition(anchor, wrapper, placement));\n }\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n\n private async setupAnchoredPosition(\n anchor: Element,\n wrapper: HTMLElement,\n placement: CustomPlacement,\n ): Promise<() => void> {\n const side = placement.side ?? 'bottom';\n const update = async (): Promise<void> => {\n const { x, y } = await computePosition(anchor, wrapper, {\n placement: side,\n strategy: 'fixed',\n middleware: [offset(placement.offsetY ?? 8), flip(), shift({ padding: 8 })],\n });\n wrapper.style.left = `${x}px`;\n wrapper.style.top = `${y}px`;\n };\n await update();\n\n const reposition = (): void => {\n void update();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }\n}\n\n/** Fija el wrapper en una esquina/centro del viewport según `position`. */\nfunction applyFloatingPosition(wrapper: HTMLElement, placement: CustomPlacement): void {\n const position = placement.position ?? 'bottom-right';\n const ox = `${placement.offsetX ?? DEFAULT_OFFSET}px`;\n const oy = `${placement.offsetY ?? DEFAULT_OFFSET}px`;\n const s = wrapper.style;\n\n if (position === 'center') {\n s.top = '50%';\n s.left = '50%';\n s.transform = 'translate(-50%, -50%)';\n return;\n }\n\n const [vertical, horizontal] = position.split('-');\n if (vertical === 'top') s.top = oy;\n else s.bottom = oy;\n\n if (horizontal === 'left') {\n s.left = ox;\n } else if (horizontal === 'right') {\n s.right = ox;\n } else {\n s.left = '50%';\n s.transform = 'translateX(-50%)';\n }\n}\n","import { mountFormContent } from '../form-content';\nimport type { GuideRenderContext } from '../types';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `form` (encuesta/NPS estilo Pendo): backdrop + tarjeta\n * centrada (mismo chrome que el modal) con los campos de `step.fields`.\n * Al enviar, las respuestas viajan vía `context.onFormSubmit` y el backend\n * las mergea como PROPIEDADES (`user_traits`) del usuario que respondió.\n *\n * El contenido (campos/envío/gracias) es compartido con `inline-form`\n * (ver `form-content.ts`); aquí solo va el chrome flotante.\n */\nexport class FormRenderer extends BaseRenderer {\n render(context: GuideRenderContext): void {\n const step = context.guide.guideSteps[0];\n if (!step || (step.fields ?? []).length === 0) return;\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const doc = root.ownerDocument ?? document;\n\n const overlay = doc.createElement('div');\n overlay.className = 'veo-modal-overlay';\n const card = doc.createElement('div');\n card.className = 'veo-modal-card';\n\n mountFormContent(card, context, doc);\n overlay.appendChild(card);\n root.appendChild(overlay);\n\n const dismiss = (): void => {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'dismissed' });\n context.onClose();\n };\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) dismiss();\n });\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') dismiss();\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { mountCustomFrame } from './custom-frame';\n\n/**\n * Guía `inline-custom`: HTML/CSS/JS del cliente (iframe sandbox, ver\n * `custom-frame.ts`) EMBEBIDO en el flujo del DOM, junto a un elemento ancla\n * (`step.selector` + `step.style.inlinePosition`). Como el inline estándar pero\n * con código propio en vez de bloques.\n */\nexport class InlineCustomRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || typeof step.html !== 'string' || step.html.length === 0) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n host.style.display = 'block';\n const position = readInlinePosition(step.style);\n insertHost(anchor, host, position);\n // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n this.registerCleanup(keepHostAttached(host, selector, position));\n const doc = root.ownerDocument ?? document;\n\n const wrapper = doc.createElement('div');\n wrapper.className = 'veo-custom-inline';\n\n const { iframe, cleanup } = mountCustomFrame(doc, step, context, { width: '100%' });\n this.registerCleanup(cleanup);\n\n wrapper.appendChild(iframe);\n // Sin ✕ del host: las guías inline-custom cierran desde su propio HTML.\n root.appendChild(wrapper);\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import { mountFormContent } from '../form-content';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideRenderContext } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `inline-form`: el MISMO formulario que `form` (campos →\n * props del usuario) pero EMBEBIDO en el flujo del DOM junto a un elemento\n * ancla, como `inline`. `step.selector` = ancla; `step.style.inlinePosition`\n * = dónde insertarse. El contenido compartido vive en `form-content.ts`.\n */\nexport class InlineFormRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step || (step.fields ?? []).length === 0) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n // createHost adjuntó el host a <body>; lo movemos al flujo del DOM, junto\n // al ancla. `display:block` vence el `:host{all:initial}` (que sería inline).\n host.style.display = 'block';\n const position = readInlinePosition(step.style);\n insertHost(anchor, host, position);\n // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n this.registerCleanup(keepHostAttached(host, selector, position));\n\n this.applyDesign(step.style);\n const doc = root.ownerDocument ?? document;\n\n const card = doc.createElement('div');\n card.className = 'veo-inline';\n mountFormContent(card, context, doc);\n root.appendChild(card);\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n}\n","import { buildStepContent } from '../block-builder';\nimport { insertHost, keepHostAttached, readInlinePosition } from '../inline-host';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\n\n/**\n * Renderiza una guía `inline`: EMBEBIDA en el flujo del DOM, junto a un\n * elemento ancla (no flota como overlay). A diferencia de modal/banner/tooltip\n * (host fijo/absoluto sobre `body`), aquí el host se mueve al flujo del\n * documento — ocupa su propio espacio en el layout.\n *\n * `step.selector` = elemento ancla; `step.style.inlinePosition`\n * (`before`|`after`|`prepend`|`append`) = dónde insertarse. Single-step.\n */\nexport class InlineRenderer extends BaseRenderer {\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n const { host, root } = this.createHost();\n // createHost adjuntó el host a <body>; lo movemos al flujo del DOM, junto\n // al ancla. `display:block` vence el `:host{all:initial}` (que sería inline).\n host.style.display = 'block';\n const position = readInlinePosition(step.style);\n insertHost(anchor, host, position);\n // El framework del host puede borrar el nodo al re-renderizar → watchdog.\n this.registerCleanup(keepHostAttached(host, selector, position));\n\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const card = ownerDocument.createElement('div');\n card.className = 'veo-inline';\n\n const dismiss = (\n action: 'dismissed' | 'cta_clicked',\n ctaUrl?: string,\n meta?: GuideInteractionMetadata,\n ) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = buildStepContent(step, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n card.appendChild(content);\n root.appendChild(card);\n\n // Update in-place (preview): misma ancla/posición → solo cambia contenido.\n this.liveContainer = card;\n this.liveContent = content;\n this.liveKey = `${selector}|${position}`;\n this.liveBuild = (s) =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n\n protected override liveKeyOf(step: GuideStep): string {\n return `${step.selector ?? ''}|${readInlinePosition(step.style)}`;\n }\n}\n","import { buildStepContent } from '../block-builder';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\n\n/** `style.backdrop === false` = modal sin fondo oscuro (la app queda usable). */\nfunction overlayClassOf(step: GuideStep): string {\n return step.style?.backdrop === false\n ? 'veo-modal-overlay veo-modal-overlay--none'\n : 'veo-modal-overlay';\n}\n\n/**\n * Renderiza una guía de tipo `modal`: backdrop oscuro + tarjeta centrada.\n * Cierra al clickear el backdrop o presionar Escape.\n *\n * Con `style.backdrop === false` no hay fondo: el overlay es transparente y\n * deja pasar el mouse (solo la tarjeta es interactiva) — la modal se comporta\n * como una tarjeta flotante posicionable (posX/posY/width/height).\n *\n * Single-step normal: consume `guideSteps[0]`. Si el contexto trae `nav`\n * (paso de un walkthrough heterogéneo modal→banner→tooltip), consume\n * `guideSteps[nav.stepIndex]`, muestra botones de navegación y delega\n * tracking/avance al controller (backdrop/Esc → `nav.callbacks.onSkip`).\n */\nexport class ModalRenderer extends BaseRenderer {\n private overlay: HTMLElement | null = null;\n\n render(context: GuideRenderContext): void {\n const idx = context.nav?.stepIndex ?? 0;\n const step = context.guide.guideSteps[idx];\n if (!step) return;\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const overlay = ownerDocument.createElement('div');\n overlay.className = overlayClassOf(step);\n this.overlay = overlay;\n\n const card = ownerDocument.createElement('div');\n card.className = 'veo-modal-card';\n\n const dismiss = (\n action: 'dismissed' | 'cta_clicked',\n ctaUrl?: string,\n meta?: GuideInteractionMetadata,\n ) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: idx,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n // En modo navegación el cierre lo maneja el controller vía onSkip.\n const onBackdropOrEsc = (): void => {\n if (context.nav) context.nav.callbacks.onSkip();\n else dismiss('dismissed');\n };\n\n const content = context.nav\n ? buildWalkthroughStepContent(\n step,\n context.nav.stepIndex,\n context.nav.totalSteps,\n ownerDocument,\n context.nav.callbacks,\n )\n : buildStepContent(step, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n card.appendChild(content);\n overlay.appendChild(card);\n root.appendChild(overlay);\n\n // Update in-place (preview del editor) — solo en modo single-step.\n if (!context.nav) {\n this.liveContainer = card;\n this.liveContent = content;\n this.liveBuild = (s) =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n }\n\n overlay.addEventListener('click', (e) => {\n if (e.target === overlay) onBackdropOrEsc();\n });\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onBackdropOrEsc();\n };\n document.addEventListener('keydown', onKey);\n this.registerCleanup(() => document.removeEventListener('keydown', onKey));\n\n // El `shown` de un walkthrough lo emite el controller (step 0) / step_advanced.\n if (!context.nav) {\n context.onInteraction({ guideId: context.guide.guideId, stepIndex: 0, action: 'shown' });\n }\n }\n\n protected override onLiveUpdate(step: GuideStep): void {\n // El toggle de backdrop desde el editor aplica en vivo, sin remontar.\n if (this.overlay) this.overlay.className = overlayClassOf(step);\n }\n\n override destroy(): void {\n this.overlay = null;\n super.destroy();\n }\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { buildStepContent } from '../block-builder';\nimport type { GuideInteractionMetadata, GuideRenderContext, GuideStep } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\n/**\n * Renderiza una guía tipo `tooltip` anclada a un elemento del host.\n * Espera el ancla con MutationObserver (selector puede no existir aún\n * en SPAs), la posiciona con Floating UI y la re-posiciona en scroll\n * y resize.\n *\n * Si el ancla no aparece dentro del timeout, no muestra nada. Esto es\n * deliberado: las guías \"fantasma\" sin destino son peor UX que no\n * mostrar.\n */\nexport class TooltipRenderer extends BaseRenderer {\n /** Lado preferido (mutable: el update in-place puede cambiarlo). */\n private side: 'top' | 'bottom' | 'left' | 'right' = 'bottom';\n private reposition: (() => void) | null = null;\n\n async render(context: GuideRenderContext): Promise<void> {\n const step = context.guide.guideSteps[0];\n if (!step) return;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return;\n\n const anchor = await waitForElement(selector);\n if (!anchor) return;\n\n // Lado preferido del tooltip respecto al ancla (arriba/abajo/izq/der).\n // `flip()` igual lo reubica si no entra; default `bottom`.\n const rawSide = (step.style as Record<string, unknown> | null | undefined)?.tooltipPlacement;\n this.side = rawSide === 'top' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'bottom';\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-tooltip';\n\n const dismiss = (\n action: 'dismissed' | 'cta_clicked',\n ctaUrl?: string,\n meta?: GuideInteractionMetadata,\n ) => {\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action,\n ...(meta ? { metadata: meta } : {}),\n });\n if (ctaUrl) window.open(ctaUrl, '_blank', 'noopener,noreferrer');\n context.onClose();\n };\n\n const content = buildStepContent(step, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n tooltip.appendChild(content);\n\n // Caret que apunta al elemento anclado (se reposiciona junto al tooltip).\n const arrowEl = ownerDocument.createElement('div');\n arrowEl.className = 'veo-tooltip-arrow';\n tooltip.appendChild(arrowEl);\n\n root.appendChild(tooltip);\n\n const updatePosition = async (): Promise<void> => {\n const { x, y, placement, middlewareData } = await computePosition(anchor, tooltip, {\n placement: this.side,\n middleware: [offset(10), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n positionArrow(arrowEl, placement, middlewareData.arrow);\n };\n\n await updatePosition();\n\n const reposition = (): void => {\n void updatePosition();\n };\n this.reposition = reposition;\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.registerCleanup(() => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n });\n\n // Update in-place (preview del editor): mismo ancla → solo cambia contenido.\n this.liveContainer = tooltip;\n this.liveContent = content;\n this.liveKey = selector;\n this.liveBuild = (s) =>\n buildStepContent(s, ownerDocument, {\n onCtaClick: (action, target, meta) => {\n dismiss('cta_clicked', action === 'url' ? target : undefined, meta);\n if (action === 'guide' && target) context.onOpenGuide?.(target);\n },\n onDismiss: () => dismiss('dismissed'),\n });\n\n context.onInteraction({\n guideId: context.guide.guideId,\n stepIndex: 0,\n action: 'shown',\n });\n }\n\n protected override liveKeyOf(step: GuideStep): string {\n return step.selector ?? '';\n }\n\n protected override onLiveUpdate(step: GuideStep): void {\n const raw = (step.style as Record<string, unknown> | null | undefined)?.tooltipPlacement;\n this.side = raw === 'top' || raw === 'left' || raw === 'right' ? raw : 'bottom';\n this.reposition?.();\n }\n}\n","import { arrow, computePosition, flip, offset, shift } from '@floating-ui/dom';\nimport { WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS } from '../constants';\nimport type { ResolvedGuide, WalkthroughCallbacks } from '../types';\nimport { waitForElement } from '../wait-for-element';\nimport { buildWalkthroughStepContent } from '../walkthrough-block-builder';\nimport { BaseRenderer } from './base-renderer';\nimport { positionArrow } from './floating-arrow';\n\nexport interface WalkthroughRenderContext {\n guide: ResolvedGuide;\n currentStepIndex: number;\n callbacks: WalkthroughCallbacks;\n}\n\n/**\n * Renderiza UN step de un walkthrough — variante de tooltip con\n * navegación. Se destruye y re-crea por step en lugar de actualizar el\n * DOM en sitio: como cada step puede anclarse a un selector distinto,\n * recomputar todo es más simple y barato que tracking diffs.\n *\n * `render` retorna `boolean` (a diferencia de los demás renderers) para\n * señalar al controller si el ancla apareció a tiempo. Si devuelve\n * `false`, el controller cancela el walkthrough limpiamente.\n */\nexport class WalkthroughRenderer extends BaseRenderer<WalkthroughRenderContext, boolean> {\n async render(context: WalkthroughRenderContext): Promise<boolean> {\n const step = context.guide.guideSteps[context.currentStepIndex];\n if (!step) return false;\n\n const selector = step.selector ?? context.guide.activationRules.selector;\n if (typeof selector !== 'string' || selector.length === 0) return false;\n\n const anchor = await waitForElement(selector, WALKTHROUGH_STEP_SELECTOR_TIMEOUT_MS);\n if (!anchor) return false;\n\n const rawSide = (step.style as Record<string, unknown> | null | undefined)?.tooltipPlacement;\n const side: 'top' | 'bottom' | 'left' | 'right' =\n rawSide === 'top' || rawSide === 'left' || rawSide === 'right' ? rawSide : 'bottom';\n\n const { root } = this.createHost();\n this.applyDesign(step.style);\n const ownerDocument = root.ownerDocument ?? document;\n\n const tooltip = ownerDocument.createElement('div');\n tooltip.className = 'veo-walkthrough';\n\n const content = buildWalkthroughStepContent(\n step,\n context.currentStepIndex,\n context.guide.guideSteps.length,\n ownerDocument,\n context.callbacks,\n );\n tooltip.appendChild(content);\n\n // Caret que apunta al elemento anclado (se reposiciona junto al tooltip).\n const arrowEl = ownerDocument.createElement('div');\n arrowEl.className = 'veo-walkthrough-arrow';\n tooltip.appendChild(arrowEl);\n\n root.appendChild(tooltip);\n\n const updatePosition = async (): Promise<void> => {\n const { x, y, placement, middlewareData } = await computePosition(anchor, tooltip, {\n placement: side,\n middleware: [offset(10), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n tooltip.style.left = `${x}px`;\n tooltip.style.top = `${y}px`;\n positionArrow(arrowEl, placement, middlewareData.arrow);\n };\n\n await updatePosition();\n\n const reposition = (): void => {\n void updatePosition();\n };\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n this.registerCleanup(() => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n });\n\n return true;\n }\n}\n","/**\n * Modo preview de guías. Pinta una guía con los MISMOS renderers que el\n * runtime real, pero SIN resolver, cache de frecuencia, estado de\n * walkthrough ni tracking de interacciones. Pensado para el builder\n * no-code del dashboard: ver cómo queda una guía antes de publicarla.\n *\n * No requiere un `VeoClient` ni apiKey — es una función pura sobre el DOM.\n * Solo puede haber UNA preview activa a la vez; abrir otra cierra la\n * anterior (igual que el dashboard al cambiar de guía o de step).\n *\n * Diferencias de comportamiento vs. runtime real (deliberadas):\n * - Las interacciones NO se reportan al backend.\n * - `displayFrequency`/`activationRules` (url/trigger/delay) se ignoran:\n * la preview siempre pinta de inmediato. Solo se respeta el `selector`\n * del step (o el `activationRules.selector` como fallback) para anclar\n * tooltips/walkthroughs.\n * - CTA con `ctaAction: 'url'` sigue abriendo la URL en una pestaña nueva\n * (igual que en producción) para poder probar el enlace.\n */\nimport { hasDocument } from '../../utils/safe-env';\nimport { BadgeRenderer } from './renderers/badge-renderer';\nimport { BannerRenderer } from './renderers/banner-renderer';\nimport { BaseRenderer } from './renderers/base-renderer';\nimport { CompositeRenderer } from './renderers/composite-renderer';\nimport { CustomRenderer } from './renderers/custom-renderer';\nimport { FormRenderer } from './renderers/form-renderer';\nimport { InlineCustomRenderer } from './renderers/inline-custom-renderer';\nimport { InlineFormRenderer } from './renderers/inline-form-renderer';\nimport { InlineRenderer } from './renderers/inline-renderer';\nimport { ModalRenderer } from './renderers/modal-renderer';\nimport { TooltipRenderer } from './renderers/tooltip-renderer';\nimport { WalkthroughRenderer } from './renderers/walkthrough-renderer';\nimport type {\n ActivationRules,\n GuideInteractionEvent,\n GuideStep,\n GuideType,\n ResolvedGuide,\n WalkthroughCallbacks,\n} from './types';\n\n/** Entrada mínima para previsualizar una guía. */\nexport interface PreviewGuideInput {\n guideType: GuideType;\n guideSteps: GuideStep[];\n /**\n * Opcional. Solo se usa `activationRules.selector` como fallback del\n * ancla para tooltip/walkthrough cuando el step no trae su propio\n * `selector`. El resto de reglas (url/trigger/delay) se ignoran.\n */\n activationRules?: Partial<ActivationRules>;\n /** Nombre mostrado (p.ej. en el `title` del iframe de guías `custom`). */\n guideName?: string;\n /**\n * Solo walkthrough: paso inicial a mostrar (default 0). Lo usa el editor del\n * dashboard para que la preview salte al paso que se está editando.\n */\n startStepIndex?: number;\n /**\n * Solo guías form: envío REAL de respuestas. Sin esto, el submit en preview\n * es un no-op (no escribe props). Lo usa el modo preview-por-link, que sí\n * guarda en el usuario que responde.\n */\n formSubmit?: (answers: Record<string, unknown>) => Promise<boolean>;\n /** Nota bajo el \"¡Gracias!\" cuando hay `formSubmit` propio. */\n formSubmitNote?: string;\n}\n\n/** Resultado del primer render de una preview. */\nexport interface PreviewResult {\n /**\n * `false` cuando la guía no pudo pintarse — típicamente un\n * tooltip/walkthrough cuyo `selector` no existe en la página de preview.\n */\n rendered: boolean;\n}\n\n/** Handle de una preview activa. */\nexport interface PreviewHandle {\n /** Cierra y limpia la preview. Idempotente. */\n close(): void;\n /** Resuelve cuando el primer render terminó. */\n ready: Promise<PreviewResult>;\n /**\n * Host de la guía activa (o `null` si no hay nada montado). Lo usa el modo\n * builder para adjuntar la manipulación directa (drag/resize) del editor.\n */\n host(): HTMLElement | null;\n}\n\nconst PREVIEW_GUIDE_ID = '__veo_preview__';\n\n/**\n * Orquesta una única preview activa. A diferencia del `GuidesController`,\n * no toca queue, cache ni estado persistido: instancia el renderer y lo\n * monta directo, y maneja localmente la navegación de walkthroughs.\n */\nclass GuidePreviewController {\n private singleStep: BaseRenderer | null = null;\n /** Renderer del paso de walkthrough activo (walkthrough tooltip o modal/banner). */\n private walkthrough: { destroy(): void } | null = null;\n private walkthroughGuide: ResolvedGuide | null = null;\n private walkthroughIndex = 0;\n /** Input de la preview ACTIVA (para formSubmit/nota de forms). */\n private input: PreviewGuideInput | null = null;\n\n preview(input: PreviewGuideInput): PreviewHandle {\n // Update IN-PLACE: si el tipo no cambió y el renderer activo puede\n // actualizar su contenido (mismo ancla), evitamos remontar — el preview\n // del editor deja de parpadear en cada tecla.\n const nextStep = input.guideSteps[0];\n if (\n this.singleStep &&\n this.input &&\n input.guideType === this.input.guideType &&\n input.guideType !== 'walkthrough' &&\n nextStep &&\n this.singleStep.updateStep(nextStep)\n ) {\n this.input = input;\n return {\n close: () => this.close(),\n ready: Promise.resolve({ rendered: true }),\n host: () => this.activeHost(),\n };\n }\n\n this.close(); // solo una preview a la vez\n this.input = input;\n\n const guide = normalize(input);\n const start = typeof input.startStepIndex === 'number' ? input.startStepIndex : 0;\n // Composite: la preview muestra el PASO ACTIVO (el que se edita) como paso\n // único; el CompositeRenderer lee guideSteps[0].\n if (guide.guideType === 'composite') {\n const s = Math.min(Math.max(0, start), guide.guideSteps.length - 1);\n const active = guide.guideSteps[s];\n if (active) guide.guideSteps = [active];\n const ready = this.renderSingleStep(guide);\n return { close: () => this.close(), ready, host: () => this.activeHost() };\n }\n const ready =\n guide.guideType === 'walkthrough'\n ? this.startWalkthrough(guide, start)\n : this.renderSingleStep(guide);\n\n return { close: () => this.close(), ready, host: () => this.activeHost() };\n }\n\n /** Host de la guía montada (single-step o paso de walkthrough activo). */\n activeHost(): HTMLElement | null {\n if (this.singleStep) return this.singleStep.hostElement();\n if (this.walkthrough instanceof BaseRenderer) {\n return this.walkthrough.hostElement();\n }\n return null;\n }\n\n close(): void {\n if (this.singleStep) {\n safeDestroy(this.singleStep);\n this.singleStep = null;\n }\n if (this.walkthrough) {\n safeDestroy(this.walkthrough);\n this.walkthrough = null;\n }\n this.walkthroughGuide = null;\n this.walkthroughIndex = 0;\n this.input = null;\n }\n\n private async renderSingleStep(guide: ResolvedGuide): Promise<PreviewResult> {\n const renderer = createSingleStepRenderer(guide.guideType);\n if (!renderer) return { rendered: false };\n this.singleStep = renderer;\n\n // Los renderers single-step solo emiten `shown` tras montar con éxito\n // (tooltip/custom esperan a su ancla). Lo usamos como señal de render.\n let shown = false;\n try {\n await renderer.render({\n guide,\n onInteraction: (event: GuideInteractionEvent) => {\n if (event.action === 'shown') shown = true;\n },\n onClose: () => this.close(),\n onTrack: () => {},\n // Encadenado en preview: no-op — el editor no puede montar otra guía\n // guardada; el click igual cierra la preview actual (vía onCtaClick).\n onOpenGuide: () => {},\n // Preview de forms: por defecto simula el envío SIN escribir props;\n // el caller puede pasar `formSubmit` real (link de preview).\n onFormSubmit: this.input?.formSubmit ?? (() => Promise.resolve(true)),\n isPreview: true,\n ...(this.input?.formSubmit && this.input.formSubmitNote !== undefined\n ? { previewNote: this.input.formSubmitNote }\n : {}),\n });\n } catch {\n this.close();\n return { rendered: false };\n }\n\n // El usuario pudo haber cerrado/reemplazado la preview mientras el render\n // esperaba el ancla (los renderers async como inline/inline-custom hacen\n // `await waitForElement` ANTES de insertar su host). En ese caso este\n // renderer quedó HUÉRFANO: su host ya entró al DOM pero `singleStep` apunta\n // a otro, así que el `close()` que lo reemplazó no lo borró. Lo destruimos\n // aquí para no apilar copias fantasma (causa de la guía duplicada).\n if (this.singleStep !== renderer) {\n safeDestroy(renderer);\n return { rendered: false };\n }\n\n return { rendered: shown };\n }\n\n private async startWalkthrough(guide: ResolvedGuide, startIndex = 0): Promise<PreviewResult> {\n if (guide.guideSteps.length === 0) return { rendered: false };\n this.walkthroughGuide = guide;\n const idx = Math.min(Math.max(0, Math.floor(startIndex)), guide.guideSteps.length - 1);\n this.walkthroughIndex = idx;\n const rendered = await this.renderWalkthroughStep(idx);\n return { rendered };\n }\n\n private async renderWalkthroughStep(index: number): Promise<boolean> {\n const guide = this.walkthroughGuide;\n if (!guide) return false;\n\n if (this.walkthrough) {\n safeDestroy(this.walkthrough);\n this.walkthrough = null;\n }\n\n const callbacks: WalkthroughCallbacks = {\n onNext: () => {\n const next = this.walkthroughIndex + 1;\n if (next >= guide.guideSteps.length) {\n this.close();\n return;\n }\n this.walkthroughIndex = next;\n void this.renderWalkthroughStep(next);\n },\n onBack: () => {\n const prev = this.walkthroughIndex - 1;\n if (prev < 0) return;\n this.walkthroughIndex = prev;\n void this.renderWalkthroughStep(prev);\n },\n onSkip: () => this.close(),\n onComplete: () => this.close(),\n };\n\n // Walkthrough heterogéneo: el paso puede pedir modal/banner (con navegación).\n const step = guide.guideSteps[index];\n const render = (step?.style as Record<string, unknown> | null | undefined)?.render;\n if (render === 'modal' || render === 'banner') {\n const renderer = render === 'modal' ? new ModalRenderer() : new BannerRenderer();\n try {\n renderer.render({\n guide,\n onInteraction: () => {},\n onClose: () => this.close(),\n nav: { stepIndex: index, totalSteps: guide.guideSteps.length, callbacks },\n });\n } catch {\n safeDestroy(renderer);\n return false;\n }\n if (this.walkthroughGuide !== guide) {\n safeDestroy(renderer);\n return false;\n }\n this.walkthrough = renderer;\n return true;\n }\n\n const renderer = new WalkthroughRenderer();\n let success = false;\n try {\n success = await renderer.render({ guide, currentStepIndex: index, callbacks });\n } catch {\n success = false;\n }\n\n // Misma carrera que en single-step: si otra preview reemplazó esta\n // mientras esperábamos, no adoptamos el renderer (sería huérfano).\n if (!success || this.walkthroughGuide !== guide) {\n safeDestroy(renderer);\n return false;\n }\n this.walkthrough = renderer;\n return true;\n }\n}\n\nlet activeController: GuidePreviewController | null = null;\n\n/**\n * Previsualiza una guía en la página actual usando los renderers reales\n * del SDK. Devuelve un handle con `close()` y una promesa `ready`.\n *\n * Pensado para el builder no-code: no necesita `init()` ni apiKey. Abrir\n * una nueva preview cierra automáticamente la anterior.\n *\n * @example\n * ```ts\n * import { previewGuide } from '@veo/sdk';\n *\n * const preview = previewGuide({\n * guideType: 'modal',\n * guideSteps: [{ title: 'Hola', content: 'Esto es una preview' }],\n * });\n * const { rendered } = await preview.ready;\n * // ...más tarde:\n * preview.close();\n * ```\n */\nexport function previewGuide(input: PreviewGuideInput): PreviewHandle {\n if (!hasDocument()) {\n return { close: () => {}, ready: Promise.resolve({ rendered: false }), host: () => null };\n }\n if (!activeController) activeController = new GuidePreviewController();\n return activeController.preview(input);\n}\n\n/** Cierra la preview activa, si la hay. Idempotente. */\nexport function closeGuidePreview(): void {\n activeController?.close();\n}\n\n/** Construye un `ResolvedGuide` sintético con defaults inocuos para preview. */\nfunction normalize(input: PreviewGuideInput): ResolvedGuide {\n const selector = input.activationRules?.selector;\n const activationRules: ActivationRules = {\n url: input.activationRules?.url ?? { type: 'prefix', pattern: '/' },\n trigger: 'immediate',\n ...(selector !== undefined ? { selector } : {}),\n };\n\n return {\n guideId: PREVIEW_GUIDE_ID,\n guideName: input.guideName ?? 'Preview',\n guideType: input.guideType,\n guideSteps: input.guideSteps,\n activationRules,\n displayFrequency: 'always',\n displayPriority: 0,\n };\n}\n\nfunction createSingleStepRenderer(type: GuideType): BaseRenderer | null {\n switch (type) {\n case 'modal':\n return new ModalRenderer();\n case 'banner':\n return new BannerRenderer();\n case 'tooltip':\n return new TooltipRenderer();\n case 'custom':\n return new CustomRenderer();\n case 'inline':\n return new InlineRenderer();\n case 'inline-custom':\n return new InlineCustomRenderer();\n case 'form':\n return new FormRenderer();\n case 'inline-form':\n return new InlineFormRenderer();\n case 'badge':\n return new BadgeRenderer();\n case 'composite':\n return new CompositeRenderer();\n case 'walkthrough':\n return null;\n default:\n return null;\n }\n}\n\nfunction safeDestroy(renderer: { destroy(): void }): void {\n try {\n renderer.destroy();\n } catch {\n // swallow — un cleanup roto no debe romper la preview.\n }\n}\n","/**\n * Drop-target de bloques sobre la preview (editor in-app).\n *\n * El autor arrastra un bloque de la paleta del panel (iframe del dashboard) y\n * lo suelta SOBRE la guía pintada en la app. El drag & drop HTML5 cruza\n * iframes de forma nativa, así que acá solo escuchamos `dragover`/`drop` en el\n * host de la guía, mostramos una línea de inserción entre bloques y avisamos\n * dónde cayó (el panel inserta el bloque en su estado y re-previsualiza).\n *\n * Contrato con el panel: el MIME `application/x-veo-block`. El `dragstart` de\n * la paleta lo setea con el tipo de bloque; durante `dragover` solo los TYPES\n * del dataTransfer son visibles (el valor recién se puede leer en el `drop`) —\n * alcanza para filtrar drags ajenos.\n *\n * La posición se expresa como `beforeIndex`: índice del bloque del paso ANTES\n * del cual insertar (`null` = al final). Los renderers estampan\n * `data-veo-idx` en cada elemento top-level con el índice ORIGINAL dentro de\n * `step.blocks[]` (una fila de botones agrupados lleva el del primero), así el\n * índice sobrevive a bloques filtrados u ocultos (p.ej. botones en pasos de\n * tour).\n */\n\nexport const VEO_BLOCK_MIME = 'application/x-veo-block';\n\n/** Dónde soltó el autor un bloque nuevo. */\nexport interface BlockDropPayload {\n stepIndex: number;\n /** Tipo de bloque arrastrado (title/text/button/image — lo valida el panel). */\n blockType: string;\n /** Índice del bloque ANTES del cual insertar; `null` = al final. */\n beforeIndex: number | null;\n}\n\nexport interface BlockDropTargetHandle {\n /**\n * Drag por POINTER (el camino principal): el panel manda las coordenadas del\n * puntero ya convertidas a la página de la app. Muestra/mueve la línea de\n * inserción; devuelve `true` si el punto está sobre la guía.\n */\n hoverAt(x: number, y: number): boolean;\n /**\n * Suelta en esas coordenadas: devuelve el punto de inserción, o `null` si el\n * puntero no estaba sobre la guía (el drop se descarta). Siempre borra la línea.\n */\n dropAt(x: number, y: number): { beforeIndex: number | null } | null;\n /** Cancela el hover (borra la línea sin soltar). */\n cancelHover(): void;\n detach(): void;\n}\n\ninterface AttachOptions {\n host: HTMLElement;\n stepIndex: number;\n onDrop: (payload: BlockDropPayload) => void;\n}\n\n/** Punto de inserción calculado bajo el cursor. */\ninterface DropSpot {\n beforeIndex: number | null;\n /** Coordenada Y (viewport) de la línea indicadora. */\n y: number;\n rect: DOMRect;\n}\n\n/**\n * Adjunta el drop-target al host de la guía en preview. Devuelve un handle\n * para desmontarlo (cambio de preview / cierre del editor).\n */\nexport function attachBlockDropTarget(options: AttachOptions): BlockDropTargetHandle {\n const { host, stepIndex, onDrop } = options;\n const doc = host.ownerDocument;\n let line: HTMLElement | null = null;\n let spot: DropSpot | null = null;\n\n const contentEl = (): HTMLElement | null =>\n host.shadowRoot?.querySelector<HTMLElement>('.veo-guide-content') ?? null;\n\n /** Hijos top-level que representan bloques (estampados por los renderers). */\n const blockChildren = (container: HTMLElement): HTMLElement[] =>\n Array.from(container.children).filter(\n (el): el is HTMLElement => el instanceof HTMLElement && el.dataset.veoIdx !== undefined,\n );\n\n const hideLine = (): void => {\n line?.remove();\n line = null;\n spot = null;\n };\n\n const showLine = (at: DropSpot): void => {\n if (!line) {\n line = doc.createElement('div');\n // Inline (no hay hoja de estilos del builder en el shadow de la guía).\n line.style.cssText =\n 'position:fixed;height:3px;border-radius:2px;background:#FF5B35;' +\n 'box-shadow:0 0 0 1px rgba(255,255,255,0.65);pointer-events:none;z-index:2147483647;';\n host.shadowRoot?.appendChild(line);\n }\n line.style.left = `${at.rect.left + 4}px`;\n line.style.width = `${Math.max(0, at.rect.width - 8)}px`;\n line.style.top = `${at.y - 1.5}px`;\n };\n\n const isBlockDrag = (event: DragEvent): boolean => {\n const types = event.dataTransfer?.types;\n return !!types && Array.from(types).includes(VEO_BLOCK_MIME);\n };\n\n /** Margen alrededor del contenido dentro del cual el drop sigue activo. */\n const NEAR_PX = 48;\n\n /** Boundary de inserción más cercano al cursor (por el eje Y). */\n const locate = (clientY: number): DropSpot | null => {\n const container = contentEl();\n if (!container) return null;\n const rect = container.getBoundingClientRect();\n const kids = blockChildren(container);\n let beforeIndex: number | null = null;\n let y = kids.length === 0 ? rect.top + rect.height / 2 : 0;\n for (const kid of kids) {\n const r = kid.getBoundingClientRect();\n if (clientY < r.top + r.height / 2) {\n const idx = Number(kid.dataset.veoIdx);\n beforeIndex = Number.isFinite(idx) ? idx : null;\n y = r.top;\n break;\n }\n y = r.bottom; // el cursor quedó debajo: candidato \"después del último\"\n }\n return { beforeIndex, y, rect };\n };\n\n /** ¿El punto está sobre (o cerca de) el contenido de la guía? */\n const overContent = (x: number, y: number, rect: DOMRect): boolean =>\n x >= rect.left - NEAR_PX &&\n x <= rect.right + NEAR_PX &&\n y >= rect.top - NEAR_PX &&\n y <= rect.bottom + NEAR_PX;\n\n const hoverAt = (x: number, y: number): boolean => {\n const at = locate(y);\n if (!at || !overContent(x, y, at.rect)) {\n hideLine();\n return false;\n }\n spot = at;\n showLine(at);\n return true;\n };\n\n const dropAt = (x: number, y: number): { beforeIndex: number | null } | null => {\n const at = locate(y);\n hideLine();\n if (!at || !overContent(x, y, at.rect)) return null;\n return { beforeIndex: at.beforeIndex };\n };\n\n const onDragOver = (event: DragEvent): void => {\n if (!isBlockDrag(event)) return;\n const at = locate(event.clientY);\n if (!at) return;\n event.preventDefault(); // habilita el drop\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n spot = at;\n showLine(at);\n };\n\n const onDropEvent = (event: DragEvent): void => {\n if (!isBlockDrag(event)) return;\n event.preventDefault();\n const blockType = event.dataTransfer?.getData(VEO_BLOCK_MIME) ?? '';\n const at = spot ?? locate(event.clientY);\n hideLine();\n if (!blockType || !at) return;\n onDrop({ stepIndex, blockType, beforeIndex: at.beforeIndex });\n };\n\n const onDragLeave = (event: DragEvent): void => {\n // Solo al salir del host de verdad (los cruces internos del shadow se\n // re-targetean al host y no llegan acá).\n const to = event.relatedTarget;\n if (to instanceof Node && (to === host || host.contains(to))) return;\n hideLine();\n };\n\n host.addEventListener('dragover', onDragOver);\n host.addEventListener('drop', onDropEvent);\n host.addEventListener('dragleave', onDragLeave);\n\n return {\n hoverAt,\n dropAt,\n cancelHover: hideLine,\n detach(): void {\n host.removeEventListener('dragover', onDragOver);\n host.removeEventListener('drop', onDropEvent);\n host.removeEventListener('dragleave', onDragLeave);\n hideLine();\n },\n };\n}\n","/**\n * Contrato de mensajes del puente builder (app del cliente ↔ dashboard).\n * Ambos lados validan `event.origin` y que `token` coincida antes de actuar.\n *\n * Flujo:\n * 1. El dashboard abre la app con `?veoBuilder=<token>&veoBuilderOrigin=<origen>`.\n * 2. La app (veo-builder.js) postea `ready` a la ventana que la abrió.\n * 3. El dashboard manda comandos (`start-picker`, `preview`, …).\n * 4. La app responde con eventos (`picked`, `pick-cancelled`, …).\n */\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport type { BlockDropPayload } from './block-drop-target';\nimport type { DesignPatch } from './design-manipulator';\nimport type { PickedElement } from './element-picker';\n\nexport const VEO_BUILDER_SOURCE = 'veo-builder';\n// Los nombres de los query params viven en el core (`builder-token.ts`), única\n// fuente de verdad compartida con el loader y el gate del runtime de guías.\nexport { BUILDER_ORIGIN_PARAM, BUILDER_TOKEN_PARAM } from '../../core/builder-token';\n\n/** Eventos que la app del cliente envía al dashboard. */\nexport type BuilderEvent =\n | { type: 'ready' }\n | { type: 'picked'; payload: PickedElement }\n | { type: 'pick-cancelled' }\n // Manipulación directa: el autor arrastró/redimensionó la guía en la app;\n // el panel mergea `payload.style` sobre el `style` del paso indicado.\n | { type: 'design-updated'; payload: DesignPatch }\n // Drag & drop de bloques: el autor soltó un bloque de la paleta SOBRE la\n // guía en preview; el panel lo inserta en `step.blocks[]` en esa posición.\n | { type: 'block-dropped'; payload: BlockDropPayload }\n | { type: 'closed' };\n\n/** Comandos que el dashboard/panel envía a la app del cliente. */\nexport type BuilderCommand =\n | { type: 'start-picker'; maxAncestors?: number; hint?: string }\n | { type: 'stop-picker' }\n // `editable: true` (editor in-app) adjunta drag/resize sobre la preview.\n | { type: 'preview'; guide: PreviewGuideInput; editable?: boolean }\n // Drag de un bloque de la paleta POR POINTER (el DnD HTML5 no cruza bien el\n // iframe del panel): el panel captura el puntero y streamea sus coordenadas\n // RELATIVAS AL IFRAME; la app las convierte con el rect del panel, mueve la\n // línea de inserción y en `drop` responde con el evento `block-dropped`.\n | {\n type: 'block-drag';\n phase: 'move' | 'drop' | 'cancel';\n x: number;\n y: number;\n blockType: string;\n label?: string;\n }\n | { type: 'close-preview' }\n | { type: 'teardown' }\n // Modo panel inyectado: el panel avisa que cargó y está listo para recibir\n // eventos; la app responde con `ready`. Resuelve la carrera de que el iframe\n // del panel todavía no tenga su listener cuando la app postea `ready`.\n | { type: 'panel-ready' };\n\n/** Sobre común: todo mensaje del puente lleva `source` + `token`. */\nexport interface BuilderEnvelope {\n source: typeof VEO_BUILDER_SOURCE;\n token: string;\n}\n\nexport type BuilderEventMessage = BuilderEnvelope & BuilderEvent;\nexport type BuilderCommandMessage = BuilderEnvelope & BuilderCommand;\n","/**\n * Modo \"panel inyectado\" (editor en la pestaña de la app).\n *\n * La app es la pestaña top-level (login real) y el editor de Veo se inyecta\n * ENCIMA como una tarjeta flotante **arrastrable y redimensionable** (un iframe\n * al dashboard). Además se puede **sacar a una ventana independiente** del\n * navegador (\"pop-out\").\n *\n * El panel corre en el origen del dashboard (sesión de Veo para guardar guías) y\n * habla con la app (`window.parent` si está anclado, `window.opener` si está en\n * ventana aparte) por el puente postMessage. Este módulo inyecta/gestiona el\n * panel y expone su ventana destino.\n */\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\n\nconst DEFAULT_PANEL_PATH = '/guides/design';\nconst PANEL_W = 400;\nconst PANEL_H = 640;\nconst MIN_W = 320;\nconst MIN_H = 320;\nconst MARGIN = 16;\n\nexport interface BuilderPanelOptions {\n dashboardOrigin: string;\n token: string;\n appOrigin: string;\n guide: string | null;\n panelPath: string | null;\n onClose: () => void;\n}\n\nexport interface BuilderPanelHandle {\n /** Ventana destino de los mensajes: el iframe anclado o la ventana pop-out. */\n target(): Window | null;\n /**\n * Rect del IFRAME del panel en coordenadas de la página de la app, o `null`\n * si el editor está en pop-out (ventana aparte: no hay mapeo de coordenadas).\n * Lo usa el drag de bloques para convertir el puntero panel → página.\n */\n frameRect(): DOMRect | null;\n /** Quita el panel del DOM (y cierra la ventana pop-out si hay). */\n teardown(): void;\n}\n\n/** Inyecta el panel del editor (arrastrable, redimensionable, pop-out). */\nexport function injectBuilderPanel(opts: BuilderPanelOptions): BuilderPanelHandle {\n if (!hasWindow() || !hasDocument()) {\n return { target: () => null, frameRect: () => null, teardown: () => {} };\n }\n\n const panelUrl = buildPanelUrl(opts);\n\n const host = document.createElement('div');\n host.setAttribute('data-veo-builder-panel', '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = PANEL_CSS;\n\n const card = document.createElement('div');\n card.className = 'veo-panel';\n let left = Math.max(MARGIN, window.innerWidth - PANEL_W - MARGIN);\n let top = MARGIN;\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n card.style.width = `${PANEL_W}px`;\n card.style.height = `${PANEL_H}px`;\n\n // Header: título + pop-out + cerrar.\n const header = document.createElement('div');\n header.className = 'veo-panel-header';\n const title = document.createElement('span');\n title.className = 'veo-panel-title';\n title.textContent = 'OnUser · Editor';\n const actions = document.createElement('div');\n actions.className = 'veo-panel-actions';\n const popout = document.createElement('button');\n popout.className = 'veo-panel-btn';\n popout.type = 'button';\n popout.title = 'Abrir en ventana aparte';\n popout.setAttribute('aria-label', 'Abrir en ventana aparte');\n popout.textContent = '⧉';\n const close = document.createElement('button');\n close.className = 'veo-panel-btn veo-panel-close';\n close.type = 'button';\n close.title = 'Cerrar';\n close.setAttribute('aria-label', 'Cerrar');\n close.textContent = '✕';\n actions.append(popout, close);\n header.append(title, actions);\n\n const iframe = document.createElement('iframe');\n iframe.className = 'veo-panel-frame';\n iframe.title = 'Editor de Veo';\n iframe.src = panelUrl;\n\n const grip = document.createElement('div');\n grip.className = 'veo-panel-resize';\n grip.setAttribute('aria-hidden', 'true');\n\n card.append(header, iframe, grip);\n shadow.append(style, card);\n document.body.appendChild(host);\n\n // ── Pop-out: sacar el editor a una ventana independiente ────────────────\n let popped: Window | null = null;\n let pollTimer: ReturnType<typeof setInterval> | undefined;\n\n const stopPoll = (): void => {\n if (pollTimer !== undefined) {\n clearInterval(pollTimer);\n pollTimer = undefined;\n }\n };\n\n close.addEventListener('click', () => opts.onClose());\n popout.addEventListener('click', () => {\n const win = window.open(\n panelUrl,\n 'veo-editor',\n `popup,width=${Math.round(card.offsetWidth)},height=${Math.round(card.offsetHeight) + 60}`,\n );\n if (!win) return; // bloqueado por el navegador\n popped = win;\n card.style.display = 'none'; // el editor ahora vive en la ventana aparte\n pollTimer = setInterval(() => {\n if (popped?.closed) {\n stopPoll();\n opts.onClose(); // cerrar la ventana = salir del modo editor\n }\n }, 600);\n });\n\n // ── Arrastre por el header ──────────────────────────────────────────────\n header.addEventListener('mousedown', (e) => {\n if ((e.target as HTMLElement)?.classList.contains('veo-panel-btn')) return;\n e.preventDefault();\n const sx = e.clientX;\n const sy = e.clientY;\n const ol = left;\n const ot = top;\n iframe.style.pointerEvents = 'none';\n const move = (ev: MouseEvent): void => {\n left = clamp(ol + (ev.clientX - sx), 0, Math.max(0, window.innerWidth - card.offsetWidth));\n top = clamp(ot + (ev.clientY - sy), 0, Math.max(0, window.innerHeight - 40));\n card.style.left = `${left}px`;\n card.style.top = `${top}px`;\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n iframe.style.pointerEvents = '';\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n });\n\n // ── Redimensionar por el grip (esquina inferior derecha) ────────────────\n grip.addEventListener('mousedown', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const sx = e.clientX;\n const sy = e.clientY;\n const sw = card.offsetWidth;\n const sh = card.offsetHeight;\n iframe.style.pointerEvents = 'none';\n const move = (ev: MouseEvent): void => {\n card.style.width = `${clamp(sw + (ev.clientX - sx), MIN_W, window.innerWidth)}px`;\n card.style.height = `${clamp(sh + (ev.clientY - sy), MIN_H, window.innerHeight)}px`;\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n iframe.style.pointerEvents = '';\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n });\n\n return {\n target: () => (popped && !popped.closed ? popped : iframe.contentWindow),\n frameRect: () => (popped && !popped.closed ? null : iframe.getBoundingClientRect()),\n teardown: () => {\n stopPoll();\n if (popped && !popped.closed) popped.close();\n host.remove();\n },\n };\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction buildPanelUrl(opts: BuilderPanelOptions): string {\n const path = opts.panelPath ?? DEFAULT_PANEL_PATH;\n const url = new URL(path, opts.dashboardOrigin);\n url.searchParams.set('veoToken', opts.token);\n url.searchParams.set('veoApp', opts.appOrigin);\n if (opts.guide) url.searchParams.set('veoGuide', opts.guide);\n return url.toString();\n}\n\nconst PANEL_CSS = `\n:host { all: initial; }\n.veo-panel {\n position: fixed;\n min-width: ${MIN_W}px; min-height: ${MIN_H}px;\n max-width: 96vw; max-height: 94vh;\n display: flex; flex-direction: column;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 12px 40px rgba(0,0,0,0.28);\n overflow: hidden;\n z-index: 2147483647;\n font-family: system-ui, -apple-system, sans-serif;\n}\n.veo-panel-header {\n flex: 0 0 auto;\n display: flex; align-items: center; justify-content: space-between;\n padding: 8px 10px 8px 12px;\n background: #1b1714; color: #f7f1eb;\n font-size: 13px; font-weight: 600;\n cursor: grab;\n}\n.veo-panel-header:active { cursor: grabbing; }\n.veo-panel-actions { display: flex; gap: 2px; }\n.veo-panel-btn {\n border: 0; background: transparent; color: #fff;\n font-size: 14px; cursor: pointer; line-height: 1;\n padding: 4px 7px; border-radius: 6px;\n}\n.veo-panel-btn:hover { background: rgba(255,255,255,0.15); }\n.veo-panel-frame { flex: 1 1 auto; width: 100%; border: 0; background: #fff; }\n.veo-panel-resize {\n position: absolute; right: 0; bottom: 0;\n width: 16px; height: 16px;\n cursor: nwse-resize;\n background:\n linear-gradient(135deg, transparent 50%, rgba(0,0,0,0.25) 50%, rgba(0,0,0,0.25) 60%,\n transparent 60%, transparent 72%, rgba(0,0,0,0.25) 72%, rgba(0,0,0,0.25) 82%, transparent 82%);\n}\n`;\n","/**\n * Manipulación DIRECTA del diseño en modo editor: arrastrar la tarjeta de una\n * modal para posicionarla, redimensionarla desde bordes/esquinas, y arrastrar\n * un banner para alternar top/bottom. Vive en el bundle builder (veo-builder.js)\n * — el runtime de guías no carga nada de esto.\n *\n * Funciona como DECORATOR: se adjunta DESPUÉS del render sobre el shadow root\n * abierto del host de la guía (no toca los renderers). Durante el gesto aplica\n * las variables CSS localmente (feedback a 60fps, sin postMessage); al soltar\n * (`pointerup`) emite UN `onCommit(patch)` con los valores finales, que el\n * builder-mode postea al panel como `design-updated`. El panel actualiza su\n * estado y re-manda `preview` — que entra por el update in-place con las\n * MISMAS variables → no hay loop ni parpadeo.\n *\n * Geometría del modal (ver styles.ts): la card usa `left: posX%` +\n * `translate(-posX%)`, o sea `cardLeft = posX * (viewportW - cardW)` →\n * `posX = cardLeft / (viewportW - cardW)`. Mismo modelo que serializa el\n * dashboard (`style.posX/posY` en 0..1) y consume `applyDesignVars`.\n */\nimport type { GuideType } from '../guides/types';\n\n/** Merge superficial sobre `step.style` del paso activo (lo aplica el panel). */\nexport interface DesignPatch {\n stepIndex: number;\n style: {\n posX?: number;\n posY?: number;\n width?: number;\n height?: number;\n position?: 'top' | 'bottom';\n };\n}\n\nexport interface DesignManipulatorOptions {\n /** Host de la guía (de `PreviewHandle.host()`), con shadow root abierto. */\n host: HTMLElement;\n guideType: GuideType;\n stepIndex: number;\n /** Se emite UNA vez por gesto, al soltar. */\n onCommit: (patch: DesignPatch) => void;\n /** Fin de cualquier gesto (con o sin cambios). Para aplicar previews encolados. */\n onGestureEnd?: () => void;\n}\n\nexport interface DesignManipulatorHandle {\n /** `true` mientras hay un gesto de drag/resize en curso. */\n isDragging(): boolean;\n /** Remueve handles, estilos y listeners. Idempotente. */\n detach(): void;\n}\n\nconst MIN_W = 220;\nconst MAX_W = 720;\nconst MIN_H = 120;\nconst MAX_H = 900;\n/** Zonas de agarre de los bordes (px). */\nconst EDGE = 8;\n\ntype ResizeDir = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\nconst RESIZE_DIRS: ResizeDir[] = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\n\nconst MANIPULATOR_CSS = `\n.veo-mnp-card {\n outline: 1.5px dashed rgba(255, 91, 53, 0.75);\n outline-offset: 2px;\n}\n.veo-mnp-card:hover { cursor: move; }\n.veo-mnp-handle {\n position: absolute;\n z-index: 10;\n background: transparent;\n}\n.veo-mnp-handle::after {\n content: '';\n position: absolute;\n width: 8px; height: 8px;\n background: #fff;\n border: 1.5px solid rgba(255, 91, 53, 0.9);\n border-radius: 2px;\n top: 50%; left: 50%;\n transform: translate(-50%, -50%);\n opacity: 0;\n transition: opacity 100ms ease;\n}\n.veo-mnp-card:hover .veo-mnp-handle::after,\n.veo-mnp-handle:hover::after { opacity: 1; }\n.veo-mnp-n { top: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-s { bottom: -${EDGE / 2}px; left: ${EDGE}px; right: ${EDGE}px; height: ${EDGE}px; cursor: ns-resize; }\n.veo-mnp-e { right: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-w { left: -${EDGE / 2}px; top: ${EDGE}px; bottom: ${EDGE}px; width: ${EDGE}px; cursor: ew-resize; }\n.veo-mnp-ne { top: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-nw { top: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-se { bottom: -${EDGE / 2}px; right: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nwse-resize; }\n.veo-mnp-sw { bottom: -${EDGE / 2}px; left: -${EDGE / 2}px; width: ${EDGE * 1.5}px; height: ${EDGE * 1.5}px; cursor: nesw-resize; }\n.veo-mnp-banner { outline: 1.5px dashed rgba(255, 91, 53, 0.75); outline-offset: -2px; cursor: grab; }\n.veo-mnp-banner:active { cursor: grabbing; }\n`;\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction round3(v: number): number {\n return Math.round(v * 1000) / 1000;\n}\n\n/** true si el mousedown cayó sobre algo interactivo (no iniciar drag ahí). */\nfunction isInteractive(target: EventTarget | null): boolean {\n return Boolean(\n target instanceof Element && target.closest('button, a, input, textarea, select, label'),\n );\n}\n\n/**\n * Adjunta la manipulación directa al host de una guía montada. Devuelve el\n * handle, o `null` si el tipo de guía no la soporta o el DOM esperado no está.\n * Idempotente: si la card ya está decorada, no re-adjunta.\n */\nexport function attachDesignManipulator(\n opts: DesignManipulatorOptions,\n): DesignManipulatorHandle | null {\n const shadow = opts.host.shadowRoot;\n if (!shadow) return null;\n\n const card = shadow.querySelector<HTMLElement>('.veo-modal-card');\n if (card) return attachModal(opts, shadow, card);\n\n const banner = shadow.querySelector<HTMLElement>('.veo-banner');\n // El banner embebido se posiciona con prepend/append en el contenedor: su\n // top/bottom se cambia desde el panel (remonta). Solo el fijo se arrastra.\n if (banner && !banner.classList.contains('veo-banner-embedded')) {\n return attachBanner(opts, shadow, banner);\n }\n\n return null;\n}\n\n// ── Modal: drag libre + resize por 8 handles ────────────────────────────────\n\nfunction attachModal(\n opts: DesignManipulatorOptions,\n shadow: ShadowRoot,\n card: HTMLElement,\n): DesignManipulatorHandle | null {\n if (card.dataset.veoManipulated === '1') return null;\n card.dataset.veoManipulated = '1';\n card.classList.add('veo-mnp-card');\n\n const doc = card.ownerDocument;\n const style = doc.createElement('style');\n style.textContent = MANIPULATOR_CSS;\n shadow.appendChild(style);\n\n const handles: HTMLElement[] = [];\n for (const dir of RESIZE_DIRS) {\n const h = doc.createElement('div');\n h.className = `veo-mnp-handle veo-mnp-${dir}`;\n h.dataset.veoDir = dir;\n card.appendChild(h);\n handles.push(h);\n }\n\n let dragging = false;\n let detached = false;\n\n /** Últimos valores aplicados durante el gesto (para el commit del up). */\n let patch: DesignPatch['style'] = {};\n\n const setVars = (v: { px?: number; py?: number; w?: number; h?: number }): void => {\n const host = opts.host;\n if (v.px !== undefined) host.style.setProperty('--veo-pos-x', `${v.px * 100}%`);\n if (v.py !== undefined) host.style.setProperty('--veo-pos-y', `${v.py * 100}%`);\n if (v.w !== undefined) host.style.setProperty('--veo-width', `${v.w}px`);\n if (v.h !== undefined) host.style.setProperty('--veo-min-h', `${v.h}px`);\n };\n\n /**\n * Un gesto genérico: guarda el rect inicial, traduce cada mousemove a\n * variables CSS (rAF-throttled) y al soltar emite el commit acumulado.\n */\n const startGesture = (\n e: MouseEvent,\n apply: (dx: number, dy: number, start: DOMRect) => DesignPatch['style'],\n ): void => {\n e.preventDefault();\n e.stopPropagation();\n dragging = true;\n patch = {};\n const start = card.getBoundingClientRect();\n const sx = e.clientX;\n const sy = e.clientY;\n let raf = 0;\n let lastEv: MouseEvent | null = null;\n\n const flush = (): void => {\n raf = 0;\n if (!lastEv) return;\n const next = apply(lastEv.clientX - sx, lastEv.clientY - sy, start);\n patch = { ...patch, ...next };\n setVars({\n ...(next.posX !== undefined ? { px: next.posX } : {}),\n ...(next.posY !== undefined ? { py: next.posY } : {}),\n ...(next.width !== undefined ? { w: next.width } : {}),\n ...(next.height !== undefined ? { h: next.height } : {}),\n });\n };\n\n const move = (ev: MouseEvent): void => {\n lastEv = ev;\n // rAF-throttle del feedback; fallback síncrono si el entorno no tiene rAF.\n if (typeof window.requestAnimationFrame !== 'function') flush();\n else if (!raf) raf = window.requestAnimationFrame(flush);\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n if (raf) window.cancelAnimationFrame(raf);\n flush();\n dragging = false;\n if (Object.keys(patch).length > 0 && !detached) {\n opts.onCommit({ stepIndex: opts.stepIndex, style: patch });\n }\n opts.onGestureEnd?.();\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n };\n\n /** posX para que el borde izquierdo quede en `left` con ancho `w`. */\n const posXFor = (left: number, w: number): number => {\n const span = window.innerWidth - w;\n return span <= 0 ? 0.5 : round3(clamp(left / span, 0, 1));\n };\n const posYFor = (top: number, h: number): number => {\n const span = window.innerHeight - h;\n return span <= 0 ? 0.5 : round3(clamp(top / span, 0, 1));\n };\n\n const onCardDown = (e: MouseEvent): void => {\n if (isInteractive(e.target)) return;\n if (e.target instanceof Element && e.target.closest('.veo-mnp-handle')) return;\n startGesture(e, (dx, dy, start) => ({\n posX: posXFor(start.left + dx, start.width),\n posY: posYFor(start.top + dy, start.height),\n }));\n };\n\n const onHandleDown = (e: MouseEvent): void => {\n const dir = (e.currentTarget as HTMLElement).dataset.veoDir as ResizeDir;\n startGesture(e, (dx, dy, start) => {\n const out: DesignPatch['style'] = {};\n if (dir.includes('e')) out.width = Math.round(clamp(start.width + dx, MIN_W, MAX_W));\n if (dir.includes('w')) {\n out.width = Math.round(clamp(start.width - dx, MIN_W, MAX_W));\n // El borde derecho queda fijo: la card se re-ancla donde corresponde.\n out.posX = posXFor(start.right - out.width, out.width);\n }\n if (dir.includes('s')) out.height = Math.round(clamp(start.height + dy, MIN_H, MAX_H));\n if (dir.includes('n')) {\n out.height = Math.round(clamp(start.height - dy, MIN_H, MAX_H));\n out.posY = posYFor(start.bottom - out.height, out.height);\n }\n return out;\n });\n };\n\n card.addEventListener('mousedown', onCardDown);\n for (const h of handles) h.addEventListener('mousedown', onHandleDown);\n\n return {\n isDragging: () => dragging,\n detach: () => {\n if (detached) return;\n detached = true;\n card.removeEventListener('mousedown', onCardDown);\n for (const h of handles) h.remove();\n style.remove();\n card.classList.remove('veo-mnp-card');\n delete card.dataset.veoManipulated;\n },\n };\n}\n\n// ── Banner fijo: drag vertical con snap top/bottom ──────────────────────────\n\nfunction attachBanner(\n opts: DesignManipulatorOptions,\n shadow: ShadowRoot,\n banner: HTMLElement,\n): DesignManipulatorHandle | null {\n if (banner.dataset.veoManipulated === '1') return null;\n banner.dataset.veoManipulated = '1';\n banner.classList.add('veo-mnp-banner');\n\n const doc = banner.ownerDocument;\n const style = doc.createElement('style');\n style.textContent = MANIPULATOR_CSS;\n shadow.appendChild(style);\n\n let dragging = false;\n let detached = false;\n\n const positionOf = (): 'top' | 'bottom' =>\n banner.classList.contains('veo-banner-bottom') ? 'bottom' : 'top';\n\n const onDown = (e: MouseEvent): void => {\n if (isInteractive(e.target)) return;\n e.preventDefault();\n dragging = true;\n const startPos = positionOf();\n let current = startPos;\n\n const move = (ev: MouseEvent): void => {\n // Snap: la mitad del viewport decide top/bottom, con feedback en vivo.\n const next = ev.clientY < window.innerHeight / 2 ? 'top' : 'bottom';\n if (next !== current) {\n current = next;\n banner.classList.remove('veo-banner-top', 'veo-banner-bottom');\n banner.classList.add(`veo-banner-${next}`);\n }\n };\n const up = (): void => {\n window.removeEventListener('mousemove', move);\n window.removeEventListener('mouseup', up);\n dragging = false;\n if (current !== startPos && !detached) {\n opts.onCommit({ stepIndex: opts.stepIndex, style: { position: current } });\n }\n opts.onGestureEnd?.();\n };\n window.addEventListener('mousemove', move);\n window.addEventListener('mouseup', up);\n };\n\n banner.addEventListener('mousedown', onDown);\n\n return {\n isDragging: () => dragging,\n detach: () => {\n if (detached) return;\n detached = true;\n banner.removeEventListener('mousedown', onDown);\n style.remove();\n banner.classList.remove('veo-mnp-banner');\n delete banner.dataset.veoManipulated;\n },\n };\n}\n","/**\n * Element picker — el \"inspeccionar\" del navegador, pero del SDK. Corre\n * DENTRO de la app del cliente (no en el dashboard: son orígenes distintos\n * y el dashboard no puede leer el DOM de la app). Resalta el elemento bajo\n * el cursor, muestra su selector + dimensiones, y al hacer click captura un\n * selector CSS estable reutilizando `buildSelectorPath` del autocapture.\n *\n * Es la base del builder no-code: el dashboard abre la app del cliente en\n * modo builder, el usuario \"pincha\" un elemento y el selector resultante se\n * usa como ancla de un tooltip/walkthrough. El puente con el dashboard\n * (postMessage) es la fase siguiente; aquí exponemos el primitivo\n * `startElementPicker(onPick)`.\n *\n * No usa `innerHTML` — todo por `textContent`/DOM, igual que los renderers.\n */\n\nimport { hasDocument } from '../../utils/safe-env';\nimport { buildSelectorPath, filterHumanClasses } from '../autocapture/selector-builder';\n\n/** z-index por encima de las guías (2147483640) para tapar también una preview. */\nconst PICKER_Z = 2147483646;\nconst PICKER_HOST_ATTR = 'data-veo-picker';\nconst DEFAULT_MAX_ANCESTORS = 5;\n\n/** Datos del elemento elegido que se entregan al caller. */\nexport interface PickedElement {\n /** Selector CSS estable con ancestros (lo que se guarda como ancla). */\n selector: string;\n /** Selector corto solo del elemento (tag + id/atributo/clases). */\n shortSelector: string;\n tag: string;\n id: string | null;\n classes: string[];\n text: string;\n rect: { x: number; y: number; width: number; height: number };\n}\n\nexport interface ElementPickerOptions {\n /** Llamado al hacer click en un elemento. El picker se cierra tras esto. */\n onPick: (picked: PickedElement) => void;\n /** Llamado al cancelar (Esc). El picker se cierra. */\n onCancel?: () => void;\n /** Niveles de ancestros del selector. Default 5 (igual que autocapture). */\n maxAncestors?: number;\n /** Texto del banner superior. Default en español. */\n hint?: string;\n}\n\nexport interface ElementPickerHandle {\n /** Cierra el picker sin elegir nada. Idempotente. */\n stop(): void;\n}\n\nconst PICKER_STYLES = `\n:host { all: initial; }\n.veo-pick-box {\n position: fixed;\n z-index: ${PICKER_Z};\n pointer-events: none;\n box-sizing: border-box;\n background: rgba(99, 102, 241, 0.22);\n border: 1px dashed rgba(99, 102, 241, 0.95);\n border-radius: 2px;\n transition: top 60ms ease-out, left 60ms ease-out, width 60ms ease-out, height 60ms ease-out;\n}\n.veo-pick-label {\n position: fixed;\n z-index: ${PICKER_Z};\n pointer-events: none;\n max-width: 360px;\n background: #1e1b4b;\n color: #e0e7ff;\n font: 12px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace;\n padding: 6px 9px;\n border-radius: 6px;\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35);\n}\n.veo-pick-label .veo-pick-sel { color: #c7d2fe; word-break: break-all; }\n.veo-pick-label .veo-pick-dim { color: #a5b4fc; margin-top: 3px; }\n.veo-pick-hint {\n position: fixed;\n top: 12px;\n left: 50%;\n transform: translateX(-50%);\n z-index: ${PICKER_Z};\n pointer-events: none;\n background: #4338ca;\n color: #fff;\n font: 13px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n padding: 8px 14px;\n border-radius: 999px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);\n}\n`;\n\n/**\n * Controla un picker activo. Singleton a nivel de módulo: empezar otro\n * cierra el anterior. Los listeners van en fase de captura para poder\n * cancelar el click ANTES de que la app del cliente reaccione.\n */\nclass ElementPicker {\n private host: HTMLElement | null = null;\n private box: HTMLElement | null = null;\n private label: HTMLElement | null = null;\n private current: Element | null = null;\n private maxAncestors = DEFAULT_MAX_ANCESTORS;\n private onPick: ((p: PickedElement) => void) | null = null;\n private onCancel: (() => void) | null = null;\n\n start(options: ElementPickerOptions): void {\n this.stop(); // solo un picker a la vez\n\n this.maxAncestors = options.maxAncestors ?? DEFAULT_MAX_ANCESTORS;\n this.onPick = options.onPick;\n this.onCancel = options.onCancel ?? null;\n\n const host = document.createElement('div');\n host.setAttribute(PICKER_HOST_ATTR, '');\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = PICKER_STYLES;\n\n this.box = document.createElement('div');\n this.box.className = 'veo-pick-box';\n this.box.style.display = 'none';\n\n this.label = document.createElement('div');\n this.label.className = 'veo-pick-label';\n this.label.style.display = 'none';\n\n const hint = document.createElement('div');\n hint.className = 'veo-pick-hint';\n hint.textContent = options.hint ?? 'Selecciona un elemento · Esc para cancelar';\n\n shadow.append(style, this.box, this.label, hint);\n document.body.appendChild(host);\n this.host = host;\n\n document.addEventListener('mousemove', this.onMove, true);\n document.addEventListener('click', this.onClick, true);\n document.addEventListener('mousedown', this.swallow, true);\n document.addEventListener('mouseup', this.swallow, true);\n document.addEventListener('keydown', this.onKey, true);\n window.addEventListener('scroll', this.reposition, true);\n window.addEventListener('resize', this.reposition);\n }\n\n stop(): void {\n document.removeEventListener('mousemove', this.onMove, true);\n document.removeEventListener('click', this.onClick, true);\n document.removeEventListener('mousedown', this.swallow, true);\n document.removeEventListener('mouseup', this.swallow, true);\n document.removeEventListener('keydown', this.onKey, true);\n window.removeEventListener('scroll', this.reposition, true);\n window.removeEventListener('resize', this.reposition);\n\n if (this.host?.parentNode) this.host.parentNode.removeChild(this.host);\n this.host = null;\n this.box = null;\n this.label = null;\n this.current = null;\n this.onPick = null;\n this.onCancel = null;\n }\n\n /** ¿Es un nodo de nuestro propio overlay? (no debe ser seleccionable). */\n private isOwn(target: EventTarget | null): boolean {\n return target instanceof Node && this.host !== null && this.host.contains(target);\n }\n\n private onMove = (event: MouseEvent): void => {\n const target = event.target;\n if (!(target instanceof Element) || this.isOwn(target)) return;\n this.current = target;\n this.draw(target);\n };\n\n private onClick = (event: MouseEvent): void => {\n const target = this.current ?? (event.target instanceof Element ? event.target : null);\n if (!target || this.isOwn(target)) return;\n\n // Evitar que la app reaccione al click de selección.\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n const picked = this.describe(target);\n const cb = this.onPick;\n this.stop();\n cb?.(picked);\n };\n\n private onKey = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n event.stopPropagation();\n const cb = this.onCancel;\n this.stop();\n cb?.();\n };\n\n /** Traga mousedown/mouseup durante el picking (evita focus/active de la app). */\n private swallow = (event: MouseEvent): void => {\n if (this.isOwn(event.target)) return;\n event.preventDefault();\n event.stopPropagation();\n };\n\n private reposition = (): void => {\n if (this.current) this.draw(this.current);\n };\n\n /** Dibuja el recuadro de resalte y la etiqueta sobre el elemento dado. */\n private draw(element: Element): void {\n if (!this.box || !this.label) return;\n const rect = element.getBoundingClientRect();\n\n this.box.style.display = 'block';\n this.box.style.top = `${rect.top}px`;\n this.box.style.left = `${rect.left}px`;\n this.box.style.width = `${rect.width}px`;\n this.box.style.height = `${rect.height}px`;\n\n const shortSel = buildSelectorPath(element, 0);\n this.label.textContent = '';\n const sel = document.createElement('div');\n sel.className = 'veo-pick-sel';\n sel.textContent = shortSel;\n const dim = document.createElement('div');\n dim.className = 'veo-pick-dim';\n dim.textContent = `${Math.round(rect.width)} × ${Math.round(rect.height)}`;\n this.label.append(sel, dim);\n\n // Etiqueta debajo del recuadro; si no hay espacio, arriba.\n this.label.style.display = 'block';\n const LABEL_H = 48;\n const placeAbove = rect.bottom + 8 + LABEL_H > window.innerHeight;\n this.label.style.top = placeAbove\n ? `${Math.max(8, rect.top - LABEL_H - 8)}px`\n : `${rect.bottom + 8}px`;\n this.label.style.left = `${Math.max(8, rect.left)}px`;\n }\n\n private describe(element: Element): PickedElement {\n const rect = element.getBoundingClientRect();\n return {\n selector: buildSelectorPath(element, this.maxAncestors),\n shortSelector: buildSelectorPath(element, 0),\n tag: element.tagName.toLowerCase(),\n id: element.id || null,\n classes: filterHumanClasses(element),\n text: (element.textContent ?? '').trim().slice(0, 120),\n rect: {\n x: Math.round(rect.left),\n y: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n };\n }\n}\n\nlet activePicker: ElementPicker | null = null;\n\n/**\n * Inicia el modo de selección de elementos (inspector). Resalta lo que está\n * bajo el cursor y, al hacer click, entrega un selector CSS estable.\n * Devuelve un handle con `stop()`. Iniciar otro picker cierra el anterior.\n *\n * @example\n * ```ts\n * import { startElementPicker } from '@veo/sdk';\n *\n * const picker = startElementPicker({\n * onPick: ({ selector }) => console.log('elegido:', selector),\n * onCancel: () => console.log('cancelado'),\n * });\n * // picker.stop() para abortar manualmente.\n * ```\n */\nexport function startElementPicker(options: ElementPickerOptions): ElementPickerHandle {\n if (!hasDocument()) {\n return { stop: () => {} };\n }\n if (!activePicker) activePicker = new ElementPicker();\n activePicker.start(options);\n return { stop: () => activePicker?.stop() };\n}\n\n/** Cierra el picker activo, si lo hay. Idempotente. */\nexport function stopElementPicker(): void {\n activePicker?.stop();\n}\n","/**\n * Lado APP del puente builder. Corre dentro de la app del cliente (vía\n * veo-builder.js). Si el contexto trae `?veoBuilder=<token>`, se conecta con el\n * editor de Veo, atiende comandos y devuelve el elemento elegido.\n *\n * Dos transportes:\n * - **iframe/popup** (`resolveTarget` = opener/parent): el dashboard es la\n * ventana principal y embebe/abre la app; le hablamos a esa ventana.\n * - **panel inyectado** (`ctx.panel`): la app es top-level (login real) y NOSOTROS\n * inyectamos el panel del editor encima (iframe al dashboard); le hablamos a\n * ese iframe. Es el modo sin adaptación por app.\n *\n * Seguridad: solo acepta mensajes cuyo `origin` coincida con el del dashboard\n * (`veoBuilderOrigin` / `document.referrer`) y cuyo `token` coincida.\n */\nimport {\n type BuilderClientContext,\n clearBuilderToken,\n resolveBuilderContext,\n} from '../../core/builder-token';\nimport { hasDocument, hasWindow } from '../../utils/safe-env';\nimport { closeGuidePreview, previewGuide } from '../guides/guide-preview';\nimport { attachBlockDropTarget, type BlockDropTargetHandle } from './block-drop-target';\nimport { type BuilderCommand, type BuilderEvent, VEO_BUILDER_SOURCE } from './bridge-protocol';\nimport { type BuilderPanelHandle, injectBuilderPanel } from './builder-panel';\nimport { attachDesignManipulator, type DesignManipulatorHandle } from './design-manipulator';\nimport { type ElementPickerHandle, startElementPicker } from './element-picker';\n\nexport interface BuilderModeHandle {\n /** Desconecta el puente y limpia picker/preview/panel. */\n teardown(): void;\n}\n\n/**\n * Inicializa el modo builder si hay contexto (URL o persistido). Devuelve un\n * handle, o `null` si no estamos en modo builder o no hay canal con el editor.\n * Es seguro llamarla siempre.\n */\nexport function initBuilderMode(): BuilderModeHandle | null {\n if (!hasWindow() || !hasDocument()) return null;\n\n // Contexto de la URL o de sessionStorage: sobrevive al redirect del guard de\n // auth (que suele tirar el query string) y a un login en la misma pestaña.\n const ctx = resolveBuilderContext();\n if (!ctx) return null;\n\n const token = ctx.token;\n const dashboardOrigin = resolveDashboardOrigin(ctx.origin);\n if (!dashboardOrigin) return null;\n\n let picker: ElementPickerHandle | null = null;\n let panel: BuilderPanelHandle | null = null;\n let staticTarget: Window | null = null;\n let manipulator: DesignManipulatorHandle | null = null;\n let dropTarget: BlockDropTargetHandle | null = null;\n /** Fantasma que sigue el cursor durante el drag de un bloque de la paleta. */\n let dragGhost: HTMLElement | null = null;\n /** Paso mostrado por la preview activa (destino de los drops de bloque). */\n let previewStepIndex = 0;\n /** Preview que llegó DURANTE un drag: se aplica al terminar el gesto. */\n let pendingPreview: Extract<BuilderCommand, { type: 'preview' }> | null = null;\n const getTarget = (): Window | null => (panel ? panel.target() : staticTarget);\n\n const post = (event: BuilderEvent): void => {\n getTarget()?.postMessage({ source: VEO_BUILDER_SOURCE, token, ...event }, dashboardOrigin);\n };\n\n const applyPreview = (cmd: Extract<BuilderCommand, { type: 'preview' }>): void => {\n manipulator?.detach();\n manipulator = null;\n dropTarget?.detach();\n dropTarget = null;\n previewStepIndex = cmd.guide.startStepIndex ?? 0;\n const handle = previewGuide(cmd.guide);\n if (!cmd.editable) return;\n void handle.ready.then((result) => {\n if (!result.rendered) return;\n const host = handle.host();\n if (!host) return;\n manipulator = attachDesignManipulator({\n host,\n guideType: cmd.guide.guideType,\n stepIndex: cmd.guide.startStepIndex ?? 0,\n onCommit: (payload) => post({ type: 'design-updated', payload }),\n onGestureEnd: () => {\n if (!pendingPreview) return;\n const queued = pendingPreview;\n pendingPreview = null;\n applyPreview(queued);\n },\n });\n // Paleta → guía: soltar un bloque del panel sobre la preview lo inserta.\n dropTarget = attachBlockDropTarget({\n host,\n stepIndex: cmd.guide.startStepIndex ?? 0,\n onDrop: (payload) => post({ type: 'block-dropped', payload }),\n });\n });\n };\n\n const hideDragGhost = (): void => {\n dragGhost?.remove();\n dragGhost = null;\n };\n\n const moveDragGhost = (x: number, y: number, label: string): void => {\n if (!dragGhost) {\n dragGhost = document.createElement('div');\n dragGhost.style.cssText =\n 'position:fixed;padding:4px 10px;border-radius:999px;background:#1c1917;color:#fff;' +\n 'font:12px/1.4 system-ui,sans-serif;box-shadow:0 4px 14px rgba(0,0,0,0.35);' +\n 'border:1px solid rgba(255,255,255,0.25);pointer-events:none;z-index:2147483647;';\n document.body.appendChild(dragGhost);\n }\n dragGhost.textContent = label;\n dragGhost.style.left = `${x + 14}px`;\n dragGhost.style.top = `${y + 12}px`;\n };\n\n /**\n * Drag de bloque por pointer: coords relativas al iframe del panel → página.\n * En pop-out no hay mapeo (otra ventana) — se ignora.\n */\n const handleBlockDrag = (cmd: Extract<BuilderCommand, { type: 'block-drag' }>): void => {\n const rect = panel?.frameRect();\n if (!rect || !dropTarget) {\n if (cmd.phase !== 'move') hideDragGhost();\n dropTarget?.cancelHover();\n return;\n }\n const x = rect.left + cmd.x;\n const y = rect.top + cmd.y;\n if (cmd.phase === 'move') {\n moveDragGhost(x, y, cmd.label || cmd.blockType);\n dropTarget.hoverAt(x, y);\n return;\n }\n hideDragGhost();\n if (cmd.phase === 'cancel') {\n dropTarget.cancelHover();\n return;\n }\n const spotAt = dropTarget.dropAt(x, y);\n if (spotAt) {\n post({\n type: 'block-dropped',\n payload: { stepIndex: previewStepIndex, blockType: cmd.blockType, ...spotAt },\n });\n }\n };\n\n const handleCommand = (cmd: BuilderCommand): void => {\n switch (cmd.type) {\n case 'panel-ready':\n // El panel cargó y ya escucha → recién ahora le mandamos `ready`.\n post({ type: 'ready' });\n break;\n case 'start-picker':\n picker?.stop();\n picker = startElementPicker({\n onPick: (payload) => {\n picker = null;\n post({ type: 'picked', payload });\n },\n onCancel: () => {\n picker = null;\n post({ type: 'pick-cancelled' });\n },\n ...(cmd.maxAncestors !== undefined ? { maxAncestors: cmd.maxAncestors } : {}),\n ...(cmd.hint !== undefined ? { hint: cmd.hint } : {}),\n });\n break;\n case 'stop-picker':\n picker?.stop();\n picker = null;\n break;\n case 'preview':\n if (!cmd.guide) break;\n // Mientras hay un drag en curso, no remontar la preview debajo del\n // mouse del autor: se encola el ÚLTIMO comando y se aplica al soltar.\n if (manipulator?.isDragging()) pendingPreview = cmd;\n else applyPreview(cmd);\n break;\n case 'block-drag':\n handleBlockDrag(cmd);\n break;\n case 'close-preview':\n manipulator?.detach();\n manipulator = null;\n dropTarget?.detach();\n dropTarget = null;\n hideDragGhost();\n pendingPreview = null;\n closeGuidePreview();\n break;\n case 'teardown':\n teardown();\n break;\n }\n };\n\n const onMessage = (event: MessageEvent): void => {\n if (event.origin !== dashboardOrigin) return;\n const data = event.data as { source?: unknown; token?: unknown } | null;\n if (!data || data.source !== VEO_BUILDER_SOURCE || data.token !== token) return;\n handleCommand(data as BuilderCommand);\n };\n\n const onPageHide = (): void => post({ type: 'closed' });\n\n const teardown = (): void => {\n window.removeEventListener('message', onMessage);\n window.removeEventListener('pagehide', onPageHide);\n picker?.stop();\n picker = null;\n manipulator?.detach();\n manipulator = null;\n dropTarget?.detach();\n dropTarget = null;\n hideDragGhost();\n pendingPreview = null;\n closeGuidePreview();\n post({ type: 'closed' }); // avisar al editor ANTES de sacar el panel\n panel?.teardown();\n panel = null;\n clearBuilderToken(); // salir del modo builder: no re-activar en la próxima carga\n };\n\n // Transporte: panel inyectado (app top-level) o iframe/popup (embebida).\n if (ctx.panel) {\n panel = injectBuilderPanel({\n dashboardOrigin,\n token,\n appOrigin: window.location.origin,\n guide: ctx.guide,\n panelPath: ctx.panelPath,\n onClose: () => teardown(),\n });\n } else {\n staticTarget = resolveTarget();\n if (!staticTarget) return null;\n }\n\n const activate = (): void => {\n window.addEventListener('message', onMessage);\n window.addEventListener('pagehide', onPageHide);\n // Panel: esperamos el `panel-ready` del iframe para postear `ready` (todavía\n // puede no tener su listener). iframe/popup: el opener ya escucha → posteamos ya.\n if (!ctx.panel) post({ type: 'ready' });\n };\n\n // Modo panel inyectado: la seguridad ya la da la sesión AUTENTICADA del\n // dashboard (el panel es un iframe del dashboard con Clerk) — el token es solo\n // correlación. Activamos directo, SIN verify: el verify contra el backend\n // podría fallar por expiración del token durante el login (que tarda), dejando\n // el panel para siempre en \"conectando…\".\n //\n // Modo iframe/popup (embebido): verificamos el token firmado antes de activar\n // (si `init()` dejó la config). Solo bloquea si el backend dice {valid:false}.\n const cfg = (window as unknown as { __veoBuilder?: { apiKey?: string; apiUrl?: string } })\n .__veoBuilder;\n if (!ctx.panel && cfg?.apiKey && cfg?.apiUrl) {\n void verifyBuilderToken(cfg.apiUrl, cfg.apiKey, token).then((ok) => {\n if (ok) activate();\n else if (window.console) console.warn('[veo] token de builder inválido — modo no activado');\n });\n } else {\n activate();\n }\n\n return { teardown };\n}\n\n/**\n * Verifica el token con el backend. Solo devuelve `false` (no activar) cuando el\n * backend responde explícitamente `{valid:false}` (token forjado/expirado/de\n * otro workspace). Ante 404/red caída/errores transitorios devuelve `true`\n * (best-effort) para no brickear el modo builder.\n */\nasync function verifyBuilderToken(apiUrl: string, apiKey: string, token: string): Promise<boolean> {\n try {\n const url = `${apiUrl.replace(/\\/+$/, '')}/v1/builder/verify`;\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': apiKey },\n body: JSON.stringify({ token }),\n });\n if (!res.ok) return true; // no pudimos verificar → best-effort\n const data = (await res.json().catch(() => null)) as { valid?: unknown } | null;\n return data?.valid !== false;\n } catch {\n return true; // red caída / sin backend → best-effort\n }\n}\n\n/** Ventana con la que hablar en modo iframe/popup: el opener o el parent. */\nfunction resolveTarget(): Window | null {\n if (window.opener && window.opener !== window) return window.opener as Window;\n if (window.parent && window.parent !== window) return window.parent;\n return null;\n}\n\nfunction resolveDashboardOrigin(originHint: string | null): string | null {\n // Origen de la URL o persistido en el primer arranque (antes del redirect).\n if (originHint) {\n try {\n return new URL(originHint).origin;\n } catch {\n return null;\n }\n }\n // Fallback: el referrer. Poco fiable tras un redirect same-origin (apunta a la\n // propia app), por eso el origen persistido va primero.\n if (hasDocument() && document.referrer) {\n try {\n return new URL(document.referrer).origin;\n } catch {\n return null;\n }\n }\n return null;\n}\n\n// Tipo re-exportado para consumidores que tipan el contexto.\nexport type { BuilderClientContext };\n","/**\n * Lado DASHBOARD del puente builder. Abre la app del cliente en un popup,\n * en modo builder, y expone una API para pedirle que seleccione un elemento\n * o previsualice una guía. Pensado para importarse en el dashboard\n * (`import { createBuilderSession } from '@veo/sdk/builder'`).\n *\n * Seguridad: solo procesa mensajes cuyo `origin` sea el de la app y cuyo\n * `token` coincida con el de esta sesión.\n */\nimport { hasWindow } from '../../utils/safe-env';\nimport type { PreviewGuideInput } from '../guides/guide-preview';\nimport {\n BUILDER_ORIGIN_PARAM,\n BUILDER_TOKEN_PARAM,\n type BuilderCommand,\n VEO_BUILDER_SOURCE,\n} from './bridge-protocol';\nimport type { PickedElement } from './element-picker';\n\nexport interface BuilderSessionOptions {\n /** URL de la app del cliente a abrir en modo builder. */\n appUrl: string;\n /** Token de la sesión (idealmente emitido/firmado por el backend). */\n token: string;\n /** Origen al que la app debe responder. Default: `location.origin`. */\n dashboardOrigin?: string;\n /** La app está lista y escuchando comandos. */\n onReady?: () => void;\n /** El usuario eligió un elemento. */\n onPicked?: (picked: PickedElement) => void;\n /** El usuario canceló la selección (Esc). */\n onCancelled?: () => void;\n /** La app cerró el modo builder (o el popup se cerró). */\n onClosed?: () => void;\n /**\n * Si se pasa, la app se embebe en este `<iframe>` (modo estudio in-app) en\n * lugar de abrirse en un popup. El lado app ya habla con `window.parent`,\n * así que el puente funciona igual. La sesión setea el `src` del iframe.\n */\n frame?: HTMLIFrameElement;\n /** Nombre de la ventana popup. Default: `veo-builder`. */\n windowName?: string;\n /** Features del popup. Default: ventana de ~1280×860. */\n windowFeatures?: string;\n}\n\nexport interface BuilderSession {\n /** Pide a la app que entre en modo selección de elemento. */\n startPicker(options?: { maxAncestors?: number; hint?: string }): void;\n /** Cancela la selección en curso. */\n stopPicker(): void;\n /** Pide a la app que previsualice una guía. */\n preview(guide: PreviewGuideInput): void;\n /** Cierra la preview activa en la app. */\n closePreview(): void;\n /** Cierra el popup y desconecta el puente. */\n close(): void;\n}\n\nconst DEFAULT_FEATURES = 'popup,width=1280,height=860';\nconst POPUP_POLL_MS = 600;\n\nexport function createBuilderSession(options: BuilderSessionOptions): BuilderSession {\n if (!hasWindow()) return noopSession();\n\n const dashboardOrigin = options.dashboardOrigin ?? window.location.origin;\n const appOrigin = safeOrigin(options.appUrl);\n const url = buildAppUrl(options.appUrl, options.token, dashboardOrigin);\n\n const frame = options.frame ?? null;\n const useFrame = frame !== null;\n\n let popup: Window | null = null;\n if (useFrame) {\n // biome-ignore lint/style/noNonNullAssertion: useFrame garantiza frame\n frame!.src = url;\n } else {\n popup = window.open(\n url,\n options.windowName ?? 'veo-builder',\n options.windowFeatures ?? DEFAULT_FEATURES,\n );\n }\n\n /** Ventana destino de los comandos: el popup o el contentWindow del iframe. */\n const targetWindow = (): Window | null => (useFrame ? (frame?.contentWindow ?? null) : popup);\n\n const post = (command: BuilderCommand): void => {\n const w = targetWindow();\n if (!w) return;\n if (!useFrame && popup?.closed) return;\n w.postMessage(\n { source: VEO_BUILDER_SOURCE, token: options.token, ...command },\n appOrigin ?? '*',\n );\n };\n\n let pollTimer: ReturnType<typeof setInterval> | undefined;\n\n const cleanup = (): void => {\n window.removeEventListener('message', onMessage);\n if (pollTimer !== undefined) {\n clearInterval(pollTimer);\n pollTimer = undefined;\n }\n };\n\n const onMessage = (event: MessageEvent): void => {\n if (appOrigin && event.origin !== appOrigin) return;\n const data = event.data as {\n source?: unknown;\n token?: unknown;\n type?: unknown;\n payload?: unknown;\n } | null;\n if (!data || data.source !== VEO_BUILDER_SOURCE || data.token !== options.token) return;\n\n switch (data.type) {\n case 'ready':\n options.onReady?.();\n break;\n case 'picked':\n if (data.payload) options.onPicked?.(data.payload as PickedElement);\n break;\n case 'pick-cancelled':\n options.onCancelled?.();\n break;\n case 'closed':\n cleanup();\n options.onClosed?.();\n break;\n }\n };\n\n window.addEventListener('message', onMessage);\n\n // Detectar cierre manual del popup (el usuario cierra la ventana). En modo\n // iframe el ciclo de vida lo controla el dashboard (no hay nada que pollear).\n if (!useFrame) {\n pollTimer = setInterval(() => {\n if (popup?.closed) {\n cleanup();\n options.onClosed?.();\n }\n }, POPUP_POLL_MS);\n }\n\n return {\n startPicker: (o) =>\n post({\n type: 'start-picker',\n ...(o?.maxAncestors !== undefined ? { maxAncestors: o.maxAncestors } : {}),\n ...(o?.hint !== undefined ? { hint: o.hint } : {}),\n }),\n stopPicker: () => post({ type: 'stop-picker' }),\n preview: (guide) => post({ type: 'preview', guide }),\n closePreview: () => post({ type: 'close-preview' }),\n close: () => {\n post({ type: 'teardown' });\n if (useFrame) {\n if (frame) frame.src = 'about:blank';\n } else if (popup && !popup.closed) {\n popup.close();\n }\n cleanup();\n },\n };\n}\n\nfunction buildAppUrl(appUrl: string, token: string, dashboardOrigin: string): string {\n try {\n const u = new URL(appUrl, window.location.href);\n u.searchParams.set(BUILDER_TOKEN_PARAM, token);\n u.searchParams.set(BUILDER_ORIGIN_PARAM, dashboardOrigin);\n return u.toString();\n } catch {\n return appUrl;\n }\n}\n\nfunction safeOrigin(url: string): string | null {\n try {\n return new URL(url, window.location.href).origin;\n } catch {\n return null;\n }\n}\n\nfunction noopSession(): BuilderSession {\n return {\n startPicker: () => {},\n stopPicker: () => {},\n preview: () => {},\n closePreview: () => {},\n close: () => {},\n };\n}\n","/**\n * Plugin builder — herramientas no-code que corren DENTRO de la app del\n * cliente (no en el dashboard). Hoy: el element picker (inspector) para\n * elegir el ancla de una guía. Próximo: el puente postMessage con el\n * dashboard y la activación segura por `?veoBuilder=<token>`.\n */\n\nexport type {\n BlockDropPayload,\n BlockDropTargetHandle,\n} from './block-drop-target';\nexport { attachBlockDropTarget, VEO_BLOCK_MIME } from './block-drop-target';\nexport type {\n BuilderCommand,\n BuilderEvent,\n} from './bridge-protocol';\nexport type { BuilderModeHandle } from './builder-mode';\nexport { initBuilderMode } from './builder-mode';\nexport type { BuilderSession, BuilderSessionOptions } from './builder-session';\nexport { createBuilderSession } from './builder-session';\nexport type {\n DesignManipulatorHandle,\n DesignManipulatorOptions,\n DesignPatch,\n} from './design-manipulator';\nexport { attachDesignManipulator } from './design-manipulator';\nexport type { ElementPickerHandle, ElementPickerOptions, PickedElement } from './element-picker';\nexport { startElementPicker, stopElementPicker } from './element-picker';\n","/**\n * Tipos del contrato HTTP entre el SDK y el backend.\n * Versión 1.\n *\n * IMPORTANTE: Si cambias algo aquí, debes actualizar también:\n * - veo-backend/src/modules/identity/dto/*.dto.ts\n * - veo-backend/src/modules/ingest/dto/*.dto.ts\n * - CONTRACT.md\n */\n\nexport const SDK_VERSION = '0.0.1';\nexport const MAX_BATCH_SIZE = 100;\nexport const DEFAULT_FLUSH_INTERVAL_MS = 5000;\nexport const DEFAULT_FLUSH_BATCH_SIZE = 20;\n\n/**\n * Backend de Veo, horneado en el bundle. El consumidor NO configura la URL.\n * El valor se inyecta en build-time desde `VEO_API_URL` (ver tsup.config.ts);\n * el literal de aquí es solo el fallback para tests / builds sin esa env.\n * NO es secreta: va al bundle del navegador, igual que la `pk_`.\n */\nexport const DEFAULT_API_URL =\n process.env.VEO_API_URL || 'https://veo-backend-production-8c78.up.railway.app';\n\n/**\n * Tipos de eventos que el SDK envía.\n * Debe coincidir con el CHECK constraint de veo_user_actions.action_type.\n */\nexport type ActionType = 'pageview' | 'track' | 'identify' | 'guide';\n\n/**\n * Payload de un evento individual enviado al endpoint POST /v1/events.\n */\nexport interface ActionPayload {\n actionId: string; // UUID v7 generado en cliente\n endUserId: string;\n organizationId?: string;\n sessionId: string;\n actionType: ActionType;\n actionName?: string;\n occurredAt: string; // ISO 8601\n pageUrl?: string;\n pagePath?: string;\n pageTitle?: string;\n pageReferrer?: string;\n actionProperties?: Record<string, unknown>;\n}\n\n/**\n * Request del endpoint POST /v1/events.\n */\nexport interface IngestEventsRequest {\n events: ActionPayload[]; // máx 100\n}\n\n/**\n * Response del endpoint POST /v1/events.\n */\nexport interface IngestEventsResponse {\n accepted: number;\n deduped: number;\n}\n\n/**\n * Request del endpoint POST /v1/identify.\n */\nexport interface IdentifyRequest {\n endUser: {\n id: string;\n anonymousId?: string;\n traits?: Record<string, unknown>;\n };\n organization?: {\n id: string;\n attributes?: Record<string, unknown>;\n };\n}\n\n/**\n * Response del endpoint POST /v1/identify.\n */\nexport interface IdentifyResponse {\n endUserId: string;\n organizationId: string | null;\n workspaceId: string;\n}\n\n/**\n * Response de error estándar del backend.\n */\nexport interface ErrorResponse {\n error: string;\n details?: unknown;\n statusCode: number;\n}\n","import { DEFAULT_API_URL } from '../contract/v1';\n\n/**\n * Resuelve la URL del backend de Veo. NO es parte de la API pública: el\n * consumidor solo pasa `apiKey` y la URL va quemada en `DEFAULT_API_URL`.\n *\n * Orden de resolución (para desarrollo local / self-host, sin recompilar):\n * 1. `config.apiUrl` si viene (override interno, no tipado en `VeoConfig`).\n * 2. `window.__VEO_API_URL__` si está seteado ANTES de `init()`.\n * 3. `DEFAULT_API_URL` (el backend gestionado).\n */\nexport function resolveApiUrl(config?: unknown): string {\n const fromConfig = (config as { apiUrl?: unknown } | undefined)?.apiUrl;\n if (typeof fromConfig === 'string' && fromConfig.trim()) return fromConfig;\n\n const fromGlobal = (globalThis as { __VEO_API_URL__?: unknown }).__VEO_API_URL__;\n if (typeof fromGlobal === 'string' && fromGlobal.trim()) return fromGlobal;\n\n return DEFAULT_API_URL;\n}\n","/**\n * Carga perezosa del bundle del builder. El SDK de producción (`veo.js`) es\n * lo único que el cliente integra; cuando el dashboard abre la app con\n * `?veoBuilder=<token>`, este loader inyecta `veo-builder.js` (que se\n * auto-conecta). Así el modo no-code \"simplemente funciona\" sin que el\n * cliente tenga que instalar nada extra.\n *\n * No importa nada del plugin builder para no arrastrar su código al bundle\n * de producción (ver budget en CLAUDE.md). El nombre del query param debe\n * coincidir con `BUILDER_TOKEN_PARAM` de `plugins/builder/bridge-protocol`.\n */\nimport { hasDocument, hasWindow } from '../utils/safe-env';\nimport { resolveBuilderToken } from './builder-token';\n\n/**\n * `true` cuando la app corre en modo builder (URL con `?veoBuilder=<token>`, o\n * el token persistido en sessionStorage tras un redirect de auth). En ese modo\n * el editor pinta las guías vía PREVIEW; el runtime NO debe resolver/renderizar\n * las guías `live` o se duplicarían (la live del runtime + la preview del editor).\n */\nexport { isBuilderMode } from './builder-token';\n\nexport function maybeLoadBuilder(opts: {\n builderUrl?: string;\n debug?: boolean;\n apiKey?: string;\n apiUrl?: string;\n /**\n * Fallback para integraciones por bundler (sin `<script>` de dónde derivar la\n * URL): carga el builder con un `import()` dinámico. Lo pasa SOLO el entry\n * ESM/CJS (`index.ts`), así el bundler lo code-splitea (cero costo en prod, se\n * descarga solo en modo builder). El IIFE NO lo pasa (usa el `<script>`).\n */\n loadBuilder?: () => Promise<unknown>;\n}): void {\n if (!hasWindow() || !hasDocument()) return;\n\n // Lee el token de la URL o de sessionStorage (sobrevive al redirect que tira\n // el query string) y persiste el de la URL apenas lo ve. Sin token → no-op.\n if (resolveBuilderToken() === null) return;\n\n // Dejamos apiKey/apiUrl en un global para que el modo builder VERIFIQUE el\n // token contra el backend (`/v1/builder/verify`) antes de activarse. Solo se\n // setea cuando el builder se carga desde `init()` (integración real); en\n // demos que cargan veo-builder.js a mano no existe → verificación best-effort.\n if (opts.apiKey && opts.apiUrl) {\n (window as unknown as { __veoBuilder?: unknown }).__veoBuilder = {\n apiKey: opts.apiKey,\n apiUrl: opts.apiUrl,\n };\n }\n\n // Ya cargado (el IIFE expone window.veoBuilder).\n if ((window as unknown as { veoBuilder?: unknown }).veoBuilder) return;\n\n const url = opts.builderUrl ?? deriveBuilderUrl();\n if (url) {\n if (document.querySelector(`script[src=\"${url}\"]`)) return;\n const script = document.createElement('script');\n script.src = url;\n script.async = true;\n if (opts.debug) {\n script.addEventListener('error', () => console.error('[veo] no pude cargar', url));\n }\n document.head.appendChild(script);\n return;\n }\n\n // Integración por bundler: no hay `<script>` que derivar. Cargamos el builder\n // con el `import()` dinámico que pasó el entry ESM/CJS. El consumidor NO tiene\n // que copiar `veo-builder.js` ni setear `builderUrl`: \"simplemente funciona\".\n if (opts.loadBuilder) {\n void opts.loadBuilder().catch((err) => {\n if (opts.debug) console.error('[veo] no pude cargar el builder (import dinámico)', err);\n });\n return;\n }\n\n if (opts.debug) {\n console.warn('[veo] builder mode pedido pero no pude resolver la URL de veo-builder.js');\n }\n}\n\n/** Deriva `veo-builder.js` del `<script>` que cargó `veo.js`. */\nfunction deriveBuilderUrl(): string | null {\n const scripts = document.querySelectorAll<HTMLScriptElement>('script[src]');\n for (const script of Array.from(scripts)) {\n if (/\\bveo(\\.min)?\\.js(\\?.*)?$/.test(script.src)) {\n return script.src.replace(/\\bveo(\\.min)?\\.js/, 'veo-builder$1.js');\n }\n }\n return null;\n}\n","/**\n * Detección del modo PREVIEW POR LINK (`?veoPreview=<token>`). El core solo\n * detecta el param — el canje del token y el render viven en el bundle de\n * guías (`plugins/guides/preview-mode.ts`), que el caller carga\n * (estático en `index.ts`, lazy en `veo.ts`).\n *\n * El nombre del query param es parte del contrato con el dashboard (el link\n * generado por «Previsualizar en mi app»).\n */\nimport { hasWindow } from '../utils/safe-env';\n\nexport const PREVIEW_TOKEN_PARAM = 'veoPreview';\n/**\n * El token se PERSISTE en sessionStorage: al navegar entre páginas de la app la\n * URL pierde `?veoPreview`, y sin esto el modo preview (y su chip de control) se\n * apagaba al saltar de página. sessionStorage sobrevive la navegación de la\n * pestaña y muere al cerrarla — justo el alcance de una sesión de preview.\n */\nconst PREVIEW_TOKEN_KEY = 'veo:preview_token';\n\nfunction session(): Storage | null {\n try {\n return window.sessionStorage;\n } catch {\n return null; // modo privado / sandbox: seguimos solo con la URL\n }\n}\n\n/**\n * Token del link de preview. Lo toma de la URL (`?veoPreview`) y lo persiste; si\n * la URL no lo trae (navegó a otra página), lo recupera de sessionStorage.\n * `null` si no hay ninguno. Se limpia con {@link clearPreviewToken}.\n */\nexport function getPreviewToken(): string | null {\n if (!hasWindow()) return null;\n let fromUrl: string | null = null;\n try {\n const value = new URLSearchParams(window.location.search).get(PREVIEW_TOKEN_PARAM);\n fromUrl = value ? value : null;\n } catch {\n fromUrl = null;\n }\n const store = session();\n if (fromUrl) {\n try {\n store?.setItem(PREVIEW_TOKEN_KEY, fromUrl);\n } catch {\n // no-op: sin storage seguimos con el token de la URL\n }\n return fromUrl;\n }\n try {\n return store?.getItem(PREVIEW_TOKEN_KEY) || null;\n } catch {\n return null;\n }\n}\n\n/** Sale del modo preview: borra el token persistido (lo llama el chip al cerrar). */\nexport function clearPreviewToken(): void {\n try {\n session()?.removeItem(PREVIEW_TOKEN_KEY);\n } catch {\n // no-op\n }\n}\n\n/**\n * `true` cuando la app corre en modo preview-por-link. Igual que en modo\n * builder, el runtime NO debe instalar el plugin de guías: las guías live\n * taparían/duplicarían la guía que se está previsualizando.\n */\nexport function isPreviewMode(): boolean {\n return getPreviewToken() !== null;\n}\n","import type { VeoPlugin } from '../types';\n\n/**\n * Helper de identidad para definir un plugin con inferencia de tipos.\n * No transforma nada; mejora la ergonomía y deja un punto de extensión futuro.\n */\nexport function definePlugin(plugin: VeoPlugin): VeoPlugin {\n return plugin;\n}\n","import type { VeoAutocaptureConfig, VeoClient } from '../../types';\nimport { hasDocument } from '../../utils/safe-env';\nimport { DEFAULT_AUTOCAPTURE_CONFIG, MAX_ANCESTORS } from './constants';\nimport { buildAutocapturePayload } from './element-serializer';\nimport { isElementBlocked } from './pii-guard';\nimport { ElementThrottle } from './throttle';\n\ntype AutocaptureEvent = 'click' | 'submit' | 'change';\n\n/**\n * Instala listeners delegados en `document` y traduce las interacciones del\n * usuario en eventos `$autocapture`. Nunca lanza hacia la app del cliente:\n * cada handler está envuelto en try/catch.\n */\nexport class DomListener {\n private readonly throttle: ElementThrottle;\n private readonly config: Required<VeoAutocaptureConfig>;\n private cleanups: Array<() => void> = [];\n\n constructor(\n private readonly client: VeoClient,\n config: VeoAutocaptureConfig,\n ) {\n const d = DEFAULT_AUTOCAPTURE_CONFIG;\n // Resolver el config de forma explícita: el merge por spread reintroduce\n // `| undefined` y no satisface `Required<VeoAutocaptureConfig>`.\n this.config = {\n enabled: config.enabled ?? d.enabled,\n captureClicks: config.captureClicks ?? d.captureClicks,\n captureSubmits: config.captureSubmits ?? d.captureSubmits,\n captureChanges: config.captureChanges ?? d.captureChanges,\n maskAllInputs: config.maskAllInputs ?? d.maskAllInputs,\n maskAllText: config.maskAllText ?? d.maskAllText,\n blockSelectors: config.blockSelectors ?? [],\n throttleMs: config.throttleMs ?? d.throttleMs,\n maxTextLength: config.maxTextLength ?? d.maxTextLength,\n captureElementMetadata: config.captureElementMetadata ?? d.captureElementMetadata,\n captureAncestors: Math.min(config.captureAncestors ?? d.captureAncestors, MAX_ANCESTORS),\n };\n this.throttle = new ElementThrottle(this.config.throttleMs);\n }\n\n install(): void {\n if (!hasDocument() || !this.config.enabled) return;\n\n if (this.config.captureClicks) this.attach('click', (e) => this.handleClick(e));\n if (this.config.captureSubmits) this.attach('submit', (e) => this.handleSubmit(e), true);\n if (this.config.captureChanges) this.attach('change', (e) => this.handleChange(e), true);\n }\n\n destroy(): void {\n for (const cleanup of this.cleanups) cleanup();\n this.cleanups = [];\n }\n\n private attach(\n eventName: AutocaptureEvent,\n handler: (e: Event) => void,\n useCapture = false,\n ): void {\n const listener = (e: Event) => {\n // Solo eventos reales del usuario (los sintéticos tienen isTrusted=false).\n if (!e.isTrusted) return;\n try {\n handler(e);\n } catch {\n // Nunca romper la app del cliente; descartamos el evento silenciosamente.\n }\n };\n document.addEventListener(eventName, listener, useCapture);\n this.cleanups.push(() => document.removeEventListener(eventName, listener, useCapture));\n }\n\n private handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n // Subir hasta el elemento \"interesante\" (botón, link, [role], etc.).\n // Si NO hay ninguno (click en zona vacía/no interactiva, p. ej. <html>),\n // no emitimos: evita ruido y volumen innecesario de eventos.\n const meaningful = this.findMeaningfulAncestor(target);\n if (!meaningful) return;\n if (isElementBlocked(meaningful, this.config.blockSelectors)) return;\n if (!this.throttle.shouldFire(meaningful)) return;\n\n this.emit('click', meaningful);\n }\n\n private handleSubmit(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element) || target.tagName.toLowerCase() !== 'form') return;\n if (isElementBlocked(target, this.config.blockSelectors)) return;\n if (!this.throttle.shouldFire(target)) return;\n\n this.emit('submit', target);\n }\n\n private handleChange(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const tag = target.tagName.toLowerCase();\n if (tag !== 'select' && tag !== 'input' && tag !== 'textarea') return;\n\n // Para text inputs el change sería spam/PII; solo checkbox/radio (y selects).\n if (\n target instanceof HTMLInputElement &&\n target.type !== 'checkbox' &&\n target.type !== 'radio'\n ) {\n return;\n }\n if (isElementBlocked(target, this.config.blockSelectors)) return;\n if (!this.throttle.shouldFire(target)) return;\n\n this.emit('change', target);\n }\n\n /** Busca hacia arriba un ancestro \"interactivo\". Devuelve null si no hay ninguno. */\n private findMeaningfulAncestor(element: Element): Element | null {\n let current: Element | null = element;\n let depth = 0;\n\n while (current && current !== document.documentElement && depth < 5) {\n const tag = current.tagName.toLowerCase();\n const isInteractive =\n tag === 'button' ||\n tag === 'a' ||\n tag === 'input' ||\n tag === 'select' ||\n tag === 'textarea' ||\n current.hasAttribute('data-veo-tag') ||\n current.hasAttribute('role') ||\n current.hasAttribute('onclick') ||\n (current instanceof HTMLElement && current.style.cursor === 'pointer');\n\n if (isInteractive) return current;\n current = current.parentElement;\n depth++;\n }\n\n return null;\n }\n\n private emit(eventType: AutocaptureEvent, element: Element): void {\n const payload = buildAutocapturePayload(eventType, element, this.config);\n this.client.track('$autocapture', payload as unknown as Record<string, unknown>);\n }\n}\n","import { PRIORITY_ATTRIBUTES } from './constants';\nimport { isSensitiveAttribute, safeGetText } from './pii-guard';\nimport { buildSelectorPath, filterHumanClasses } from './selector-builder';\n\nexport interface SerializedElement {\n tag: string;\n id: string | null;\n classes: string[];\n text: string;\n attributes: Record<string, string>;\n position: { x: number; y: number; w: number; h: number };\n}\n\nexport interface SerializedAncestor {\n tag: string;\n id: string | null;\n classes: string[];\n veoTag: string | null;\n}\n\nexport interface AutocapturePayload {\n $event_type: 'click' | 'submit' | 'change';\n $element: SerializedElement;\n $ancestors: SerializedAncestor[];\n $selector_path: string;\n $page_url: string;\n $page_path: string;\n}\n\ninterface SerializeConfig {\n maxTextLength: number;\n maskAllText: boolean;\n captureElementMetadata: boolean;\n}\n\n/** Extrae los atributos relevantes del elemento, filtrando los sensibles. */\nfunction extractPriorityAttributes(element: Element): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const attrName of PRIORITY_ATTRIBUTES) {\n const value = element.getAttribute(attrName);\n if (value !== null && !isSensitiveAttribute(attrName) && value.length < 256) {\n result[attrName] = value;\n }\n }\n\n return result;\n}\n\n/** Serializa un elemento DOM a un objeto plano para enviar al backend. */\nexport function serializeElement(element: Element, config: SerializeConfig): SerializedElement {\n const rect = element.getBoundingClientRect();\n\n return {\n tag: element.tagName.toLowerCase(),\n id: element.id || null,\n classes: filterHumanClasses(element),\n text: safeGetText(element, config.maxTextLength, config.maskAllText),\n attributes: config.captureElementMetadata ? extractPriorityAttributes(element) : {},\n position: {\n x: Math.round(rect.left + window.scrollX),\n y: Math.round(rect.top + window.scrollY),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n },\n };\n}\n\n/** Captura los ancestros del elemento (para tagging contextual en el dashboard). */\nexport function serializeAncestors(element: Element, maxDepth: number): SerializedAncestor[] {\n const ancestors: SerializedAncestor[] = [];\n let current: Element | null = element.parentElement;\n let depth = 0;\n\n while (current && current !== document.documentElement && depth < maxDepth) {\n ancestors.push({\n tag: current.tagName.toLowerCase(),\n id: current.id || null,\n classes: filterHumanClasses(current),\n veoTag: current.getAttribute('data-veo-tag') || null,\n });\n current = current.parentElement;\n depth++;\n }\n\n return ancestors;\n}\n\n/** Construye el payload completo para el evento `$autocapture`. */\nexport function buildAutocapturePayload(\n eventType: 'click' | 'submit' | 'change',\n element: Element,\n config: SerializeConfig & { captureAncestors: number },\n): AutocapturePayload {\n return {\n $event_type: eventType,\n $element: serializeElement(element, config),\n $ancestors: serializeAncestors(element, config.captureAncestors),\n $selector_path: buildSelectorPath(element, config.captureAncestors),\n $page_url: window.location.href,\n $page_path: window.location.pathname,\n };\n}\n","import { ALWAYS_BLOCK_SELECTORS, SENSITIVE_ATTRIBUTES } from './constants';\n\n/**\n * Verifica si un elemento o ALGUNO de sus ancestros está en la blacklist.\n * Recorre hacia arriba para que bloquear un contenedor bloquee su subárbol.\n */\nexport function isElementBlocked(element: Element, extraBlockSelectors: string[] = []): boolean {\n const allBlockers = [...ALWAYS_BLOCK_SELECTORS, ...extraBlockSelectors];\n let current: Element | null = element;\n\n while (current && current !== document.documentElement) {\n for (const selector of allBlockers) {\n try {\n if (current.matches(selector)) return true;\n } catch {\n // Selector inválido o no soportado por el motor: ignorar y seguir.\n }\n }\n current = current.parentElement;\n }\n\n return false;\n}\n\n/** Verifica si un atributo es sensible y debe omitirse. */\nexport function isSensitiveAttribute(attrName: string): boolean {\n const lower = attrName.toLowerCase();\n return SENSITIVE_ATTRIBUTES.includes(lower) || /password|secret|token|ssn|credit/i.test(attrName);\n}\n\n/** Obtiene el texto visible de un elemento, respetando privacidad. */\nexport function safeGetText(element: Element, maxLength: number, mask: boolean): string {\n if (mask) return '';\n\n // Nunca capturar texto de campos de entrada (puede contener lo que el usuario escribe).\n const tagName = element.tagName.toLowerCase();\n if (tagName === 'input' || tagName === 'textarea') return '';\n\n // `innerText` no existe en jsdom; el fallback a `textContent` lo cubre.\n const raw =\n (element instanceof HTMLElement ? element.innerText : '') || element.textContent || '';\n const trimmed = raw.trim().replace(/\\s+/g, ' ');\n\n return trimmed.length > maxLength ? `${trimmed.slice(0, maxLength)}…` : trimmed;\n}\n","/**\n * Throttle por elemento: evita duplicar eventos del mismo target dentro de una\n * ventana de N ms. Usa un WeakMap para no retener elementos en memoria.\n */\nexport class ElementThrottle {\n private lastFired = new WeakMap<Element, number>();\n\n constructor(private readonly windowMs: number) {}\n\n /** Devuelve true si el elemento puede emitir ahora (y registra el disparo). */\n shouldFire(element: Element): boolean {\n const now = Date.now();\n const last = this.lastFired.get(element) ?? 0;\n\n if (now - last < this.windowMs) return false;\n\n this.lastFired.set(element, now);\n return true;\n }\n}\n","import type { VeoAutocaptureConfig, VeoPlugin } from '../../types';\nimport { definePlugin } from '../plugin';\nimport { DomListener } from './dom-listener';\n\n/**\n * Plugin de autocaptura de eventos del DOM.\n * Captura clicks, submits y changes automáticamente y los emite como\n * eventos `track('$autocapture', …)` por la Queue del cliente.\n */\nexport function autocapturePlugin(config: VeoAutocaptureConfig = {}): VeoPlugin {\n let listener: DomListener | null = null;\n\n return definePlugin({\n name: 'autocapture',\n install(client) {\n listener = new DomListener(client, config);\n listener.install();\n },\n destroy() {\n listener?.destroy();\n listener = null;\n },\n });\n}\n\nexport { DomListener } from './dom-listener';\nexport type { AutocapturePayload } from './element-serializer';\n","import type { VeoPlugin } from '../types';\nimport { hasWindow } from '../utils/safe-env';\nimport { definePlugin } from './plugin';\n\n/**\n * Plugin que auto-emite `pageview` en cambios de ruta de una SPA.\n * Cubre `history.pushState`, `history.replaceState`, `popstate` y `hashchange`.\n */\nexport function spaRouterPlugin(): VeoPlugin {\n return definePlugin({\n name: 'spa-router',\n install(client) {\n if (!hasWindow()) return;\n\n // Pageview inicial.\n client.pageview();\n\n const fire = () => {\n // Diferir para que el router del host actualice location.pathname primero.\n queueMicrotask(() => client.pageview());\n };\n\n const origPushState = window.history.pushState;\n const origReplaceState = window.history.replaceState;\n\n window.history.pushState = function (\n this: History,\n ...args: Parameters<History['pushState']>\n ): void {\n origPushState.apply(this, args);\n fire();\n };\n\n window.history.replaceState = function (\n this: History,\n ...args: Parameters<History['replaceState']>\n ): void {\n origReplaceState.apply(this, args);\n fire();\n };\n\n window.addEventListener('popstate', fire);\n window.addEventListener('hashchange', fire);\n },\n });\n}\n","import type { ActionPayload, ActionType, IdentifyRequest } from '../contract/v1';\nimport { DEFAULT_FLUSH_BATCH_SIZE, DEFAULT_FLUSH_INTERVAL_MS, SDK_VERSION } from '../contract/v1';\nimport type {\n VeoClient,\n VeoClientEventListener,\n VeoClientEventName,\n VeoClientEvents,\n VeoConfig,\n VeoOrganization,\n VeoPlugin,\n VeoVisitor,\n} from '../types';\nimport { hasDocument, hasWindow } from '../utils/safe-env';\nimport { uuidv7 } from '../utils/uuid';\nimport { resolveApiUrl } from './api-url';\nimport { Queue } from './queue';\nimport { Session } from './session';\nimport { createStorage, type StorageAdapter } from './storage';\nimport { Transport } from './transport';\n\nconst ORGANIZATION_ID_KEY = 'organization_id';\nconst END_USER_ID_KEY = 'end_user_id';\nconst IDENTIFY_SIG_KEY = 'identify_signature';\n\n/**\n * `JSON.stringify` con claves ordenadas (recursivo) para que la firma de\n * identidad sea estable sin importar el orden en que la app arme el objeto\n * de traits/attributes. Sin esto, `{a,b}` y `{b,a}` darían firmas distintas\n * y el identify se reenviaría sin que nada haya cambiado.\n */\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? 'null';\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`;\n const entries = Object.keys(value as Record<string, unknown>)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${stableStringify((value as Record<string, unknown>)[k])}`);\n return `{${entries.join(',')}}`;\n}\n\n/** Campos opcionales que cada API pública aporta al construir el evento. */\ninterface EnqueueInput {\n actionType: ActionType;\n actionName?: string;\n pageUrl?: string;\n pagePath?: string;\n pageTitle?: string;\n pageReferrer?: string;\n actionProperties?: Record<string, unknown>;\n}\n\n/**\n * Cliente principal del SDK. Expone la API pública (`identify`, `track`,\n * `pageview`, `reset`, `flush`, `use`). Toda la API salvo `flush()` es síncrona:\n * los eventos se encolan y la llamada retorna de inmediato.\n */\nexport class Client implements VeoClient {\n private readonly transport: Transport;\n private readonly storage: StorageAdapter;\n private readonly session: Session;\n private readonly queue: Queue<ActionPayload>;\n private readonly plugins: VeoPlugin[] = [];\n private currentOrganizationId: string | null = null;\n private readonly listeners: {\n [E in VeoClientEventName]: Set<VeoClientEventListener<E>>;\n } = {\n pageview: new Set(),\n identify: new Set(),\n };\n\n constructor(private readonly config: VeoConfig) {\n if (!config.apiKey) throw new Error('apiKey is required');\n\n this.storage = createStorage(config.storage ?? 'localStorage');\n this.session = new Session(this.storage);\n\n this.transport = new Transport({\n apiKey: config.apiKey,\n apiUrl: resolveApiUrl(config).replace(/\\/$/, ''),\n sdkVersion: SDK_VERSION,\n });\n\n this.queue = new Queue<ActionPayload>({\n transport: this.transport,\n flushIntervalMs: config.flushInterval ?? DEFAULT_FLUSH_INTERVAL_MS,\n batchSize: config.flushBatchSize ?? DEFAULT_FLUSH_BATCH_SIZE,\n onError: (err) => {\n if (config.debug) console.error('[veo] flush error:', err);\n },\n });\n\n // Rehidratar identidad persistida.\n const persistedUserId = this.storage.get(END_USER_ID_KEY);\n if (persistedUserId) this.session.setEndUserId(persistedUserId);\n\n const persistedOrgId = this.storage.get(ORGANIZATION_ID_KEY);\n if (persistedOrgId) this.currentOrganizationId = persistedOrgId;\n\n this.setupUnloadHandlers();\n\n if (config.debug) {\n console.log('[veo] initialized', {\n anonymousId: this.session.anonymousId,\n sessionId: this.session.sessionId,\n endUserId: this.session.endUserId,\n });\n }\n }\n\n identify(payload: { visitor: VeoVisitor; organization?: VeoOrganization }): void {\n const { visitor, organization } = payload;\n\n // Idempotencia: si ya estamos identificados como este visitor y ni los\n // traits ni la organización cambiaron, no reenviamos. Esto evita el spam\n // de identify cuando la app lo llama en cada carga/navegación (un patrón\n // común y recomendado): el SDK absorbe la repetición en vez de generar un\n // evento `identify` y un POST /v1/identify por cada render.\n const signature = stableStringify({\n id: visitor.id,\n traits: visitor.traits ?? {},\n org: organization ? { id: organization.id, attributes: organization.attributes ?? {} } : null,\n });\n if (this.session.endUserId === visitor.id && this.storage.get(IDENTIFY_SIG_KEY) === signature) {\n if (this.config.debug) console.debug('[veo] identify: sin cambios, omitido');\n return;\n }\n\n // Capturar el anonymous previo ANTES de mutar la identidad, para el merge en backend.\n const previousAnonymousId =\n this.session.endUserId === null ? this.session.anonymousId : undefined;\n\n this.session.setEndUserId(visitor.id);\n if (organization) {\n this.currentOrganizationId = organization.id;\n this.storage.set(ORGANIZATION_ID_KEY, organization.id);\n }\n\n // 1. Upsert de traits/attributes en /v1/identify (fire-and-forget).\n const endUser: IdentifyRequest['endUser'] = {\n id: visitor.id,\n traits: visitor.traits ?? {},\n ...(previousAnonymousId !== undefined ? { anonymousId: previousAnonymousId } : {}),\n };\n const body: IdentifyRequest = {\n endUser,\n ...(organization\n ? { organization: { id: organization.id, attributes: organization.attributes ?? {} } }\n : {}),\n };\n void this.transport.send('/v1/identify', body).catch((err) => {\n if (this.config.debug) console.error('[veo] identify failed:', err);\n });\n\n // 2. Registrar el evento \"identify\" en el log de acciones.\n this.enqueue({\n actionType: 'identify',\n actionProperties: {\n traits: visitor.traits,\n organizationAttributes: organization?.attributes,\n },\n });\n\n this.storage.set(IDENTIFY_SIG_KEY, signature);\n\n this.emit('identify', { endUserId: visitor.id, sessionId: this.session.sessionId });\n }\n\n track(name: string, properties?: Record<string, unknown>): void {\n if (!name || typeof name !== 'string') {\n if (this.config.debug) console.error('[veo] track: name is required');\n return;\n }\n this.enqueue({\n actionType: 'track',\n actionName: name,\n ...(properties !== undefined ? { actionProperties: properties } : {}),\n });\n }\n\n pageview(path?: string): void {\n if (!hasDocument()) return;\n\n const url = window.location.href;\n const pagePath = path ?? window.location.pathname;\n\n this.enqueue({\n actionType: 'pageview',\n pageUrl: url,\n pagePath,\n pageTitle: document.title,\n pageReferrer: document.referrer,\n });\n\n this.emit('pageview', {\n url,\n path: pagePath,\n sessionId: this.session.sessionId,\n endUserId: this.session.endUserId,\n });\n }\n\n reset(): void {\n this.session.reset();\n this.currentOrganizationId = null;\n this.storage.remove(ORGANIZATION_ID_KEY);\n this.storage.remove(END_USER_ID_KEY);\n this.storage.remove(IDENTIFY_SIG_KEY);\n }\n\n flush(): Promise<void> {\n return this.queue.flush();\n }\n\n use(plugin: VeoPlugin): VeoClient {\n this.plugins.push(plugin);\n plugin.install(this);\n return this;\n }\n\n getEndUserId(): string | null {\n return this.session.endUserId;\n }\n\n getAnonymousId(): string {\n return this.session.anonymousId;\n }\n\n getSessionId(): string {\n return this.session.sessionId;\n }\n\n /**\n * Suscribe `listener` a `event`. Devuelve una función para desuscribir.\n * Los errores en listeners se logean en debug mode pero NO se propagan\n * (un plugin no debe poder romper a otro).\n */\n on<E extends VeoClientEventName>(event: E, listener: VeoClientEventListener<E>): () => void {\n this.listeners[event].add(listener);\n return () => {\n this.listeners[event].delete(listener);\n };\n }\n\n private emit<E extends VeoClientEventName>(event: E, payload: VeoClientEvents[E]): void {\n for (const listener of this.listeners[event]) {\n try {\n listener(payload);\n } catch (err) {\n if (this.config.debug) console.error(`[veo] listener for '${event}' failed:`, err);\n }\n }\n }\n\n /**\n * Construye el evento completo y lo agrega a la queue. Omite los campos\n * opcionales no definidos (exigido por `exactOptionalPropertyTypes`).\n * @internal\n */\n private enqueue(input: EnqueueInput): void {\n this.session.touch();\n\n const organizationId = this.currentOrganizationId ?? undefined;\n const pageUrl = input.pageUrl ?? (hasWindow() ? window.location.href : undefined);\n const pagePath = input.pagePath ?? (hasWindow() ? window.location.pathname : undefined);\n const pageTitle = input.pageTitle ?? (hasDocument() ? document.title : undefined);\n const pageReferrer = input.pageReferrer ?? (hasDocument() ? document.referrer : undefined);\n\n const event: ActionPayload = {\n actionId: uuidv7(),\n endUserId: this.session.effectiveUserId,\n sessionId: this.session.sessionId,\n actionType: input.actionType,\n occurredAt: new Date().toISOString(),\n ...(organizationId !== undefined ? { organizationId } : {}),\n ...(input.actionName !== undefined ? { actionName: input.actionName } : {}),\n ...(pageUrl !== undefined ? { pageUrl } : {}),\n ...(pagePath !== undefined ? { pagePath } : {}),\n ...(pageTitle !== undefined ? { pageTitle } : {}),\n ...(pageReferrer !== undefined ? { pageReferrer } : {}),\n ...(input.actionProperties !== undefined ? { actionProperties: input.actionProperties } : {}),\n };\n\n this.queue.add(event);\n }\n\n private setupUnloadHandlers(): void {\n if (!hasWindow()) return;\n\n window.addEventListener('pagehide', () => this.queue.flushBeacon());\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n this.queue.flushBeacon();\n }\n });\n }\n}\n","import type { Transport } from './transport';\n\nexport interface QueueConfig {\n transport: Transport;\n flushIntervalMs: number;\n batchSize: number;\n maxRetries?: number;\n onError?: (error: Error) => void;\n}\n\nconst RETRY_MAX_DELAY_MS = 30000;\n\n/**\n * Buffer de eventos con envío en batch, flush por intervalo o por tamaño, y\n * reintentos con backoff exponencial ante fallos de red. Los eventos que fallan\n * se re-encolan al inicio para preservar el orden.\n */\nexport class Queue<T = unknown> {\n private buffer: T[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushing = false;\n private retryCount = 0;\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private readonly config: QueueConfig) {\n this.startTimer();\n }\n\n /** Encola un evento; dispara flush si se alcanza `batchSize`. */\n add(item: T): void {\n this.buffer.push(item);\n if (this.buffer.length >= this.config.batchSize) {\n void this.flush();\n }\n }\n\n /** Flush manual vía `fetch`. Resuelve cuando termina (los retries son diferidos). */\n async flush(): Promise<void> {\n if (this.flushing || this.buffer.length === 0) return;\n\n this.flushing = true;\n const batch = this.buffer.splice(0, this.buffer.length);\n\n try {\n await this.config.transport.send('/v1/events', { events: batch });\n this.retryCount = 0;\n } catch (error) {\n // Re-encolar al INICIO para preservar el orden cronológico.\n this.buffer.unshift(...batch);\n this.scheduleRetry();\n this.config.onError?.(error as Error);\n } finally {\n this.flushing = false;\n }\n }\n\n /** Flush síncrono vía `sendBeacon`, para `pagehide`/`visibilitychange`. */\n flushBeacon(): void {\n if (this.buffer.length === 0) return;\n const batch = this.buffer.splice(0, this.buffer.length);\n const success = this.config.transport.sendBeacon('/v1/events', { events: batch });\n if (!success) {\n // La página se está cerrando; re-encolar es poco útil pero evita pérdida si no se cierra.\n this.buffer.unshift(...batch);\n }\n }\n\n /** Detiene timers internos. Llamar al destruir el cliente. */\n destroy(): void {\n if (this.timer) clearInterval(this.timer);\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.timer = null;\n this.retryTimer = null;\n }\n\n private startTimer(): void {\n this.timer = setInterval(() => {\n void this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private scheduleRetry(): void {\n const maxRetries = this.config.maxRetries ?? 3;\n if (this.retryCount >= maxRetries) {\n this.retryCount = 0;\n return;\n }\n\n this.retryCount++;\n // Backoff exponencial: 1s, 2s, 4s, 8s... con tope de 30s, MÁS jitter.\n // Sin jitter, ante un 5xx del backend TODOS los clientes reintentan en\n // lockstep (1s, 2s, 4s…) y amplifican el pico justo cuando está degradado.\n // Equal jitter: mitad fija + mitad aleatoria → desincroniza la horda.\n const base = Math.min(1000 * 2 ** (this.retryCount - 1), RETRY_MAX_DELAY_MS);\n const delayMs = base / 2 + Math.random() * (base / 2);\n\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.retryTimer = setTimeout(() => {\n void this.flush();\n }, delayMs);\n }\n}\n","import { uuidv7 } from '../utils/uuid';\nimport type { StorageAdapter } from './storage';\n\nconst ANONYMOUS_ID_KEY = 'anonymous_user_id';\nconst END_USER_ID_KEY = 'end_user_id';\nconst SESSION_ID_KEY = 'session_id';\nconst SESSION_LAST_ACTIVE_KEY = 'session_last_active';\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutos\n\n/**\n * Gestiona la identidad triple del SDK:\n * - `anonymousId`: persiste indefinidamente (≥ 1 año).\n * - `endUserId`: presente tras `identify()`.\n * - `sessionId`: se renueva tras 30 min de inactividad.\n */\nexport class Session {\n private _anonymousId: string;\n private _sessionId: string;\n private _endUserId: string | null = null;\n\n constructor(private readonly storage: StorageAdapter) {\n this._anonymousId = this.loadOrCreateAnonymousId();\n this._sessionId = this.loadOrCreateSession();\n // Restaurar la identidad persistida: sin esto el SDK \"olvida\" al usuario\n // en cada recarga y los eventos posteriores caen al anonymous_id hasta\n // que la app vuelva a llamar identify(). Persistimos end_user_id en\n // setEndUserId(), así que también hay que rehidratarlo aquí.\n this._endUserId = this.storage.get(END_USER_ID_KEY);\n }\n\n get anonymousId(): string {\n return this._anonymousId;\n }\n\n get sessionId(): string {\n return this._sessionId;\n }\n\n get endUserId(): string | null {\n return this._endUserId;\n }\n\n /** ID a usar como visitor en eventos (end_user_id si está identificado, si no anonymous). */\n get effectiveUserId(): string {\n return this._endUserId ?? this._anonymousId;\n }\n\n setEndUserId(id: string): void {\n this._endUserId = id;\n this.storage.set(END_USER_ID_KEY, id);\n }\n\n /** Renueva el timestamp de actividad. Si pasaron > 30 min, genera nueva sesión. */\n touch(): void {\n const lastActive = this.storage.get(SESSION_LAST_ACTIVE_KEY);\n const now = Date.now();\n\n if (lastActive && now - Number.parseInt(lastActive, 10) > SESSION_TIMEOUT_MS) {\n this._sessionId = uuidv7();\n this.storage.set(SESSION_ID_KEY, this._sessionId);\n }\n\n this.storage.set(SESSION_LAST_ACTIVE_KEY, String(now));\n }\n\n /** Limpia la identidad (reset) pero conserva el anonymous_id. */\n reset(): void {\n this._endUserId = null;\n this.storage.remove(END_USER_ID_KEY);\n // Regenerar sesión.\n this._sessionId = uuidv7();\n this.storage.set(SESSION_ID_KEY, this._sessionId);\n this.storage.set(SESSION_LAST_ACTIVE_KEY, String(Date.now()));\n }\n\n private loadOrCreateAnonymousId(): string {\n let id = this.storage.get(ANONYMOUS_ID_KEY);\n if (!id) {\n id = uuidv7();\n this.storage.set(ANONYMOUS_ID_KEY, id);\n }\n return id;\n }\n\n private loadOrCreateSession(): string {\n const existing = this.storage.get(SESSION_ID_KEY);\n const lastActive = this.storage.get(SESSION_LAST_ACTIVE_KEY);\n\n if (existing && lastActive) {\n const elapsed = Date.now() - Number.parseInt(lastActive, 10);\n if (elapsed < SESSION_TIMEOUT_MS) {\n return existing;\n }\n }\n\n const newId = uuidv7();\n this.storage.set(SESSION_ID_KEY, newId);\n this.storage.set(SESSION_LAST_ACTIVE_KEY, String(Date.now()));\n return newId;\n }\n}\n","import { hasDocument, hasLocalStorage } from '../utils/safe-env';\n\n/**\n * Contrato común de todos los backends de almacenamiento persistente.\n * Las claves se guardan internamente con el prefijo `veo:`.\n */\nexport interface StorageAdapter {\n get(key: string): string | null;\n set(key: string, value: string, options?: { ttlMs?: number }): void;\n remove(key: string): void;\n /** Borra únicamente las claves del SDK (prefijo `veo:`). */\n clear(): void;\n}\n\nconst STORAGE_PREFIX = 'veo:';\n/** TTL por defecto para cookies (1 año), satisface la persistencia del anonymous id. */\nconst ONE_YEAR_MS = 365 * 24 * 60 * 60 * 1000;\n\n/** Backend basado en `localStorage`. Persistencia indefinida (ignora `ttlMs`). */\nclass LocalStorageAdapter implements StorageAdapter {\n get(key: string): string | null {\n return localStorage.getItem(STORAGE_PREFIX + key);\n }\n\n set(key: string, value: string): void {\n try {\n localStorage.setItem(STORAGE_PREFIX + key, value);\n } catch {\n // Cuota llena o storage bloqueado: ignorar silenciosamente.\n }\n }\n\n remove(key: string): void {\n localStorage.removeItem(STORAGE_PREFIX + key);\n }\n\n clear(): void {\n const toRemove: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(STORAGE_PREFIX)) toRemove.push(key);\n }\n for (const key of toRemove) localStorage.removeItem(key);\n }\n}\n\n/** Lee y trocea `document.cookie`. Solo se invoca cuando hay `document`. */\nfunction readCookies(): string[] {\n const raw = document.cookie;\n return raw === '' ? [] : raw.split('; ');\n}\n\n/** Backend basado en cookies de primer nivel. Usa `ttlMs` (default 1 año). */\nclass CookieAdapter implements StorageAdapter {\n get(key: string): string | null {\n const name = `${STORAGE_PREFIX}${key}=`;\n for (const cookie of readCookies()) {\n if (cookie.startsWith(name)) {\n return decodeURIComponent(cookie.slice(name.length));\n }\n }\n return null;\n }\n\n set(key: string, value: string, options?: { ttlMs?: number }): void {\n const maxAgeSec = Math.floor((options?.ttlMs ?? ONE_YEAR_MS) / 1000);\n const secure =\n typeof location !== 'undefined' && location.protocol === 'https:' ? '; Secure' : '';\n // biome-ignore lint/suspicious/noDocumentCookie: necesitamos escritura síncrona y cero deps; la Cookie Store API es async y no universal.\n document.cookie = `${STORAGE_PREFIX}${key}=${encodeURIComponent(\n value,\n )}; Path=/; Max-Age=${maxAgeSec}; SameSite=Lax${secure}`;\n }\n\n remove(key: string): void {\n // biome-ignore lint/suspicious/noDocumentCookie: ver set(); expiramos la cookie con Max-Age=0.\n document.cookie = `${STORAGE_PREFIX}${key}=; Path=/; Max-Age=0; SameSite=Lax`;\n }\n\n clear(): void {\n for (const cookie of readCookies()) {\n const eq = cookie.indexOf('=');\n const name = eq === -1 ? cookie : cookie.slice(0, eq);\n if (name.startsWith(STORAGE_PREFIX)) {\n this.remove(name.slice(STORAGE_PREFIX.length));\n }\n }\n }\n}\n\n/** Backend en memoria. Fallback cuando no hay browser storage (SSR, incógnito). */\nclass MemoryAdapter implements StorageAdapter {\n private store = new Map<string, string>();\n\n get(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n\n/**\n * Crea el adapter de almacenamiento, respetando la preferencia del usuario y\n * cayendo a la mejor alternativa disponible si la preferida no existe.\n */\nexport function createStorage(\n preferred: 'localStorage' | 'cookie' | 'memory' = 'localStorage',\n): StorageAdapter {\n if (preferred === 'localStorage' && hasLocalStorage()) return new LocalStorageAdapter();\n if (preferred === 'cookie' && hasDocument()) return new CookieAdapter();\n if (preferred === 'memory') return new MemoryAdapter();\n\n // Cadena de fallback.\n if (hasLocalStorage()) return new LocalStorageAdapter();\n if (hasDocument()) return new CookieAdapter();\n return new MemoryAdapter();\n}\n","import { hasNavigatorSendBeacon } from '../utils/safe-env';\n\nexport interface TransportConfig {\n apiUrl: string;\n apiKey: string;\n sdkVersion: string;\n timeoutMs?: number;\n}\n\n/** Error de transporte con el código HTTP asociado (0 si fue un fallo de red). */\nexport class TransportError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n ) {\n super(message);\n this.name = 'TransportError';\n }\n}\n\n/**\n * Capa de red del SDK. Envía JSON al backend vía `fetch` (con timeout) y\n * ofrece `sendBeacon` para descargas fiables al cerrar la página.\n */\nexport class Transport {\n constructor(private readonly config: TransportConfig) {}\n\n /** Envío normal con `fetch`. Lanza `TransportError` si la respuesta no es OK. */\n async send<T = unknown>(path: string, body: unknown): Promise<T> {\n const url = `${this.config.apiUrl}${path}`;\n const controller = new AbortController();\n const timeoutMs = this.config.timeoutMs ?? 10000;\n // Abortamos con un motivo explícito para que el log sea claro\n // (`TimeoutError`) en vez del confuso \"signal is aborted without reason\".\n const timeoutId = setTimeout(\n () =>\n controller.abort(new DOMException(`Veo request timeout (${timeoutMs}ms)`, 'TimeoutError')),\n timeoutMs,\n );\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Api-Key': this.config.apiKey,\n 'X-Sdk-Version': this.config.sdkVersion,\n },\n body: JSON.stringify(body),\n // NO usar `keepalive: true` en los flushes normales: tiene límites\n // estrictos del navegador (cuota de requests/64KB) y produce abortos\n // espurios cuando hay varios envíos seguidos. El envío fiable al cerrar\n // la página ya lo cubre `sendBeacon()` (ver Queue.flushBeacon).\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new TransportError(`HTTP ${response.status}`, response.status);\n }\n\n return (await response.json()) as T;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Envío con `navigator.sendBeacon`. Fire-and-forget, pensado para `pagehide`.\n * Como sendBeacon no admite headers, la API key viaja por query string.\n */\n sendBeacon(path: string, body: unknown): boolean {\n if (!hasNavigatorSendBeacon()) return false;\n\n const url = new URL(`${this.config.apiUrl}${path}`);\n url.searchParams.set('key', this.config.apiKey);\n url.searchParams.set('v', this.config.sdkVersion);\n\n const blob = new Blob([JSON.stringify(body)], { type: 'application/json' });\n return navigator.sendBeacon(url.toString(), blob);\n }\n}\n","import { autocapturePlugin } from '../plugins/autocapture';\nimport { spaRouterPlugin } from '../plugins/spa-router';\nimport type { VeoClient, VeoConfig } from '../types';\nimport { resolveApiUrl } from './api-url';\nimport { maybeLoadBuilder } from './builder-loader';\nimport { Client } from './client';\n\n/**\n * Setup común del cliente, compartido por el entry ESM/CJS (`index.ts`, guías\n * estáticas) y el IIFE (`veo.ts`, guías perezosas). NO importa el plugin de\n * guías: la instalación va por el callback `onGuides`, así el bundle IIFE puede\n * quedar sin los renderers.\n *\n * Hace: client + spa-router + autocapture, instala guías vía callback, asigna\n * `window.veo` drenando la cola del snippet, y dispara el loader del builder.\n */\nexport function setupClient(\n config: VeoConfig,\n onGuides: (client: VeoClient) => void,\n loadBuilder?: () => Promise<unknown>,\n): VeoClient {\n const client = new Client(config);\n\n client.use(spaRouterPlugin());\n\n if (config.autocapture !== false) {\n const autocaptureConfig = typeof config.autocapture === 'object' ? config.autocapture : {};\n client.use(autocapturePlugin(autocaptureConfig));\n }\n\n // Guías (opt-in): el caller decide instalarlas sync (bundler) o lazy (IIFE).\n onGuides(client);\n\n if (typeof window !== 'undefined') {\n const stub = (window as unknown as { veo?: { _q?: unknown[][] } }).veo;\n const pending = stub?._q ?? [];\n\n (window as unknown as { veo: VeoClient }).veo = client;\n\n for (const entry of pending) {\n const [method, args] = entry;\n if (method === 'init') continue; // ya inicializado\n const fn = (client as unknown as Record<string, (...a: unknown[]) => unknown>)[\n method as string\n ];\n if (typeof fn === 'function') {\n try {\n fn.apply(client, Array.from(args as ArrayLike<unknown>));\n } catch (err) {\n if (config.debug) console.error('[veo] drain error:', err);\n }\n }\n }\n\n maybeLoadBuilder({\n ...(config.builderUrl !== undefined ? { builderUrl: config.builderUrl } : {}),\n ...(config.debug !== undefined ? { debug: config.debug } : {}),\n ...(config.apiKey !== undefined ? { apiKey: config.apiKey } : {}),\n apiUrl: resolveApiUrl(config),\n ...(loadBuilder ? { loadBuilder } : {}),\n });\n }\n\n return client;\n}\n","import type { VeoPlugin } from '../../types';\nimport { hasWindow } from '../../utils/safe-env';\nimport { definePlugin } from '../plugin';\nimport { GuidesController } from './guides-controller';\n\nexport interface GuidesPluginConfig {\n apiUrl: string;\n apiKey: string;\n debug?: boolean;\n}\n\n/** Resultado del install — expone el controller para debugging desde el demo. */\nexport interface GuidesPluginHandle {\n controller: GuidesController;\n}\n\n/**\n * Plugin que renderiza guías in-app (modal/banner/tooltip) consultando\n * `GET /v1/guides/resolve` y registra las interacciones en\n * `POST /v1/guides/:id/interactions` vía queue dedicada con retry y\n * sendBeacon en pagehide.\n *\n * Opt-in: `init({ ..., guides: true })`. El plugin escucha\n * `pageview` e `identify` del client; el payload del evento ya trae\n * `sessionId` y `endUserId` para que no necesitemos consultar al\n * client en cada disparo.\n *\n * Frequency híbrida: el backend filtra autoritariamente; el cache\n * local (`GuideFrequencyCache`) solo previene el flash visual cuando\n * la interaction aún no se persistió.\n */\nexport function guidesPlugin(config: GuidesPluginConfig): VeoPlugin {\n return definePlugin({\n name: 'guides',\n install(client) {\n if (!hasWindow()) return;\n const controller = new GuidesController(client, config);\n\n // Exponer el controller en window para que el demo y tests E2E\n // puedan inspeccionar el cache y la queue.\n (window as unknown as { __veoGuides?: GuidesPluginHandle }).__veoGuides = { controller };\n\n client.on('identify', ({ sessionId }) => {\n void controller.checkGuides(window.location.href, sessionId);\n });\n\n client.on('pageview', ({ url, sessionId }) => {\n void controller.checkGuides(url, sessionId);\n });\n\n // Como el bundle de guías se carga PEREZOSAMENTE, el plugin puede\n // instalarse DESPUÉS del pageview/identify inicial — esos eventos ya\n // pasaron. Chequeamos la página actual ahora mismo para que la guía\n // aparezca apenas se entra (sin necesitar una 2ª acción). Si todavía no\n // hay endUserId, checkGuides no hace nada y el listener de `identify` la\n // mostrará; el dedupe por guideId evita un doble render.\n void controller.checkGuides(window.location.href, client.getSessionId());\n },\n });\n}\n\nexport type { PreviewGuideInput, PreviewHandle, PreviewResult } from './guide-preview';\nexport { closeGuidePreview, previewGuide } from './guide-preview';\nexport type { PreviewModeHandle, PreviewModeOptions } from './preview-mode';\nexport { runPreviewMode } from './preview-mode';\nexport type { GuideInteractionEvent, GuideStep, ResolvedGuide } from './types';\n","import type { VeoClient } from '../../types';\nimport {\n DEFAULT_TRACKER_BATCH_SIZE,\n DEFAULT_TRACKER_FLUSH_INTERVAL_MS,\n DEFAULT_TRACKER_MAX_RETRIES,\n} from './constants';\nimport { GuideFrequencyCache, namespaceFromApiKey } from './guide-frequency-cache';\nimport { GuideResolverClient } from './guide-resolver-client';\nimport { GuideTrackerClient } from './guide-tracker-client';\nimport { GuideTrackerQueue } from './guide-tracker-queue';\nimport { BadgeRenderer } from './renderers/badge-renderer';\nimport { BannerRenderer } from './renderers/banner-renderer';\nimport type { BaseRenderer } from './renderers/base-renderer';\nimport { CompositeRenderer } from './renderers/composite-renderer';\nimport { CustomRenderer } from './renderers/custom-renderer';\nimport { FormRenderer } from './renderers/form-renderer';\nimport { InlineCustomRenderer } from './renderers/inline-custom-renderer';\nimport { InlineFormRenderer } from './renderers/inline-form-renderer';\nimport { InlineRenderer } from './renderers/inline-renderer';\nimport { ModalRenderer } from './renderers/modal-renderer';\nimport { TooltipRenderer } from './renderers/tooltip-renderer';\nimport { WalkthroughRenderer } from './renderers/walkthrough-renderer';\nimport type {\n CompositeStep,\n FrequencyStatus,\n GuideInteractionAction,\n GuideInteractionEvent,\n GuideType,\n ResolvedGuide,\n WalkthroughCallbacks,\n} from './types';\nimport { stepMatchesPage } from './url-match';\nimport { WalkthroughStateManager } from './walkthrough-state';\n\nexport interface GuidesControllerConfig {\n apiUrl: string;\n apiKey: string;\n debug?: boolean;\n /** Override del resolver (tests). */\n resolver?: GuideResolverClient;\n /** Override del tracker queue (tests). */\n trackerQueue?: GuideTrackerQueue;\n /** Override del cache (tests). */\n frequencyCache?: GuideFrequencyCache;\n /** Override del walkthrough state manager (tests). */\n walkthroughState?: WalkthroughStateManager;\n}\n\n/**\n * Ventana durante la cual un `resolve` de la MISMA `(endUserId, url)` se sirve\n * de memoria sin pegarle al backend. Corta el doble disparo identify+pageview\n * en la carga y los pageviews repetidos de una SPA (mismo URL re-montado). Las\n * guías no son tiempo-real: 30 s de staleness es imperceptible y baja el\n * volumen de `/v1/guides/resolve` drásticamente con muchos usuarios.\n */\nconst RESOLVE_CACHE_TTL_MS = 30_000;\n\n/** Mapeo `action → cache status`. Solo acciones terminales mutan el cache. */\nconst STATUS_BY_ACTION: Record<GuideInteractionAction, FrequencyStatus | null> = {\n shown: 'shown',\n dismissed: 'dismissed',\n cta_clicked: null,\n step_advanced: null,\n step_back: null,\n completed: 'completed',\n};\n\n/**\n * Orquesta el ciclo de vida de las guías:\n *\n * 1. `pageview`/`identify` → `checkGuides(url, sessionId)`.\n * 2. Si hay un walkthrough activo (estado persistido en localStorage),\n * tiene prioridad: se intenta resumir en la página actual antes de\n * consultar nuevas guías. Si el selector del step actual aparece,\n * se pinta; si no, se cancela el walkthrough limpiamente.\n * 3. Si no hay walkthrough activo, se consulta `/v1/guides/resolve` y\n * se procesa cada guía:\n * - `walkthrough` con varios steps → arranca un walkthrough\n * (uno a la vez; el resto se ignora si ya hay uno).\n * - single-step → modal/banner/tooltip como antes.\n * 4. Cada interaction actualiza el cache local Y se encola para\n * `POST /v1/guides/:id/interactions`.\n *\n * Dedupe: `dispatched` guarda `${guideId}:${action}` ya encolados en la\n * sesión actual del SDK. Las acciones por-step de walkthroughs no\n * usan dedupe — cada `step_advanced` puede repetirse y representa una\n * navegación distinta.\n */\nexport class GuidesController {\n private readonly resolver: GuideResolverClient;\n private readonly trackerQueue: GuideTrackerQueue;\n private readonly frequencyCache: GuideFrequencyCache;\n private readonly walkthroughState: WalkthroughStateManager;\n private readonly debug: boolean;\n /** Para `POST /v1/guides/:id/form-response` (respuestas de guías form). */\n private readonly apiUrl: string;\n private readonly apiKey: string;\n private readonly activeRenderers = new Set<BaseRenderer>();\n /**\n * Guías single-step actualmente en pantalla, por `guideId`. Evita repintar/\n * duplicar la misma guía en cada pageview de una SPA (p.ej. una guía inline\n * anclada a un elemento persistente). Se libera al cerrarse la guía.\n */\n private readonly activeByGuideId = new Map<string, BaseRenderer>();\n private readonly dispatched = new Set<string>();\n /**\n * Renderer del paso de walkthrough activo. Puede ser el `WalkthroughRenderer`\n * (tooltip anclado) o un Modal/Banner con navegación (walkthrough heterogéneo);\n * tipamos por `destroy()`, lo único que el controller necesita.\n */\n private activeWalkthroughRenderer: { destroy(): void } | null = null;\n private activeWalkthroughGuide: ResolvedGuide | null = null;\n /** Última resolución cacheada (mismo `(endUserId, url)` → sin red). */\n private resolveCache: { key: string; at: number; guides: ResolvedGuide[] } | null = null;\n /** Resolución idéntica en vuelo, para coalescer llamadas concurrentes. */\n private inflightResolve: { key: string; promise: Promise<ResolvedGuide[]> } | null = null;\n /**\n * Disparadores por interacción armados (`on_click`/`on_hover`): guideId →\n * desarme del listener. Se re-arman desde cero en cada `checkGuides` (el\n * resolve fresco manda) y se limpian en `destroy()`.\n */\n private readonly armedTriggers = new Map<string, () => void>();\n /**\n * Tour composite ESPERANDO navegación: el usuario avanzó a un paso cuya\n * `pageLocation` apunta a otra página. Se resume en `checkGuides` cuando llega\n * a esa página (tours multi-página estilo Pendo).\n */\n private pendingComposite: { guide: ResolvedGuide; stepIndex: number } | null = null;\n /**\n * Guías composite EN PANTALLA con el paso mostrado, por `guideId`. En una SPA,\n * al navegar a una página que ya NO matchea la `pageLocation` del paso, hay que\n * DESTRUIR la guía (si no, queda pegada y \"se muestra en todo lado\"). Se poda\n * en cada `checkGuides` con {@link pruneComposite}.\n */\n private readonly activeComposite = new Map<\n string,\n { guide: ResolvedGuide; stepIndex: number; cleanup: () => void }\n >();\n\n constructor(\n private readonly client: VeoClient,\n config: GuidesControllerConfig,\n ) {\n this.debug = config.debug === true;\n this.apiUrl = config.apiUrl;\n this.apiKey = config.apiKey;\n this.resolver =\n config.resolver ?? new GuideResolverClient(config.apiUrl, config.apiKey, this.debug);\n\n if (config.trackerQueue) {\n this.trackerQueue = config.trackerQueue;\n } else {\n const httpClient = new GuideTrackerClient(config.apiUrl, config.apiKey);\n this.trackerQueue = new GuideTrackerQueue({\n client: httpClient,\n flushIntervalMs: DEFAULT_TRACKER_FLUSH_INTERVAL_MS,\n batchSize: DEFAULT_TRACKER_BATCH_SIZE,\n maxRetries: DEFAULT_TRACKER_MAX_RETRIES,\n onError: (err, item) => {\n if (this.debug) {\n console.warn(\n `[veo] dropped guide interaction after retries: guideId=${item.guideId} action=${item.payload.action}`,\n err,\n );\n }\n },\n });\n }\n\n const namespace = namespaceFromApiKey(config.apiKey);\n this.frequencyCache = config.frequencyCache ?? new GuideFrequencyCache(namespace);\n this.walkthroughState = config.walkthroughState ?? new WalkthroughStateManager(namespace);\n }\n\n /** Cuántas interactions hay pendientes de envío. Útil para debug en demo. */\n get pendingInteractions(): number {\n return this.trackerQueue.size;\n }\n\n /** Limpia el cache local (botón \"reset\" del demo, tests). */\n clearFrequencyCache(): void {\n this.frequencyCache.clear();\n }\n\n /** Limpia el walkthrough activo (debug del demo). */\n clearWalkthroughState(): void {\n this.tearDownWalkthrough();\n }\n\n /** Punto de entrada principal. Llamado en cada pageview/identify. */\n async checkGuides(pageUrl: string, sessionId: string): Promise<void> {\n const endUserId = this.client.getEndUserId();\n if (!endUserId) {\n if (this.debug) console.log('[veo] guides: skipped, no endUserId yet');\n return;\n }\n\n // Poda las guías composite en pantalla cuyo paso ya NO aplica a esta URL\n // (navegación en SPA): sin esto quedan pegadas y \"se muestran en todo lado\".\n this.pruneComposite(pageUrl);\n\n if (await this.tryResumeWalkthrough(endUserId, sessionId, pageUrl)) {\n return;\n }\n\n // Tour composite multi-página: si hay un paso pendiente que aplica a ESTA\n // página, resúmelo. No corta el resto del flujo (otras guías pueden mostrarse).\n this.tryResumeComposite(sessionId, pageUrl);\n\n let guides: ResolvedGuide[];\n try {\n guides = await this.resolveGuides(endUserId, pageUrl);\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolver threw:', err);\n return;\n }\n if (this.debug) console.log(`[veo] guides: ${guides.length} eligible at ${pageUrl}`);\n\n // Los disparadores por interacción se re-arman desde el resolve fresco:\n // desarmar todo primero es idempotente y maneja las SPAs (la guía que ya\n // no aplica a esta URL no queda armada de una navegación anterior).\n this.disarmTriggers();\n\n for (const guide of guides) {\n const trigger = guide.activationRules.trigger;\n if ((trigger === 'on_click' || trigger === 'on_hover') && guide.activationRules.selector) {\n this.armInteractionTrigger(guide, endUserId, sessionId, pageUrl);\n continue;\n }\n await this.showGuide(guide, endUserId, sessionId, pageUrl);\n }\n }\n\n /**\n * Muestra una guía elegible (filtro de frecuencia + dedupe + dispatch por\n * tipo). Cuerpo original del loop de `checkGuides`, extraído para que los\n * disparadores por interacción pasen por LOS MISMOS chequeos al disparar.\n */\n private async showGuide(\n guide: ResolvedGuide,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<void> {\n if (this.frequencyCache.shouldFilter(guide.guideId, guide.displayFrequency)) {\n if (this.debug) console.log(`[veo] guides: filtered locally guideId=${guide.guideId}`);\n return;\n }\n\n // Ya está en pantalla → no repintar/duplicar (clave en SPAs: cada\n // navegación dispara un pageview, pero la guía sigue montada).\n if (this.activeByGuideId.has(guide.guideId)) {\n if (this.debug) console.log(`[veo] guides: already shown guideId=${guide.guideId}`);\n return;\n }\n\n if (guide.guideType === 'walkthrough' && guide.guideSteps.length > 1) {\n if (this.walkthroughState.hasActive()) {\n if (this.debug)\n console.log(`[veo] guides: walkthrough ${guide.guideId} skipped (another active)`);\n return;\n }\n await this.startWalkthrough(guide, endUserId, sessionId, pageUrl);\n // Las guías single-step pueden seguir mostrándose en paralelo. Solo se\n // bloquean OTROS walkthroughs vía hasActive().\n return;\n }\n\n // Modelo unificado: targeting de página POR-PASO + navegación multi-paso.\n if (guide.guideType === 'composite') {\n this.startComposite(guide, sessionId, pageUrl);\n return;\n }\n\n this.runSingleStepRender(guide, sessionId, pageUrl);\n }\n\n /**\n * Arma un disparador por interacción: la guía NO se muestra al cargar, sino\n * cuando el usuario hace click / pasa el mouse sobre `activationRules.selector`.\n * Listener DELEGADO en `document` (fase captura, sin preventDefault — el click\n * original de la app sigue funcionando). Al disparar se desarma y la guía pasa\n * por `showGuide` (mismos chequeos de frecuencia/dedupe). Tras cerrarse, el\n * próximo pageview/identify la re-arma — hover/click vuelve a mostrarla\n * mientras la frecuencia lo permita.\n */\n private armInteractionTrigger(\n guide: ResolvedGuide,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): void {\n // Armar solo lo que tiene sentido mostrar: si la frecuencia ya la filtra o\n // ya está en pantalla, no escuchamos de más.\n if (this.frequencyCache.shouldFilter(guide.guideId, guide.displayFrequency)) return;\n if (this.activeByGuideId.has(guide.guideId)) return;\n if (this.armedTriggers.has(guide.guideId)) return;\n\n const selector = guide.activationRules.selector as string;\n const eventName = guide.activationRules.trigger === 'on_hover' ? 'mouseover' : 'click';\n\n const onFire = (e: Event): void => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n try {\n if (!target.closest(selector)) return;\n } catch {\n return; // selector inválido en la DB: no romper la app\n }\n disarm();\n void this.showGuide(guide, endUserId, sessionId, pageUrl);\n };\n const disarm = (): void => {\n document.removeEventListener(eventName, onFire, true);\n this.armedTriggers.delete(guide.guideId);\n };\n\n document.addEventListener(eventName, onFire, true);\n this.armedTriggers.set(guide.guideId, disarm);\n if (this.debug)\n console.log(`[veo] guides: armed ${eventName} trigger for ${guide.guideId} on ${selector}`);\n }\n\n /** Desarma todos los disparadores por interacción pendientes. */\n private disarmTriggers(): void {\n for (const disarm of this.armedTriggers.values()) disarm();\n this.armedTriggers.clear();\n }\n\n /**\n * `resolve` con cache de corta duración + coalescing:\n * - Mismo `(endUserId, url)` resuelto hace < {@link RESOLVE_CACHE_TTL_MS} →\n * se reusa sin red. Colapsa el doble disparo identify+pageview y los\n * pageviews repetidos de una SPA hacia la misma URL.\n * - Si ya hay un resolve idéntico en vuelo, se espera ESE (no se abre otro).\n * El re-render sigue siendo idempotente (dedupe por `activeByGuideId` +\n * `frequencyCache`), así que reusar el resultado no duplica guías.\n */\n private async resolveGuides(endUserId: string, pageUrl: string): Promise<ResolvedGuide[]> {\n const key = `${endUserId}\\n${pageUrl}`;\n const now = Date.now();\n\n if (this.resolveCache?.key === key && now - this.resolveCache.at < RESOLVE_CACHE_TTL_MS) {\n if (this.debug) console.log('[veo] guides: resolve cache hit');\n return this.resolveCache.guides;\n }\n\n if (this.inflightResolve?.key === key) {\n return this.inflightResolve.promise;\n }\n\n const promise = this.resolver.resolve(endUserId, pageUrl);\n this.inflightResolve = { key, promise };\n try {\n const guides = await promise;\n this.resolveCache = { key, at: Date.now(), guides };\n return guides;\n } finally {\n if (this.inflightResolve?.key === key) this.inflightResolve = null;\n }\n }\n\n /** Cierra todas las guías activas, limpia cache de dispatch y para timers. */\n destroy(): void {\n for (const renderer of this.activeRenderers) {\n try {\n renderer.destroy();\n } catch (err) {\n if (this.debug) console.error('[veo] renderer destroy failed:', err);\n }\n }\n this.activeRenderers.clear();\n this.activeByGuideId.clear();\n this.activeComposite.clear();\n if (this.activeWalkthroughRenderer) {\n try {\n this.activeWalkthroughRenderer.destroy();\n } catch {\n // swallow — el cleanup no debe propagar\n }\n this.activeWalkthroughRenderer = null;\n this.activeWalkthroughGuide = null;\n }\n this.disarmTriggers();\n this.dispatched.clear();\n this.resolveCache = null;\n this.inflightResolve = null;\n this.trackerQueue.destroy();\n }\n\n private runSingleStepRender(guide: ResolvedGuide, sessionId: string, pageUrl: string): void {\n const renderer = this.createSingleStepRenderer(guide.guideType);\n if (!renderer) return;\n\n // Reservar el slot YA (antes del delay) para que pageviews rápidos no\n // disparen dos renders de la misma guía.\n this.activeByGuideId.set(guide.guideId, renderer);\n\n const delayMs = guide.activationRules.delayMs ?? 0;\n window.setTimeout(\n () => this.mountSingleStepRenderer(guide, renderer, sessionId, pageUrl),\n delayMs,\n );\n }\n\n /**\n * Camino del modelo unificado (`composite`). Elige el PRIMER paso cuya\n * `pageLocation` matchea la URL actual (targeting por-paso) y lo pinta con el\n * `CompositeRenderer`. Si ningún paso aplica a esta página, no muestra nada.\n */\n private startComposite(guide: ResolvedGuide, sessionId: string, pageUrl: string): void {\n // Ya hay un tour de esta guía a mitad de camino (esperando navegación) → no\n // reiniciar desde el paso 0; el resume lo maneja `tryResumeComposite`.\n if (this.pendingComposite?.guide.guideId === guide.guideId) return;\n const steps = guide.guideSteps as unknown as CompositeStep[];\n const start = steps.findIndex((s) => stepMatchesPage(s.pageLocation, pageUrl));\n if (start === -1) return; // ningún paso aplica a esta URL\n this.renderCompositeStep(guide, start, sessionId, pageUrl);\n }\n\n /**\n * Destruye las guías composite en pantalla cuyo paso mostrado ya no matchea la\n * URL actual (el usuario navegó fuera de su `pageLocation` en una SPA). Sin\n * esto la guía queda montada en el DOM y aparece en páginas que no debía.\n */\n private pruneComposite(pageUrl: string): void {\n for (const entry of this.activeComposite.values()) {\n const steps = entry.guide.guideSteps as unknown as CompositeStep[];\n const step = steps[entry.stepIndex];\n if (!step || !stepMatchesPage(step.pageLocation, pageUrl)) {\n entry.cleanup(); // borra de activeComposite/activeByGuideId y destruye\n }\n }\n }\n\n /**\n * Resume un tour composite que quedó esperando navegación: si el paso\n * pendiente aplica a la página actual, lo pinta. Devuelve `true` si resumió.\n */\n private tryResumeComposite(sessionId: string, pageUrl: string): boolean {\n const pending = this.pendingComposite;\n if (!pending) return false;\n const steps = pending.guide.guideSteps as unknown as CompositeStep[];\n const step = steps[pending.stepIndex];\n if (!step) {\n this.pendingComposite = null;\n return false;\n }\n if (!stepMatchesPage(step.pageLocation, pageUrl)) return false; // aún no llegó\n this.pendingComposite = null;\n this.renderCompositeStep(pending.guide, pending.stepIndex, sessionId, pageUrl);\n return true;\n }\n\n /**\n * Pinta UN paso composite. En guías multi-paso pasa `nav` al renderer para\n * que los botones next/prev avancen (misma página); en single-step los\n * botones cierran. Cada avance destruye el paso anterior y monta el siguiente.\n */\n private renderCompositeStep(\n guide: ResolvedGuide,\n idx: number,\n sessionId: string,\n pageUrl: string,\n ): void {\n const steps = guide.guideSteps as unknown as CompositeStep[];\n const renderer = new CompositeRenderer();\n this.activeRenderers.add(renderer);\n this.activeByGuideId.set(guide.guideId, renderer);\n\n const cleanup = (): void => {\n renderer.destroy();\n this.activeRenderers.delete(renderer);\n if (this.activeByGuideId.get(guide.guideId) === renderer) {\n this.activeByGuideId.delete(guide.guideId);\n }\n this.activeComposite.delete(guide.guideId);\n };\n // Registrar el paso mostrado para poder podarlo si el usuario navega a una\n // página que ya no lo matchea (targeting por-paso en SPAs).\n this.activeComposite.set(guide.guideId, { guide, stepIndex: idx, cleanup });\n\n // Avanza a `target`: si ese paso aplica a la página ACTUAL lo pinta ya\n // (tour misma-página); si apunta a OTRA página, guarda el pendiente y espera\n // a que el usuario navegue (tour multi-página, se resume en `checkGuides`).\n const goToStep = (target: number): void => {\n cleanup();\n if (target < 0 || target >= steps.length) return; // fuera de rango → fin\n const step = steps[target];\n if (step && stepMatchesPage(step.pageLocation, pageUrl)) {\n this.renderCompositeStep(guide, target, sessionId, pageUrl);\n } else {\n this.pendingComposite = { guide, stepIndex: target };\n }\n };\n\n const nav =\n steps.length > 1\n ? {\n stepIndex: idx,\n totalSteps: steps.length,\n callbacks: {\n onNext: (): void => goToStep(idx + 1),\n onBack: (): void => goToStep(idx - 1),\n onGoto: (target: number): void => goToStep(target),\n onSkip: cleanup,\n onComplete: cleanup,\n },\n }\n : undefined;\n\n try {\n void renderer.render({\n guide,\n onInteraction: (e) => this.handleInteraction(guide, sessionId, pageUrl, e),\n onClose: cleanup,\n onTrack: (name, props) => this.client.track(name, props),\n onFormSubmit: (answers) => this.submitFormResponse(guide.guideId, answers),\n onOpenGuide: (targetGuideId) => {\n void this.openGuideById(targetGuideId, sessionId, pageUrl);\n },\n ...(nav ? { nav } : {}),\n });\n } catch (err) {\n if (this.debug) console.error('[veo] composite renderer threw:', err);\n cleanup();\n }\n }\n\n private mountSingleStepRenderer(\n guide: ResolvedGuide,\n renderer: BaseRenderer,\n sessionId: string,\n pageUrl: string,\n ): void {\n this.activeRenderers.add(renderer);\n this.activeByGuideId.set(guide.guideId, renderer);\n\n const onClose = (): void => {\n renderer.destroy();\n this.activeRenderers.delete(renderer);\n if (this.activeByGuideId.get(guide.guideId) === renderer) {\n this.activeByGuideId.delete(guide.guideId);\n }\n };\n\n const onInteraction = (event: GuideInteractionEvent): void => {\n this.handleInteraction(guide, sessionId, pageUrl, event);\n };\n\n const onTrack = (eventName: string, properties?: Record<string, unknown>): void => {\n this.client.track(eventName, properties);\n };\n\n const onFormSubmit = (answers: Record<string, unknown>): Promise<boolean> =>\n this.submitFormResponse(guide.guideId, answers);\n\n // Encadenado: un botón `action:'guide'` abre otra guía por id.\n const onOpenGuide = (targetGuideId: string): void => {\n void this.openGuideById(targetGuideId, sessionId, pageUrl);\n };\n\n try {\n void renderer.render({ guide, onInteraction, onClose, onTrack, onFormSubmit, onOpenGuide });\n } catch (err) {\n if (this.debug) console.error('[veo] renderer.render threw:', err);\n this.activeRenderers.delete(renderer);\n if (this.activeByGuideId.get(guide.guideId) === renderer) {\n this.activeByGuideId.delete(guide.guideId);\n }\n }\n }\n\n /**\n * Abre una guía POR ID, disparada desde el botón de otra guía (encadenado).\n * Ignora las URL rules y el trigger (el autor lo pidió explícitamente desde\n * un botón); respeta el dedupe de guías activas y el flujo normal de\n * tracking. 404/red → no-op (la guía destino pudo borrarse).\n */\n private async openGuideById(guideId: string, sessionId: string, pageUrl: string): Promise<void> {\n if (this.activeByGuideId.has(guideId)) return;\n const guide = await this.resolver.fetchById(guideId);\n if (!guide) {\n if (this.debug) console.warn(`[veo] guides: chained guide ${guideId} not found`);\n return;\n }\n const endUserId = this.client.getEndUserId() ?? this.client.getAnonymousId();\n if (guide.guideType === 'walkthrough' && guide.guideSteps.length > 1) {\n if (!this.walkthroughState.hasActive()) {\n await this.startWalkthrough(guide, endUserId, sessionId, pageUrl);\n }\n return;\n }\n this.runSingleStepRender(guide, sessionId, pageUrl);\n }\n\n /**\n * Si hay un walkthrough persistido, intenta pintar el step actual en\n * la página actual. Retorna `true` si lo intentó (sea éxito o cancel),\n * `false` si no había walkthrough activo.\n *\n * Cancela limpiamente (sin enviar `dismissed` falso) cuando:\n * - La guía fue eliminada en el backend (404 → `fetchById` devuelve null).\n * - La guía cambió de tipo y ya no es walkthrough.\n * - El selector del step actual no aparece dentro del timeout.\n */\n private async tryResumeWalkthrough(\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<boolean> {\n const state = this.walkthroughState.current();\n if (!state) return false;\n\n const guide = await this.resolver.fetchById(state.guideId);\n if (!guide || guide.guideType !== 'walkthrough') {\n if (this.debug)\n console.log(`[veo] guides: walkthrough ${state.guideId} no longer available, cleaning up`);\n this.tearDownWalkthrough();\n return true;\n }\n\n // El cache local podría tener una versión más vieja del total; usamos\n // siempre el del backend.\n const stepIndex = Math.min(state.currentStepIndex, guide.guideSteps.length - 1);\n await this.renderWalkthroughStep(guide, stepIndex, endUserId, sessionId, pageUrl);\n return true;\n }\n\n private async startWalkthrough(\n guide: ResolvedGuide,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<void> {\n this.walkthroughState.start(guide.guideId, guide.guideSteps.length);\n const rendered = await this.renderWalkthroughStep(guide, 0, endUserId, sessionId, pageUrl);\n if (!rendered) return; // teardown ya corrió, no reportamos shown.\n // Reportamos `shown` SOLO al arrancar (step 0). Steps siguientes\n // se cubren con `step_advanced`/`step_back`. Marcamos cache local\n // también para que `displayFrequency='once'` filtre en la próxima\n // pageview aunque la interaction aún esté en la queue.\n this.enqueueInteractionOnce(guide.guideId, endUserId, sessionId, pageUrl, 'shown', 0);\n this.frequencyCache.record(guide.guideId, 'shown');\n }\n\n /**\n * Pinta el step indicado. Reusa la guía (no fetcha): el caller debe\n * traerla. Retorna `true` si el render fue exitoso. En caso contrario\n * ya disparó el teardown — el caller no debe seguir reportando.\n */\n private async renderWalkthroughStep(\n guide: ResolvedGuide,\n stepIndex: number,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n ): Promise<boolean> {\n if (this.activeWalkthroughRenderer) {\n this.activeWalkthroughRenderer.destroy();\n this.activeWalkthroughRenderer = null;\n }\n\n this.activeWalkthroughGuide = guide;\n\n const callbacks: WalkthroughCallbacks = {\n onNext: () => this.handleWalkthroughNext(endUserId, sessionId, pageUrl),\n onBack: () => this.handleWalkthroughBack(endUserId, sessionId, pageUrl),\n onSkip: () => this.handleWalkthroughSkip(endUserId, sessionId, pageUrl),\n onComplete: () => this.handleWalkthroughComplete(endUserId, sessionId, pageUrl),\n };\n\n // Walkthrough HETEROGÉNEO: un paso puede pedir renderizarse como modal o\n // banner (via `step.style.render`). Esos renderers siempre montan (no\n // dependen de un ancla), así que reportamos éxito directo. El resto\n // (tooltip/default) usa el WalkthroughRenderer anclado.\n const step = guide.guideSteps[stepIndex];\n const render = readStepRender(step);\n if (render === 'modal' || render === 'banner') {\n const renderer = render === 'modal' ? new ModalRenderer() : new BannerRenderer();\n try {\n renderer.render({\n guide,\n onInteraction: () => {},\n onClose: () => {},\n nav: { stepIndex, totalSteps: guide.guideSteps.length, callbacks },\n });\n } catch (err) {\n if (this.debug) console.error('[veo] sequence renderer threw:', err);\n this.tearDownWalkthrough();\n return false;\n }\n this.activeWalkthroughRenderer = renderer;\n return true;\n }\n\n const renderer = new WalkthroughRenderer();\n let success = false;\n try {\n success = await renderer.render({ guide, currentStepIndex: stepIndex, callbacks });\n } catch (err) {\n if (this.debug) console.error('[veo] walkthrough renderer threw:', err);\n }\n\n if (!success) {\n if (this.debug)\n console.warn(\n `[veo] walkthrough ${guide.guideId} step ${stepIndex} could not render, cancelling`,\n );\n this.tearDownWalkthrough();\n return false;\n }\n\n this.activeWalkthroughRenderer = renderer;\n return true;\n }\n\n private handleWalkthroughNext(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n if (!guide) return;\n\n const newState = this.walkthroughState.advance();\n if (!newState) {\n // Ya estábamos en el último step. No debería pasar (el botón\n // dispara onComplete en ese caso), pero por defensa lo manejamos.\n this.handleWalkthroughComplete(endUserId, sessionId, pageUrl);\n return;\n }\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'step_advanced',\n newState.currentStepIndex,\n );\n void this.renderWalkthroughStep(\n guide,\n newState.currentStepIndex,\n endUserId,\n sessionId,\n pageUrl,\n );\n }\n\n private handleWalkthroughBack(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n if (!guide) return;\n\n const state = this.walkthroughState.current();\n if (!state || state.currentStepIndex === 0) return;\n\n const newState = this.walkthroughState.back();\n if (!newState) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'step_back',\n newState.currentStepIndex,\n );\n void this.renderWalkthroughStep(\n guide,\n newState.currentStepIndex,\n endUserId,\n sessionId,\n pageUrl,\n );\n }\n\n private handleWalkthroughSkip(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n const state = this.walkthroughState.current();\n if (!guide || !state) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'dismissed',\n state.currentStepIndex,\n );\n this.frequencyCache.record(guide.guideId, 'dismissed');\n this.tearDownWalkthrough();\n }\n\n private handleWalkthroughComplete(endUserId: string, sessionId: string, pageUrl: string): void {\n const guide = this.activeWalkthroughGuide;\n const state = this.walkthroughState.current();\n if (!guide || !state) return;\n\n this.enqueueInteraction(\n guide.guideId,\n endUserId,\n sessionId,\n pageUrl,\n 'completed',\n state.currentStepIndex,\n );\n this.frequencyCache.record(guide.guideId, 'completed');\n this.tearDownWalkthrough();\n }\n\n private tearDownWalkthrough(): void {\n if (this.activeWalkthroughRenderer) {\n try {\n this.activeWalkthroughRenderer.destroy();\n } catch {\n // swallow\n }\n }\n this.activeWalkthroughRenderer = null;\n this.activeWalkthroughGuide = null;\n this.walkthroughState.clear();\n }\n\n /**\n * Tras cada interaction single-step:\n * 1. dedupe (no enviar 2× la misma `(guideId, action)` por sesión)\n * 2. actualizar el cache local si corresponde\n * 3. encolar el POST\n *\n * El endUserId se lee del client EN ESTE MOMENTO (no en el render),\n * por si el usuario se identificó después de que la guía apareció.\n */\n private handleInteraction(\n guide: ResolvedGuide,\n sessionId: string,\n pageUrl: string,\n event: GuideInteractionEvent,\n ): void {\n // Con varios botones por paso, cada botón cuenta aparte: el buttonId entra\n // a la key (si no, el segundo botón clickeado se perdería por dedup).\n const buttonKey = event.metadata?.buttonId ? `:${event.metadata.buttonId}` : '';\n const dedupKey = `${guide.guideId}:${event.action}${buttonKey}`;\n if (this.dispatched.has(dedupKey)) {\n if (this.debug) console.log(`[veo] guides: dedup hit ${dedupKey}`);\n return;\n }\n this.dispatched.add(dedupKey);\n\n const cacheStatus = STATUS_BY_ACTION[event.action];\n if (cacheStatus) this.frequencyCache.record(guide.guideId, cacheStatus);\n\n const endUserId = this.client.getEndUserId();\n if (!endUserId) {\n if (this.debug)\n console.warn('[veo] guides: interaction without endUserId — skipping enqueue');\n return;\n }\n\n this.trackerQueue.enqueue({\n guideId: guide.guideId,\n payload: {\n endUserId,\n sessionId,\n action: event.action,\n stepIndex: event.stepIndex,\n pageUrl,\n pagePath: extractPath(pageUrl),\n ...(event.metadata ? { metadata: event.metadata } : {}),\n },\n });\n }\n\n /**\n * Encola una interacción de walkthrough SIN pasar por el dedup set.\n * Acciones como `step_advanced` se repiten naturalmente (cada next es\n * una navegación distinta) y deduplicarlas perdería datos.\n */\n private enqueueInteraction(\n guideId: string,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n action: GuideInteractionAction,\n stepIndex: number,\n ): void {\n this.trackerQueue.enqueue({\n guideId,\n payload: {\n endUserId,\n sessionId,\n action,\n stepIndex,\n pageUrl,\n pagePath: extractPath(pageUrl),\n },\n });\n }\n\n /**\n * Encola con dedup por sesión del SDK. Para `shown` del primer step:\n * no queremos re-emitirlo si el usuario navega entre dos páginas que\n * matchean el mismo step.\n */\n private enqueueInteractionOnce(\n guideId: string,\n endUserId: string,\n sessionId: string,\n pageUrl: string,\n action: GuideInteractionAction,\n stepIndex: number,\n ): void {\n const dedupKey = `${guideId}:${action}:${stepIndex}`;\n if (this.dispatched.has(dedupKey)) return;\n this.dispatched.add(dedupKey);\n this.enqueueInteraction(guideId, endUserId, sessionId, pageUrl, action, stepIndex);\n }\n\n private createSingleStepRenderer(type: GuideType): BaseRenderer | null {\n switch (type) {\n case 'modal':\n return new ModalRenderer();\n case 'banner':\n return new BannerRenderer();\n case 'tooltip':\n return new TooltipRenderer();\n case 'custom':\n return new CustomRenderer();\n case 'inline':\n return new InlineRenderer();\n case 'inline-custom':\n return new InlineCustomRenderer();\n case 'form':\n return new FormRenderer();\n case 'inline-form':\n return new InlineFormRenderer();\n case 'badge':\n return new BadgeRenderer();\n case 'composite':\n return new CompositeRenderer();\n case 'walkthrough':\n return null;\n default:\n return null;\n }\n }\n\n /**\n * Envía las respuestas de una guía `form` al backend, que las mergea como\n * propiedades del usuario. Usa el endUserId actual (o el anónimo si aún no\n * hubo identify — el backend pre-crea la fila igual que identify).\n */\n private async submitFormResponse(\n guideId: string,\n answers: Record<string, unknown>,\n ): Promise<boolean> {\n const endUserId = this.client.getEndUserId() ?? this.client.getAnonymousId();\n try {\n const res = await fetch(`${this.apiUrl}/v1/guides/${guideId}/form-response`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': this.apiKey },\n body: JSON.stringify({ endUserId, answers }),\n });\n if (!res.ok && this.debug) {\n console.warn('[veo] form-response respondió', res.status);\n }\n return res.ok;\n } catch (err) {\n if (this.debug) console.warn('[veo] form-response falló:', err);\n return false;\n }\n }\n}\n\nfunction extractPath(url: string): string {\n try {\n return new URL(url).pathname;\n } catch {\n return '/';\n }\n}\n\n/**\n * Cómo se presenta un paso dentro de un walkthrough. `style.render` ∈\n * `modal`/`banner` usa esos renderers (con navegación); cualquier otro valor\n * (incluido ausente o `tooltip`) usa el WalkthroughRenderer anclado.\n */\nfunction readStepRender(step: ResolvedGuide['guideSteps'][number] | undefined): string {\n const r = (step?.style as Record<string, unknown> | null | undefined)?.render;\n return typeof r === 'string' ? r : 'walkthrough';\n}\n","import {\n FREQUENCY_CACHE_KEY_PREFIX,\n FREQUENCY_CACHE_MAX_ENTRIES,\n FREQUENCY_CACHE_TTL_MS,\n} from './constants';\nimport type { DisplayFrequency, FrequencyCacheEntry, FrequencyStatus } from './types';\n\n/** Prioridad de status para no degradar shown→dismissed→… */\nconst STATUS_PRIORITY: Record<FrequencyStatus, number> = {\n shown: 1,\n dismissed: 2,\n completed: 2,\n};\n\n/**\n * Namespace short y estable derivado del apiKey. NO es cripto: solo evita\n * que dos apps que comparten el navegador pisen sus caches. El apiKey\n * público (`pk_*`) ya es workspace-único, así que usar sus últimos 16\n * caracteres alcanza para diferenciar.\n */\nexport function namespaceFromApiKey(apiKey: string): string {\n return apiKey.slice(-16) || 'default';\n}\n\n/**\n * Cache persistente de \"qué guías ya vio/cerró este usuario\". Vive en\n * `localStorage` con key namespaceada para evitar colisión entre\n * workspaces que corren en el mismo navegador.\n *\n * No es source of truth — el backend siempre manda. Esta cache solo\n * evita el flash visual de re-pintar una guía que el usuario ya cerró\n * antes de que el roundtrip al backend termine.\n */\nexport class GuideFrequencyCache {\n private readonly storageKey: string;\n private cache: Map<string, FrequencyCacheEntry>;\n\n constructor(namespace: string) {\n this.storageKey = `${FREQUENCY_CACHE_KEY_PREFIX}${namespace}`;\n this.cache = this.load();\n this.prune();\n }\n\n /**\n * Decide si una guía debe filtrarse localmente antes de pintarla.\n *\n * - `every_visit` / `always` → nunca filtra (siempre re-pinta).\n * - `once` → cualquier entry registrada filtra (verla ya cuenta).\n * - `until_dismissed` → si fue descartada O COMPLETADA (responder un\n * form / terminar un walkthrough es más fuerte que descartar — sin\n * esto, una encuesta seguiría preguntando después de respondida).\n */\n shouldFilter(guideId: string, displayFrequency: DisplayFrequency): boolean {\n if (displayFrequency === 'every_visit' || displayFrequency === 'always') return false;\n\n const entry = this.cache.get(guideId);\n if (!entry) return false;\n\n if (displayFrequency === 'once') return true;\n if (displayFrequency === 'until_dismissed') {\n return entry.status === 'dismissed' || entry.status === 'completed';\n }\n // `until_answered` (forms): solo COMPLETAR filtra localmente. El descarte\n // no la silencia — y si las props ya tienen valor por otro medio, es el\n // BACKEND quien la excluye del resolve (aquí no conocemos los traits).\n if (displayFrequency === 'until_answered') return entry.status === 'completed';\n return false;\n }\n\n /**\n * Registra/actualiza la entry de una guía. Nunca degrada un estado más\n * fuerte (no convierte `dismissed` en `shown` por un re-render). Persiste\n * cada llamada — escribir a localStorage es lo bastante barato.\n */\n record(guideId: string, status: FrequencyStatus): void {\n const existing = this.cache.get(guideId);\n if (existing && STATUS_PRIORITY[status] < STATUS_PRIORITY[existing.status]) {\n return;\n }\n this.cache.set(guideId, {\n guideId,\n status,\n lastInteractionAt: Date.now(),\n });\n this.persist();\n }\n\n /** Limpia el cache (botón \"reset\" del demo, tests). */\n clear(): void {\n this.cache.clear();\n this.persist();\n }\n\n /** Útil para debugging — devuelve un snapshot. */\n snapshot(): FrequencyCacheEntry[] {\n return Array.from(this.cache.values());\n }\n\n /**\n * Limpia entries expiradas por TTL y, si aún excede el límite, descarta\n * las más viejas hasta caber. Se ejecuta una vez en el constructor; no\n * vale la pena correrlo a cada lectura.\n */\n private prune(): void {\n const now = Date.now();\n let mutated = false;\n\n for (const [id, entry] of this.cache) {\n if (now - entry.lastInteractionAt > FREQUENCY_CACHE_TTL_MS) {\n this.cache.delete(id);\n mutated = true;\n }\n }\n\n if (this.cache.size > FREQUENCY_CACHE_MAX_ENTRIES) {\n const sorted = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].lastInteractionAt - b[1].lastInteractionAt,\n );\n const excess = this.cache.size - FREQUENCY_CACHE_MAX_ENTRIES;\n for (let i = 0; i < excess; i++) {\n const tuple = sorted[i];\n if (tuple) this.cache.delete(tuple[0]);\n }\n mutated = true;\n }\n\n if (mutated) this.persist();\n }\n\n private load(): Map<string, FrequencyCacheEntry> {\n if (typeof localStorage === 'undefined') return new Map();\n try {\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return new Map();\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) return new Map();\n const entries: Array<[string, FrequencyCacheEntry]> = [];\n for (const item of parsed) {\n if (\n item &&\n typeof item === 'object' &&\n typeof (item as FrequencyCacheEntry).guideId === 'string' &&\n typeof (item as FrequencyCacheEntry).lastInteractionAt === 'number' &&\n ['shown', 'dismissed', 'completed'].includes((item as FrequencyCacheEntry).status)\n ) {\n const e = item as FrequencyCacheEntry;\n entries.push([e.guideId, e]);\n }\n }\n return new Map(entries);\n } catch {\n return new Map();\n }\n }\n\n private persist(): void {\n if (typeof localStorage === 'undefined') return;\n try {\n const serialized = JSON.stringify(Array.from(this.cache.values()));\n localStorage.setItem(this.storageKey, serialized);\n } catch {\n // QuotaExceeded o similar — el cache es opcional, no rompemos la app.\n }\n }\n}\n","import type { ResolvedGuide, ResolveGuidesResponse } from './types';\n\n/**\n * Wrapper sobre `GET /v1/guides/resolve`. Nunca lanza: cualquier error de\n * red o de parsing devuelve un array vacío, para que el plugin no rompa\n * la app del cliente.\n *\n * Importante: el endpoint usa `?pageUrl=...` (no `?url=...`) — el backend\n * valida con class-validator `IsUrl({ require_protocol: true })`.\n */\nexport class GuideResolverClient {\n constructor(\n private readonly apiUrl: string,\n private readonly apiKey: string,\n private readonly debug = false,\n ) {}\n\n async resolve(endUserId: string, pageUrl: string): Promise<ResolvedGuide[]> {\n const params = new URLSearchParams({ endUserId, pageUrl });\n let response: Response;\n try {\n response = await fetch(`${this.apiUrl}/v1/guides/resolve?${params.toString()}`, {\n method: 'GET',\n headers: { 'X-Api-Key': this.apiKey },\n credentials: 'omit',\n });\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolve fetch failed:', err);\n return [];\n }\n\n if (!response.ok) {\n if (this.debug) console.warn('[veo] guides resolve HTTP', response.status);\n return [];\n }\n\n try {\n const data = (await response.json()) as ResolveGuidesResponse;\n return Array.isArray(data.guides) ? data.guides : [];\n } catch (err) {\n if (this.debug) console.error('[veo] guides resolve parse failed:', err);\n return [];\n }\n }\n\n /**\n * Trae una guía específica por ID, sin pasar por la lógica de\n * activación. La usa el controller para resumir un walkthrough entre\n * páginas: el `resolve` no devuelve la guía si la URL actual no\n * matchea, pero el walkthrough activo debe poder consultarla igual.\n *\n * El endpoint backend (`GET /v1/guides/:guideId`) devuelve `GuideResponse`,\n * un superset de `ResolvedGuide` con campos de audit. Aquí descartamos los\n * extra y nos quedamos con el shape que el resto del SDK ya consume.\n *\n * Devuelve `null` en cualquier error (404, red, parse) — el caller debe\n * tratarlo como \"guía ya no existe\" y cancelar el walkthrough limpiamente.\n */\n async fetchById(guideId: string): Promise<ResolvedGuide | null> {\n let response: Response;\n try {\n response = await fetch(`${this.apiUrl}/v1/guides/${encodeURIComponent(guideId)}`, {\n method: 'GET',\n headers: { 'X-Api-Key': this.apiKey },\n credentials: 'omit',\n });\n } catch (err) {\n if (this.debug) console.error('[veo] guides fetchById network failed:', err);\n return null;\n }\n\n if (!response.ok) {\n if (this.debug) console.warn('[veo] guides fetchById HTTP', response.status);\n return null;\n }\n\n try {\n const data = (await response.json()) as Partial<ResolvedGuide>;\n if (\n typeof data.guideId !== 'string' ||\n typeof data.guideName !== 'string' ||\n typeof data.guideType !== 'string' ||\n !Array.isArray(data.guideSteps) ||\n !data.activationRules ||\n typeof data.displayFrequency !== 'string' ||\n typeof data.displayPriority !== 'number'\n ) {\n if (this.debug) console.warn('[veo] guides fetchById: unexpected shape');\n return null;\n }\n return {\n guideId: data.guideId,\n guideName: data.guideName,\n guideType: data.guideType,\n guideSteps: data.guideSteps,\n activationRules: data.activationRules,\n displayFrequency: data.displayFrequency,\n displayPriority: data.displayPriority,\n };\n } catch (err) {\n if (this.debug) console.error('[veo] guides fetchById parse failed:', err);\n return null;\n }\n }\n}\n","import type { GuideInteractionMetadata, GuideInteractionPayload } from './types';\n\nexport interface InteractionRequest {\n guideId: string;\n payload: GuideInteractionPayload;\n}\n\n/**\n * Wire shape esperada por `POST /v1/guides/:id/interactions` en el backend.\n * Nuestro tipo interno (`GuideInteractionPayload`) usa `action`/`stepIndex`;\n * el backend exige `interactionType`/`stepPosition`. Esta función centraliza\n * la traducción.\n */\ninterface WireInteraction {\n endUserId: string;\n sessionId?: string;\n interactionType: GuideInteractionPayload['action'];\n stepPosition?: number;\n pageUrl?: string;\n pagePath?: string;\n metadata?: GuideInteractionMetadata;\n}\n\nfunction toWire(payload: GuideInteractionPayload): WireInteraction {\n const wire: WireInteraction = {\n endUserId: payload.endUserId,\n interactionType: payload.action,\n };\n if (payload.sessionId) wire.sessionId = payload.sessionId;\n if (typeof payload.stepIndex === 'number') wire.stepPosition = payload.stepIndex;\n if (payload.pageUrl) wire.pageUrl = payload.pageUrl;\n if (payload.pagePath) wire.pagePath = payload.pagePath;\n if (payload.metadata) wire.metadata = payload.metadata;\n return wire;\n}\n\n/**\n * Cliente HTTP puro para registrar interacciones de guías. No hace retry\n * ni queue — esa responsabilidad vive en `GuideTrackerQueue`.\n *\n * `send` lanza en error (queue puede reintentar). `sendBeacon` es síncrono,\n * \"best effort\", para el cierre de página: usa `navigator.sendBeacon` con\n * el apiKey como query param `?key=` (la única forma de autenticar con\n * sendBeacon, ya que no permite headers custom — el backend lo soporta\n * desde el ApiKeyGuard).\n */\nexport class GuideTrackerClient {\n constructor(\n private readonly apiUrl: string,\n private readonly apiKey: string,\n ) {}\n\n async send(request: InteractionRequest): Promise<void> {\n const url = this.buildUrl(request.guideId);\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'X-Api-Key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(toWire(request.payload)),\n credentials: 'omit',\n });\n\n if (!response.ok) {\n throw new Error(`guide interaction send failed: HTTP ${response.status}`);\n }\n }\n\n /**\n * Envío \"fire-and-forget\" en pagehide. Devuelve `false` si el navegador\n * no acepta el beacon (cola llena, no soportado) — en ese caso la queue\n * sabrá que perdió el envío.\n */\n sendBeacon(request: InteractionRequest): boolean {\n if (typeof navigator === 'undefined' || typeof navigator.sendBeacon !== 'function') {\n return false;\n }\n const url = `${this.buildUrl(request.guideId)}?key=${encodeURIComponent(this.apiKey)}`;\n const blob = new Blob([JSON.stringify(toWire(request.payload))], {\n type: 'application/json',\n });\n try {\n return navigator.sendBeacon(url, blob);\n } catch {\n return false;\n }\n }\n\n private buildUrl(guideId: string): string {\n return `${this.apiUrl}/v1/guides/${encodeURIComponent(guideId)}/interactions`;\n }\n}\n","import type { GuideTrackerClient, InteractionRequest } from './guide-tracker-client';\nimport type { QueuedInteraction } from './types';\n\n/** Base del backoff de reintento (ms); crece exponencial hasta el tope. */\nconst RETRY_BASE_MS = 3000;\nconst RETRY_MAX_DELAY_MS = 30_000;\n\nexport interface GuideTrackerQueueConfig {\n client: GuideTrackerClient;\n flushIntervalMs: number;\n batchSize: number;\n maxRetries: number;\n /**\n * Llamado cuando un item se descarta tras agotar `maxRetries`. El\n * plugin puede usarlo para `console.warn` en debug mode. Nunca debe\n * lanzar — si lo hace, se ignora silenciosamente.\n */\n onError?: (error: Error, item: QueuedInteraction) => void;\n}\n\n/**\n * Queue dedicada para `POST /v1/guides/:id/interactions`.\n *\n * Cada item es independiente (URL distinto por `guideId`), así que el\n * \"batch\" en realidad dispara N requests en paralelo. El `batchSize` es\n * el umbral para forzar un flush — no agrupa requests en uno solo.\n *\n * Retry:\n * - Si `send()` lanza, el item se devuelve al buffer con `attempts++`.\n * - El timer regular vuelve a intentar en el próximo tick.\n * - Al alcanzar `maxRetries`, se descarta llamando `onError`.\n *\n * En `pagehide`/`visibilitychange` (hidden) drena el buffer vía\n * `navigator.sendBeacon`. Best effort — no re-encola lo que el beacon\n * rechace porque la página ya se va.\n */\nexport class GuideTrackerQueue {\n private buffer: QueuedInteraction[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushing = false;\n private unloadCleanup: (() => void) | null = null;\n\n constructor(private readonly config: GuideTrackerQueueConfig) {\n this.startTimer();\n this.installUnloadHandler();\n }\n\n /** Tamaño actual del buffer (útil para debug/stats en el demo). */\n get size(): number {\n return this.buffer.length;\n }\n\n /**\n * Encola una interaction. Si el buffer alcanza `batchSize`, dispara\n * `flush()` inmediato.\n */\n enqueue(request: InteractionRequest): void {\n this.buffer.push({\n guideId: request.guideId,\n payload: request.payload,\n attempts: 0,\n enqueuedAt: Date.now(),\n });\n if (this.buffer.length >= this.config.batchSize) {\n void this.flush();\n }\n }\n\n /**\n * Envía todo el buffer en paralelo. Items que fallan vuelven al buffer\n * si todavía tienen reintentos disponibles. Idempotente con respecto a\n * flushes concurrentes (el segundo es un no-op).\n */\n async flush(): Promise<void> {\n if (this.flushing || this.buffer.length === 0) return;\n\n // Solo enviamos los items VENCIDOS (nextRetryAt en el pasado). Los que\n // esperan su backoff+jitter tras un fallo quedan en el buffer para un\n // tick futuro — así los reintentos de distintos clientes no se sincronizan.\n const now = Date.now();\n const due = this.buffer.filter((item) => (item.nextRetryAt ?? 0) <= now);\n if (due.length === 0) return;\n this.flushing = true;\n\n const dueSet = new Set(due);\n this.buffer = this.buffer.filter((item) => !dueSet.has(item));\n\n const results = await Promise.allSettled(\n due.map((item) => this.config.client.send({ guideId: item.guideId, payload: item.payload })),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const item = due[i];\n if (!result || !item) continue;\n if (result.status === 'fulfilled') continue;\n\n item.attempts += 1;\n if (item.attempts < this.config.maxRetries) {\n item.nextRetryAt = Date.now() + this.retryDelayMs(item.attempts);\n this.buffer.push(item);\n } else {\n this.safeOnError(result.reason, item);\n }\n }\n\n this.flushing = false;\n }\n\n /**\n * Backoff exponencial (base = intervalo de flush) con equal-jitter: mitad\n * fija + mitad aleatoria. Desincroniza los reintentos entre clientes ante\n * una caída del backend.\n */\n private retryDelayMs(attempts: number): number {\n const base = Math.min(RETRY_BASE_MS * 2 ** (attempts - 1), RETRY_MAX_DELAY_MS);\n return base / 2 + Math.random() * (base / 2);\n }\n\n /**\n * Drena el buffer vía `sendBeacon`. Síncrono, sin retry. Para pagehide.\n */\n flushBeacon(): void {\n if (this.buffer.length === 0) return;\n const batch = this.buffer.splice(0, this.buffer.length);\n for (const item of batch) {\n this.config.client.sendBeacon({ guideId: item.guideId, payload: item.payload });\n }\n }\n\n destroy(): void {\n if (this.timer) clearInterval(this.timer);\n this.timer = null;\n this.unloadCleanup?.();\n this.unloadCleanup = null;\n }\n\n private startTimer(): void {\n if (typeof window === 'undefined') return;\n this.timer = setInterval(() => {\n void this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private installUnloadHandler(): void {\n if (typeof window === 'undefined') return;\n const onPagehide = (): void => this.flushBeacon();\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') this.flushBeacon();\n };\n window.addEventListener('pagehide', onPagehide);\n window.addEventListener('visibilitychange', onVisibility);\n this.unloadCleanup = () => {\n window.removeEventListener('pagehide', onPagehide);\n window.removeEventListener('visibilitychange', onVisibility);\n };\n }\n\n private safeOnError(reason: unknown, item: QueuedInteraction): void {\n if (!this.config.onError) return;\n const error = reason instanceof Error ? reason : new Error(String(reason));\n try {\n this.config.onError(error, item);\n } catch {\n // Un onError roto no debe afectar al resto del flush.\n }\n }\n}\n","import type { StepPageLocation, UrlMatcher } from './types';\n\n/**\n * Matching de URL en CLIENTE (portado del backend `url-matcher.ts`). Lo usa el\n * motor composite para el targeting de página POR-PASO: como cada paso puede\n * apuntar a una página distinta (tours multi-página estilo Pendo), el SDK evalúa\n * la coincidencia en el navegador en cada navegación, no solo el backend.\n *\n * Errores de regex → `false` (no lanza): el patrón se validó al crear, pero una\n * fila corrupta no debe romper el render de una guía ajena.\n */\nexport function matchesUrl(matcher: UrlMatcher, pageUrl: string): boolean {\n switch (matcher.type) {\n case 'exact':\n return matcher.pattern === pageUrl;\n case 'prefix':\n return pageUrl.startsWith(matcher.pattern);\n case 'regex':\n try {\n return new RegExp(matcher.pattern).test(pageUrl);\n } catch {\n return false;\n }\n }\n}\n\n/** ¿El paso composite debe mostrarse en esta URL? Sitewide siempre; page → patrón. */\nexport function stepMatchesPage(\n loc: StepPageLocation | null | undefined,\n pageUrl: string,\n): boolean {\n if (!loc || loc.scope === 'sitewide' || !loc.pattern) return true;\n return matchesUrl({ type: loc.matchType ?? 'prefix', pattern: loc.pattern }, pageUrl);\n}\n","import { WALKTHROUGH_ABANDONMENT_TIMEOUT_MS, WALKTHROUGH_STATE_KEY_PREFIX } from './constants';\nimport type { WalkthroughState } from './types';\n\n/**\n * Estado persistente del walkthrough activo. Solo permite UNO por\n * workspace (namespace de apiKey). Vive en `localStorage` para sobrevivir\n * recargas de página: el step actual + el guideId alcanzan para resumir\n * desde donde quedó el usuario.\n *\n * Si pasan más de `WALKTHROUGH_ABANDONMENT_TIMEOUT_MS` sin progreso, se\n * considera abandonado: la próxima llamada a `current()` lo limpia\n * silenciosamente. NO se reporta `dismissed` al backend en ese caso —\n * abandonarse no es un acto del usuario.\n */\nexport class WalkthroughStateManager {\n private readonly storageKey: string;\n private state: WalkthroughState | null = null;\n\n constructor(namespace: string) {\n this.storageKey = `${WALKTHROUGH_STATE_KEY_PREFIX}${namespace}`;\n this.state = this.load();\n if (this.state && this.isAbandoned(this.state)) {\n this.clear();\n }\n }\n\n /**\n * Estado del walkthrough activo. Devuelve `null` si no hay ninguno o si\n * el último progreso fue hace más del timeout (en ese caso también\n * limpia el storage como side-effect).\n */\n current(): WalkthroughState | null {\n if (!this.state) return null;\n if (this.isAbandoned(this.state)) {\n this.clear();\n return null;\n }\n return this.state;\n }\n\n /** Atajo legible para el controller. */\n hasActive(): boolean {\n return this.current() !== null;\n }\n\n /**\n * Inicia un nuevo walkthrough en step 0. Sobreescribe cualquier estado\n * previo — los callers (controller) son responsables de verificar\n * `hasActive()` antes si necesitan exclusividad.\n */\n start(guideId: string, totalSteps: number): WalkthroughState {\n const now = Date.now();\n this.state = {\n guideId,\n totalSteps,\n currentStepIndex: 0,\n startedAt: now,\n lastProgressAt: now,\n };\n this.persist();\n return this.state;\n }\n\n /**\n * Avanza al siguiente step. Si el step resultante excede `totalSteps`,\n * devuelve `null` y NO toca el estado — el controller debe interpretar\n * eso como \"ya estamos en el último, no hay próximo\" y disparar\n * `complete` vía el handler del botón \"Finalizar\".\n */\n advance(): WalkthroughState | null {\n if (!this.state) return null;\n\n const next = this.state.currentStepIndex + 1;\n if (next >= this.state.totalSteps) return null;\n\n this.state = {\n ...this.state,\n currentStepIndex: next,\n lastProgressAt: Date.now(),\n };\n this.persist();\n return this.state;\n }\n\n /**\n * Retrocede al step anterior. En step 0 no hace nada y devuelve el\n * estado tal cual (el botón \"Atrás\" no debería estar visible en el\n * primer step, pero por defensa el manager también lo guard-ea).\n */\n back(): WalkthroughState | null {\n if (!this.state) return null;\n if (this.state.currentStepIndex === 0) return this.state;\n\n this.state = {\n ...this.state,\n currentStepIndex: this.state.currentStepIndex - 1,\n lastProgressAt: Date.now(),\n };\n this.persist();\n return this.state;\n }\n\n /** Limpia el estado activo (skip, complete, abandono, guía borrada). */\n clear(): void {\n this.state = null;\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(this.storageKey);\n } catch {\n // Storage bloqueado — no rompemos la app.\n }\n }\n\n private isAbandoned(state: WalkthroughState): boolean {\n return Date.now() - state.lastProgressAt > WALKTHROUGH_ABANDONMENT_TIMEOUT_MS;\n }\n\n private load(): WalkthroughState | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object') return null;\n const candidate = parsed as Partial<WalkthroughState>;\n if (\n typeof candidate.guideId !== 'string' ||\n typeof candidate.totalSteps !== 'number' ||\n typeof candidate.currentStepIndex !== 'number' ||\n typeof candidate.startedAt !== 'number' ||\n typeof candidate.lastProgressAt !== 'number'\n ) {\n return null;\n }\n return candidate as WalkthroughState;\n } catch {\n return null;\n }\n }\n\n private persist(): void {\n if (typeof localStorage === 'undefined' || !this.state) return;\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(this.state));\n } catch {\n // Quota exceeded — silently fail. El walkthrough en memoria sigue.\n }\n }\n}\n","/**\n * Modo PREVIEW POR LINK: la app del cliente se abre con\n * `?veoPreview=<token>` (link generado desde el dashboard) y el SDK canjea\n * el token contra `POST /v1/guides/preview-resolve` para renderizar ESA\n * guía como vista previa — aunque esté en draft — sobre la app real.\n *\n * A diferencia del modo builder no hay puente postMessage ni dashboard\n * abierto: es un link compartible para que el equipo pruebe la guía sin\n * publicarla. Reusa `previewGuide` (sin tracking/frecuencia/resolver) y\n * monta un chip flotante con \"volver a mostrar\" y \"cerrar\".\n *\n * Vive en el bundle de guías (`veo-guides.js`), NO en el `veo.js` core —\n * el core solo detecta el query param y dispara la carga del bundle.\n */\nimport { clearPreviewToken } from '../../core/preview-loader';\nimport { hasDocument } from '../../utils/safe-env';\nimport { previewGuide } from './guide-preview';\nimport type { ResolvedGuide } from './types';\n\nexport interface PreviewModeOptions {\n apiKey: string;\n apiUrl: string;\n /** Token firmado del link (`?veoPreview=<token>`). */\n token: string;\n debug?: boolean;\n}\n\nexport interface PreviewModeHandle {\n /** Cierra la preview y quita el chip. Idempotente. */\n teardown(): void;\n}\n\nlet active: PreviewModeHandle | null = null;\n\n/**\n * Canjea el token y renderiza la guía como vista previa + chip de control.\n * Si el token es inválido/expirado, el chip lo informa (solo quien tiene el\n * link lo ve). Solo una sesión de preview activa a la vez.\n */\nexport async function runPreviewMode(opts: PreviewModeOptions): Promise<PreviewModeHandle | null> {\n if (!hasDocument()) return null;\n active?.teardown();\n\n let guide: ResolvedGuide | null = null;\n try {\n const res = await fetch(`${opts.apiUrl}/v1/guides/preview-resolve`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': opts.apiKey },\n body: JSON.stringify({ token: opts.token }),\n });\n if (res.ok) {\n const data = (await res.json()) as { guide?: ResolvedGuide };\n guide = data.guide ?? null;\n } else if (opts.debug) {\n console.warn('[veo] preview-resolve respondió', res.status);\n }\n } catch (err) {\n if (opts.debug) console.warn('[veo] preview-resolve falló:', err);\n }\n\n /**\n * En el link de preview el envío de forms es REAL: corre sobre la app del\n * cliente con el SDK inicializado, así que la respuesta se guarda en el\n * usuario que está probando (su propia identidad) — permite verificar el\n * flujo completo props→segmentos sin tocar a nadie más.\n */\n const submitToBackend = async (answers: Record<string, unknown>): Promise<boolean> => {\n if (!guide) return false;\n const veo = (\n window as unknown as {\n veo?: { getEndUserId?: () => string | null; getAnonymousId?: () => string };\n }\n ).veo;\n const endUserId = veo?.getEndUserId?.() ?? veo?.getAnonymousId?.() ?? null;\n if (!endUserId) return false;\n try {\n const res = await fetch(`${opts.apiUrl}/v1/guides/${guide.guideId}/form-response`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Api-Key': opts.apiKey },\n body: JSON.stringify({ endUserId, answers }),\n });\n return res.ok;\n } catch {\n return false;\n }\n };\n\n let preview: { close(): void } | null = null;\n const show = (): void => {\n if (!guide) return;\n preview?.close();\n preview = previewGuide({\n guideType: guide.guideType,\n guideSteps: guide.guideSteps,\n activationRules: guide.activationRules,\n guideName: guide.guideName,\n formSubmit: submitToBackend,\n formSubmitNote: 'Vista previa: guardado en TU usuario para probar el flujo.',\n });\n };\n\n const chip = mountChip({\n label: guide ? `Vista previa: ${guide.guideName}` : 'Link de preview inválido o vencido',\n error: !guide,\n onReshow: guide ? show : null,\n onClose: () => handle.teardown(),\n });\n\n const handle: PreviewModeHandle = {\n teardown() {\n preview?.close();\n preview = null;\n chip.remove();\n // Salir de verdad: borra el token persistido para que NO reaparezca al\n // navegar (si no, sessionStorage lo reviviría en la próxima página).\n clearPreviewToken();\n if (active === handle) active = null;\n },\n };\n active = handle;\n show();\n return handle;\n}\n\ninterface ChipOptions {\n label: string;\n error: boolean;\n onReshow: (() => void) | null;\n onClose: () => void;\n}\n\n/** Chip flotante (Shadow DOM, abajo-derecha) con re-mostrar y cerrar. */\nfunction mountChip(opts: ChipOptions): { remove(): void } {\n const host = document.createElement('div');\n host.setAttribute('data-veo-preview-chip', '');\n const root = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = `\n .chip { position: fixed; bottom: 16px; right: 16px; z-index: 2147483647;\n display: flex; align-items: center; gap: 8px; padding: 8px 12px;\n background: #111827; color: #f9fafb; border-radius: 9999px;\n font: 500 12px/1.2 system-ui, sans-serif; box-shadow: 0 4px 12px rgba(0,0,0,.25); }\n .chip.error { background: #7f1d1d; }\n .label { max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n button { all: unset; cursor: pointer; padding: 2px 6px; border-radius: 9999px;\n font-size: 12px; line-height: 1; }\n button:hover { background: rgba(255,255,255,.15); }\n `;\n root.appendChild(style);\n\n const chip = document.createElement('div');\n chip.className = opts.error ? 'chip error' : 'chip';\n\n const label = document.createElement('span');\n label.className = 'label';\n label.textContent = opts.label;\n chip.appendChild(label);\n\n if (opts.onReshow) {\n const reshow = document.createElement('button');\n reshow.textContent = '↻';\n reshow.title = 'Volver a mostrar la guía';\n reshow.addEventListener('click', opts.onReshow);\n chip.appendChild(reshow);\n }\n\n const close = document.createElement('button');\n close.textContent = '✕';\n close.title = 'Salir de la vista previa';\n close.addEventListener('click', opts.onClose);\n chip.appendChild(close);\n\n root.appendChild(chip);\n document.body.appendChild(host);\n return { remove: () => host.remove() };\n}\n","/**\n * @veo/sdk - SDK oficial de Veo para web (entry ESM/CJS para bundlers).\n *\n * Aquí las guías se importan ESTÁTICAMENTE (el bundler las incluye/treeshake).\n * El entry IIFE (`veo.ts` → `veo.js`) las carga PEREZOSAMENTE para quedar chico.\n */\nimport { resolveApiUrl } from './core/api-url';\nimport { isBuilderMode } from './core/builder-loader';\nimport { getPreviewToken } from './core/preview-loader';\nimport { setupClient } from './core/setup';\nimport { closeGuidePreview, guidesPlugin, previewGuide, runPreviewMode } from './plugins/guides';\nimport type { VeoClient, VeoConfig } from './types';\n\nexport { SDK_VERSION } from './contract/v1';\nexport { Client } from './core/client';\nexport { autocapturePlugin } from './plugins/autocapture';\nexport type { PreviewGuideInput, PreviewHandle, PreviewResult } from './plugins/guides';\nexport { closeGuidePreview, guidesPlugin, previewGuide } from './plugins/guides';\nexport { definePlugin } from './plugins/plugin';\n// El element picker (inspector) vive en un bundle aparte para no inflar el SDK\n// de producción: `import { startElementPicker } from '@veo/sdk/builder'`.\nexport { spaRouterPlugin } from './plugins/spa-router';\nexport type {\n VeoAutocaptureConfig,\n VeoClient,\n VeoConfig,\n VeoOrganization,\n VeoPlugin,\n VeoVisitor,\n} from './types';\n\n/**\n * Inicializa el SDK de Veo. Instala por defecto el plugin de SPA router\n * (auto-pageview) y, en browser, expone la instancia en `window.veo` drenando\n * la cola del snippet stub si existe.\n *\n * @example\n * ```ts\n * import { init } from '@veo/sdk';\n *\n * // apiUrl es opcional: por defecto apunta al backend gestionado de Veo.\n * const veo = init({ apiKey: 'pk_xxx' });\n *\n * veo.identify({ visitor: { id: 'user_123' } });\n * veo.track('button_clicked');\n * ```\n */\nexport function init(config: VeoConfig): VeoClient {\n const apiUrl = resolveApiUrl(config);\n return setupClient(\n config,\n (client) => {\n // Renderer de guías: opt-in. Reusa apiUrl/apiKey/debug del client.\n // En modo builder o preview-por-link NO se instala (ahí pinta la preview;\n // el runtime duplicaría/taparía con las guías live).\n const previewToken = getPreviewToken();\n if (config.guides === true && !isBuilderMode() && previewToken === null) {\n client.use(\n guidesPlugin({\n apiUrl,\n apiKey: config.apiKey,\n ...(config.debug !== undefined ? { debug: config.debug } : {}),\n }),\n );\n }\n\n // Modo preview-por-link (`?veoPreview=<token>`): renderiza la guía del\n // token como vista previa sobre la app real.\n if (previewToken !== null) {\n void runPreviewMode({\n apiKey: config.apiKey,\n apiUrl,\n token: previewToken,\n ...(config.debug !== undefined ? { debug: config.debug } : {}),\n });\n }\n\n // Conveniencia: `veo.preview(def)` / `veo.closePreview()` en la instancia.\n (client as unknown as Record<string, unknown>).preview = previewGuide;\n (client as unknown as Record<string, unknown>).closePreview = closeGuidePreview;\n },\n // Fallback de carga del builder para bundlers: `import()` dinámico → el bundler\n // lo code-splitea (solo se descarga en modo builder). Así el consumidor por\n // bundler NO necesita copiar `veo-builder.js` ni setear `builderUrl`.\n () => import('./plugins/builder').then((m) => m.initBuilderMode()),\n );\n}\n"]}