@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 3.77 kB
JavaScript
import Z from"color";import{reaction as X}from"mobx";import{SEPARATOR as M}from"../../../../constants";import v from"../../../../data";import{getTrianglesFromFpPaths as j}from"../../../../data/svg";import{createShapeDef as q,createTextDef as J,createTextDefLines as K}from"../../../../renderer";import{boothStore as Q,uiState as V}from"../../../../store";import{RegularBooth as tt}from"../../../../store/BoothStore";import k from"../../../../tools/settings";import{pointInTriangle as nt}from"../../../../utils/geometry";import{getContrastTextColor as et}from"../../../../utils/getContrastTextColor";import{getFont as ot}from"./canvases";import{getBadgeFontWeight as it,getFontUrlByWeight as rt}from"./config-booth-labels";import{Rect as st}from"./Rect";const ct=.5,ft=.3,L=15,at=24,N=30,lt=12,dt=12,z=.8,Y=document.createElement("canvas").getContext("2d");function ut(t){return t.length<=L?t:t.slice(0,L-1)+"\u2026"}function b(t){if(!t.paths?.length)return[];const n=t.layer?.name||"",e=[];for(const o of t.paths)for(const c of j(o.index,n))e.push(c);return e}function gt(t){const n=b(t);if(!n.length)return null;let e=1/0,o=1/0,c=-1/0,r=-1/0;for(const s of n)for(const i of s)i[0]<e&&(e=i[0]),i[1]<o&&(o=i[1]),i[0]>c&&(c=i[0]),i[1]>r&&(r=i[1]);return isFinite(e)?{x1:e,y1:o,w:c-e,h:r-o}:null}function _(t,n,e){for(const o of e)if(nt(t,n,o))return!0;return!1}function mt(t,n,e,o,c,r){if(!t.length||!_(n,e,t))return r;let s=0,i=r;const p=10;for(let g=0;g<p;g++){const u=(s+i)/2,m=o*u,l=c*u;_(n+m,e,t)&&_(n,e+l,t)&&_(n+m,e+l,t)?s=u:i=u}return s}function ht(t){return gt(t)??t.rect}function xt(t,n,e,o){const c=ht(t);if(n.length){const m=new Set;let l=null,h=1/0;for(const B of n)for(const x of B){const I=`${x[0]},${x[1]}`;if(m.has(I))continue;m.add(I);const T=x[0]+e,y=x[1]+e;if(_(T,y,n)){const E=T-c.x1+(y-c.y1);E<h&&(h=E,l={x:T,y})}}if(l)return l}const r=t.rect.x1+e,s=t.rect.y1+e;if(!o)return{x:r,y:s};const i=Math.cos(o),p=Math.sin(o),g=r-t.rect.cx,u=s-t.rect.cy;return{x:t.rect.cx+g*i-u*p,y:t.rect.cy+g*p+u*i}}function C(t){return t&&t!=="none"?t:void 0}function pt(t){const n=C(t.borderColor)||C(k.boothBorderColor)||k.colors.booths.default;return t.paths?.length>1&&C(t.paths[t.paths.length-1].color)||n}export function createBoothBadge(t,n){const e=ut(n.title||n.name),o=pt(n),c=et(Z(o).hex()),r=window.devicePixelRatio||1,s=it(),i=ot(N,s);Y.font=i;const p=Y.measureText(e).width,g=Math.ceil(p+lt*2),u=N+dt*2,m=(n.borderWidth||Q.borderWidth)/2,l=g*z,h=u*z,B=n.rotate?-n.rotate:0,x=n.rect.w,I=n.rect.h,T=Math.min(x>0?x*ct/l:1/0,I>0?I*ft/h:1/0),y=b(n),{x:E,y:G}=xt(n,y,m,B),P=mt(y,E,G,l,h,T),W=Math.cos(B),$=Math.sin(B),S=(f,A)=>{const D=f/2,R=A/2,O=E+D*W-R*$,U=G+D*$+R*W;return new st({x:O-D,y:U-R},{x:O+D,y:U+R},B)},w=f=>{const A=Math.min(f,P);return S(l*A,h*A)},F=rt(s,t.fontUrls),d=q(S(1,1),o);d.hidden=!0,d.dim=n.skipDim?!1:void 0;const a=J(K([[e],[]],c,0,[F,F]),S(1,1),[0,0],{horizontal:"center",vertical:"center"});a.hidden=!0,a.dim=n.skipDim?!1:void 0;const H=()=>!!(n.layer&&!n.layer.visible);return X(()=>n.skipDim,f=>{d.dim=f?!1:void 0,a.dim=f?!1:void 0,t.update(d,a)}),X(()=>n.layer?.visible??!0,f=>{d.hidden=!f,a.hidden=!f,t.update(d,a)}),t.onPtScale(`badge-bg-${n.id}`,f=>(d.shape=w(f),d.hidden=H(),d)),t.onPtScale(`badge-text-${n.id}`,f=>{const A=Math.min(f,P);return a.lines[0].fontSize=at/r*A,a.bounds=w(f),a.hidden=H(),a}),{bg:d,text:a}}export function configBoothsBadges(t,n,e){if(v.hideExhibitorBoothNumber)return null;const o=[],c=[];for(const r of e)if(r instanceof tt&&r.noLabels&&!V.hideLogoInBooth&&r.exhibitors.some(s=>s.logoInBooth&&s.logo)){const{bg:s,text:i}=createBoothBadge(t,r);o.push(s),c.push(i)}return o.length?{name:`${n}${M}badges`,children:[{name:`${n}${M}badgeBgs`,children:o},{name:`${n}${M}badgeTexts`,children:c}]}:null}