@flyo/nitro-vue3 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -182,7 +182,49 @@ Every composable returns the same reactive shape:
182
182
 
183
183
  ## Live-edit support
184
184
 
185
- When your site is embedded in the Flyo preview iframe, `FlyoPage` automatically listens for `pageRefresh` messages and emits `update:page` so your component can reactively update without a full reload. Enable this by passing `liveEdit: true` to the plugin options.
185
+ When your site is embedded in the Flyo preview iframe, you can enable a full live-editing experience by passing `liveEdit: true` to the plugin options and using the `useFlyoLiveEdit` composable together with the `editable` helper.
186
+
187
+ ### `useFlyoLiveEdit()`
188
+
189
+ Call this composable **once** in your root layout or `App.vue`. It activates the bridge features from `@flyo/nitro-js-bridge` when `liveEdit` is enabled:
190
+
191
+ - **`reload()`** — reloads the page when Flyo sends a `pageRefresh` message.
192
+ - **`scrollTo()`** — scrolls to a specific block when Flyo sends a `scrollTo` message.
193
+ - **`highlightAndClick()`** — adds hover highlight and click-to-edit on every element with a `data-flyo-uid` attribute. A `MutationObserver` automatically wires up elements that are added after the initial render.
194
+
195
+ The composable is a no-op when `liveEdit` is `false`, so it is safe to include unconditionally.
196
+
197
+ ```vue
198
+ <!-- App.vue or your root layout component -->
199
+ <script setup>
200
+ import { useFlyoLiveEdit } from '@flyo/nitro-vue3'
201
+
202
+ useFlyoLiveEdit()
203
+ </script>
204
+
205
+ <template>
206
+ <router-view />
207
+ </template>
208
+ ```
209
+
210
+ ### `editable(block)`
211
+
212
+ Returns a `{ 'data-flyo-uid': block.uid }` attribute object for a given block, or an empty object if the block has no uid. Use `v-bind` to spread it onto the root element of your block component so `useFlyoLiveEdit` can discover it.
213
+
214
+ ```vue
215
+ <script setup>
216
+ import { editable } from '@flyo/nitro-vue3'
217
+
218
+ defineProps({ block: Object })
219
+ </script>
220
+
221
+ <template>
222
+ <section v-bind="editable(block)" class="bg-gray-200 p-8 rounded-lg text-center">
223
+ <h2 class="text-3xl font-bold mb-4">{{ block?.content?.title }}</h2>
224
+ <p class="text-lg mb-6">{{ block?.content?.teaser }}</p>
225
+ </section>
226
+ </template>
227
+ ```
186
228
 
187
229
  ---
188
230
 
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const u=require("@flyo/nitro-typescript"),e=require("vue");let m=null;const F=({apiToken:n,apiBasePath:t,defaultHeaders:o})=>{m=new u.Configuration({apiKey:n,...t&&{basePath:t},headers:o||{}})},f=()=>m,N={name:"FlyoBlock"},y=Object.assign(N,{props:{item:{type:Object,default:()=>{}}},setup(n){return(t,o)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(n.item.component),{config:n.item.config,content:n.item.content,items:n.item.items,slots:n.item.slots},null,8,["config","content","items","slots"]))}}),J={name:"FlyoPage"},d=Object.assign(J,{props:{page:{type:[Object,Boolean],default:!1}},emits:["update:page"],setup(n,{emit:t}){const o=n,s=t,{liveEdit:a,liveEditOrigin:i}=e.inject("flyo"),p=r=>{const c=r.parent||r.opener;return r.self===c?!1:r.parent||r.opener},O=r=>{a&&process.client&&p(window)&&p(window).postMessage({action:"openEdit",data:JSON.parse(JSON.stringify({page:o.page,item:r}))},i)};return process.client&&p(window)&&window.addEventListener("message",r=>{if(r.origin!==i){console.log(`Message from ${r.origin} blocked. Expected ${i}.`);return}const c=r.data;c.action==="pageRefresh"&&s("update:page",c.data)}),(r,c)=>{const S=e.resolveComponent("FlyoBlock");return e.openBlock(),e.createElementBlock("div",null,[n.page?e.renderSlot(r.$slots,"default",e.normalizeProps(e.mergeProps({key:0},n.page)),()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.page.json,g=>(e.openBlock(),e.createBlock(S,{key:g.uid,item:g,onClick:()=>O(g)},null,8,["item","onClick"]))),128))]):e.createCommentVNode("",!0)])}}}),l=e.reactive({isLoading:null,response:null,error:null}),k=()=>{const n=async()=>{try{l.error=null,l.isLoading=!0,l.response=JSON.parse(JSON.stringify(await new u.ConfigApi(f()).config())),l.isLoading=!1}catch(t){l.isLoading=!1,l.response=null,l.error=JSON.parse(JSON.stringify(t))}return{response:l.response,error:l.error}};return{...e.toRefs(l),fetch:n}},h=n=>{const t=e.ref(!1),o=e.ref(null),s=e.ref(null);return{isLoading:t,response:o,error:s,fetch:async()=>{try{s.value=null,t.value=!0,o.value=JSON.parse(JSON.stringify(await new u.EntitiesApi(f()).entityByUniqueid({uniqueid:n}))),t.value=!1}catch(i){t.value=!1,o.value=null,s.value=JSON.parse(JSON.stringify(i))}return{response:e.unref(o),error:e.unref(s)}}}},E=n=>{const t=e.ref(!1),o=e.ref(null),s=e.ref(null);return{isLoading:t,response:o,error:s,fetch:async()=>{try{s.value=null,t.value=!0,o.value=JSON.parse(JSON.stringify(await new u.PagesApi(f()).page({slug:n}))),t.value=!1}catch(i){t.value=!1,o.value=null,s.value=JSON.parse(JSON.stringify(i))}return{response:e.unref(o),error:e.unref(s)}}}},B=()=>{const n=e.ref(!1),t=e.ref(null),o=e.ref(null);return{isLoading:n,response:t,error:o,fetch:async()=>{try{o.value=null,n.value=!0,t.value=JSON.parse(JSON.stringify(await new u.SitemapApi(f()).sitemap())),n.value=!1}catch(a){n.value=!1,t.value=null,o.value=JSON.parse(JSON.stringify(a))}return{response:e.unref(t),error:e.unref(o)}}}},v={install(n,t){F(t),n.component(y.name,y),n.component(d.name,d),n.provide("flyo",{liveEdit:t.liveEdit,liveEditOrigin:t.liveEditOrigin})}};exports.Block=y;exports.FlyoVue=v;exports.Page=d;exports.default=v;exports.getFlyoConfig=f;exports.useFlyoConfig=k;exports.useFlyoEntity=h;exports.useFlyoPage=E;exports.useFlyoSitemap=B;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const x=require("@flyo/nitro-typescript"),o=require("vue");let ee=null;const de=({apiToken:t,apiBasePath:n,defaultHeaders:s})=>{ee=new x.Configuration({apiKey:t,...n&&{basePath:n},headers:s||{}})},M=()=>ee,ce={name:"FlyoBlock"},q=Object.assign(ce,{props:{item:{type:Object,default:()=>{}}},setup(t){return(n,s)=>(o.openBlock(),o.createBlock(o.resolveDynamicComponent(t.item.component),{block:t.item,config:t.item.config,content:t.item.content,items:t.item.items,slots:t.item.slots},null,8,["block","config","content","items","slots"]))}}),fe={name:"FlyoPage"},H=Object.assign(fe,{props:{page:{type:[Object,Boolean],default:!1}},setup(t){return(n,s)=>{const r=o.resolveComponent("FlyoBlock");return o.openBlock(),o.createElementBlock("div",null,[t.page?o.renderSlot(n.$slots,"default",o.normalizeProps(o.mergeProps({key:0},t.page)),()=>[(o.openBlock(!0),o.createElementBlock(o.Fragment,null,o.renderList(t.page.json,e=>(o.openBlock(),o.createBlock(r,{key:e.uid,item:e},null,8,["item"]))),128))]):o.createCommentVNode("",!0)])}}}),d=o.reactive({isLoading:null,response:null,error:null}),ye=()=>{const t=async()=>{try{d.error=null,d.isLoading=!0,d.response=JSON.parse(JSON.stringify(await new x.ConfigApi(M()).config())),d.isLoading=!1}catch(n){d.isLoading=!1,d.response=null,d.error=JSON.parse(JSON.stringify(n))}return{response:d.response,error:d.error}};return{...o.toRefs(d),fetch:t}},pe=t=>{const n=o.ref(!1),s=o.ref(null),r=o.ref(null);return{isLoading:n,response:s,error:r,fetch:async()=>{try{r.value=null,n.value=!0,s.value=JSON.parse(JSON.stringify(await new x.EntitiesApi(M()).entityByUniqueid({uniqueid:t}))),n.value=!1}catch(l){n.value=!1,s.value=null,r.value=JSON.parse(JSON.stringify(l))}return{response:o.unref(s),error:o.unref(r)}}}};function J(){return typeof window>"u"?!1:window!==window.top}function me(){return typeof window>"u"?!1:J()?window.parent:window}function ve(t){var n=me();n&&n.postMessage({action:"openEdit",data:JSON.parse(JSON.stringify({item:{uid:t}}))},"https://flyo.cloud")}function he(){typeof window>"u"||J()&&window.addEventListener("message",t=>{var n;((n=t.data)==null?void 0:n.action)==="pageRefresh"&&window.location.reload()})}function ge(){typeof window>"u"||J()&&window.addEventListener("message",t=>{var n,s,r,e;if(((n=t.data)==null?void 0:n.action)==="scrollTo"){const l=(e=(r=(s=t.data)==null?void 0:s.data)==null?void 0:r.item)==null?void 0:e.uid;if(!l)return;const a=document.querySelector(`[data-flyo-uid="${CSS.escape(l)}"]`);a&&a.scrollIntoView({behavior:"smooth",block:"start"})}})}function we(t,n){const s=()=>ve(t);if(!J()||!n)return s;const r=n,e=document.createElement("button");e.type="button",e.setAttribute("aria-label","Edit block"),e.style.position="fixed",e.style.top="0px",e.style.left="0px",e.style.zIndex="9999",e.style.width="44px",e.style.height="44px",e.style.display="none",e.style.alignItems="center",e.style.justifyContent="center",e.style.border="0px solid #000",e.style.borderRadius="9999px",e.style.boxSizing="border-box",e.style.cursor="pointer",e.style.background="#FFD466",e.innerHTML='<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25z" fill="#111"/><path d="M20.71 7.04a1 1 0 0 0 0-1.41l-2.34-2.34a1 1 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z" fill="#111"/></svg>';const l=document.createElement("div");l.style.position="fixed",l.style.top="0px",l.style.left="0px",l.style.zIndex="9998",l.style.display="none",l.style.pointerEvents="none",l.style.background="transparent",l.style.border="none",e.addEventListener("click",s),document.body.appendChild(l),document.body.appendChild(e);const a=44,y=6,S=6,u=6,O=10,ne=180,N=()=>window.innerWidth||document.documentElement.clientWidth,F=()=>window.innerHeight||document.documentElement.clientHeight,oe=i=>!(i.bottom<0||i.right<0||i.top>F()||i.left>N()||i.width===0&&i.height===0),B=(i,f)=>i>=u&&f>=u&&i+a<=N()-u&&f+a<=F()-u,I=(i,f)=>({x:Math.max(u,Math.min(i,N()-a-u)),y:Math.max(u,Math.min(f,F()-a-u))});function A(){const i=r.getBoundingClientRect(),f=i.width<a||i.height<a,w=Math.round(i.left),E=Math.round(i.top)-a-S,j=Math.round(i.left)+y,P=Math.round(i.top)+y;let b,L;if(f&&B(w,E))b=w,L=E;else if(B(j,P))b=j,L=P;else if(B(w,E))b=w,L=E;else{const R=I(w,E),_=I(j,P),ae=Math.abs(R.x-i.left)+Math.abs(R.y-i.top),ue=Math.abs(_.x-i.left)+Math.abs(_.y-i.top);({x:b,y:L}=ae<=ue?R:_)}e.style.left=`${b}px`,e.style.top=`${L}px`;const Y=Math.max(u,Math.round(i.left)-O),Z=Math.max(u,Math.round(i.top)-O),ie=Math.min(N()-u,Math.round(i.right)+O),re=Math.min(F()-u,Math.round(i.bottom)+O);l.style.left=`${Y}px`,l.style.top=`${Z}px`,l.style.width=`${Math.max(0,ie-Y)}px`,l.style.height=`${Math.max(0,re-Z)}px`}let p=!1,m=!1,v=!1,C=!1,h=null;const k=()=>{h!==null&&(clearTimeout(h),h=null)},$=()=>{k();try{const i=r.getBoundingClientRect();if(!oe(i)){g(!0);return}A(),e.style.display="flex",l.style.display="block",le()}catch{g(!0)}},g=(i=!1)=>{if(i){k(),e.style.display="none",l.style.display="none",T();return}k(),h=window.setTimeout(()=>{!p&&!m&&!v&&(e.style.display="none",l.style.display="none",T()),h=null},ne)},z=()=>{e.style.display!=="none"&&A()},D=z;let c=null;const V=window.ResizeObserver,le=()=>{C||(C=!0,window.addEventListener("scroll",z,!0),window.addEventListener("resize",D),typeof V=="function"&&(c=new V(()=>{e.style.display!=="none"&&A()}),c==null||c.observe(r)))},T=()=>{if(C){C=!1,window.removeEventListener("scroll",z,!0),window.removeEventListener("resize",D);try{c==null||c.disconnect()}catch{}c=null}},U=()=>{p=!0,$()},W=()=>{p=!1,!m&&!v&&g()},K=()=>{m=!0,$()},G=()=>{m=!1,!p&&!v&&g()},Q=()=>{v=!0,$()},X=()=>{v=!1,!p&&!m&&g()};r.addEventListener("mouseenter",U),r.addEventListener("mouseleave",W),e.addEventListener("mouseenter",K),e.addEventListener("mouseleave",G),l.addEventListener("mouseenter",Q),l.addEventListener("mouseleave",X),e.addEventListener("click",s);function se(){k(),T(),e.removeEventListener("click",s),r.removeEventListener("mouseenter",U),r.removeEventListener("mouseleave",W),e.removeEventListener("mouseenter",K),e.removeEventListener("mouseleave",G),l.removeEventListener("mouseenter",Q),l.removeEventListener("mouseleave",X),e.parentElement===document.body&&document.body.removeChild(e),l.parentElement===document.body&&document.body.removeChild(l)}return se}const Ee=t=>typeof(t==null?void 0:t.uid)=="string"&&t.uid.trim()!==""?{"data-flyo-uid":t.uid}:{},be=()=>{const{liveEdit:t}=o.inject("flyo");if(!t)return;let n=null;const s=[],r=()=>{s.forEach(e=>e()),s.length=0,document.querySelectorAll("[data-flyo-uid]").forEach(e=>{const l=e.getAttribute("data-flyo-uid");if(l&&e instanceof HTMLElement){const a=we(l,e);typeof a=="function"&&s.push(a)}})};o.onMounted(()=>{he(),ge(),r(),n=new MutationObserver(e=>{e.some(a=>Array.from(a.addedNodes).some(y=>{if(y.nodeType===Node.ELEMENT_NODE){const S=y;return S.hasAttribute("data-flyo-uid")||S.querySelector("[data-flyo-uid]")}return!1}))&&r()}),n.observe(document.body,{childList:!0,subtree:!0})}),o.onUnmounted(()=>{n&&n.disconnect(),s.forEach(e=>e()),s.length=0})},Le=t=>{const n=o.ref(!1),s=o.ref(null),r=o.ref(null);return{isLoading:n,response:s,error:r,fetch:async()=>{try{r.value=null,n.value=!0,s.value=JSON.parse(JSON.stringify(await new x.PagesApi(M()).page({slug:t}))),n.value=!1}catch(l){n.value=!1,s.value=null,r.value=JSON.parse(JSON.stringify(l))}return{response:o.unref(s),error:o.unref(r)}}}},xe=()=>{const t=o.ref(!1),n=o.ref(null),s=o.ref(null);return{isLoading:t,response:n,error:s,fetch:async()=>{try{s.value=null,t.value=!0,n.value=JSON.parse(JSON.stringify(await new x.SitemapApi(M()).sitemap())),t.value=!1}catch(e){t.value=!1,n.value=null,s.value=JSON.parse(JSON.stringify(e))}return{response:o.unref(n),error:o.unref(s)}}}},te={install(t,n){de(n),t.component(q.name,q),t.component(H.name,H),t.provide("flyo",{liveEdit:n.liveEdit,liveEditOrigin:n.liveEditOrigin})}};exports.Block=q;exports.FlyoVue=te;exports.Page=H;exports.default=te;exports.editable=Ee;exports.getFlyoConfig=M;exports.useFlyoConfig=ye;exports.useFlyoEntity=pe;exports.useFlyoLiveEdit=be;exports.useFlyoPage=Le;exports.useFlyoSitemap=xe;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { App, Component, Ref } from 'vue'
2
2
  import type {
3
+ Block as NitroBlock,
3
4
  Configuration,
4
5
  ConfigApi,
5
6
  EntitiesApi,
@@ -66,7 +67,10 @@ export { FlyoVue, Block, Page }
66
67
 
67
68
  export function getFlyoConfig(): Configuration | null
68
69
 
70
+ export function editable(block: NitroBlock): { 'data-flyo-uid'?: string }
71
+
69
72
  export function useFlyoConfig(): UseFlyoConfigReturn
73
+ export function useFlyoLiveEdit(): void
70
74
  export function useFlyoPage(slug: string): UseFlyoPageReturn
71
75
  export function useFlyoEntity(uniqueid: string): UseFlyoEntityReturn
72
76
  export function useFlyoSitemap(): UseFlyoSitemapReturn
package/dist/index.mjs CHANGED
@@ -1,15 +1,15 @@
1
- import { Configuration as h, ConfigApi as E, EntitiesApi as F, PagesApi as k, SitemapApi as w } from "@flyo/nitro-typescript";
2
- import { openBlock as f, createBlock as O, resolveDynamicComponent as C, inject as L, resolveComponent as B, createElementBlock as y, renderSlot as b, normalizeProps as j, mergeProps as P, Fragment as A, renderList as $, createCommentVNode as _, reactive as x, toRefs as M, ref as a, unref as i } from "vue";
3
- let S = null;
4
- const R = ({ apiToken: e, apiBasePath: n, defaultHeaders: t }) => {
5
- S = new h({
6
- apiKey: e,
1
+ import { Configuration as fe, ConfigApi as ye, EntitiesApi as me, PagesApi as pe, SitemapApi as ve } from "@flyo/nitro-typescript";
2
+ import { openBlock as F, createBlock as ne, resolveDynamicComponent as he, resolveComponent as ge, createElementBlock as Z, renderSlot as we, normalizeProps as Ee, mergeProps as be, Fragment as Le, renderList as xe, createCommentVNode as Me, reactive as Se, toRefs as Oe, ref as d, unref as y, inject as Ne, onMounted as Ce, onUnmounted as Je } from "vue";
3
+ let oe = null;
4
+ const Fe = ({ apiToken: t, apiBasePath: n, defaultHeaders: l }) => {
5
+ oe = new fe({
6
+ apiKey: t,
7
7
  ...n && { basePath: n },
8
- headers: t || {}
8
+ headers: l || {}
9
9
  });
10
- }, p = () => S, W = {
10
+ }, k = () => oe, ke = {
11
11
  name: "FlyoBlock"
12
- }, d = /* @__PURE__ */ Object.assign(W, {
12
+ }, ee = /* @__PURE__ */ Object.assign(ke, {
13
13
  props: {
14
14
  item: {
15
15
  type: Object,
@@ -17,147 +17,281 @@ const R = ({ apiToken: e, apiBasePath: n, defaultHeaders: t }) => {
17
17
  }
18
18
  }
19
19
  },
20
- setup(e) {
21
- return (n, t) => (f(), O(C(e.item.component), {
22
- config: e.item.config,
23
- content: e.item.content,
24
- items: e.item.items,
25
- slots: e.item.slots
26
- }, null, 8, ["config", "content", "items", "slots"]));
20
+ setup(t) {
21
+ return (n, l) => (F(), ne(he(t.item.component), {
22
+ block: t.item,
23
+ config: t.item.config,
24
+ content: t.item.content,
25
+ items: t.item.items,
26
+ slots: t.item.slots
27
+ }, null, 8, ["block", "config", "content", "items", "slots"]));
27
28
  }
28
- }), q = {
29
+ }), Ae = {
29
30
  name: "FlyoPage"
30
- }, v = /* @__PURE__ */ Object.assign(q, {
31
+ }, te = /* @__PURE__ */ Object.assign(Ae, {
31
32
  props: {
32
33
  page: {
33
34
  type: [Object, Boolean],
34
35
  default: !1
35
36
  }
36
37
  },
37
- emits: ["update:page"],
38
- setup(e, { emit: n }) {
39
- const t = e, o = n, { liveEdit: c, liveEditOrigin: l } = L("flyo"), g = (s) => {
40
- const u = s.parent || s.opener;
41
- return s.self === u ? !1 : s.parent || s.opener;
42
- }, N = (s) => {
43
- c && process.client && g(window) && g(window).postMessage({
44
- action: "openEdit",
45
- data: JSON.parse(JSON.stringify({
46
- page: t.page,
47
- item: s
48
- }))
49
- }, l);
50
- };
51
- return process.client && g(window) && window.addEventListener("message", (s) => {
52
- if (s.origin !== l) {
53
- console.log(`Message from ${s.origin} blocked. Expected ${l}.`);
54
- return;
55
- }
56
- const u = s.data;
57
- u.action === "pageRefresh" && o("update:page", u.data);
58
- }), (s, u) => {
59
- const J = B("FlyoBlock");
60
- return f(), y("div", null, [
61
- e.page ? b(s.$slots, "default", j(P({ key: 0 }, e.page)), () => [
62
- (f(!0), y(A, null, $(e.page.json, (m) => (f(), O(J, {
63
- key: m.uid,
64
- item: m,
65
- onClick: () => N(m)
66
- }, null, 8, ["item", "onClick"]))), 128))
67
- ]) : _("", !0)
38
+ setup(t) {
39
+ return (n, l) => {
40
+ const i = ge("FlyoBlock");
41
+ return F(), Z("div", null, [
42
+ t.page ? we(n.$slots, "default", Ee(be({ key: 0 }, t.page)), () => [
43
+ (F(!0), Z(Le, null, xe(t.page.json, (e) => (F(), ne(i, {
44
+ key: e.uid,
45
+ item: e
46
+ }, null, 8, ["item"]))), 128))
47
+ ]) : Me("", !0)
68
48
  ]);
69
49
  };
70
50
  }
71
- }), r = x({
51
+ }), u = Se({
72
52
  isLoading: null,
73
53
  response: null,
74
54
  error: null
75
- }), K = () => {
76
- const e = async () => {
55
+ }), _e = () => {
56
+ const t = async () => {
77
57
  try {
78
- r.error = null, r.isLoading = !0, r.response = JSON.parse(JSON.stringify(await new E(p()).config())), r.isLoading = !1;
58
+ u.error = null, u.isLoading = !0, u.response = JSON.parse(JSON.stringify(await new ye(k()).config())), u.isLoading = !1;
79
59
  } catch (n) {
80
- r.isLoading = !1, r.response = null, r.error = JSON.parse(JSON.stringify(n));
60
+ u.isLoading = !1, u.response = null, u.error = JSON.parse(JSON.stringify(n));
81
61
  }
82
62
  return {
83
- response: r.response,
84
- error: r.error
63
+ response: u.response,
64
+ error: u.error
85
65
  };
86
66
  };
87
67
  return {
88
- ...M(r),
89
- fetch: e
68
+ ...Oe(u),
69
+ fetch: t
90
70
  };
91
- }, U = (e) => {
92
- const n = a(!1), t = a(null), o = a(null);
71
+ }, qe = (t) => {
72
+ const n = d(!1), l = d(null), i = d(null);
93
73
  return {
94
74
  isLoading: n,
95
- response: t,
96
- error: o,
75
+ response: l,
76
+ error: i,
97
77
  fetch: async () => {
98
78
  try {
99
- o.value = null, n.value = !0, t.value = JSON.parse(JSON.stringify(await new F(p()).entityByUniqueid({ uniqueid: e }))), n.value = !1;
100
- } catch (l) {
101
- n.value = !1, t.value = null, o.value = JSON.parse(JSON.stringify(l));
79
+ i.value = null, n.value = !0, l.value = JSON.parse(JSON.stringify(await new me(k()).entityByUniqueid({ uniqueid: t }))), n.value = !1;
80
+ } catch (o) {
81
+ n.value = !1, l.value = null, i.value = JSON.parse(JSON.stringify(o));
102
82
  }
103
83
  return {
104
- response: i(t),
105
- error: i(o)
84
+ response: y(l),
85
+ error: y(i)
106
86
  };
107
87
  }
108
88
  };
109
- }, G = (e) => {
110
- const n = a(!1), t = a(null), o = a(null);
89
+ };
90
+ function A() {
91
+ return typeof window > "u" ? !1 : window !== window.top;
92
+ }
93
+ function Be() {
94
+ return typeof window > "u" ? !1 : A() ? window.parent : window;
95
+ }
96
+ function $e(t) {
97
+ var n = Be();
98
+ n && n.postMessage({
99
+ action: "openEdit",
100
+ data: JSON.parse(JSON.stringify({ item: { uid: t } }))
101
+ }, "https://flyo.cloud");
102
+ }
103
+ function ze() {
104
+ typeof window > "u" || A() && window.addEventListener("message", (t) => {
105
+ var n;
106
+ ((n = t.data) == null ? void 0 : n.action) === "pageRefresh" && window.location.reload();
107
+ });
108
+ }
109
+ function Re() {
110
+ typeof window > "u" || A() && window.addEventListener("message", (t) => {
111
+ var n, l, i, e;
112
+ if (((n = t.data) == null ? void 0 : n.action) === "scrollTo") {
113
+ const o = (e = (i = (l = t.data) == null ? void 0 : l.data) == null ? void 0 : i.item) == null ? void 0 : e.uid;
114
+ if (!o)
115
+ return;
116
+ const r = document.querySelector(`[data-flyo-uid="${CSS.escape(o)}"]`);
117
+ r && r.scrollIntoView({ behavior: "smooth", block: "start" });
118
+ }
119
+ });
120
+ }
121
+ function je(t, n) {
122
+ const l = () => $e(t);
123
+ if (!A() || !n)
124
+ return l;
125
+ const i = n, e = document.createElement("button");
126
+ e.type = "button", e.setAttribute("aria-label", "Edit block"), e.style.position = "fixed", e.style.top = "0px", e.style.left = "0px", e.style.zIndex = "9999", e.style.width = "44px", e.style.height = "44px", e.style.display = "none", e.style.alignItems = "center", e.style.justifyContent = "center", e.style.border = "0px solid #000", e.style.borderRadius = "9999px", e.style.boxSizing = "border-box", e.style.cursor = "pointer", e.style.background = "#FFD466", e.innerHTML = '<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25z" fill="#111"/><path d="M20.71 7.04a1 1 0 0 0 0-1.41l-2.34-2.34a1 1 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z" fill="#111"/></svg>';
127
+ const o = document.createElement("div");
128
+ o.style.position = "fixed", o.style.top = "0px", o.style.left = "0px", o.style.zIndex = "9998", o.style.display = "none", o.style.pointerEvents = "none", o.style.background = "transparent", o.style.border = "none", e.addEventListener("click", l), document.body.appendChild(o), document.body.appendChild(e);
129
+ const r = 44, m = 6, M = 6, a = 6, S = 10, le = 180, O = () => window.innerWidth || document.documentElement.clientWidth, N = () => window.innerHeight || document.documentElement.clientHeight, se = (s) => !(s.bottom < 0 || s.right < 0 || s.top > N() || s.left > O() || s.width === 0 && s.height === 0), B = (s, f) => s >= a && f >= a && s + r <= O() - a && f + r <= N() - a, H = (s, f) => ({
130
+ x: Math.max(a, Math.min(s, O() - r - a)),
131
+ y: Math.max(a, Math.min(f, N() - r - a))
132
+ });
133
+ function $() {
134
+ const s = i.getBoundingClientRect(), f = s.width < r || s.height < r, E = Math.round(s.left), b = Math.round(s.top) - r - M, T = Math.round(s.left) + m, P = Math.round(s.top) + m;
135
+ let L, x;
136
+ if (f && B(E, b))
137
+ L = E, x = b;
138
+ else if (B(T, P))
139
+ L = T, x = P;
140
+ else if (B(E, b))
141
+ L = E, x = b;
142
+ else {
143
+ const _ = H(E, b), q = H(T, P), de = Math.abs(_.x - s.left) + Math.abs(_.y - s.top), ce = Math.abs(q.x - s.left) + Math.abs(q.y - s.top);
144
+ ({ x: L, y: x } = de <= ce ? _ : q);
145
+ }
146
+ e.style.left = `${L}px`, e.style.top = `${x}px`;
147
+ const X = Math.max(a, Math.round(s.left) - S), Y = Math.max(a, Math.round(s.top) - S), ae = Math.min(O() - a, Math.round(s.right) + S), ue = Math.min(N() - a, Math.round(s.bottom) + S);
148
+ o.style.left = `${X}px`, o.style.top = `${Y}px`, o.style.width = `${Math.max(0, ae - X)}px`, o.style.height = `${Math.max(0, ue - Y)}px`;
149
+ }
150
+ let p = !1, v = !1, h = !1, C = !1, g = null;
151
+ const J = () => {
152
+ g !== null && (clearTimeout(g), g = null);
153
+ }, z = () => {
154
+ J();
155
+ try {
156
+ const s = i.getBoundingClientRect();
157
+ if (!se(s)) {
158
+ w(!0);
159
+ return;
160
+ }
161
+ $(), e.style.display = "flex", o.style.display = "block", ie();
162
+ } catch {
163
+ w(!0);
164
+ }
165
+ }, w = (s = !1) => {
166
+ if (s) {
167
+ J(), e.style.display = "none", o.style.display = "none", j();
168
+ return;
169
+ }
170
+ J(), g = window.setTimeout(() => {
171
+ !p && !v && !h && (e.style.display = "none", o.style.display = "none", j()), g = null;
172
+ }, le);
173
+ }, R = () => {
174
+ e.style.display !== "none" && $();
175
+ }, I = R;
176
+ let c = null;
177
+ const D = window.ResizeObserver, ie = () => {
178
+ C || (C = !0, window.addEventListener("scroll", R, !0), window.addEventListener("resize", I), typeof D == "function" && (c = new D(() => {
179
+ e.style.display !== "none" && $();
180
+ }), c == null || c.observe(i)));
181
+ }, j = () => {
182
+ if (C) {
183
+ C = !1, window.removeEventListener("scroll", R, !0), window.removeEventListener("resize", I);
184
+ try {
185
+ c == null || c.disconnect();
186
+ } catch {
187
+ }
188
+ c = null;
189
+ }
190
+ }, U = () => {
191
+ p = !0, z();
192
+ }, V = () => {
193
+ p = !1, !v && !h && w();
194
+ }, W = () => {
195
+ v = !0, z();
196
+ }, K = () => {
197
+ v = !1, !p && !h && w();
198
+ }, G = () => {
199
+ h = !0, z();
200
+ }, Q = () => {
201
+ h = !1, !p && !v && w();
202
+ };
203
+ i.addEventListener("mouseenter", U), i.addEventListener("mouseleave", V), e.addEventListener("mouseenter", W), e.addEventListener("mouseleave", K), o.addEventListener("mouseenter", G), o.addEventListener("mouseleave", Q), e.addEventListener("click", l);
204
+ function re() {
205
+ J(), j(), e.removeEventListener("click", l), i.removeEventListener("mouseenter", U), i.removeEventListener("mouseleave", V), e.removeEventListener("mouseenter", W), e.removeEventListener("mouseleave", K), o.removeEventListener("mouseenter", G), o.removeEventListener("mouseleave", Q), e.parentElement === document.body && document.body.removeChild(e), o.parentElement === document.body && document.body.removeChild(o);
206
+ }
207
+ return re;
208
+ }
209
+ const He = (t) => typeof (t == null ? void 0 : t.uid) == "string" && t.uid.trim() !== "" ? { "data-flyo-uid": t.uid } : {}, Ie = () => {
210
+ const { liveEdit: t } = Ne("flyo");
211
+ if (!t)
212
+ return;
213
+ let n = null;
214
+ const l = [], i = () => {
215
+ l.forEach((e) => e()), l.length = 0, document.querySelectorAll("[data-flyo-uid]").forEach((e) => {
216
+ const o = e.getAttribute("data-flyo-uid");
217
+ if (o && e instanceof HTMLElement) {
218
+ const r = je(o, e);
219
+ typeof r == "function" && l.push(r);
220
+ }
221
+ });
222
+ };
223
+ Ce(() => {
224
+ ze(), Re(), i(), n = new MutationObserver((e) => {
225
+ e.some(
226
+ (r) => Array.from(r.addedNodes).some((m) => {
227
+ if (m.nodeType === Node.ELEMENT_NODE) {
228
+ const M = m;
229
+ return M.hasAttribute("data-flyo-uid") || M.querySelector("[data-flyo-uid]");
230
+ }
231
+ return !1;
232
+ })
233
+ ) && i();
234
+ }), n.observe(document.body, {
235
+ childList: !0,
236
+ subtree: !0
237
+ });
238
+ }), Je(() => {
239
+ n && n.disconnect(), l.forEach((e) => e()), l.length = 0;
240
+ });
241
+ }, De = (t) => {
242
+ const n = d(!1), l = d(null), i = d(null);
111
243
  return {
112
244
  isLoading: n,
113
- response: t,
114
- error: o,
245
+ response: l,
246
+ error: i,
115
247
  fetch: async () => {
116
248
  try {
117
- o.value = null, n.value = !0, t.value = JSON.parse(JSON.stringify(await new k(p()).page({ slug: e }))), n.value = !1;
118
- } catch (l) {
119
- n.value = !1, t.value = null, o.value = JSON.parse(JSON.stringify(l));
249
+ i.value = null, n.value = !0, l.value = JSON.parse(JSON.stringify(await new pe(k()).page({ slug: t }))), n.value = !1;
250
+ } catch (o) {
251
+ n.value = !1, l.value = null, i.value = JSON.parse(JSON.stringify(o));
120
252
  }
121
253
  return {
122
- response: i(t),
123
- error: i(o)
254
+ response: y(l),
255
+ error: y(i)
124
256
  };
125
257
  }
126
258
  };
127
- }, H = () => {
128
- const e = a(!1), n = a(null), t = a(null);
259
+ }, Ue = () => {
260
+ const t = d(!1), n = d(null), l = d(null);
129
261
  return {
130
- isLoading: e,
262
+ isLoading: t,
131
263
  response: n,
132
- error: t,
264
+ error: l,
133
265
  fetch: async () => {
134
266
  try {
135
- t.value = null, e.value = !0, n.value = JSON.parse(JSON.stringify(await new w(p()).sitemap())), e.value = !1;
136
- } catch (c) {
137
- e.value = !1, n.value = null, t.value = JSON.parse(JSON.stringify(c));
267
+ l.value = null, t.value = !0, n.value = JSON.parse(JSON.stringify(await new ve(k()).sitemap())), t.value = !1;
268
+ } catch (e) {
269
+ t.value = !1, n.value = null, l.value = JSON.parse(JSON.stringify(e));
138
270
  }
139
271
  return {
140
- response: i(n),
141
- error: i(t)
272
+ response: y(n),
273
+ error: y(l)
142
274
  };
143
275
  }
144
276
  };
145
- }, I = {
146
- install(e, n) {
147
- R(n), e.component(d.name, d), e.component(v.name, v), e.provide("flyo", {
277
+ }, Ve = {
278
+ install(t, n) {
279
+ Fe(n), t.component(ee.name, ee), t.component(te.name, te), t.provide("flyo", {
148
280
  liveEdit: n.liveEdit,
149
281
  liveEditOrigin: n.liveEditOrigin
150
282
  });
151
283
  }
152
284
  };
153
285
  export {
154
- d as Block,
155
- I as FlyoVue,
156
- v as Page,
157
- I as default,
158
- p as getFlyoConfig,
159
- K as useFlyoConfig,
160
- U as useFlyoEntity,
161
- G as useFlyoPage,
162
- H as useFlyoSitemap
286
+ ee as Block,
287
+ Ve as FlyoVue,
288
+ te as Page,
289
+ Ve as default,
290
+ He as editable,
291
+ k as getFlyoConfig,
292
+ _e as useFlyoConfig,
293
+ qe as useFlyoEntity,
294
+ Ie as useFlyoLiveEdit,
295
+ De as useFlyoPage,
296
+ Ue as useFlyoSitemap
163
297
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flyo/nitro-vue3",
3
- "version": "2.1.0",
3
+ "version": "2.2.1",
4
4
  "description": "Vue3 Components for Flyo Nitro",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
@@ -42,6 +42,7 @@
42
42
  "vitest": "^1.0.0"
43
43
  },
44
44
  "dependencies": {
45
+ "@flyo/nitro-js-bridge": "^1.3.0",
45
46
  "@flyo/nitro-typescript": "^1.4.0"
46
47
  }
47
48
  }