veo-sdk 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -39,11 +39,14 @@ var init_safe_env = __esm({
39
39
  });
40
40
 
41
41
  // src/core/builder-constants.ts
42
- var BUILDER_TOKEN_PARAM, BUILDER_ORIGIN_PARAM;
42
+ var BUILDER_TOKEN_PARAM, BUILDER_ORIGIN_PARAM, BUILDER_PANEL_PARAM, BUILDER_PANEL_PATH_PARAM, BUILDER_GUIDE_PARAM;
43
43
  var init_builder_constants = __esm({
44
44
  "src/core/builder-constants.ts"() {
45
45
  BUILDER_TOKEN_PARAM = "veoBuilder";
46
46
  BUILDER_ORIGIN_PARAM = "veoBuilderOrigin";
47
+ BUILDER_PANEL_PARAM = "veoBuilderPanel";
48
+ BUILDER_PANEL_PATH_PARAM = "veoBuilderPanelPath";
49
+ BUILDER_GUIDE_PARAM = "veoGuide";
47
50
  }
48
51
  });
49
52
 
@@ -62,56 +65,51 @@ function urlParams() {
62
65
  return null;
63
66
  }
64
67
  }
65
- function resolveBuilderToken() {
68
+ function resolveBuilderContext() {
66
69
  if (!hasWindow()) return null;
67
70
  const params = urlParams();
68
71
  const fromUrl = params?.get(BUILDER_TOKEN_PARAM);
69
72
  if (fromUrl) {
70
- const store = session();
73
+ const ctx = {
74
+ token: fromUrl,
75
+ origin: params?.get(BUILDER_ORIGIN_PARAM) ?? null,
76
+ panel: params?.get(BUILDER_PANEL_PARAM) === "1",
77
+ guide: params?.get(BUILDER_GUIDE_PARAM) ?? null,
78
+ panelPath: params?.get(BUILDER_PANEL_PATH_PARAM) ?? null
79
+ };
71
80
  try {
72
- store?.setItem(TOKEN_KEY, fromUrl);
73
- const origin = params?.get(BUILDER_ORIGIN_PARAM);
74
- if (origin) store?.setItem(ORIGIN_KEY, origin);
81
+ session()?.setItem(CTX_KEY, JSON.stringify(ctx));
75
82
  } catch {
76
83
  }
77
- return fromUrl;
84
+ return ctx;
78
85
  }
79
86
  try {
80
- return session()?.getItem(TOKEN_KEY) ?? null;
87
+ const raw = session()?.getItem(CTX_KEY);
88
+ return raw ? JSON.parse(raw) : null;
81
89
  } catch {
82
90
  return null;
83
91
  }
84
92
  }
85
- function resolveBuilderOrigin() {
86
- if (!hasWindow()) return null;
87
- const fromUrl = urlParams()?.get(BUILDER_ORIGIN_PARAM);
88
- if (fromUrl) return fromUrl;
89
- try {
90
- return session()?.getItem(ORIGIN_KEY) ?? null;
91
- } catch {
92
- return null;
93
- }
93
+ function resolveBuilderToken() {
94
+ return resolveBuilderContext()?.token ?? null;
94
95
  }
95
96
  function isBuilderMode() {
96
- return resolveBuilderToken() !== null;
97
+ return resolveBuilderContext() !== null;
97
98
  }
98
99
  function clearBuilderToken() {
99
100
  if (!hasWindow()) return;
100
101
  try {
101
- const store = session();
102
- store?.removeItem(TOKEN_KEY);
103
- store?.removeItem(ORIGIN_KEY);
102
+ session()?.removeItem(CTX_KEY);
104
103
  } catch {
105
104
  }
106
105
  }
107
- var TOKEN_KEY, ORIGIN_KEY;
106
+ var CTX_KEY;
108
107
  var init_builder_token = __esm({
109
108
  "src/core/builder-token.ts"() {
110
109
  init_safe_env();
111
110
  init_builder_constants();
112
111
  init_builder_constants();
113
- TOKEN_KEY = "veo:builder_token";
114
- ORIGIN_KEY = "veo:builder_origin";
112
+ CTX_KEY = "veo:builder_ctx";
115
113
  }
116
114
  });
117
115
 
@@ -1940,6 +1938,85 @@ var init_bridge_protocol = __esm({
1940
1938
  }
1941
1939
  });
1942
1940
 
1941
+ // src/plugins/builder/builder-panel.ts
1942
+ function injectBuilderPanel(opts) {
1943
+ if (!hasWindow() || !hasDocument()) {
1944
+ return { target: () => null, teardown: () => {
1945
+ } };
1946
+ }
1947
+ const host = document.createElement("div");
1948
+ host.setAttribute("data-veo-builder-panel", "");
1949
+ const shadow = host.attachShadow({ mode: "open" });
1950
+ const style = document.createElement("style");
1951
+ style.textContent = PANEL_CSS;
1952
+ const container = document.createElement("div");
1953
+ container.className = "veo-panel";
1954
+ const header = document.createElement("div");
1955
+ header.className = "veo-panel-header";
1956
+ const title = document.createElement("span");
1957
+ title.className = "veo-panel-title";
1958
+ title.textContent = "Veo \xB7 Editor";
1959
+ const close = document.createElement("button");
1960
+ close.className = "veo-panel-close";
1961
+ close.type = "button";
1962
+ close.setAttribute("aria-label", "Cerrar");
1963
+ close.textContent = "\u2715";
1964
+ close.addEventListener("click", () => opts.onClose());
1965
+ header.append(title, close);
1966
+ const iframe = document.createElement("iframe");
1967
+ iframe.className = "veo-panel-frame";
1968
+ iframe.title = "Editor de Veo";
1969
+ iframe.src = buildPanelUrl(opts);
1970
+ container.append(header, iframe);
1971
+ shadow.append(style, container);
1972
+ document.body.appendChild(host);
1973
+ return {
1974
+ target: () => iframe.contentWindow,
1975
+ teardown: () => host.remove()
1976
+ };
1977
+ }
1978
+ function buildPanelUrl(opts) {
1979
+ const path = opts.panelPath ?? DEFAULT_PANEL_PATH;
1980
+ const url = new URL(path, opts.dashboardOrigin);
1981
+ url.searchParams.set("veoToken", opts.token);
1982
+ url.searchParams.set("veoApp", opts.appOrigin);
1983
+ if (opts.guide) url.searchParams.set("veoGuide", opts.guide);
1984
+ return url.toString();
1985
+ }
1986
+ var DEFAULT_PANEL_PATH, PANEL_CSS;
1987
+ var init_builder_panel = __esm({
1988
+ "src/plugins/builder/builder-panel.ts"() {
1989
+ init_safe_env();
1990
+ DEFAULT_PANEL_PATH = "/guides/design";
1991
+ PANEL_CSS = `
1992
+ :host { all: initial; }
1993
+ .veo-panel {
1994
+ position: fixed; top: 0; right: 0; bottom: 0;
1995
+ width: 420px; max-width: 100vw;
1996
+ display: flex; flex-direction: column;
1997
+ background: #fff;
1998
+ box-shadow: -8px 0 30px rgba(0,0,0,0.18);
1999
+ z-index: 2147483647;
2000
+ font-family: system-ui, -apple-system, sans-serif;
2001
+ }
2002
+ .veo-panel-header {
2003
+ flex: 0 0 auto;
2004
+ display: flex; align-items: center; justify-content: space-between;
2005
+ padding: 8px 12px;
2006
+ background: #0f172a; color: #fff;
2007
+ font-size: 13px; font-weight: 600;
2008
+ }
2009
+ .veo-panel-close {
2010
+ border: 0; background: transparent; color: #fff;
2011
+ font-size: 15px; cursor: pointer; line-height: 1;
2012
+ padding: 4px 6px; border-radius: 6px;
2013
+ }
2014
+ .veo-panel-close:hover { background: rgba(255,255,255,0.15); }
2015
+ .veo-panel-frame { flex: 1 1 auto; width: 100%; border: 0; background: #fff; }
2016
+ `;
2017
+ }
2018
+ });
2019
+
1943
2020
  // src/plugins/builder/element-picker.ts
1944
2021
  function startElementPicker(options) {
1945
2022
  if (!hasDocument()) {
@@ -2145,18 +2222,23 @@ var init_element_picker = __esm({
2145
2222
  // src/plugins/builder/builder-mode.ts
2146
2223
  function initBuilderMode() {
2147
2224
  if (!hasWindow() || !hasDocument()) return null;
2148
- const token = resolveBuilderToken();
2149
- if (!token) return null;
2150
- const dashboardOrigin = resolveDashboardOrigin();
2225
+ const ctx = resolveBuilderContext();
2226
+ if (!ctx) return null;
2227
+ const token = ctx.token;
2228
+ const dashboardOrigin = resolveDashboardOrigin(ctx.origin);
2151
2229
  if (!dashboardOrigin) return null;
2152
- const target = resolveTarget();
2153
- if (!target) return null;
2154
2230
  let picker = null;
2231
+ let panel = null;
2232
+ let staticTarget = null;
2233
+ const getTarget = () => panel ? panel.target() : staticTarget;
2155
2234
  const post = (event) => {
2156
- target.postMessage({ source: VEO_BUILDER_SOURCE, token, ...event }, dashboardOrigin);
2235
+ getTarget()?.postMessage({ source: VEO_BUILDER_SOURCE, token, ...event }, dashboardOrigin);
2157
2236
  };
2158
2237
  const handleCommand = (cmd) => {
2159
2238
  switch (cmd.type) {
2239
+ case "panel-ready":
2240
+ post({ type: "ready" });
2241
+ break;
2160
2242
  case "start-picker":
2161
2243
  picker?.stop();
2162
2244
  picker = startElementPicker({
@@ -2200,13 +2282,28 @@ function initBuilderMode() {
2200
2282
  picker?.stop();
2201
2283
  picker = null;
2202
2284
  closeGuidePreview();
2203
- clearBuilderToken();
2204
2285
  post({ type: "closed" });
2286
+ panel?.teardown();
2287
+ panel = null;
2288
+ clearBuilderToken();
2205
2289
  };
2290
+ if (ctx.panel) {
2291
+ panel = injectBuilderPanel({
2292
+ dashboardOrigin,
2293
+ token,
2294
+ appOrigin: window.location.origin,
2295
+ guide: ctx.guide,
2296
+ panelPath: ctx.panelPath,
2297
+ onClose: () => teardown()
2298
+ });
2299
+ } else {
2300
+ staticTarget = resolveTarget();
2301
+ if (!staticTarget) return null;
2302
+ }
2206
2303
  const activate = () => {
2207
2304
  window.addEventListener("message", onMessage);
2208
2305
  window.addEventListener("pagehide", onPageHide);
2209
- post({ type: "ready" });
2306
+ if (!ctx.panel) post({ type: "ready" });
2210
2307
  };
2211
2308
  const cfg = window.__veoBuilder;
2212
2309
  if (cfg?.apiKey && cfg?.apiUrl) {
@@ -2239,11 +2336,10 @@ function resolveTarget() {
2239
2336
  if (window.parent && window.parent !== window) return window.parent;
2240
2337
  return null;
2241
2338
  }
2242
- function resolveDashboardOrigin() {
2243
- const stored = resolveBuilderOrigin();
2244
- if (stored) {
2339
+ function resolveDashboardOrigin(originHint) {
2340
+ if (originHint) {
2245
2341
  try {
2246
- return new URL(stored).origin;
2342
+ return new URL(originHint).origin;
2247
2343
  } catch {
2248
2344
  return null;
2249
2345
  }
@@ -2263,6 +2359,7 @@ var init_builder_mode = __esm({
2263
2359
  init_safe_env();
2264
2360
  init_guide_preview();
2265
2361
  init_bridge_protocol();
2362
+ init_builder_panel();
2266
2363
  init_element_picker();
2267
2364
  }
2268
2365
  });