veo-sdk 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -50,6 +50,42 @@ Cargá `veo.js` desde unpkg y llamá `init` en el `onload` del `<script>`
50
50
  para no romperte con un release futuro. También por jsDelivr:
51
51
  `https://cdn.jsdelivr.net/npm/veo-sdk@0.2.1/dist/veo.js`.
52
52
 
53
+ ## Editor visual de guías (modo builder)
54
+
55
+ El dashboard de Veo puede abrir tu app en un editor visual para diseñar guías
56
+ sobre ella (elegir el elemento ancla, previsualizar). Para eso abre tu app en un
57
+ `<iframe>` con `?veoBuilder=<token>` y necesita cargar el bundle del builder
58
+ (`veo-builder.js`) para hacer el handshake. Solo se descarga cuando la URL trae
59
+ ese token: **tus usuarios finales nunca lo cargan**.
60
+
61
+ ### CDN (`<script>`)
62
+
63
+ Funciona sin configurar nada: el SDK deriva la URL de `veo-builder.js` a partir
64
+ del `<script>` que cargó `veo.js`.
65
+
66
+ ### Bundler (Next / Vite / React)
67
+
68
+ Funciona sin configurar nada: con `init({ guides: true })` el SDK carga el
69
+ builder con un `import()` dinámico cuando la app se abre con `?veoBuilder`. Tu
70
+ bundler lo code-splitea, así que **no se descarga para tus usuarios finales** y
71
+ **no tenés que copiar `veo-builder.js` ni setear `builderUrl`**.
72
+
73
+ ```ts
74
+ init({ apiKey: 'pk_xxx', guides: true });
75
+ ```
76
+
77
+ > `builderUrl` sigue disponible como override manual (CDN propio, CSP estricto),
78
+ > pero ya no hace falta.
79
+
80
+ ### App con login (Supabase, Clerk, …)
81
+
82
+ Si tu app tiene login, el editor no puede autenticarse dentro del iframe (Google
83
+ OAuth = 403, cookies de terceros). Para diseñar sobre páginas protegidas hace
84
+ falta un **"modo diseño"** en tu app: dejar que Veo la embeba + entrar como
85
+ usuario demo. El SDK trae los helpers (`veoBuilderProxy`, `ensureVeoDesignSession`
86
+ en `veo-sdk/next`) y la **receta completa con Supabase** (2 archivos, copiable)
87
+ está en **[`docs/integrations/visual-editor-embed.md`](./docs/integrations/visual-editor-embed.md)**.
88
+
53
89
  ## API
54
90
 
55
91
  (En desarrollo. Implementación completa en sprints siguientes.)
@@ -0,0 +1,5 @@
1
+ export { createBuilderSession, initBuilderMode, startElementPicker, stopElementPicker } from './chunk-66UQ474G.mjs';
2
+ import './chunk-CI7NWEH2.mjs';
3
+ import './chunk-JIU5JLI3.mjs';
4
+ //# sourceMappingURL=builder-UEGKG2UR.mjs.map
5
+ //# sourceMappingURL=builder-UEGKG2UR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"builder-UEGKG2UR.mjs"}
package/dist/builder.cjs CHANGED
@@ -10,6 +10,67 @@ function hasDocument() {
10
10
  return typeof document !== "undefined";
11
11
  }
12
12
 
13
+ // src/core/builder-constants.ts
14
+ var BUILDER_TOKEN_PARAM = "veoBuilder";
15
+ var BUILDER_ORIGIN_PARAM = "veoBuilderOrigin";
16
+
17
+ // src/core/builder-token.ts
18
+ var TOKEN_KEY = "veo:builder_token";
19
+ var ORIGIN_KEY = "veo:builder_origin";
20
+ function session() {
21
+ try {
22
+ return window.sessionStorage;
23
+ } catch {
24
+ return null;
25
+ }
26
+ }
27
+ function urlParams() {
28
+ try {
29
+ return new URLSearchParams(window.location.search);
30
+ } catch {
31
+ return null;
32
+ }
33
+ }
34
+ function resolveBuilderToken() {
35
+ if (!hasWindow()) return null;
36
+ const params = urlParams();
37
+ const fromUrl = params?.get(BUILDER_TOKEN_PARAM);
38
+ if (fromUrl) {
39
+ const store = session();
40
+ try {
41
+ store?.setItem(TOKEN_KEY, fromUrl);
42
+ const origin = params?.get(BUILDER_ORIGIN_PARAM);
43
+ if (origin) store?.setItem(ORIGIN_KEY, origin);
44
+ } catch {
45
+ }
46
+ return fromUrl;
47
+ }
48
+ try {
49
+ return session()?.getItem(TOKEN_KEY) ?? null;
50
+ } catch {
51
+ return null;
52
+ }
53
+ }
54
+ function resolveBuilderOrigin() {
55
+ if (!hasWindow()) return null;
56
+ const fromUrl = urlParams()?.get(BUILDER_ORIGIN_PARAM);
57
+ if (fromUrl) return fromUrl;
58
+ try {
59
+ return session()?.getItem(ORIGIN_KEY) ?? null;
60
+ } catch {
61
+ return null;
62
+ }
63
+ }
64
+ function clearBuilderToken() {
65
+ if (!hasWindow()) return;
66
+ try {
67
+ const store = session();
68
+ store?.removeItem(TOKEN_KEY);
69
+ store?.removeItem(ORIGIN_KEY);
70
+ } catch {
71
+ }
72
+ }
73
+
13
74
  // src/plugins/guides/constants.ts
14
75
  var GUIDE_Z_INDEX = 2147483640;
15
76
  var DEFAULT_ANCHOR_WAIT_MS = 5e3;
@@ -1535,8 +1596,6 @@ function safeDestroy(renderer) {
1535
1596
 
1536
1597
  // src/plugins/builder/bridge-protocol.ts
1537
1598
  var VEO_BUILDER_SOURCE = "veo-builder";
1538
- var BUILDER_TOKEN_PARAM = "veoBuilder";
1539
- var BUILDER_ORIGIN_PARAM = "veoBuilderOrigin";
1540
1599
 
1541
1600
  // src/plugins/autocapture/constants.ts
1542
1601
  var HASHED_CLASS_PATTERNS = [
@@ -1822,15 +1881,9 @@ function stopElementPicker() {
1822
1881
  // src/plugins/builder/builder-mode.ts
1823
1882
  function initBuilderMode() {
1824
1883
  if (!hasWindow() || !hasDocument()) return null;
1825
- let params;
1826
- try {
1827
- params = new URLSearchParams(window.location.search);
1828
- } catch {
1829
- return null;
1830
- }
1831
- const token = params.get(BUILDER_TOKEN_PARAM);
1884
+ const token = resolveBuilderToken();
1832
1885
  if (!token) return null;
1833
- const dashboardOrigin = resolveDashboardOrigin(params);
1886
+ const dashboardOrigin = resolveDashboardOrigin();
1834
1887
  if (!dashboardOrigin) return null;
1835
1888
  const target = resolveTarget();
1836
1889
  if (!target) return null;
@@ -1883,6 +1936,7 @@ function initBuilderMode() {
1883
1936
  picker?.stop();
1884
1937
  picker = null;
1885
1938
  closeGuidePreview();
1939
+ clearBuilderToken();
1886
1940
  post({ type: "closed" });
1887
1941
  };
1888
1942
  const activate = () => {
@@ -1921,16 +1975,16 @@ function resolveTarget() {
1921
1975
  if (window.parent && window.parent !== window) return window.parent;
1922
1976
  return null;
1923
1977
  }
1924
- function resolveDashboardOrigin(params) {
1925
- const explicit = params.get(BUILDER_ORIGIN_PARAM);
1926
- if (explicit) {
1978
+ function resolveDashboardOrigin() {
1979
+ const stored = resolveBuilderOrigin();
1980
+ if (stored) {
1927
1981
  try {
1928
- return new URL(explicit).origin;
1982
+ return new URL(stored).origin;
1929
1983
  } catch {
1930
1984
  return null;
1931
1985
  }
1932
1986
  }
1933
- if (document.referrer) {
1987
+ if (hasDocument() && document.referrer) {
1934
1988
  try {
1935
1989
  return new URL(document.referrer).origin;
1936
1990
  } catch {