@snowcone-app/canvas 0.12.1 → 0.13.1

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.
@@ -108,3 +108,15 @@ export type { VisualGuideOverlayProps, VisualGuideOverlayStyle, OverlayPiece, Pi
108
108
  export { renderPieceGuides } from '../rendering/PieceGuideRenderer.js';
109
109
  export type { PieceGuideRenderParams, PieceGuideRendererPiece, PieceGuideRendererStyle, PieceGuideVisibility, } from '../rendering/PieceGuideRenderer.js';
110
110
  export type { PieceGuidesConfig } from '../components/embed/SnowconeCanvas.js';
111
+ /**
112
+ * Fetch a product's printable-area guides (dead zones, safe areas) for a raw
113
+ * `SnowconeCanvas` — the same overlay `<RealtimeEmbed>` shows automatically,
114
+ * but for an AUTHORING surface (your own `SnowconeCanvas` + `useLayers` panel)
115
+ * that doesn't go through the embed. Mirror of what www's route shell does:
116
+ * fetch by gvid, then `pieceGuidesForArtboard(bundle, artboard)` (which gates
117
+ * on the design's dims matching the print-file frame) → feed the result to the
118
+ * canvas's `pieceGuides` prop. So the DESIGNER sees the camera cutout while
119
+ * placing fields, not just the buyer afterward.
120
+ */
121
+ export { usePieceGuideBundle, pieceGuidesForArtboard, PIECE_GUIDES_API_BASE, } from '../components/embed-realtime/usePieceGuideBundle.js';
122
+ export type { PieceGuideBundle } from '../components/embed-realtime/usePieceGuideBundle.js';
package/dist/embed.mjs CHANGED
@@ -1,13 +1,14 @@
1
- import { a as z, e as J } from "./validation-BpmNOvuY.js";
2
- import { b as Re, d as Te, f as xe } from "./validation-BpmNOvuY.js";
3
- import { y } from "./HybridHistoryManager-NL3zyEl4.js";
4
- import { jsx as $, Fragment as Y } from "react/jsx-runtime";
5
- import { createContext as Q, useContext as X, useState as x, useEffect as U, useMemo as I, useRef as M } from "react";
1
+ import { a as J, e as z } from "./validation-BpmNOvuY.js";
2
+ import { b as Re, d as Ie, f as Te } from "./validation-BpmNOvuY.js";
3
+ import { y as w } from "./HybridHistoryManager-NL3zyEl4.js";
4
+ import { jsx as y, Fragment as Y } from "react/jsx-runtime";
5
+ import { createContext as Q, useContext as X, useMemo as S, useRef as x, useState as N, useEffect as G } from "react";
6
6
  import { assertVariantSelected as Z, RenderSession as ee } from "@snowcone-app/sdk";
7
- import { S as te, s as ne } from "./template-fields-IgDV7PRY.js";
8
- import { D as Me, T as Ae, d as Ce, r as Ge, a as Ne, e as Be, f as Pe, g as _e, h as Oe, w as qe } from "./template-fields-IgDV7PRY.js";
7
+ import { u as ne, p as te } from "./usePieceGuideBundle-Cyl695jv.js";
8
+ import { S as re, s as se } from "./template-fields-IgDV7PRY.js";
9
+ import { D as Me, T as Ue, d as Be, r as Ce, a as Ne, e as Ge, f as Oe, g as qe, h as Fe, w as Pe } from "./template-fields-IgDV7PRY.js";
9
10
  const L = Q(void 0);
10
- function P() {
11
+ function q() {
11
12
  const e = X(L);
12
13
  if (!e)
13
14
  throw new Error(
@@ -15,256 +16,203 @@ function P() {
15
16
  );
16
17
  return e;
17
18
  }
18
- const re = "https://api.snowcone.app";
19
- function se(e) {
20
- const t = e.pieces.map((n) => ({
21
- id: n.id,
22
- x: n.x,
23
- y: n.y,
24
- width: n.width,
25
- height: n.height,
26
- rotation: typeof n.rotation == "number" ? n.rotation : void 0,
27
- safeAreaInsetPx: typeof n.safeAreaInsetInches == "number" && n.safeAreaInsetInches > 0 ? n.safeAreaInsetInches * e.templateDpi : void 0
28
- }));
29
- return {
30
- artboardWidth: e.artboardWidth,
31
- artboardHeight: e.artboardHeight,
32
- config: {
33
- pieces: t,
34
- guides: e.pieceGuides ?? {},
35
- style: e.pieceGuidesStyle
36
- }
37
- };
38
- }
39
- function ie(e, t) {
40
- var n;
41
- if (t) {
42
- if (t.width !== e.artboardWidth || t.height !== e.artboardHeight) {
43
- typeof y < "u" && ((n = y.env) == null ? void 0 : n.NODE_ENV) !== "production" && console.warn(
44
- `[RealtimeEmbed] This product has printable-area guides (authored at ${e.artboardWidth}×${e.artboardHeight}), but the design's artboard is ${t.width}×${t.height} — the dead-zone overlay is skipped because the coordinates wouldn't line up. Author the design at the placement's dimensions to get it.`
45
- );
46
- return;
47
- }
48
- return e.config;
49
- }
50
- }
51
- function oe(e, t = re) {
52
- const [n, s] = x(null);
53
- return U(() => {
54
- if (!e) {
55
- s(null);
56
- return;
57
- }
58
- let i = !1;
59
- return fetch(`${t}/printables/by-gvid/${encodeURIComponent(e)}/piece-guides`).then(async (r) => {
60
- if (!r.ok) throw new Error(`status ${r.status}`);
61
- return await r.json();
62
- }).then((r) => {
63
- i || s(se(r));
64
- }).catch(() => {
65
- i || s(null);
66
- }), () => {
67
- i = !0;
68
- };
69
- }, [e, t]), n;
70
- }
71
19
  const E = "[RealtimeEmbed]";
72
20
  function ae(e) {
73
- var s, i;
21
+ var s, l;
74
22
  if ((s = e == null ? void 0 : e.requiredPlacements) != null && s.length)
75
- return e.requiredPlacements.filter((r) => !r.autoFilledByVariant).map((r) => r.label);
76
- const t = new Set(
77
- (((i = e == null ? void 0 : e.options) == null ? void 0 : i.combinations) ?? []).map((r) => r.variantId).filter((r) => typeof r == "string" && r !== "")
23
+ return e.requiredPlacements.filter((t) => !t.autoFilledByVariant).map((t) => t.label);
24
+ const n = new Set(
25
+ (((l = e == null ? void 0 : e.options) == null ? void 0 : l.combinations) ?? []).map((t) => t.variantId).filter((t) => typeof t == "string" && t !== "")
78
26
  );
79
- return !!(e != null && e.variantId) || t.size > 1 ? [] : (e == null ? void 0 : e.placements) ?? [];
27
+ return !!(e != null && e.variantId) || n.size > 1 ? [] : (e == null ? void 0 : e.placements) ?? [];
80
28
  }
81
- function ce({ shop: e, product: t, design: n, hasGrant: s }) {
82
- var l, a;
29
+ function oe({ shop: e, product: n, design: r, hasGrant: s }) {
30
+ var u, o;
83
31
  if (e || console.error(`${E} \`shop\` is required (your publishable shop id).`), s || console.error(
84
32
  `${E} no grant source — pass \`grantUrl\` (a proxy to mintRealtimeGrant) or \`grant\`. Without it the session can never authorize and no mockup renders.`
85
- ), (l = t == null ? void 0 : t.mockupIds) != null && l.length || console.error(
33
+ ), (u = n == null ? void 0 : n.mockupIds) != null && u.length || console.error(
86
34
  `${E} product.mockupIds is empty — pass the catalog scene codes (product.mockups[].id) you want rendered, e.g. ["FV1qjO"].`
87
- ), t != null && t.options)
35
+ ), n != null && n.options)
88
36
  try {
89
- Z(t);
90
- } catch (o) {
91
- console.error(`${E} ${o instanceof Error ? o.message : String(o)}`);
37
+ Z(n);
38
+ } catch (a) {
39
+ console.error(`${E} ${a instanceof Error ? a.message : String(a)}`);
92
40
  }
93
- const i = n.toJSON(), r = i.activeArtboard, h = ae(t);
94
- h.length > 1 && console.error(
95
- `${E} product ${t.productId} requires placements [${h.join(", ")}] but <RealtimeEmbed> renders a single placement ("${r}"). The render will time out waiting for the others. This product needs the eject path — see https://developers.snowcone.app/embed-mode#eject.`
96
- ), (a = t == null ? void 0 : t.placements) != null && a.length && !t.placements.includes(r) && console.warn(
97
- `${E} the design's placement "${r}" is not in product.placements [${t.placements.join(", ")}]. The canvas artboard name and renderState placement must equal a real product placement label, or the server renders a blank mockup. Fix the \`name\` passed to design({ name }).`
41
+ const l = r.toJSON(), t = l.activeArtboard, f = ae(n);
42
+ f.length > 1 && console.error(
43
+ `${E} product ${n.productId} requires placements [${f.join(", ")}] but <RealtimeEmbed> renders a single placement ("${t}"). The render will time out waiting for the others. This product needs the eject path — see https://developers.snowcone.app/embed-mode#eject.`
44
+ ), (o = n == null ? void 0 : n.placements) != null && o.length && !n.placements.includes(t) && console.warn(
45
+ `${E} the design's placement "${t}" is not in product.placements [${n.placements.join(", ")}]. The canvas artboard name and renderState placement must equal a real product placement label, or the server renders a blank mockup. Fix the \`name\` passed to design({ name }).`
98
46
  );
99
- const c = i.elements.map((o) => o.name).filter((o) => !!o), g = c.filter((o, p) => c.indexOf(o) !== p);
100
- g.length && console.warn(
101
- `${E} duplicate layer name(s) [${[...new Set(g)].join(", ")}] — useTextBinding(name) / useImageBinding(name) bind to the FIRST match, so a duplicate name makes a control edit the wrong layer. Keep names unique.`
47
+ const i = l.elements.map((a) => a.name).filter((a) => !!a), h = i.filter((a, p) => i.indexOf(a) !== p);
48
+ h.length && console.warn(
49
+ `${E} duplicate layer name(s) [${[...new Set(h)].join(", ")}] — useTextBinding(name) / useImageBinding(name) bind to the FIRST match, so a duplicate name makes a control edit the wrong layer. Keep names unique.`
102
50
  );
103
51
  }
104
- function ue(e) {
52
+ function ie(e) {
105
53
  if ("grantUrl" in e && e.grantUrl)
106
54
  return { grantUrl: e.grantUrl };
107
- const t = e.grant;
108
- return typeof t == "function" ? { getToken: t } : { getToken: () => Promise.resolve(t) };
55
+ const n = e.grant;
56
+ return typeof n == "function" ? { getToken: n } : { getToken: () => Promise.resolve(n) };
109
57
  }
110
58
  const V = 8e3;
111
- function le(e) {
59
+ function ce(e) {
112
60
  return `[RealtimeEmbed] No mockup after ${Math.round(V / 1e3)}s. Common causes: a variant product missing \`variantId\` (pass \`product.options\` so the embed can flag it up front), a multi-placement product (the server waits for every required placement but <RealtimeEmbed> sends only "${e}" — pass \`product.requiredPlacements\` so this is flagged at mount; such products need the eject path), an unreachable or non-public asset URL in the design, or the placement "${e}" not existing on the product. The render may still arrive — this is a heads-up, not a failure.`;
113
61
  }
114
62
  function Ee(e) {
115
- const { shop: t, product: n, design: s, throttleMs: i = 200, onMockups: r, onRenderError: h, wsUrl: c, services: g, children: l } = e, a = I(() => s.toJSON().activeArtboard, [s]), o = oe(n.variantId ?? n.defaultGvid), p = I(() => {
116
- if (!o) return null;
117
- const u = s.toJSON().artboards[0];
118
- return ie(o, u) ?? null;
119
- }, [o, s]), v = M(r), d = M(h);
120
- v.current = r, d.current = h;
121
- const [_, W] = x([]), [S, w] = x(!0), [O, k] = x(null), A = !!("grantUrl" in e && e.grantUrl || "grant" in e && e.grant), C = ue(e), H = "grantUrl" in C ? C.grantUrl : "getToken", G = `${n.productId}|${n.mockupIds.join(",")}|${n.variantId ?? ""}`, R = I(
63
+ const { shop: n, product: r, design: s, throttleMs: l = 200, onMockups: t, onRenderError: f, wsUrl: i, services: h, children: u } = e, o = S(() => s.toJSON().activeArtboard, [s]), a = ne(r.variantId ?? r.defaultGvid), p = S(() => {
64
+ if (!a) return null;
65
+ const c = s.toJSON().artboards[0];
66
+ return te(a, c) ?? null;
67
+ }, [a, s]), v = x(t), d = x(f);
68
+ v.current = t, d.current = f;
69
+ const [F, K] = N([]), [$, k] = N(!0), [P, R] = N(null), M = !!("grantUrl" in e && e.grantUrl || "grant" in e && e.grant), U = ie(e), W = "grantUrl" in U ? U.grantUrl : "getToken", B = `${r.productId}|${r.mockupIds.join(",")}|${r.variantId ?? ""}`, I = S(
122
70
  () => {
123
71
  try {
124
- return { session: new ee({ shop: t, product: n, wsUrl: c, ...C }) };
125
- } catch (u) {
126
- return { error: u instanceof Error ? u.message : String(u) };
72
+ return { session: new ee({ shop: n, product: r, wsUrl: i, ...U }) };
73
+ } catch (c) {
74
+ return { error: c instanceof Error ? c.message : String(c) };
127
75
  }
128
76
  },
129
77
  // eslint-disable-next-line react-hooks/exhaustive-deps
130
- [t, G, a, c, H]
131
- ), f = "session" in R ? R.session : null, T = "error" in R ? R.error : null, q = M(null);
132
- U(() => {
133
- var u;
134
- if (typeof y < "u" && ((u = y.env) == null ? void 0 : u.NODE_ENV) !== "production") {
135
- const m = `${t}|${G}|${a}|${A}`;
136
- if (q.current === m) return;
137
- q.current = m, ce({ shop: t, product: n, design: s, hasGrant: A });
78
+ [n, B, o, i, W]
79
+ ), g = "session" in I ? I.session : null, T = "error" in I ? I.error : null, _ = x(null);
80
+ G(() => {
81
+ var c;
82
+ if (typeof w < "u" && ((c = w.env) == null ? void 0 : c.NODE_ENV) !== "production") {
83
+ const m = `${n}|${B}|${o}|${M}`;
84
+ if (_.current === m) return;
85
+ _.current = m, oe({ shop: n, product: r, design: s, hasGrant: M });
138
86
  }
139
- }, [t, G, a, A]);
140
- const N = I(() => (u, m = i) => {
141
- f && (k(null), w(!0), f.renderState(a, u, m).catch((b) => {
142
- var F;
143
- const j = b instanceof Error ? b.message : String(b);
144
- k(j), w(!1), (F = d.current) == null || F.call(d, j);
87
+ }, [n, B, o, M]);
88
+ const C = S(() => (c, m = l) => {
89
+ g && (R(null), k(!0), g.renderState(o, c, m).catch((b) => {
90
+ var D;
91
+ const A = b instanceof Error ? b.message : String(b);
92
+ R(A), k(!1), (D = d.current) == null || D.call(d, A);
145
93
  }));
146
- }, [f, a, i]);
147
- U(() => {
148
- var u;
94
+ }, [g, o, l]);
95
+ G(() => {
96
+ var c;
149
97
  if (T) {
150
- k(T), w(!1), (u = d.current) == null || u.call(d, T);
98
+ R(T), k(!1), (c = d.current) == null || c.call(d, T);
151
99
  return;
152
100
  }
153
- if (f)
154
- return f.onMockups((m) => {
101
+ if (g)
102
+ return g.onMockups((m) => {
155
103
  var b;
156
- W(m), w(!1), (b = v.current) == null || b.call(v, m);
157
- }), f.onError((m) => {
104
+ K(m), k(!1), (b = v.current) == null || b.call(v, m);
105
+ }), g.onError((m) => {
158
106
  var b;
159
- k(m), w(!1), (b = d.current) == null || b.call(d, m);
160
- }), N(s.toServerRequest()), () => f.close();
161
- }, [f, T]), U(() => {
107
+ R(m), k(!1), (b = d.current) == null || b.call(d, m);
108
+ }), C(s.toServerRequest()), () => g.close();
109
+ }, [g, T]), G(() => {
162
110
  var m;
163
- if (!S || typeof y > "u" || ((m = y.env) == null ? void 0 : m.NODE_ENV) === "production") return;
164
- const u = setTimeout(() => console.warn(le(a)), V);
165
- return () => clearTimeout(u);
166
- }, [S, a]);
167
- const K = I(
111
+ if (!$ || typeof w > "u" || ((m = w.env) == null ? void 0 : m.NODE_ENV) === "production") return;
112
+ const c = setTimeout(() => console.warn(ce(o)), V);
113
+ return () => clearTimeout(c);
114
+ }, [$, o]);
115
+ const H = S(
168
116
  () => ({
169
- session: f,
117
+ session: g,
170
118
  design: s,
171
- placement: a,
172
- product: n,
173
- mockups: _,
174
- isRendering: S,
175
- error: O,
176
- throttleMs: i,
119
+ placement: o,
120
+ product: r,
121
+ mockups: F,
122
+ isRendering: $,
123
+ error: P,
124
+ throttleMs: l,
177
125
  pieceGuides: p,
178
- pushRender: N
126
+ pushRender: C
179
127
  }),
180
- [f, s, a, n, _, S, O, i, p, N]
181
- ), D = /* @__PURE__ */ $(L.Provider, { value: K, children: l });
182
- return g ? /* @__PURE__ */ $(z, { services: g, children: D }) : D;
128
+ [g, s, o, r, F, $, P, l, p, C]
129
+ ), j = /* @__PURE__ */ y(L.Provider, { value: H, children: u });
130
+ return h ? /* @__PURE__ */ y(J, { services: h, children: j }) : j;
183
131
  }
184
- function Ie({
132
+ function Se({
185
133
  children: e,
186
- kit: t = "embed-only",
187
- inheritTheme: n = !0,
134
+ kit: n = "embed-only",
135
+ inheritTheme: r = !0,
188
136
  maxHeight: s,
189
- services: i,
190
- className: r,
191
- style: h
137
+ services: l,
138
+ className: t,
139
+ style: f
192
140
  }) {
193
- const { design: c, placement: g, throttleMs: l, pieceGuides: a, pushRender: o } = P(), p = I(() => c.toJSON(), [c]);
194
- return /* @__PURE__ */ $("div", { className: `app-modern${r ? ` ${r}` : ""}`, style: h, children: /* @__PURE__ */ $(
195
- te,
141
+ const { design: i, placement: h, throttleMs: u, pieceGuides: o, pushRender: a } = q(), p = S(() => i.toJSON(), [i]);
142
+ return /* @__PURE__ */ y("div", { className: `app-modern${t ? ` ${t}` : ""}`, style: f, children: /* @__PURE__ */ y(
143
+ re,
196
144
  {
197
- kit: t,
198
- inheritTheme: n,
199
- services: i,
145
+ kit: n,
146
+ inheritTheme: r,
147
+ services: l,
200
148
  artboards: p.artboards,
201
- activeArtboard: g,
149
+ activeArtboard: h,
202
150
  initialElements: p.elements,
203
151
  layoutConfig: s ? { maxHeight: s } : void 0,
204
152
  overlay: e,
205
- pieceGuides: a ?? void 0,
206
- onChange: (v) => o(ne(v), l)
153
+ pieceGuides: o ?? void 0,
154
+ onChange: (v) => a(se(v), u)
207
155
  }
208
156
  ) });
209
157
  }
210
- const de = 1.2, B = [1200, 1400, 1600, 1800, 2e3, 2500, 3e3, 4e3];
211
- function me(e) {
212
- for (const t of B)
213
- if (t >= e) return t;
214
- return B[B.length - 1];
158
+ const le = 1.2, O = [1200, 1400, 1600, 1800, 2e3, 2500, 3e3, 4e3];
159
+ function ue(e) {
160
+ for (const n of O)
161
+ if (n >= e) return n;
162
+ return O[O.length - 1];
215
163
  }
216
- function he(e, t) {
217
- if (!(e > 0) || !(t > 0) || t <= e * de) return null;
218
- const n = me(t);
219
- return `[RealtimeMockup] mockup rendered at ${e}px but displayed at ~${t} device px — the preview will look soft. Pass \`product.width\` (e.g. ${n}) on <RealtimeEmbed> for a crisp preview.`;
164
+ function de(e, n) {
165
+ if (!(e > 0) || !(n > 0) || n <= e * le) return null;
166
+ const r = ue(n);
167
+ return `[RealtimeMockup] mockup rendered at ${e}px but displayed at ~${n} device px — the preview will look soft. Pass \`product.width\` (e.g. ${r}) on <RealtimeEmbed> for a crisp preview.`;
220
168
  }
221
- function $e({
169
+ function we({
222
170
  mockupId: e,
223
- fallback: t = null,
224
- alt: n = "Live product mockup",
171
+ fallback: n = null,
172
+ alt: r = "Live product mockup",
225
173
  className: s,
226
- style: i
174
+ style: l
227
175
  }) {
228
- const { mockups: r } = P(), h = M(/* @__PURE__ */ new Set()), c = e ? r.find((l) => l.mockupId === e && l.imageUrl) : r.find((l) => l.imageUrl);
229
- if (!(c != null && c.imageUrl))
230
- return /* @__PURE__ */ $(Y, { children: t });
231
- const g = (l) => {
176
+ const { mockups: t } = q(), f = x(/* @__PURE__ */ new Set()), i = e ? t.find((u) => u.mockupId === e && u.imageUrl) : t.find((u) => u.imageUrl);
177
+ if (!(i != null && i.imageUrl))
178
+ return /* @__PURE__ */ y(Y, { children: n });
179
+ const h = (u) => {
232
180
  var d;
233
- if (typeof y > "u" || ((d = y.env) == null ? void 0 : d.NODE_ENV) === "production" || typeof window > "u" || h.current.has(c.mockupId)) return;
234
- const a = l.currentTarget, o = a.getBoundingClientRect().width;
235
- if (o <= 0) return;
236
- const p = Math.round(o * (window.devicePixelRatio || 1)), v = he(a.naturalWidth, p);
237
- v && (h.current.add(c.mockupId), console.warn(v));
181
+ if (typeof w > "u" || ((d = w.env) == null ? void 0 : d.NODE_ENV) === "production" || typeof window > "u" || f.current.has(i.mockupId)) return;
182
+ const o = u.currentTarget, a = o.getBoundingClientRect().width;
183
+ if (a <= 0) return;
184
+ const p = Math.round(a * (window.devicePixelRatio || 1)), v = de(o.naturalWidth, p);
185
+ v && (f.current.add(i.mockupId), console.warn(v));
238
186
  };
239
187
  return (
240
188
  // eslint-disable-next-line @next/next/no-img-element
241
- /* @__PURE__ */ $("img", { src: c.imageUrl, alt: n, className: s, style: i, onLoad: g })
189
+ /* @__PURE__ */ y("img", { src: i.imageUrl, alt: r, className: s, style: l, onLoad: h })
242
190
  );
243
191
  }
244
- function we() {
245
- const { mockups: e, isRendering: t, error: n } = P();
246
- return { mockups: e, isRendering: t, error: n };
192
+ function ye() {
193
+ const { mockups: e, isRendering: n, error: r } = q();
194
+ return { mockups: e, isRendering: n, error: r };
247
195
  }
248
- J();
196
+ z();
249
197
  export {
250
- z as CanvasServicesProvider,
198
+ J as CanvasServicesProvider,
251
199
  Me as DesignBuilder,
252
- Ie as RealtimeCanvas,
200
+ Se as RealtimeCanvas,
253
201
  Ee as RealtimeEmbed,
254
- $e as RealtimeMockup,
255
- Ae as TEMPLATE_FIELDS_KEY,
202
+ we as RealtimeMockup,
203
+ Ue as TEMPLATE_FIELDS_KEY,
256
204
  Re as createProxyGenerate,
257
- Te as createProxyImageSearch,
258
- Ce as design,
259
- Ge as readTemplateFields,
260
- xe as useCanvasServices,
205
+ Ie as createProxyImageSearch,
206
+ Be as design,
207
+ Ce as readTemplateFields,
208
+ Te as useCanvasServices,
261
209
  Ne as useColorBinding,
262
- Be as useElementByName,
263
- Pe as useFontBinding,
264
- _e as useImageBinding,
265
- we as useRealtimeMockups,
266
- Oe as useTextBinding,
267
- ce as validateEmbed,
268
- qe as withTemplateFields
210
+ Ge as useElementByName,
211
+ Oe as useFontBinding,
212
+ qe as useImageBinding,
213
+ ye as useRealtimeMockups,
214
+ Fe as useTextBinding,
215
+ oe as validateEmbed,
216
+ Pe as withTemplateFields
269
217
  };
270
218
  //# sourceMappingURL=embed.mjs.map