@bravophone/webphone 0.2.0 → 0.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.
@@ -1,26 +1,26 @@
1
- (function(B,N){typeof exports=="object"&&typeof module!="undefined"?module.exports=N():typeof define=="function"&&define.amd?define(N):(B=typeof globalThis!="undefined"?globalThis:B||self,B.Bravophone=N())})(this,function(){"use strict";const B='stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"',N=`<svg viewBox="0 0 24 24" fill="none" ${B} aria-hidden="true">
1
+ (function(W,N){typeof exports=="object"&&typeof module!="undefined"?module.exports=N():typeof define=="function"&&define.amd?define(N):(W=typeof globalThis!="undefined"?globalThis:W||self,W.Bravophone=N())})(this,function(){"use strict";const W='stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"',N=`<svg viewBox="0 0 24 24" fill="none" ${W} aria-hidden="true">
2
2
  <path class="bp-i-body" d="M15.6 12.8a11 11 0 0 1-4.4-4.4l1-1a1.6 1.6 0 0 0 .3-1.7c-.2-.7-.4-1.4-.5-2.2A1.6 1.6 0 0 0 10.4 2H7.9a1.6 1.6 0 0 0-1.6 1.8 15.8 15.8 0 0 0 2.4 6.9 15.6 15.6 0 0 0 4.8 4.8 15.8 15.8 0 0 0 6.9 2.4 1.6 1.6 0 0 0 1.7-1.6v-2.5a1.6 1.6 0 0 0-1.4-1.6c-.8-.1-1.5-.3-2.2-.5a1.6 1.6 0 0 0-1.7.4z"/>
3
3
  <path class="bp-i-wave bp-i-wave-1" d="M14.5 6.2a4 4 0 0 1 3.3 3.3"/>
4
4
  <path class="bp-i-wave bp-i-wave-2" d="M14.1 2.6a7.6 7.6 0 0 1 7.3 7.3"/>
5
- </svg>`,me=`<svg viewBox="0 0 24 24" fill="none" ${B} aria-hidden="true">
5
+ </svg>`,xe=`<svg viewBox="0 0 24 24" fill="none" ${W} aria-hidden="true">
6
6
  <path class="bp-i-bar bp-i-bar-1" d="M4 10v4"/>
7
7
  <path class="bp-i-bar bp-i-bar-2" d="M8.7 6.5v11"/>
8
8
  <path class="bp-i-bar bp-i-bar-3" d="M12 3.5v17"/>
9
9
  <path class="bp-i-bar bp-i-bar-4" d="M15.3 6.5v11"/>
10
10
  <path class="bp-i-bar bp-i-bar-5" d="M20 10v4"/>
11
- </svg>`,xe=`<svg viewBox="0 0 24 24" fill="none" ${B} aria-hidden="true">
11
+ </svg>`,we=`<svg viewBox="0 0 24 24" fill="none" ${W} aria-hidden="true">
12
12
  <path class="bp-i-body" d="M4 13v-1a8 8 0 0 1 16 0v1"/>
13
13
  <path class="bp-i-body" d="M20 14.5v2a3.5 3.5 0 0 1-3.5 3.5H13"/>
14
14
  <rect class="bp-i-cup" x="1.6" y="12.6" width="4.4" height="6.4" rx="1.8"/>
15
15
  <rect class="bp-i-cup" x="18" y="12.6" width="4.4" height="6.4" rx="1.8"/>
16
- </svg>`,we=`<svg viewBox="0 0 24 24" fill="none" ${B} aria-hidden="true">
16
+ </svg>`,ye=`<svg viewBox="0 0 24 24" fill="none" ${W} aria-hidden="true">
17
17
  <path class="bp-i-body" d="M21 11.5a8.4 8.4 0 0 1-9 8.4 9 9 0 0 1-2.9-.5L3 21.5l1.5-4.6A8.4 8.4 0 0 1 12 3.1a8.4 8.4 0 0 1 9 8.4z"/>
18
18
  <path class="bp-i-hand" d="M14.6 14.4a6.5 6.5 0 0 1-3.2-3.2l.7-.7a1 1 0 0 0 .2-1.1 6 6 0 0 1-.3-1.2 1 1 0 0 0-1-.8H9.6a1 1 0 0 0-1 1.1 9.6 9.6 0 0 0 4.8 7.2 1 1 0 0 0 1.4-.9v-1.2a1 1 0 0 0-.8-1z"/>
19
- </svg>`,ye=`<svg viewBox="0 0 10 16" width="10" height="16" fill="currentColor" aria-hidden="true">
19
+ </svg>`,ve=`<svg viewBox="0 0 10 16" width="10" height="16" fill="currentColor" aria-hidden="true">
20
20
  <circle cx="2.6" cy="2.6" r="1.35"/><circle cx="7.4" cy="2.6" r="1.35"/>
21
21
  <circle cx="2.6" cy="8" r="1.35"/><circle cx="7.4" cy="8" r="1.35"/>
22
22
  <circle cx="2.6" cy="13.4" r="1.35"/><circle cx="7.4" cy="13.4" r="1.35"/>
23
- </svg>`,Y={"phone-waves":N,waveform:me,headset:xe,"chat-phone":we},te="phone-waves",ve=`
23
+ </svg>`,G={"phone-waves":N,waveform:xe,headset:we,"chat-phone":ye},te="phone-waves",ke=`
24
24
  :host { all: initial; }
25
25
  * { box-sizing: border-box; }
26
26
 
@@ -152,6 +152,21 @@
152
152
  /* Uma janela docada nao se redimensiona pelas bordas coladas na viewport. */
153
153
  .bp-root.bp-docked { border-radius: 0; }
154
154
 
155
+ /* ---- destaque: "a janela esta aqui" ----
156
+ Disparado ao clicar na aba com o webphone ja aberto. Um halo que cresce e
157
+ some, no lugar de um shake: em interface, tremer significa erro ou acao
158
+ negada (senha errada), e aqui nada deu errado. */
159
+ @keyframes bp-attention {
160
+ 0% { box-shadow: 0 12px 40px rgba(0,0,0,.45), 0 0 0 0 rgba(124,108,245,.55); }
161
+ 55% { box-shadow: 0 12px 40px rgba(0,0,0,.45), 0 0 0 12px rgba(124,108,245,0); }
162
+ 100% { box-shadow: 0 12px 40px rgba(0,0,0,.45), 0 0 0 0 rgba(124,108,245,0); }
163
+ }
164
+ .bp-root.bp-attention { animation: bp-attention .85s ease-out 2; }
165
+
166
+ @media (prefers-reduced-motion: reduce) {
167
+ .bp-root.bp-attention { animation: none; outline: 2px solid #7c6cf5; outline-offset: 2px; }
168
+ }
169
+
155
170
  /* ---- previa de encaixe (docking) ----
156
171
  Fantasma que mostra onde a janela vai parar antes de soltar. */
157
172
  .bp-preview {
@@ -169,7 +184,9 @@
169
184
  .bp-launcher {
170
185
  position: fixed;
171
186
  top: 50%;
172
- z-index: 2147482999;
187
+ /* Acima da janela (2147483000): a aba nunca some, e uma janela docada na
188
+ mesma borda a esconderia. */
189
+ z-index: 2147483001;
173
190
  display: flex;
174
191
  align-items: center;
175
192
  gap: 0;
@@ -337,12 +354,18 @@
337
354
  .bp-launcher-icon { transition: none; }
338
355
  }
339
356
 
340
- `,oe="bravophone:widget:geometry",q=28,J=32;function ke(e){try{const i=localStorage.getItem(oe);if(!i)return{...e};const a=JSON.parse(i);return a.dock?{...e,...a,...P(a.dock,a)}:{...e,...a}}catch(i){return{...e}}}function V(e){try{localStorage.setItem(oe,JSON.stringify(e))}catch(i){}}function se(e){return{minWidth:e.minWidth,minHeight:e.minHeight,maxWidth:Math.max(e.minWidth,Math.min(e.maxWidth,window.innerWidth)),maxHeight:Math.max(e.minHeight,Math.min(e.maxHeight,window.innerHeight))}}function R(e){const i=Math.max(0,window.innerWidth-e.width),a=Math.max(0,window.innerHeight-40);return{...e,x:Math.min(Math.max(0,e.x),i),y:Math.min(Math.max(0,e.y),a)}}function P(e,i){const a=window.innerWidth,o=window.innerHeight,n=Math.round(a/2),s=Math.round(o/2),u=Math.min(i.width,a);switch(e){case"left":return{x:0,y:0,width:u,height:o};case"right":return{x:a-u,y:0,width:u,height:o};case"left-half":return{x:0,y:0,width:n,height:o};case"right-half":return{x:a-n,y:0,width:n,height:o};case"top":return{x:i.x,y:0,width:u,height:s};case"bottom":return{x:i.x,y:o-s,width:u,height:s};case"top-half":return{x:0,y:0,width:a,height:s};case"bottom-half":return{x:0,y:o-s,width:a,height:s};case"max":return{x:0,y:0,width:a,height:o};default:return{x:i.x,y:i.y,width:i.width,height:i.height}}}function Me(e,i,a){const o=window.innerWidth,n=window.innerHeight,s=e<=q,u=e>=o-q,m=i<=q,t=i>=n-q;return(m||t)&&s?"left-half":(m||t)&&u?"right-half":m?a||"max":t?"bottom-half":s?"left":u?"right":null}function ze({root:e,handle:i,handles:a,preview:o,geometry:n,limits:s,topDock:u,onChange:m}){let t={...n},g=null,p="",d=null,l=null,w=null,y=null;const M=()=>{e.style.left=`${t.x}px`,e.style.top=`${t.y}px`,e.style.width=`${t.width}px`,e.style.height=`${t.height}px`,e.classList.toggle("bp-docked",!!t.dock),m==null||m(t)},W=r=>{if(o){if(!r){o.hidden=!0;return}o.hidden=!1,o.style.left=`${r.x}px`,o.style.top=`${r.y}px`,o.style.width=`${r.width}px`,o.style.height=`${r.height}px`}},T=(r,b)=>{const h=se(s);let{x:v,y:z,width:L,height:H}=d;p.includes("e")&&(L=d.width+r),p.includes("w")&&(L=d.width-r),p.includes("s")&&(H=d.height+b),p.includes("n")&&(H=d.height-b),L=Math.min(h.maxWidth,Math.max(h.minWidth,L)),H=Math.min(h.maxHeight,Math.max(h.minHeight,H)),p.includes("w")&&(v=d.x+(d.width-L)),p.includes("n")&&(z=d.y+(d.height-H)),p.includes("e")&&Math.abs(v+L-window.innerWidth)<=J&&(L=window.innerWidth-v),p.includes("w")&&Math.abs(v)<=J&&(L+=v,v=0),p.includes("s")&&Math.abs(z+H-window.innerHeight)<=J&&(H=window.innerHeight-z),p.includes("n")&&Math.abs(z)<=J&&(H+=z,z=0),t={...t,x:v,y:z,width:L,height:H,dock:null},M()},_=(r,b,h,v)=>{if(t.dock){const z=y||{width:s.width,height:s.height},L=l.x/Math.max(1,t.width);t={...t,...z,dock:null},l={x:Math.round(z.width*L),y:Math.min(l.y,32)},d={...d,x:h-l.x,y:v-l.y,px:d.px+r,py:d.py+b},r=0,b=0}t=R({...t,x:d.x+r,y:d.y+b}),M(),w=Me(h,v,u),W(w?P(w,t):null)},K=()=>{w&&(y=y||{width:t.width,height:t.height},t={...t,...P(w,t),dock:w},M())},Z=(r,b)=>h=>{h.button===0&&(r==="drag"&&h.target.closest(".bp-btn")||(g=r,p=b||"",d={px:h.clientX,py:h.clientY,...t},l={x:h.clientX-t.x,y:h.clientY-t.y},t.dock||(y={width:t.width,height:t.height}),e.classList.add(r==="drag"?"bp-dragging":"bp-resizing"),h.currentTarget.setPointerCapture(h.pointerId),h.preventDefault()))},j=r=>{if(!g||!d)return;const b=r.clientX-d.px,h=r.clientY-d.py;g==="drag"?_(b,h,r.clientX,r.clientY):T(b,h)},C=r=>{if(g){e.classList.remove("bp-dragging","bp-resizing"),W(null),g==="drag"&&K(),g=null,p="",d=null,w=null;try{r.currentTarget.releasePointerCapture(r.pointerId)}catch(b){}V(t)}};i.addEventListener("pointerdown",Z("drag")),i.addEventListener("pointermove",j),i.addEventListener("pointerup",C),i.addEventListener("pointercancel",C),(a||[]).forEach(({el:r,dir:b})=>{r.addEventListener("pointerdown",Z("resize",b)),r.addEventListener("pointermove",j),r.addEventListener("pointerup",C),r.addEventListener("pointercancel",C)});const F=()=>{t=t.dock?{...t,...P(t.dock,t)}:R(t),M()};window.addEventListener("resize",F);const Q={start(r){var b,h;g="drag",d={px:r.x,py:r.y,...t},l={x:(b=r.cx)!=null?b:t.width/2,y:(h=r.cy)!=null?h:20},t.dock||(y={width:t.width,height:t.height}),e.classList.add("bp-dragging")},move(r){if(g!=="drag"||!d)return;const b=r.x-d.px,h=r.y-d.py;_(b,h,d.x+b+l.x,d.y+h+l.y)},end(){g==="drag"&&(e.classList.remove("bp-dragging"),W(null),K(),g=null,d=null,w=null,V(t))}};return M(),{external:Q,get geometry(){return{...t}},set(r){const b=se(s),h={...t,...r,dock:null};h.width=Math.min(b.maxWidth,Math.max(b.minWidth,h.width)),h.height=Math.min(b.maxHeight,Math.max(b.minHeight,h.height)),t=R(h),M(),V(t)},dock(r){if(!r||r==="float"){const b=y||{width:s.width,height:s.height};t=R({...t,...b,dock:null})}else t.dock||(y={width:t.width,height:t.height}),t={...t,...P(r,t),dock:r};M(),V(t)},destroy(){window.removeEventListener("resize",F)}}}const de="bravophone/v1";function Le({frame:e,origin:i,onEvent:a}){const o=new Map;let n=0,s=!1;const u=[],m=g=>{var d;if(g.origin!==i||g.source!==e.contentWindow)return;const p=g.data;if(!(!p||p.protocol!==de)){if(p.type==="ready"){for(s=!0;u.length;)u.shift()();a==null||a("ready",(d=p.payload)!=null?d:{});return}if(p.type==="reply"){const l=o.get(p.id);if(!l)return;o.delete(p.id),clearTimeout(l.timer),p.error?l.reject(new Error(p.error)):l.resolve(p.payload);return}p.type==="event"&&(a==null||a(p.name,p.payload))}};window.addEventListener("message",m);function t(g,p,{timeout:d=15e3}={}){return new Promise((l,w)=>{const y=`${Date.now()}-${++n}`,M=()=>{var T;const W=setTimeout(()=>{o.delete(y),w(new Error(`Bravophone: timeout no comando "${g}"`))},d);o.set(y,{resolve:l,reject:w,timer:W}),(T=e.contentWindow)==null||T.postMessage({protocol:de,type:"command",id:y,command:g,payload:p},i)};s?M():u.push(M)})}return{call:t,get ready(){return s},destroy(){window.removeEventListener("message",m),o.forEach(({reject:g,timer:p})=>{clearTimeout(p),g(new Error("Bravophone: widget destruído"))}),o.clear()}}}const ce="bravophone:launcher",Se=4,ie=8;function Ee(e){try{const i=localStorage.getItem(ce);return i?{...e,...JSON.parse(i)}:{...e}}catch(i){return{...e}}}function ne(e){try{localStorage.setItem(ce,JSON.stringify(e))}catch(i){}}function U(e,i){const a=Math.max(ie,window.innerHeight-i-ie);return Math.min(Math.max(ie,e),a)}function He({el:e,side:i,y:a,onOpen:o}){let n={side:i,y:U(a,e.offsetHeight||48)},s=null,u=!1;const m=()=>{e.dataset.side=n.side,e.style.top=`${n.y}px`,e.style.right=n.side==="right"?"0px":"auto",e.style.left=n.side==="left"?"0px":"auto"},t=l=>{l.button===0&&(s={py:l.clientY,y:n.y},u=!1,e.setPointerCapture(l.pointerId))},g=l=>{if(!s)return;const w=l.clientY-s.py;!u&&Math.abs(w)<Se||(u||(u=!0,e.classList.add("bp-launcher-dragging")),n.y=U(s.y+w,e.offsetHeight),m())},p=l=>{if(!s)return;const w=u;s=null,u=!1,e.classList.remove("bp-launcher-dragging");try{e.releasePointerCapture(l.pointerId)}catch(y){}w?ne(n):o==null||o()};e.addEventListener("pointerdown",t),e.addEventListener("pointermove",g),e.addEventListener("pointerup",p),e.addEventListener("pointercancel",p),e.addEventListener("keydown",l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),o==null||o())});const d=()=>{n.y=U(n.y,e.offsetHeight),m()};return window.addEventListener("resize",d),m(),{get state(){return{...n}},setSide(l){n.side=l,m(),ne(n)},moveTo(l){n.y=U(l,e.offsetHeight),m(),ne(n)},destroy(){window.removeEventListener("resize",d)}}}const Te="https://cdn.jsdelivr.net/npm";function $e(e,i="@bravophone/webphone"){return`${Te}/${i}@${e}/host/`}function Ie({version:e,parentOrigin:i,token:a,base:o}){const n=o||$e(e),s=JSON.stringify({parentOrigin:i,token:a||null}).replace(/</g,"\\u003c");return`<!doctype html>
357
+ `,se="bravophone:widget:geometry",Y=28,J=32;function Me(e){try{const a=localStorage.getItem(se);if(!a)return{...e};const i=JSON.parse(a);return i.dock?{...e,...i,...P(i.dock,i)}:{...e,...i}}catch(a){return{...e}}}function V(e){try{localStorage.setItem(se,JSON.stringify(e))}catch(a){}}function de(e){return{minWidth:e.minWidth,minHeight:e.minHeight,maxWidth:Math.max(e.minWidth,Math.min(e.maxWidth,window.innerWidth)),maxHeight:Math.max(e.minHeight,Math.min(e.maxHeight,window.innerHeight))}}function R(e){const a=Math.max(0,window.innerWidth-e.width),i=Math.max(0,window.innerHeight-40);return{...e,x:Math.min(Math.max(0,e.x),a),y:Math.min(Math.max(0,e.y),i)}}function P(e,a){const i=window.innerWidth,o=window.innerHeight,n=Math.round(i/2),d=Math.round(o/2),u=Math.min(a.width,i);switch(e){case"left":return{x:0,y:0,width:u,height:o};case"right":return{x:i-u,y:0,width:u,height:o};case"left-half":return{x:0,y:0,width:n,height:o};case"right-half":return{x:i-n,y:0,width:n,height:o};case"top":return{x:a.x,y:0,width:u,height:d};case"bottom":return{x:a.x,y:o-d,width:u,height:d};case"top-half":return{x:0,y:0,width:i,height:d};case"bottom-half":return{x:0,y:o-d,width:i,height:d};case"max":return{x:0,y:0,width:i,height:o};default:return{x:a.x,y:a.y,width:a.width,height:a.height}}}function Le(e,a,i){const o=window.innerWidth,n=window.innerHeight,d=e<=Y,u=e>=o-Y,f=a<=Y,t=a>=n-Y;return(f||t)&&d?"left-half":(f||t)&&u?"right-half":f?i||"max":t?"bottom-half":d?"left":u?"right":null}function ze({root:e,handle:a,handles:i,preview:o,geometry:n,limits:d,topDock:u,onChange:f}){let t={...n},g=null,p="",c=null,l=null,w=null,y=null;const z=()=>{e.style.left=`${t.x}px`,e.style.top=`${t.y}px`,e.style.width=`${t.width}px`,e.style.height=`${t.height}px`,e.classList.toggle("bp-docked",!!t.dock),f==null||f(t)},A=r=>{if(o){if(!r){o.hidden=!0;return}o.hidden=!1,o.style.left=`${r.x}px`,o.style.top=`${r.y}px`,o.style.width=`${r.width}px`,o.style.height=`${r.height}px`}},I=(r,b)=>{const h=de(d);let{x:v,y:S,width:E,height:H}=c;p.includes("e")&&(E=c.width+r),p.includes("w")&&(E=c.width-r),p.includes("s")&&(H=c.height+b),p.includes("n")&&(H=c.height-b),E=Math.min(h.maxWidth,Math.max(h.minWidth,E)),H=Math.min(h.maxHeight,Math.max(h.minHeight,H)),p.includes("w")&&(v=c.x+(c.width-E)),p.includes("n")&&(S=c.y+(c.height-H)),p.includes("e")&&Math.abs(v+E-window.innerWidth)<=J&&(E=window.innerWidth-v),p.includes("w")&&Math.abs(v)<=J&&(E+=v,v=0),p.includes("s")&&Math.abs(S+H-window.innerHeight)<=J&&(H=window.innerHeight-S),p.includes("n")&&Math.abs(S)<=J&&(H+=S,S=0),t={...t,x:v,y:S,width:E,height:H,dock:null},z()},_=(r,b,h,v)=>{if(t.dock){const S=y||{width:d.width,height:d.height},E=l.x/Math.max(1,t.width);t={...t,...S,dock:null},l={x:Math.round(S.width*E),y:Math.min(l.y,32)},c={...c,x:h-l.x,y:v-l.y,px:c.px+r,py:c.py+b},r=0,b=0}t=R({...t,x:c.x+r,y:c.y+b}),z(),w=Le(h,v,u),A(w?P(w,t):null)},K=()=>{w&&(y=y||{width:t.width,height:t.height},t={...t,...P(w,t),dock:w},z())},Z=(r,b)=>h=>{h.button===0&&(r==="drag"&&h.target.closest(".bp-btn")||(g=r,p=b||"",c={px:h.clientX,py:h.clientY,...t},l={x:h.clientX-t.x,y:h.clientY-t.y},t.dock||(y={width:t.width,height:t.height}),e.classList.add(r==="drag"?"bp-dragging":"bp-resizing"),h.currentTarget.setPointerCapture(h.pointerId),h.preventDefault()))},j=r=>{if(!g||!c)return;const b=r.clientX-c.px,h=r.clientY-c.py;g==="drag"?_(b,h,r.clientX,r.clientY):I(b,h)},B=r=>{if(g){e.classList.remove("bp-dragging","bp-resizing"),A(null),g==="drag"&&K(),g=null,p="",c=null,w=null;try{r.currentTarget.releasePointerCapture(r.pointerId)}catch(b){}V(t)}};a.addEventListener("pointerdown",Z("drag")),a.addEventListener("pointermove",j),a.addEventListener("pointerup",B),a.addEventListener("pointercancel",B),(i||[]).forEach(({el:r,dir:b})=>{r.addEventListener("pointerdown",Z("resize",b)),r.addEventListener("pointermove",j),r.addEventListener("pointerup",B),r.addEventListener("pointercancel",B)});const q=()=>{t=t.dock?{...t,...P(t.dock,t)}:R(t),z()};window.addEventListener("resize",q);const Q={start(r){var b,h;g="drag",c={px:r.x,py:r.y,...t},l={x:(b=r.cx)!=null?b:t.width/2,y:(h=r.cy)!=null?h:20},t.dock||(y={width:t.width,height:t.height}),e.classList.add("bp-dragging")},move(r){if(g!=="drag"||!c)return;const b=r.x-c.px,h=r.y-c.py;_(b,h,c.x+b+l.x,c.y+h+l.y)},end(){g==="drag"&&(e.classList.remove("bp-dragging"),A(null),K(),g=null,c=null,w=null,V(t))}};return z(),{external:Q,get geometry(){return{...t}},set(r){const b=de(d),h={...t,...r,dock:null};h.width=Math.min(b.maxWidth,Math.max(b.minWidth,h.width)),h.height=Math.min(b.maxHeight,Math.max(b.minHeight,h.height)),t=R(h),z(),V(t)},dock(r){if(!r||r==="float"){const b=y||{width:d.width,height:d.height};t=R({...t,...b,dock:null})}else t.dock||(y={width:t.width,height:t.height}),t={...t,...P(r,t),dock:r};z(),V(t)},destroy(){window.removeEventListener("resize",q)}}}const ce="bravophone/v1";function Se({frame:e,origin:a,onEvent:i}){const o=new Map;let n=0,d=!1;const u=[],f=g=>{var c;if(g.origin!==a||g.source!==e.contentWindow)return;const p=g.data;if(!(!p||p.protocol!==ce)){if(p.type==="ready"){for(d=!0;u.length;)u.shift()();i==null||i("ready",(c=p.payload)!=null?c:{});return}if(p.type==="reply"){const l=o.get(p.id);if(!l)return;o.delete(p.id),clearTimeout(l.timer),p.error?l.reject(new Error(p.error)):l.resolve(p.payload);return}p.type==="event"&&(i==null||i(p.name,p.payload))}};window.addEventListener("message",f);function t(g,p,{timeout:c=15e3}={}){return new Promise((l,w)=>{const y=`${Date.now()}-${++n}`,z=()=>{var I;const A=setTimeout(()=>{o.delete(y),w(new Error(`Bravophone: timeout no comando "${g}"`))},c);o.set(y,{resolve:l,reject:w,timer:A}),(I=e.contentWindow)==null||I.postMessage({protocol:ce,type:"command",id:y,command:g,payload:p},a)};d?z():u.push(z)})}return{call:t,get ready(){return d},destroy(){window.removeEventListener("message",f),o.forEach(({reject:g,timer:p})=>{clearTimeout(p),g(new Error("Bravophone: widget destruído"))}),o.clear()}}}const pe="bravophone:launcher",Ee=4,ae=8;function He(e){try{const a=localStorage.getItem(pe);return a?{...e,...JSON.parse(a)}:{...e}}catch(a){return{...e}}}function ne(e){try{localStorage.setItem(pe,JSON.stringify(e))}catch(a){}}function U(e,a){const i=Math.max(ae,window.innerHeight-a-ae);return Math.min(Math.max(ae,e),i)}function Te({el:e,side:a,y:i,onOpen:o}){let n={side:a,y:U(i,e.offsetHeight||48)},d=null,u=!1;const f=()=>{e.dataset.side=n.side,e.style.top=`${n.y}px`,e.style.right=n.side==="right"?"0px":"auto",e.style.left=n.side==="left"?"0px":"auto"},t=l=>{l.button===0&&(d={py:l.clientY,y:n.y},u=!1,e.setPointerCapture(l.pointerId))},g=l=>{if(!d)return;const w=l.clientY-d.py;!u&&Math.abs(w)<Ee||(u||(u=!0,e.classList.add("bp-launcher-dragging")),n.y=U(d.y+w,e.offsetHeight),f())},p=l=>{if(!d)return;const w=u;d=null,u=!1,e.classList.remove("bp-launcher-dragging");try{e.releasePointerCapture(l.pointerId)}catch(y){}w?ne(n):o==null||o()};e.addEventListener("pointerdown",t),e.addEventListener("pointermove",g),e.addEventListener("pointerup",p),e.addEventListener("pointercancel",p),e.addEventListener("keydown",l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),o==null||o())});const c=()=>{n.y=U(n.y,e.offsetHeight),f()};return window.addEventListener("resize",c),f(),{get state(){return{...n}},setSide(l){n.side=l,f(),ne(n)},moveTo(l){n.y=U(l,e.offsetHeight),f(),ne(n)},destroy(){window.removeEventListener("resize",c)}}}const Ie="https://cdn.jsdelivr.net/npm";function $e(e,a="@bravophone/webphone"){return`${Ie}/${a}@${e}/host/`}function Oe({version:e,parentOrigin:a,token:i,base:o}){const n=o||$e(e),d=JSON.stringify({parentOrigin:a,token:i||null}).replace(/</g,"\\u003c");return`<!doctype html>
341
358
  <html lang="pt-BR">
342
359
  <head>
343
360
  <meta charset="UTF-8">
344
361
  <meta name="viewport" content="width=device-width,initial-scale=1">
345
362
  <title>Webphone BRAVOPHONE</title>
363
+ <!-- CRÍTICO no modo srcdoc. O bundle referencia as imagens por caminho
364
+ RELATIVO (src="images/answer.png"), fora do public_path. Sem <base>,
365
+ elas resolvem contra a página do integrador — o documento herda o
366
+ baseURI do pai — e somem todas: logo, atender, desligar, mudo, hold,
367
+ transferir. Com <base>, resolvem contra o CDN. -->
368
+ <base href="${n}">
346
369
  <link rel="stylesheet" href="${n}css/dark-theme.css">
347
370
  <link rel="stylesheet" href="${n}styles/theme-fixes.css">
348
371
  <style>
@@ -351,7 +374,7 @@
351
374
  </style>
352
375
  <script>
353
376
  (function () {
354
- var cfg = ${s};
377
+ var cfg = ${d};
355
378
  // O guest-bridge lê daqui: em srcdoc não há query string para carregar a
356
379
  // origem do pai.
357
380
  window.__bpParentOrigin = cfg.parentOrigin;
@@ -373,4 +396,4 @@
373
396
  <noscript><strong>O webphone precisa de JavaScript habilitado.</strong></noscript>
374
397
  <div id="app"></div>
375
398
  </body>
376
- </html>`}const pe={width:380,height:640,minWidth:320,minHeight:420,maxWidth:1600,maxHeight:1400,margin:24};function x(e,i={},a=[]){const o=document.createElement(e);for(const[n,s]of Object.entries(i))n==="class"?o.className=s:n==="text"?o.textContent=s:s!=null&&o.setAttribute(n,s);return a.forEach(n=>o.appendChild(n)),o}function Oe(e){const{hostUrl:i,token:a,position:o="bottom-right",open:n=!1,launcher:s=!0,title:u="BRAVOPHONE",frame:m="none",dockTop:t="max",launcherSide:g="right",launcherIcon:p=te,mode:d="hosted",hostBase:l,version:w,emit:y}=e,M=d==="srcdoc",W=M?window.location.origin:new URL(i).origin,T=x("div",{"data-bravophone":"root"});T.style.cssText="all:initial;position:static";const _=T.attachShadow({mode:"open"});_.appendChild(x("style",{text:ve}));const K=(()=>{var fe;const{width:c,height:E,margin:O}=pe,G=window.innerWidth-c-O,ue=window.innerHeight-E-O,ge={"bottom-right":{x:G,y:ue},"bottom-left":{x:O,y:ue},"top-right":{x:G,y:O},"top-left":{x:O,y:O}};return R({...(fe=ge[o])!=null?fe:ge["bottom-right"],width:c,height:E})})(),Z=R(ke(K)),j=x("span",{class:"bp-status","data-state":"connecting"}),C=x("button",{class:"bp-btn bp-btn-min",title:"Minimizar",text:"—"}),F=x("button",{class:"bp-btn bp-btn-close",title:"Fechar",text:"×"}),Q=x("div",{class:"bp-header"},[j,x("span",{class:"bp-title",text:u}),C,F]),r=x("iframe",{class:"bp-frame",allow:"microphone; autoplay; clipboard-write; speaker-selection",title:"Webphone BRAVOPHONE"});M?r.setAttribute("srcdoc",Ie({version:w,parentOrigin:W,token:a,base:l})):r.setAttribute("src",Be(new URL(i),{token:a,embed:"1",parent:location.origin}));const h=["n","s","w","e","nw","ne","sw","se"].map(c=>({el:x("div",{class:`bp-h bp-h-${c}`}),dir:c})),v=x("div",{class:"bp-preview"});v.hidden=!0;const z=x("button",{class:"bp-btn bp-btn-close",title:"Fechar",text:"×"}),L=x("div",{class:"bp-overlay"},[z]),H=x("div",{class:"bp-body"},[r,L]),$=x("div",{class:"bp-root"},[Q,H,...h.map(c=>c.el)]);m!=="bar"&&$.classList.add("bp-chromeless"),$.hidden=!n;const ae=x("span",{class:"bp-launcher-icon"});ae.innerHTML=Y[p]||Y[te];const he=x("span",{class:"bp-launcher-grip","aria-hidden":"true"});he.innerHTML=ye;const S=x("div",{class:"bp-launcher",role:"button",tabindex:"0",title:"Abrir webphone","aria-label":"Abrir webphone"},[he,ae,x("span",{class:"bp-badge"})]);S.dataset.state="connecting",S.hidden=!s||n,_.append(v,$,S),document.body.appendChild(T);const le=Ee({side:g,y:Math.round(window.innerHeight/2-24)}),be=He({el:S,side:le.side,y:U(le.y,48),onOpen:()=>I.show()}),A=ze({root:$,handle:Q,handles:h,preview:v,geometry:Z,limits:pe,topDock:t,onChange:c=>y("resize",{width:c.width,height:c.height,dock:c.dock||null})}),re=Le({frame:r,origin:W,onEvent:(c,E)=>{var O;if(c==="ready"&&(j.dataset.state="ready",S.dataset.state="ready",a&&re.call("auth",{token:a}).catch(()=>{})),c==="state"){const G=(O=E==null?void 0:E.state)!=null?O:"ready";j.dataset.state=G,S.dataset.state=G}if(c==="call:incoming"&&(I.show(),S.dataset.badge="1",S.dataset.state="ringing"),c==="call:answered"&&(S.dataset.state="incall"),(c==="call:ended"||c==="call:failed")&&(delete S.dataset.badge,S.dataset.state="ready"),c==="drag:start"){A.external.start(E);return}if(c==="drag:move"){A.external.move(E);return}if(c==="drag:end"){A.external.end();return}y(c,E)}});let ee=!1;const I={el:T,bridge:re,show(){$.hidden=!1,S.hidden=!0,y("open")},hide(){$.hidden=!0,s&&(S.hidden=!1),y("close")},toggle(){$.hidden?I.show():I.hide()},get isOpen(){return!$.hidden},minimize(c){if(m!=="bar"){I.hide();return}ee=c!=null?c:!ee,$.classList.toggle("bp-minimized",ee),C.textContent=ee?"▢":"—"},move(c,E){A.set({x:c,y:E})},resize(c,E){A.set({width:c,height:E})},dock(c){A.dock(c)},setLauncherSide(c){be.setSide(c)},setLauncherIcon(c){ae.innerHTML=Y[c]||Y[te]},get geometry(){return A.geometry},destroy(){re.destroy(),A.destroy(),be.destroy(),v.remove(),T.remove()}};return F.addEventListener("click",()=>I.hide()),C.addEventListener("click",()=>I.minimize()),z.addEventListener("click",()=>I.hide()),I}function Be(e,i){const a=new URL(e.href);for(const[o,n]of Object.entries(i))n!=null&&n!==""&&a.searchParams.set(o,n);return i.token&&(a.searchParams.delete("token"),a.hash=`token=${encodeURIComponent(i.token)}`),a.href}const We="https://webphone.bravophone.com/embed/";let k=null;const D=new Map;function Ce(e,i){var a,o;(a=D.get(e))==null||a.forEach(n=>{try{n(i)}catch(s){console.error("[Bravophone] listener falhou:",s)}}),(o=D.get("*"))==null||o.forEach(n=>{try{n({event:e,payload:i})}catch(s){console.error("[Bravophone] listener falhou:",s)}})}function f(){if(!k)throw new Error("Bravophone: chame Bravophone.init() antes.");return k}const X={init(e={}){if(k)return k;if(typeof window=="undefined"||!document.body)throw new Error("Bravophone: init() precisa rodar no browser, após o <body> existir.");return location.protocol!=="https:"&&location.hostname!=="localhost"&&console.warn("[Bravophone] Contexto inseguro: o microfone exige HTTPS ou localhost."),k=Oe({hostUrl:We,version:X.version,...e,emit:Ce}),k},show(){f().show()},hide(){f().hide()},toggle(){f().toggle()},minimize(e){f().minimize(e)},move(e,i){f().move(e,i)},resize(e,i){f().resize(e,i)},dock(e){f().dock(e)},setLauncherSide(e){f().setLauncherSide(e)},setLauncherIcon(e){f().setLauncherIcon(e)},get isOpen(){return k?k.isOpen:!1},get geometry(){return k?k.geometry:null},call(e,i){return f().bridge.call("call",{number:e,meta:i})},hangup(){return f().bridge.call("hangup")},answer(){return f().bridge.call("answer")},mute(){return f().bridge.call("mute")},hold(){return f().bridge.call("hold")},sendDTMF(e){return f().bridge.call("dtmf",{tone:e})},transfer(e){return f().bridge.call("transfer",{to:e})},getStatus(){return f().bridge.call("status")},setAuth(e){return f().bridge.call("auth",{token:e})},logout(){return f().bridge.call("logout")},on(e,i){return D.has(e)||D.set(e,new Set),D.get(e).add(i),()=>X.off(e,i)},off(e,i){var a;(a=D.get(e))==null||a.delete(i)},destroy(){k==null||k.destroy(),k=null,D.clear()},version:"0.2.0"};return typeof window!="undefined"&&(window.Bravophone=X),X});
399
+ </html>`}const he={width:380,height:640,minWidth:320,minHeight:420,maxWidth:1600,maxHeight:1400,margin:24};function x(e,a={},i=[]){const o=document.createElement(e);for(const[n,d]of Object.entries(a))n==="class"?o.className=d:n==="text"?o.textContent=d:d!=null&&o.setAttribute(n,d);return i.forEach(n=>o.appendChild(n)),o}function Ce(e){const{hostUrl:a,token:i,position:o="bottom-right",open:n=!1,launcher:d=!0,title:u="BRAVOPHONE",frame:f="bar",dockTop:t="max",launcherSide:g="right",launcherIcon:p=te,mode:c="hosted",hostBase:l,version:w,emit:y}=e,z=c==="srcdoc",A=z?window.location.origin:new URL(a).origin,I=x("div",{"data-bravophone":"root"});I.style.cssText="all:initial;position:static";const _=I.attachShadow({mode:"open"});_.appendChild(x("style",{text:ke}));const K=(()=>{var fe;const{width:s,height:L,margin:C}=he,F=window.innerWidth-s-C,ge=window.innerHeight-L-C,me={"bottom-right":{x:F,y:ge},"bottom-left":{x:C,y:ge},"top-right":{x:F,y:C},"top-left":{x:C,y:C}};return R({...(fe=me[o])!=null?fe:me["bottom-right"],width:s,height:L})})(),Z=R(Me(K)),j=x("span",{class:"bp-status","data-state":"connecting"}),B=x("button",{class:"bp-btn bp-btn-min",title:"Minimizar",text:"—"}),q=x("button",{class:"bp-btn bp-btn-close",title:"Fechar",text:"×"}),Q=x("div",{class:"bp-header"},[j,x("span",{class:"bp-title",text:u}),B,q]),r=x("iframe",{class:"bp-frame",allow:"microphone; autoplay; clipboard-write; speaker-selection",title:"Webphone BRAVOPHONE"});z?r.setAttribute("srcdoc",Oe({version:w,parentOrigin:A,token:i,base:l})):r.setAttribute("src",We(new URL(a),{token:i,embed:"1",parent:location.origin}));const h=["n","s","w","e","nw","ne","sw","se"].map(s=>({el:x("div",{class:`bp-h bp-h-${s}`}),dir:s})),v=x("div",{class:"bp-preview"});v.hidden=!0;const S=x("button",{class:"bp-btn bp-btn-close",title:"Fechar",text:"×"}),E=x("div",{class:"bp-overlay"},[S]),H=x("div",{class:"bp-body"},[r,E]),M=x("div",{class:"bp-root"},[Q,H,...h.map(s=>s.el)]);f!=="bar"&&M.classList.add("bp-chromeless"),M.hidden=!n;const ie=x("span",{class:"bp-launcher-icon"});ie.innerHTML=G[p]||G[te];const le=x("span",{class:"bp-launcher-grip","aria-hidden":"true"});le.innerHTML=ve;const T=x("div",{class:"bp-launcher",role:"button",tabindex:"0",title:"Abrir webphone","aria-label":"Abrir webphone"},[le,ie,x("span",{class:"bp-badge"})]);T.dataset.state="connecting",T.hidden=!d,_.append(v,M,T),document.body.appendChild(I);const be=He({side:g,y:Math.round(window.innerHeight/2-24)}),ue=Te({el:T,side:be.side,y:U(be.y,48),onOpen:()=>O.reveal()}),$=ze({root:M,handle:Q,handles:h,preview:v,geometry:Z,limits:he,topDock:t,onChange:s=>y("resize",{width:s.width,height:s.height,dock:s.dock||null})}),re=Se({frame:r,origin:A,onEvent:(s,L)=>{var C;if(s==="ready"&&(j.dataset.state="ready",T.dataset.state="ready",i&&re.call("auth",{token:i}).catch(()=>{})),s==="state"){const F=(C=L==null?void 0:L.state)!=null?C:"ready";j.dataset.state=F,T.dataset.state=F}if(s==="call:incoming"&&(O.show(),T.dataset.badge="1",T.dataset.state="ringing"),s==="call:answered"&&(T.dataset.state="incall"),s==="call:ended"&&(delete T.dataset.badge,T.dataset.state="ready"),s==="drag:start"){$.external.start(L);return}if(s==="drag:move"){$.external.move(L);return}if(s==="drag:end"){$.external.end();return}y(s,L)}});let ee=!1,oe=null;const O={el:I,bridge:re,show(){M.hidden=!1,y("open")},hide(){M.hidden=!0,y("close")},toggle(){M.hidden?O.show():O.hide()},reveal(){if(M.hidden){O.show();return}const s=$.geometry;(s.x+s.width<40||s.x>window.innerWidth-40||s.y>window.innerHeight-40)&&$.set({x:Math.round((window.innerWidth-s.width)/2),y:Math.round((window.innerHeight-s.height)/2)}),M.classList.remove("bp-attention"),M.offsetWidth,M.classList.add("bp-attention"),clearTimeout(oe),oe=setTimeout(()=>M.classList.remove("bp-attention"),1800),y("reveal")},get isOpen(){return!M.hidden},minimize(s){if(f!=="bar"){O.hide();return}ee=s!=null?s:!ee,M.classList.toggle("bp-minimized",ee),B.textContent=ee?"▢":"—"},move(s,L){$.set({x:s,y:L})},resize(s,L){$.set({width:s,height:L})},dock(s){$.dock(s)},setLauncherSide(s){ue.setSide(s)},setLauncherIcon(s){ie.innerHTML=G[s]||G[te]},get geometry(){return $.geometry},destroy(){clearTimeout(oe),re.destroy(),$.destroy(),ue.destroy(),v.remove(),I.remove()}};return q.addEventListener("click",()=>O.hide()),B.addEventListener("click",()=>O.minimize()),S.addEventListener("click",()=>O.hide()),O}function We(e,a){const i=new URL(e.href);for(const[o,n]of Object.entries(a))n!=null&&n!==""&&i.searchParams.set(o,n);return a.token&&(i.searchParams.delete("token"),i.hash=`token=${encodeURIComponent(a.token)}`),i.href}const Ae="https://webphone.bravophone.com/embed/";let k=null;const D=new Map;function Be(e,a){var i,o;(i=D.get(e))==null||i.forEach(n=>{try{n(a)}catch(d){console.error("[Bravophone] listener falhou:",d)}}),(o=D.get("*"))==null||o.forEach(n=>{try{n({event:e,payload:a})}catch(d){console.error("[Bravophone] listener falhou:",d)}})}function m(){if(!k)throw new Error("Bravophone: chame Bravophone.init() antes.");return k}const X={init(e={}){if(k)return k;if(typeof window=="undefined"||!document.body)throw new Error("Bravophone: init() precisa rodar no browser, após o <body> existir.");return location.protocol!=="https:"&&location.hostname!=="localhost"&&console.warn("[Bravophone] Contexto inseguro: o microfone exige HTTPS ou localhost."),k=Ce({hostUrl:Ae,version:X.version,...e,emit:Be}),k},show(){m().show()},hide(){m().hide()},toggle(){m().toggle()},reveal(){m().reveal()},minimize(e){m().minimize(e)},move(e,a){m().move(e,a)},resize(e,a){m().resize(e,a)},dock(e){m().dock(e)},setLauncherSide(e){m().setLauncherSide(e)},setLauncherIcon(e){m().setLauncherIcon(e)},get isOpen(){return k?k.isOpen:!1},get geometry(){return k?k.geometry:null},call(e,a){return m().bridge.call("call",{number:e,meta:a})},hangup(){return m().bridge.call("hangup")},answer(){return m().bridge.call("answer")},mute(){return m().bridge.call("mute")},hold(){return m().bridge.call("hold")},sendDTMF(e){return m().bridge.call("dtmf",{tone:e})},transfer(e){return m().bridge.call("transfer",{to:e})},getStatus(){return m().bridge.call("status")},setAuth(e){return m().bridge.call("auth",{token:e})},logout(){return m().bridge.call("logout")},on(e,a){return D.has(e)||D.set(e,new Set),D.get(e).add(a),()=>X.off(e,a)},off(e,a){var i;(i=D.get(e))==null||i.delete(a)},destroy(){k==null||k.destroy(),k=null,D.clear()},version:"0.2.1"};return typeof window!="undefined"&&(window.Bravophone=X),X});