@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 +43 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.mjs +231 -97
- package/package.json +2 -1
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,
|
|
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
|
|
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
|
|
2
|
-
import { openBlock as
|
|
3
|
-
let
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
apiKey:
|
|
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:
|
|
8
|
+
headers: l || {}
|
|
9
9
|
});
|
|
10
|
-
},
|
|
10
|
+
}, k = () => oe, ke = {
|
|
11
11
|
name: "FlyoBlock"
|
|
12
|
-
},
|
|
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(
|
|
21
|
-
return (n,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
}),
|
|
29
|
+
}), Ae = {
|
|
29
30
|
name: "FlyoPage"
|
|
30
|
-
},
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
}),
|
|
51
|
+
}), u = Se({
|
|
72
52
|
isLoading: null,
|
|
73
53
|
response: null,
|
|
74
54
|
error: null
|
|
75
|
-
}),
|
|
76
|
-
const
|
|
55
|
+
}), _e = () => {
|
|
56
|
+
const t = async () => {
|
|
77
57
|
try {
|
|
78
|
-
|
|
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
|
-
|
|
60
|
+
u.isLoading = !1, u.response = null, u.error = JSON.parse(JSON.stringify(n));
|
|
81
61
|
}
|
|
82
62
|
return {
|
|
83
|
-
response:
|
|
84
|
-
error:
|
|
63
|
+
response: u.response,
|
|
64
|
+
error: u.error
|
|
85
65
|
};
|
|
86
66
|
};
|
|
87
67
|
return {
|
|
88
|
-
...
|
|
89
|
-
fetch:
|
|
68
|
+
...Oe(u),
|
|
69
|
+
fetch: t
|
|
90
70
|
};
|
|
91
|
-
},
|
|
92
|
-
const n =
|
|
71
|
+
}, qe = (t) => {
|
|
72
|
+
const n = d(!1), l = d(null), i = d(null);
|
|
93
73
|
return {
|
|
94
74
|
isLoading: n,
|
|
95
|
-
response:
|
|
96
|
-
error:
|
|
75
|
+
response: l,
|
|
76
|
+
error: i,
|
|
97
77
|
fetch: async () => {
|
|
98
78
|
try {
|
|
99
|
-
|
|
100
|
-
} catch (
|
|
101
|
-
n.value = !1,
|
|
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:
|
|
105
|
-
error: i
|
|
84
|
+
response: y(l),
|
|
85
|
+
error: y(i)
|
|
106
86
|
};
|
|
107
87
|
}
|
|
108
88
|
};
|
|
109
|
-
}
|
|
110
|
-
|
|
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:
|
|
114
|
-
error:
|
|
245
|
+
response: l,
|
|
246
|
+
error: i,
|
|
115
247
|
fetch: async () => {
|
|
116
248
|
try {
|
|
117
|
-
|
|
118
|
-
} catch (
|
|
119
|
-
n.value = !1,
|
|
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:
|
|
123
|
-
error: i
|
|
254
|
+
response: y(l),
|
|
255
|
+
error: y(i)
|
|
124
256
|
};
|
|
125
257
|
}
|
|
126
258
|
};
|
|
127
|
-
},
|
|
128
|
-
const
|
|
259
|
+
}, Ue = () => {
|
|
260
|
+
const t = d(!1), n = d(null), l = d(null);
|
|
129
261
|
return {
|
|
130
|
-
isLoading:
|
|
262
|
+
isLoading: t,
|
|
131
263
|
response: n,
|
|
132
|
-
error:
|
|
264
|
+
error: l,
|
|
133
265
|
fetch: async () => {
|
|
134
266
|
try {
|
|
135
|
-
|
|
136
|
-
} catch (
|
|
137
|
-
|
|
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:
|
|
141
|
-
error:
|
|
272
|
+
response: y(n),
|
|
273
|
+
error: y(l)
|
|
142
274
|
};
|
|
143
275
|
}
|
|
144
276
|
};
|
|
145
|
-
},
|
|
146
|
-
install(
|
|
147
|
-
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
|
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
|
}
|