@data-fair/frame 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/d-frame.min.js +3 -3
- package/lib/DFrameElement.d.ts +2 -2
- package/lib/DFrameElement.js +20 -7
- package/package.json +1 -1
package/dist/d-frame.min.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
var H=Object.defineProperty;var M=(d,c,p)=>c in d?H(d,c,{enumerable:!0,configurable:!0,writable:!0,value:p}):d[c]=p;var o=(d,c,p)=>M(d,typeof c!="symbol"?c+"":c,p);(function(){"use strict";function d(e){return e[0]==="df-child"&&e[1]==="init"}function c(e){return e[0]==="df-child"&&e[1]==="height"}function p(e){return e[0]==="df-child"&&e[1]==="stateChange"}function b(e){return e[0]==="df-child"&&e[1]==="custom"}function y(e){return e[0]==="df-child"&&e[1]==="notif"}function w(e){return e.endsWith("/")?e:e===""?"/":e.slice(0,e.lastIndexOf("/")+1)}function
|
|
1
|
+
var H=Object.defineProperty;var M=(d,c,p)=>c in d?H(d,c,{enumerable:!0,configurable:!0,writable:!0,value:p}):d[c]=p;var o=(d,c,p)=>M(d,typeof c!="symbol"?c+"":c,p);(function(){"use strict";function d(e){return e[0]==="df-child"&&e[1]==="init"}function c(e){return e[0]==="df-child"&&e[1]==="height"}function p(e){return e[0]==="df-child"&&e[1]==="stateChange"}function b(e){return e[0]==="df-child"&&e[1]==="custom"}function y(e){return e[0]==="df-child"&&e[1]==="notif"}function w(e){return e.endsWith("/")?e:e===""?"/":e.slice(0,e.lastIndexOf("/")+1)}function A(e,a){if(a.origin!==e.origin)return a.href;if(a.pathname===e.pathname)return"";const t=w(e.pathname);return a.pathname.startsWith(t)?a.pathname.replace(t,"./"):a.pathname}const E=e=>e.replace(/[-[\]/{}()*+?.\\^$|]/g,"\\$&");function S(e){const a=[];for(const t of e.split(",")){const[s="*",i]=t.split(":"),r="^"+E(s).replace(/\\\*/g,"(.*)")+"$";a.push({regexp:new RegExp(r),append:i})}return a}function v(e,a,t,s){if(!t&&!s)return e.href;const i=new URL(a);if(t&&i.searchParams.forEach((r,u)=>{for(const n of t){if(n.append&&!u.startsWith(n.append)||u===s)continue;const h=n.append?u.replace(n.append,""):u;if(h.match(n.regexp)){e.searchParams.set(h,r);break}}}),s!==null){const r=i.searchParams.get(s);r&&(e.pathname=new URL(r,e).pathname)}return e.href}function P(e,a,t,s,i){const r=new URL(t),u=new URL(a);if(s&&(r.searchParams.forEach((n,h)=>{for(const l of s){if(l.append&&!h.startsWith(l.append))continue;const f=l.append?h.replace(l.append,""):h;if(f.match(l.regexp)){u.searchParams.get(f)===null&&r.searchParams.delete(h);break}}}),u.searchParams.forEach((n,h)=>{for(const l of s){if(!h.match(l.regexp)||(e==null?void 0:e.searchParams.get(h))===n)continue;const f=l.append?l.append+h:h;r.searchParams.set(f,n);break}})),i!==null&&e){const n=A(e,u);n?r.searchParams.set(i,n):r.searchParams.delete(i)}return r}function R(e){return e.vIframe===!0&&e.uiNotification!==void 0}function g(e){if(typeof e=="string")return{type:"default",title:e};if(e.error&&!e.errorMsg){const a=e.error.response&&(e.error.response.data||e.error.response.status)||e.error.message||e.error;return e.msg?{type:"error",title:e.msg,detail:a}:{type:"error",title:a}}return e.type==="error"?{type:e.clientError?"warning":"error",title:e.msg,detail:e.errorMsg}:{type:e.type??"default",title:e.msg}}class z{stateChange(a,t){a==="replace"&&window.history.replaceState(null,"",t),a==="push"&&window.history.pushState(null,"",t)}}const m=document.createElement("template");m.innerHTML=`<style>
|
|
2
2
|
:host {
|
|
3
3
|
display: block;
|
|
4
4
|
}
|
|
5
5
|
iframe.d-frame-iframe {
|
|
6
6
|
display: block;
|
|
7
7
|
width: 100%;
|
|
8
|
+
height: 100%;
|
|
8
9
|
border: none;
|
|
9
|
-
max-height: 100%;
|
|
10
10
|
}
|
|
11
|
-
</style><slot name="loader"></slot><iframe class="d-frame-iframe" frameborder="0">`;class
|
|
11
|
+
</style><slot name="loader"></slot><iframe class="d-frame-iframe" frameborder="0">`;class C extends HTMLElement{constructor(){super();o(this,"adapter");o(this,"connected",!1);o(this,"initialSrc");o(this,"srcUrl");o(this,"parsedSyncParams");o(this,"iframeElement");o(this,"slotElement");o(this,"width");o(this,"aspectRatioHeight");o(this,"resizedHeight");const t=m.content.cloneNode(!0);this.slotElement=t.childNodes[1],this.resize!=="yes"&&(this.slotElement.style.display="none"),this.iframeElement=t.childNodes[2],this.iframeElement.setAttribute("scrolling",this.resize==="yes"?"no":"auto"),this.iframeElement.setAttribute("loading",this.lazy?"lazy":"eager"),this.attachShadow({mode:"open"}).appendChild(t),new ResizeObserver(r=>{(this.width===void 0||Math.abs(this.width-r[0].contentRect.width)>2)&&(this.width=r[0].contentRect.width,this.updateAspectRatioHeight())}).observe(this),this.adapter=new z,window.addEventListener("message",r=>this.onMessage(r))}get debug(){return this.hasAttribute("debug")}set debug(t){t?this.setAttribute("debug",""):this.removeAttribute("debug")}get lazy(){return this.hasAttribute("lazy")}set lazy(t){t?this.setAttribute("lazy",""):this.removeAttribute("lazy")}get src(){return this.getAttribute("src")}set src(t){this.setAttribute("src",t)}get aspectRatio(){const t=this.getAttribute("aspect-ratio");return t===""?"auto":t}set aspectRatio(t){t!==null?this.setAttribute("aspect-ratio",t):this.removeAttribute("aspect-ratio")}get height(){return this.getAttribute("height")}set height(t){t?this.setAttribute("height",t):this.removeAttribute("height")}set resize(t){this.setAttribute("resize",t)}get resize(){const t=this.getAttribute("resize");return t===null?"auto":t===""?"yes":t}get syncParams(){return this.getAttribute("sync-params")}set syncParams(t){t!==null?this.setAttribute("sync-params",t):this.removeAttribute("sync-params")}get syncPath(){const t=this.getAttribute("sync-path");return t===null?null:t||"p"}set syncPath(t){t!==null?this.setAttribute("sync-params",t):this.removeAttribute("sync-params")}get stateChangeEvents(){return this.hasAttribute("state-change-events")}set stateChangeEvents(t){t?this.setAttribute("state-change-events",""):this.removeAttribute("state-change-events")}get actualAspectRatio(){return this.aspectRatio!=="auto"?Number(this.aspectRatio):!this.width||this.width<500?1:this.width<800?4/3:this.width<1200?16/9:21/9}onMessage(t){var s;if(t.source===((s=this.iframeElement)==null?void 0:s.contentWindow)){const i=t.data;if(this.log("debug","received message from child",i),Array.isArray(t.data)){if(d(i)&&(this.postMessageToChild(["df-parent","init",{debug:this.debug,resize:this.resize,syncParams:this.syncParams!==null,syncPath:this.syncPath!==null,stateChangeEvents:this.stateChangeEvents}]),this.init()),c(i)&&(this.resizedHeight=i[2],this.updateStyle()),p(i)){if(this.parsedSyncParams||this.syncPath){const r=P(this.srcUrl,i[3],window.location.href,this.parsedSyncParams,this.syncPath);r.href!==window.location.href&&this.adapter.stateChange(i[2],r)}this.stateChangeEvents&&this.dispatchEvent(new CustomEvent("state-change",{detail:[i[2],i[3]]}))}b(i)&&this.dispatchEvent(new CustomEvent("message",{detail:i[2]})),y(i)&&this.dispatchEvent(new CustomEvent("notif",{detail:i[2]}))}else R(i)&&(console.log("v-iframe notification",i.uiNotification,g(i.uiNotification)),this.dispatchEvent(new CustomEvent("notif",{detail:g(i.uiNotification)})))}}init(){this.initialSrc=this.src}postMessageToChild(t){var s,i;this.log("debug","send message to child",t),(i=(s=this.iframeElement)==null?void 0:s.contentWindow)==null||i.postMessage(t)}updateSrc(){if(!this.connected)return;this.srcUrl=new URL(this.src.startsWith("/")?window.location.origin+this.src:this.src);const t=v(this.srcUrl,window.location.href,this.parsedSyncParams,this.syncPath);this.initialSrc?this.postMessageToChild(["df-parent","updateSrc",t]):this.iframeElement.setAttribute("src",t)}updateStyle(){let t="";(this.resize==="yes"||this.resize==="auto"&&this.resizedHeight)&&(this.iframeElement.setAttribute("scrolling","no"),this.resizedHeight?(this.slotElement.style.display="none",t+=`height:${this.resizedHeight}px;`):this.height?(this.slotElement.style.display="none",t+=`height:${this.height};`):this.aspectRatio!=="auto"&&this.aspectRatio!==null?(this.slotElement.style.display="none",t+=`height:${this.aspectRatioHeight}px;`):(this.slotElement.style.display="block",t+="height:0;")),(this.resize==="no"||this.resize==="auto"&&!this.resizedHeight)&&(this.iframeElement.setAttribute("scrolling","auto"),this.height?t+=`height:${this.height};`:this.aspectRatio!==null&&(t+=`height:${this.aspectRatioHeight}px;`)),this.iframeElement.setAttribute("style",t)}updateAspectRatioHeight(){this.width&&this.aspectRatio!==null&&(this.resizedHeight||this.height||(this.aspectRatioHeight=Math.ceil(this.width/this.actualAspectRatio),this.updateStyle()))}log(t,...s){t==="debug"&&!this.debug||(t==="debug"&&console.debug("d-frame",...s),t==="info"&&console.info("d-frame",...s))}connectedCallback(){if(!this.hasAttribute("src"))throw new Error("src is a required attribute");this.log("debug","connected"),this.connected=!0,this.adapter.onStateChange&&this.adapter.onStateChange(()=>{this.updateSrc()}),this.syncParams!==null&&(this.parsedSyncParams=S(this.syncParams||"*")),this.updateStyle(),this.updateSrc(),console.log(this),console.log(this.hasAttribute("onStateChange"))}static get observedAttributes(){return["src","aspect-ratio","height","sync-params","sync-path"]}attributeChangedCallback(t,s,i){this.log("debug","attribute change",t,s,i),t==="aspect-ratio"&&this.updateAspectRatioHeight(),t==="src"&&this.updateSrc(),t==="height"&&this.updateStyle(),t==="sync-params"&&this.updateSrc(),t==="sync-path"&&this.updateSrc()}}customElements.define("d-frame",C)})();
|
|
12
12
|
//# sourceMappingURL=d-frame.min.js.map
|
package/lib/DFrameElement.d.ts
CHANGED
|
@@ -10,8 +10,8 @@ export default class DFrameElement extends HTMLElement {
|
|
|
10
10
|
set lazy(value: boolean);
|
|
11
11
|
get src(): string;
|
|
12
12
|
set src(value: string);
|
|
13
|
-
get aspectRatio(): string;
|
|
14
|
-
set aspectRatio(value: string);
|
|
13
|
+
get aspectRatio(): string | null;
|
|
14
|
+
set aspectRatio(value: string | null);
|
|
15
15
|
get height(): string | null;
|
|
16
16
|
set height(value: string | null);
|
|
17
17
|
set resize(value: "auto" | "yes" | "no");
|
package/lib/DFrameElement.js
CHANGED
|
@@ -18,8 +18,8 @@ template.innerHTML = `<style>
|
|
|
18
18
|
iframe.d-frame-iframe {
|
|
19
19
|
display: block;
|
|
20
20
|
width: 100%;
|
|
21
|
+
height: 100%;
|
|
21
22
|
border: none;
|
|
22
|
-
max-height: 100%;
|
|
23
23
|
}
|
|
24
24
|
</style><slot name="loader"></slot><iframe class="d-frame-iframe" frameborder="0">`;
|
|
25
25
|
export default class DFrameElement extends HTMLElement {
|
|
@@ -39,8 +39,18 @@ export default class DFrameElement extends HTMLElement {
|
|
|
39
39
|
}
|
|
40
40
|
get src() { return this.getAttribute('src'); }
|
|
41
41
|
set src(value) { this.setAttribute('src', value); }
|
|
42
|
-
get aspectRatio() {
|
|
43
|
-
|
|
42
|
+
get aspectRatio() {
|
|
43
|
+
const value = this.getAttribute('aspect-ratio');
|
|
44
|
+
if (value === '')
|
|
45
|
+
return 'auto';
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
set aspectRatio(value) {
|
|
49
|
+
if (value !== null)
|
|
50
|
+
this.setAttribute('aspect-ratio', value);
|
|
51
|
+
else
|
|
52
|
+
this.removeAttribute('aspect-ratio');
|
|
53
|
+
}
|
|
44
54
|
get height() { return this.getAttribute('height'); }
|
|
45
55
|
set height(value) {
|
|
46
56
|
if (value)
|
|
@@ -117,7 +127,8 @@ export default class DFrameElement extends HTMLElement {
|
|
|
117
127
|
const shadowRoot = this.attachShadow({ mode: 'open' });
|
|
118
128
|
shadowRoot.appendChild(root);
|
|
119
129
|
const resizeObserver = new ResizeObserver((entries) => {
|
|
120
|
-
|
|
130
|
+
// make this callback insensitive to micro changes
|
|
131
|
+
if (this.width === undefined || Math.abs(this.width - entries[0].contentRect.width) > 2) {
|
|
121
132
|
this.width = entries[0].contentRect.width;
|
|
122
133
|
this.updateAspectRatioHeight();
|
|
123
134
|
}
|
|
@@ -205,7 +216,7 @@ export default class DFrameElement extends HTMLElement {
|
|
|
205
216
|
this.slotElement.style.display = 'none';
|
|
206
217
|
style += `height:${this.height};`;
|
|
207
218
|
}
|
|
208
|
-
else if (this.aspectRatio !== 'auto') {
|
|
219
|
+
else if (this.aspectRatio !== 'auto' && this.aspectRatio !== null) {
|
|
209
220
|
this.slotElement.style.display = 'none';
|
|
210
221
|
style += `height:${this.aspectRatioHeight}px;`;
|
|
211
222
|
}
|
|
@@ -220,7 +231,7 @@ export default class DFrameElement extends HTMLElement {
|
|
|
220
231
|
if (this.height) {
|
|
221
232
|
style += `height:${this.height};`;
|
|
222
233
|
}
|
|
223
|
-
else {
|
|
234
|
+
else if (this.aspectRatio !== null) {
|
|
224
235
|
style += `height:${this.aspectRatioHeight}px;`;
|
|
225
236
|
}
|
|
226
237
|
}
|
|
@@ -229,11 +240,13 @@ export default class DFrameElement extends HTMLElement {
|
|
|
229
240
|
updateAspectRatioHeight() {
|
|
230
241
|
if (!this.width)
|
|
231
242
|
return;
|
|
243
|
+
if (this.aspectRatio === null)
|
|
244
|
+
return;
|
|
232
245
|
if (this.resizedHeight)
|
|
233
246
|
return;
|
|
234
247
|
if (this.height)
|
|
235
248
|
return;
|
|
236
|
-
this.aspectRatioHeight = this.width / this.actualAspectRatio;
|
|
249
|
+
this.aspectRatioHeight = Math.ceil(this.width / this.actualAspectRatio);
|
|
237
250
|
this.updateStyle();
|
|
238
251
|
}
|
|
239
252
|
log(level, ...args) {
|