diff --git a/src/Umbraco.Community.BlockPreview.UI/src/blockEditor/rich-text-preview.custom-view.element.ts b/src/Umbraco.Community.BlockPreview.UI/src/blockEditor/rich-text-preview.custom-view.element.ts index 0cb0e88d..516f562a 100644 --- a/src/Umbraco.Community.BlockPreview.UI/src/blockEditor/rich-text-preview.custom-view.element.ts +++ b/src/Umbraco.Community.BlockPreview.UI/src/blockEditor/rich-text-preview.custom-view.element.ts @@ -54,6 +54,12 @@ export class RichTextPreviewCustomView extends BlockPreviewBaseElement { if (context != null) { this.observe( @@ -102,7 +114,10 @@ export class RichTextPreviewCustomView extends BlockPreviewBaseElement JSON.stringify( t, (e, i) => typeof i == "bigint" ? i.toString() : i ) -}, Ut = ({ +}, Bt = ({ onRequest: t, onSseError: e, onSseEvent: i, @@ -58,61 +58,61 @@ const Pt = { ); if (!y.body) throw new Error("No body in SSE response"); const m = y.body.pipeThrough(new TextDecoderStream()).getReader(); - let ae = ""; - const Se = () => { + let he = ""; + const Ee = () => { try { m.cancel(); } catch { } }; - E.addEventListener("abort", Se); + E.addEventListener("abort", Ee); try { for (; ; ) { - const { done: nt, value: at } = await m.read(); - if (nt) break; - ae += at; - const Te = ae.split(` + const { done: at, value: lt } = await m.read(); + if (at) break; + he += lt; + const Pe = he.split(` `); - ae = Te.pop() ?? ""; - for (const lt of Te) { - const ct = lt.split(` -`), z = []; - let Ee; - for (const w of ct) + he = Pe.pop() ?? ""; + for (const ct of Pe) { + const ut = ct.split(` +`), H = []; + let Ue; + for (const w of ut) if (w.startsWith("data:")) - z.push(w.replace(/^data:\s*/, "")); + H.push(w.replace(/^data:\s*/, "")); else if (w.startsWith("event:")) - Ee = w.replace(/^event:\s*/, ""); + Ue = w.replace(/^event:\s*/, ""); else if (w.startsWith("id:")) d = w.replace(/^id:\s*/, ""); else if (w.startsWith("retry:")) { - const Ue = Number.parseInt( + const Ae = Number.parseInt( w.replace(/^retry:\s*/, ""), 10 ); - Number.isNaN(Ue) || (h = Ue); + Number.isNaN(Ae) || (h = Ae); } - let U, Pe = !1; - if (z.length) { - const w = z.join(` + let U, Be = !1; + if (H.length) { + const w = H.join(` `); try { - U = JSON.parse(w), Pe = !0; + U = JSON.parse(w), Be = !0; } catch { U = w; } } - Pe && (s && await s(U), r && (U = await r(U))), i?.({ + Be && (s && await s(U), r && (U = await r(U))), i?.({ data: U, - event: Ee, + event: Ue, id: d, retry: h - }), z.length && (yield U); + }), H.length && (yield U); } } } finally { - E.removeEventListener("abort", Se), m.releaseLock(); + E.removeEventListener("abort", Ee), m.releaseLock(); } break; } catch (P) { @@ -126,7 +126,7 @@ const Pt = { } } }() }; -}, Bt = (t) => { +}, At = (t) => { switch (t) { case "label": return "."; @@ -137,7 +137,7 @@ const Pt = { default: return "&"; } -}, At = (t) => { +}, qt = (t) => { switch (t) { case "form": return ","; @@ -148,7 +148,7 @@ const Pt = { default: return ","; } -}, qt = (t) => { +}, Ot = (t) => { switch (t) { case "label": return "."; @@ -159,7 +159,7 @@ const Pt = { default: return "&"; } -}, Ie = ({ +}, Ke = ({ allowReserved: t, explode: e, name: i, @@ -167,7 +167,7 @@ const Pt = { value: s }) => { if (!e) { - const a = (t ? s : s.map((c) => encodeURIComponent(c))).join(At(r)); + const a = (t ? s : s.map((c) => encodeURIComponent(c))).join(qt(r)); switch (r) { case "label": return `.${a}`; @@ -179,13 +179,13 @@ const Pt = { return `${i}=${a}`; } } - const n = Bt(r), o = s.map((a) => r === "label" || r === "simple" ? t ? a : encodeURIComponent(a) : oe({ + const n = At(r), o = s.map((a) => r === "label" || r === "simple" ? t ? a : encodeURIComponent(a) : ce({ allowReserved: t, name: i, value: a })).join(n); return r === "label" || r === "matrix" ? n + o : o; -}, oe = ({ +}, ce = ({ allowReserved: t, name: e, value: i @@ -197,7 +197,7 @@ const Pt = { "Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these." ); return `${e}=${t ? i : encodeURIComponent(i)}`; -}, Ke = ({ +}, We = ({ allowReserved: t, explode: e, name: i, @@ -228,17 +228,17 @@ const Pt = { return u; } } - const o = qt(r), a = Object.entries(s).map( - ([c, u]) => oe({ + const o = Ot(r), a = Object.entries(s).map( + ([c, u]) => ce({ allowReserved: t, name: r === "deepObject" ? `${i}[${c}]` : c, value: u }) ).join(o); return r === "label" || r === "matrix" ? o + a : a; -}, Ot = /\{[^{}]+\}/g, Dt = ({ path: t, url: e }) => { +}, Dt = /\{[^{}]+\}/g, Vt = ({ path: t, url: e }) => { let i = e; - const r = e.match(Ot); + const r = e.match(Dt); if (r) for (const s of r) { let n = !1, o = s.substring(1, s.length - 1), a = "simple"; @@ -249,14 +249,14 @@ const Pt = { if (Array.isArray(c)) { i = i.replace( s, - Ie({ explode: n, name: o, style: a, value: c }) + Ke({ explode: n, name: o, style: a, value: c }) ); continue; } if (typeof c == "object") { i = i.replace( s, - Ke({ + We({ explode: n, name: o, style: a, @@ -269,7 +269,7 @@ const Pt = { if (a === "matrix") { i = i.replace( s, - `;${oe({ + `;${ce({ name: o, value: c })}` @@ -282,7 +282,7 @@ const Pt = { i = i.replace(s, u); } return i; -}, Vt = ({ +}, $t = ({ baseUrl: t, path: e, query: i, @@ -291,22 +291,22 @@ const Pt = { }) => { const n = s.startsWith("/") ? s : `/${s}`; let o = (t ?? "") + n; - e && (o = Dt({ path: e, url: o })); + e && (o = Vt({ path: e, url: o })); let a = i ? r(i) : ""; return a.startsWith("?") && (a = a.substring(1)), a && (o += `?${a}`), o; }; -function $t(t) { +function Lt(t) { const e = t.body !== void 0; if (e && t.bodySerializer) return "serializedBody" in t ? t.serializedBody !== void 0 && t.serializedBody !== "" ? t.serializedBody : null : t.body !== "" ? t.body : null; if (e) return t.body; } -const Lt = async (t, e) => { +const Mt = async (t, e) => { const i = typeof e == "function" ? await e(t) : e; if (i) return t.scheme === "bearer" ? `Bearer ${i}` : t.scheme === "basic" ? `Basic ${btoa(i)}` : i; -}, We = ({ +}, ze = ({ allowReserved: t, array: e, object: i @@ -317,7 +317,7 @@ const Lt = async (t, e) => { const a = s[o]; if (a != null) if (Array.isArray(a)) { - const c = Ie({ + const c = Ke({ allowReserved: t, explode: !0, name: o, @@ -327,7 +327,7 @@ const Lt = async (t, e) => { }); c && n.push(c); } else if (typeof a == "object") { - const c = Ke({ + const c = We({ allowReserved: t, explode: !0, name: o, @@ -337,7 +337,7 @@ const Lt = async (t, e) => { }); c && n.push(c); } else { - const c = oe({ + const c = ce({ allowReserved: t, name: o, value: a @@ -346,7 +346,7 @@ const Lt = async (t, e) => { } } return n.join("&"); -}, Mt = (t) => { +}, Rt = (t) => { if (!t) return "stream"; const e = t.split(";")[0]?.trim(); @@ -362,14 +362,14 @@ const Lt = async (t, e) => { if (e.startsWith("text/")) return "text"; } -}, Rt = (t, e) => e ? !!(t.headers.has(e) || t.query?.[e] || t.headers.get("Cookie")?.includes(`${e}=`)) : !1, Nt = async ({ +}, Nt = (t, e) => e ? !!(t.headers.has(e) || t.query?.[e] || t.headers.get("Cookie")?.includes(`${e}=`)) : !1, It = async ({ security: t, ...e }) => { for (const i of t) { - if (Rt(e, i.name)) + if (Nt(e, i.name)) continue; - const r = await Lt(i, e.auth); + const r = await Mt(i, e.auth); if (!r) continue; const s = i.name ?? "Authorization"; @@ -386,26 +386,26 @@ const Lt = async (t, e) => { break; } } -}, qe = (t) => Vt({ +}, De = (t) => $t({ baseUrl: t.baseUrl, path: t.path, query: t.query, - querySerializer: typeof t.querySerializer == "function" ? t.querySerializer : We(t.querySerializer), + querySerializer: typeof t.querySerializer == "function" ? t.querySerializer : ze(t.querySerializer), url: t.url -}), Oe = (t, e) => { +}), Ve = (t, e) => { const i = { ...t, ...e }; - return i.baseUrl?.endsWith("/") && (i.baseUrl = i.baseUrl.substring(0, i.baseUrl.length - 1)), i.headers = ze(t.headers, e.headers), i; -}, It = (t) => { + return i.baseUrl?.endsWith("/") && (i.baseUrl = i.baseUrl.substring(0, i.baseUrl.length - 1)), i.headers = Ge(t.headers, e.headers), i; +}, Kt = (t) => { const e = []; return t.forEach((i, r) => { e.push([r, i]); }), e; -}, ze = (...t) => { +}, Ge = (...t) => { const e = new Headers(); for (const i of t) { if (!i) continue; - const r = i instanceof Headers ? It(i) : Object.entries(i); + const r = i instanceof Headers ? Kt(i) : Object.entries(i); for (const [s, n] of r) if (n === null) e.delete(s); @@ -419,7 +419,7 @@ const Lt = async (t, e) => { } return e; }; -class le { +class de { constructor() { this.fns = []; } @@ -445,11 +445,11 @@ class le { return this.fns.push(e), this.fns.length - 1; } } -const Kt = () => ({ - error: new le(), - request: new le(), - response: new le() -}), Wt = We({ +const Wt = () => ({ + error: new de(), + request: new de(), + response: new de() +}), zt = ze({ allowReserved: !1, array: { explode: !0, @@ -459,56 +459,56 @@ const Kt = () => ({ explode: !0, style: "deepObject" } -}), zt = { +}), Gt = { "Content-Type": "application/json" -}, Ge = (t = {}) => ({ - ...Pt, - headers: zt, +}, je = (t = {}) => ({ + ...Ut, + headers: Gt, parseAs: "auto", - querySerializer: Wt, + querySerializer: zt, ...t -}), Gt = (t = {}) => { - let e = Oe(Ge(), t); - const i = () => ({ ...e }), r = (u) => (e = Oe(e, u), i()), s = Kt(), n = async (u) => { +}), jt = (t = {}) => { + let e = Ve(je(), t); + const i = () => ({ ...e }), r = (u) => (e = Ve(e, u), i()), s = Wt(), n = async (u) => { const l = { ...e, ...u, fetch: u.fetch ?? e.fetch ?? globalThis.fetch, - headers: ze(e.headers, u.headers), + headers: Ge(e.headers, u.headers), serializedBody: void 0 }; - l.security && await Nt({ + l.security && await It({ ...l, security: l.security }), l.requestValidator && await l.requestValidator(l), l.body !== void 0 && l.bodySerializer && (l.serializedBody = l.bodySerializer(l.body)), (l.body === void 0 || l.serializedBody === "") && l.headers.delete("Content-Type"); - const d = qe(l); + const d = De(l); return { opts: l, url: d }; }, o = async (u) => { const { opts: l, url: d } = await n(u), V = { redirect: "follow", ...l, - body: $t(l) + body: Lt(l) }; let x = new Request(d, V); - for (const f of s.request.fns) - f && (x = await f(x, l)); - const W = l.fetch; - let h = await W(x); - for (const f of s.response.fns) - f && (h = await f(h, x, l)); + for (const b of s.request.fns) + b && (x = await b(x, l)); + const j = l.fetch; + let h = await j(x); + for (const b of s.response.fns) + b && (h = await b(h, x, l)); const k = { request: x, response: h }; if (h.ok) { - const f = (l.parseAs === "auto" ? Mt(h.headers.get("Content-Type")) : l.parseAs) ?? "json"; + const b = (l.parseAs === "auto" ? Rt(h.headers.get("Content-Type")) : l.parseAs) ?? "json"; if (h.status === 204 || h.headers.get("Content-Length") === "0") { let m; - switch (f) { + switch (b) { case "arrayBuffer": case "blob": case "text": - m = await h[f](); + m = await h[b](); break; case "formData": m = new FormData(); @@ -527,13 +527,13 @@ const Kt = () => ({ }; } let y; - switch (f) { + switch (b) { case "arrayBuffer": case "blob": case "formData": case "json": case "text": - y = await h[f](); + y = await h[b](); break; case "stream": return l.responseStyle === "data" ? h.body : { @@ -541,7 +541,7 @@ const Kt = () => ({ ...k }; } - return f === "json" && (l.responseValidator && await l.responseValidator(y), l.responseTransformer && (y = await l.responseTransformer(y))), l.responseStyle === "data" ? y : { + return b === "json" && (l.responseValidator && await l.responseValidator(y), l.responseTransformer && (y = await l.responseTransformer(y))), l.responseStyle === "data" ? y : { data: y, ...k }; @@ -554,8 +554,8 @@ const Kt = () => ({ } const P = $ ?? E; let v = P; - for (const f of s.error.fns) - f && (v = await f(P, h, x, l)); + for (const b of s.error.fns) + b && (v = await b(P, h, x, l)); if (v = v || {}, l.throwOnError) throw v; return l.responseStyle === "data" ? void 0 : { @@ -564,13 +564,13 @@ const Kt = () => ({ }; }, a = (u) => (l) => o({ ...l, method: u }), c = (u) => async (l) => { const { opts: d, url: V } = await n(l); - return Ut({ + return Bt({ ...d, body: d.body, headers: d.headers, method: u, - onRequest: async (x, W) => { - let h = new Request(x, W); + onRequest: async (x, j) => { + let h = new Request(x, j); for (const k of s.request.fns) k && (h = await k(h, d)); return h; @@ -579,7 +579,7 @@ const Kt = () => ({ }); }; return { - buildUrl: qe, + buildUrl: De, connect: a("CONNECT"), delete: a("DELETE"), get: a("GET"), @@ -605,13 +605,13 @@ const Kt = () => ({ }, trace: a("TRACE") }; -}, b = Gt(Ge({ +}, f = jt(je({ baseUrl: "http://localhost:26293", throwOnError: !0 })); class T { static previewGridBlock(e) { - return (e?.client ?? b).post({ + return (e?.client ?? f).post({ url: "/umbraco/block-preview/api/v1/preview/grid", ...e, headers: { @@ -624,19 +624,19 @@ class T { * @deprecated */ static getGridStylesheet(e) { - return (e?.client ?? b).get({ + return (e?.client ?? f).get({ url: "/umbraco/block-preview/api/v1/preview/grid/stylesheet", ...e }); } static getGridStylesheets(e) { - return (e?.client ?? b).get({ + return (e?.client ?? f).get({ url: "/umbraco/block-preview/api/v1/preview/grid/stylesheets", ...e }); } static previewListBlock(e) { - return (e?.client ?? b).post({ + return (e?.client ?? f).post({ url: "/umbraco/block-preview/api/v1/preview/list", ...e, headers: { @@ -649,19 +649,19 @@ class T { * @deprecated */ static getListStylesheet(e) { - return (e?.client ?? b).get({ + return (e?.client ?? f).get({ url: "/umbraco/block-preview/api/v1/preview/list/stylesheet", ...e }); } static getListStylesheets(e) { - return (e?.client ?? b).get({ + return (e?.client ?? f).get({ url: "/umbraco/block-preview/api/v1/preview/list/stylesheets", ...e }); } static previewRichTextMarkup(e) { - return (e?.client ?? b).post({ + return (e?.client ?? f).post({ url: "/umbraco/block-preview/api/v1/preview/rte", ...e, headers: { @@ -674,19 +674,19 @@ class T { * @deprecated */ static getRteStylesheet(e) { - return (e?.client ?? b).get({ + return (e?.client ?? f).get({ url: "/umbraco/block-preview/api/v1/preview/rte/stylesheet", ...e }); } static getRteStylesheets(e) { - return (e?.client ?? b).get({ + return (e?.client ?? f).get({ url: "/umbraco/block-preview/api/v1/preview/rte/stylesheets", ...e }); } static previewSingleBlock(e) { - return (e?.client ?? b).post({ + return (e?.client ?? f).post({ url: "/umbraco/block-preview/api/v1/preview/single", ...e, headers: { @@ -696,27 +696,27 @@ class T { }); } static getSingleBlockStylesheets(e) { - return (e?.client ?? b).get({ + return (e?.client ?? f).get({ url: "/umbraco/block-preview/api/v1/preview/single/stylesheets", ...e }); } static getSettings(e) { - return (e?.client ?? b).get({ + return (e?.client ?? f).get({ url: "/umbraco/block-preview/api/v1/settings", ...e }); } } -const je = new ht("BlockPreviewContext"); -var jt = Object.defineProperty, g = (t, e, i, r) => { +const He = new dt("BlockPreviewContext"); +var Ht = Object.defineProperty, g = (t, e, i, r) => { for (var s = void 0, n = t.length - 1, o; n >= 0; n--) (o = t[n]) && (s = o(e, i, s) || s); - return s && jt(e, i, s), s; + return s && Ht(e, i, s), s; }; -class p extends bt { +class p extends kt { constructor() { - super(), this._workspaceContextResolved = !1, this._htmlMarkup = "", this._isLoading = !1, this._error = null, this._stylesheetsAdopted = !1, this._requestId = 0, this._isConnected = !1, this._pointerStartPos = null, this.consumeContext(je, async (e) => { + super(), this._workspaceContextResolved = !1, this._htmlMarkup = "", this._isLoading = !1, this._error = null, this._stylesheetsAdopted = !1, this._requestId = 0, this._isConnected = !1, this._pointerStartPos = null, this.consumeContext(He, async (e) => { this._blockPreviewContext = e, await this.setupContextObservers(); }); } @@ -731,7 +731,7 @@ class p extends bt { } // region Shared context observers observePropertyDataset() { - this.consumeContext(kt, (e) => { + this.consumeContext(yt, (e) => { e && (this._blockContext.culture = e.getVariantId().culture ?? ""); }); } @@ -781,7 +781,7 @@ class p extends bt { () => this.callPreviewApi() ); if (this._requestId !== e) return; - i != null ? (this._htmlMarkup = i, this._isLoading = !1) : r ? (this._error = yt.isUmbApiError(r) ? r.message : this.localize.term("blockPreview_renderError"), this._isLoading = !1) : this._isLoading = !1; + i != null ? (this._htmlMarkup = i, this._isLoading = !1) : r ? (this._error = _t.isUmbApiError(r) ? r.message : this.localize.term("blockPreview_renderError"), this._isLoading = !1) : this._isLoading = !1; } catch (i) { if (this._requestId !== e) return; this._error = this.localize.term("blockPreview_renderFailed"), this._isLoading = !1, console.error("Block preview error:", i); @@ -819,7 +819,7 @@ class p extends bt { this._pointerStartPos = null; const r = e.composedPath(), s = ["UUI-ACTION-BAR", "UMB-BLOCK-SCALE-HANDLER"]; if (r.some((o) => o instanceof Element && s.includes(o.tagName))) { - if (r.find((a) => a instanceof _t && a.href?.includes("block/edit"))) + if (r.find((a) => a instanceof wt && a.href?.includes("block/edit"))) return; e.preventDefault(), e.stopPropagation(); return; @@ -834,20 +834,20 @@ class p extends bt { // endregion // region Rendering render() { - return G` - ${this._isLoading ? G`
Loading preview...
` : this._error ? G`` : this._htmlMarkup ? G` Loading preview...` : this._error ? X`` : this._htmlMarkup ? X`${dt(this._htmlMarkup)}` : pt} + title=${qe(this._blockContext.contentElementTypeAlias)} + >${bt(this._htmlMarkup)}` : pt} `; } static { this.styles = [ - se` + ae` a.block-preview-edit { display: block; color: inherit; @@ -933,7 +933,7 @@ g([ g([ D() ], p.prototype, "_error"); -class ne { +class ue { #e; constructor(e) { this.#e = e; @@ -963,7 +963,7 @@ class ne { return await S(this.#e, T.getRteStylesheets({ query: e })); } } -class Ht { +class Xt { #e; constructor(e) { this.#e = e; @@ -972,10 +972,10 @@ class Ht { return await S(this.#e, T.getSettings()); } } -class Xt extends Ne { +class Ft extends Ie { #e; constructor(e) { - super(e), this.#e = new Ht(e); + super(e), this.#e = new Xt(e); } async getSettings() { const e = await this.#e.getSettings(); @@ -983,17 +983,17 @@ class Xt extends Ne { return e.data; } } -var Ft = Object.defineProperty, Jt = Object.getOwnPropertyDescriptor, He = (t) => { +var Jt = Object.defineProperty, Yt = Object.getOwnPropertyDescriptor, Xe = (t) => { throw TypeError(t); -}, Xe = (t, e, i, r) => { - for (var s = r > 1 ? void 0 : r ? Jt(e, i) : e, n = t.length - 1, o; n >= 0; n--) +}, Fe = (t, e, i, r) => { + for (var s = r > 1 ? void 0 : r ? Yt(e, i) : e, n = t.length - 1, o; n >= 0; n--) (o = t[n]) && (s = (r ? o(e, i, s) : o(s)) || s); - return r && s && Ft(e, i, s), s; -}, ye = (t, e, i) => e.has(t) || He("Cannot " + i), j = (t, e, i) => (ye(t, e, "read from private field"), e.get(t)), H = (t, e, i) => e.has(t) ? He("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, i), ce = (t, e, i, r) => (ye(t, e, "write to private field"), e.set(t, i), i), X = (t, e, i) => (ye(t, e, "access private method"), i), L, B, Fe, F, J, Je, _e; -const Yt = "block-grid-preview"; -let I = class extends p { + return r && s && Jt(e, i, s), s; +}, Ce = (t, e, i) => e.has(t) || Xe("Cannot " + i), L = (t, e, i) => (Ce(t, e, "read from private field"), e.get(t)), F = (t, e, i) => e.has(t) ? Xe("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, i), pe = (t, e, i, r) => (Ce(t, e, "write to private field"), e.set(t, i), i), M = (t, e, i) => (Ce(t, e, "access private method"), i), R, B, Je, N, Q, Ye, ne; +const Qt = "block-grid-preview"; +let z = class extends p { constructor() { - super(), H(this, B), H(this, L), this._blockContext = { + super(), F(this, B), F(this, R), this._blockContext = { unique: "", documentTypeUnique: "", contentUdi: "", @@ -1012,7 +1012,7 @@ let I = class extends p { expose: [], contentData: [], settingsData: [] - }, H(this, F, !1), H(this, J), ce(this, L, new ne(this)); + }, F(this, N, !1), F(this, Q), pe(this, R, new ue(this)); } set blockGridValue(t) { const e = t ? { ...t } : {}; @@ -1022,10 +1022,10 @@ let I = class extends p { return this._blockGridValue; } async setupContextObservers() { - this.observePropertyDataset(), await X(this, B, Fe).call(this); + this.observePropertyDataset(), await M(this, B, Je).call(this); } observeBlockValue() { - this.consumeContext(wt, async (t) => { + this.consumeContext(Ct, async (t) => { t && this.observe( _([ t.contentKey, @@ -1047,11 +1047,14 @@ let I = class extends p { a, c ]) => { - const u = this._blockContext.layout?.columnSpan, l = this._blockContext.layout?.rowSpan; - this._blockContext.contentUdi = e ?? "", this._blockContext.settingsUdi = i ?? "", this._blockContext.workspaceEditContentPath = r ?? "", this._blockContext.contentElementTypeAlias = s ?? "", this._blockContext.contentElementTypeKey = n ?? "", this._blockContext.areas = o, this._blockContext.layout = a, this._blockContext.layoutAreas = c, j(this, F) || (ce(this, F, !0), await X(this, B, Je).call(this)), this._htmlMarkup && a && (a.columnSpan !== u || a.rowSpan !== l) && (this.blockGridValue = { + const u = this._blockContext.layout?.columnSpan, l = this._blockContext.layout?.rowSpan, d = this._blockContext.layoutAreas; + this._blockContext.contentUdi = e ?? "", this._blockContext.settingsUdi = i ?? "", this._blockContext.workspaceEditContentPath = r ?? "", this._blockContext.contentElementTypeAlias = s ?? "", this._blockContext.contentElementTypeKey = n ?? "", this._blockContext.areas = o, this._blockContext.layout = a, this._blockContext.layoutAreas = c, !L(this, N) && this._blockContext.contentUdi && (pe(this, N, !0), await M(this, B, Ye).call(this)), !d && c && (o?.length ?? 0) > 0 && L(this, N) && !this._isLoading && (this.blockGridValue = { + ...this._blockGridValue, + layout: { "Umbraco.BlockGrid": M(this, B, ne).call(this) } + }, this.renderBlockPreview()), this._htmlMarkup && a && (a.columnSpan !== u || a.rowSpan !== l) && (this.blockGridValue = { ...this._blockGridValue, - layout: { "Umbraco.BlockGrid": X(this, B, _e).call(this) } - }, clearTimeout(j(this, J)), ce(this, J, setTimeout(() => { + layout: { "Umbraco.BlockGrid": M(this, B, ne).call(this) } + }, clearTimeout(L(this, Q)), pe(this, Q, setTimeout(() => { this.renderBlockPreview(); }, 300))); } @@ -1059,7 +1062,7 @@ let I = class extends p { }); } async callPreviewApi() { - return await j(this, L).previewGridBlock( + return await L(this, R).previewGridBlock( JSON.stringify(this.blockGridValue), { blockEditorAlias: this._blockContext.blockEditorAlias, @@ -1074,7 +1077,7 @@ let I = class extends p { ); } async fetchStylesheets() { - const { data: t } = await j(this, L).getGridStylesheets({ + const { data: t } = await L(this, R).getGridStylesheets({ documentTypeUnique: this._blockContext.documentTypeUnique, nodeKey: this._blockContext.unique }); @@ -1084,9 +1087,9 @@ let I = class extends p { return super.validatePreviewData() && this._blockContext.contentUdi !== ""; } }; -L = /* @__PURE__ */ new WeakMap(); +R = /* @__PURE__ */ new WeakMap(); B = /* @__PURE__ */ new WeakSet(); -Fe = async function() { +Je = async function() { try { await this.getContext(A, { passContextAliasMatches: !0 }), this.consumeContext(A, (t) => { t && this.observe( @@ -1100,10 +1103,10 @@ Fe = async function() { this.observeBlockWorkspaceFallback(); } }; -F = /* @__PURE__ */ new WeakMap(); -J = /* @__PURE__ */ new WeakMap(); -Je = async function() { - this.consumeContext(Ct, (t) => { +N = /* @__PURE__ */ new WeakMap(); +Q = /* @__PURE__ */ new WeakMap(); +Ye = async function() { + this.consumeContext(vt, (t) => { t && this.observe( _([ t.contents, @@ -1112,17 +1115,21 @@ Je = async function() { t.propertyAlias ]), async ([e, i, r, s]) => { - this._blockContext.blockEditorAlias = s ?? "", this.blockGridValue = { + if (this._blockContext.blockEditorAlias = s ?? "", this.blockGridValue = { contentData: e ?? [], settingsData: i ?? [], expose: r ?? [], - layout: { "Umbraco.BlockGrid": X(this, B, _e).call(this) } - }, this._blockContext.blockIndex = e.findIndex((n) => n.key === this._blockContext.contentUdi), !this._htmlMarkup && !this._isLoading && this.renderBlockPreview(); + layout: { "Umbraco.BlockGrid": M(this, B, ne).call(this) } + }, this._blockContext.blockIndex = (e ?? []).findIndex((n) => n.key === this._blockContext.contentUdi), !this._htmlMarkup && !this._isLoading) { + if ((this._blockContext.areas?.length ?? 0) > 0 && !this._blockContext.layoutAreas) + return; + this.renderBlockPreview(); + } } ); }); }; -_e = function() { +ne = function() { return [ { areas: this._blockContext.areas.map((i) => ({ @@ -1136,9 +1143,9 @@ _e = function() { } ]; }; -I.styles = [ +z.styles = [ ...p.styles, - se` + ae` :host { display: block; height: 100%; @@ -1149,23 +1156,23 @@ I.styles = [ } ` ]; -Xe([ +Fe([ C({ attribute: !1 }) -], I.prototype, "blockGridValue", 1); -I = Xe([ - re(Yt) -], I); -var Qt = Object.defineProperty, Zt = Object.getOwnPropertyDescriptor, Ye = (t) => { +], z.prototype, "blockGridValue", 1); +z = Fe([ + le(Qt) +], z); +var Zt = Object.defineProperty, ei = Object.getOwnPropertyDescriptor, Qe = (t) => { throw TypeError(t); -}, we = (t, e, i, r) => { - for (var s = r > 1 ? void 0 : r ? Zt(e, i) : e, n = t.length - 1, o; n >= 0; n--) +}, ve = (t, e, i, r) => { + for (var s = r > 1 ? void 0 : r ? ei(e, i) : e, n = t.length - 1, o; n >= 0; n--) (o = t[n]) && (s = (r ? o(e, i, s) : o(s)) || s); - return r && s && Qt(e, i, s), s; -}, Ce = (t, e, i) => e.has(t) || Ye("Cannot " + i), ue = (t, e, i) => (Ce(t, e, "read from private field"), e.get(t)), he = (t, e, i) => e.has(t) ? Ye("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, i), De = (t, e, i, r) => (Ce(t, e, "write to private field"), e.set(t, i), i), Ve = (t, e, i) => (Ce(t, e, "access private method"), i), M, Y, Qe, Q, Ze; -const ei = "block-list-preview"; + return r && s && Zt(e, i, s), s; +}, me = (t, e, i) => e.has(t) || Qe("Cannot " + i), be = (t, e, i) => (me(t, e, "read from private field"), e.get(t)), fe = (t, e, i) => e.has(t) ? Qe("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, i), $e = (t, e, i, r) => (me(t, e, "write to private field"), e.set(t, i), i), Le = (t, e, i) => (me(t, e, "access private method"), i), I, Z, Ze, ee, et; +const ti = "block-list-preview"; let q = class extends p { constructor() { - super(), he(this, Y), he(this, M), this._blockContext = { + super(), fe(this, Z), fe(this, I), this._blockContext = { unique: "", documentTypeUnique: "", contentUdi: "", @@ -1181,7 +1188,7 @@ let q = class extends p { expose: [], contentData: [], settingsData: [] - }, he(this, Q, !1), De(this, M, new ne(this)); + }, fe(this, ee, !1), $e(this, I, new ue(this)); } set blockListValue(t) { const e = t ? { ...t } : {}; @@ -1191,10 +1198,10 @@ let q = class extends p { return this._blockListValue; } async setupContextObservers() { - this.observePropertyDataset(), await Ve(this, Y, Qe).call(this); + this.observePropertyDataset(), await Le(this, Z, Ze).call(this); } observeBlockValue() { - this.consumeContext(vt, (t) => { + this.consumeContext(mt, (t) => { t && this.observe( _([ t.contentKey, @@ -1210,13 +1217,13 @@ let q = class extends p { s, n ]) => { - this._blockContext.contentUdi = e ?? "", this._blockContext.settingsUdi = i ?? "", this._blockContext.workspaceEditContentPath = r ?? "", this._blockContext.contentElementTypeAlias = s ?? "", this._blockContext.contentElementTypeKey = n ?? "", ue(this, Q) || (De(this, Q, !0), await Ve(this, Y, Ze).call(this)); + this._blockContext.contentUdi = e ?? "", this._blockContext.settingsUdi = i ?? "", this._blockContext.workspaceEditContentPath = r ?? "", this._blockContext.contentElementTypeAlias = s ?? "", this._blockContext.contentElementTypeKey = n ?? "", !be(this, ee) && this._blockContext.contentUdi && ($e(this, ee, !0), await Le(this, Z, et).call(this)); } ); }); } async callPreviewApi() { - return await ue(this, M).previewListBlock( + return await be(this, I).previewListBlock( JSON.stringify(this.blockListValue), { blockEditorAlias: this._blockContext.blockEditorAlias, @@ -1231,7 +1238,7 @@ let q = class extends p { ); } async fetchStylesheets() { - const { data: t } = await ue(this, M).getListStylesheets({ + const { data: t } = await be(this, I).getListStylesheets({ documentTypeUnique: this._blockContext.documentTypeUnique, nodeKey: this._blockContext.unique }); @@ -1241,9 +1248,9 @@ let q = class extends p { return super.validatePreviewData() && this._blockContext.contentUdi !== ""; } }; -M = /* @__PURE__ */ new WeakMap(); -Y = /* @__PURE__ */ new WeakSet(); -Qe = async function() { +I = /* @__PURE__ */ new WeakMap(); +Z = /* @__PURE__ */ new WeakSet(); +Ze = async function() { try { await this.getContext(A, { passContextAliasMatches: !0 }), this.consumeContext(A, (t) => { t && this.observe( @@ -1257,9 +1264,9 @@ Qe = async function() { this.observeBlockWorkspaceFallback(); } }; -Q = /* @__PURE__ */ new WeakMap(); -Ze = function() { - this.consumeContext(mt, (t) => { +ee = /* @__PURE__ */ new WeakMap(); +et = function() { + this.consumeContext(gt, (t) => { t && this.observe( _([ t.contents, @@ -1289,7 +1296,7 @@ Ze = function() { }; q.styles = [ ...p.styles, - se` + ae` :host { display: block; height: 100%; @@ -1300,26 +1307,26 @@ q.styles = [ } ` ]; -we([ +ve([ D() ], q.prototype, "_blockListValue", 2); -we([ +ve([ C({ attribute: !1 }) ], q.prototype, "blockListValue", 1); -q = we([ - re(ei) +q = ve([ + le(ti) ], q); -var ti = Object.defineProperty, ii = Object.getOwnPropertyDescriptor, et = (t) => { +var ii = Object.defineProperty, si = Object.getOwnPropertyDescriptor, tt = (t) => { throw TypeError(t); -}, ve = (t, e, i, r) => { - for (var s = r > 1 ? void 0 : r ? ii(e, i) : e, n = t.length - 1, o; n >= 0; n--) +}, ge = (t, e, i, r) => { + for (var s = r > 1 ? void 0 : r ? si(e, i) : e, n = t.length - 1, o; n >= 0; n--) (o = t[n]) && (s = (r ? o(e, i, s) : o(s)) || s); - return r && s && ti(e, i, s), s; -}, me = (t, e, i) => e.has(t) || et("Cannot " + i), pe = (t, e, i) => (me(t, e, "read from private field"), e.get(t)), de = (t, e, i) => e.has(t) ? et("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, i), $e = (t, e, i, r) => (me(t, e, "write to private field"), e.set(t, i), i), Le = (t, e, i) => (me(t, e, "access private method"), i), R, Z, tt, ee, it; -const si = "block-single-preview"; + return r && s && ii(e, i, s), s; +}, xe = (t, e, i) => e.has(t) || tt("Cannot " + i), ke = (t, e, i) => (xe(t, e, "read from private field"), e.get(t)), ye = (t, e, i) => e.has(t) ? tt("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, i), Me = (t, e, i, r) => (xe(t, e, "write to private field"), e.set(t, i), i), Re = (t, e, i) => (xe(t, e, "access private method"), i), K, te, it, ie, st; +const ri = "block-single-preview"; let O = class extends p { constructor() { - super(), de(this, Z), de(this, R), this._blockContext = { + super(), ye(this, te), ye(this, K), this._blockContext = { unique: "", documentTypeUnique: "", contentUdi: "", @@ -1335,7 +1342,7 @@ let O = class extends p { expose: [], contentData: [], settingsData: [] - }, de(this, ee, !1), $e(this, R, new ne(this)); + }, ye(this, ie, !1), Me(this, K, new ue(this)); } set blockSingleValue(t) { const e = t ? { ...t } : {}; @@ -1345,10 +1352,10 @@ let O = class extends p { return this._blockSingleValue; } async setupContextObservers() { - this.observePropertyDataset(), await Le(this, Z, tt).call(this); + this.observePropertyDataset(), await Re(this, te, it).call(this); } observeBlockValue() { - this.consumeContext(gt, (t) => { + this.consumeContext(xt, (t) => { t && this.observe( _([ t.contentKey, @@ -1364,13 +1371,13 @@ let O = class extends p { s, n ]) => { - this._blockContext.contentUdi = e ?? "", this._blockContext.settingsUdi = i ?? "", this._blockContext.workspaceEditContentPath = r ?? "", this._blockContext.contentElementTypeAlias = s ?? "", this._blockContext.contentElementTypeKey = n ?? "", pe(this, ee) || ($e(this, ee, !0), await Le(this, Z, it).call(this)); + this._blockContext.contentUdi = e ?? "", this._blockContext.settingsUdi = i ?? "", this._blockContext.workspaceEditContentPath = r ?? "", this._blockContext.contentElementTypeAlias = s ?? "", this._blockContext.contentElementTypeKey = n ?? "", ke(this, ie) || (Me(this, ie, !0), await Re(this, te, st).call(this)); } ); }); } async callPreviewApi() { - return await pe(this, R).previewSingleBlock( + return await ke(this, K).previewSingleBlock( JSON.stringify(this.blockSingleValue), { blockEditorAlias: this._blockContext.blockEditorAlias, @@ -1385,7 +1392,7 @@ let O = class extends p { ); } async fetchStylesheets() { - const { data: t } = await pe(this, R).getSingleBlockStylesheets({ + const { data: t } = await ke(this, K).getSingleBlockStylesheets({ documentTypeUnique: this._blockContext.documentTypeUnique, nodeKey: this._blockContext.unique }); @@ -1395,9 +1402,9 @@ let O = class extends p { return super.validatePreviewData() && this._blockContext.contentUdi !== ""; } }; -R = /* @__PURE__ */ new WeakMap(); -Z = /* @__PURE__ */ new WeakSet(); -tt = async function() { +K = /* @__PURE__ */ new WeakMap(); +te = /* @__PURE__ */ new WeakSet(); +it = async function() { try { await this.getContext(A, { passContextAliasMatches: !0 }), this.consumeContext(A, (t) => { t && this.observe( @@ -1411,9 +1418,9 @@ tt = async function() { this.observeBlockWorkspaceFallback(); } }; -ee = /* @__PURE__ */ new WeakMap(); -it = function() { - this.consumeContext(xt, (t) => { +ie = /* @__PURE__ */ new WeakMap(); +st = function() { + this.consumeContext(St, (t) => { t && this.observe( _([ t.contents, @@ -1443,7 +1450,7 @@ it = function() { }; O.styles = [ ...p.styles, - se` + ae` :host { display: block; height: 100%; @@ -1454,26 +1461,26 @@ O.styles = [ } ` ]; -ve([ +ge([ D() ], O.prototype, "_blockSingleValue", 2); -ve([ +ge([ C({ attribute: !1 }) ], O.prototype, "blockSingleValue", 1); -O = ve([ - re(si) +O = ge([ + le(ri) ], O); -var ri = Object.defineProperty, oi = Object.getOwnPropertyDescriptor, st = (t) => { +var oi = Object.defineProperty, ni = Object.getOwnPropertyDescriptor, rt = (t) => { throw TypeError(t); -}, ge = (t, e, i, r) => { - for (var s = r > 1 ? void 0 : r ? oi(e, i) : e, n = t.length - 1, o; n >= 0; n--) +}, Se = (t, e, i, r) => { + for (var s = r > 1 ? void 0 : r ? ni(e, i) : e, n = t.length - 1, o; n >= 0; n--) (o = t[n]) && (s = (r ? o(e, i, s) : o(s)) || s); - return r && s && ri(e, i, s), s; -}, xe = (t, e, i) => e.has(t) || st("Cannot " + i), fe = (t, e, i) => (xe(t, e, "read from private field"), e.get(t)), be = (t, e, i) => e.has(t) ? st("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, i), Me = (t, e, i, r) => (xe(t, e, "write to private field"), e.set(t, i), i), Re = (t, e, i) => (xe(t, e, "access private method"), i), N, te, rt, ie, ot; -const ni = "rich-text-preview"; -let K = class extends p { + return r && s && oi(e, i, s), s; +}, Te = (t, e, i) => e.has(t) || rt("Cannot " + i), J = (t, e, i) => (Te(t, e, "read from private field"), e.get(t)), Y = (t, e, i) => e.has(t) ? rt("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, i), _e = (t, e, i, r) => (Te(t, e, "write to private field"), e.set(t, i), i), Ne = (t, e, i) => (Te(t, e, "access private method"), i), W, se, ot, re, oe, nt; +const ai = "rich-text-preview"; +let G = class extends p { constructor() { - super(), be(this, te), be(this, N), this._blockContext = { + super(), Y(this, se), Y(this, W), this._blockContext = { unique: "", documentTypeUnique: "", contentUdi: "", @@ -1489,7 +1496,7 @@ let K = class extends p { expose: [], contentData: [], settingsData: [] - }, be(this, ie, !1), Me(this, N, new ne(this)); + }, Y(this, re, !1), Y(this, oe, !1), _e(this, W, new ue(this)); } set blockRteValue(t) { const e = t ? { ...t } : {}; @@ -1499,10 +1506,10 @@ let K = class extends p { return this._blockRteValue; } setupContextObservers() { - this.observePropertyDataset(), Re(this, te, rt).call(this); + this.observePropertyDataset(), this.observeBlockValue(), Ne(this, se, ot).call(this); } observeBlockValue() { - this.consumeContext(St, (t) => { + J(this, re) || (_e(this, re, !0), this.consumeContext(Tt, (t) => { t != null && this.observe( _([ t.contentKey, @@ -1518,13 +1525,13 @@ let K = class extends p { s, n ]) => { - this._blockContext.contentUdi = e ?? "", this._blockContext.settingsUdi = i ?? "", this._blockContext.workspaceEditContentPath = r ?? "", this._blockContext.contentElementTypeAlias = s ?? "", this._blockContext.contentElementTypeKey = n ?? "", fe(this, ie) || (Me(this, ie, !0), await Re(this, te, ot).call(this)); + this._blockContext.contentUdi = e ?? "", this._blockContext.settingsUdi = i ?? "", this._blockContext.workspaceEditContentPath = r ?? "", this._blockContext.contentElementTypeAlias = s ?? "", this._blockContext.contentElementTypeKey = n ?? "", !J(this, oe) && this._blockContext.contentUdi && (_e(this, oe, !0), await Ne(this, se, nt).call(this)); } ); - }); + })); } async callPreviewApi() { - return await fe(this, N).previewRichTextMarkup( + return await J(this, W).previewRichTextMarkup( JSON.stringify(this.blockRteValue), { blockEditorAlias: this._blockContext.blockEditorAlias, @@ -1536,18 +1543,18 @@ let K = class extends p { ); } async fetchStylesheets() { - const { data: t } = await fe(this, N).getRteStylesheets({ + const { data: t } = await J(this, W).getRteStylesheets({ documentTypeUnique: this._blockContext.documentTypeUnique, nodeKey: this._blockContext.unique }); return t; } }; -N = /* @__PURE__ */ new WeakMap(); -te = /* @__PURE__ */ new WeakSet(); -rt = function() { +W = /* @__PURE__ */ new WeakMap(); +se = /* @__PURE__ */ new WeakSet(); +ot = function() { try { - this.consumeContext(Et, (t) => { + this.consumeContext(Pt, (t) => { t && (this._workspaceContextResolved = !0, this.observe( _([t.unique, t.contentTypeUnique]), async ([e, i]) => { @@ -1559,9 +1566,10 @@ rt = function() { this.observeBlockWorkspaceFallback(); } }; -ie = /* @__PURE__ */ new WeakMap(); -ot = function() { - this.consumeContext(Tt, (t) => { +re = /* @__PURE__ */ new WeakMap(); +oe = /* @__PURE__ */ new WeakMap(); +nt = function() { + this.consumeContext(Et, (t) => { t != null && this.observe( _([ t.contents, @@ -1589,16 +1597,16 @@ ot = function() { ); }); }; -ge([ +Se([ D() -], K.prototype, "_blockRteValue", 2); -ge([ +], G.prototype, "_blockRteValue", 2); +Se([ C({ attribute: !1 }) -], K.prototype, "blockRteValue", 1); -K = ge([ - re(ni) -], K); -class ai { +], G.prototype, "blockRteValue", 1); +G = Se([ + le(ai) +], G); +class li { #e; #t = 0; #i = []; @@ -1621,17 +1629,19 @@ class ai { } } } -class ke extends Ne { - #e = new ai(3); +class we extends Ie { + #e = new li(3); #t = /* @__PURE__ */ new Map(); /** Shared concurrency-limited queue for preview API requests. */ get requestQueue() { return this.#e; } // Node key cache used as a fallback when a preview cannot reach its content - // workspace directly (e.g. when rendered inside a portaled block-edit modal). - #i = new Ae(""); - #s = new Ae(""); + // workspace directly (e.g. when nested inside another block, whose workspace + // context shadows the document workspace under the shared 'UmbWorkspaceContext' + // alias). + #i = new Oe(""); + #s = new Oe(""); constructor(e) { super(e); } @@ -1657,18 +1667,18 @@ class ke extends Ne { return this.#t.set(e, r), r; } } -const li = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +const ci = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - BlockPreviewContext: ke, - default: ke -}, Symbol.toStringTag, { value: "Module" })), ci = [ + BlockPreviewContext: we, + default: we +}, Symbol.toStringTag, { value: "Module" })), ui = [ { type: "globalContext", alias: "BlockPreview.Context", name: "BlockPreview Context", - js: () => Promise.resolve().then(() => li) + js: () => Promise.resolve().then(() => ci) } -], ui = ci, hi = [ +], hi = ui, di = [ { type: "localization", alias: "BlockPreview.Localization.En", @@ -1678,19 +1688,19 @@ const li = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ }, js: () => import("./en-BNTuLdKT.js") } -], pi = hi, Ui = async (t, e) => { - t.consumeContext(ut, async (i) => { +], pi = di, Bi = async (t, e) => { + t.consumeContext(ht, async (i) => { if (!i) return; const r = i.getOpenApiConfiguration(); - b.setConfig({ + f.setConfig({ baseUrl: r?.base ?? "", auth: r?.token ?? void 0, credentials: r?.credentials ?? "same-origin" - }), b.interceptors.request.use(async (a, c) => { + }), f.interceptors.request.use(async (a, c) => { const u = await r.token(); return a.headers.set("Authorization", `Bearer ${u}`), a; }); - const n = await new Xt(t).getSettings(); + const n = await new Ft(t).getSettings(); let o = []; if (n) { if (n.blockGrid.enabled) { @@ -1698,7 +1708,7 @@ const li = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ type: "blockEditorCustomView", alias: "BlockPreview.GridCustomView", name: "BlockPreview Grid Custom View", - element: I, + element: z, forBlockEditor: "block-grid" }; n.blockGrid.contentTypes?.length !== 0 && (a.forContentTypeAlias = n.blockGrid.contentTypes), o.push(a); @@ -1728,7 +1738,7 @@ const li = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ type: "blockEditorCustomView", alias: "BlockPreview.RichTextCustomView", name: "BlockPreview Rich Text Custom View", - element: K, + element: G, forBlockEditor: "block-rte" }; n.richText.contentTypes?.length !== 0 && (a.forContentTypeAlias = n.richText.contentTypes), o.push(a); @@ -1736,20 +1746,20 @@ const li = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ } e.registerMany([ ...o, - ...ui, + ...hi, ...pi - ]), t.provideContext(je, new ke(t)); + ]), t.provideContext(He, new we(t)); }); }; export { - I as BlockGridPreviewCustomView, + z as BlockGridPreviewCustomView, q as BlockListPreviewCustomView, p as BlockPreviewBaseElement, O as BlockSinglePreviewCustomView, - ne as PreviewDataSource, - K as RichTextPreviewCustomView, - Ht as SettingsDataSource, - Xt as SettingsRepository, - Ui as onInit + ue as PreviewDataSource, + G as RichTextPreviewCustomView, + Xt as SettingsDataSource, + Ft as SettingsRepository, + Bi as onInit }; //# sourceMappingURL=index.js.map diff --git a/src/Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/index.js.map b/src/Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/index.js.map index 011f57ba..3a380aee 100644 --- a/src/Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/index.js.map +++ b/src/Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../../../../Umbraco.Community.BlockPreview.UI/src/api/core/bodySerializer.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/serverSentEvents.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/pathSerializer.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/utils.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/auth.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/client/utils.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/client/client.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/client.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/sdk.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/block-preview.context-token.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-preview-base.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/repository/preview.data-source.ts","../../../../Umbraco.Community.BlockPreview.UI/src/repository/settings.data-source.ts","../../../../Umbraco.Community.BlockPreview.UI/src/repository/settings.repository.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-grid-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-list-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-single-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/rich-text-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/block-preview-request-queue.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/block-preview.context.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/manifests.ts","../../../../Umbraco.Community.BlockPreview.UI/src/localization/manifests.ts","../../../../Umbraco.Community.BlockPreview.UI/src/index.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n ArrayStyle,\n ObjectStyle,\n SerializerOptions,\n} from './pathSerializer.gen';\n\nexport type QuerySerializer = (query: Record) => string;\n\nexport type BodySerializer = (body: any) => any;\n\nexport interface QuerySerializerOptions {\n allowReserved?: boolean;\n array?: SerializerOptions;\n object?: SerializerOptions;\n}\n\nconst serializeFormDataPair = (\n data: FormData,\n key: string,\n value: unknown,\n): void => {\n if (typeof value === 'string' || value instanceof Blob) {\n data.append(key, value);\n } else if (value instanceof Date) {\n data.append(key, value.toISOString());\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nconst serializeUrlSearchParamsPair = (\n data: URLSearchParams,\n key: string,\n value: unknown,\n): void => {\n if (typeof value === 'string') {\n data.append(key, value);\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nexport const formDataBodySerializer = {\n bodySerializer: | Array>>(\n body: T,\n ): FormData => {\n const data = new FormData();\n\n Object.entries(body).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeFormDataPair(data, key, v));\n } else {\n serializeFormDataPair(data, key, value);\n }\n });\n\n return data;\n },\n};\n\nexport const jsonBodySerializer = {\n bodySerializer: (body: T): string =>\n JSON.stringify(body, (_key, value) =>\n typeof value === 'bigint' ? value.toString() : value,\n ),\n};\n\nexport const urlSearchParamsBodySerializer = {\n bodySerializer: | Array>>(\n body: T,\n ): string => {\n const data = new URLSearchParams();\n\n Object.entries(body).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n } else {\n serializeUrlSearchParamsPair(data, key, value);\n }\n });\n\n return data.toString();\n },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Config } from './types.gen';\n\nexport type ServerSentEventsOptions = Omit<\n RequestInit,\n 'method'\n> &\n Pick & {\n /**\n * Fetch API implementation. You can use this option to provide a custom\n * fetch instance.\n *\n * @default globalThis.fetch\n */\n fetch?: typeof fetch;\n /**\n * Implementing clients can call request interceptors inside this hook.\n */\n onRequest?: (url: string, init: RequestInit) => Promise;\n /**\n * Callback invoked when a network or parsing error occurs during streaming.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param error The error that occurred.\n */\n onSseError?: (error: unknown) => void;\n /**\n * Callback invoked when an event is streamed from the server.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param event Event streamed from the server.\n * @returns Nothing (void).\n */\n onSseEvent?: (event: StreamEvent) => void;\n serializedBody?: RequestInit['body'];\n /**\n * Default retry delay in milliseconds.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 3000\n */\n sseDefaultRetryDelay?: number;\n /**\n * Maximum number of retry attempts before giving up.\n */\n sseMaxRetryAttempts?: number;\n /**\n * Maximum retry delay in milliseconds.\n *\n * Applies only when exponential backoff is used.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 30000\n */\n sseMaxRetryDelay?: number;\n /**\n * Optional sleep function for retry backoff.\n *\n * Defaults to using `setTimeout`.\n */\n sseSleepFn?: (ms: number) => Promise;\n url: string;\n };\n\nexport interface StreamEvent {\n data: TData;\n event?: string;\n id?: string;\n retry?: number;\n}\n\nexport type ServerSentEventsResult<\n TData = unknown,\n TReturn = void,\n TNext = unknown,\n> = {\n stream: AsyncGenerator<\n TData extends Record ? TData[keyof TData] : TData,\n TReturn,\n TNext\n >;\n};\n\nexport const createSseClient = ({\n onRequest,\n onSseError,\n onSseEvent,\n responseTransformer,\n responseValidator,\n sseDefaultRetryDelay,\n sseMaxRetryAttempts,\n sseMaxRetryDelay,\n sseSleepFn,\n url,\n ...options\n}: ServerSentEventsOptions): ServerSentEventsResult => {\n let lastEventId: string | undefined;\n\n const sleep =\n sseSleepFn ??\n ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n const createStream = async function* () {\n let retryDelay: number = sseDefaultRetryDelay ?? 3000;\n let attempt = 0;\n const signal = options.signal ?? new AbortController().signal;\n\n while (true) {\n if (signal.aborted) break;\n\n attempt++;\n\n const headers =\n options.headers instanceof Headers\n ? options.headers\n : new Headers(options.headers as Record | undefined);\n\n if (lastEventId !== undefined) {\n headers.set('Last-Event-ID', lastEventId);\n }\n\n try {\n const requestInit: RequestInit = {\n redirect: 'follow',\n ...options,\n body: options.serializedBody,\n headers,\n signal,\n };\n let request = new Request(url, requestInit);\n if (onRequest) {\n request = await onRequest(url, requestInit);\n }\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = options.fetch ?? globalThis.fetch;\n const response = await _fetch(request);\n\n if (!response.ok)\n throw new Error(\n `SSE failed: ${response.status} ${response.statusText}`,\n );\n\n if (!response.body) throw new Error('No body in SSE response');\n\n const reader = response.body\n .pipeThrough(new TextDecoderStream())\n .getReader();\n\n let buffer = '';\n\n const abortHandler = () => {\n try {\n reader.cancel();\n } catch {\n // noop\n }\n };\n\n signal.addEventListener('abort', abortHandler);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += value;\n\n const chunks = buffer.split('\\n\\n');\n buffer = chunks.pop() ?? '';\n\n for (const chunk of chunks) {\n const lines = chunk.split('\\n');\n const dataLines: Array = [];\n let eventName: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n dataLines.push(line.replace(/^data:\\s*/, ''));\n } else if (line.startsWith('event:')) {\n eventName = line.replace(/^event:\\s*/, '');\n } else if (line.startsWith('id:')) {\n lastEventId = line.replace(/^id:\\s*/, '');\n } else if (line.startsWith('retry:')) {\n const parsed = Number.parseInt(\n line.replace(/^retry:\\s*/, ''),\n 10,\n );\n if (!Number.isNaN(parsed)) {\n retryDelay = parsed;\n }\n }\n }\n\n let data: unknown;\n let parsedJson = false;\n\n if (dataLines.length) {\n const rawData = dataLines.join('\\n');\n try {\n data = JSON.parse(rawData);\n parsedJson = true;\n } catch {\n data = rawData;\n }\n }\n\n if (parsedJson) {\n if (responseValidator) {\n await responseValidator(data);\n }\n\n if (responseTransformer) {\n data = await responseTransformer(data);\n }\n }\n\n onSseEvent?.({\n data,\n event: eventName,\n id: lastEventId,\n retry: retryDelay,\n });\n\n if (dataLines.length) {\n yield data as any;\n }\n }\n }\n } finally {\n signal.removeEventListener('abort', abortHandler);\n reader.releaseLock();\n }\n\n break; // exit loop on normal completion\n } catch (error) {\n // connection failed or aborted; retry after delay\n onSseError?.(error);\n\n if (\n sseMaxRetryAttempts !== undefined &&\n attempt >= sseMaxRetryAttempts\n ) {\n break; // stop after firing error\n }\n\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(\n retryDelay * 2 ** (attempt - 1),\n sseMaxRetryDelay ?? 30000,\n );\n await sleep(backoff);\n }\n }\n };\n\n const stream = createStream();\n\n return { stream };\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\ninterface SerializeOptions\n extends SerializePrimitiveOptions,\n SerializerOptions {}\n\ninterface SerializePrimitiveOptions {\n allowReserved?: boolean;\n name: string;\n}\n\nexport interface SerializerOptions {\n /**\n * @default true\n */\n explode: boolean;\n style: T;\n}\n\nexport type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited';\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\ntype MatrixStyle = 'label' | 'matrix' | 'simple';\nexport type ObjectStyle = 'form' | 'deepObject';\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\n\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\n value: string;\n}\n\nexport const separatorArrayExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const separatorArrayNoExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'form':\n return ',';\n case 'pipeDelimited':\n return '|';\n case 'spaceDelimited':\n return '%20';\n default:\n return ',';\n }\n};\n\nexport const separatorObjectExplode = (style: ObjectSeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const serializeArrayParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n}: SerializeOptions & {\n value: unknown[];\n}) => {\n if (!explode) {\n const joinedValues = (\n allowReserved ? value : value.map((v) => encodeURIComponent(v as string))\n ).join(separatorArrayNoExplode(style));\n switch (style) {\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n case 'simple':\n return joinedValues;\n default:\n return `${name}=${joinedValues}`;\n }\n }\n\n const separator = separatorArrayExplode(style);\n const joinedValues = value\n .map((v) => {\n if (style === 'label' || style === 'simple') {\n return allowReserved ? v : encodeURIComponent(v as string);\n }\n\n return serializePrimitiveParam({\n allowReserved,\n name,\n value: v as string,\n });\n })\n .join(separator);\n return style === 'label' || style === 'matrix'\n ? separator + joinedValues\n : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n allowReserved,\n name,\n value,\n}: SerializePrimitiveParam) => {\n if (value === undefined || value === null) {\n return '';\n }\n\n if (typeof value === 'object') {\n throw new Error(\n 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.',\n );\n }\n\n return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\n\nexport const serializeObjectParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n valueOnly,\n}: SerializeOptions & {\n value: Record | Date;\n valueOnly?: boolean;\n}) => {\n if (value instanceof Date) {\n return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n }\n\n if (style !== 'deepObject' && !explode) {\n let values: string[] = [];\n Object.entries(value).forEach(([key, v]) => {\n values = [\n ...values,\n key,\n allowReserved ? (v as string) : encodeURIComponent(v as string),\n ];\n });\n const joinedValues = values.join(',');\n switch (style) {\n case 'form':\n return `${name}=${joinedValues}`;\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n default:\n return joinedValues;\n }\n }\n\n const separator = separatorObjectExplode(style);\n const joinedValues = Object.entries(value)\n .map(([key, v]) =>\n serializePrimitiveParam({\n allowReserved,\n name: style === 'deepObject' ? `${name}[${key}]` : key,\n value: v as string,\n }),\n )\n .join(separator);\n return style === 'label' || style === 'matrix'\n ? separator + joinedValues\n : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { BodySerializer, QuerySerializer } from './bodySerializer.gen';\nimport {\n type ArraySeparatorStyle,\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from './pathSerializer.gen';\n\nexport interface PathSerializer {\n path: Record;\n url: string;\n}\n\nexport const PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => {\n let url = _url;\n const matches = _url.match(PATH_PARAM_RE);\n if (matches) {\n for (const match of matches) {\n let explode = false;\n let name = match.substring(1, match.length - 1);\n let style: ArraySeparatorStyle = 'simple';\n\n if (name.endsWith('*')) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n\n if (name.startsWith('.')) {\n name = name.substring(1);\n style = 'label';\n } else if (name.startsWith(';')) {\n name = name.substring(1);\n style = 'matrix';\n }\n\n const value = path[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n url = url.replace(\n match,\n serializeArrayParam({ explode, name, style, value }),\n );\n continue;\n }\n\n if (typeof value === 'object') {\n url = url.replace(\n match,\n serializeObjectParam({\n explode,\n name,\n style,\n value: value as Record,\n valueOnly: true,\n }),\n );\n continue;\n }\n\n if (style === 'matrix') {\n url = url.replace(\n match,\n `;${serializePrimitiveParam({\n name,\n value: value as string,\n })}`,\n );\n continue;\n }\n\n const replaceValue = encodeURIComponent(\n style === 'label' ? `.${value as string}` : (value as string),\n );\n url = url.replace(match, replaceValue);\n }\n }\n return url;\n};\n\nexport const getUrl = ({\n baseUrl,\n path,\n query,\n querySerializer,\n url: _url,\n}: {\n baseUrl?: string;\n path?: Record;\n query?: Record;\n querySerializer: QuerySerializer;\n url: string;\n}) => {\n const pathUrl = _url.startsWith('/') ? _url : `/${_url}`;\n let url = (baseUrl ?? '') + pathUrl;\n if (path) {\n url = defaultPathSerializer({ path, url });\n }\n let search = query ? querySerializer(query) : '';\n if (search.startsWith('?')) {\n search = search.substring(1);\n }\n if (search) {\n url += `?${search}`;\n }\n return url;\n};\n\nexport function getValidRequestBody(options: {\n body?: unknown;\n bodySerializer?: BodySerializer | null;\n serializedBody?: unknown;\n}) {\n const hasBody = options.body !== undefined;\n const isSerializedBody = hasBody && options.bodySerializer;\n\n if (isSerializedBody) {\n if ('serializedBody' in options) {\n const hasSerializedBody =\n options.serializedBody !== undefined && options.serializedBody !== '';\n\n return hasSerializedBody ? options.serializedBody : null;\n }\n\n // not all clients implement a serializedBody property (i.e. client-axios)\n return options.body !== '' ? options.body : null;\n }\n\n // plain/text body\n if (hasBody) {\n return options.body;\n }\n\n // no body was provided\n return undefined;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nexport type AuthToken = string | undefined;\n\nexport interface Auth {\n /**\n * Which part of the request do we use to send the auth?\n *\n * @default 'header'\n */\n in?: 'header' | 'query' | 'cookie';\n /**\n * Header or query parameter name.\n *\n * @default 'Authorization'\n */\n name?: string;\n scheme?: 'basic' | 'bearer';\n type: 'apiKey' | 'http';\n}\n\nexport const getAuthToken = async (\n auth: Auth,\n callback: ((auth: Auth) => Promise | AuthToken) | AuthToken,\n): Promise => {\n const token =\n typeof callback === 'function' ? await callback(auth) : callback;\n\n if (!token) {\n return;\n }\n\n if (auth.scheme === 'bearer') {\n return `Bearer ${token}`;\n }\n\n if (auth.scheme === 'basic') {\n return `Basic ${btoa(token)}`;\n }\n\n return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { getAuthToken } from '../core/auth.gen';\nimport type { QuerySerializerOptions } from '../core/bodySerializer.gen';\nimport { jsonBodySerializer } from '../core/bodySerializer.gen';\nimport {\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from '../core/pathSerializer.gen';\nimport { getUrl } from '../core/utils.gen';\nimport type { Client, ClientOptions, Config, RequestOptions } from './types.gen';\n\nexport const createQuerySerializer = ({\n allowReserved,\n array,\n object,\n}: QuerySerializerOptions = {}) => {\n const querySerializer = (queryParams: T) => {\n const search: string[] = [];\n if (queryParams && typeof queryParams === 'object') {\n for (const name in queryParams) {\n const value = queryParams[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n const serializedArray = serializeArrayParam({\n allowReserved,\n explode: true,\n name,\n style: 'form',\n value,\n ...array,\n });\n if (serializedArray) search.push(serializedArray);\n } else if (typeof value === 'object') {\n const serializedObject = serializeObjectParam({\n allowReserved,\n explode: true,\n name,\n style: 'deepObject',\n value: value as Record,\n ...object,\n });\n if (serializedObject) search.push(serializedObject);\n } else {\n const serializedPrimitive = serializePrimitiveParam({\n allowReserved,\n name,\n value: value as string,\n });\n if (serializedPrimitive) search.push(serializedPrimitive);\n }\n }\n }\n return search.join('&');\n };\n return querySerializer;\n};\n\n/**\n * Infers parseAs value from provided Content-Type header.\n */\nexport const getParseAs = (\n contentType: string | null,\n): Exclude => {\n if (!contentType) {\n // If no Content-Type header is provided, the best we can do is return the raw response body,\n // which is effectively the same as the 'stream' option.\n return 'stream';\n }\n\n const cleanContent = contentType.split(';')[0]?.trim();\n\n if (!cleanContent) {\n return;\n }\n\n if (\n cleanContent.startsWith('application/json') ||\n cleanContent.endsWith('+json')\n ) {\n return 'json';\n }\n\n if (cleanContent === 'multipart/form-data') {\n return 'formData';\n }\n\n if (\n ['application/', 'audio/', 'image/', 'video/'].some((type) =>\n cleanContent.startsWith(type),\n )\n ) {\n return 'blob';\n }\n\n if (cleanContent.startsWith('text/')) {\n return 'text';\n }\n\n return;\n};\n\nconst checkForExistence = (\n options: Pick & {\n headers: Headers;\n },\n name?: string,\n): boolean => {\n if (!name) {\n return false;\n }\n if (\n options.headers.has(name) ||\n options.query?.[name] ||\n options.headers.get('Cookie')?.includes(`${name}=`)\n ) {\n return true;\n }\n return false;\n};\n\nexport const setAuthParams = async ({\n security,\n ...options\n}: Pick, 'security'> &\n Pick & {\n headers: Headers;\n }) => {\n for (const auth of security) {\n if (checkForExistence(options, auth.name)) {\n continue;\n }\n\n const token = await getAuthToken(auth, options.auth);\n\n if (!token) {\n continue;\n }\n\n const name = auth.name ?? 'Authorization';\n\n switch (auth.in) {\n case 'query':\n if (!options.query) {\n options.query = {};\n }\n options.query[name] = token;\n break;\n case 'cookie':\n options.headers.append('Cookie', `${name}=${token}`);\n break;\n case 'header':\n default:\n options.headers.set(name, token);\n break;\n }\n }\n};\n\nexport const buildUrl: Client['buildUrl'] = (options) =>\n getUrl({\n baseUrl: options.baseUrl as string,\n path: options.path,\n query: options.query,\n querySerializer:\n typeof options.querySerializer === 'function'\n ? options.querySerializer\n : createQuerySerializer(options.querySerializer),\n url: options.url,\n });\n\nexport const mergeConfigs = (a: Config, b: Config): Config => {\n const config = { ...a, ...b };\n if (config.baseUrl?.endsWith('/')) {\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n }\n config.headers = mergeHeaders(a.headers, b.headers);\n return config;\n};\n\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\n const entries: Array<[string, string]> = [];\n headers.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries;\n};\n\nexport const mergeHeaders = (\n ...headers: Array['headers'] | undefined>\n): Headers => {\n const mergedHeaders = new Headers();\n for (const header of headers) {\n if (!header) {\n continue;\n }\n\n const iterator =\n header instanceof Headers\n ? headersEntries(header)\n : Object.entries(header);\n\n for (const [key, value] of iterator) {\n if (value === null) {\n mergedHeaders.delete(key);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n mergedHeaders.append(key, v as string);\n }\n } else if (value !== undefined) {\n // assume object headers are meant to be JSON stringified, i.e. their\n // content value in OpenAPI specification is 'application/json'\n mergedHeaders.set(\n key,\n typeof value === 'object' ? JSON.stringify(value) : (value as string),\n );\n }\n }\n }\n return mergedHeaders;\n};\n\ntype ErrInterceptor = (\n error: Err,\n response: Res,\n request: Req,\n options: Options,\n) => Err | Promise;\n\ntype ReqInterceptor = (\n request: Req,\n options: Options,\n) => Req | Promise;\n\ntype ResInterceptor = (\n response: Res,\n request: Req,\n options: Options,\n) => Res | Promise;\n\nclass Interceptors {\n fns: Array = [];\n\n clear(): void {\n this.fns = [];\n }\n\n eject(id: number | Interceptor): void {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = null;\n }\n }\n\n exists(id: number | Interceptor): boolean {\n const index = this.getInterceptorIndex(id);\n return Boolean(this.fns[index]);\n }\n\n getInterceptorIndex(id: number | Interceptor): number {\n if (typeof id === 'number') {\n return this.fns[id] ? id : -1;\n }\n return this.fns.indexOf(id);\n }\n\n update(\n id: number | Interceptor,\n fn: Interceptor,\n ): number | Interceptor | false {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = fn;\n return id;\n }\n return false;\n }\n\n use(fn: Interceptor): number {\n this.fns.push(fn);\n return this.fns.length - 1;\n }\n}\n\nexport interface Middleware {\n error: Interceptors>;\n request: Interceptors>;\n response: Interceptors>;\n}\n\nexport const createInterceptors = (): Middleware<\n Req,\n Res,\n Err,\n Options\n> => ({\n error: new Interceptors>(),\n request: new Interceptors>(),\n response: new Interceptors>(),\n});\n\nconst defaultQuerySerializer = createQuerySerializer({\n allowReserved: false,\n array: {\n explode: true,\n style: 'form',\n },\n object: {\n explode: true,\n style: 'deepObject',\n },\n});\n\nconst defaultHeaders = {\n 'Content-Type': 'application/json',\n};\n\nexport const createConfig = (\n override: Config & T> = {},\n): Config & T> => ({\n ...jsonBodySerializer,\n headers: defaultHeaders,\n parseAs: 'auto',\n querySerializer: defaultQuerySerializer,\n ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createSseClient } from '../core/serverSentEvents.gen';\nimport type { HttpMethod } from '../core/types.gen';\nimport { getValidRequestBody } from '../core/utils.gen';\nimport type {\n Client,\n Config,\n RequestOptions,\n ResolvedRequestOptions,\n} from './types.gen';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils.gen';\n\ntype ReqInit = Omit & {\n body?: any;\n headers: ReturnType;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<\n Request,\n Response,\n unknown,\n ResolvedRequestOptions\n >();\n\n const beforeRequest = async (options: RequestOptions) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n serializedBody: undefined,\n };\n\n if (opts.security) {\n await setAuthParams({\n ...opts,\n security: opts.security,\n });\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body);\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.serializedBody === '') {\n opts.headers.delete('Content-Type');\n }\n\n const url = buildUrl(opts);\n\n return { opts, url };\n };\n\n const request: Client['request'] = async (options) => {\n // @ts-expect-error\n const { opts, url } = await beforeRequest(options);\n const requestInit: ReqInit = {\n redirect: 'follow',\n ...opts,\n body: getValidRequestBody(opts),\n };\n\n let request = new Request(url, requestInit);\n\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n let response = await _fetch(request);\n\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n if (\n response.status === 204 ||\n response.headers.get('Content-Length') === '0'\n ) {\n let emptyData: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'text':\n emptyData = await response[parseAs]();\n break;\n case 'formData':\n emptyData = new FormData();\n break;\n case 'stream':\n emptyData = response.body;\n break;\n case 'json':\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === 'data'\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'json':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n const error = jsonError ?? textError;\n let finalError = error;\n\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = (await fn(error, response, request, opts)) as string;\n }\n }\n\n finalError = finalError || ({} as string);\n\n if (opts.throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return opts.responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n ...result,\n };\n };\n\n const makeMethodFn =\n (method: Uppercase) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn =\n (method: Uppercase) => async (options: RequestOptions) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body as BodyInit | null | undefined,\n headers: opts.headers as unknown as Record,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n url,\n });\n };\n\n return {\n buildUrl,\n connect: makeMethodFn('CONNECT'),\n delete: makeMethodFn('DELETE'),\n get: makeMethodFn('GET'),\n getConfig,\n head: makeMethodFn('HEAD'),\n interceptors,\n options: makeMethodFn('OPTIONS'),\n patch: makeMethodFn('PATCH'),\n post: makeMethodFn('POST'),\n put: makeMethodFn('PUT'),\n request,\n setConfig,\n sse: {\n connect: makeSseFn('CONNECT'),\n delete: makeSseFn('DELETE'),\n get: makeSseFn('GET'),\n head: makeSseFn('HEAD'),\n options: makeSseFn('OPTIONS'),\n patch: makeSseFn('PATCH'),\n post: makeSseFn('POST'),\n put: makeSseFn('PUT'),\n trace: makeSseFn('TRACE'),\n },\n trace: makeMethodFn('TRACE'),\n } as Client;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { type ClientOptions, type Config, createClient, createConfig } from './client';\nimport type { ClientOptions as ClientOptions2 } from './types.gen';\n\n/**\n * The `createClientConfig()` function will be called on client initialization\n * and the returned object will become the client's initial configuration.\n *\n * You may want to initialize your client this way instead of calling\n * `setConfig()`. This is useful for example if you're using Next.js\n * to ensure your client always has the correct values.\n */\nexport type CreateClientConfig = (override?: Config) => Config & T>;\n\nexport const client = createClient(createConfig({\n baseUrl: 'http://localhost:26293',\n throwOnError: true\n}));\n","// This file is auto-generated by @hey-api/openapi-ts\r\n\r\nimport type { Client, Options as Options2, TDataShape } from './client';\r\nimport { client } from './client.gen';\r\nimport type { GetGridStylesheetData, GetGridStylesheetResponses, GetGridStylesheetsData, GetGridStylesheetsResponses, GetListStylesheetData, GetListStylesheetResponses, GetListStylesheetsData, GetListStylesheetsResponses, GetRteStylesheetData, GetRteStylesheetResponses, GetRteStylesheetsData, GetRteStylesheetsResponses, GetSettingsData, GetSettingsResponses, GetSingleBlockStylesheetsData, GetSingleBlockStylesheetsResponses, PreviewGridBlockData, PreviewGridBlockResponses, PreviewListBlockData, PreviewListBlockResponses, PreviewRichTextMarkupData, PreviewRichTextMarkupResponses, PreviewSingleBlockData, PreviewSingleBlockResponses } from './types.gen';\r\n\r\nexport type Options = Options2 & {\r\n /**\r\n * You can provide a client instance returned by `createClient()` instead of\r\n * individual options. This might be also useful if you want to implement a\r\n * custom client.\r\n */\r\n client?: Client;\r\n /**\r\n * You can pass arbitrary values through the `meta` object. This can be\r\n * used to access values that aren't defined as part of the SDK function.\r\n */\r\n meta?: Record;\r\n};\r\n\r\nexport class BlockPreviewService {\r\n public static previewGridBlock(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/grid',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * @deprecated\r\n */\r\n public static getGridStylesheet(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/grid/stylesheet',\r\n ...options\r\n });\r\n }\r\n \r\n public static getGridStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/grid/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static previewListBlock(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/list',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * @deprecated\r\n */\r\n public static getListStylesheet(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/list/stylesheet',\r\n ...options\r\n });\r\n }\r\n \r\n public static getListStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/list/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static previewRichTextMarkup(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/rte',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * @deprecated\r\n */\r\n public static getRteStylesheet(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/rte/stylesheet',\r\n ...options\r\n });\r\n }\r\n \r\n public static getRteStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/rte/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static previewSingleBlock(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/single',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n public static getSingleBlockStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/single/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static getSettings(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/settings',\r\n ...options\r\n });\r\n }\r\n}\r\n","import { UmbContextToken } from \"@umbraco-cms/backoffice/context-api\";\r\nimport BlockPreviewContext from \"./block-preview.context\";\r\n\r\nexport const BLOCK_PREVIEW_CONTEXT = new UmbContextToken('BlockPreviewContext');\r\n","import BlockPreviewContext from '../context/block-preview.context';\r\nimport { BLOCK_PREVIEW_CONTEXT } from '../context/block-preview.context-token';\r\nimport { BlockContext } from './types';\r\nimport { css, html, ifDefined, nothing, property, PropertyValueMap, state, unsafeHTML } from '@umbraco-cms/backoffice/external/lit';\r\nimport { UMB_BLOCK_WORKSPACE_CONTEXT, UmbBlockDataType } from '@umbraco-cms/backoffice/block';\r\nimport type { UmbBlockEditorCustomViewConfiguration, UmbBlockEditorCustomViewElement } from '@umbraco-cms/backoffice/block-custom-view';\r\nimport { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';\r\nimport { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property';\r\nimport { UmbApiError } from '@umbraco-cms/backoffice/resources';\r\nimport { UUIButtonElement } from '@umbraco-cms/backoffice/external/uui';\r\n\r\n/**\r\n * Abstract base class for block preview custom view elements.\r\n * Extracts shared behavior (lifecycle, rendering, click handling, validation,\r\n * context observation helpers, and CSS) so that block-type-specific subclasses\r\n * only implement the parts that differ.\r\n */\r\nexport abstract class BlockPreviewBaseElement\r\n extends UmbLitElement\r\n implements UmbBlockEditorCustomViewElement {\r\n\r\n protected _blockPreviewContext?: BlockPreviewContext;\r\n protected _workspaceContextResolved: boolean = false;\r\n\r\n @property({ attribute: false, hasChanged: (val: any, old: any) => JSON.stringify(val) !== JSON.stringify(old) })\r\n content?: UmbBlockDataType;\r\n\r\n @property({ attribute: false, hasChanged: (val: any, old: any) => JSON.stringify(val) !== JSON.stringify(old) })\r\n settings?: UmbBlockDataType;\r\n\r\n @property({ attribute: false })\r\n contentKey?: string;\r\n\r\n @property({ attribute: false })\r\n config?: UmbBlockEditorCustomViewConfiguration;\r\n\r\n @property({ attribute: false })\r\n unpublished?: boolean;\r\n\r\n @property({ attribute: false })\r\n icon?: string;\r\n\r\n @property({ attribute: false })\r\n label?: string;\r\n\r\n @state()\r\n protected _htmlMarkup: string = '';\r\n\r\n @state()\r\n protected _isLoading: boolean = false;\r\n\r\n @state()\r\n protected _error: string | null = null;\r\n\r\n protected _stylesheetsAdopted: boolean = false;\r\n\r\n protected _requestId: number = 0;\r\n\r\n protected _isConnected: boolean = false;\r\n\r\n /** Tracks pointerdown position on the tag to distinguish clicks from drags. */\r\n private _pointerStartPos: { x: number; y: number } | null = null;\r\n\r\n /** Subclass provides a concrete block context object with block-type-specific fields. */\r\n protected abstract _blockContext: TContext;\r\n\r\n /** Set up all context observers (sort mode, property dataset, workspace). */\r\n protected abstract setupContextObservers(): Promise | void;\r\n\r\n /** Observe the block entry context for content/settings keys and element type info. */\r\n protected abstract observeBlockValue(): void;\r\n\r\n /** Call the appropriate BlockPreviewService API method and return the result. */\r\n protected abstract callPreviewApi(): Promise<{ data?: string | null; error?: unknown }>;\r\n\r\n /** Fetch stylesheet paths from the appropriate BlockPreviewService endpoint. */\r\n protected abstract fetchStylesheets(): Promise;\r\n\r\n constructor() {\r\n super();\r\n this.consumeContext(BLOCK_PREVIEW_CONTEXT, async (context) => {\r\n this._blockPreviewContext = context;\r\n await this.setupContextObservers();\r\n });\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback();\r\n this._isConnected = true;\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this._isConnected = false;\r\n }\r\n\r\n protected override updated(_changedProperties: PropertyValueMap | Map) {\r\n super.updated(_changedProperties);\r\n if (_changedProperties.has('content') || _changedProperties.has('settings')) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n\r\n // region Shared context observers\r\n\r\n protected observePropertyDataset() {\r\n this.consumeContext(UMB_PROPERTY_DATASET_CONTEXT, (instance) => {\r\n if (instance) {\r\n this._blockContext.culture = instance.getVariantId().culture ?? '';\r\n }\r\n });\r\n }\r\n\r\n // endregion\r\n\r\n // region Workspace helpers\r\n\r\n /**\r\n * Shared handler called once the workspace context provides a unique + documentTypeUnique.\r\n * Sets up block context, triggers block value observation, and loads stylesheets.\r\n */\r\n protected async handleWorkspaceData(unique: string | undefined, documentTypeUnique: string | undefined) {\r\n if (!this._isConnected || !documentTypeUnique) {\r\n return;\r\n }\r\n\r\n this._blockContext.unique = unique?.toString() ?? '';\r\n this._blockPreviewContext?.setUnique(this._blockContext.unique);\r\n\r\n this._blockContext.documentTypeUnique = documentTypeUnique;\r\n this._blockPreviewContext?.setDocumentTypeUnique(this._blockContext.documentTypeUnique);\r\n this._workspaceContextResolved = true;\r\n\r\n this.observeBlockValue();\r\n await this.fetchAndLoadStylesheets();\r\n }\r\n\r\n /**\r\n * Fallback workspace observation via UMB_BLOCK_WORKSPACE_CONTEXT.\r\n * Used when the primary workspace context is unavailable (e.g. nested block editing).\r\n */\r\n protected observeBlockWorkspaceFallback() {\r\n if (this._workspaceContextResolved || !this._blockPreviewContext || this._blockContext.unique !== '') {\r\n return;\r\n }\r\n\r\n this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, async (context) => {\r\n if (context) {\r\n this.observe(context.content.structure.contentTypeUniques, async (contentTypeUniques) => {\r\n const documentTypeUnique = contentTypeUniques[0];\r\n if (!this._isConnected || !documentTypeUnique) {\r\n return;\r\n }\r\n\r\n // Try to get unique from context, then fallback to extraction\r\n this._blockContext.unique = this._blockPreviewContext?.getUnique() ?? '';\r\n if (!this._blockContext.unique && this._blockContext.workspaceEditContentPath) {\r\n this._blockContext.unique = this.extractUniqueFromWorkspacePath(this._blockContext.workspaceEditContentPath);\r\n }\r\n\r\n this._blockContext.documentTypeUnique = documentTypeUnique;\r\n this.observeBlockValue();\r\n await this.fetchAndLoadStylesheets();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected async fetchAndLoadStylesheets() {\r\n if (this._stylesheetsAdopted || !this._blockPreviewContext) return;\r\n const data = await this.fetchStylesheets();\r\n if (data && data.length > 0) {\r\n const sheets = await Promise.all(\r\n data.map(href => this._blockPreviewContext!.getOrCreateStylesheet(href))\r\n );\r\n const shadowRoot = this.renderRoot as ShadowRoot;\r\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, ...sheets];\r\n this._stylesheetsAdopted = true;\r\n }\r\n }\r\n\r\n // endregion\r\n\r\n // region Preview rendering\r\n\r\n protected resolveUniqueFromContext() {\r\n if (this._blockPreviewContext != null && this._blockContext.unique === '') {\r\n this._blockContext.unique = this._blockPreviewContext.getUnique();\r\n if (!this._blockContext.unique && this._blockContext.workspaceEditContentPath) {\r\n this._blockContext.unique = this.extractUniqueFromWorkspacePath(this._blockContext.workspaceEditContentPath);\r\n }\r\n }\r\n if (this._blockPreviewContext != null && this._blockContext.documentTypeUnique === '') {\r\n this._blockContext.documentTypeUnique = this._blockPreviewContext.getDocumentTypeUnique();\r\n }\r\n }\r\n\r\n protected async renderBlockPreview() {\r\n if (!this._isConnected) {\r\n return;\r\n }\r\n\r\n this.resolveUniqueFromContext();\r\n\r\n if (!this.validatePreviewData()) {\r\n return;\r\n }\r\n\r\n this._isLoading = true;\r\n this._error = null;\r\n\r\n const requestId = ++this._requestId;\r\n\r\n try {\r\n const { data, error } = await this._blockPreviewContext!.requestQueue.enqueue(() =>\r\n this.callPreviewApi()\r\n );\r\n\r\n if (this._requestId !== requestId) return;\r\n\r\n if (data != null) {\r\n this._htmlMarkup = data;\r\n this._isLoading = false;\r\n }\r\n else if (error) {\r\n this._error = UmbApiError.isUmbApiError(error) ? error.message : this.localize.term('blockPreview_renderError');\r\n this._isLoading = false;\r\n }\r\n else {\r\n this._isLoading = false;\r\n }\r\n } catch (error) {\r\n if (this._requestId !== requestId) return;\r\n this._error = this.localize.term('blockPreview_renderFailed');\r\n this._isLoading = false;\r\n console.error('Block preview error:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Validates that sufficient data is available for a preview request.\r\n * Subclasses may override to add additional checks (e.g. contentUdi).\r\n */\r\n protected validatePreviewData(): boolean {\r\n const context = this._blockContext;\r\n return !!(\r\n context.unique !== '' &&\r\n context.blockEditorAlias !== '' &&\r\n context.contentElementTypeAlias !== ''\r\n );\r\n }\r\n\r\n // endregion\r\n\r\n // region Utilities\r\n\r\n protected extractUniqueFromWorkspacePath(path: string): string {\r\n // Extract the document unique from the workspace edit path\r\n // Pattern: /workspace/document/edit/{unique}/\r\n const match = path.match(/\\/workspace\\/document\\/edit\\/([a-f0-9-]{36})/i);\r\n return match ? match[1] : '';\r\n }\r\n\r\n protected _handlePointerDown(event: PointerEvent) {\r\n this._pointerStartPos = { x: event.clientX, y: event.clientY };\r\n }\r\n\r\n protected _handleClick(event: PointerEvent) {\r\n // Detect drag/resize interactions: if the pointer moved significantly between\r\n // pointerdown and click, suppress the navigation. This prevents the edit modal\r\n // from opening when the user finishes resizing a grid block.\r\n const pointerType = 'pointerType' in event ? (event as PointerEvent).pointerType : '';\r\n if (pointerType !== '') {\r\n if (!this._pointerStartPos) {\r\n // Pointer click with no corresponding pointerdown on this element —\r\n // likely a resize/drag that ended over our tag.\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n const dx = Math.abs(event.clientX - this._pointerStartPos.x);\r\n const dy = Math.abs(event.clientY - this._pointerStartPos.y);\r\n this._pointerStartPos = null;\r\n if (dx > 5 || dy > 5) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n }\r\n this._pointerStartPos = null;\r\n\r\n const path = event.composedPath();\r\n\r\n // Check for clicks on action bars or resize handlers.\r\n const interactiveElements = ['UUI-ACTION-BAR', 'UMB-BLOCK-SCALE-HANDLER'];\r\n if (path.some(x => x instanceof Element && interactiveElements.includes(x.tagName))) {\r\n // Allow edit button clicks through — the tag handles navigation.\r\n const editButton = path.find(x => x instanceof UUIButtonElement && x.href?.includes('block/edit'));\r\n if (editButton) {\r\n return;\r\n }\r\n\r\n // Block all other action bar clicks (delete, copy, etc.) to prevent\r\n // the parent block's from navigating when interacting with\r\n // child blocks inside areas.\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n\r\n // Handle custom links within the preview\r\n const containsLink = path.filter(x => x instanceof Element && x.tagName === 'A' && x.hasAttribute('data-block-preview-link')) as Element[];\r\n if (containsLink.length > 0) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const blockPreviewEdit = path.find(x => x instanceof Element && x.tagName === 'A' && x.classList.contains('block-preview-edit'));\r\n if (blockPreviewEdit instanceof Element) {\r\n window.history.pushState({}, '', blockPreviewEdit.getAttribute('href'));\r\n } else {\r\n window.history.pushState({}, '', this._blockContext.workspaceEditContentPath);\r\n }\r\n return;\r\n }\r\n\r\n // All other clicks fall through to the element's default behavior,\r\n // which navigates to this block's edit workspace.\r\n }\r\n\r\n // endregion\r\n\r\n // region Rendering\r\n\r\n override render() {\r\n return html`\r\n ${this._isLoading\r\n ? html`
Loading preview...
`\r\n : this._error\r\n ? html`
${this._error}
`\r\n : this._htmlMarkup\r\n ? html`${unsafeHTML(this._htmlMarkup)}
`\r\n : nothing}\r\n `;\r\n }\r\n\r\n // endregion\r\n\r\n static styles = [\r\n css`\r\n a.block-preview-edit {\r\n display: block;\r\n color: inherit;\r\n text-decoration: inherit;\r\n border: 1px solid transparent;\r\n border-radius: 2px;\r\n }\r\n\r\n a.block-preview-edit:hover {\r\n border-color: var(--uui-color-interactive-emphasis, #3544b1);\r\n }\r\n\r\n .preview-alert {\r\n background-color: var(--uui-color-danger, #f0ac00);\r\n border: 1px solid transparent;\r\n border-radius: 0;\r\n margin-bottom: 20px;\r\n padding: 8px 35px 8px 14px;\r\n position: relative;\r\n\r\n &, a, h4 {\r\n color: #fff;\r\n }\r\n\r\n pre {\r\n white-space: normal;\r\n }\r\n\r\n uui-loader {\r\n color: #fff;\r\n margin-right: 16px;\r\n }\r\n }\r\n\r\n .preview-alert-warning {\r\n background-color: var(--uui-color-warning, #f0ac00);\r\n border-color: transparent;\r\n color: #000;\r\n }\r\n\r\n .preview-alert-info {\r\n background-color: var(--uui-color-default, #3544b1);\r\n border-color: transparent;\r\n color: #fff;\r\n }\r\n\r\n .preview-alert-danger, .preview-alert-error {\r\n background-color: var(--uui-color-danger, #f0ac00);\r\n border-color: transparent;\r\n color: #fff;\r\n }\r\n `\r\n ]\r\n}\r\n","import { UmbDataSourceResponse } from \"@umbraco-cms/backoffice/repository\";\r\nimport { BlockPreviewService } from \"../api\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\nimport { tryExecute } from \"@umbraco-cms/backoffice/resources\";\r\n\r\n// Query type definitions\r\nexport interface BlockPreviewQuery {\r\n blockEditorAlias: string;\r\n nodeKey: string;\r\n contentElementAlias: string;\r\n documentTypeUnique: string;\r\n contentUdi: string;\r\n settingsUdi: string;\r\n culture: string;\r\n blockIndex: number;\r\n}\r\n\r\nexport interface RtePreviewQuery {\r\n blockEditorAlias: string;\r\n nodeKey: string;\r\n contentElementAlias: string;\r\n documentTypeUnique: string;\r\n culture: string;\r\n}\r\n\r\nexport interface StylesheetQuery {\r\n documentTypeUnique: string;\r\n nodeKey: string;\r\n}\r\n\r\nexport interface IPreviewDataSource {\r\n previewGridBlock(body: string, query: BlockPreviewQuery): Promise>;\r\n previewListBlock(body: string, query: BlockPreviewQuery): Promise>;\r\n previewSingleBlock(body: string, query: BlockPreviewQuery): Promise>;\r\n previewRichTextMarkup(body: string, query: RtePreviewQuery): Promise>;\r\n getGridStylesheets(query: StylesheetQuery): Promise>;\r\n getListStylesheets(query: StylesheetQuery): Promise>;\r\n getSingleBlockStylesheets(query: StylesheetQuery): Promise>;\r\n getRteStylesheets(query: StylesheetQuery): Promise>;\r\n}\r\n\r\nexport class PreviewDataSource implements IPreviewDataSource {\r\n #host: UmbControllerHost;\r\n\r\n constructor(host: UmbControllerHost) {\r\n this.#host = host;\r\n }\r\n\r\n async previewGridBlock(body: string, query: BlockPreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewGridBlock({ body, query }));\r\n }\r\n\r\n async previewListBlock(body: string, query: BlockPreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewListBlock({ body, query }));\r\n }\r\n\r\n async previewSingleBlock(body: string, query: BlockPreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewSingleBlock({ body, query }));\r\n }\r\n\r\n async previewRichTextMarkup(body: string, query: RtePreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewRichTextMarkup({ body, query }));\r\n }\r\n\r\n async getGridStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getGridStylesheets({ query }));\r\n }\r\n\r\n async getListStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getListStylesheets({ query }));\r\n }\r\n\r\n async getSingleBlockStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getSingleBlockStylesheets({ query }));\r\n }\r\n\r\n async getRteStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getRteStylesheets({ query }));\r\n }\r\n}\r\n","import { UmbDataSourceResponse } from \"@umbraco-cms/backoffice/repository\";\r\nimport { BlockPreviewService, type BlockPreviewOptions } from \"../api\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\nimport { tryExecute } from \"@umbraco-cms/backoffice/resources\";\r\n\r\nexport interface ISettingsDataSource {\r\n getSettings(): Promise>\r\n}\r\n\r\nexport class SettingsDataSource implements ISettingsDataSource {\r\n #host: UmbControllerHost;\r\n\r\n constructor(host: UmbControllerHost) {\r\n this.#host = host;\r\n }\r\n\r\n async getSettings(): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getSettings());\r\n }\r\n}","import { UmbControllerBase } from \"@umbraco-cms/backoffice/class-api\";\r\nimport { SettingsDataSource } from \"./settings.data-source\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\n\r\nexport class SettingsRepository extends UmbControllerBase {\r\n #settingsDataSource: SettingsDataSource;\r\n\r\n constructor(host: UmbControllerHost) {\r\n super(host);\r\n this.#settingsDataSource = new SettingsDataSource(host);\r\n }\r\n\r\n async getSettings() {\r\n const settings = await this.#settingsDataSource.getSettings();\r\n\r\n if (settings && settings?.data) {\r\n return settings.data;\r\n }\r\n }\r\n}","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockGridContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { css, customElement, property } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_GRID_ENTRY_CONTEXT, UMB_BLOCK_GRID_MANAGER_CONTEXT, UmbBlockGridLayoutModel, UmbBlockGridValueModel, UmbBlockGridLayoutAreaItemModel } from \"@umbraco-cms/backoffice/block-grid\";\r\nimport { UMB_CONTENT_WORKSPACE_CONTEXT } from \"@umbraco-cms/backoffice/content\";\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"block-grid-preview\";\r\n\r\n@customElement(elementName)\r\nexport class BlockGridPreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockGridContext = {\r\n unique: \"\",\r\n documentTypeUnique: \"\",\r\n contentUdi: \"\",\r\n settingsUdi: \"\",\r\n blockEditorAlias: \"\",\r\n culture: \"\",\r\n workspaceEditContentPath: \"\",\r\n contentElementTypeAlias: \"\",\r\n contentElementTypeKey: \"\",\r\n areas: [],\r\n layout: undefined,\r\n layoutAreas: undefined,\r\n blockIndex: 0\r\n };\r\n\r\n private _blockGridValue: UmbBlockGridValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n }\r\n\r\n @property({ attribute: false })\r\n public set blockGridValue(value: UmbBlockGridValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockGridValue = buildUpValue as UmbBlockGridValueModel;\r\n }\r\n public get blockGridValue(): UmbBlockGridValueModel {\r\n return this._blockGridValue;\r\n }\r\n\r\n protected async setupContextObservers() {\r\n this.observePropertyDataset();\r\n await this.#observeContentWorkspace();\r\n }\r\n\r\n async #observeContentWorkspace() {\r\n try {\r\n // The content workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document content workspace.\r\n await this.getContext(UMB_CONTENT_WORKSPACE_CONTEXT, { passContextAliasMatches: true });\r\n this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {\r\n if (!context) return;\r\n\r\n this.observe(\r\n observeMultiple([context.unique, context.structure.contentTypeUniques]),\r\n async ([unique, contentTypeUniques]) => {\r\n await this.handleWorkspaceData(unique?.toString(), contentTypeUniques?.[0]);\r\n }\r\n );\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue() {\r\n this.consumeContext(UMB_BLOCK_GRID_ENTRY_CONTEXT, async (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey,\r\n context.areas,\r\n context.layout,\r\n context.layoutAreas\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey,\r\n areas,\r\n layout,\r\n layoutAreas\r\n ]) => {\r\n const prevColumnSpan = this._blockContext.layout?.columnSpan;\r\n const prevRowSpan = this._blockContext.layout?.rowSpan;\r\n\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n this._blockContext.areas = areas;\r\n this._blockContext.layout = layout!;\r\n this._blockContext.layoutAreas = layoutAreas;\r\n\r\n if (!this.#managerObserved) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n\r\n // Re-render when layout dimensions change (resize)\r\n if (this._htmlMarkup && layout && (\r\n layout.columnSpan !== prevColumnSpan ||\r\n layout.rowSpan !== prevRowSpan\r\n )) {\r\n this.blockGridValue = {\r\n ...this._blockGridValue,\r\n layout: { ['Umbraco.BlockGrid']: this.#filterLayouts() }\r\n };\r\n clearTimeout(this.#layoutResizeTimer);\r\n this.#layoutResizeTimer = setTimeout(() => {\r\n this.renderBlockPreview();\r\n }, 300);\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n #layoutResizeTimer?: ReturnType;\r\n\r\n async #observeBlockPropertyValue() {\r\n this.consumeContext(UMB_BLOCK_GRID_MANAGER_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([contents, settings, exposes, propertyAlias]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n this.blockGridValue = {\r\n contentData: contents ?? [],\r\n settingsData: settings ?? [],\r\n expose: exposes ?? [],\r\n layout: { ['Umbraco.BlockGrid']: this.#filterLayouts() }\r\n };\r\n this._blockContext.blockIndex = contents.findIndex(x => x.key === this._blockContext.contentUdi);\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #filterLayouts(): UmbBlockGridLayoutModel[] {\r\n const areas = this._blockContext.areas.map(area => {\r\n const model: UmbBlockGridLayoutAreaItemModel = {\r\n key: area.key,\r\n items: this._blockContext.layoutAreas?.find(layout => layout.key === area.key)?.items ?? []\r\n }\r\n return model;\r\n });\r\n\r\n const layoutModel: UmbBlockGridLayoutModel[] =\r\n [\r\n {\r\n areas: areas,\r\n columnSpan: this._blockContext.layout?.columnSpan ?? 0,\r\n rowSpan: this._blockContext.layout?.rowSpan ?? 0,\r\n contentKey: this._blockContext.layout?.contentKey ?? '',\r\n settingsKey: this._blockContext.layout?.settingsKey\r\n }\r\n ];\r\n\r\n return layoutModel;\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewGridBlock(\r\n JSON.stringify(this.blockGridValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n contentUdi: this._blockContext.contentUdi,\r\n settingsUdi: this._blockContext.settingsUdi,\r\n culture: this._blockContext.culture,\r\n blockIndex: this._blockContext.blockIndex\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getGridStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n\r\n protected override validatePreviewData(): boolean {\r\n return super.validatePreviewData() && this._blockContext.contentUdi !== '';\r\n }\r\n\r\n static override styles = [\r\n ...BlockPreviewBaseElement.styles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n a.block-preview-edit {\r\n height: 100%;\r\n }\r\n `\r\n ]\r\n}\r\n\r\nexport default BlockGridPreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: BlockGridPreviewCustomView;\r\n }\r\n}\r\n","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockListContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { css, customElement, property, state } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_LIST_ENTRY_CONTEXT, UMB_BLOCK_LIST_MANAGER_CONTEXT, UmbBlockListValueModel } from \"@umbraco-cms/backoffice/block-list\";\r\nimport { UMB_CONTENT_WORKSPACE_CONTEXT } from \"@umbraco-cms/backoffice/content\";\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"block-list-preview\";\r\n\r\n@customElement(elementName)\r\nexport class BlockListPreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockListContext = {\r\n unique: '',\r\n documentTypeUnique: '',\r\n contentUdi: '',\r\n settingsUdi: '',\r\n blockEditorAlias: '',\r\n culture: '',\r\n workspaceEditContentPath: '',\r\n contentElementTypeAlias: '',\r\n contentElementTypeKey: '',\r\n blockIndex: 0\r\n };\r\n\r\n @state()\r\n private _blockListValue: UmbBlockListValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n };\r\n\r\n @property({ attribute: false })\r\n public set blockListValue(value: UmbBlockListValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockListValue = buildUpValue as UmbBlockListValueModel;\r\n }\r\n\r\n public get blockListValue(): UmbBlockListValueModel {\r\n return this._blockListValue;\r\n }\r\n\r\n protected async setupContextObservers() {\r\n this.observePropertyDataset();\r\n await this.#observeContentWorkspace();\r\n }\r\n\r\n async #observeContentWorkspace() {\r\n try {\r\n // The content workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document content workspace.\r\n await this.getContext(UMB_CONTENT_WORKSPACE_CONTEXT, { passContextAliasMatches: true });\r\n\r\n this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {\r\n if (!context) return;\r\n\r\n this.observe(\r\n observeMultiple([context.unique, context.structure.contentTypeUniques]),\r\n async ([unique, contentTypeUniques]) => {\r\n await this.handleWorkspaceData(unique?.toString(), contentTypeUniques?.[0]);\r\n }\r\n );\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue() {\r\n this.consumeContext(UMB_BLOCK_LIST_ENTRY_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey\r\n ]) => {\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n\r\n if (!this.#managerObserved) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n\r\n #observeBlockPropertyValue() {\r\n this.consumeContext(UMB_BLOCK_LIST_MANAGER_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.layouts,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([\r\n contents,\r\n settings,\r\n layouts,\r\n exposes,\r\n propertyAlias\r\n ]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n\r\n this.blockListValue = {\r\n contentData: contents?.filter(x => x.key === this._blockContext.contentUdi) ?? [],\r\n settingsData: settings?.filter(x => x.key === this._blockContext.settingsUdi) ?? [],\r\n expose: exposes?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? [],\r\n layout: {\r\n ['Umbraco.BlockList']: layouts?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? []\r\n }\r\n };\r\n\r\n this._blockContext.blockIndex = contents?.indexOf(this.blockListValue.contentData[0]);\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewListBlock(\r\n JSON.stringify(this.blockListValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n contentUdi: this._blockContext.contentUdi,\r\n settingsUdi: this._blockContext.settingsUdi,\r\n culture: this._blockContext.culture,\r\n blockIndex: this._blockContext.blockIndex,\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getListStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n\r\n protected override validatePreviewData(): boolean {\r\n return super.validatePreviewData() && this._blockContext.contentUdi !== '';\r\n }\r\n\r\n static override styles = [\r\n ...BlockPreviewBaseElement.styles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n a.block-preview-edit {\r\n height: 100%;\r\n }\r\n `\r\n ]\r\n}\r\n\r\nexport default BlockListPreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: BlockListPreviewCustomView;\r\n }\r\n}\r\n","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { css, customElement, property, state } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_SINGLE_ENTRY_CONTEXT, UMB_BLOCK_SINGLE_MANAGER_CONTEXT, UmbBlockSingleValueModel } from \"@umbraco-cms/backoffice/block-single\";\r\nimport { UMB_CONTENT_WORKSPACE_CONTEXT } from \"@umbraco-cms/backoffice/content\";\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"block-single-preview\";\r\n\r\n@customElement(elementName)\r\nexport class BlockSinglePreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockContext = {\r\n unique: '',\r\n documentTypeUnique: '',\r\n contentUdi: '',\r\n settingsUdi: '',\r\n blockEditorAlias: '',\r\n culture: '',\r\n workspaceEditContentPath: '',\r\n contentElementTypeAlias: '',\r\n contentElementTypeKey: '',\r\n blockIndex: 0\r\n };\r\n\r\n @state()\r\n private _blockSingleValue: UmbBlockSingleValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n };\r\n\r\n @property({ attribute: false })\r\n public set blockSingleValue(value: UmbBlockSingleValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockSingleValue = buildUpValue as UmbBlockSingleValueModel;\r\n }\r\n\r\n public get blockSingleValue(): UmbBlockSingleValueModel {\r\n return this._blockSingleValue;\r\n }\r\n\r\n protected async setupContextObservers() {\r\n this.observePropertyDataset();\r\n await this.#observeContentWorkspace();\r\n }\r\n\r\n async #observeContentWorkspace() {\r\n try {\r\n // The content workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document content workspace.\r\n await this.getContext(UMB_CONTENT_WORKSPACE_CONTEXT, { passContextAliasMatches: true });\r\n\r\n this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {\r\n if (!context) return;\r\n\r\n this.observe(\r\n observeMultiple([context.unique, context.structure.contentTypeUniques]),\r\n async ([unique, contentTypeUniques]) => {\r\n await this.handleWorkspaceData(unique?.toString(), contentTypeUniques?.[0]);\r\n }\r\n );\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue() {\r\n this.consumeContext(UMB_BLOCK_SINGLE_ENTRY_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey\r\n ]) => {\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n\r\n if (!this.#managerObserved) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n\r\n #observeBlockPropertyValue() {\r\n this.consumeContext(UMB_BLOCK_SINGLE_MANAGER_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.layouts,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([\r\n contents,\r\n settings,\r\n layouts,\r\n exposes,\r\n propertyAlias\r\n ]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n\r\n this.blockSingleValue = {\r\n contentData: contents?.filter(x => x.key === this._blockContext.contentUdi) ?? [],\r\n settingsData: settings?.filter(x => x.key === this._blockContext.settingsUdi) ?? [],\r\n expose: exposes?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? [],\r\n layout: {\r\n ['Umbraco.SingleBlock']: layouts?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? []\r\n }\r\n };\r\n\r\n this._blockContext.blockIndex = contents?.indexOf(this.blockSingleValue.contentData[0]);\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewSingleBlock(\r\n JSON.stringify(this.blockSingleValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n contentUdi: this._blockContext.contentUdi,\r\n settingsUdi: this._blockContext.settingsUdi,\r\n culture: this._blockContext.culture,\r\n blockIndex: this._blockContext.blockIndex,\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getSingleBlockStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n\r\n protected override validatePreviewData(): boolean {\r\n return super.validatePreviewData() && this._blockContext.contentUdi !== '';\r\n }\r\n\r\n static override styles = [\r\n ...BlockPreviewBaseElement.styles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n a.block-preview-edit {\r\n height: 100%;\r\n }\r\n `\r\n ]\r\n}\r\n\r\nexport default BlockSinglePreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: BlockSinglePreviewCustomView;\r\n }\r\n}\r\n","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { customElement, property, state } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_RTE_ENTRY_CONTEXT, UMB_BLOCK_RTE_MANAGER_CONTEXT, UmbBlockRteValueModel } from \"@umbraco-cms/backoffice/block-rte\";\r\nimport { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/document';\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"rich-text-preview\";\r\n\r\n@customElement(elementName)\r\nexport class RichTextPreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockContext = {\r\n unique: '',\r\n documentTypeUnique: '',\r\n contentUdi: '',\r\n settingsUdi: '',\r\n blockEditorAlias: '',\r\n culture: '',\r\n workspaceEditContentPath: '',\r\n contentElementTypeAlias: '',\r\n contentElementTypeKey: '',\r\n blockIndex: 0\r\n };\r\n\r\n @state()\r\n private _blockRteValue: UmbBlockRteValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n }\r\n\r\n @property({ attribute: false })\r\n public set blockRteValue(value: UmbBlockRteValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockRteValue = buildUpValue as UmbBlockRteValueModel;\r\n }\r\n public get blockRteValue(): UmbBlockRteValueModel {\r\n return this._blockRteValue;\r\n }\r\n\r\n protected setupContextObservers() {\r\n this.observePropertyDataset();\r\n this.#observeDocumentWorkspace();\r\n }\r\n\r\n #observeDocumentWorkspace() {\r\n try {\r\n // The document workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document workspace.\r\n this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (context) => {\r\n if (context) {\r\n this._workspaceContextResolved = true;\r\n this.observe(\r\n observeMultiple([context.unique, context.contentTypeUnique]),\r\n async ([unique, documentTypeUnique]) => {\r\n await this.handleWorkspaceData(unique?.toString(), documentTypeUnique);\r\n }\r\n );\r\n }\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue(): void {\r\n this.consumeContext(UMB_BLOCK_RTE_ENTRY_CONTEXT, (context) => {\r\n if (context != null) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey\r\n ]) => {\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n\r\n if (!this.#managerObserved) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n\r\n #observeBlockPropertyValue(): void {\r\n this.consumeContext(UMB_BLOCK_RTE_MANAGER_CONTEXT, (context) => {\r\n if (context != null) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.layouts,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([\r\n contents,\r\n settings,\r\n layouts,\r\n exposes,\r\n propertyAlias\r\n ]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n\r\n this.blockRteValue = {\r\n contentData: contents?.filter(x => x.key === this._blockContext.contentUdi) ?? [],\r\n settingsData: settings?.filter(x => x.key === this._blockContext.settingsUdi) ?? [],\r\n expose: exposes?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? [],\r\n layout: {\r\n ['Umbraco.RichText']: layouts?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? []\r\n }\r\n };\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewRichTextMarkup(\r\n JSON.stringify(this.blockRteValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n culture: this._blockContext.culture\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getRteStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n}\r\n\r\nexport default RichTextPreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: RichTextPreviewCustomView;\r\n }\r\n}\r\n","/**\r\n * Concurrency-limited request queue for block preview API calls.\r\n *\r\n * When a page has many blocks, all preview elements fire API requests\r\n * simultaneously after their debounce timers expire. This overwhelms\r\n * the server and can cause empty or malformed responses.\r\n *\r\n * Inspired by the CMS `UmbManagementApiItemDataCache.scheduleBatchedFetch`\r\n * pattern, this queue limits concurrent in-flight requests so the server\r\n * processes a manageable number at a time.\r\n */\r\nexport class BlockPreviewRequestQueue {\r\n #maxConcurrent: number;\r\n #activeCount = 0;\r\n #queue: Array<() => void> = [];\r\n\r\n constructor(maxConcurrent: number = 3) {\r\n this.#maxConcurrent = maxConcurrent;\r\n }\r\n\r\n /**\r\n * Enqueue a task to run with concurrency limiting.\r\n * If fewer than `maxConcurrent` tasks are active, the task runs immediately.\r\n * Otherwise it waits until a slot is available.\r\n */\r\n async enqueue(task: () => Promise): Promise {\r\n if (this.#activeCount >= this.#maxConcurrent) {\r\n await new Promise((resolve) => {\r\n this.#queue.push(resolve);\r\n });\r\n }\r\n\r\n this.#activeCount++;\r\n try {\r\n return await task();\r\n } finally {\r\n this.#activeCount--;\r\n if (this.#queue.length > 0) {\r\n const next = this.#queue.shift()!;\r\n next();\r\n }\r\n }\r\n }\r\n}\r\n","import { UmbControllerBase } from \"@umbraco-cms/backoffice/class-api\";\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\nimport { UmbStringState } from \"@umbraco-cms/backoffice/observable-api\";\nimport { BlockPreviewRequestQueue } from \"./block-preview-request-queue\";\n\nexport class BlockPreviewContext extends UmbControllerBase {\n\n #requestQueue = new BlockPreviewRequestQueue(3);\n #stylesheetCache = new Map>();\n\n /** Shared concurrency-limited queue for preview API requests. */\n get requestQueue(): BlockPreviewRequestQueue {\n return this.#requestQueue;\n }\n\n // Node key cache used as a fallback when a preview cannot reach its content\n // workspace directly (e.g. when rendered inside a portaled block-edit modal).\n #unique = new UmbStringState('');\n #documentTypeUnique = new UmbStringState('');\n\n constructor(host: UmbControllerHost) {\n super(host);\n }\n\n getUnique(): string {\n return this.#unique.getValue();\n }\n\n async setUnique(unique: string) {\n if (unique !== '') {\n this.#unique.setValue(unique);\n }\n }\n\n getDocumentTypeUnique(): string {\n return this.#documentTypeUnique.getValue();\n }\n\n async setDocumentTypeUnique(documentTypeUnique: string) {\n if (documentTypeUnique !== '') {\n this.#documentTypeUnique.setValue(documentTypeUnique);\n }\n }\n\n getOrCreateStylesheet(href: string): Promise {\n const cached = this.#stylesheetCache.get(href);\n if (cached) return cached;\n\n const promise = fetch(href)\n .then(response => response.text())\n .then(css => {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(css);\n return sheet;\n });\n this.#stylesheetCache.set(href, promise);\n return promise;\n }\n\n}\n\nexport default BlockPreviewContext;\n","// ManifestGlobalContext is only available in extension-registry, not extension-api\r\nimport { ManifestGlobalContext } from \"@umbraco-cms/backoffice/extension-registry\";\r\n\r\nconst contexts: Array = [\r\n {\r\n type: 'globalContext',\r\n alias: 'BlockPreview.Context',\r\n name: 'BlockPreview Context',\r\n js: () => import('./block-preview.context.ts')\r\n }\r\n]\r\n\r\nexport const manifests = contexts;\r\n","import type { ManifestLocalization } from '@umbraco-cms/backoffice/localization';\r\n\r\nconst localizations: Array = [\r\n {\r\n type: 'localization',\r\n alias: 'BlockPreview.Localization.En',\r\n name: 'BlockPreview English Localization',\r\n meta: {\r\n culture: 'en',\r\n },\r\n js: () => import('./en.ts'),\r\n },\r\n];\r\n\r\nexport const manifests = localizations;\r\n","import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';\r\nimport { ManifestBlockEditorCustomView } from '@umbraco-cms/backoffice/block-custom-view';\r\nimport { UmbEntryPointOnInit } from '@umbraco-cms/backoffice/extension-api';\r\n\r\nimport { client } from './api/index.ts';\r\nimport { BlockGridPreviewCustomView, BlockListPreviewCustomView, BlockSinglePreviewCustomView, RichTextPreviewCustomView } from './blockEditor';\r\nimport { BLOCK_PREVIEW_CONTEXT } from './context/block-preview.context-token.ts';\r\nimport BlockPreviewContext from './context/block-preview.context.ts';\r\nimport { manifests as contextManifests } from './context/manifests.ts';\r\nimport { manifests as localizationManifests } from './localization/manifests.ts';\r\nimport { SettingsRepository } from './repository';\r\n\r\nexport * from './blockEditor';\r\nexport * from './repository';\r\n\r\nexport const onInit: UmbEntryPointOnInit = async (host, extensionRegistry) => {\r\n\r\n host.consumeContext(UMB_AUTH_CONTEXT, async (authContext) => {\r\n if (!authContext) return;\r\n\r\n const config = authContext.getOpenApiConfiguration();\r\n\r\n client.setConfig({\r\n baseUrl: config?.base ?? \"\",\r\n auth: config?.token ?? undefined,\r\n credentials: config?.credentials ?? \"same-origin\",\r\n });\r\n\r\n client.interceptors.request.use(async (request, _options) => {\r\n const token = await config.token();\r\n request.headers.set('Authorization', `Bearer ${token}`);\r\n return request;\r\n });\r\n\r\n const settingsRepository = new SettingsRepository(host);\r\n const settings = await settingsRepository.getSettings();\r\n\r\n let customViewManifests: ManifestBlockEditorCustomView[] = [];\r\n\r\n if (settings) {\r\n if (settings.blockGrid.enabled) {\r\n let blockGridManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.GridCustomView',\r\n name: 'BlockPreview Grid Custom View',\r\n element: BlockGridPreviewCustomView,\r\n forBlockEditor: 'block-grid'\r\n };\r\n\r\n if (settings.blockGrid.contentTypes?.length !== 0) {\r\n blockGridManifest.forContentTypeAlias = settings.blockGrid.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(blockGridManifest);\r\n }\r\n\r\n if (settings.blockList.enabled) {\r\n let blockListManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.ListCustomView',\r\n name: 'BlockPreview List Custom View',\r\n element: BlockListPreviewCustomView,\r\n forBlockEditor: 'block-list'\r\n };\r\n\r\n if (settings.blockList.contentTypes?.length !== 0) {\r\n blockListManifest.forContentTypeAlias = settings.blockList.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(blockListManifest);\r\n }\r\n\r\n if (settings.singleBlock.enabled) {\r\n let singleBlockManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.SingleBlockCustomView',\r\n name: 'BlockPreview Single Block Custom View',\r\n element: BlockSinglePreviewCustomView,\r\n forBlockEditor: 'block-single'\r\n };\r\n\r\n if (settings.singleBlock.contentTypes?.length !== 0) {\r\n singleBlockManifest.forContentTypeAlias = settings.singleBlock.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(singleBlockManifest);\r\n }\r\n\r\n if (settings.richText.enabled) {\r\n let richTextManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.RichTextCustomView',\r\n name: 'BlockPreview Rich Text Custom View',\r\n element: RichTextPreviewCustomView,\r\n forBlockEditor: 'block-rte'\r\n };\r\n\r\n if (settings.richText.contentTypes?.length !== 0) {\r\n richTextManifest.forContentTypeAlias = settings.richText.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(richTextManifest);\r\n }\r\n }\r\n\r\n extensionRegistry.registerMany([\r\n ...customViewManifests,\r\n ...contextManifests,\r\n ...localizationManifests\r\n ]);\r\n\r\n host.provideContext(BLOCK_PREVIEW_CONTEXT, new BlockPreviewContext(host));\r\n });\r\n};"],"names":["jsonBodySerializer","body","_key","value","createSseClient","onRequest","onSseError","onSseEvent","responseTransformer","responseValidator","sseDefaultRetryDelay","sseMaxRetryAttempts","sseMaxRetryDelay","sseSleepFn","url","options","lastEventId","sleep","ms","resolve","retryDelay","attempt","signal","headers","requestInit","request","response","reader","buffer","abortHandler","done","chunks","chunk","lines","dataLines","eventName","line","parsed","data","parsedJson","rawData","error","backoff","separatorArrayExplode","style","separatorArrayNoExplode","separatorObjectExplode","serializeArrayParam","allowReserved","explode","name","joinedValues","v","separator","serializePrimitiveParam","serializeObjectParam","valueOnly","values","key","PATH_PARAM_RE","defaultPathSerializer","path","_url","matches","match","replaceValue","getUrl","baseUrl","query","querySerializer","pathUrl","search","getValidRequestBody","hasBody","getAuthToken","auth","callback","token","createQuerySerializer","array","object","queryParams","serializedArray","serializedObject","serializedPrimitive","getParseAs","contentType","cleanContent","type","checkForExistence","setAuthParams","security","buildUrl","mergeConfigs","a","b","config","mergeHeaders","headersEntries","entries","mergedHeaders","header","iterator","Interceptors","id","index","fn","createInterceptors","defaultQuerySerializer","defaultHeaders","createConfig","override","createClient","_config","getConfig","setConfig","interceptors","beforeRequest","opts","_fetch","result","parseAs","emptyData","textError","jsonError","finalError","makeMethodFn","method","makeSseFn","init","client","BlockPreviewService","BLOCK_PREVIEW_CONTEXT","UmbContextToken","BlockPreviewBaseElement","UmbLitElement","context","_changedProperties","UMB_PROPERTY_DATASET_CONTEXT","instance","unique","documentTypeUnique","UMB_BLOCK_WORKSPACE_CONTEXT","contentTypeUniques","sheets","href","shadowRoot","requestId","UmbApiError","event","dx","dy","interactiveElements","x","UUIButtonElement","blockPreviewEdit","html","ifDefined","unsafeHTML","nothing","css","__decorateClass","property","val","old","state","PreviewDataSource","#host","host","tryExecute","SettingsDataSource","SettingsRepository","UmbControllerBase","#settingsDataSource","settings","_previewDataSource","_BlockGridPreviewCustomView_instances","observeContentWorkspace_fn","_managerObserved","_layoutResizeTimer","observeBlockPropertyValue_fn","filterLayouts_fn","elementName","BlockGridPreviewCustomView","__privateAdd","__privateSet","buildUpValue","__privateMethod","UMB_BLOCK_GRID_ENTRY_CONTEXT","observeMultiple","contentUdi","settingsUdi","workspaceEditContentPath","contentElementTypeAlias","contentElementTypeKey","areas","layout","layoutAreas","prevColumnSpan","prevRowSpan","__privateGet","UMB_CONTENT_WORKSPACE_CONTEXT","UMB_BLOCK_GRID_MANAGER_CONTEXT","contents","exposes","propertyAlias","area","customElement","_BlockListPreviewCustomView_instances","BlockListPreviewCustomView","UMB_BLOCK_LIST_ENTRY_CONTEXT","UMB_BLOCK_LIST_MANAGER_CONTEXT","layouts","_BlockSinglePreviewCustomView_instances","BlockSinglePreviewCustomView","UMB_BLOCK_SINGLE_ENTRY_CONTEXT","UMB_BLOCK_SINGLE_MANAGER_CONTEXT","_RichTextPreviewCustomView_instances","observeDocumentWorkspace_fn","RichTextPreviewCustomView","UMB_BLOCK_RTE_ENTRY_CONTEXT","UMB_DOCUMENT_WORKSPACE_CONTEXT","UMB_BLOCK_RTE_MANAGER_CONTEXT","BlockPreviewRequestQueue","#maxConcurrent","#activeCount","#queue","maxConcurrent","task","BlockPreviewContext","#requestQueue","#stylesheetCache","#unique","UmbStringState","#documentTypeUnique","cached","promise","sheet","contexts","blockPreview_context","manifests","localizations","onInit","extensionRegistry","UMB_AUTH_CONTEXT","authContext","_options","customViewManifests","blockGridManifest","blockListManifest","singleBlockManifest","richTextManifest","contextManifests","localizationManifests"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../../../../Umbraco.Community.BlockPreview.UI/src/api/core/bodySerializer.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/serverSentEvents.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/pathSerializer.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/utils.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/auth.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/client/utils.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/client/client.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/client.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/sdk.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/block-preview.context-token.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-preview-base.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/repository/preview.data-source.ts","../../../../Umbraco.Community.BlockPreview.UI/src/repository/settings.data-source.ts","../../../../Umbraco.Community.BlockPreview.UI/src/repository/settings.repository.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-grid-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-list-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-single-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/rich-text-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/block-preview-request-queue.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/block-preview.context.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/manifests.ts","../../../../Umbraco.Community.BlockPreview.UI/src/localization/manifests.ts","../../../../Umbraco.Community.BlockPreview.UI/src/index.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n ArrayStyle,\n ObjectStyle,\n SerializerOptions,\n} from './pathSerializer.gen';\n\nexport type QuerySerializer = (query: Record) => string;\n\nexport type BodySerializer = (body: any) => any;\n\nexport interface QuerySerializerOptions {\n allowReserved?: boolean;\n array?: SerializerOptions;\n object?: SerializerOptions;\n}\n\nconst serializeFormDataPair = (\n data: FormData,\n key: string,\n value: unknown,\n): void => {\n if (typeof value === 'string' || value instanceof Blob) {\n data.append(key, value);\n } else if (value instanceof Date) {\n data.append(key, value.toISOString());\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nconst serializeUrlSearchParamsPair = (\n data: URLSearchParams,\n key: string,\n value: unknown,\n): void => {\n if (typeof value === 'string') {\n data.append(key, value);\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nexport const formDataBodySerializer = {\n bodySerializer: | Array>>(\n body: T,\n ): FormData => {\n const data = new FormData();\n\n Object.entries(body).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeFormDataPair(data, key, v));\n } else {\n serializeFormDataPair(data, key, value);\n }\n });\n\n return data;\n },\n};\n\nexport const jsonBodySerializer = {\n bodySerializer: (body: T): string =>\n JSON.stringify(body, (_key, value) =>\n typeof value === 'bigint' ? value.toString() : value,\n ),\n};\n\nexport const urlSearchParamsBodySerializer = {\n bodySerializer: | Array>>(\n body: T,\n ): string => {\n const data = new URLSearchParams();\n\n Object.entries(body).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n } else {\n serializeUrlSearchParamsPair(data, key, value);\n }\n });\n\n return data.toString();\n },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Config } from './types.gen';\n\nexport type ServerSentEventsOptions = Omit<\n RequestInit,\n 'method'\n> &\n Pick & {\n /**\n * Fetch API implementation. You can use this option to provide a custom\n * fetch instance.\n *\n * @default globalThis.fetch\n */\n fetch?: typeof fetch;\n /**\n * Implementing clients can call request interceptors inside this hook.\n */\n onRequest?: (url: string, init: RequestInit) => Promise;\n /**\n * Callback invoked when a network or parsing error occurs during streaming.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param error The error that occurred.\n */\n onSseError?: (error: unknown) => void;\n /**\n * Callback invoked when an event is streamed from the server.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param event Event streamed from the server.\n * @returns Nothing (void).\n */\n onSseEvent?: (event: StreamEvent) => void;\n serializedBody?: RequestInit['body'];\n /**\n * Default retry delay in milliseconds.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 3000\n */\n sseDefaultRetryDelay?: number;\n /**\n * Maximum number of retry attempts before giving up.\n */\n sseMaxRetryAttempts?: number;\n /**\n * Maximum retry delay in milliseconds.\n *\n * Applies only when exponential backoff is used.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 30000\n */\n sseMaxRetryDelay?: number;\n /**\n * Optional sleep function for retry backoff.\n *\n * Defaults to using `setTimeout`.\n */\n sseSleepFn?: (ms: number) => Promise;\n url: string;\n };\n\nexport interface StreamEvent {\n data: TData;\n event?: string;\n id?: string;\n retry?: number;\n}\n\nexport type ServerSentEventsResult<\n TData = unknown,\n TReturn = void,\n TNext = unknown,\n> = {\n stream: AsyncGenerator<\n TData extends Record ? TData[keyof TData] : TData,\n TReturn,\n TNext\n >;\n};\n\nexport const createSseClient = ({\n onRequest,\n onSseError,\n onSseEvent,\n responseTransformer,\n responseValidator,\n sseDefaultRetryDelay,\n sseMaxRetryAttempts,\n sseMaxRetryDelay,\n sseSleepFn,\n url,\n ...options\n}: ServerSentEventsOptions): ServerSentEventsResult => {\n let lastEventId: string | undefined;\n\n const sleep =\n sseSleepFn ??\n ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n const createStream = async function* () {\n let retryDelay: number = sseDefaultRetryDelay ?? 3000;\n let attempt = 0;\n const signal = options.signal ?? new AbortController().signal;\n\n while (true) {\n if (signal.aborted) break;\n\n attempt++;\n\n const headers =\n options.headers instanceof Headers\n ? options.headers\n : new Headers(options.headers as Record | undefined);\n\n if (lastEventId !== undefined) {\n headers.set('Last-Event-ID', lastEventId);\n }\n\n try {\n const requestInit: RequestInit = {\n redirect: 'follow',\n ...options,\n body: options.serializedBody,\n headers,\n signal,\n };\n let request = new Request(url, requestInit);\n if (onRequest) {\n request = await onRequest(url, requestInit);\n }\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = options.fetch ?? globalThis.fetch;\n const response = await _fetch(request);\n\n if (!response.ok)\n throw new Error(\n `SSE failed: ${response.status} ${response.statusText}`,\n );\n\n if (!response.body) throw new Error('No body in SSE response');\n\n const reader = response.body\n .pipeThrough(new TextDecoderStream())\n .getReader();\n\n let buffer = '';\n\n const abortHandler = () => {\n try {\n reader.cancel();\n } catch {\n // noop\n }\n };\n\n signal.addEventListener('abort', abortHandler);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += value;\n\n const chunks = buffer.split('\\n\\n');\n buffer = chunks.pop() ?? '';\n\n for (const chunk of chunks) {\n const lines = chunk.split('\\n');\n const dataLines: Array = [];\n let eventName: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n dataLines.push(line.replace(/^data:\\s*/, ''));\n } else if (line.startsWith('event:')) {\n eventName = line.replace(/^event:\\s*/, '');\n } else if (line.startsWith('id:')) {\n lastEventId = line.replace(/^id:\\s*/, '');\n } else if (line.startsWith('retry:')) {\n const parsed = Number.parseInt(\n line.replace(/^retry:\\s*/, ''),\n 10,\n );\n if (!Number.isNaN(parsed)) {\n retryDelay = parsed;\n }\n }\n }\n\n let data: unknown;\n let parsedJson = false;\n\n if (dataLines.length) {\n const rawData = dataLines.join('\\n');\n try {\n data = JSON.parse(rawData);\n parsedJson = true;\n } catch {\n data = rawData;\n }\n }\n\n if (parsedJson) {\n if (responseValidator) {\n await responseValidator(data);\n }\n\n if (responseTransformer) {\n data = await responseTransformer(data);\n }\n }\n\n onSseEvent?.({\n data,\n event: eventName,\n id: lastEventId,\n retry: retryDelay,\n });\n\n if (dataLines.length) {\n yield data as any;\n }\n }\n }\n } finally {\n signal.removeEventListener('abort', abortHandler);\n reader.releaseLock();\n }\n\n break; // exit loop on normal completion\n } catch (error) {\n // connection failed or aborted; retry after delay\n onSseError?.(error);\n\n if (\n sseMaxRetryAttempts !== undefined &&\n attempt >= sseMaxRetryAttempts\n ) {\n break; // stop after firing error\n }\n\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(\n retryDelay * 2 ** (attempt - 1),\n sseMaxRetryDelay ?? 30000,\n );\n await sleep(backoff);\n }\n }\n };\n\n const stream = createStream();\n\n return { stream };\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\ninterface SerializeOptions\n extends SerializePrimitiveOptions,\n SerializerOptions {}\n\ninterface SerializePrimitiveOptions {\n allowReserved?: boolean;\n name: string;\n}\n\nexport interface SerializerOptions {\n /**\n * @default true\n */\n explode: boolean;\n style: T;\n}\n\nexport type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited';\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\ntype MatrixStyle = 'label' | 'matrix' | 'simple';\nexport type ObjectStyle = 'form' | 'deepObject';\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\n\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\n value: string;\n}\n\nexport const separatorArrayExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const separatorArrayNoExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'form':\n return ',';\n case 'pipeDelimited':\n return '|';\n case 'spaceDelimited':\n return '%20';\n default:\n return ',';\n }\n};\n\nexport const separatorObjectExplode = (style: ObjectSeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const serializeArrayParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n}: SerializeOptions & {\n value: unknown[];\n}) => {\n if (!explode) {\n const joinedValues = (\n allowReserved ? value : value.map((v) => encodeURIComponent(v as string))\n ).join(separatorArrayNoExplode(style));\n switch (style) {\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n case 'simple':\n return joinedValues;\n default:\n return `${name}=${joinedValues}`;\n }\n }\n\n const separator = separatorArrayExplode(style);\n const joinedValues = value\n .map((v) => {\n if (style === 'label' || style === 'simple') {\n return allowReserved ? v : encodeURIComponent(v as string);\n }\n\n return serializePrimitiveParam({\n allowReserved,\n name,\n value: v as string,\n });\n })\n .join(separator);\n return style === 'label' || style === 'matrix'\n ? separator + joinedValues\n : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n allowReserved,\n name,\n value,\n}: SerializePrimitiveParam) => {\n if (value === undefined || value === null) {\n return '';\n }\n\n if (typeof value === 'object') {\n throw new Error(\n 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.',\n );\n }\n\n return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\n\nexport const serializeObjectParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n valueOnly,\n}: SerializeOptions & {\n value: Record | Date;\n valueOnly?: boolean;\n}) => {\n if (value instanceof Date) {\n return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n }\n\n if (style !== 'deepObject' && !explode) {\n let values: string[] = [];\n Object.entries(value).forEach(([key, v]) => {\n values = [\n ...values,\n key,\n allowReserved ? (v as string) : encodeURIComponent(v as string),\n ];\n });\n const joinedValues = values.join(',');\n switch (style) {\n case 'form':\n return `${name}=${joinedValues}`;\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n default:\n return joinedValues;\n }\n }\n\n const separator = separatorObjectExplode(style);\n const joinedValues = Object.entries(value)\n .map(([key, v]) =>\n serializePrimitiveParam({\n allowReserved,\n name: style === 'deepObject' ? `${name}[${key}]` : key,\n value: v as string,\n }),\n )\n .join(separator);\n return style === 'label' || style === 'matrix'\n ? separator + joinedValues\n : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { BodySerializer, QuerySerializer } from './bodySerializer.gen';\nimport {\n type ArraySeparatorStyle,\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from './pathSerializer.gen';\n\nexport interface PathSerializer {\n path: Record;\n url: string;\n}\n\nexport const PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => {\n let url = _url;\n const matches = _url.match(PATH_PARAM_RE);\n if (matches) {\n for (const match of matches) {\n let explode = false;\n let name = match.substring(1, match.length - 1);\n let style: ArraySeparatorStyle = 'simple';\n\n if (name.endsWith('*')) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n\n if (name.startsWith('.')) {\n name = name.substring(1);\n style = 'label';\n } else if (name.startsWith(';')) {\n name = name.substring(1);\n style = 'matrix';\n }\n\n const value = path[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n url = url.replace(\n match,\n serializeArrayParam({ explode, name, style, value }),\n );\n continue;\n }\n\n if (typeof value === 'object') {\n url = url.replace(\n match,\n serializeObjectParam({\n explode,\n name,\n style,\n value: value as Record,\n valueOnly: true,\n }),\n );\n continue;\n }\n\n if (style === 'matrix') {\n url = url.replace(\n match,\n `;${serializePrimitiveParam({\n name,\n value: value as string,\n })}`,\n );\n continue;\n }\n\n const replaceValue = encodeURIComponent(\n style === 'label' ? `.${value as string}` : (value as string),\n );\n url = url.replace(match, replaceValue);\n }\n }\n return url;\n};\n\nexport const getUrl = ({\n baseUrl,\n path,\n query,\n querySerializer,\n url: _url,\n}: {\n baseUrl?: string;\n path?: Record;\n query?: Record;\n querySerializer: QuerySerializer;\n url: string;\n}) => {\n const pathUrl = _url.startsWith('/') ? _url : `/${_url}`;\n let url = (baseUrl ?? '') + pathUrl;\n if (path) {\n url = defaultPathSerializer({ path, url });\n }\n let search = query ? querySerializer(query) : '';\n if (search.startsWith('?')) {\n search = search.substring(1);\n }\n if (search) {\n url += `?${search}`;\n }\n return url;\n};\n\nexport function getValidRequestBody(options: {\n body?: unknown;\n bodySerializer?: BodySerializer | null;\n serializedBody?: unknown;\n}) {\n const hasBody = options.body !== undefined;\n const isSerializedBody = hasBody && options.bodySerializer;\n\n if (isSerializedBody) {\n if ('serializedBody' in options) {\n const hasSerializedBody =\n options.serializedBody !== undefined && options.serializedBody !== '';\n\n return hasSerializedBody ? options.serializedBody : null;\n }\n\n // not all clients implement a serializedBody property (i.e. client-axios)\n return options.body !== '' ? options.body : null;\n }\n\n // plain/text body\n if (hasBody) {\n return options.body;\n }\n\n // no body was provided\n return undefined;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nexport type AuthToken = string | undefined;\n\nexport interface Auth {\n /**\n * Which part of the request do we use to send the auth?\n *\n * @default 'header'\n */\n in?: 'header' | 'query' | 'cookie';\n /**\n * Header or query parameter name.\n *\n * @default 'Authorization'\n */\n name?: string;\n scheme?: 'basic' | 'bearer';\n type: 'apiKey' | 'http';\n}\n\nexport const getAuthToken = async (\n auth: Auth,\n callback: ((auth: Auth) => Promise | AuthToken) | AuthToken,\n): Promise => {\n const token =\n typeof callback === 'function' ? await callback(auth) : callback;\n\n if (!token) {\n return;\n }\n\n if (auth.scheme === 'bearer') {\n return `Bearer ${token}`;\n }\n\n if (auth.scheme === 'basic') {\n return `Basic ${btoa(token)}`;\n }\n\n return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { getAuthToken } from '../core/auth.gen';\nimport type { QuerySerializerOptions } from '../core/bodySerializer.gen';\nimport { jsonBodySerializer } from '../core/bodySerializer.gen';\nimport {\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from '../core/pathSerializer.gen';\nimport { getUrl } from '../core/utils.gen';\nimport type { Client, ClientOptions, Config, RequestOptions } from './types.gen';\n\nexport const createQuerySerializer = ({\n allowReserved,\n array,\n object,\n}: QuerySerializerOptions = {}) => {\n const querySerializer = (queryParams: T) => {\n const search: string[] = [];\n if (queryParams && typeof queryParams === 'object') {\n for (const name in queryParams) {\n const value = queryParams[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n const serializedArray = serializeArrayParam({\n allowReserved,\n explode: true,\n name,\n style: 'form',\n value,\n ...array,\n });\n if (serializedArray) search.push(serializedArray);\n } else if (typeof value === 'object') {\n const serializedObject = serializeObjectParam({\n allowReserved,\n explode: true,\n name,\n style: 'deepObject',\n value: value as Record,\n ...object,\n });\n if (serializedObject) search.push(serializedObject);\n } else {\n const serializedPrimitive = serializePrimitiveParam({\n allowReserved,\n name,\n value: value as string,\n });\n if (serializedPrimitive) search.push(serializedPrimitive);\n }\n }\n }\n return search.join('&');\n };\n return querySerializer;\n};\n\n/**\n * Infers parseAs value from provided Content-Type header.\n */\nexport const getParseAs = (\n contentType: string | null,\n): Exclude => {\n if (!contentType) {\n // If no Content-Type header is provided, the best we can do is return the raw response body,\n // which is effectively the same as the 'stream' option.\n return 'stream';\n }\n\n const cleanContent = contentType.split(';')[0]?.trim();\n\n if (!cleanContent) {\n return;\n }\n\n if (\n cleanContent.startsWith('application/json') ||\n cleanContent.endsWith('+json')\n ) {\n return 'json';\n }\n\n if (cleanContent === 'multipart/form-data') {\n return 'formData';\n }\n\n if (\n ['application/', 'audio/', 'image/', 'video/'].some((type) =>\n cleanContent.startsWith(type),\n )\n ) {\n return 'blob';\n }\n\n if (cleanContent.startsWith('text/')) {\n return 'text';\n }\n\n return;\n};\n\nconst checkForExistence = (\n options: Pick & {\n headers: Headers;\n },\n name?: string,\n): boolean => {\n if (!name) {\n return false;\n }\n if (\n options.headers.has(name) ||\n options.query?.[name] ||\n options.headers.get('Cookie')?.includes(`${name}=`)\n ) {\n return true;\n }\n return false;\n};\n\nexport const setAuthParams = async ({\n security,\n ...options\n}: Pick, 'security'> &\n Pick & {\n headers: Headers;\n }) => {\n for (const auth of security) {\n if (checkForExistence(options, auth.name)) {\n continue;\n }\n\n const token = await getAuthToken(auth, options.auth);\n\n if (!token) {\n continue;\n }\n\n const name = auth.name ?? 'Authorization';\n\n switch (auth.in) {\n case 'query':\n if (!options.query) {\n options.query = {};\n }\n options.query[name] = token;\n break;\n case 'cookie':\n options.headers.append('Cookie', `${name}=${token}`);\n break;\n case 'header':\n default:\n options.headers.set(name, token);\n break;\n }\n }\n};\n\nexport const buildUrl: Client['buildUrl'] = (options) =>\n getUrl({\n baseUrl: options.baseUrl as string,\n path: options.path,\n query: options.query,\n querySerializer:\n typeof options.querySerializer === 'function'\n ? options.querySerializer\n : createQuerySerializer(options.querySerializer),\n url: options.url,\n });\n\nexport const mergeConfigs = (a: Config, b: Config): Config => {\n const config = { ...a, ...b };\n if (config.baseUrl?.endsWith('/')) {\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n }\n config.headers = mergeHeaders(a.headers, b.headers);\n return config;\n};\n\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\n const entries: Array<[string, string]> = [];\n headers.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries;\n};\n\nexport const mergeHeaders = (\n ...headers: Array['headers'] | undefined>\n): Headers => {\n const mergedHeaders = new Headers();\n for (const header of headers) {\n if (!header) {\n continue;\n }\n\n const iterator =\n header instanceof Headers\n ? headersEntries(header)\n : Object.entries(header);\n\n for (const [key, value] of iterator) {\n if (value === null) {\n mergedHeaders.delete(key);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n mergedHeaders.append(key, v as string);\n }\n } else if (value !== undefined) {\n // assume object headers are meant to be JSON stringified, i.e. their\n // content value in OpenAPI specification is 'application/json'\n mergedHeaders.set(\n key,\n typeof value === 'object' ? JSON.stringify(value) : (value as string),\n );\n }\n }\n }\n return mergedHeaders;\n};\n\ntype ErrInterceptor = (\n error: Err,\n response: Res,\n request: Req,\n options: Options,\n) => Err | Promise;\n\ntype ReqInterceptor = (\n request: Req,\n options: Options,\n) => Req | Promise;\n\ntype ResInterceptor = (\n response: Res,\n request: Req,\n options: Options,\n) => Res | Promise;\n\nclass Interceptors {\n fns: Array = [];\n\n clear(): void {\n this.fns = [];\n }\n\n eject(id: number | Interceptor): void {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = null;\n }\n }\n\n exists(id: number | Interceptor): boolean {\n const index = this.getInterceptorIndex(id);\n return Boolean(this.fns[index]);\n }\n\n getInterceptorIndex(id: number | Interceptor): number {\n if (typeof id === 'number') {\n return this.fns[id] ? id : -1;\n }\n return this.fns.indexOf(id);\n }\n\n update(\n id: number | Interceptor,\n fn: Interceptor,\n ): number | Interceptor | false {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = fn;\n return id;\n }\n return false;\n }\n\n use(fn: Interceptor): number {\n this.fns.push(fn);\n return this.fns.length - 1;\n }\n}\n\nexport interface Middleware {\n error: Interceptors>;\n request: Interceptors>;\n response: Interceptors>;\n}\n\nexport const createInterceptors = (): Middleware<\n Req,\n Res,\n Err,\n Options\n> => ({\n error: new Interceptors>(),\n request: new Interceptors>(),\n response: new Interceptors>(),\n});\n\nconst defaultQuerySerializer = createQuerySerializer({\n allowReserved: false,\n array: {\n explode: true,\n style: 'form',\n },\n object: {\n explode: true,\n style: 'deepObject',\n },\n});\n\nconst defaultHeaders = {\n 'Content-Type': 'application/json',\n};\n\nexport const createConfig = (\n override: Config & T> = {},\n): Config & T> => ({\n ...jsonBodySerializer,\n headers: defaultHeaders,\n parseAs: 'auto',\n querySerializer: defaultQuerySerializer,\n ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createSseClient } from '../core/serverSentEvents.gen';\nimport type { HttpMethod } from '../core/types.gen';\nimport { getValidRequestBody } from '../core/utils.gen';\nimport type {\n Client,\n Config,\n RequestOptions,\n ResolvedRequestOptions,\n} from './types.gen';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils.gen';\n\ntype ReqInit = Omit & {\n body?: any;\n headers: ReturnType;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<\n Request,\n Response,\n unknown,\n ResolvedRequestOptions\n >();\n\n const beforeRequest = async (options: RequestOptions) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n serializedBody: undefined,\n };\n\n if (opts.security) {\n await setAuthParams({\n ...opts,\n security: opts.security,\n });\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body);\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.serializedBody === '') {\n opts.headers.delete('Content-Type');\n }\n\n const url = buildUrl(opts);\n\n return { opts, url };\n };\n\n const request: Client['request'] = async (options) => {\n // @ts-expect-error\n const { opts, url } = await beforeRequest(options);\n const requestInit: ReqInit = {\n redirect: 'follow',\n ...opts,\n body: getValidRequestBody(opts),\n };\n\n let request = new Request(url, requestInit);\n\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n let response = await _fetch(request);\n\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n if (\n response.status === 204 ||\n response.headers.get('Content-Length') === '0'\n ) {\n let emptyData: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'text':\n emptyData = await response[parseAs]();\n break;\n case 'formData':\n emptyData = new FormData();\n break;\n case 'stream':\n emptyData = response.body;\n break;\n case 'json':\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === 'data'\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'json':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n const error = jsonError ?? textError;\n let finalError = error;\n\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = (await fn(error, response, request, opts)) as string;\n }\n }\n\n finalError = finalError || ({} as string);\n\n if (opts.throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return opts.responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n ...result,\n };\n };\n\n const makeMethodFn =\n (method: Uppercase) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn =\n (method: Uppercase) => async (options: RequestOptions) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body as BodyInit | null | undefined,\n headers: opts.headers as unknown as Record,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n url,\n });\n };\n\n return {\n buildUrl,\n connect: makeMethodFn('CONNECT'),\n delete: makeMethodFn('DELETE'),\n get: makeMethodFn('GET'),\n getConfig,\n head: makeMethodFn('HEAD'),\n interceptors,\n options: makeMethodFn('OPTIONS'),\n patch: makeMethodFn('PATCH'),\n post: makeMethodFn('POST'),\n put: makeMethodFn('PUT'),\n request,\n setConfig,\n sse: {\n connect: makeSseFn('CONNECT'),\n delete: makeSseFn('DELETE'),\n get: makeSseFn('GET'),\n head: makeSseFn('HEAD'),\n options: makeSseFn('OPTIONS'),\n patch: makeSseFn('PATCH'),\n post: makeSseFn('POST'),\n put: makeSseFn('PUT'),\n trace: makeSseFn('TRACE'),\n },\n trace: makeMethodFn('TRACE'),\n } as Client;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { type ClientOptions, type Config, createClient, createConfig } from './client';\nimport type { ClientOptions as ClientOptions2 } from './types.gen';\n\n/**\n * The `createClientConfig()` function will be called on client initialization\n * and the returned object will become the client's initial configuration.\n *\n * You may want to initialize your client this way instead of calling\n * `setConfig()`. This is useful for example if you're using Next.js\n * to ensure your client always has the correct values.\n */\nexport type CreateClientConfig = (override?: Config) => Config & T>;\n\nexport const client = createClient(createConfig({\n baseUrl: 'http://localhost:26293',\n throwOnError: true\n}));\n","// This file is auto-generated by @hey-api/openapi-ts\r\n\r\nimport type { Client, Options as Options2, TDataShape } from './client';\r\nimport { client } from './client.gen';\r\nimport type { GetGridStylesheetData, GetGridStylesheetResponses, GetGridStylesheetsData, GetGridStylesheetsResponses, GetListStylesheetData, GetListStylesheetResponses, GetListStylesheetsData, GetListStylesheetsResponses, GetRteStylesheetData, GetRteStylesheetResponses, GetRteStylesheetsData, GetRteStylesheetsResponses, GetSettingsData, GetSettingsResponses, GetSingleBlockStylesheetsData, GetSingleBlockStylesheetsResponses, PreviewGridBlockData, PreviewGridBlockResponses, PreviewListBlockData, PreviewListBlockResponses, PreviewRichTextMarkupData, PreviewRichTextMarkupResponses, PreviewSingleBlockData, PreviewSingleBlockResponses } from './types.gen';\r\n\r\nexport type Options = Options2 & {\r\n /**\r\n * You can provide a client instance returned by `createClient()` instead of\r\n * individual options. This might be also useful if you want to implement a\r\n * custom client.\r\n */\r\n client?: Client;\r\n /**\r\n * You can pass arbitrary values through the `meta` object. This can be\r\n * used to access values that aren't defined as part of the SDK function.\r\n */\r\n meta?: Record;\r\n};\r\n\r\nexport class BlockPreviewService {\r\n public static previewGridBlock(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/grid',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * @deprecated\r\n */\r\n public static getGridStylesheet(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/grid/stylesheet',\r\n ...options\r\n });\r\n }\r\n \r\n public static getGridStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/grid/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static previewListBlock(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/list',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * @deprecated\r\n */\r\n public static getListStylesheet(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/list/stylesheet',\r\n ...options\r\n });\r\n }\r\n \r\n public static getListStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/list/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static previewRichTextMarkup(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/rte',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * @deprecated\r\n */\r\n public static getRteStylesheet(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/rte/stylesheet',\r\n ...options\r\n });\r\n }\r\n \r\n public static getRteStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/rte/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static previewSingleBlock(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/single',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n public static getSingleBlockStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/single/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static getSettings(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/settings',\r\n ...options\r\n });\r\n }\r\n}\r\n","import { UmbContextToken } from \"@umbraco-cms/backoffice/context-api\";\r\nimport BlockPreviewContext from \"./block-preview.context\";\r\n\r\nexport const BLOCK_PREVIEW_CONTEXT = new UmbContextToken('BlockPreviewContext');\r\n","import BlockPreviewContext from '../context/block-preview.context';\r\nimport { BLOCK_PREVIEW_CONTEXT } from '../context/block-preview.context-token';\r\nimport { BlockContext } from './types';\r\nimport { css, html, ifDefined, nothing, property, PropertyValueMap, state, unsafeHTML } from '@umbraco-cms/backoffice/external/lit';\r\nimport { UMB_BLOCK_WORKSPACE_CONTEXT, UmbBlockDataType } from '@umbraco-cms/backoffice/block';\r\nimport type { UmbBlockEditorCustomViewConfiguration, UmbBlockEditorCustomViewElement } from '@umbraco-cms/backoffice/block-custom-view';\r\nimport { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';\r\nimport { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property';\r\nimport { UmbApiError } from '@umbraco-cms/backoffice/resources';\r\nimport { UUIButtonElement } from '@umbraco-cms/backoffice/external/uui';\r\n\r\n/**\r\n * Abstract base class for block preview custom view elements.\r\n * Extracts shared behavior (lifecycle, rendering, click handling, validation,\r\n * context observation helpers, and CSS) so that block-type-specific subclasses\r\n * only implement the parts that differ.\r\n */\r\nexport abstract class BlockPreviewBaseElement\r\n extends UmbLitElement\r\n implements UmbBlockEditorCustomViewElement {\r\n\r\n protected _blockPreviewContext?: BlockPreviewContext;\r\n protected _workspaceContextResolved: boolean = false;\r\n\r\n @property({ attribute: false, hasChanged: (val: any, old: any) => JSON.stringify(val) !== JSON.stringify(old) })\r\n content?: UmbBlockDataType;\r\n\r\n @property({ attribute: false, hasChanged: (val: any, old: any) => JSON.stringify(val) !== JSON.stringify(old) })\r\n settings?: UmbBlockDataType;\r\n\r\n @property({ attribute: false })\r\n contentKey?: string;\r\n\r\n @property({ attribute: false })\r\n config?: UmbBlockEditorCustomViewConfiguration;\r\n\r\n @property({ attribute: false })\r\n unpublished?: boolean;\r\n\r\n @property({ attribute: false })\r\n icon?: string;\r\n\r\n @property({ attribute: false })\r\n label?: string;\r\n\r\n @state()\r\n protected _htmlMarkup: string = '';\r\n\r\n @state()\r\n protected _isLoading: boolean = false;\r\n\r\n @state()\r\n protected _error: string | null = null;\r\n\r\n protected _stylesheetsAdopted: boolean = false;\r\n\r\n protected _requestId: number = 0;\r\n\r\n protected _isConnected: boolean = false;\r\n\r\n /** Tracks pointerdown position on the tag to distinguish clicks from drags. */\r\n private _pointerStartPos: { x: number; y: number } | null = null;\r\n\r\n /** Subclass provides a concrete block context object with block-type-specific fields. */\r\n protected abstract _blockContext: TContext;\r\n\r\n /** Set up all context observers (sort mode, property dataset, workspace). */\r\n protected abstract setupContextObservers(): Promise | void;\r\n\r\n /** Observe the block entry context for content/settings keys and element type info. */\r\n protected abstract observeBlockValue(): void;\r\n\r\n /** Call the appropriate BlockPreviewService API method and return the result. */\r\n protected abstract callPreviewApi(): Promise<{ data?: string | null; error?: unknown }>;\r\n\r\n /** Fetch stylesheet paths from the appropriate BlockPreviewService endpoint. */\r\n protected abstract fetchStylesheets(): Promise;\r\n\r\n constructor() {\r\n super();\r\n this.consumeContext(BLOCK_PREVIEW_CONTEXT, async (context) => {\r\n this._blockPreviewContext = context;\r\n await this.setupContextObservers();\r\n });\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback();\r\n this._isConnected = true;\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this._isConnected = false;\r\n }\r\n\r\n protected override updated(_changedProperties: PropertyValueMap | Map) {\r\n super.updated(_changedProperties);\r\n if (_changedProperties.has('content') || _changedProperties.has('settings')) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n\r\n // region Shared context observers\r\n\r\n protected observePropertyDataset() {\r\n this.consumeContext(UMB_PROPERTY_DATASET_CONTEXT, (instance) => {\r\n if (instance) {\r\n this._blockContext.culture = instance.getVariantId().culture ?? '';\r\n }\r\n });\r\n }\r\n\r\n // endregion\r\n\r\n // region Workspace helpers\r\n\r\n /**\r\n * Shared handler called once the workspace context provides a unique + documentTypeUnique.\r\n * Sets up block context, triggers block value observation, and loads stylesheets.\r\n */\r\n protected async handleWorkspaceData(unique: string | undefined, documentTypeUnique: string | undefined) {\r\n if (!this._isConnected || !documentTypeUnique) {\r\n return;\r\n }\r\n\r\n this._blockContext.unique = unique?.toString() ?? '';\r\n this._blockPreviewContext?.setUnique(this._blockContext.unique);\r\n\r\n this._blockContext.documentTypeUnique = documentTypeUnique;\r\n this._blockPreviewContext?.setDocumentTypeUnique(this._blockContext.documentTypeUnique);\r\n this._workspaceContextResolved = true;\r\n\r\n this.observeBlockValue();\r\n await this.fetchAndLoadStylesheets();\r\n }\r\n\r\n /**\r\n * Fallback workspace observation via UMB_BLOCK_WORKSPACE_CONTEXT.\r\n * Used when the primary workspace context is unavailable (e.g. nested block editing).\r\n */\r\n protected observeBlockWorkspaceFallback() {\r\n if (this._workspaceContextResolved || !this._blockPreviewContext || this._blockContext.unique !== '') {\r\n return;\r\n }\r\n\r\n this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, async (context) => {\r\n if (context) {\r\n this.observe(context.content.structure.contentTypeUniques, async (contentTypeUniques) => {\r\n const documentTypeUnique = contentTypeUniques[0];\r\n if (!this._isConnected || !documentTypeUnique) {\r\n return;\r\n }\r\n\r\n // Try to get unique from context, then fallback to extraction\r\n this._blockContext.unique = this._blockPreviewContext?.getUnique() ?? '';\r\n if (!this._blockContext.unique && this._blockContext.workspaceEditContentPath) {\r\n this._blockContext.unique = this.extractUniqueFromWorkspacePath(this._blockContext.workspaceEditContentPath);\r\n }\r\n\r\n this._blockContext.documentTypeUnique = documentTypeUnique;\r\n this.observeBlockValue();\r\n await this.fetchAndLoadStylesheets();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected async fetchAndLoadStylesheets() {\r\n if (this._stylesheetsAdopted || !this._blockPreviewContext) return;\r\n const data = await this.fetchStylesheets();\r\n if (data && data.length > 0) {\r\n const sheets = await Promise.all(\r\n data.map(href => this._blockPreviewContext!.getOrCreateStylesheet(href))\r\n );\r\n const shadowRoot = this.renderRoot as ShadowRoot;\r\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, ...sheets];\r\n this._stylesheetsAdopted = true;\r\n }\r\n }\r\n\r\n // endregion\r\n\r\n // region Preview rendering\r\n\r\n protected resolveUniqueFromContext() {\r\n if (this._blockPreviewContext != null && this._blockContext.unique === '') {\r\n this._blockContext.unique = this._blockPreviewContext.getUnique();\r\n if (!this._blockContext.unique && this._blockContext.workspaceEditContentPath) {\r\n this._blockContext.unique = this.extractUniqueFromWorkspacePath(this._blockContext.workspaceEditContentPath);\r\n }\r\n }\r\n if (this._blockPreviewContext != null && this._blockContext.documentTypeUnique === '') {\r\n this._blockContext.documentTypeUnique = this._blockPreviewContext.getDocumentTypeUnique();\r\n }\r\n }\r\n\r\n protected async renderBlockPreview() {\r\n if (!this._isConnected) {\r\n return;\r\n }\r\n\r\n this.resolveUniqueFromContext();\r\n\r\n if (!this.validatePreviewData()) {\r\n return;\r\n }\r\n\r\n this._isLoading = true;\r\n this._error = null;\r\n\r\n const requestId = ++this._requestId;\r\n\r\n try {\r\n const { data, error } = await this._blockPreviewContext!.requestQueue.enqueue(() =>\r\n this.callPreviewApi()\r\n );\r\n\r\n if (this._requestId !== requestId) return;\r\n\r\n if (data != null) {\r\n this._htmlMarkup = data;\r\n this._isLoading = false;\r\n }\r\n else if (error) {\r\n this._error = UmbApiError.isUmbApiError(error) ? error.message : this.localize.term('blockPreview_renderError');\r\n this._isLoading = false;\r\n }\r\n else {\r\n this._isLoading = false;\r\n }\r\n } catch (error) {\r\n if (this._requestId !== requestId) return;\r\n this._error = this.localize.term('blockPreview_renderFailed');\r\n this._isLoading = false;\r\n console.error('Block preview error:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Validates that sufficient data is available for a preview request.\r\n * Subclasses may override to add additional checks (e.g. contentUdi).\r\n */\r\n protected validatePreviewData(): boolean {\r\n const context = this._blockContext;\r\n return !!(\r\n context.unique !== '' &&\r\n context.blockEditorAlias !== '' &&\r\n context.contentElementTypeAlias !== ''\r\n );\r\n }\r\n\r\n // endregion\r\n\r\n // region Utilities\r\n\r\n protected extractUniqueFromWorkspacePath(path: string): string {\r\n // Extract the document unique from the workspace edit path\r\n // Pattern: /workspace/document/edit/{unique}/\r\n const match = path.match(/\\/workspace\\/document\\/edit\\/([a-f0-9-]{36})/i);\r\n return match ? match[1] : '';\r\n }\r\n\r\n protected _handlePointerDown(event: PointerEvent) {\r\n this._pointerStartPos = { x: event.clientX, y: event.clientY };\r\n }\r\n\r\n protected _handleClick(event: PointerEvent) {\r\n // Detect drag/resize interactions: if the pointer moved significantly between\r\n // pointerdown and click, suppress the navigation. This prevents the edit modal\r\n // from opening when the user finishes resizing a grid block.\r\n const pointerType = 'pointerType' in event ? (event as PointerEvent).pointerType : '';\r\n if (pointerType !== '') {\r\n if (!this._pointerStartPos) {\r\n // Pointer click with no corresponding pointerdown on this element —\r\n // likely a resize/drag that ended over our tag.\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n const dx = Math.abs(event.clientX - this._pointerStartPos.x);\r\n const dy = Math.abs(event.clientY - this._pointerStartPos.y);\r\n this._pointerStartPos = null;\r\n if (dx > 5 || dy > 5) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n }\r\n this._pointerStartPos = null;\r\n\r\n const path = event.composedPath();\r\n\r\n // Check for clicks on action bars or resize handlers.\r\n const interactiveElements = ['UUI-ACTION-BAR', 'UMB-BLOCK-SCALE-HANDLER'];\r\n if (path.some(x => x instanceof Element && interactiveElements.includes(x.tagName))) {\r\n // Allow edit button clicks through — the tag handles navigation.\r\n const editButton = path.find(x => x instanceof UUIButtonElement && x.href?.includes('block/edit'));\r\n if (editButton) {\r\n return;\r\n }\r\n\r\n // Block all other action bar clicks (delete, copy, etc.) to prevent\r\n // the parent block's from navigating when interacting with\r\n // child blocks inside areas.\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n\r\n // Handle custom links within the preview\r\n const containsLink = path.filter(x => x instanceof Element && x.tagName === 'A' && x.hasAttribute('data-block-preview-link')) as Element[];\r\n if (containsLink.length > 0) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const blockPreviewEdit = path.find(x => x instanceof Element && x.tagName === 'A' && x.classList.contains('block-preview-edit'));\r\n if (blockPreviewEdit instanceof Element) {\r\n window.history.pushState({}, '', blockPreviewEdit.getAttribute('href'));\r\n } else {\r\n window.history.pushState({}, '', this._blockContext.workspaceEditContentPath);\r\n }\r\n return;\r\n }\r\n\r\n // All other clicks fall through to the element's default behavior,\r\n // which navigates to this block's edit workspace.\r\n }\r\n\r\n // endregion\r\n\r\n // region Rendering\r\n\r\n override render() {\r\n return html`\r\n ${this._isLoading\r\n ? html`
Loading preview...
`\r\n : this._error\r\n ? html`
${this._error}
`\r\n : this._htmlMarkup\r\n ? html`${unsafeHTML(this._htmlMarkup)}
`\r\n : nothing}\r\n `;\r\n }\r\n\r\n // endregion\r\n\r\n static styles = [\r\n css`\r\n a.block-preview-edit {\r\n display: block;\r\n color: inherit;\r\n text-decoration: inherit;\r\n border: 1px solid transparent;\r\n border-radius: 2px;\r\n }\r\n\r\n a.block-preview-edit:hover {\r\n border-color: var(--uui-color-interactive-emphasis, #3544b1);\r\n }\r\n\r\n .preview-alert {\r\n background-color: var(--uui-color-danger, #f0ac00);\r\n border: 1px solid transparent;\r\n border-radius: 0;\r\n margin-bottom: 20px;\r\n padding: 8px 35px 8px 14px;\r\n position: relative;\r\n\r\n &, a, h4 {\r\n color: #fff;\r\n }\r\n\r\n pre {\r\n white-space: normal;\r\n }\r\n\r\n uui-loader {\r\n color: #fff;\r\n margin-right: 16px;\r\n }\r\n }\r\n\r\n .preview-alert-warning {\r\n background-color: var(--uui-color-warning, #f0ac00);\r\n border-color: transparent;\r\n color: #000;\r\n }\r\n\r\n .preview-alert-info {\r\n background-color: var(--uui-color-default, #3544b1);\r\n border-color: transparent;\r\n color: #fff;\r\n }\r\n\r\n .preview-alert-danger, .preview-alert-error {\r\n background-color: var(--uui-color-danger, #f0ac00);\r\n border-color: transparent;\r\n color: #fff;\r\n }\r\n `\r\n ]\r\n}\r\n","import { UmbDataSourceResponse } from \"@umbraco-cms/backoffice/repository\";\r\nimport { BlockPreviewService } from \"../api\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\nimport { tryExecute } from \"@umbraco-cms/backoffice/resources\";\r\n\r\n// Query type definitions\r\nexport interface BlockPreviewQuery {\r\n blockEditorAlias: string;\r\n nodeKey: string;\r\n contentElementAlias: string;\r\n documentTypeUnique: string;\r\n contentUdi: string;\r\n settingsUdi: string;\r\n culture: string;\r\n blockIndex: number;\r\n}\r\n\r\nexport interface RtePreviewQuery {\r\n blockEditorAlias: string;\r\n nodeKey: string;\r\n contentElementAlias: string;\r\n documentTypeUnique: string;\r\n culture: string;\r\n}\r\n\r\nexport interface StylesheetQuery {\r\n documentTypeUnique: string;\r\n nodeKey: string;\r\n}\r\n\r\nexport interface IPreviewDataSource {\r\n previewGridBlock(body: string, query: BlockPreviewQuery): Promise>;\r\n previewListBlock(body: string, query: BlockPreviewQuery): Promise>;\r\n previewSingleBlock(body: string, query: BlockPreviewQuery): Promise>;\r\n previewRichTextMarkup(body: string, query: RtePreviewQuery): Promise>;\r\n getGridStylesheets(query: StylesheetQuery): Promise>;\r\n getListStylesheets(query: StylesheetQuery): Promise>;\r\n getSingleBlockStylesheets(query: StylesheetQuery): Promise>;\r\n getRteStylesheets(query: StylesheetQuery): Promise>;\r\n}\r\n\r\nexport class PreviewDataSource implements IPreviewDataSource {\r\n #host: UmbControllerHost;\r\n\r\n constructor(host: UmbControllerHost) {\r\n this.#host = host;\r\n }\r\n\r\n async previewGridBlock(body: string, query: BlockPreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewGridBlock({ body, query }));\r\n }\r\n\r\n async previewListBlock(body: string, query: BlockPreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewListBlock({ body, query }));\r\n }\r\n\r\n async previewSingleBlock(body: string, query: BlockPreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewSingleBlock({ body, query }));\r\n }\r\n\r\n async previewRichTextMarkup(body: string, query: RtePreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewRichTextMarkup({ body, query }));\r\n }\r\n\r\n async getGridStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getGridStylesheets({ query }));\r\n }\r\n\r\n async getListStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getListStylesheets({ query }));\r\n }\r\n\r\n async getSingleBlockStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getSingleBlockStylesheets({ query }));\r\n }\r\n\r\n async getRteStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getRteStylesheets({ query }));\r\n }\r\n}\r\n","import { UmbDataSourceResponse } from \"@umbraco-cms/backoffice/repository\";\r\nimport { BlockPreviewService, type BlockPreviewOptions } from \"../api\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\nimport { tryExecute } from \"@umbraco-cms/backoffice/resources\";\r\n\r\nexport interface ISettingsDataSource {\r\n getSettings(): Promise>\r\n}\r\n\r\nexport class SettingsDataSource implements ISettingsDataSource {\r\n #host: UmbControllerHost;\r\n\r\n constructor(host: UmbControllerHost) {\r\n this.#host = host;\r\n }\r\n\r\n async getSettings(): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getSettings());\r\n }\r\n}","import { UmbControllerBase } from \"@umbraco-cms/backoffice/class-api\";\r\nimport { SettingsDataSource } from \"./settings.data-source\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\n\r\nexport class SettingsRepository extends UmbControllerBase {\r\n #settingsDataSource: SettingsDataSource;\r\n\r\n constructor(host: UmbControllerHost) {\r\n super(host);\r\n this.#settingsDataSource = new SettingsDataSource(host);\r\n }\r\n\r\n async getSettings() {\r\n const settings = await this.#settingsDataSource.getSettings();\r\n\r\n if (settings && settings?.data) {\r\n return settings.data;\r\n }\r\n }\r\n}","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockGridContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { css, customElement, property } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_GRID_ENTRY_CONTEXT, UMB_BLOCK_GRID_MANAGER_CONTEXT, UmbBlockGridLayoutModel, UmbBlockGridValueModel, UmbBlockGridLayoutAreaItemModel } from \"@umbraco-cms/backoffice/block-grid\";\r\nimport { UMB_CONTENT_WORKSPACE_CONTEXT } from \"@umbraco-cms/backoffice/content\";\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"block-grid-preview\";\r\n\r\n@customElement(elementName)\r\nexport class BlockGridPreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockGridContext = {\r\n unique: \"\",\r\n documentTypeUnique: \"\",\r\n contentUdi: \"\",\r\n settingsUdi: \"\",\r\n blockEditorAlias: \"\",\r\n culture: \"\",\r\n workspaceEditContentPath: \"\",\r\n contentElementTypeAlias: \"\",\r\n contentElementTypeKey: \"\",\r\n areas: [],\r\n layout: undefined,\r\n layoutAreas: undefined,\r\n blockIndex: 0\r\n };\r\n\r\n private _blockGridValue: UmbBlockGridValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n }\r\n\r\n @property({ attribute: false })\r\n public set blockGridValue(value: UmbBlockGridValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockGridValue = buildUpValue as UmbBlockGridValueModel;\r\n }\r\n public get blockGridValue(): UmbBlockGridValueModel {\r\n return this._blockGridValue;\r\n }\r\n\r\n protected async setupContextObservers() {\r\n this.observePropertyDataset();\r\n await this.#observeContentWorkspace();\r\n }\r\n\r\n async #observeContentWorkspace() {\r\n try {\r\n // The content workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document content workspace.\r\n await this.getContext(UMB_CONTENT_WORKSPACE_CONTEXT, { passContextAliasMatches: true });\r\n this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {\r\n if (!context) return;\r\n\r\n this.observe(\r\n observeMultiple([context.unique, context.structure.contentTypeUniques]),\r\n async ([unique, contentTypeUniques]) => {\r\n await this.handleWorkspaceData(unique?.toString(), contentTypeUniques?.[0]);\r\n }\r\n );\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue() {\r\n this.consumeContext(UMB_BLOCK_GRID_ENTRY_CONTEXT, async (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey,\r\n context.areas,\r\n context.layout,\r\n context.layoutAreas\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey,\r\n areas,\r\n layout,\r\n layoutAreas\r\n ]) => {\r\n const prevColumnSpan = this._blockContext.layout?.columnSpan;\r\n const prevRowSpan = this._blockContext.layout?.rowSpan;\r\n const prevLayoutAreas = this._blockContext.layoutAreas;\r\n\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n this._blockContext.areas = areas;\r\n this._blockContext.layout = layout!;\r\n this._blockContext.layoutAreas = layoutAreas;\r\n\r\n if (!this.#managerObserved && this._blockContext.contentUdi) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n\r\n // Re-render when layoutAreas first arrive for a block with areas.\r\n // Covers both the deferred case (_htmlMarkup empty) and the early-render\r\n // case (_htmlMarkup set from an incomplete render). blockGridValue.layout\r\n // must be rebuilt here so callPreviewApi() sends the updated area data.\r\n if (!prevLayoutAreas && layoutAreas && (areas?.length ?? 0) > 0 && this.#managerObserved && !this._isLoading) {\r\n this.blockGridValue = {\r\n ...this._blockGridValue,\r\n layout: { ['Umbraco.BlockGrid']: this.#filterLayouts() }\r\n };\r\n this.renderBlockPreview();\r\n }\r\n\r\n // Re-render when layout dimensions change (resize)\r\n if (this._htmlMarkup && layout && (\r\n layout.columnSpan !== prevColumnSpan ||\r\n layout.rowSpan !== prevRowSpan\r\n )) {\r\n this.blockGridValue = {\r\n ...this._blockGridValue,\r\n layout: { ['Umbraco.BlockGrid']: this.#filterLayouts() }\r\n };\r\n clearTimeout(this.#layoutResizeTimer);\r\n this.#layoutResizeTimer = setTimeout(() => {\r\n this.renderBlockPreview();\r\n }, 300);\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n #layoutResizeTimer?: ReturnType;\r\n\r\n async #observeBlockPropertyValue() {\r\n this.consumeContext(UMB_BLOCK_GRID_MANAGER_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([contents, settings, exposes, propertyAlias]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n this.blockGridValue = {\r\n contentData: contents ?? [],\r\n settingsData: settings ?? [],\r\n expose: exposes ?? [],\r\n layout: { ['Umbraco.BlockGrid']: this.#filterLayouts() }\r\n };\r\n this._blockContext.blockIndex = (contents ?? []).findIndex(x => x.key === this._blockContext.contentUdi);\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n // Defer render if areas are expected but layoutAreas haven't arrived yet;\r\n // observeBlockValue will trigger the render once layoutAreas are available.\r\n if ((this._blockContext.areas?.length ?? 0) > 0 && !this._blockContext.layoutAreas) {\r\n return;\r\n }\r\n this.renderBlockPreview();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #filterLayouts(): UmbBlockGridLayoutModel[] {\r\n const areas = this._blockContext.areas.map(area => {\r\n const model: UmbBlockGridLayoutAreaItemModel = {\r\n key: area.key,\r\n items: this._blockContext.layoutAreas?.find(layout => layout.key === area.key)?.items ?? []\r\n }\r\n return model;\r\n });\r\n\r\n const layoutModel: UmbBlockGridLayoutModel[] =\r\n [\r\n {\r\n areas: areas,\r\n columnSpan: this._blockContext.layout?.columnSpan ?? 0,\r\n rowSpan: this._blockContext.layout?.rowSpan ?? 0,\r\n contentKey: this._blockContext.layout?.contentKey ?? '',\r\n settingsKey: this._blockContext.layout?.settingsKey\r\n }\r\n ];\r\n\r\n return layoutModel;\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewGridBlock(\r\n JSON.stringify(this.blockGridValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n contentUdi: this._blockContext.contentUdi,\r\n settingsUdi: this._blockContext.settingsUdi,\r\n culture: this._blockContext.culture,\r\n blockIndex: this._blockContext.blockIndex\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getGridStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n\r\n protected override validatePreviewData(): boolean {\r\n return super.validatePreviewData() && this._blockContext.contentUdi !== '';\r\n }\r\n\r\n static override styles = [\r\n ...BlockPreviewBaseElement.styles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n a.block-preview-edit {\r\n height: 100%;\r\n }\r\n `\r\n ]\r\n}\r\n\r\nexport default BlockGridPreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: BlockGridPreviewCustomView;\r\n }\r\n}\r\n","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockListContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { css, customElement, property, state } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_LIST_ENTRY_CONTEXT, UMB_BLOCK_LIST_MANAGER_CONTEXT, UmbBlockListValueModel } from \"@umbraco-cms/backoffice/block-list\";\r\nimport { UMB_CONTENT_WORKSPACE_CONTEXT } from \"@umbraco-cms/backoffice/content\";\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"block-list-preview\";\r\n\r\n@customElement(elementName)\r\nexport class BlockListPreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockListContext = {\r\n unique: '',\r\n documentTypeUnique: '',\r\n contentUdi: '',\r\n settingsUdi: '',\r\n blockEditorAlias: '',\r\n culture: '',\r\n workspaceEditContentPath: '',\r\n contentElementTypeAlias: '',\r\n contentElementTypeKey: '',\r\n blockIndex: 0\r\n };\r\n\r\n @state()\r\n private _blockListValue: UmbBlockListValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n };\r\n\r\n @property({ attribute: false })\r\n public set blockListValue(value: UmbBlockListValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockListValue = buildUpValue as UmbBlockListValueModel;\r\n }\r\n\r\n public get blockListValue(): UmbBlockListValueModel {\r\n return this._blockListValue;\r\n }\r\n\r\n protected async setupContextObservers() {\r\n this.observePropertyDataset();\r\n await this.#observeContentWorkspace();\r\n }\r\n\r\n async #observeContentWorkspace() {\r\n try {\r\n // The content workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document content workspace.\r\n await this.getContext(UMB_CONTENT_WORKSPACE_CONTEXT, { passContextAliasMatches: true });\r\n\r\n this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {\r\n if (!context) return;\r\n\r\n this.observe(\r\n observeMultiple([context.unique, context.structure.contentTypeUniques]),\r\n async ([unique, contentTypeUniques]) => {\r\n await this.handleWorkspaceData(unique?.toString(), contentTypeUniques?.[0]);\r\n }\r\n );\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue() {\r\n this.consumeContext(UMB_BLOCK_LIST_ENTRY_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey\r\n ]) => {\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n\r\n // Only subscribe to manager context once contentUdi is known; subscribing with\r\n // an empty key causes the manager to filter contentData to [] on its first emit,\r\n // and the #managerObserved guard then blocks a corrective re-subscription.\r\n if (!this.#managerObserved && this._blockContext.contentUdi) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n\r\n #observeBlockPropertyValue() {\r\n this.consumeContext(UMB_BLOCK_LIST_MANAGER_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.layouts,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([\r\n contents,\r\n settings,\r\n layouts,\r\n exposes,\r\n propertyAlias\r\n ]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n\r\n this.blockListValue = {\r\n contentData: contents?.filter(x => x.key === this._blockContext.contentUdi) ?? [],\r\n settingsData: settings?.filter(x => x.key === this._blockContext.settingsUdi) ?? [],\r\n expose: exposes?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? [],\r\n layout: {\r\n ['Umbraco.BlockList']: layouts?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? []\r\n }\r\n };\r\n\r\n this._blockContext.blockIndex = contents?.indexOf(this.blockListValue.contentData[0]);\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewListBlock(\r\n JSON.stringify(this.blockListValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n contentUdi: this._blockContext.contentUdi,\r\n settingsUdi: this._blockContext.settingsUdi,\r\n culture: this._blockContext.culture,\r\n blockIndex: this._blockContext.blockIndex,\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getListStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n\r\n protected override validatePreviewData(): boolean {\r\n return super.validatePreviewData() && this._blockContext.contentUdi !== '';\r\n }\r\n\r\n static override styles = [\r\n ...BlockPreviewBaseElement.styles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n a.block-preview-edit {\r\n height: 100%;\r\n }\r\n `\r\n ]\r\n}\r\n\r\nexport default BlockListPreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: BlockListPreviewCustomView;\r\n }\r\n}\r\n","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { css, customElement, property, state } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_SINGLE_ENTRY_CONTEXT, UMB_BLOCK_SINGLE_MANAGER_CONTEXT, UmbBlockSingleValueModel } from \"@umbraco-cms/backoffice/block-single\";\r\nimport { UMB_CONTENT_WORKSPACE_CONTEXT } from \"@umbraco-cms/backoffice/content\";\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"block-single-preview\";\r\n\r\n@customElement(elementName)\r\nexport class BlockSinglePreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockContext = {\r\n unique: '',\r\n documentTypeUnique: '',\r\n contentUdi: '',\r\n settingsUdi: '',\r\n blockEditorAlias: '',\r\n culture: '',\r\n workspaceEditContentPath: '',\r\n contentElementTypeAlias: '',\r\n contentElementTypeKey: '',\r\n blockIndex: 0\r\n };\r\n\r\n @state()\r\n private _blockSingleValue: UmbBlockSingleValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n };\r\n\r\n @property({ attribute: false })\r\n public set blockSingleValue(value: UmbBlockSingleValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockSingleValue = buildUpValue as UmbBlockSingleValueModel;\r\n }\r\n\r\n public get blockSingleValue(): UmbBlockSingleValueModel {\r\n return this._blockSingleValue;\r\n }\r\n\r\n protected async setupContextObservers() {\r\n this.observePropertyDataset();\r\n await this.#observeContentWorkspace();\r\n }\r\n\r\n async #observeContentWorkspace() {\r\n try {\r\n // The content workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document content workspace.\r\n await this.getContext(UMB_CONTENT_WORKSPACE_CONTEXT, { passContextAliasMatches: true });\r\n\r\n this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {\r\n if (!context) return;\r\n\r\n this.observe(\r\n observeMultiple([context.unique, context.structure.contentTypeUniques]),\r\n async ([unique, contentTypeUniques]) => {\r\n await this.handleWorkspaceData(unique?.toString(), contentTypeUniques?.[0]);\r\n }\r\n );\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue() {\r\n this.consumeContext(UMB_BLOCK_SINGLE_ENTRY_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey\r\n ]) => {\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n\r\n if (!this.#managerObserved) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n\r\n #observeBlockPropertyValue() {\r\n this.consumeContext(UMB_BLOCK_SINGLE_MANAGER_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.layouts,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([\r\n contents,\r\n settings,\r\n layouts,\r\n exposes,\r\n propertyAlias\r\n ]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n\r\n this.blockSingleValue = {\r\n contentData: contents?.filter(x => x.key === this._blockContext.contentUdi) ?? [],\r\n settingsData: settings?.filter(x => x.key === this._blockContext.settingsUdi) ?? [],\r\n expose: exposes?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? [],\r\n layout: {\r\n ['Umbraco.SingleBlock']: layouts?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? []\r\n }\r\n };\r\n\r\n this._blockContext.blockIndex = contents?.indexOf(this.blockSingleValue.contentData[0]);\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewSingleBlock(\r\n JSON.stringify(this.blockSingleValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n contentUdi: this._blockContext.contentUdi,\r\n settingsUdi: this._blockContext.settingsUdi,\r\n culture: this._blockContext.culture,\r\n blockIndex: this._blockContext.blockIndex,\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getSingleBlockStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n\r\n protected override validatePreviewData(): boolean {\r\n return super.validatePreviewData() && this._blockContext.contentUdi !== '';\r\n }\r\n\r\n static override styles = [\r\n ...BlockPreviewBaseElement.styles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n a.block-preview-edit {\r\n height: 100%;\r\n }\r\n `\r\n ]\r\n}\r\n\r\nexport default BlockSinglePreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: BlockSinglePreviewCustomView;\r\n }\r\n}\r\n","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { customElement, property, state } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_RTE_ENTRY_CONTEXT, UMB_BLOCK_RTE_MANAGER_CONTEXT, UmbBlockRteValueModel } from \"@umbraco-cms/backoffice/block-rte\";\r\nimport { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/document';\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"rich-text-preview\";\r\n\r\n@customElement(elementName)\r\nexport class RichTextPreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockContext = {\r\n unique: '',\r\n documentTypeUnique: '',\r\n contentUdi: '',\r\n settingsUdi: '',\r\n blockEditorAlias: '',\r\n culture: '',\r\n workspaceEditContentPath: '',\r\n contentElementTypeAlias: '',\r\n contentElementTypeKey: '',\r\n blockIndex: 0\r\n };\r\n\r\n @state()\r\n private _blockRteValue: UmbBlockRteValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n }\r\n\r\n @property({ attribute: false })\r\n public set blockRteValue(value: UmbBlockRteValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockRteValue = buildUpValue as UmbBlockRteValueModel;\r\n }\r\n public get blockRteValue(): UmbBlockRteValueModel {\r\n return this._blockRteValue;\r\n }\r\n\r\n protected setupContextObservers() {\r\n this.observePropertyDataset();\r\n // Observe the block entry/manager contexts independently of the workspace.\r\n // These RTE-specific contexts are always available to the block view, whereas\r\n // UMB_DOCUMENT_WORKSPACE_CONTEXT is absent when the host block is edited inside a\r\n // side-panel modal (e.g. an RTE field on a block nested in a Block Grid/List).\r\n // Gating this behind the document workspace meant the preview never rendered there.\r\n this.observeBlockValue();\r\n this.#observeDocumentWorkspace();\r\n }\r\n\r\n #observeDocumentWorkspace() {\r\n try {\r\n // The document workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document workspace.\r\n this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (context) => {\r\n if (context) {\r\n this._workspaceContextResolved = true;\r\n this.observe(\r\n observeMultiple([context.unique, context.contentTypeUnique]),\r\n async ([unique, documentTypeUnique]) => {\r\n await this.handleWorkspaceData(unique?.toString(), documentTypeUnique);\r\n }\r\n );\r\n }\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n #entryObserved = false;\r\n\r\n protected observeBlockValue(): void {\r\n // Set up the entry-context subscription only once; it is now invoked both from\r\n // setupContextObservers and (for the document-level case) from handleWorkspaceData.\r\n if (this.#entryObserved) return;\r\n this.#entryObserved = true;\r\n this.consumeContext(UMB_BLOCK_RTE_ENTRY_CONTEXT, (context) => {\r\n if (context != null) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey\r\n ]) => {\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n\r\n // Only subscribe to manager context once contentUdi is known; subscribing with\r\n // an empty key causes the manager to filter contentData to [] on its first emit,\r\n // and the #managerObserved guard then blocks a corrective re-subscription.\r\n if (!this.#managerObserved && this._blockContext.contentUdi) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n\r\n #observeBlockPropertyValue(): void {\r\n this.consumeContext(UMB_BLOCK_RTE_MANAGER_CONTEXT, (context) => {\r\n if (context != null) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.layouts,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([\r\n contents,\r\n settings,\r\n layouts,\r\n exposes,\r\n propertyAlias\r\n ]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n\r\n this.blockRteValue = {\r\n contentData: contents?.filter(x => x.key === this._blockContext.contentUdi) ?? [],\r\n settingsData: settings?.filter(x => x.key === this._blockContext.settingsUdi) ?? [],\r\n expose: exposes?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? [],\r\n layout: {\r\n ['Umbraco.RichText']: layouts?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? []\r\n }\r\n };\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewRichTextMarkup(\r\n JSON.stringify(this.blockRteValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n culture: this._blockContext.culture\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getRteStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n}\r\n\r\nexport default RichTextPreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: RichTextPreviewCustomView;\r\n }\r\n}\r\n","/**\r\n * Concurrency-limited request queue for block preview API calls.\r\n *\r\n * When a page has many blocks, all preview elements fire API requests\r\n * simultaneously after their debounce timers expire. This overwhelms\r\n * the server and can cause empty or malformed responses.\r\n *\r\n * Inspired by the CMS `UmbManagementApiItemDataCache.scheduleBatchedFetch`\r\n * pattern, this queue limits concurrent in-flight requests so the server\r\n * processes a manageable number at a time.\r\n */\r\nexport class BlockPreviewRequestQueue {\r\n #maxConcurrent: number;\r\n #activeCount = 0;\r\n #queue: Array<() => void> = [];\r\n\r\n constructor(maxConcurrent: number = 3) {\r\n this.#maxConcurrent = maxConcurrent;\r\n }\r\n\r\n /**\r\n * Enqueue a task to run with concurrency limiting.\r\n * If fewer than `maxConcurrent` tasks are active, the task runs immediately.\r\n * Otherwise it waits until a slot is available.\r\n */\r\n async enqueue(task: () => Promise): Promise {\r\n if (this.#activeCount >= this.#maxConcurrent) {\r\n await new Promise((resolve) => {\r\n this.#queue.push(resolve);\r\n });\r\n }\r\n\r\n this.#activeCount++;\r\n try {\r\n return await task();\r\n } finally {\r\n this.#activeCount--;\r\n if (this.#queue.length > 0) {\r\n const next = this.#queue.shift()!;\r\n next();\r\n }\r\n }\r\n }\r\n}\r\n","import { UmbControllerBase } from \"@umbraco-cms/backoffice/class-api\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\nimport { UmbStringState } from \"@umbraco-cms/backoffice/observable-api\";\r\nimport { BlockPreviewRequestQueue } from \"./block-preview-request-queue\";\r\n\r\nexport class BlockPreviewContext extends UmbControllerBase {\r\n\r\n #requestQueue = new BlockPreviewRequestQueue(3);\r\n #stylesheetCache = new Map>();\r\n\r\n /** Shared concurrency-limited queue for preview API requests. */\r\n get requestQueue(): BlockPreviewRequestQueue {\r\n return this.#requestQueue;\r\n }\r\n\r\n // Node key cache used as a fallback when a preview cannot reach its content\r\n // workspace directly (e.g. when nested inside another block, whose workspace\r\n // context shadows the document workspace under the shared 'UmbWorkspaceContext'\r\n // alias).\r\n #unique = new UmbStringState('');\r\n #documentTypeUnique = new UmbStringState('');\r\n\r\n constructor(host: UmbControllerHost) {\r\n super(host);\r\n }\r\n\r\n getUnique(): string {\r\n return this.#unique.getValue();\r\n }\r\n\r\n async setUnique(unique: string) {\r\n if (unique !== '') {\r\n this.#unique.setValue(unique);\r\n }\r\n }\r\n\r\n getDocumentTypeUnique(): string {\r\n return this.#documentTypeUnique.getValue();\r\n }\r\n\r\n async setDocumentTypeUnique(documentTypeUnique: string) {\r\n if (documentTypeUnique !== '') {\r\n this.#documentTypeUnique.setValue(documentTypeUnique);\r\n }\r\n }\r\n\r\n getOrCreateStylesheet(href: string): Promise {\r\n const cached = this.#stylesheetCache.get(href);\r\n if (cached) return cached;\r\n\r\n const promise = fetch(href)\r\n .then(response => response.text())\r\n .then(css => {\r\n const sheet = new CSSStyleSheet();\r\n sheet.replaceSync(css);\r\n return sheet;\r\n });\r\n this.#stylesheetCache.set(href, promise);\r\n return promise;\r\n }\r\n\r\n}\r\n\r\nexport default BlockPreviewContext;\r\n","// ManifestGlobalContext is only available in extension-registry, not extension-api\r\nimport { ManifestGlobalContext } from \"@umbraco-cms/backoffice/extension-registry\";\r\n\r\nconst contexts: Array = [\r\n {\r\n type: 'globalContext',\r\n alias: 'BlockPreview.Context',\r\n name: 'BlockPreview Context',\r\n js: () => import('./block-preview.context.ts')\r\n }\r\n]\r\n\r\nexport const manifests = contexts;\r\n","import type { ManifestLocalization } from '@umbraco-cms/backoffice/localization';\r\n\r\nconst localizations: Array = [\r\n {\r\n type: 'localization',\r\n alias: 'BlockPreview.Localization.En',\r\n name: 'BlockPreview English Localization',\r\n meta: {\r\n culture: 'en',\r\n },\r\n js: () => import('./en.ts'),\r\n },\r\n];\r\n\r\nexport const manifests = localizations;\r\n","import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';\r\nimport { ManifestBlockEditorCustomView } from '@umbraco-cms/backoffice/block-custom-view';\r\nimport { UmbEntryPointOnInit } from '@umbraco-cms/backoffice/extension-api';\r\n\r\nimport { client } from './api/index.ts';\r\nimport { BlockGridPreviewCustomView, BlockListPreviewCustomView, BlockSinglePreviewCustomView, RichTextPreviewCustomView } from './blockEditor';\r\nimport { BLOCK_PREVIEW_CONTEXT } from './context/block-preview.context-token.ts';\r\nimport BlockPreviewContext from './context/block-preview.context.ts';\r\nimport { manifests as contextManifests } from './context/manifests.ts';\r\nimport { manifests as localizationManifests } from './localization/manifests.ts';\r\nimport { SettingsRepository } from './repository';\r\n\r\nexport * from './blockEditor';\r\nexport * from './repository';\r\n\r\nexport const onInit: UmbEntryPointOnInit = async (host, extensionRegistry) => {\r\n\r\n host.consumeContext(UMB_AUTH_CONTEXT, async (authContext) => {\r\n if (!authContext) return;\r\n\r\n const config = authContext.getOpenApiConfiguration();\r\n\r\n client.setConfig({\r\n baseUrl: config?.base ?? \"\",\r\n auth: config?.token ?? undefined,\r\n credentials: config?.credentials ?? \"same-origin\",\r\n });\r\n\r\n client.interceptors.request.use(async (request, _options) => {\r\n const token = await config.token();\r\n request.headers.set('Authorization', `Bearer ${token}`);\r\n return request;\r\n });\r\n\r\n const settingsRepository = new SettingsRepository(host);\r\n const settings = await settingsRepository.getSettings();\r\n\r\n let customViewManifests: ManifestBlockEditorCustomView[] = [];\r\n\r\n if (settings) {\r\n if (settings.blockGrid.enabled) {\r\n let blockGridManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.GridCustomView',\r\n name: 'BlockPreview Grid Custom View',\r\n element: BlockGridPreviewCustomView,\r\n forBlockEditor: 'block-grid'\r\n };\r\n\r\n if (settings.blockGrid.contentTypes?.length !== 0) {\r\n blockGridManifest.forContentTypeAlias = settings.blockGrid.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(blockGridManifest);\r\n }\r\n\r\n if (settings.blockList.enabled) {\r\n let blockListManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.ListCustomView',\r\n name: 'BlockPreview List Custom View',\r\n element: BlockListPreviewCustomView,\r\n forBlockEditor: 'block-list'\r\n };\r\n\r\n if (settings.blockList.contentTypes?.length !== 0) {\r\n blockListManifest.forContentTypeAlias = settings.blockList.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(blockListManifest);\r\n }\r\n\r\n if (settings.singleBlock.enabled) {\r\n let singleBlockManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.SingleBlockCustomView',\r\n name: 'BlockPreview Single Block Custom View',\r\n element: BlockSinglePreviewCustomView,\r\n forBlockEditor: 'block-single'\r\n };\r\n\r\n if (settings.singleBlock.contentTypes?.length !== 0) {\r\n singleBlockManifest.forContentTypeAlias = settings.singleBlock.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(singleBlockManifest);\r\n }\r\n\r\n if (settings.richText.enabled) {\r\n let richTextManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.RichTextCustomView',\r\n name: 'BlockPreview Rich Text Custom View',\r\n element: RichTextPreviewCustomView,\r\n forBlockEditor: 'block-rte'\r\n };\r\n\r\n if (settings.richText.contentTypes?.length !== 0) {\r\n richTextManifest.forContentTypeAlias = settings.richText.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(richTextManifest);\r\n }\r\n }\r\n\r\n extensionRegistry.registerMany([\r\n ...customViewManifests,\r\n ...contextManifests,\r\n ...localizationManifests\r\n ]);\r\n\r\n host.provideContext(BLOCK_PREVIEW_CONTEXT, new BlockPreviewContext(host));\r\n });\r\n};"],"names":["jsonBodySerializer","body","_key","value","createSseClient","onRequest","onSseError","onSseEvent","responseTransformer","responseValidator","sseDefaultRetryDelay","sseMaxRetryAttempts","sseMaxRetryDelay","sseSleepFn","url","options","lastEventId","sleep","ms","resolve","retryDelay","attempt","signal","headers","requestInit","request","response","reader","buffer","abortHandler","done","chunks","chunk","lines","dataLines","eventName","line","parsed","data","parsedJson","rawData","error","backoff","separatorArrayExplode","style","separatorArrayNoExplode","separatorObjectExplode","serializeArrayParam","allowReserved","explode","name","joinedValues","v","separator","serializePrimitiveParam","serializeObjectParam","valueOnly","values","key","PATH_PARAM_RE","defaultPathSerializer","path","_url","matches","match","replaceValue","getUrl","baseUrl","query","querySerializer","pathUrl","search","getValidRequestBody","hasBody","getAuthToken","auth","callback","token","createQuerySerializer","array","object","queryParams","serializedArray","serializedObject","serializedPrimitive","getParseAs","contentType","cleanContent","type","checkForExistence","setAuthParams","security","buildUrl","mergeConfigs","a","b","config","mergeHeaders","headersEntries","entries","mergedHeaders","header","iterator","Interceptors","id","index","fn","createInterceptors","defaultQuerySerializer","defaultHeaders","createConfig","override","createClient","_config","getConfig","setConfig","interceptors","beforeRequest","opts","_fetch","result","parseAs","emptyData","textError","jsonError","finalError","makeMethodFn","method","makeSseFn","init","client","BlockPreviewService","BLOCK_PREVIEW_CONTEXT","UmbContextToken","BlockPreviewBaseElement","UmbLitElement","context","_changedProperties","UMB_PROPERTY_DATASET_CONTEXT","instance","unique","documentTypeUnique","UMB_BLOCK_WORKSPACE_CONTEXT","contentTypeUniques","sheets","href","shadowRoot","requestId","UmbApiError","event","dx","dy","interactiveElements","x","UUIButtonElement","blockPreviewEdit","html","ifDefined","unsafeHTML","nothing","css","__decorateClass","property","val","old","state","PreviewDataSource","#host","host","tryExecute","SettingsDataSource","SettingsRepository","UmbControllerBase","#settingsDataSource","settings","_previewDataSource","_BlockGridPreviewCustomView_instances","observeContentWorkspace_fn","_managerObserved","_layoutResizeTimer","observeBlockPropertyValue_fn","filterLayouts_fn","elementName","BlockGridPreviewCustomView","__privateAdd","__privateSet","buildUpValue","__privateMethod","UMB_BLOCK_GRID_ENTRY_CONTEXT","observeMultiple","contentUdi","settingsUdi","workspaceEditContentPath","contentElementTypeAlias","contentElementTypeKey","areas","layout","layoutAreas","prevColumnSpan","prevRowSpan","prevLayoutAreas","__privateGet","UMB_CONTENT_WORKSPACE_CONTEXT","UMB_BLOCK_GRID_MANAGER_CONTEXT","contents","exposes","propertyAlias","area","customElement","_BlockListPreviewCustomView_instances","BlockListPreviewCustomView","UMB_BLOCK_LIST_ENTRY_CONTEXT","UMB_BLOCK_LIST_MANAGER_CONTEXT","layouts","_BlockSinglePreviewCustomView_instances","BlockSinglePreviewCustomView","UMB_BLOCK_SINGLE_ENTRY_CONTEXT","UMB_BLOCK_SINGLE_MANAGER_CONTEXT","_RichTextPreviewCustomView_instances","observeDocumentWorkspace_fn","_entryObserved","RichTextPreviewCustomView","UMB_BLOCK_RTE_ENTRY_CONTEXT","UMB_DOCUMENT_WORKSPACE_CONTEXT","UMB_BLOCK_RTE_MANAGER_CONTEXT","BlockPreviewRequestQueue","#maxConcurrent","#activeCount","#queue","maxConcurrent","task","BlockPreviewContext","#requestQueue","#stylesheetCache","#unique","UmbStringState","#documentTypeUnique","cached","promise","sheet","contexts","blockPreview_context","manifests","localizations","onInit","extensionRegistry","UMB_AUTH_CONTEXT","authContext","_options","customViewManifests","blockGridManifest","blockListManifest","singleBlockManifest","richTextManifest","contextManifests","localizationManifests"],"mappings":"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"} \ No newline at end of file diff --git a/tests/Umbraco.Community.BlockPreview.AcceptanceTests/tests/DefaultConfig/BlockPreview/block-preview.spec.ts b/tests/Umbraco.Community.BlockPreview.AcceptanceTests/tests/DefaultConfig/BlockPreview/block-preview.spec.ts index 6fda0445..173c8382 100644 --- a/tests/Umbraco.Community.BlockPreview.AcceptanceTests/tests/DefaultConfig/BlockPreview/block-preview.spec.ts +++ b/tests/Umbraco.Community.BlockPreview.AcceptanceTests/tests/DefaultConfig/BlockPreview/block-preview.spec.ts @@ -3,13 +3,19 @@ import { ConstantHelper } from "@umbraco-cms/acceptance-test-helpers"; import { test } from "../../../lib/index"; /** - * Searches shadow DOM recursively for block preview errors. - * Returns an object with the count of preview elements and any error messages found. + * Searches shadow DOM recursively for block preview elements. + * Returns the count of preview elements, the number that rendered actual markup, + * and any error messages found. + * + * `renderedCount` is important: a preview can exist and report no error yet still + * render nothing (empty `_htmlMarkup`). That is the failure mode behind #294/#300, + * where the RTE/list preview stayed blank instead of showing the block. Checking + * only `errors` would not catch it, so we also assert markup was actually rendered. */ -async function getBlockPreviewStatus(page: import("@playwright/test").Page) { - return page.evaluate(() => { - const previewTags = ['block-grid-preview', 'block-list-preview', 'rich-text-preview']; - const results = { previewCount: 0, errors: [] as string[] }; +async function getBlockPreviewStatus(page: import("@playwright/test").Page, tagFilter?: string[]) { + return page.evaluate((filter) => { + const previewTags = filter ?? ['block-grid-preview', 'block-list-preview', 'rich-text-preview']; + const results = { previewCount: 0, renderedCount: 0, errors: [] as string[] }; function search(root: Document | ShadowRoot) { for (const tag of previewTags) { @@ -17,6 +23,11 @@ async function getBlockPreviewStatus(page: import("@playwright/test").Page) { for (const el of elements) { results.previewCount++; if (el.shadowRoot) { + // A rendered preview wraps the server markup in . + const rendered = el.shadowRoot.querySelector('a.block-preview-edit'); + if (rendered && (rendered.textContent?.trim() || rendered.querySelector('*'))) { + results.renderedCount++; + } const errorAlerts = el.shadowRoot.querySelectorAll('.preview-alert-error'); for (const alert of errorAlerts) { results.errors.push(alert.textContent?.trim() ?? ''); @@ -34,7 +45,7 @@ async function getBlockPreviewStatus(page: import("@playwright/test").Page) { search(document); return results; - }); + }, tagFilter); } test.describe("Block Preview", () => { @@ -69,9 +80,10 @@ test.describe("Block Preview", () => { await umbracoUi.content.goToContentWithName('Nested Block Grid Test'); await page.waitForTimeout(1000); - // Assert - Preview elements should be present with no errors + // Assert - Preview elements should be present, rendered, and error-free const status = await getBlockPreviewStatus(page); expect(status.previewCount).toBeGreaterThan(0); + expect(status.renderedCount).toBeGreaterThan(0); expect(status.errors).toEqual([]); }); @@ -85,9 +97,91 @@ test.describe("Block Preview", () => { await umbracoUi.content.goToContentWithName('Block List Test'); await page.waitForTimeout(1000); - // Assert - Preview elements should be present with no errors + // Assert - Preview elements should be present, rendered, and error-free const status = await getBlockPreviewStatus(page); expect(status.previewCount).toBeGreaterThan(0); + expect(status.renderedCount).toBeGreaterThan(0); + expect(status.errors).toEqual([]); + }); + + /* + * Rich Text (Tiptap) Block Preview Tests + * + * Regression coverage for #300 (and the RTE half of #294): RTE blocks embedded in a + * rich text field must render their BlockPreview markup in the backoffice, not stay + * blank (raw ). + * + * The rich text field lives on a `richTextBlock` nested inside the Home Block Grid, so + * the RTE editor (and its embedded block) only mounts when that block's edit modal is + * open. We open it by clicking the grid preview for the block that contains the RTE + * block; its content key is fixed by the test site's uSync data. + */ + const RTE_HOST_BLOCK_KEY = '0d8e8778-175b-4b89-8a6a-ed340ea86934'; + + test("Rich Text block renders embedded block preview @smoke", async ({ umbracoUi, page }) => { + // Arrange + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act - Open Home, then open the richTextBlock (which contains an RTE block) for editing + await umbracoUi.content.goToContentWithName('Home'); + + // Wait for the target grid block's preview to mount in the (nested) shadow DOM. + await page.waitForFunction((key) => { + const find = (root: Document | ShadowRoot): boolean => { + for (const el of root.querySelectorAll('block-grid-preview')) { + const contentKey = (el as any).contentKey ?? (el as any).content?.key; + if (contentKey === key && el.shadowRoot?.querySelector('a.block-preview-edit')) return true; + } + for (const el of root.querySelectorAll('*')) { + const sr = (el as HTMLElement).shadowRoot; + if (sr && find(sr)) return true; + } + return false; + }; + return find(document); + }, RTE_HOST_BLOCK_KEY, { timeout: 30000 }); + + const opened = await page.evaluate((key) => { + const search = (root: Document | ShadowRoot): boolean => { + for (const el of root.querySelectorAll('block-grid-preview')) { + const contentKey = (el as any).contentKey ?? (el as any).content?.key; + if (contentKey === key) { + const anchor = el.shadowRoot?.querySelector('a.block-preview-edit') as HTMLElement | null; + if (anchor) { anchor.click(); return true; } + } + } + for (const el of root.querySelectorAll('*')) { + const sr = (el as HTMLElement).shadowRoot; + if (sr && search(sr)) return true; + } + return false; + }; + return search(document); + }, RTE_HOST_BLOCK_KEY); + + expect(opened, 'Expected to find and open the richTextBlock grid preview').toBe(true); + + // Wait for the RTE preview inside the modal to render its markup (not stay blank). + await page.waitForFunction(() => { + const find = (root: Document | ShadowRoot): boolean => { + for (const el of root.querySelectorAll('rich-text-preview')) { + const anchor = el.shadowRoot?.querySelector('a.block-preview-edit'); + if (anchor && (anchor.textContent?.trim() || anchor.querySelector('*'))) return true; + } + for (const el of root.querySelectorAll('*')) { + const sr = (el as HTMLElement).shadowRoot; + if (sr && find(sr)) return true; + } + return false; + }; + return find(document); + }, { timeout: 30000 }); + + // Assert - The RTE preview must exist AND render markup (not stay blank), with no errors + const status = await getBlockPreviewStatus(page, ['rich-text-preview']); + expect(status.previewCount).toBeGreaterThan(0); + expect(status.renderedCount).toBeGreaterThan(0); expect(status.errors).toEqual([]); }); });