veo-sdk 0.3.0 → 0.3.3

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,130 @@ 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 card = document.createElement("div");
1953
+ card.className = "veo-panel";
1954
+ let left = Math.max(MARGIN, window.innerWidth - PANEL_W - MARGIN);
1955
+ let top = MARGIN;
1956
+ card.style.left = `${left}px`;
1957
+ card.style.top = `${top}px`;
1958
+ const header = document.createElement("div");
1959
+ header.className = "veo-panel-header";
1960
+ const title = document.createElement("span");
1961
+ title.className = "veo-panel-title";
1962
+ title.textContent = "Veo \xB7 Editor";
1963
+ const close = document.createElement("button");
1964
+ close.className = "veo-panel-close";
1965
+ close.type = "button";
1966
+ close.setAttribute("aria-label", "Cerrar");
1967
+ close.textContent = "\u2715";
1968
+ close.addEventListener("click", () => opts.onClose());
1969
+ header.append(title, close);
1970
+ const iframe = document.createElement("iframe");
1971
+ iframe.className = "veo-panel-frame";
1972
+ iframe.title = "Editor de Veo";
1973
+ iframe.src = buildPanelUrl(opts);
1974
+ card.append(header, iframe);
1975
+ shadow.append(style, card);
1976
+ document.body.appendChild(host);
1977
+ const onHeaderDown = (e) => {
1978
+ if (e.target?.classList.contains("veo-panel-close")) return;
1979
+ e.preventDefault();
1980
+ const startX = e.clientX;
1981
+ const startY = e.clientY;
1982
+ const origLeft = left;
1983
+ const origTop = top;
1984
+ iframe.style.pointerEvents = "none";
1985
+ card.classList.add("dragging");
1986
+ const onMove = (ev) => {
1987
+ const maxLeft = window.innerWidth - card.offsetWidth;
1988
+ const maxTop = window.innerHeight - 40;
1989
+ left = clamp2(origLeft + (ev.clientX - startX), 0, Math.max(0, maxLeft));
1990
+ top = clamp2(origTop + (ev.clientY - startY), 0, Math.max(0, maxTop));
1991
+ card.style.left = `${left}px`;
1992
+ card.style.top = `${top}px`;
1993
+ };
1994
+ const onUp = () => {
1995
+ window.removeEventListener("mousemove", onMove);
1996
+ window.removeEventListener("mouseup", onUp);
1997
+ iframe.style.pointerEvents = "";
1998
+ card.classList.remove("dragging");
1999
+ };
2000
+ window.addEventListener("mousemove", onMove);
2001
+ window.addEventListener("mouseup", onUp);
2002
+ };
2003
+ header.addEventListener("mousedown", onHeaderDown);
2004
+ return {
2005
+ target: () => iframe.contentWindow,
2006
+ teardown: () => host.remove()
2007
+ };
2008
+ }
2009
+ function clamp2(v, min, max) {
2010
+ return Math.min(Math.max(v, min), max);
2011
+ }
2012
+ function buildPanelUrl(opts) {
2013
+ const path = opts.panelPath ?? DEFAULT_PANEL_PATH;
2014
+ const url = new URL(path, opts.dashboardOrigin);
2015
+ url.searchParams.set("veoToken", opts.token);
2016
+ url.searchParams.set("veoApp", opts.appOrigin);
2017
+ if (opts.guide) url.searchParams.set("veoGuide", opts.guide);
2018
+ return url.toString();
2019
+ }
2020
+ var DEFAULT_PANEL_PATH, PANEL_W, PANEL_H, MARGIN, PANEL_CSS;
2021
+ var init_builder_panel = __esm({
2022
+ "src/plugins/builder/builder-panel.ts"() {
2023
+ init_safe_env();
2024
+ DEFAULT_PANEL_PATH = "/guides/design";
2025
+ PANEL_W = 400;
2026
+ PANEL_H = 640;
2027
+ MARGIN = 16;
2028
+ PANEL_CSS = `
2029
+ :host { all: initial; }
2030
+ .veo-panel {
2031
+ position: fixed;
2032
+ width: ${PANEL_W}px; height: ${PANEL_H}px;
2033
+ min-width: 320px; min-height: 320px;
2034
+ max-width: 96vw; max-height: 94vh;
2035
+ display: flex; flex-direction: column;
2036
+ background: #fff;
2037
+ border-radius: 12px;
2038
+ box-shadow: 0 12px 40px rgba(0,0,0,0.28);
2039
+ overflow: hidden;
2040
+ resize: both;
2041
+ z-index: 2147483647;
2042
+ font-family: system-ui, -apple-system, sans-serif;
2043
+ }
2044
+ .veo-panel.dragging { user-select: none; }
2045
+ .veo-panel-header {
2046
+ flex: 0 0 auto;
2047
+ display: flex; align-items: center; justify-content: space-between;
2048
+ padding: 8px 12px;
2049
+ background: #0f172a; color: #fff;
2050
+ font-size: 13px; font-weight: 600;
2051
+ cursor: grab;
2052
+ }
2053
+ .veo-panel-header:active { cursor: grabbing; }
2054
+ .veo-panel-close {
2055
+ border: 0; background: transparent; color: #fff;
2056
+ font-size: 15px; cursor: pointer; line-height: 1;
2057
+ padding: 4px 6px; border-radius: 6px;
2058
+ }
2059
+ .veo-panel-close:hover { background: rgba(255,255,255,0.15); }
2060
+ .veo-panel-frame { flex: 1 1 auto; width: 100%; border: 0; background: #fff; }
2061
+ `;
2062
+ }
2063
+ });
2064
+
1943
2065
  // src/plugins/builder/element-picker.ts
1944
2066
  function startElementPicker(options) {
1945
2067
  if (!hasDocument()) {
@@ -2145,18 +2267,23 @@ var init_element_picker = __esm({
2145
2267
  // src/plugins/builder/builder-mode.ts
2146
2268
  function initBuilderMode() {
2147
2269
  if (!hasWindow() || !hasDocument()) return null;
2148
- const token = resolveBuilderToken();
2149
- if (!token) return null;
2150
- const dashboardOrigin = resolveDashboardOrigin();
2270
+ const ctx = resolveBuilderContext();
2271
+ if (!ctx) return null;
2272
+ const token = ctx.token;
2273
+ const dashboardOrigin = resolveDashboardOrigin(ctx.origin);
2151
2274
  if (!dashboardOrigin) return null;
2152
- const target = resolveTarget();
2153
- if (!target) return null;
2154
2275
  let picker = null;
2276
+ let panel = null;
2277
+ let staticTarget = null;
2278
+ const getTarget = () => panel ? panel.target() : staticTarget;
2155
2279
  const post = (event) => {
2156
- target.postMessage({ source: VEO_BUILDER_SOURCE, token, ...event }, dashboardOrigin);
2280
+ getTarget()?.postMessage({ source: VEO_BUILDER_SOURCE, token, ...event }, dashboardOrigin);
2157
2281
  };
2158
2282
  const handleCommand = (cmd) => {
2159
2283
  switch (cmd.type) {
2284
+ case "panel-ready":
2285
+ post({ type: "ready" });
2286
+ break;
2160
2287
  case "start-picker":
2161
2288
  picker?.stop();
2162
2289
  picker = startElementPicker({
@@ -2200,13 +2327,28 @@ function initBuilderMode() {
2200
2327
  picker?.stop();
2201
2328
  picker = null;
2202
2329
  closeGuidePreview();
2203
- clearBuilderToken();
2204
2330
  post({ type: "closed" });
2331
+ panel?.teardown();
2332
+ panel = null;
2333
+ clearBuilderToken();
2205
2334
  };
2335
+ if (ctx.panel) {
2336
+ panel = injectBuilderPanel({
2337
+ dashboardOrigin,
2338
+ token,
2339
+ appOrigin: window.location.origin,
2340
+ guide: ctx.guide,
2341
+ panelPath: ctx.panelPath,
2342
+ onClose: () => teardown()
2343
+ });
2344
+ } else {
2345
+ staticTarget = resolveTarget();
2346
+ if (!staticTarget) return null;
2347
+ }
2206
2348
  const activate = () => {
2207
2349
  window.addEventListener("message", onMessage);
2208
2350
  window.addEventListener("pagehide", onPageHide);
2209
- post({ type: "ready" });
2351
+ if (!ctx.panel) post({ type: "ready" });
2210
2352
  };
2211
2353
  const cfg = window.__veoBuilder;
2212
2354
  if (cfg?.apiKey && cfg?.apiUrl) {
@@ -2239,11 +2381,10 @@ function resolveTarget() {
2239
2381
  if (window.parent && window.parent !== window) return window.parent;
2240
2382
  return null;
2241
2383
  }
2242
- function resolveDashboardOrigin() {
2243
- const stored = resolveBuilderOrigin();
2244
- if (stored) {
2384
+ function resolveDashboardOrigin(originHint) {
2385
+ if (originHint) {
2245
2386
  try {
2246
- return new URL(stored).origin;
2387
+ return new URL(originHint).origin;
2247
2388
  } catch {
2248
2389
  return null;
2249
2390
  }
@@ -2263,6 +2404,7 @@ var init_builder_mode = __esm({
2263
2404
  init_safe_env();
2264
2405
  init_guide_preview();
2265
2406
  init_bridge_protocol();
2407
+ init_builder_panel();
2266
2408
  init_element_picker();
2267
2409
  }
2268
2410
  });