@mxtommy/kip 4.8.5 → 4.9.0-beta.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.
Files changed (59) hide show
  1. package/package.json +2 -2
  2. package/public/3rdpartylicenses.txt +78 -78
  3. package/public/assets/help-docs/kiosk.md +4 -2
  4. package/public/{chunk-ByFzHU1s.js → chunk-5jtM3b20.js} +1 -1
  5. package/public/{chunk-Co8V0LUu.js → chunk-B1H8b4W3.js} +1 -1
  6. package/public/{chunk-DufX2AHa.js → chunk-BJObkbow.js} +1 -1
  7. package/public/{chunk-CuPmfpgh.js → chunk-BLEfD_P7.js} +1 -1
  8. package/public/{chunk-Fy40z1B2.js → chunk-BO34LrGA.js} +1 -1
  9. package/public/{chunk-BZG04c3j.js → chunk-BSNfaGK3.js} +1 -1
  10. package/public/{chunk-DxS7HN4G.js → chunk-BbE36LU3.js} +1 -1
  11. package/public/{chunk-6MiGh2Ts.js → chunk-BoY2UDvb.js} +1 -1
  12. package/public/{chunk-BTv5PhTr.js → chunk-BrjwTjz7.js} +1 -1
  13. package/public/{chunk-Bp1YVCJL.js → chunk-BufDbUf3.js} +1 -1
  14. package/public/{chunk-DiDkZnhZ.js → chunk-C11zYqw7.js} +1 -1
  15. package/public/{chunk-BwYOFdBA.js → chunk-C8uxDv1M.js} +1 -1
  16. package/public/{chunk-7QXXQf2h.js → chunk-CDG3g9Eq.js} +1 -1
  17. package/public/{chunk-BAVmyVwG.js → chunk-CEtt0kr-.js} +1 -1
  18. package/public/{chunk-DN39qO63.js → chunk-CKnQ07BR.js} +1 -1
  19. package/public/{chunk-BaGEtCmz.js → chunk-COM48ir-.js} +1 -1
  20. package/public/{chunk-CQtqkz1Y.js → chunk-CSCVkGWE.js} +1 -1
  21. package/public/{chunk-MakCt36b.js → chunk-C_mCGLT_.js} +1 -1
  22. package/public/{chunk-CLIWxVhS.js → chunk-CnVELVOx.js} +1 -1
  23. package/public/{chunk-Cj0AJQ8U.js → chunk-Csxy6yVz.js} +1 -1
  24. package/public/{chunk-TdI_E-cf.js → chunk-CvG4thmf.js} +1 -1
  25. package/public/{chunk-Be5KcT7R.js → chunk-CxOyBrqL.js} +1 -1
  26. package/public/{chunk-Bbyk4dOu.js → chunk-CzY2nk08.js} +1 -1
  27. package/public/{chunk-Bx77STup.js → chunk-CzquTNBp.js} +1 -1
  28. package/public/{chunk-CteyWXZ_.js → chunk-D59G2Xua.js} +1 -1
  29. package/public/chunk-D8CQ-x45.js +1 -0
  30. package/public/{chunk-CJhkckXA.js → chunk-DA2JBQHi.js} +1 -1
  31. package/public/chunk-DCdZRAXa.js +1 -0
  32. package/public/{chunk-YZWhRxa9.js → chunk-DES7U9G6.js} +1 -1
  33. package/public/{chunk-CRy9Da7a.js → chunk-DHj2hm9r.js} +1 -1
  34. package/public/{chunk-CzEDfe2A.js → chunk-DJVnrrxC.js} +1 -1
  35. package/public/{chunk-C7ax8Sqz.js → chunk-DN6HP97P.js} +1 -1
  36. package/public/{chunk-ByC_hFSP.js → chunk-DTznNQod.js} +1 -1
  37. package/public/{chunk-DNbLx4NZ.js → chunk-DZQzZeIV.js} +1 -1
  38. package/public/{chunk-D63LEt5t.js → chunk-DakdT7bi.js} +1 -1
  39. package/public/{chunk-DonRL_4T.js → chunk-DizMY7FW.js} +1 -1
  40. package/public/{chunk-MO2v041V.js → chunk-DjPkdMGz.js} +1 -1
  41. package/public/{chunk-BOlUTHo6.js → chunk-DlLiKS0n.js} +1 -1
  42. package/public/{chunk-B4Wxwb2y.js → chunk-Dt2HCrSr.js} +1 -1
  43. package/public/{chunk-Dddd8rAh.js → chunk-Duhmjpm9.js} +1 -1
  44. package/public/{chunk-CkFpNfxN.js → chunk-DulH4zwM.js} +1 -1
  45. package/public/{chunk-Cn9j0-tJ.js → chunk-DwAXe6Wn.js} +1 -1
  46. package/public/{chunk-C89yhdsn.js → chunk-DxD20B-E.js} +1 -1
  47. package/public/{chunk-CwGTKplC.js → chunk-DzQ_fUpO.js} +1 -1
  48. package/public/{chunk-tbyiK3Ur.js → chunk-GyA81uXZ.js} +1 -1
  49. package/public/{chunk-0ijGpqkR.js → chunk-GzqVKhHm.js} +1 -1
  50. package/public/{chunk-CdNfAZ0G.js → chunk-MPbL1AwE.js} +1 -1
  51. package/public/{chunk-_toW-rHA.js → chunk-Qlya07CF.js} +1 -1
  52. package/public/{chunk-BzH86te1.js → chunk-VshNFG3q.js} +1 -1
  53. package/public/{chunk-D1Yncgg5.js → chunk-YBp9CH_2.js} +1 -1
  54. package/public/{chunk-DRPjASjZ.js → chunk-_S08GvV8.js} +1 -1
  55. package/public/{chunk-TneLdWrI.js → chunk-dvm9QV-B.js} +1 -1
  56. package/public/{chunk-urAQA4U_.js → chunk-ipFM9wbJ.js} +1 -1
  57. package/public/index.html +1 -1
  58. package/public/{main-F7NMHHV4.js → main-IINF7HD6.js} +473 -473
  59. package/public/chunk-CcaPRVAZ.js +0 -1
@@ -1 +1 @@
1
- import {C,e as e$1}from'./chunk-CzEDfe2A.js';import {g as ge$1}from'./chunk-TakPRI3t.js';import {e9 as a,d1 as Hj,w,du as p,aS as De,bu as ut,aY as xe,$ as $j,v as vt,D as Dt,F as Fa,dn as ge,a_ as Gp,cv as G,cw as z,dx as n$1,J as JD,dC as x,c as $h,cn as wd,_ as _w,B as Bh,e as EE,M as Mw,f as eg,K as Kw,P as Pi,T as TT,u as ul}from'./main-F7NMHHV4.js';import {c,e}from'./chunk-CRy9Da7a.js';var ie=["alternatorSvg"];function oe(d,e){d&1&&(Pi(0,"div",3)(1,"div",4),TT(2,"No alternators detected"),ul(),Pi(3,"div",5),TT(4,"Check Signal K alternator paths or select alternators in widget settings."),ul()());}function ne(d){return d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var Z=class d{static ALTERNATOR_DESCRIPTOR=a("widget-alternator");static SELF_ROOT_PATH=(()=>{let e=d.ALTERNATOR_DESCRIPTOR?.selfRootPath;if(!e)throw new Error("[WidgetAlternatorComponent] Descriptor missing or selfRootPath not set; check widget registration.");return e})();static ROOT_PATTERN=`${d.SELF_ROOT_PATH}.*`;static PATH_REGEX=new RegExp(`^${ne(d.SELF_ROOT_PATH)}\\.([^.]+)\\.(.+)$`);static VIEWBOX_WIDTH=200;static CARD_HEIGHT=100;static COMPACT_CARD_HEIGHT=100;static CARD_GAP=8;static PATH_BATCH_WINDOW_MS=500;static DEFAULT_CONFIG={color:"contrast",ignoreZones:false,alternator:{trackedDevices:[],optionsById:{}}};id=Hj.required();type=Hj.required();theme=Hj.required();renderMode=Hj(null);runtime=w(p);data=w(De);units=w(ut);destroyRef=w(xe);svgRef=$j.required("alternatorSvg");svg;layer;pendingPathUpdates=new Map;pathBatchTimerId=null;initialPathPaintDone=false;renderFrameId=null;pendingRenderSnapshot=null;discoveredAlternatorIds=vt([]);trackedDevices=vt([]);optionsById=vt({});cardMode=vt({displayMode:"full",metrics:["voltage","current","power","revolutions"]});alternatorsByKey=vt({});visibleAlternatorKeys=Dt(()=>{let e=this.trackedDevices();if(e.length)return e.map(i=>i.key);let r=this.alternatorsByKey(),t=new Set(this.discoveredAlternatorIds());return Object.keys(r).filter(i=>{let a=r[i];return !!a&&t.has(a.id)}).sort((i,a)=>i.localeCompare(a))});visibleAlternators=Dt(()=>{let e=this.visibleAlternatorKeys(),r=this.alternatorsByKey();return e.map(t=>r[t]).filter(t=>!!t)});hasAlternators=Dt(()=>this.visibleAlternators().length>0);activeDisplayMode=Dt(()=>this.renderMode()??this.cardMode().displayMode??"full");isCompactCardMode=Dt(()=>this.activeDisplayMode()==="compact");colorRole=Dt(()=>this.runtime.options()?.color??"contrast");ignoreZones=Dt(()=>this.runtime.options()?.ignoreZones??false);displayLabel=Dt(()=>{let e=this.visibleAlternators();return e.length!==1?"Alternators":this.resolveTitleText(e[0])});labelColor=Dt(()=>{let e=this.theme();return e?c(this.colorRole(),e).dim:"var(--kip-contrast-dim-color)"});widgetColors=Dt(()=>{let e=this.theme();return e?c(this.colorRole(),e):null});displayModels=Dt(()=>{let e$1=this.visibleAlternators(),r=this.theme(),t=this.widgetColors(),i=this.ignoreZones(),a=new Map;e$1.forEach(o=>a.set(o.id,(a.get(o.id)??0)+1));let l=new Set([...a.entries()].filter(([,o])=>o>1).map(([o])=>o)),s={};for(let o of e$1){let c=o.deviceKey??o.id,n=!!o.source&&l.has(o.id),p=this.resolveMostSevereState(o.powerState??null,o.currentState??null,o.voltageState??null,o.temperatureState??null,o.chargingModeState??null,o.revolutionsState??null,o.fieldDriveState??null,o.regulatorTemperatureState??null),T=this.resolveMostSevereState(o.voltageState??null,o.currentState??null),C=this.resolveMostSevereState(o.powerState??null,o.revolutionsState??null,o.temperatureState??null,o.regulatorTemperatureState??null),[u,I]=this.buildMetricRows(o);s[c]={id:o.id,titleText:this.resolveTitleText(o),modeText:this.isCompactCardMode()?"":this.resolveModeText(o),busText:this.isCompactCardMode()?"":n?o.source??"-":o.associatedBus||o.location||"-",metricsLineOne:u,metricsLineTwo:I,stateBarColor:e(p,t?.dim??"var(--kip-contrast-color)",r,i),titleTextColor:e(p,"var(--kip-contrast-color)",r,i),metaTextColor:e(this.resolveMostSevereState(o.chargingModeState??null,o.fieldDriveState??null),"var(--kip-contrast-dim-color)",r,i),primaryMetricsTextColor:e(T,"var(--kip-contrast-color)",r,i),secondaryMetricsTextColor:e(C,"var(--kip-contrast-color)",r,i)};}return s});constructor(){Fa(()=>{let t=this.runtime.options();t&&ge(()=>this.applyConfig(t));}),Fa(()=>{let t=this.displayModels(),i=this.visibleAlternators(),a=this.widgetColors();!this.svg||!a||this.requestRender({alternators:i,displayModels:t,widgetColors:a});});let e=[this.data.subscribePathTreeWithInitial(d.ROOT_PATTERN)],r=false;for(let t of e)if(t.initial.length){r=true;for(let i of t.initial)this.enqueuePathUpdate(i,true);}r&&(this.flushPendingPathUpdates(),this.initialPathPaintDone=true);for(let t of e)t.live$.pipe(Gp(this.destroyRef)).subscribe(i=>{this.enqueuePathUpdate(i);});}ngAfterViewInit(){this.initializeSvg(),this.requestRender();}ngOnDestroy(){this.pathBatchTimerId!==null&&(clearTimeout(this.pathBatchTimerId),this.pathBatchTimerId=null),this.renderFrameId!==null&&(cancelAnimationFrame(this.renderFrameId),this.renderFrameId=null),this.pendingRenderSnapshot=null;}initializeSvg(){this.svg=ge$1(this.svgRef().nativeElement),this.svg.attr("viewBox",`0 0 ${d.VIEWBOX_WIDTH} ${d.CARD_HEIGHT}`).attr("preserveAspectRatio","xMidYMid meet").attr("role","img").attr("aria-label","Alternator View"),this.layer=this.svg.append("g").attr("class","alternator-layer");}applyConfig(e){let r=this.resolveAlternatorConfig(e);this.trackedDevices.set(r.trackedDevices??[]),this.reprojectSnapshotsToDeviceKeys(r.trackedDevices??[]),this.optionsById.set(r.optionsById),this.cardMode.set(this.normalizeCardMode(r.cardMode));}reprojectSnapshotsToDeviceKeys(e){if(!e.length)return;let r=new Map;e.forEach(t=>{let i=r.get(t.id)??[];i.push(t.key),r.set(t.id,i);}),this.alternatorsByKey.update(t=>{let i=t,a=false;return r.forEach((l,s)=>{let o=t[s];if(o){for(let c of l){if(t[c])continue;let n=e.find(p=>p.key===c);a||(i=G({},t),a=true),i[c]=z(G({},o),{source:n?.source??null,deviceKey:c});}a&&i[s]?.deviceKey===void 0&&delete i[s];}}),a?i:t});}resolveAlternatorConfig(e){let r=e.alternator,t=this.normalizeOptionsById(r?.optionsById??r?.alternatorOptionsById);return {trackedDevices:this.normalizeTrackedDevices(r?.trackedDevices),optionsById:t,cardMode:this.normalizeCardMode(r?.cardMode)}}normalizeTrackedDevices(e){if(!Array.isArray(e))return [];let r=new Map;return e.forEach(t=>{if(!t||typeof t!="object")return;let i=t,a=this.normalizeOptionalString(i.id),l=this.normalizeOptionalString(i.source);if(!a||!l)return;let s=this.normalizeOptionalString(i.key)??`${a}||${l}`;r.set(s,{id:a,source:l,key:s});}),[...r.values()].sort((t,i)=>t.key.localeCompare(i.key))}buildIdToDeviceKeysMap(){let e=new Map;return this.trackedDevices().forEach(r=>{let t=e.get(r.id)??[];t.push(r.key),e.set(r.id,t);}),e}normalizeCardMode(e){let r=e&&typeof e=="object"?e:null;if(!r)return {displayMode:"full",metrics:["voltage","current","power","revolutions"]};let t=this.normalizeStringList(r?.metrics);return {displayMode:r?.displayMode==="compact"?"compact":"full",metrics:t.length?t:["voltage","current","power","revolutions"]}}normalizeStringList(e){if(!Array.isArray(e))return [];let r=new Set;return e.forEach(t=>{if(typeof t!="string")return;let i=t.trim();i.length>0&&r.add(i);}),[...r].sort((t,i)=>t.localeCompare(i))}normalizeOptionsById(e){if(!e||typeof e!="object")return {};let r={};return Object.entries(e).forEach(([t])=>{let i=this.normalizeOptionalString(t);i&&(r[i]={});}),r}normalizeOptionalString(e){if(typeof e!="string")return null;let r=e.trim();return r.length>0?r:null}enqueuePathUpdate(e,r=false){let t=this.parsePath(e.path);if(!t)return;let i=e.update?.data?.value??null,a=e.update?.state??null,l=`${t.id}::${t.key}`;if(this.pendingPathUpdates.set(l,{id:t.id,key:t.key,value:i,state:a}),!r){if(!this.initialPathPaintDone){this.initialPathPaintDone=true,this.flushPendingPathUpdates();return}this.pathBatchTimerId===null&&(this.pathBatchTimerId=window.setTimeout(()=>{this.pathBatchTimerId=null,this.flushPendingPathUpdates();},d.PATH_BATCH_WINDOW_MS));}}parsePath(e){let r=e.match(d.PATH_REGEX);return r?{id:r[1],key:r[2]}:null}flushPendingPathUpdates(){if(!this.pendingPathUpdates.size)return;let e=Array.from(this.pendingPathUpdates.values());this.pendingPathUpdates.clear(),new Set(e.map(i=>i.id)).forEach(i=>this.trackDiscoveredAlternator(i));let t=this.buildIdToDeviceKeysMap();this.alternatorsByKey.update(i=>{let a=i,l=false;for(let s of e){let o=t.get(s.id),c=o?.length?o:[s.id];for(let n of c){let p=!!o?.length,T=p?this.trackedDevices().find(Q=>Q.key===n):null,C=a[n]??{id:s.id,source:T?.source??null,deviceKey:p?n:void 0},u=G({},C);if(!this.applyValue(u,s.key,s.value,s.state))continue;let D=u.rawPower!=null?u.rawPower:u.voltage!=null&&u.current!=null?u.voltage*u.current:null;D!=null?u.power=Number.isFinite(D)?D:null:u.power=null,u.rawPower==null&&(u.powerState=this.resolveMostSevereState(u.voltageState??null,u.currentState??null)),l||(a=G({},a),l=true),a[n]=u;}}return l?a:i});}trackDiscoveredAlternator(e){let r=this.discoveredAlternatorIds();r.includes(e)||this.discoveredAlternatorIds.set([...r,e].sort((t,i)=>t.localeCompare(i)));}applyValue(e,r,t,i){switch(r){case "name":return this.setValue(e,"name",this.toStringValue(t));case "location":return this.setValue(e,"location",this.toStringValue(t));case "associatedBus":return this.setValue(e,"associatedBus",this.toStringValue(t));case "chargingMode":return this.setMetricValue(e,"chargingMode","chargingModeState",this.toStringValue(t),i);case "voltage":return this.setMetricValue(e,"voltage","voltageState",this.toNumber(t,"V"),i);case "current":return this.setMetricValue(e,"current","currentState",this.toNumber(t,"A"),i);case "power":case "realPower":return this.setMetricValue(e,"rawPower","powerState",this.toNumber(t,"W"),i);case "temperature":return this.setMetricValue(e,"temperature","temperatureState",this.toNumber(t,this.units.getDefaults().Temperature),i);case "revolutions":return this.setMetricValue(e,"revolutions","revolutionsState",this.toNumber(t,"Hz"),i);case "fieldDrive":return this.setMetricValue(e,"fieldDrive","fieldDriveState",this.toNumber(t,"%"),i);case "regulatorTemperature":return this.setMetricValue(e,"regulatorTemperature","regulatorTemperatureState",this.toNumber(t,this.units.getDefaults().Temperature),i);case "setpointVoltage":return this.setMetricValue(e,"setpointVoltage","setpointVoltageState",this.toNumber(t,"V"),i);case "setpointCurrent":return this.setMetricValue(e,"setpointCurrent","setpointCurrentState",this.toNumber(t,"A"),i);default:return false}}setValue(e,r,t){return Object.is(e[r],t)?false:(e[r]=t,true)}setMetricValue(e,r,t,i,a){let l=!Object.is(e[r],i),s=!Object.is(e[t],a);return !l&&!s?false:(e[r]=i,e[t]=a,true)}requestRender(e){let r=this.widgetColors();!this.svg||!r||(this.pendingRenderSnapshot=e??{alternators:this.visibleAlternators(),displayModels:this.displayModels(),widgetColors:r},this.renderFrameId===null&&(this.renderFrameId=requestAnimationFrame(()=>{this.renderFrameId=null;let t=this.pendingRenderSnapshot;this.pendingRenderSnapshot=null,t&&this.render(t);})));}render(e){if(!this.layer||!this.svg)return;let r=this.isCompactCardMode(),t=r?C:e$1,i=r?d.COMPACT_CARD_HEIGHT:d.CARD_HEIGHT,a=e.alternators.map((n,p)=>({key:n.deviceKey??n.id,alternator:n,y:p*(i+d.CARD_GAP)})),l=a.length?a[a.length-1].y+i:i;this.svg.attr("viewBox",`0 0 ${d.VIEWBOX_WIDTH} ${l}`);let s=this.layer.selectAll("g.alternator-card").data(a,n=>n.key),o=s.enter().append("g").attr("class","alternator-card");o.append("rect").attr("class","alternator-card-bg"),o.append("rect").attr("class","alternator-state-bar"),o.append("text").attr("class","alternator-title"),o.append("text").attr("class","alternator-id"),o.append("text").attr("class","alternator-mode"),o.append("text").attr("class","alternator-bus"),o.append("text").attr("class","alternator-metrics-1"),o.append("text").attr("class","alternator-metrics-2");let c=o.merge(s);c.attr("transform",n=>`translate(0, ${n.y})`),c.select("rect.alternator-card-bg").attr("x",.5).attr("y",.5).attr("rx",t.cardCornerRadius).attr("ry",t.cardCornerRadius).attr("width",d.VIEWBOX_WIDTH-1).attr("height",i-1).attr("stroke","var(--mat-sys-outline-variant)").attr("stroke-width",.5).attr("fill","none"),c.select("rect.alternator-state-bar").attr("x",1.5).attr("y",1.5).attr("rx",t.stateBarCornerRadius).attr("ry",t.stateBarCornerRadius).attr("width",3).attr("height",i-3).attr("fill",n=>e.displayModels[n.key]?.stateBarColor??e.widgetColors.dim),e.alternators.length>1?c.select("text.alternator-title").attr("x",t.titleX).attr("y",t.titleY).attr("font-size",t.titleFontSize).attr("fill",n=>e.displayModels[n.key]?.titleTextColor??"var(--kip-contrast-color)").text(n=>e.displayModels[n.key]?.titleText??this.resolveTitleText(n.alternator)):c.select("text.alternator-title").text(""),c.select("text.alternator-id").attr("x",t.idX).attr("y",t.idY).attr("text-anchor","end").attr("font-size",t.idFontSize).attr("fill","var(--kip-contrast-dim-color)").text(n=>n.alternator.id),c.select("text.alternator-mode").attr("x",t.metaLeftX).attr("y",t.metaY).attr("font-size",t.metaFontSize).attr("opacity",.8).attr("fill",n=>e.displayModels[n.key]?.metaTextColor??"var(--kip-contrast-dim-color)").text(n=>e.displayModels[n.key]?.modeText??""),c.select("text.alternator-bus").attr("x",t.metaRightX).attr("y",t.metaY).attr("text-anchor","end").attr("font-size",t.metaFontSize).attr("opacity",.8).attr("fill",n=>e.displayModels[n.key]?.metaTextColor??"var(--kip-contrast-dim-color)").text(n=>e.displayModels[n.key]?.busText??""),c.select("text.alternator-metrics-1").attr("x",t.lineOneX).attr("y",t.lineOneY).attr("font-size",t.lineOneFontSize).attr("fill",n=>e.displayModels[n.key]?.primaryMetricsTextColor??"var(--kip-contrast-color)").text(n=>e.displayModels[n.key]?.metricsLineOne??""),c.select("text.alternator-metrics-2").attr("x",t.lineTwoX).attr("y",t.lineTwoY).attr("font-size",t.lineTwoFontSize).attr("opacity",.85).attr("fill",n=>e.displayModels[n.key]?.secondaryMetricsTextColor??"var(--kip-contrast-color)").text(n=>e.displayModels[n.key]?.metricsLineTwo??""),s.exit().remove();}displayName(e){return e.name?.trim()||e.id}resolveTitleText(e){return e.name||`Alternator ${e.id}`}resolveModeText(e){return e.chargingMode?`Mode ${e.chargingMode}`:e.fieldDrive!=null?`Field ${e.fieldDrive.toFixed(0)} %`:"Mode -"}buildMetricRows(e){let r=this.cardMode();if(this.activeDisplayMode()==="full")return [`V ${this.formatValue(e.voltage,"V")} A ${this.formatValue(e.current,"A")}`,`P ${this.formatValue(e.power,"W")} RPM ${this.formatRevolutions(e.revolutions)}`];let t=r.metrics.map(l=>this.toMetricLabel(l,e)).filter(l=>!!l);if(!t.length)return ["V - A -","P - RPM -"];let i=t.slice(0,2).join(" "),a=t.slice(2,4).join(" ");return [i||" ",a||" "]}toMetricLabel(e,r){switch(e){case "voltage":return `V ${this.formatValue(r.voltage,"V")}`;case "current":return `A ${this.formatValue(r.current,"A")}`;case "power":return `P ${this.formatValue(r.power,"W")}`;case "temperature":return `T ${this.formatTemperature(r.temperature)}`;case "revolutions":return `RPM ${this.formatRevolutions(r.revolutions)}`;case "fieldDrive":return `FD ${this.formatPercent(r.fieldDrive)}`;case "regulatorTemperature":return `RT ${this.formatTemperature(r.regulatorTemperature)}`;default:return null}}formatValue(e,r){return e==null||Number.isNaN(e)?"-":`${e.toFixed(1)} ${r}`}formatTemperature(e){return e==null||Number.isNaN(e)?"-":`${e.toFixed(1)} ${this.units.getDefaults().Temperature==="celsius"?"\xB0C":"\xB0F"}`}formatRevolutions(e){return e==null||Number.isNaN(e)?"-":Math.round(e*60).toString()}formatPercent(e){return e==null||Number.isNaN(e)?"-":`${e.toFixed(0)} %`}toStringValue(e){return typeof e=="string"?e:null}resolveMostSevereState(...e){return e.some(r=>r===n$1.Alert)?n$1.Alert:e.some(r=>r===n$1.Alarm)?n$1.Alarm:e.some(r=>r===n$1.Warn)?n$1.Warn:e.some(r=>r===n$1.Normal)?n$1.Normal:null}toNumber(e,r){if(e==null||typeof e=="boolean")return null;let t=typeof e=="number"?e:Number(e);if(!Number.isFinite(t))return null;let i=this.units.convertToUnit(r,t);return Number.isFinite(i)?i:t}static \u0275fac=function(r){return new(r||d)};static \u0275cmp=JD({type:d,selectors:[["widget-alternator"]],viewQuery:function(r,t){r&1&&eg(t.svgRef,ie,5),r&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"],renderMode:[1,"renderMode"]},decls:4,vars:3,consts:[["alternatorSvg",""],[3,"text","color"],["aria-hidden","false",1,"alternator-svg"],[1,"alternator-empty"],[1,"alternator-empty-title"],[1,"alternator-empty-sub"]],template:function(r,t){r&1&&($h(0,"widget-title",1),wd(),$h(1,"svg",2,0),_w(3,oe,5,0,"div",3)),r&2&&(Bh("text",t.displayLabel())("color",t.labelColor()),EE(3),Mw(t.hasAlternators()?-1:3));},dependencies:[x],styles:["[_nghost-%COMP%]{display:block;height:100%;width:100%;position:relative;overflow:hidden}.alternator-svg[_ngcontent-%COMP%]{display:block;position:absolute;left:0;right:0;top:15%;height:85%;width:100%;overflow:hidden;z-index:20;padding:0 10px 10px}.alternator-empty[_ngcontent-%COMP%]{position:absolute;inset:0;margin:10px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;text-align:center;color:var(--mat-sys-on-surface);background:color-mix(in srgb,var(--kip-widget-card-background-color) 92%,transparent)}.alternator-empty-title[_ngcontent-%COMP%]{font-size:18px;font-weight:600}.alternator-empty-sub[_ngcontent-%COMP%]{font-size:14px;opacity:.8}"]})};export{Z as WidgetAlternatorComponent};
1
+ import {C,e as e$1}from'./chunk-DJVnrrxC.js';import {g as ge$1}from'./chunk-TakPRI3t.js';import {e9 as a,d1 as Hj,w,du as p,aS as De,bu as ut,aY as xe,$ as $j,v as vt,D as Dt,F as Fa,dn as ge,a_ as Gp,cv as G,cw as z,dx as n$1,J as JD,dC as x,c as $h,cn as wd,_ as _w,B as Bh,e as EE,M as Mw,f as eg,K as Kw,P as Pi,T as TT,u as ul}from'./main-IINF7HD6.js';import {c,e}from'./chunk-DHj2hm9r.js';var ie=["alternatorSvg"];function oe(d,e){d&1&&(Pi(0,"div",3)(1,"div",4),TT(2,"No alternators detected"),ul(),Pi(3,"div",5),TT(4,"Check Signal K alternator paths or select alternators in widget settings."),ul()());}function ne(d){return d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var Z=class d{static ALTERNATOR_DESCRIPTOR=a("widget-alternator");static SELF_ROOT_PATH=(()=>{let e=d.ALTERNATOR_DESCRIPTOR?.selfRootPath;if(!e)throw new Error("[WidgetAlternatorComponent] Descriptor missing or selfRootPath not set; check widget registration.");return e})();static ROOT_PATTERN=`${d.SELF_ROOT_PATH}.*`;static PATH_REGEX=new RegExp(`^${ne(d.SELF_ROOT_PATH)}\\.([^.]+)\\.(.+)$`);static VIEWBOX_WIDTH=200;static CARD_HEIGHT=100;static COMPACT_CARD_HEIGHT=100;static CARD_GAP=8;static PATH_BATCH_WINDOW_MS=500;static DEFAULT_CONFIG={color:"contrast",ignoreZones:false,alternator:{trackedDevices:[],optionsById:{}}};id=Hj.required();type=Hj.required();theme=Hj.required();renderMode=Hj(null);runtime=w(p);data=w(De);units=w(ut);destroyRef=w(xe);svgRef=$j.required("alternatorSvg");svg;layer;pendingPathUpdates=new Map;pathBatchTimerId=null;initialPathPaintDone=false;renderFrameId=null;pendingRenderSnapshot=null;discoveredAlternatorIds=vt([]);trackedDevices=vt([]);optionsById=vt({});cardMode=vt({displayMode:"full",metrics:["voltage","current","power","revolutions"]});alternatorsByKey=vt({});visibleAlternatorKeys=Dt(()=>{let e=this.trackedDevices();if(e.length)return e.map(i=>i.key);let r=this.alternatorsByKey(),t=new Set(this.discoveredAlternatorIds());return Object.keys(r).filter(i=>{let a=r[i];return !!a&&t.has(a.id)}).sort((i,a)=>i.localeCompare(a))});visibleAlternators=Dt(()=>{let e=this.visibleAlternatorKeys(),r=this.alternatorsByKey();return e.map(t=>r[t]).filter(t=>!!t)});hasAlternators=Dt(()=>this.visibleAlternators().length>0);activeDisplayMode=Dt(()=>this.renderMode()??this.cardMode().displayMode??"full");isCompactCardMode=Dt(()=>this.activeDisplayMode()==="compact");colorRole=Dt(()=>this.runtime.options()?.color??"contrast");ignoreZones=Dt(()=>this.runtime.options()?.ignoreZones??false);displayLabel=Dt(()=>{let e=this.visibleAlternators();return e.length!==1?"Alternators":this.resolveTitleText(e[0])});labelColor=Dt(()=>{let e=this.theme();return e?c(this.colorRole(),e).dim:"var(--kip-contrast-dim-color)"});widgetColors=Dt(()=>{let e=this.theme();return e?c(this.colorRole(),e):null});displayModels=Dt(()=>{let e$1=this.visibleAlternators(),r=this.theme(),t=this.widgetColors(),i=this.ignoreZones(),a=new Map;e$1.forEach(o=>a.set(o.id,(a.get(o.id)??0)+1));let l=new Set([...a.entries()].filter(([,o])=>o>1).map(([o])=>o)),s={};for(let o of e$1){let c=o.deviceKey??o.id,n=!!o.source&&l.has(o.id),p=this.resolveMostSevereState(o.powerState??null,o.currentState??null,o.voltageState??null,o.temperatureState??null,o.chargingModeState??null,o.revolutionsState??null,o.fieldDriveState??null,o.regulatorTemperatureState??null),T=this.resolveMostSevereState(o.voltageState??null,o.currentState??null),C=this.resolveMostSevereState(o.powerState??null,o.revolutionsState??null,o.temperatureState??null,o.regulatorTemperatureState??null),[u,I]=this.buildMetricRows(o);s[c]={id:o.id,titleText:this.resolveTitleText(o),modeText:this.isCompactCardMode()?"":this.resolveModeText(o),busText:this.isCompactCardMode()?"":n?o.source??"-":o.associatedBus||o.location||"-",metricsLineOne:u,metricsLineTwo:I,stateBarColor:e(p,t?.dim??"var(--kip-contrast-color)",r,i),titleTextColor:e(p,"var(--kip-contrast-color)",r,i),metaTextColor:e(this.resolveMostSevereState(o.chargingModeState??null,o.fieldDriveState??null),"var(--kip-contrast-dim-color)",r,i),primaryMetricsTextColor:e(T,"var(--kip-contrast-color)",r,i),secondaryMetricsTextColor:e(C,"var(--kip-contrast-color)",r,i)};}return s});constructor(){Fa(()=>{let t=this.runtime.options();t&&ge(()=>this.applyConfig(t));}),Fa(()=>{let t=this.displayModels(),i=this.visibleAlternators(),a=this.widgetColors();!this.svg||!a||this.requestRender({alternators:i,displayModels:t,widgetColors:a});});let e=[this.data.subscribePathTreeWithInitial(d.ROOT_PATTERN)],r=false;for(let t of e)if(t.initial.length){r=true;for(let i of t.initial)this.enqueuePathUpdate(i,true);}r&&(this.flushPendingPathUpdates(),this.initialPathPaintDone=true);for(let t of e)t.live$.pipe(Gp(this.destroyRef)).subscribe(i=>{this.enqueuePathUpdate(i);});}ngAfterViewInit(){this.initializeSvg(),this.requestRender();}ngOnDestroy(){this.pathBatchTimerId!==null&&(clearTimeout(this.pathBatchTimerId),this.pathBatchTimerId=null),this.renderFrameId!==null&&(cancelAnimationFrame(this.renderFrameId),this.renderFrameId=null),this.pendingRenderSnapshot=null;}initializeSvg(){this.svg=ge$1(this.svgRef().nativeElement),this.svg.attr("viewBox",`0 0 ${d.VIEWBOX_WIDTH} ${d.CARD_HEIGHT}`).attr("preserveAspectRatio","xMidYMid meet").attr("role","img").attr("aria-label","Alternator View"),this.layer=this.svg.append("g").attr("class","alternator-layer");}applyConfig(e){let r=this.resolveAlternatorConfig(e);this.trackedDevices.set(r.trackedDevices??[]),this.reprojectSnapshotsToDeviceKeys(r.trackedDevices??[]),this.optionsById.set(r.optionsById),this.cardMode.set(this.normalizeCardMode(r.cardMode));}reprojectSnapshotsToDeviceKeys(e){if(!e.length)return;let r=new Map;e.forEach(t=>{let i=r.get(t.id)??[];i.push(t.key),r.set(t.id,i);}),this.alternatorsByKey.update(t=>{let i=t,a=false;return r.forEach((l,s)=>{let o=t[s];if(o){for(let c of l){if(t[c])continue;let n=e.find(p=>p.key===c);a||(i=G({},t),a=true),i[c]=z(G({},o),{source:n?.source??null,deviceKey:c});}a&&i[s]?.deviceKey===void 0&&delete i[s];}}),a?i:t});}resolveAlternatorConfig(e){let r=e.alternator,t=this.normalizeOptionsById(r?.optionsById??r?.alternatorOptionsById);return {trackedDevices:this.normalizeTrackedDevices(r?.trackedDevices),optionsById:t,cardMode:this.normalizeCardMode(r?.cardMode)}}normalizeTrackedDevices(e){if(!Array.isArray(e))return [];let r=new Map;return e.forEach(t=>{if(!t||typeof t!="object")return;let i=t,a=this.normalizeOptionalString(i.id),l=this.normalizeOptionalString(i.source);if(!a||!l)return;let s=this.normalizeOptionalString(i.key)??`${a}||${l}`;r.set(s,{id:a,source:l,key:s});}),[...r.values()].sort((t,i)=>t.key.localeCompare(i.key))}buildIdToDeviceKeysMap(){let e=new Map;return this.trackedDevices().forEach(r=>{let t=e.get(r.id)??[];t.push(r.key),e.set(r.id,t);}),e}normalizeCardMode(e){let r=e&&typeof e=="object"?e:null;if(!r)return {displayMode:"full",metrics:["voltage","current","power","revolutions"]};let t=this.normalizeStringList(r?.metrics);return {displayMode:r?.displayMode==="compact"?"compact":"full",metrics:t.length?t:["voltage","current","power","revolutions"]}}normalizeStringList(e){if(!Array.isArray(e))return [];let r=new Set;return e.forEach(t=>{if(typeof t!="string")return;let i=t.trim();i.length>0&&r.add(i);}),[...r].sort((t,i)=>t.localeCompare(i))}normalizeOptionsById(e){if(!e||typeof e!="object")return {};let r={};return Object.entries(e).forEach(([t])=>{let i=this.normalizeOptionalString(t);i&&(r[i]={});}),r}normalizeOptionalString(e){if(typeof e!="string")return null;let r=e.trim();return r.length>0?r:null}enqueuePathUpdate(e,r=false){let t=this.parsePath(e.path);if(!t)return;let i=e.update?.data?.value??null,a=e.update?.state??null,l=`${t.id}::${t.key}`;if(this.pendingPathUpdates.set(l,{id:t.id,key:t.key,value:i,state:a}),!r){if(!this.initialPathPaintDone){this.initialPathPaintDone=true,this.flushPendingPathUpdates();return}this.pathBatchTimerId===null&&(this.pathBatchTimerId=window.setTimeout(()=>{this.pathBatchTimerId=null,this.flushPendingPathUpdates();},d.PATH_BATCH_WINDOW_MS));}}parsePath(e){let r=e.match(d.PATH_REGEX);return r?{id:r[1],key:r[2]}:null}flushPendingPathUpdates(){if(!this.pendingPathUpdates.size)return;let e=Array.from(this.pendingPathUpdates.values());this.pendingPathUpdates.clear(),new Set(e.map(i=>i.id)).forEach(i=>this.trackDiscoveredAlternator(i));let t=this.buildIdToDeviceKeysMap();this.alternatorsByKey.update(i=>{let a=i,l=false;for(let s of e){let o=t.get(s.id),c=o?.length?o:[s.id];for(let n of c){let p=!!o?.length,T=p?this.trackedDevices().find(Q=>Q.key===n):null,C=a[n]??{id:s.id,source:T?.source??null,deviceKey:p?n:void 0},u=G({},C);if(!this.applyValue(u,s.key,s.value,s.state))continue;let D=u.rawPower!=null?u.rawPower:u.voltage!=null&&u.current!=null?u.voltage*u.current:null;D!=null?u.power=Number.isFinite(D)?D:null:u.power=null,u.rawPower==null&&(u.powerState=this.resolveMostSevereState(u.voltageState??null,u.currentState??null)),l||(a=G({},a),l=true),a[n]=u;}}return l?a:i});}trackDiscoveredAlternator(e){let r=this.discoveredAlternatorIds();r.includes(e)||this.discoveredAlternatorIds.set([...r,e].sort((t,i)=>t.localeCompare(i)));}applyValue(e,r,t,i){switch(r){case "name":return this.setValue(e,"name",this.toStringValue(t));case "location":return this.setValue(e,"location",this.toStringValue(t));case "associatedBus":return this.setValue(e,"associatedBus",this.toStringValue(t));case "chargingMode":return this.setMetricValue(e,"chargingMode","chargingModeState",this.toStringValue(t),i);case "voltage":return this.setMetricValue(e,"voltage","voltageState",this.toNumber(t,"V"),i);case "current":return this.setMetricValue(e,"current","currentState",this.toNumber(t,"A"),i);case "power":case "realPower":return this.setMetricValue(e,"rawPower","powerState",this.toNumber(t,"W"),i);case "temperature":return this.setMetricValue(e,"temperature","temperatureState",this.toNumber(t,this.units.getDefaults().Temperature),i);case "revolutions":return this.setMetricValue(e,"revolutions","revolutionsState",this.toNumber(t,"Hz"),i);case "fieldDrive":return this.setMetricValue(e,"fieldDrive","fieldDriveState",this.toNumber(t,"%"),i);case "regulatorTemperature":return this.setMetricValue(e,"regulatorTemperature","regulatorTemperatureState",this.toNumber(t,this.units.getDefaults().Temperature),i);case "setpointVoltage":return this.setMetricValue(e,"setpointVoltage","setpointVoltageState",this.toNumber(t,"V"),i);case "setpointCurrent":return this.setMetricValue(e,"setpointCurrent","setpointCurrentState",this.toNumber(t,"A"),i);default:return false}}setValue(e,r,t){return Object.is(e[r],t)?false:(e[r]=t,true)}setMetricValue(e,r,t,i,a){let l=!Object.is(e[r],i),s=!Object.is(e[t],a);return !l&&!s?false:(e[r]=i,e[t]=a,true)}requestRender(e){let r=this.widgetColors();!this.svg||!r||(this.pendingRenderSnapshot=e??{alternators:this.visibleAlternators(),displayModels:this.displayModels(),widgetColors:r},this.renderFrameId===null&&(this.renderFrameId=requestAnimationFrame(()=>{this.renderFrameId=null;let t=this.pendingRenderSnapshot;this.pendingRenderSnapshot=null,t&&this.render(t);})));}render(e){if(!this.layer||!this.svg)return;let r=this.isCompactCardMode(),t=r?C:e$1,i=r?d.COMPACT_CARD_HEIGHT:d.CARD_HEIGHT,a=e.alternators.map((n,p)=>({key:n.deviceKey??n.id,alternator:n,y:p*(i+d.CARD_GAP)})),l=a.length?a[a.length-1].y+i:i;this.svg.attr("viewBox",`0 0 ${d.VIEWBOX_WIDTH} ${l}`);let s=this.layer.selectAll("g.alternator-card").data(a,n=>n.key),o=s.enter().append("g").attr("class","alternator-card");o.append("rect").attr("class","alternator-card-bg"),o.append("rect").attr("class","alternator-state-bar"),o.append("text").attr("class","alternator-title"),o.append("text").attr("class","alternator-id"),o.append("text").attr("class","alternator-mode"),o.append("text").attr("class","alternator-bus"),o.append("text").attr("class","alternator-metrics-1"),o.append("text").attr("class","alternator-metrics-2");let c=o.merge(s);c.attr("transform",n=>`translate(0, ${n.y})`),c.select("rect.alternator-card-bg").attr("x",.5).attr("y",.5).attr("rx",t.cardCornerRadius).attr("ry",t.cardCornerRadius).attr("width",d.VIEWBOX_WIDTH-1).attr("height",i-1).attr("stroke","var(--mat-sys-outline-variant)").attr("stroke-width",.5).attr("fill","none"),c.select("rect.alternator-state-bar").attr("x",1.5).attr("y",1.5).attr("rx",t.stateBarCornerRadius).attr("ry",t.stateBarCornerRadius).attr("width",3).attr("height",i-3).attr("fill",n=>e.displayModels[n.key]?.stateBarColor??e.widgetColors.dim),e.alternators.length>1?c.select("text.alternator-title").attr("x",t.titleX).attr("y",t.titleY).attr("font-size",t.titleFontSize).attr("fill",n=>e.displayModels[n.key]?.titleTextColor??"var(--kip-contrast-color)").text(n=>e.displayModels[n.key]?.titleText??this.resolveTitleText(n.alternator)):c.select("text.alternator-title").text(""),c.select("text.alternator-id").attr("x",t.idX).attr("y",t.idY).attr("text-anchor","end").attr("font-size",t.idFontSize).attr("fill","var(--kip-contrast-dim-color)").text(n=>n.alternator.id),c.select("text.alternator-mode").attr("x",t.metaLeftX).attr("y",t.metaY).attr("font-size",t.metaFontSize).attr("opacity",.8).attr("fill",n=>e.displayModels[n.key]?.metaTextColor??"var(--kip-contrast-dim-color)").text(n=>e.displayModels[n.key]?.modeText??""),c.select("text.alternator-bus").attr("x",t.metaRightX).attr("y",t.metaY).attr("text-anchor","end").attr("font-size",t.metaFontSize).attr("opacity",.8).attr("fill",n=>e.displayModels[n.key]?.metaTextColor??"var(--kip-contrast-dim-color)").text(n=>e.displayModels[n.key]?.busText??""),c.select("text.alternator-metrics-1").attr("x",t.lineOneX).attr("y",t.lineOneY).attr("font-size",t.lineOneFontSize).attr("fill",n=>e.displayModels[n.key]?.primaryMetricsTextColor??"var(--kip-contrast-color)").text(n=>e.displayModels[n.key]?.metricsLineOne??""),c.select("text.alternator-metrics-2").attr("x",t.lineTwoX).attr("y",t.lineTwoY).attr("font-size",t.lineTwoFontSize).attr("opacity",.85).attr("fill",n=>e.displayModels[n.key]?.secondaryMetricsTextColor??"var(--kip-contrast-color)").text(n=>e.displayModels[n.key]?.metricsLineTwo??""),s.exit().remove();}displayName(e){return e.name?.trim()||e.id}resolveTitleText(e){return e.name||`Alternator ${e.id}`}resolveModeText(e){return e.chargingMode?`Mode ${e.chargingMode}`:e.fieldDrive!=null?`Field ${e.fieldDrive.toFixed(0)} %`:"Mode -"}buildMetricRows(e){let r=this.cardMode();if(this.activeDisplayMode()==="full")return [`V ${this.formatValue(e.voltage,"V")} A ${this.formatValue(e.current,"A")}`,`P ${this.formatValue(e.power,"W")} RPM ${this.formatRevolutions(e.revolutions)}`];let t=r.metrics.map(l=>this.toMetricLabel(l,e)).filter(l=>!!l);if(!t.length)return ["V - A -","P - RPM -"];let i=t.slice(0,2).join(" "),a=t.slice(2,4).join(" ");return [i||" ",a||" "]}toMetricLabel(e,r){switch(e){case "voltage":return `V ${this.formatValue(r.voltage,"V")}`;case "current":return `A ${this.formatValue(r.current,"A")}`;case "power":return `P ${this.formatValue(r.power,"W")}`;case "temperature":return `T ${this.formatTemperature(r.temperature)}`;case "revolutions":return `RPM ${this.formatRevolutions(r.revolutions)}`;case "fieldDrive":return `FD ${this.formatPercent(r.fieldDrive)}`;case "regulatorTemperature":return `RT ${this.formatTemperature(r.regulatorTemperature)}`;default:return null}}formatValue(e,r){return e==null||Number.isNaN(e)?"-":`${e.toFixed(1)} ${r}`}formatTemperature(e){return e==null||Number.isNaN(e)?"-":`${e.toFixed(1)} ${this.units.getDefaults().Temperature==="celsius"?"\xB0C":"\xB0F"}`}formatRevolutions(e){return e==null||Number.isNaN(e)?"-":Math.round(e*60).toString()}formatPercent(e){return e==null||Number.isNaN(e)?"-":`${e.toFixed(0)} %`}toStringValue(e){return typeof e=="string"?e:null}resolveMostSevereState(...e){return e.some(r=>r===n$1.Alert)?n$1.Alert:e.some(r=>r===n$1.Alarm)?n$1.Alarm:e.some(r=>r===n$1.Warn)?n$1.Warn:e.some(r=>r===n$1.Normal)?n$1.Normal:null}toNumber(e,r){if(e==null||typeof e=="boolean")return null;let t=typeof e=="number"?e:Number(e);if(!Number.isFinite(t))return null;let i=this.units.convertToUnit(r,t);return Number.isFinite(i)?i:t}static \u0275fac=function(r){return new(r||d)};static \u0275cmp=JD({type:d,selectors:[["widget-alternator"]],viewQuery:function(r,t){r&1&&eg(t.svgRef,ie,5),r&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"],renderMode:[1,"renderMode"]},decls:4,vars:3,consts:[["alternatorSvg",""],[3,"text","color"],["aria-hidden","false",1,"alternator-svg"],[1,"alternator-empty"],[1,"alternator-empty-title"],[1,"alternator-empty-sub"]],template:function(r,t){r&1&&($h(0,"widget-title",1),wd(),$h(1,"svg",2,0),_w(3,oe,5,0,"div",3)),r&2&&(Bh("text",t.displayLabel())("color",t.labelColor()),EE(3),Mw(t.hasAlternators()?-1:3));},dependencies:[x],styles:["[_nghost-%COMP%]{display:block;height:100%;width:100%;position:relative;overflow:hidden}.alternator-svg[_ngcontent-%COMP%]{display:block;position:absolute;left:0;right:0;top:15%;height:85%;width:100%;overflow:hidden;z-index:20;padding:0 10px 10px}.alternator-empty[_ngcontent-%COMP%]{position:absolute;inset:0;margin:10px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;text-align:center;color:var(--mat-sys-on-surface);background:color-mix(in srgb,var(--kip-widget-card-background-color) 92%,transparent)}.alternator-empty-title[_ngcontent-%COMP%]{font-size:18px;font-weight:600}.alternator-empty-sub[_ngcontent-%COMP%]{font-size:14px;opacity:.8}"]})};export{Z as WidgetAlternatorComponent};
@@ -1 +1 @@
1
- import {d1 as Hj,w,du as p,dv as rt,$ as $j,aZ as R$1,v as vt,D as Dt,F as Fa,dn as ge,dS as Da,J as JD,cp as Uh,f as eg,K as Kw}from'./main-F7NMHHV4.js';import {c}from'./chunk-CRy9Da7a.js';var x=["canvasMainRef"],R=(()=>{class s{id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p);streams=w(rt);static DEFAULT_CONFIG={displayName:"Time Label",filterSelfPaths:true,paths:{gaugePath:{description:"Date / Time",path:null,source:null,pathType:"Date",isPathConfigurable:true,sampleTime:1e3}},dateFormat:"dd/MM/yyyy HH:mm:ss",dateTimezone:"Atlantic/Azores",color:"contrast",enableTimeout:false,dataTimeout:5};canvasMainRef=$j.required("canvasMainRef");canvasElement;canvasCtx=null;titleBitmap=null;titleBitmapText=null;titleBitmapColor=null;canvas=w(R$1);cssWidth=0;cssHeight=0;dataValue=vt(null);_timeZoneGTM="";isDestroyed=false;labelColor=vt("");valueColor="";maxTextWidth=0;maxTextHeight=0;displayName=Dt(()=>this.runtime.options()?.displayName??"Time Label");dateFormat=Dt(()=>this.runtime.options()?.dateFormat??"dd/MM/yyyy HH:mm:ss");dateTimezone=Dt(()=>this.runtime.options()?.dateTimezone??"System Timezone -");constructor(){Fa(()=>{let e=this.runtime.options(),t=this.theme();!e||!t||ge(()=>{this.applyColors(),e.paths?.gaugePath?.path&&(this._timeZoneGTM=this.getGMTOffset(this.dateTimezone()),this.streams.observe("gaugePath",a=>{this.dataValue.set(a?.data?.value??null),this.drawWidget();}));});}),Fa(()=>{let e=this.theme(),t=this.runtime.options();!e||!t||ge(()=>{this.applyColors(),this.drawWidget();});});}ngAfterViewInit(){this.canvasElement=this.canvasMainRef().nativeElement,this.canvasCtx=this.canvasElement.getContext("2d"),this.canvas.registerCanvas(this.canvasElement,{autoRelease:true,onResize:(e,t)=>{this.cssWidth=e,this.cssHeight=t,this.maxTextWidth=Math.floor(this.cssWidth*.85),this.maxTextHeight=Math.floor(this.cssHeight*.7),this.drawWidget();}}),!this.isDestroyed&&(this.cssHeight=Math.floor(this.canvasElement.getBoundingClientRect().height),this.cssWidth=Math.floor(this.canvasElement.getBoundingClientRect().width),this.maxTextWidth=Math.floor(this.canvasElement.width*.85),this.maxTextHeight=Math.floor(this.canvasElement.height*.7),this.applyColors(),this.drawWidget());}getGMTOffset(e){try{if(e==="System Timezone -")return "";let a=new Intl.DateTimeFormat("en-US",{timeZone:e,timeZoneName:"short"}).formatToParts(new Date).find(M=>M.type==="timeZoneName");return a?a.value:"GMT"}catch(t){return console.error(`Error getting GMT offset for timezone "${e}":`,t),"GMT"}}applyColors(){let e=this.runtime.options(),t=this.theme();!e||!t||(this.labelColor.set(c(e.color??"contrast",t).dim),this.valueColor=c(e.color??"contrast",t).color);}ngOnDestroy(){this.isDestroyed=true;try{this.canvas.unregisterCanvas(this.canvasElement);}catch(e){}}drawWidget(){if(!this.canvasCtx)return;let e=this.labelColor();(!this.titleBitmap||this.titleBitmap.width!==this.canvasElement.width||this.titleBitmap.height!==this.canvasElement.height||this.titleBitmapText!==`${this.displayName()}-${this.runtime.options()?.color??"contrast"}`||this.titleBitmapColor!==e)&&(this.titleBitmap=this.canvas.createTitleBitmap(this.displayName(),e,"normal",this.cssWidth,this.cssHeight),this.titleBitmapText=`${this.displayName()}-${this.runtime.options()?.color??"contrast"}`,this.titleBitmapColor=e),this.canvas.clearCanvas(this.canvasCtx,this.cssWidth,this.cssHeight),this.titleBitmap&&this.titleBitmap.width>0&&this.titleBitmap.height>0&&this.canvasCtx.drawImage(this.titleBitmap,0,0,this.cssWidth,this.cssHeight);let t,i=this.dataValue();if(!i||isNaN(Date.parse(i)))t="--";else try{t=Da(i,this.dateFormat(),"en-US",this._timeZoneGTM);}catch(a){t=String(a),console.log("[Date Time Widget]: "+String(a));}this.canvas.drawText(this.canvasCtx,t,Math.floor(this.cssWidth/2),Math.floor(this.cssHeight/2*1.15),this.maxTextWidth,this.maxTextHeight,"bold",this.valueColor);}static \u0275fac=function(t){return new(t||s)};static \u0275cmp=JD({type:s,selectors:[["widget-datetime"]],viewQuery:function(t,i){t&1&&eg(i.canvasMainRef,x,5),t&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:2,vars:0,consts:[["canvasMainRef",""],[1,"date-canvas"]],template:function(t,i){t&1&&Uh(0,"canvas",1,0);},styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%;overflow:hidden}.date-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;min-height:1px;display:block}"]})}return s})();export{R as WidgetDatetimeComponent};
1
+ import {d1 as Hj,w,du as p,dv as rt,$ as $j,aZ as R$1,v as vt,D as Dt,F as Fa,dn as ge,dS as Da,J as JD,cp as Uh,f as eg,K as Kw}from'./main-IINF7HD6.js';import {c}from'./chunk-DHj2hm9r.js';var x=["canvasMainRef"],R=(()=>{class s{id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p);streams=w(rt);static DEFAULT_CONFIG={displayName:"Time Label",filterSelfPaths:true,paths:{gaugePath:{description:"Date / Time",path:null,source:null,pathType:"Date",isPathConfigurable:true,sampleTime:1e3}},dateFormat:"dd/MM/yyyy HH:mm:ss",dateTimezone:"Atlantic/Azores",color:"contrast",enableTimeout:false,dataTimeout:5};canvasMainRef=$j.required("canvasMainRef");canvasElement;canvasCtx=null;titleBitmap=null;titleBitmapText=null;titleBitmapColor=null;canvas=w(R$1);cssWidth=0;cssHeight=0;dataValue=vt(null);_timeZoneGTM="";isDestroyed=false;labelColor=vt("");valueColor="";maxTextWidth=0;maxTextHeight=0;displayName=Dt(()=>this.runtime.options()?.displayName??"Time Label");dateFormat=Dt(()=>this.runtime.options()?.dateFormat??"dd/MM/yyyy HH:mm:ss");dateTimezone=Dt(()=>this.runtime.options()?.dateTimezone??"System Timezone -");constructor(){Fa(()=>{let e=this.runtime.options(),t=this.theme();!e||!t||ge(()=>{this.applyColors(),e.paths?.gaugePath?.path&&(this._timeZoneGTM=this.getGMTOffset(this.dateTimezone()),this.streams.observe("gaugePath",a=>{this.dataValue.set(a?.data?.value??null),this.drawWidget();}));});}),Fa(()=>{let e=this.theme(),t=this.runtime.options();!e||!t||ge(()=>{this.applyColors(),this.drawWidget();});});}ngAfterViewInit(){this.canvasElement=this.canvasMainRef().nativeElement,this.canvasCtx=this.canvasElement.getContext("2d"),this.canvas.registerCanvas(this.canvasElement,{autoRelease:true,onResize:(e,t)=>{this.cssWidth=e,this.cssHeight=t,this.maxTextWidth=Math.floor(this.cssWidth*.85),this.maxTextHeight=Math.floor(this.cssHeight*.7),this.drawWidget();}}),!this.isDestroyed&&(this.cssHeight=Math.floor(this.canvasElement.getBoundingClientRect().height),this.cssWidth=Math.floor(this.canvasElement.getBoundingClientRect().width),this.maxTextWidth=Math.floor(this.canvasElement.width*.85),this.maxTextHeight=Math.floor(this.canvasElement.height*.7),this.applyColors(),this.drawWidget());}getGMTOffset(e){try{if(e==="System Timezone -")return "";let a=new Intl.DateTimeFormat("en-US",{timeZone:e,timeZoneName:"short"}).formatToParts(new Date).find(M=>M.type==="timeZoneName");return a?a.value:"GMT"}catch(t){return console.error(`Error getting GMT offset for timezone "${e}":`,t),"GMT"}}applyColors(){let e=this.runtime.options(),t=this.theme();!e||!t||(this.labelColor.set(c(e.color??"contrast",t).dim),this.valueColor=c(e.color??"contrast",t).color);}ngOnDestroy(){this.isDestroyed=true;try{this.canvas.unregisterCanvas(this.canvasElement);}catch(e){}}drawWidget(){if(!this.canvasCtx)return;let e=this.labelColor();(!this.titleBitmap||this.titleBitmap.width!==this.canvasElement.width||this.titleBitmap.height!==this.canvasElement.height||this.titleBitmapText!==`${this.displayName()}-${this.runtime.options()?.color??"contrast"}`||this.titleBitmapColor!==e)&&(this.titleBitmap=this.canvas.createTitleBitmap(this.displayName(),e,"normal",this.cssWidth,this.cssHeight),this.titleBitmapText=`${this.displayName()}-${this.runtime.options()?.color??"contrast"}`,this.titleBitmapColor=e),this.canvas.clearCanvas(this.canvasCtx,this.cssWidth,this.cssHeight),this.titleBitmap&&this.titleBitmap.width>0&&this.titleBitmap.height>0&&this.canvasCtx.drawImage(this.titleBitmap,0,0,this.cssWidth,this.cssHeight);let t,i=this.dataValue();if(!i||isNaN(Date.parse(i)))t="--";else try{t=Da(i,this.dateFormat(),"en-US",this._timeZoneGTM);}catch(a){t=String(a),console.log("[Date Time Widget]: "+String(a));}this.canvas.drawText(this.canvasCtx,t,Math.floor(this.cssWidth/2),Math.floor(this.cssHeight/2*1.15),this.maxTextWidth,this.maxTextHeight,"bold",this.valueColor);}static \u0275fac=function(t){return new(t||s)};static \u0275cmp=JD({type:s,selectors:[["widget-datetime"]],viewQuery:function(t,i){t&1&&eg(i.canvasMainRef,x,5),t&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:2,vars:0,consts:[["canvasMainRef",""],[1,"date-canvas"]],template:function(t,i){t&1&&Uh(0,"canvas",1,0);},styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%;overflow:hidden}.date-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;min-height:1px;display:block}"]})}return s})();export{R as WidgetDatetimeComponent};
@@ -1 +1 @@
1
- import {f}from'./chunk-H9_eqTYx.js';import {d1 as Hj,w,du as p,dv as rt,dD as _,cu as T,a as G,aR as lt,W as Wp,D as Dt,v as vt,cw as z,cv as G$1,F as Fa,dn as ge,J as JD,dC as x,_ as _w,P as Pi,cn as wd,c as $h,u as ul,X as xw,M as Mw,e as EE,an as Hh,Y as Aw,g as qw,B as Bh,h as Fw,k as Qh,l as ud,m as dd,T as TT,d as ig,s as sg,t as pT,cr as mg}from'./main-F7NMHHV4.js';import {c}from'./chunk-CRy9Da7a.js';var Y=(n,i)=>i.raw.value;function K(n,i){if(n&1&&$h(0,"widget-title",0),n&2){let t=qw();Bh("text",t.displayName())("color",t.accentColor());}}function Q(n,i){if(n&1&&(wd(),$h(0,"path")),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("d",e.fullRoundedItemPathD())("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function X(n,i){if(n&1&&(wd(),$h(0,"path")),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("d",e.topRoundedItemPathD())("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function ee(n,i){if(n&1&&(wd(),$h(0,"path")),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("d",e.bottomRoundedItemPathD())("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function te(n,i){if(n&1&&(wd(),$h(0,"rect",18)),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("width",e.menuWidth)("height",e.itemHeight)("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function ie(n,i){if(n&1){let t=Fw();wd(),Pi(0,"g",15),Qh("pointerdown",function(s){ud(t);let o=qw();return dd(o.onPointerDown(s))})("pointermove",function(s){ud(t);let o=qw();return dd(o.onPointerMove(s))})("pointerup",function(s){let o=ud(t).$implicit,l=qw();return dd(l.onPointerUp(s,o))})("pointercancel",function(s){ud(t);let o=qw();return dd(o.onPointerCancel(s))})("keyup.enter",function(){let s=ud(t).$implicit,o=qw();return dd(o.canPut()&&o.selectUi(s))})("keyup.space",function(){let s=ud(t).$implicit,o=qw();return dd(o.canPut()&&o.selectUi(s))}),_w(1,Q,1,4,":svg:path",16)(2,X,1,4,":svg:path",16)(3,ee,1,4,":svg:path",16)(4,te,1,5,":svg:rect",17),Pi(5,"text"),TT(6),ul()();}if(n&2){let t=i.$implicit,e=qw();ig("cursor",e.canPut()?"pointer":"not-allowed"),sg("is-selected",e.isSelected(t.raw))("is-off",t.raw.isOn===false),Hh("transform","translate(0 "+t.index*(e.itemHeight+e.itemGap)+")")("tabindex",e.canPut()?0:-1)("aria-label",t.label)("aria-pressed",e.isSelected(t.raw))("aria-disabled",!e.canPut()),EE(),Mw(t.index===0&&t.index===e.optionsCount()-1?1:t.index===0?2:t.index===e.optionsCount()-1?3:4),EE(4),pT(e.isSelected(t.raw)?"svg-menu-item-current-text":t.raw.isOn===false?"svg-menu-item-off-text":"svg-menu-item-text"),Hh("x",e.menuWidth/2)("y",e.itemHeight/2)("filter",e.isSelected(t.raw)?"url(#glow)":null)("fill",(e.isSelected(t.raw)||t.raw.isOn===false,e.textColor())),EE(),mg(" ",e.isSelected(t.raw)?"\u2713 ":"","",t.label," ");}}function ne(n,i){if(n&1&&(wd(),$h(0,"path")),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("d",e.fullRoundedItemPathD())("filter",e.isSelected(t.raw)?"url(#glow)":null)("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function oe(n,i){if(n&1&&(wd(),$h(0,"path")),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("d",e.topRoundedItemPathD())("filter",e.isSelected(t.raw)?"url(#glow)":null)("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function re(n,i){if(n&1&&(wd(),$h(0,"path")),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("d",e.bottomRoundedItemPathD())("filter",e.isSelected(t.raw)?"url(#glow)":null)("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function ae(n,i){if(n&1&&(wd(),$h(0,"rect",18)),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("width",e.menuWidth)("height",e.itemHeight)("filter",e.isSelected(t.raw)?"url(#glow)":null)("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function se(n,i){if(n&1){let t=Fw();wd(),Pi(0,"g",15),Qh("pointerdown",function(s){ud(t);let o=qw();return dd(o.onPointerDown(s))})("pointermove",function(s){ud(t);let o=qw();return dd(o.onPointerMove(s))})("pointerup",function(s){let o=ud(t).$implicit,l=qw();return dd(l.onPointerUp(s,o))})("pointercancel",function(s){ud(t);let o=qw();return dd(o.onPointerCancel(s))})("keyup.enter",function(){let s=ud(t).$implicit,o=qw();return dd(o.canPut()&&o.selectUi(s))})("keyup.space",function(){let s=ud(t).$implicit,o=qw();return dd(o.canPut()&&o.selectUi(s))}),_w(1,ne,1,5,":svg:path",16)(2,oe,1,5,":svg:path",16)(3,re,1,5,":svg:path",16)(4,ae,1,6,":svg:rect",17),Pi(5,"text"),TT(6),ul()();}if(n&2){let t=i.$implicit,e=qw();ig("cursor",e.canPut()?"pointer":"not-allowed"),sg("is-selected",e.isSelected(t.raw))("is-off",t.raw.isOn===false),Hh("transform","translate(0 "+t.index*(e.itemHeight+e.itemGap)+")")("tabindex",e.canPut()?0:-1)("aria-label",t.label)("aria-pressed",e.isSelected(t.raw))("aria-disabled",!e.canPut()),EE(),Mw(t.index===0&&t.index===e.optionsCount()-1?1:t.index===0?2:t.index===e.optionsCount()-1?3:4),EE(4),pT(e.isSelected(t.raw)?"svg-menu-item-current-text":t.raw.isOn===false?"svg-menu-item-off-text":"svg-menu-item-text"),Hh("x",e.menuWidth/2)("y",e.itemHeight/2)("filter",e.isSelected(t.raw)?"url(#glow)":null)("fill",(e.isSelected(t.raw)||t.raw.isOn===false,e.textColor())),EE(),mg(" ",e.isSelected(t.raw)?"\u2713 ":"","",t.label," ");}}function le(n,i){n&1&&$h(0,"div",14);}var J=class n{id=Hj.required();type=Hj.required();theme=Hj.required();static DEFAULT_CONFIG={displayName:"Switch Label",showLabel:true,filterSelfPaths:true,paths:{controlPath:{description:"Multi-state control path",path:null,source:null,pathType:"multiple",supportsPut:true,isPathConfigurable:true,pathRequired:true,showPathSkUnitsFilter:false,pathSkUnitsFilter:null,showConvertUnitTo:false,convertUnitTo:void 0,sampleTime:500}},enableTimeout:false,dataTimeout:5,color:"contrast"};runtime=w(p);streams=w(rt);meta=w(_);signalkRequestsService=w(T);dashboard=w(G);toast=w(lt);skRequest=Wp(this.signalkRequestsService.subscribeRequest(),{initialValue:null});cfg=Dt(()=>this.runtime.options()??n.DEFAULT_CONFIG);displayName=Dt(()=>this.cfg().displayName??"Switch Label");showLabel=Dt(()=>this.cfg().showLabel??true);controlPath=Dt(()=>this.getControlPath(this.cfg()));accentColor=vt("");accentDim=vt("");accentDimmer=vt("");textColor=vt("");textDim=vt("");textDimmer=vt("");currentValue=vt(null);sortedOptions=Dt(()=>{let i=this.meta.possibleValues();if(!i.length)return [];let t=i.map(e=>({raw:e,label:e.title||e.abbrev||String(e.value),comparable:this.toComparable(e.value)}));return t.sort((e,s)=>{let o=e.comparable,l=s.comparable;return o.kind==="num"&&l.kind==="num"?o.value-l.value:o.kind==="str"&&l.kind==="str"?o.value.localeCompare(l.value):o.kind==="num"?-1:1}),t.map((e,s)=>z(G$1({},e),{index:s}))});menuWidth=220;itemHeight=50;itemGap=1;svgPadding=Math.max(1,Math.round(this.itemHeight*.2));optionsCount=Dt(()=>this.sortedOptions().length);menuHeight=Dt(()=>{let i=this.sortedOptions().length;return i<=0?0:i*this.itemHeight+(i-1)*this.itemGap});hasOptions=Dt(()=>this.meta.possibleValues().length>0);selectedValue=Dt(()=>this.currentValue());canPut=Dt(()=>this.meta.supportsPut());swipeGuard=f();unselectedOptions=Dt(()=>this.sortedOptions().filter(i=>!this.isSelected(i.raw)));selectedOptions=Dt(()=>this.sortedOptions().filter(i=>this.isSelected(i.raw)));fullRoundedItemPathD=Dt(()=>this.buildRoundedRectPath(this.menuWidth,this.itemHeight,this.cornerRadius,true,true));topRoundedItemPathD=Dt(()=>this.buildRoundedRectPath(this.menuWidth,this.itemHeight,this.cornerRadius,true,false));bottomRoundedItemPathD=Dt(()=>this.buildRoundedRectPath(this.menuWidth,this.itemHeight,this.cornerRadius,false,true));cornerRadius=7;constructor(){Fa(()=>{let i=this.theme(),t=this.cfg().color??"contrast";!i||!t||ge(()=>{this.accentColor.set(c(t,i).color),this.accentDim.set(c(t,i).dim),this.accentDimmer.set(c(t,i).dimmer),t==="contrast"?(this.textColor.set(i.background),this.textDim.set(i.contrastDim),this.textDimmer.set(i.contrastDimmer)):(this.textColor.set(i.contrast),this.textDim.set(c(t,i).dim),this.textDimmer.set(c(t,i).dimmer));});}),Fa(()=>{if(!this.controlPath()){this.currentValue.set(null);return}ge(()=>{this.streams.observe("controlPath",t=>{this.currentValue.set(t?.data?.value??null);}),this.meta.observe("controlPath");});});}select(i){let t=this.getControlPath(this.cfg());t&&this.signalkRequestsService.putRequest(t,i.value,this.id());}selectUi(i){this.select(i.raw);}onPointerDown(i){this.canPut()&&this.swipeGuard.onPointerDown(i);}onPointerMove(i){this.canPut()&&this.swipeGuard.onPointerMove(i);}onPointerUp(i,t){this.canPut()&&this.swipeGuard.onPointerUp(i)&&this.selectUi(t);}onPointerCancel(i){this.swipeGuard.onPointerCancel(i);}getControlPath(i){let t=i?.paths;return !t||Array.isArray(t)?null:t.controlPath?.path??null}isSelected(i){let t=this.selectedValue();return typeof i.value=="number"&&typeof t=="string"?i.value===Number(t):typeof i.value=="string"&&typeof t=="number"?Number(i.value)===t||i.value===String(t):Object.is(i.value,t)}toComparable(i){if(typeof i=="number"&&Number.isFinite(i))return {kind:"num",value:i};if(typeof i=="boolean")return {kind:"num",value:i?1:0};if(typeof i=="string"){let t=i.trim();if(/^-?\d+(\.\d+)?$/.test(t)){let e=Number(t);if(Number.isFinite(e))return {kind:"num",value:e}}return {kind:"str",value:t}}return {kind:"str",value:String(i)}}buildRoundedRectPath(i,t,e,s,o){let l=Math.max(0,i),f=Math.max(0,t),r=Math.max(0,Math.min(e,l/2,f/2));return l===0||f===0?"":r===0?`M0 0H${l}V${f}H0Z`:s&&o?[`M${r} 0`,`H${l-r}`,`A${r} ${r} 0 0 1 ${l} ${r}`,`V${f-r}`,`A${r} ${r} 0 0 1 ${l-r} ${f}`,`H${r}`,`A${r} ${r} 0 0 1 0 ${f-r}`,`V${r}`,`A${r} ${r} 0 0 1 ${r} 0`,"Z"].join(""):s?[`M0 ${r}`,`A${r} ${r} 0 0 1 ${r} 0`,`H${l-r}`,`A${r} ${r} 0 0 1 ${l} ${r}`,`V${f}`,"H0","Z"].join(""):o?["M0 0",`H${l}`,`V${f-r}`,`A${r} ${r} 0 0 1 ${l-r} ${f}`,`H${r}`,`A${r} ${r} 0 0 1 0 ${f-r}`,"V0","Z"].join(""):`M0 0H${l}V${f}H0Z`}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["widget-multi-state-switch"]],inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:23,vars:6,consts:[[3,"text","color"],["role","group",1,"widgets-container"],["preserveAspectRatio","xMidYMid meet","role","presentation",1,"svg-menu"],["id","glow","x","-50%","y","-50%","width","200%","height","200%"],["stdDeviation","5","result","coloredBlur"],["in","coloredBlur"],["in","SourceGraphic"],["id","focus-inner-ring","x","0","y","0","width","100%","height","100%","color-interpolation-filters","sRGB"],["in","SourceAlpha","operator","erode","radius","2","result","eroded"],["in","SourceAlpha","in2","eroded","operator","out","result","border"],["flood-color","#ffffff","flood-opacity","0.9","result","ringColor"],["in","ringColor","in2","border","operator","in","result","ring"],["in","ring"],["role","button",1,"svg-menu-item-group",3,"is-selected","is-off","cursor"],[1,"widgetOverlay"],["role","button",1,"svg-menu-item-group",3,"pointerdown","pointermove","pointerup","pointercancel","keyup.enter","keyup.space"],[3,"class"],["x","0","y","0",3,"class"],["x","0","y","0"]],template:function(t,e){t&1&&(_w(0,K,1,2,"widget-title",0),Pi(1,"div",1),wd(),Pi(2,"svg",2)(3,"defs")(4,"filter",3),$h(5,"feGaussianBlur",4),Pi(6,"feMerge"),$h(7,"feMergeNode",5)(8,"feMergeNode",6),ul()(),Pi(9,"filter",7),$h(10,"feMorphology",8)(11,"feComposite",9)(12,"feFlood",10)(13,"feComposite",11),Pi(14,"feMerge"),$h(15,"feMergeNode",6)(16,"feMergeNode",12),ul()()(),Pi(17,"g"),xw(18,ie,7,20,":svg:g",13,Y),xw(20,se,7,20,":svg:g",13,Y),ul()()(),_w(22,le,1,0,"div",14)),t&2&&(Mw(e.showLabel()?0:-1),EE(),Hh("aria-label",e.displayName()),EE(),Hh("viewBox","0 0 "+(e.menuWidth+e.svgPadding*2)+" "+((e.menuHeight()||e.itemHeight)+e.svgPadding*2))("aria-label",e.displayName()),EE(15),Hh("transform","translate("+e.svgPadding+" "+e.svgPadding+")"),EE(),Aw(e.unselectedOptions()),EE(2),Aw(e.selectedOptions()),EE(2),Mw(e.dashboard.isDashboardStatic()?-1:22));},dependencies:[x],styles:["[_nghost-%COMP%]{display:block;height:100%}.widgetOverlay[_ngcontent-%COMP%]{position:absolute;width:100%;height:100%;right:0;bottom:0;color:transparent;z-index:21}.widgets-container[_ngcontent-%COMP%]{display:block;position:absolute;left:0;right:0;top:15%;height:85%;width:100%;overflow:hidden;padding:2px}.svg-menu[_ngcontent-%COMP%]{width:100%;height:100%;display:block;background:transparent;border-radius:12px;z-index:20;font-family:Roboto;font-size:1.3rem;font-weight:700;text-anchor:middle;text-align:center;alignment-baseline:middle}.svg-menu-item-current[_ngcontent-%COMP%]{stroke:var(--mat-sys-on-background);stroke-width:3px;stroke-dasharray:none;stroke-opacity:1}.svg-menu-item[_ngcontent-%COMP%]{fill:var(--mat-sys-outline);stroke:#000;stroke-width:2px;stroke-dasharray:none;stroke-opacity:.2}.svg-menu-item-off[_ngcontent-%COMP%]{stroke:#000;stroke-width:2;stroke-dasharray:none;stroke-opacity:.2}.svg-menu-item-current-text[_ngcontent-%COMP%]{font-size:1.5rem;font-weight:700;text-anchor:middle;dominant-baseline:middle;alignment-baseline:middle}.svg-menu-item-text[_ngcontent-%COMP%], .svg-menu-item-off-text[_ngcontent-%COMP%]{font-weight:600;text-anchor:middle;dominant-baseline:middle;alignment-baseline:middle}.svg-menu-item-group[_ngcontent-%COMP%]:focus{outline:none}.svg-menu-item-group[_ngcontent-%COMP%]:focus-visible :is(rect[_ngcontent-%COMP%], path[_ngcontent-%COMP%]){filter:url(#focus-inner-ring)}"]})};export{J as WidgetMultiStateSwitchComponent};
1
+ import {f}from'./chunk-H9_eqTYx.js';import {d1 as Hj,w,du as p,dv as rt,dD as _,cu as T,a as G,aR as lt,W as Wp,D as Dt,v as vt,cw as z,cv as G$1,F as Fa,dn as ge,J as JD,dC as x,_ as _w,P as Pi,cn as wd,c as $h,u as ul,X as xw,M as Mw,e as EE,an as Hh,Y as Aw,g as qw,B as Bh,h as Fw,k as Qh,l as ud,m as dd,T as TT,d as ig,s as sg,t as pT,cr as mg}from'./main-IINF7HD6.js';import {c}from'./chunk-DHj2hm9r.js';var Y=(n,i)=>i.raw.value;function K(n,i){if(n&1&&$h(0,"widget-title",0),n&2){let t=qw();Bh("text",t.displayName())("color",t.accentColor());}}function Q(n,i){if(n&1&&(wd(),$h(0,"path")),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("d",e.fullRoundedItemPathD())("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function X(n,i){if(n&1&&(wd(),$h(0,"path")),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("d",e.topRoundedItemPathD())("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function ee(n,i){if(n&1&&(wd(),$h(0,"path")),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("d",e.bottomRoundedItemPathD())("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function te(n,i){if(n&1&&(wd(),$h(0,"rect",18)),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("width",e.menuWidth)("height",e.itemHeight)("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function ie(n,i){if(n&1){let t=Fw();wd(),Pi(0,"g",15),Qh("pointerdown",function(s){ud(t);let o=qw();return dd(o.onPointerDown(s))})("pointermove",function(s){ud(t);let o=qw();return dd(o.onPointerMove(s))})("pointerup",function(s){let o=ud(t).$implicit,l=qw();return dd(l.onPointerUp(s,o))})("pointercancel",function(s){ud(t);let o=qw();return dd(o.onPointerCancel(s))})("keyup.enter",function(){let s=ud(t).$implicit,o=qw();return dd(o.canPut()&&o.selectUi(s))})("keyup.space",function(){let s=ud(t).$implicit,o=qw();return dd(o.canPut()&&o.selectUi(s))}),_w(1,Q,1,4,":svg:path",16)(2,X,1,4,":svg:path",16)(3,ee,1,4,":svg:path",16)(4,te,1,5,":svg:rect",17),Pi(5,"text"),TT(6),ul()();}if(n&2){let t=i.$implicit,e=qw();ig("cursor",e.canPut()?"pointer":"not-allowed"),sg("is-selected",e.isSelected(t.raw))("is-off",t.raw.isOn===false),Hh("transform","translate(0 "+t.index*(e.itemHeight+e.itemGap)+")")("tabindex",e.canPut()?0:-1)("aria-label",t.label)("aria-pressed",e.isSelected(t.raw))("aria-disabled",!e.canPut()),EE(),Mw(t.index===0&&t.index===e.optionsCount()-1?1:t.index===0?2:t.index===e.optionsCount()-1?3:4),EE(4),pT(e.isSelected(t.raw)?"svg-menu-item-current-text":t.raw.isOn===false?"svg-menu-item-off-text":"svg-menu-item-text"),Hh("x",e.menuWidth/2)("y",e.itemHeight/2)("filter",e.isSelected(t.raw)?"url(#glow)":null)("fill",(e.isSelected(t.raw)||t.raw.isOn===false,e.textColor())),EE(),mg(" ",e.isSelected(t.raw)?"\u2713 ":"","",t.label," ");}}function ne(n,i){if(n&1&&(wd(),$h(0,"path")),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("d",e.fullRoundedItemPathD())("filter",e.isSelected(t.raw)?"url(#glow)":null)("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function oe(n,i){if(n&1&&(wd(),$h(0,"path")),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("d",e.topRoundedItemPathD())("filter",e.isSelected(t.raw)?"url(#glow)":null)("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function re(n,i){if(n&1&&(wd(),$h(0,"path")),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("d",e.bottomRoundedItemPathD())("filter",e.isSelected(t.raw)?"url(#glow)":null)("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function ae(n,i){if(n&1&&(wd(),$h(0,"rect",18)),n&2){let t=qw().$implicit,e=qw();pT(e.isSelected(t.raw)?"svg-menu-item-current":t.raw.isOn===false?"svg-menu-item-off":"svg-menu-item"),Hh("width",e.menuWidth)("height",e.itemHeight)("filter",e.isSelected(t.raw)?"url(#glow)":null)("fill",e.isSelected(t.raw)?e.accentColor():(t.raw.isOn===false,e.accentDim()));}}function se(n,i){if(n&1){let t=Fw();wd(),Pi(0,"g",15),Qh("pointerdown",function(s){ud(t);let o=qw();return dd(o.onPointerDown(s))})("pointermove",function(s){ud(t);let o=qw();return dd(o.onPointerMove(s))})("pointerup",function(s){let o=ud(t).$implicit,l=qw();return dd(l.onPointerUp(s,o))})("pointercancel",function(s){ud(t);let o=qw();return dd(o.onPointerCancel(s))})("keyup.enter",function(){let s=ud(t).$implicit,o=qw();return dd(o.canPut()&&o.selectUi(s))})("keyup.space",function(){let s=ud(t).$implicit,o=qw();return dd(o.canPut()&&o.selectUi(s))}),_w(1,ne,1,5,":svg:path",16)(2,oe,1,5,":svg:path",16)(3,re,1,5,":svg:path",16)(4,ae,1,6,":svg:rect",17),Pi(5,"text"),TT(6),ul()();}if(n&2){let t=i.$implicit,e=qw();ig("cursor",e.canPut()?"pointer":"not-allowed"),sg("is-selected",e.isSelected(t.raw))("is-off",t.raw.isOn===false),Hh("transform","translate(0 "+t.index*(e.itemHeight+e.itemGap)+")")("tabindex",e.canPut()?0:-1)("aria-label",t.label)("aria-pressed",e.isSelected(t.raw))("aria-disabled",!e.canPut()),EE(),Mw(t.index===0&&t.index===e.optionsCount()-1?1:t.index===0?2:t.index===e.optionsCount()-1?3:4),EE(4),pT(e.isSelected(t.raw)?"svg-menu-item-current-text":t.raw.isOn===false?"svg-menu-item-off-text":"svg-menu-item-text"),Hh("x",e.menuWidth/2)("y",e.itemHeight/2)("filter",e.isSelected(t.raw)?"url(#glow)":null)("fill",(e.isSelected(t.raw)||t.raw.isOn===false,e.textColor())),EE(),mg(" ",e.isSelected(t.raw)?"\u2713 ":"","",t.label," ");}}function le(n,i){n&1&&$h(0,"div",14);}var J=class n{id=Hj.required();type=Hj.required();theme=Hj.required();static DEFAULT_CONFIG={displayName:"Switch Label",showLabel:true,filterSelfPaths:true,paths:{controlPath:{description:"Multi-state control path",path:null,source:null,pathType:"multiple",supportsPut:true,isPathConfigurable:true,pathRequired:true,showPathSkUnitsFilter:false,pathSkUnitsFilter:null,showConvertUnitTo:false,convertUnitTo:void 0,sampleTime:500}},enableTimeout:false,dataTimeout:5,color:"contrast"};runtime=w(p);streams=w(rt);meta=w(_);signalkRequestsService=w(T);dashboard=w(G);toast=w(lt);skRequest=Wp(this.signalkRequestsService.subscribeRequest(),{initialValue:null});cfg=Dt(()=>this.runtime.options()??n.DEFAULT_CONFIG);displayName=Dt(()=>this.cfg().displayName??"Switch Label");showLabel=Dt(()=>this.cfg().showLabel??true);controlPath=Dt(()=>this.getControlPath(this.cfg()));accentColor=vt("");accentDim=vt("");accentDimmer=vt("");textColor=vt("");textDim=vt("");textDimmer=vt("");currentValue=vt(null);sortedOptions=Dt(()=>{let i=this.meta.possibleValues();if(!i.length)return [];let t=i.map(e=>({raw:e,label:e.title||e.abbrev||String(e.value),comparable:this.toComparable(e.value)}));return t.sort((e,s)=>{let o=e.comparable,l=s.comparable;return o.kind==="num"&&l.kind==="num"?o.value-l.value:o.kind==="str"&&l.kind==="str"?o.value.localeCompare(l.value):o.kind==="num"?-1:1}),t.map((e,s)=>z(G$1({},e),{index:s}))});menuWidth=220;itemHeight=50;itemGap=1;svgPadding=Math.max(1,Math.round(this.itemHeight*.2));optionsCount=Dt(()=>this.sortedOptions().length);menuHeight=Dt(()=>{let i=this.sortedOptions().length;return i<=0?0:i*this.itemHeight+(i-1)*this.itemGap});hasOptions=Dt(()=>this.meta.possibleValues().length>0);selectedValue=Dt(()=>this.currentValue());canPut=Dt(()=>this.meta.supportsPut());swipeGuard=f();unselectedOptions=Dt(()=>this.sortedOptions().filter(i=>!this.isSelected(i.raw)));selectedOptions=Dt(()=>this.sortedOptions().filter(i=>this.isSelected(i.raw)));fullRoundedItemPathD=Dt(()=>this.buildRoundedRectPath(this.menuWidth,this.itemHeight,this.cornerRadius,true,true));topRoundedItemPathD=Dt(()=>this.buildRoundedRectPath(this.menuWidth,this.itemHeight,this.cornerRadius,true,false));bottomRoundedItemPathD=Dt(()=>this.buildRoundedRectPath(this.menuWidth,this.itemHeight,this.cornerRadius,false,true));cornerRadius=7;constructor(){Fa(()=>{let i=this.theme(),t=this.cfg().color??"contrast";!i||!t||ge(()=>{this.accentColor.set(c(t,i).color),this.accentDim.set(c(t,i).dim),this.accentDimmer.set(c(t,i).dimmer),t==="contrast"?(this.textColor.set(i.background),this.textDim.set(i.contrastDim),this.textDimmer.set(i.contrastDimmer)):(this.textColor.set(i.contrast),this.textDim.set(c(t,i).dim),this.textDimmer.set(c(t,i).dimmer));});}),Fa(()=>{if(!this.controlPath()){this.currentValue.set(null);return}ge(()=>{this.streams.observe("controlPath",t=>{this.currentValue.set(t?.data?.value??null);}),this.meta.observe("controlPath");});});}select(i){let t=this.getControlPath(this.cfg());t&&this.signalkRequestsService.putRequest(t,i.value,this.id());}selectUi(i){this.select(i.raw);}onPointerDown(i){this.canPut()&&this.swipeGuard.onPointerDown(i);}onPointerMove(i){this.canPut()&&this.swipeGuard.onPointerMove(i);}onPointerUp(i,t){this.canPut()&&this.swipeGuard.onPointerUp(i)&&this.selectUi(t);}onPointerCancel(i){this.swipeGuard.onPointerCancel(i);}getControlPath(i){let t=i?.paths;return !t||Array.isArray(t)?null:t.controlPath?.path??null}isSelected(i){let t=this.selectedValue();return typeof i.value=="number"&&typeof t=="string"?i.value===Number(t):typeof i.value=="string"&&typeof t=="number"?Number(i.value)===t||i.value===String(t):Object.is(i.value,t)}toComparable(i){if(typeof i=="number"&&Number.isFinite(i))return {kind:"num",value:i};if(typeof i=="boolean")return {kind:"num",value:i?1:0};if(typeof i=="string"){let t=i.trim();if(/^-?\d+(\.\d+)?$/.test(t)){let e=Number(t);if(Number.isFinite(e))return {kind:"num",value:e}}return {kind:"str",value:t}}return {kind:"str",value:String(i)}}buildRoundedRectPath(i,t,e,s,o){let l=Math.max(0,i),f=Math.max(0,t),r=Math.max(0,Math.min(e,l/2,f/2));return l===0||f===0?"":r===0?`M0 0H${l}V${f}H0Z`:s&&o?[`M${r} 0`,`H${l-r}`,`A${r} ${r} 0 0 1 ${l} ${r}`,`V${f-r}`,`A${r} ${r} 0 0 1 ${l-r} ${f}`,`H${r}`,`A${r} ${r} 0 0 1 0 ${f-r}`,`V${r}`,`A${r} ${r} 0 0 1 ${r} 0`,"Z"].join(""):s?[`M0 ${r}`,`A${r} ${r} 0 0 1 ${r} 0`,`H${l-r}`,`A${r} ${r} 0 0 1 ${l} ${r}`,`V${f}`,"H0","Z"].join(""):o?["M0 0",`H${l}`,`V${f-r}`,`A${r} ${r} 0 0 1 ${l-r} ${f}`,`H${r}`,`A${r} ${r} 0 0 1 0 ${f-r}`,"V0","Z"].join(""):`M0 0H${l}V${f}H0Z`}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["widget-multi-state-switch"]],inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:23,vars:6,consts:[[3,"text","color"],["role","group",1,"widgets-container"],["preserveAspectRatio","xMidYMid meet","role","presentation",1,"svg-menu"],["id","glow","x","-50%","y","-50%","width","200%","height","200%"],["stdDeviation","5","result","coloredBlur"],["in","coloredBlur"],["in","SourceGraphic"],["id","focus-inner-ring","x","0","y","0","width","100%","height","100%","color-interpolation-filters","sRGB"],["in","SourceAlpha","operator","erode","radius","2","result","eroded"],["in","SourceAlpha","in2","eroded","operator","out","result","border"],["flood-color","#ffffff","flood-opacity","0.9","result","ringColor"],["in","ringColor","in2","border","operator","in","result","ring"],["in","ring"],["role","button",1,"svg-menu-item-group",3,"is-selected","is-off","cursor"],[1,"widgetOverlay"],["role","button",1,"svg-menu-item-group",3,"pointerdown","pointermove","pointerup","pointercancel","keyup.enter","keyup.space"],[3,"class"],["x","0","y","0",3,"class"],["x","0","y","0"]],template:function(t,e){t&1&&(_w(0,K,1,2,"widget-title",0),Pi(1,"div",1),wd(),Pi(2,"svg",2)(3,"defs")(4,"filter",3),$h(5,"feGaussianBlur",4),Pi(6,"feMerge"),$h(7,"feMergeNode",5)(8,"feMergeNode",6),ul()(),Pi(9,"filter",7),$h(10,"feMorphology",8)(11,"feComposite",9)(12,"feFlood",10)(13,"feComposite",11),Pi(14,"feMerge"),$h(15,"feMergeNode",6)(16,"feMergeNode",12),ul()()(),Pi(17,"g"),xw(18,ie,7,20,":svg:g",13,Y),xw(20,se,7,20,":svg:g",13,Y),ul()()(),_w(22,le,1,0,"div",14)),t&2&&(Mw(e.showLabel()?0:-1),EE(),Hh("aria-label",e.displayName()),EE(),Hh("viewBox","0 0 "+(e.menuWidth+e.svgPadding*2)+" "+((e.menuHeight()||e.itemHeight)+e.svgPadding*2))("aria-label",e.displayName()),EE(15),Hh("transform","translate("+e.svgPadding+" "+e.svgPadding+")"),EE(),Aw(e.unselectedOptions()),EE(2),Aw(e.selectedOptions()),EE(2),Mw(e.dashboard.isDashboardStatic()?-1:22));},dependencies:[x],styles:["[_nghost-%COMP%]{display:block;height:100%}.widgetOverlay[_ngcontent-%COMP%]{position:absolute;width:100%;height:100%;right:0;bottom:0;color:transparent;z-index:21}.widgets-container[_ngcontent-%COMP%]{display:block;position:absolute;left:0;right:0;top:15%;height:85%;width:100%;overflow:hidden;padding:2px}.svg-menu[_ngcontent-%COMP%]{width:100%;height:100%;display:block;background:transparent;border-radius:12px;z-index:20;font-family:Roboto;font-size:1.3rem;font-weight:700;text-anchor:middle;text-align:center;alignment-baseline:middle}.svg-menu-item-current[_ngcontent-%COMP%]{stroke:var(--mat-sys-on-background);stroke-width:3px;stroke-dasharray:none;stroke-opacity:1}.svg-menu-item[_ngcontent-%COMP%]{fill:var(--mat-sys-outline);stroke:#000;stroke-width:2px;stroke-dasharray:none;stroke-opacity:.2}.svg-menu-item-off[_ngcontent-%COMP%]{stroke:#000;stroke-width:2;stroke-dasharray:none;stroke-opacity:.2}.svg-menu-item-current-text[_ngcontent-%COMP%]{font-size:1.5rem;font-weight:700;text-anchor:middle;dominant-baseline:middle;alignment-baseline:middle}.svg-menu-item-text[_ngcontent-%COMP%], .svg-menu-item-off-text[_ngcontent-%COMP%]{font-weight:600;text-anchor:middle;dominant-baseline:middle;alignment-baseline:middle}.svg-menu-item-group[_ngcontent-%COMP%]:focus{outline:none}.svg-menu-item-group[_ngcontent-%COMP%]:focus-visible :is(rect[_ngcontent-%COMP%], path[_ngcontent-%COMP%]){filter:url(#focus-inner-ring)}"]})};export{J as WidgetMultiStateSwitchComponent};
@@ -1 +1 @@
1
- import {w,dc as O,dd as $e,J as JD,b2 as Ln,b3 as Gn,b4 as Xe,b5 as Pn,b6 as kn,b7 as ft,b9 as rn,ba as Qt,de as Nt,df as Vt,bb as rt,bc as ae,bd as an,be as It,bt as u,dh as zt,bh as xp,di as jt,h as Fw,P as Pi,k as Qh,T as TT,u as ul,_ as _w,c as $h,bi as Eg,l as ud,bj as ST,m as dd,bk as cD,bl as Jw,e as EE,aA as gg,M as Mw,bm as Ig,B as Bh,bn as FT,bo as lD,g as qw,bp as gl}from'./main-F7NMHHV4.js';var X=()=>({standalone:false});function Z(a,$){if(a&1&&(Pi(0,"div",3),$h(1,"i",10),TT(2),ul()),a&2){let p=qw();EE(2),gl(" ",p.data.error," ");}}var me=(()=>{class a{dialogRef=w(O);data=w($e);titleDialog="Sign in to Signal K";saveCredential(){this.data.error=null,this.dialogRef.close(this.data);}static \u0275fac=function(d){return new(d||a)};static \u0275cmp=JD({type:a,selectors:[["app-modal-user-credential"]],decls:26,vars:10,consts:[["login","ngForm"],["name","login",3,"ngSubmit"],["mat-dialog-title",""],[1,"errorMsgBox"],[1,"login-grid"],[1,"userLoginInput"],["type","text","autocomplete","username","id","username","matInput","","placeholder","User ID","name","username","required","",3,"ngModelChange","ngModel","ngModelOptions"],["type","password","autocomplete","current-password","autocapitalize","off","autocorrect","off","spellcheck","false","id","current-password","matInput","","placeholder","Password","name","current-password","required","",3,"ngModelChange","ngModel","ngModelOptions"],["mat-flat-button","","type","button",3,"mat-dialog-close"],["mat-flat-button","","type","submit",3,"disabled"],["aria-hidden","true",1,"fa-solid","fa-times-circle",2,"color","red","padding-right","5px"]],template:function(d,i){if(d&1){let s=Fw();Pi(0,"form",1,0),Qh("ngSubmit",function(){return i.saveCredential()}),Pi(2,"span",2),TT(3),ul(),Pi(4,"mat-dialog-content"),_w(5,Z,3,1,"div",3),$h(6,"br"),Pi(7,"div",4)(8,"mat-form-field",5)(9,"mat-label"),TT(10,"User ID"),ul(),Pi(11,"input",6),Eg("ngModelChange",function(r){return ud(s),ST(i.data.user,r)||(i.data.user=r),dd(r)}),ul(),cD(),Pi(12,"mat-error"),TT(13," You must enter a User ID value "),ul()(),Pi(14,"mat-form-field",5)(15,"mat-label"),TT(16,"Password"),ul(),Pi(17,"input",7),Eg("ngModelChange",function(r){return ud(s),ST(i.data.password,r)||(i.data.password=r),dd(r)}),ul(),cD(),Pi(18,"mat-error"),TT(19," You must enter a password value "),ul()()()(),$h(20,"mat-divider"),Pi(21,"mat-dialog-actions")(22,"button",8),TT(23,"Cancel"),ul(),Pi(24,"button",9),TT(25,"Sign in"),ul()()();}if(d&2){let s=Jw(1);EE(3),gg(i.titleDialog),EE(2),Mw(i.data.error?5:-1),EE(6),Ig("ngModel",i.data.user),Bh("ngModelOptions",FT(8,X)),lD(),EE(6),Ig("ngModel",i.data.password),Bh("ngModelOptions",FT(9,X)),lD(),EE(5),Bh("mat-dialog-close",false),EE(2),Bh("disabled",!s.valid);}},dependencies:[Ln,Gn,Xe,Pn,kn,ft,rn,Qt,Nt,Vt,rt,ae,an,It,u,zt,xp,jt],styles:[".errorMsgBox[_ngcontent-%COMP%]{background-color:#fff8dc;color:#2f4f4f;display:flex;padding:5px;font-family:Arial,Times,serif;font-size:14px}.login-grid[_ngcontent-%COMP%]{display:grid;gap:10px;padding-left:10px;padding-right:10px}.userLoginInput[_ngcontent-%COMP%]{margin-bottom:10px}"]})}return a})();export{me as m};
1
+ import {w,dc as O,dd as $e,J as JD,b2 as Ln,b3 as Gn,b4 as Xe,b5 as Pn,b6 as kn,b7 as ft,b9 as rn,ba as Qt,de as Nt,df as Vt,bb as rt,bc as ae,bd as an,be as It,bt as u,dh as zt,bh as xp,di as jt,h as Fw,P as Pi,k as Qh,T as TT,u as ul,_ as _w,c as $h,bi as Eg,l as ud,bj as ST,m as dd,bk as cD,bl as Jw,e as EE,aA as gg,M as Mw,bm as Ig,B as Bh,bn as FT,bo as lD,g as qw,bp as gl}from'./main-IINF7HD6.js';var X=()=>({standalone:false});function Z(a,$){if(a&1&&(Pi(0,"div",3),$h(1,"i",10),TT(2),ul()),a&2){let p=qw();EE(2),gl(" ",p.data.error," ");}}var me=(()=>{class a{dialogRef=w(O);data=w($e);titleDialog="Sign in to Signal K";saveCredential(){this.data.error=null,this.dialogRef.close(this.data);}static \u0275fac=function(d){return new(d||a)};static \u0275cmp=JD({type:a,selectors:[["app-modal-user-credential"]],decls:26,vars:10,consts:[["login","ngForm"],["name","login",3,"ngSubmit"],["mat-dialog-title",""],[1,"errorMsgBox"],[1,"login-grid"],[1,"userLoginInput"],["type","text","autocomplete","username","id","username","matInput","","placeholder","User ID","name","username","required","",3,"ngModelChange","ngModel","ngModelOptions"],["type","password","autocomplete","current-password","autocapitalize","off","autocorrect","off","spellcheck","false","id","current-password","matInput","","placeholder","Password","name","current-password","required","",3,"ngModelChange","ngModel","ngModelOptions"],["mat-flat-button","","type","button",3,"mat-dialog-close"],["mat-flat-button","","type","submit",3,"disabled"],["aria-hidden","true",1,"fa-solid","fa-times-circle",2,"color","red","padding-right","5px"]],template:function(d,i){if(d&1){let s=Fw();Pi(0,"form",1,0),Qh("ngSubmit",function(){return i.saveCredential()}),Pi(2,"span",2),TT(3),ul(),Pi(4,"mat-dialog-content"),_w(5,Z,3,1,"div",3),$h(6,"br"),Pi(7,"div",4)(8,"mat-form-field",5)(9,"mat-label"),TT(10,"User ID"),ul(),Pi(11,"input",6),Eg("ngModelChange",function(r){return ud(s),ST(i.data.user,r)||(i.data.user=r),dd(r)}),ul(),cD(),Pi(12,"mat-error"),TT(13," You must enter a User ID value "),ul()(),Pi(14,"mat-form-field",5)(15,"mat-label"),TT(16,"Password"),ul(),Pi(17,"input",7),Eg("ngModelChange",function(r){return ud(s),ST(i.data.password,r)||(i.data.password=r),dd(r)}),ul(),cD(),Pi(18,"mat-error"),TT(19," You must enter a password value "),ul()()()(),$h(20,"mat-divider"),Pi(21,"mat-dialog-actions")(22,"button",8),TT(23,"Cancel"),ul(),Pi(24,"button",9),TT(25,"Sign in"),ul()()();}if(d&2){let s=Jw(1);EE(3),gg(i.titleDialog),EE(2),Mw(i.data.error?5:-1),EE(6),Ig("ngModel",i.data.user),Bh("ngModelOptions",FT(8,X)),lD(),EE(6),Ig("ngModel",i.data.password),Bh("ngModelOptions",FT(9,X)),lD(),EE(5),Bh("mat-dialog-close",false),EE(2),Bh("disabled",!s.valid);}},dependencies:[Ln,Gn,Xe,Pn,kn,ft,rn,Qt,Nt,Vt,rt,ae,an,It,u,zt,xp,jt],styles:[".errorMsgBox[_ngcontent-%COMP%]{background-color:#fff8dc;color:#2f4f4f;display:flex;padding:5px;font-family:Arial,Times,serif;font-size:14px}.login-grid[_ngcontent-%COMP%]{display:grid;gap:10px;padding-left:10px;padding-right:10px}.userLoginInput[_ngcontent-%COMP%]{margin-bottom:10px}"]})}return a})();export{me as m};
@@ -1 +1 @@
1
- import {d1 as Hj,w,a as G,G as Gi,J as JD,bh as xp,bP as si,P as Pi,_ as _w,u as ul,e as EE,M as Mw,T as TT,h as Fw,c as $h,k as Qh,l as ud,g as qw,m as dd}from'./main-F7NMHHV4.js';function y(n,k){if(n&1){let r=Fw();Pi(0,"h3"),TT(1,"Getting Started"),ul(),Pi(2,"p"),TT(3,"Welcome to KIP! Here are some basic gestures to help you navigate the application. Access the "),Pi(4,"a",1),TT(5,"KIP Help"),ul(),TT(6," documentation to learn more about KIP."),ul(),Pi(7,"table",2)(8,"thead")(9,"tr")(10,"th"),TT(11,"Actions"),ul(),Pi(12,"th"),TT(13,"Touch"),ul(),Pi(14,"th"),TT(15,"Mouse"),ul(),Pi(16,"th"),TT(17,"Keyboard Shortcuts"),ul()()(),Pi(18,"tbody")(19,"tr")(20,"td"),TT(21,"Open Actions menu"),ul(),Pi(22,"td"),TT(23,"Swipe left"),ul(),Pi(24,"td"),TT(25,"Click, drag left, and release"),ul(),Pi(26,"td")(27,"kbd"),TT(28,"Shift"),ul(),TT(29," + "),Pi(30,"kbd"),TT(31,"Ctrl"),ul(),TT(32," + "),Pi(33,"kbd",3),TT(34,"\u2190"),ul(),TT(35," (Left Arrow)"),ul()(),Pi(36,"tr")(37,"td"),TT(38,"Open Notification menu"),ul(),Pi(39,"td"),TT(40,"Swipe right"),ul(),Pi(41,"td"),TT(42,"Click, drag right, and release"),ul(),Pi(43,"td")(44,"kbd"),TT(45,"Shift"),ul(),TT(46," + "),Pi(47,"kbd"),TT(48,"Ctrl"),ul(),TT(49," + "),Pi(50,"kbd",3),TT(51,"\u2192"),ul(),TT(52," (Right Arrow)"),ul()(),Pi(53,"tr")(54,"td"),TT(55,"Cycle through dashboards"),ul(),Pi(56,"td"),TT(57,"Swipe up/down"),ul(),Pi(58,"td"),TT(59,"Click, drag up/down, and release"),ul(),Pi(60,"td")(61,"kbd"),TT(62,"Shift"),ul(),TT(63," + "),Pi(64,"kbd"),TT(65,"Ctrl"),ul(),TT(66," + "),Pi(67,"kbd",3),TT(68,"\u2191"),ul(),TT(69,"/"),Pi(70,"kbd",3),TT(71,"\u2193"),ul(),TT(72," (Up/Down Arrow)"),ul()(),Pi(73,"tr")(74,"td"),TT(75,"Toggle Fullscreen"),ul(),Pi(76,"td"),TT(77,"N/A"),ul(),Pi(78,"td"),TT(79,"N/A"),ul(),Pi(80,"td")(81,"kbd"),TT(82,"Shift"),ul(),TT(83," + "),Pi(84,"kbd"),TT(85,"Ctrl"),ul(),TT(86," + "),Pi(87,"kbd"),TT(88,"F"),ul()()(),Pi(89,"tr")(90,"td"),TT(91,"Toggle Night mode"),ul(),Pi(92,"td"),TT(93,"N/A"),ul(),Pi(94,"td"),TT(95,"N/A"),ul(),Pi(96,"td")(97,"kbd"),TT(98,"Shift"),ul(),TT(99," + "),Pi(100,"kbd"),TT(101,"Ctrl"),ul(),TT(102," + "),Pi(103,"kbd"),TT(104,"N"),ul()()(),Pi(105,"tr")(106,"td"),TT(107,"Toggle dashboard edit mode"),ul(),Pi(108,"td"),TT(109,"N/A"),ul(),Pi(110,"td"),TT(111,"N/A"),ul(),Pi(112,"td")(113,"kbd"),TT(114,"Shift"),ul(),TT(115," + "),Pi(116,"kbd"),TT(117,"Ctrl"),ul(),TT(118," + "),Pi(119,"kbd"),TT(120,"E"),ul()()()()(),Pi(121,"i"),TT(122,"Note that the words Touch and Tap are synonymous with mouse Click."),ul(),$h(123,"br")(124,"br"),Pi(125,"h3"),TT(126,"Login to Signal K"),ul(),Pi(127,"p"),TT(128," The first step is to configure Signal K server authentication ("),Pi(129,"i"),TT(130,"a pre-existing Signal K server username and password is required"),ul(),TT(131,"). Go to KIP's Connectivity options, toggle "),Pi(132,"strong"),TT(133,"Login to server"),ul(),TT(134,", enter your Signal K credentials and click "),Pi(135,"strong"),TT(136,"Sign in"),ul(),TT(137,". Once completed, click the upper right X button to get back to this dashboard ("),Pi(138,"a",4),TT(139,"Connectivity options"),ul(),TT(140,"). "),ul(),Pi(141,"ul")(142,"li"),TT(143," If you don\u2019t have a Signal K account, ask your captain or access the Signal K Admin Settings / Users page and create a user. "),ul(),Pi(144,"li"),TT(145," If you see an error, double-check your username and password, and make sure your device is on the same network as your Signal K server. "),ul()(),Pi(146,"h3"),TT(147,"Option 1: Load Demonstration Dashboards"),ul(),Pi(148,"p"),TT(149," Try the sample dashboards using data from your server: "),$h(150,"br"),Pi(151,"button",5),Qh("click",function(){ud(r);let l=qw();return dd(l.loadDemoConfig())}),TT(152,"Load Demo"),ul()(),Pi(153,"h3"),TT(154,"Option 2: Create Your Own Layout"),ul(),Pi(155,"p"),TT(156,' The text you are reading is actually a widget that fills half of the dashboard. The screen is split in halves at the middle. This mode is called Chartplotter mode. It can later be turned off in Settings / Options / Display. Dashboards are "Locked" by default to prevent accidental modifications. To edit a dashboard, swipe left and hit the bottom unlock menu button. Note that you can add and manage dashboards using the Settings button from the Actions menu. '),ul(),Pi(157,"p")(158,"strong"),TT(159,"Try editing the Dashboard now to receive further instructions!"),ul()();}}function v(n,k){n&1&&(Pi(0,"h2"),TT(1,"Changing Layouts"),ul(),TT(2," Follow these simple steps to learn how to change your dashboard layout: "),Pi(3,"ol")(4,"li"),TT(5,"Resize this Tutorial widget using the now visible dashed borders or corners arrows. Resize it so it does not take up all the screen. You need free space in your dashboard to add more widgets. You can delete this Tutorial widget later when you are done with the instructions."),ul(),Pi(6,"li"),TT(7,"Touch & Hold or Click & Hold in an empty area to open the Add Widget selection panel."),ul(),Pi(8,"li"),TT(9,"Choose a widget from the selection panel to add it to the dashboard."),ul()(),Pi(10,"h3"),TT(11,"Possible widget operations"),ul(),Pi(12,"ul")(13,"li")(14,"strong"),TT(15,"Touch and drag"),ul(),TT(16," to move widgets"),ul(),Pi(17,"li")(18,"strong"),TT(19,"Drag corners and sides"),ul(),TT(20," to resize widgets"),ul(),Pi(21,"li")(22,"strong"),TT(23,"Double Tap"),ul(),TT(24," on a widget to configure it"),ul(),Pi(25,"li")(26,"strong"),TT(27,"Press and Hold"),ul(),TT(28," on a widget to delete or duplicate widgets"),ul()(),Pi(29,"h2"),TT(30,"Exiting dashboard edit mode"),ul(),Pi(31,"p"),TT(32,"Use the Save or Cancel buttons in the lower right corner to either persist your changes or revert changes."),ul(),Pi(33,"h2"),TT(34,"Adding more dashboards"),ul(),Pi(35,"p"),TT(36,"Swipe left and hit the Dashboards button. From this page you can add, rename, order, delete, and duplicate entire dashboards."),ul());}var N=(()=>{class n{id=Hj.required();type=Hj.required();theme=Hj.required();static DEFAULT_CONFIG={filterSelfPaths:true};dashboard=w(G);settings=w(Gi);loadDemoConfig(){this.settings.loadDemoConfig();}static \u0275fac=function(o){return new(o||n)};static \u0275cmp=JD({type:n,selectors:[["widget-tutorial"]],inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:3,vars:1,consts:[[1,"tutorial-container"],["routerLink","/help"],[1,"nav-table"],[2,"font-size","x-large"],["routerLink","/options"],["mat-flat-button","",2,"margin-left","15px",3,"click"]],template:function(o,l){o&1&&(Pi(0,"div",0),_w(1,y,160,0)(2,v,37,0),ul()),o&2&&(EE(),Mw(l.dashboard.isDashboardStatic()?1:2));},dependencies:[xp,si],styles:[".tutorial-container[_ngcontent-%COMP%]{position:absolute;top:0;left:0;display:block;height:100%;width:100%;overflow-y:auto}.tutorial-container[_ngcontent-%COMP%]{padding:0 15px}.nav-table[_ngcontent-%COMP%]{width:100%;border-collapse:collapse;margin-bottom:2em}.nav-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], .nav-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{border:1px solid #bbb;padding:.5em 1em;text-align:center}.nav-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{background:#ddd;color:#222;font-weight:700}.nav-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:nth-child(2n){background:#242424}.warning[_ngcontent-%COMP%]{color:#b71c1c}.button-group[_ngcontent-%COMP%]{margin-top:2em;display:flex;gap:20px}a[_ngcontent-%COMP%]:visited, a[_ngcontent-%COMP%]:link{color:var(--kip-blue-color)}"]})}return n})();export{N as WidgetTutorialComponent};
1
+ import {d1 as Hj,w,a as G,G as Gi,J as JD,bh as xp,bP as si,P as Pi,_ as _w,u as ul,e as EE,M as Mw,T as TT,h as Fw,c as $h,k as Qh,l as ud,g as qw,m as dd}from'./main-IINF7HD6.js';function y(n,k){if(n&1){let r=Fw();Pi(0,"h3"),TT(1,"Getting Started"),ul(),Pi(2,"p"),TT(3,"Welcome to KIP! Here are some basic gestures to help you navigate the application. Access the "),Pi(4,"a",1),TT(5,"KIP Help"),ul(),TT(6," documentation to learn more about KIP."),ul(),Pi(7,"table",2)(8,"thead")(9,"tr")(10,"th"),TT(11,"Actions"),ul(),Pi(12,"th"),TT(13,"Touch"),ul(),Pi(14,"th"),TT(15,"Mouse"),ul(),Pi(16,"th"),TT(17,"Keyboard Shortcuts"),ul()()(),Pi(18,"tbody")(19,"tr")(20,"td"),TT(21,"Open Actions menu"),ul(),Pi(22,"td"),TT(23,"Swipe left"),ul(),Pi(24,"td"),TT(25,"Click, drag left, and release"),ul(),Pi(26,"td")(27,"kbd"),TT(28,"Shift"),ul(),TT(29," + "),Pi(30,"kbd"),TT(31,"Ctrl"),ul(),TT(32," + "),Pi(33,"kbd",3),TT(34,"\u2190"),ul(),TT(35," (Left Arrow)"),ul()(),Pi(36,"tr")(37,"td"),TT(38,"Open Notification menu"),ul(),Pi(39,"td"),TT(40,"Swipe right"),ul(),Pi(41,"td"),TT(42,"Click, drag right, and release"),ul(),Pi(43,"td")(44,"kbd"),TT(45,"Shift"),ul(),TT(46," + "),Pi(47,"kbd"),TT(48,"Ctrl"),ul(),TT(49," + "),Pi(50,"kbd",3),TT(51,"\u2192"),ul(),TT(52," (Right Arrow)"),ul()(),Pi(53,"tr")(54,"td"),TT(55,"Cycle through dashboards"),ul(),Pi(56,"td"),TT(57,"Swipe up/down"),ul(),Pi(58,"td"),TT(59,"Click, drag up/down, and release"),ul(),Pi(60,"td")(61,"kbd"),TT(62,"Shift"),ul(),TT(63," + "),Pi(64,"kbd"),TT(65,"Ctrl"),ul(),TT(66," + "),Pi(67,"kbd",3),TT(68,"\u2191"),ul(),TT(69,"/"),Pi(70,"kbd",3),TT(71,"\u2193"),ul(),TT(72," (Up/Down Arrow)"),ul()(),Pi(73,"tr")(74,"td"),TT(75,"Toggle Fullscreen"),ul(),Pi(76,"td"),TT(77,"N/A"),ul(),Pi(78,"td"),TT(79,"N/A"),ul(),Pi(80,"td")(81,"kbd"),TT(82,"Shift"),ul(),TT(83," + "),Pi(84,"kbd"),TT(85,"Ctrl"),ul(),TT(86," + "),Pi(87,"kbd"),TT(88,"F"),ul()()(),Pi(89,"tr")(90,"td"),TT(91,"Toggle Night mode"),ul(),Pi(92,"td"),TT(93,"N/A"),ul(),Pi(94,"td"),TT(95,"N/A"),ul(),Pi(96,"td")(97,"kbd"),TT(98,"Shift"),ul(),TT(99," + "),Pi(100,"kbd"),TT(101,"Ctrl"),ul(),TT(102," + "),Pi(103,"kbd"),TT(104,"N"),ul()()(),Pi(105,"tr")(106,"td"),TT(107,"Toggle dashboard edit mode"),ul(),Pi(108,"td"),TT(109,"N/A"),ul(),Pi(110,"td"),TT(111,"N/A"),ul(),Pi(112,"td")(113,"kbd"),TT(114,"Shift"),ul(),TT(115," + "),Pi(116,"kbd"),TT(117,"Ctrl"),ul(),TT(118," + "),Pi(119,"kbd"),TT(120,"E"),ul()()()()(),Pi(121,"i"),TT(122,"Note that the words Touch and Tap are synonymous with mouse Click."),ul(),$h(123,"br")(124,"br"),Pi(125,"h3"),TT(126,"Login to Signal K"),ul(),Pi(127,"p"),TT(128," The first step is to configure Signal K server authentication ("),Pi(129,"i"),TT(130,"a pre-existing Signal K server username and password is required"),ul(),TT(131,"). Go to KIP's Connectivity options, toggle "),Pi(132,"strong"),TT(133,"Login to server"),ul(),TT(134,", enter your Signal K credentials and click "),Pi(135,"strong"),TT(136,"Sign in"),ul(),TT(137,". Once completed, click the upper right X button to get back to this dashboard ("),Pi(138,"a",4),TT(139,"Connectivity options"),ul(),TT(140,"). "),ul(),Pi(141,"ul")(142,"li"),TT(143," If you don\u2019t have a Signal K account, ask your captain or access the Signal K Admin Settings / Users page and create a user. "),ul(),Pi(144,"li"),TT(145," If you see an error, double-check your username and password, and make sure your device is on the same network as your Signal K server. "),ul()(),Pi(146,"h3"),TT(147,"Option 1: Load Demonstration Dashboards"),ul(),Pi(148,"p"),TT(149," Try the sample dashboards using data from your server: "),$h(150,"br"),Pi(151,"button",5),Qh("click",function(){ud(r);let l=qw();return dd(l.loadDemoConfig())}),TT(152,"Load Demo"),ul()(),Pi(153,"h3"),TT(154,"Option 2: Create Your Own Layout"),ul(),Pi(155,"p"),TT(156,' The text you are reading is actually a widget that fills half of the dashboard. The screen is split in halves at the middle. This mode is called Chartplotter mode. It can later be turned off in Settings / Options / Display. Dashboards are "Locked" by default to prevent accidental modifications. To edit a dashboard, swipe left and hit the bottom unlock menu button. Note that you can add and manage dashboards using the Settings button from the Actions menu. '),ul(),Pi(157,"p")(158,"strong"),TT(159,"Try editing the Dashboard now to receive further instructions!"),ul()();}}function v(n,k){n&1&&(Pi(0,"h2"),TT(1,"Changing Layouts"),ul(),TT(2," Follow these simple steps to learn how to change your dashboard layout: "),Pi(3,"ol")(4,"li"),TT(5,"Resize this Tutorial widget using the now visible dashed borders or corners arrows. Resize it so it does not take up all the screen. You need free space in your dashboard to add more widgets. You can delete this Tutorial widget later when you are done with the instructions."),ul(),Pi(6,"li"),TT(7,"Touch & Hold or Click & Hold in an empty area to open the Add Widget selection panel."),ul(),Pi(8,"li"),TT(9,"Choose a widget from the selection panel to add it to the dashboard."),ul()(),Pi(10,"h3"),TT(11,"Possible widget operations"),ul(),Pi(12,"ul")(13,"li")(14,"strong"),TT(15,"Touch and drag"),ul(),TT(16," to move widgets"),ul(),Pi(17,"li")(18,"strong"),TT(19,"Drag corners and sides"),ul(),TT(20," to resize widgets"),ul(),Pi(21,"li")(22,"strong"),TT(23,"Double Tap"),ul(),TT(24," on a widget to configure it"),ul(),Pi(25,"li")(26,"strong"),TT(27,"Press and Hold"),ul(),TT(28," on a widget to delete or duplicate widgets"),ul()(),Pi(29,"h2"),TT(30,"Exiting dashboard edit mode"),ul(),Pi(31,"p"),TT(32,"Use the Save or Cancel buttons in the lower right corner to either persist your changes or revert changes."),ul(),Pi(33,"h2"),TT(34,"Adding more dashboards"),ul(),Pi(35,"p"),TT(36,"Swipe left and hit the Dashboards button. From this page you can add, rename, order, delete, and duplicate entire dashboards."),ul());}var N=(()=>{class n{id=Hj.required();type=Hj.required();theme=Hj.required();static DEFAULT_CONFIG={filterSelfPaths:true};dashboard=w(G);settings=w(Gi);loadDemoConfig(){this.settings.loadDemoConfig();}static \u0275fac=function(o){return new(o||n)};static \u0275cmp=JD({type:n,selectors:[["widget-tutorial"]],inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:3,vars:1,consts:[[1,"tutorial-container"],["routerLink","/help"],[1,"nav-table"],[2,"font-size","x-large"],["routerLink","/options"],["mat-flat-button","",2,"margin-left","15px",3,"click"]],template:function(o,l){o&1&&(Pi(0,"div",0),_w(1,y,160,0)(2,v,37,0),ul()),o&2&&(EE(),Mw(l.dashboard.isDashboardStatic()?1:2));},dependencies:[xp,si],styles:[".tutorial-container[_ngcontent-%COMP%]{position:absolute;top:0;left:0;display:block;height:100%;width:100%;overflow-y:auto}.tutorial-container[_ngcontent-%COMP%]{padding:0 15px}.nav-table[_ngcontent-%COMP%]{width:100%;border-collapse:collapse;margin-bottom:2em}.nav-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], .nav-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{border:1px solid #bbb;padding:.5em 1em;text-align:center}.nav-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{background:#ddd;color:#222;font-weight:700}.nav-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:nth-child(2n){background:#242424}.warning[_ngcontent-%COMP%]{color:#b71c1c}.button-group[_ngcontent-%COMP%]{margin-top:2em;display:flex;gap:20px}a[_ngcontent-%COMP%]:visited, a[_ngcontent-%COMP%]:link{color:var(--kip-blue-color)}"]})}return n})();export{N as WidgetTutorialComponent};
@@ -1 +1 @@
1
- import {d1 as Hj,w,n as G,J as JD,O as Op,o as eu,y as yt,b as wt,P as Pi,c as $h,u as ul,T as TT,k as Qh,e as EE,d as ig,B as Bh,aA as gg}from'./main-F7NMHHV4.js';var O=(()=>{class a{pageTitle=Hj.required();svgIconId=Hj.required();_router=w(G);backPage(){this._router.navigate(["/settings"]);}closePage(){this._router.navigate(["/dashboard"]);}static \u0275fac=function(n){return new(n||a)};static \u0275cmp=JD({type:a,selectors:[["page-header"]],inputs:{pageTitle:[1,"pageTitle"],svgIconId:[1,"svgIconId"]},decls:11,vars:6,consts:[[1,"page-icon-container"],["aria-hidden","false",3,"svgIcon"],[1,"page-title"],[1,"dialog-close-icon"],["mat-icon-button","",3,"click"]],template:function(n,i){n&1&&(Pi(0,"div",0),$h(1,"mat-icon",1),ul(),Pi(2,"h6",2),TT(3),ul(),Pi(4,"div",3)(5,"button",4),Qh("click",function(){return i.backPage()}),Pi(6,"mat-icon"),TT(7,"arrow_back_ios"),ul()(),Pi(8,"button",4),Qh("click",function(){return i.closePage()}),Pi(9,"mat-icon"),TT(10,"close"),ul()()()),n&2&&(EE(),ig("width",24,"px")("height",24,"px"),Bh("svgIcon",i.svgIconId()),EE(2),gg(i.pageTitle()));},dependencies:[Op,eu,yt,wt],styles:["[_nghost-%COMP%]{display:flex;justify-content:space-between;align-items:center;flex-direction:row;flex-wrap:nowrap}.page-icon-container[_ngcontent-%COMP%]{width:100px;height:max-content;padding-left:15px;padding-top:6px}.page-title[_ngcontent-%COMP%]{margin-block-start:0px;margin-block-end:0px;padding:18px 0 13px;color:var(--mat-dialog-subhead-color, var(--mat-sys-on-surface, rgba(0, 0, 0, .87)));font-family:var(--mat-dialog-subhead-font, var(--mat-sys-headline-small-font, inherit));line-height:var(--mat-dialog-subhead-line-height, var(--mat-sys-headline-small-line-height, 1.5rem));font-size:var(--mat-dialog-subhead-size, var(--mat-sys-headline-small-size, 1rem));font-weight:var(--mat-dialog-subhead-weight, var(--mat-sys-headline-small-weight, 400));letter-spacing:var(--mat-dialog-subhead-tracking, var(--mat-sys-headline-small-tracking, .03125em))}.dialog-close-icon[_ngcontent-%COMP%]{display:flex;flex-direction:row;flex-wrap:nowrap;gap:5px;padding-right:15px}.mat-mdc-dialog-content[_ngcontent-%COMP%]{max-height:max-content}"]})}return a})();export{O};
1
+ import {d1 as Hj,w,n as G,J as JD,O as Op,o as eu,y as yt,b as wt,P as Pi,c as $h,u as ul,T as TT,k as Qh,e as EE,d as ig,B as Bh,aA as gg}from'./main-IINF7HD6.js';var O=(()=>{class a{pageTitle=Hj.required();svgIconId=Hj.required();_router=w(G);backPage(){this._router.navigate(["/settings"]);}closePage(){this._router.navigate(["/dashboard"]);}static \u0275fac=function(n){return new(n||a)};static \u0275cmp=JD({type:a,selectors:[["page-header"]],inputs:{pageTitle:[1,"pageTitle"],svgIconId:[1,"svgIconId"]},decls:11,vars:6,consts:[[1,"page-icon-container"],["aria-hidden","false",3,"svgIcon"],[1,"page-title"],[1,"dialog-close-icon"],["mat-icon-button","",3,"click"]],template:function(n,i){n&1&&(Pi(0,"div",0),$h(1,"mat-icon",1),ul(),Pi(2,"h6",2),TT(3),ul(),Pi(4,"div",3)(5,"button",4),Qh("click",function(){return i.backPage()}),Pi(6,"mat-icon"),TT(7,"arrow_back_ios"),ul()(),Pi(8,"button",4),Qh("click",function(){return i.closePage()}),Pi(9,"mat-icon"),TT(10,"close"),ul()()()),n&2&&(EE(),ig("width",24,"px")("height",24,"px"),Bh("svgIcon",i.svgIconId()),EE(2),gg(i.pageTitle()));},dependencies:[Op,eu,yt,wt],styles:["[_nghost-%COMP%]{display:flex;justify-content:space-between;align-items:center;flex-direction:row;flex-wrap:nowrap}.page-icon-container[_ngcontent-%COMP%]{width:100px;height:max-content;padding-left:15px;padding-top:6px}.page-title[_ngcontent-%COMP%]{margin-block-start:0px;margin-block-end:0px;padding:18px 0 13px;color:var(--mat-dialog-subhead-color, var(--mat-sys-on-surface, rgba(0, 0, 0, .87)));font-family:var(--mat-dialog-subhead-font, var(--mat-sys-headline-small-font, inherit));line-height:var(--mat-dialog-subhead-line-height, var(--mat-sys-headline-small-line-height, 1.5rem));font-size:var(--mat-dialog-subhead-size, var(--mat-sys-headline-small-size, 1rem));font-weight:var(--mat-dialog-subhead-weight, var(--mat-sys-headline-small-weight, 400));letter-spacing:var(--mat-dialog-subhead-tracking, var(--mat-sys-headline-small-tracking, .03125em))}.dialog-close-icon[_ngcontent-%COMP%]{display:flex;flex-direction:row;flex-wrap:nowrap;gap:5px;padding-right:15px}.mat-mdc-dialog-content[_ngcontent-%COMP%]{max-height:max-content}"]})}return a})();export{O};
@@ -1 +1 @@
1
- import {C,e}from'./chunk-CzEDfe2A.js';import {g as ge$2}from'./chunk-TakPRI3t.js';import {e9 as a,d1 as Hj,w,du as p,aS as De,bu as ut,aY as xe,$ as $j,v as vt,D as Dt,F as Fa,dn as ge$1,a_ as Gp,cv as G,cw as z,dx as n$1,J as JD,dC as x,c as $h,cn as wd,_ as _w,B as Bh,e as EE,M as Mw,f as eg,K as Kw,P as Pi,T as TT,u as ul}from'./main-F7NMHHV4.js';import {c}from'./chunk-CRy9Da7a.js';var ge=["chargerSvg"];function me(c,e){c&1&&(Pi(0,"div",3)(1,"div",4),TT(2,"No chargers detected"),ul(),Pi(3,"div",5),TT(4,"Check Signal K charger paths or select chargers in widget settings."),ul()());}function fe(c){return c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var le=class c$1{static CHARGER_DESCRIPTOR=a("widget-charger");static SELF_ROOT_PATH=(()=>{let e=c$1.CHARGER_DESCRIPTOR?.selfRootPath;if(!e)throw new Error("[WidgetChargerComponent] Descriptor missing or selfRootPath not set; check widget registration.");return e})();static ROOT_PATTERN=`${c$1.SELF_ROOT_PATH}.*`;static PATH_REGEX=new RegExp(`^${fe(c$1.SELF_ROOT_PATH)}\\.([^.]+)\\.(.+)$`);static VIEWBOX_WIDTH=200;static CARD_HEIGHT=100;static COMPACT_CARD_HEIGHT=100;static CARD_GAP=8;static PATH_BATCH_WINDOW_MS=500;static CHARGER_DISPLAY_BASE_WIDTH=145;static CHARGER_DISPLAY_BASE_HEIGHT=37;static CHARGER_DISPLAY_HORIZONTAL_MARGIN=40;static DEFAULT_CONFIG={color:"contrast",ignoreZones:false,charger:{trackedDevices:[],optionsById:{}}};id=Hj.required();type=Hj.required();theme=Hj.required();renderMode=Hj(null);runtime=w(p);data=w(De);units=w(ut);destroyRef=w(xe);svgRef=$j.required("chargerSvg");svg;layer;pendingPathUpdates=new Map;pathBatchTimerId=null;initialPathPaintDone=false;renderFrameId=null;pendingRenderSnapshot=null;discoveredChargerIds=vt([]);trackedDevices=vt([]);chargersByKey=vt({});visibleChargerKeys=Dt(()=>{let e=this.trackedDevices();if(e.length)return e.map(s=>s.key);let r=this.chargersByKey(),t=new Set(this.discoveredChargerIds()),i=Object.keys(r).filter(s=>{let o=r[s];return !!o&&t.has(o.id)}).sort((s,o)=>s.localeCompare(o)),a=new Map;return i.forEach(s=>{let o=r[s];o&&s!==o.id&&a.set(o.id,true);}),i.filter(s=>{let o=r[s];return o?s!==o.id?true:!a.get(o.id):false})});visibleChargers=Dt(()=>{let e=this.visibleChargerKeys(),r=this.chargersByKey();return e.map(t=>r[t]).filter(t=>!!t)});hasChargers=Dt(()=>this.visibleChargers().length>0);isCompactCardMode=Dt(()=>this.renderMode()==="compact");colorRole=Dt(()=>this.runtime.options()?.color??"contrast");ignoreZones=Dt(()=>this.runtime.options()?.ignoreZones??false);displayLabel=Dt(()=>{let e=this.visibleChargers();return e.length!==1?"Chargers":this.resolveTitleText(e[0])});labelColor=Dt(()=>{let e=this.theme();return e?c(this.colorRole(),e).dim:"var(--kip-contrast-dim-color)"});widgetColors=Dt(()=>{let e=this.theme();return e?c(this.colorRole(),e):null});displayModels=Dt(()=>{let e=this.visibleChargers(),r=new Map;e.forEach(a=>r.set(a.id,(r.get(a.id)??0)+1));let t=new Set([...r.entries()].filter(([,a])=>a>1).map(([a])=>a)),i={};for(let a of e){let s=a.deviceKey??a.id,o=!!a.source&&t.has(a.id),[n,m,p,h]=this.buildMetricRows(a);i[s]={id:a.id,source:a.source??null,deviceKey:a.deviceKey,titleText:this.resolveTitleText(a,o),modeText:this.isCompactCardMode()?"":this.resolveModeText(a),voltageText:n,currentText:m,powerText:p,temperatureText:h};}return i});constructor(){Fa(()=>{let t=this.runtime.options();t&&ge$1(()=>this.applyConfig(t));}),Fa(()=>{let t=this.displayModels(),i=this.visibleChargers(),a=this.widgetColors();!this.svg||!a||this.requestRender({chargers:i,displayModels:t,widgetColors:a});});let e=[this.data.subscribePathTreeWithInitial(c$1.ROOT_PATTERN)],r=false;for(let t of e)if(t.initial.length){r=true;for(let i of t.initial)this.enqueuePathUpdate(i,true);}r&&(this.flushPendingPathUpdates(),this.initialPathPaintDone=true);for(let t of e)t.live$.pipe(Gp(this.destroyRef)).subscribe(i=>{this.enqueuePathUpdate(i);});}ngAfterViewInit(){this.initializeSvg(),this.requestRender();}ngOnDestroy(){this.pathBatchTimerId!==null&&(clearTimeout(this.pathBatchTimerId),this.pathBatchTimerId=null),this.renderFrameId!==null&&(cancelAnimationFrame(this.renderFrameId),this.renderFrameId=null),this.pendingRenderSnapshot=null;}initializeSvg(){this.svg=ge$2(this.svgRef().nativeElement),this.svg.attr("viewBox",`0 0 ${c$1.VIEWBOX_WIDTH} ${c$1.CARD_HEIGHT}`).attr("preserveAspectRatio","xMidYMid meet").attr("role","img").attr("aria-label","Charger View"),this.layer=this.svg.append("g").attr("class","charger-layer");}applyConfig(e){let r=this.normalizeTrackedDevices(e.charger?.trackedDevices);this.trackedDevices.set(r),this.reprojectSnapshotsToDeviceKeys(r);}normalizeTrackedDevices(e){if(!Array.isArray(e))return [];let r=new Map;return e.forEach(t=>{if(!t||typeof t!="object")return;let i=t,a=this.normalizeOptionalString(i.id),s=this.normalizeOptionalString(i.source);if(!a||!s)return;let o=this.normalizeOptionalString(i.key)??`${a}||${s}`;r.set(o,{id:a,source:s,key:o});}),[...r.values()].sort((t,i)=>t.key.localeCompare(i.key))}buildIdToDeviceKeysMap(){let e=new Map;return this.trackedDevices().forEach(r=>{let t=e.get(r.id)??[];t.push(r.key),e.set(r.id,t);}),e}reprojectSnapshotsToDeviceKeys(e){if(!e.length)return;let r=new Map,t=new Map;e.forEach(i=>{let a=r.get(i.id)??[];a.push(i.key),r.set(i.id,a),t.set(i.key,i);}),this.chargersByKey.update(i=>{let a=i,s=false;return r.forEach((o,n)=>{let m=i[n];if(m){for(let p of o){if(i[p])continue;let h=t.get(p);s||(a=G({},i),s=true),a[p]=z(G({},m),{source:h?.source??null,deviceKey:p});}a[n]&&(a[n].deviceKey===void 0||a[n].deviceKey===n)&&(s||(a=G({},i),s=true),delete a[n]);}}),s?a:i});}normalizeOptionalString(e){if(typeof e!="string")return null;let r=e.trim();return r.length>0?r:null}enqueuePathUpdate(e,r=false){let t=this.parsePath(e.path);if(!t)return;let i=e.update?.data?.value??null,a=e.update?.state??null,s=this.extractUpdateSource(e),o=`${t.id}::${s??"*"}::${t.key}`;if(this.pendingPathUpdates.set(o,{id:t.id,key:t.key,source:s,value:i,state:a}),!r){if(!this.initialPathPaintDone){this.initialPathPaintDone=true,this.flushPendingPathUpdates();return}this.pathBatchTimerId===null&&(this.pathBatchTimerId=window.setTimeout(()=>{this.pathBatchTimerId=null,this.flushPendingPathUpdates();},c$1.PATH_BATCH_WINDOW_MS));}}parsePath(e){let r=e.match(c$1.PATH_REGEX);return r?{id:r[1],key:r[2]}:null}flushPendingPathUpdates(){if(!this.pendingPathUpdates.size)return;let e=Array.from(this.pendingPathUpdates.values());this.pendingPathUpdates.clear(),new Set(e.map(a=>a.id)).forEach(a=>this.trackDiscoveredCharger(a));let t=this.buildIdToDeviceKeysMap(),i=new Map;this.trackedDevices().forEach(a=>i.set(a.key,a)),this.chargersByKey.update(a=>{let s=a,o=false;for(let n of e){let m=t.get(n.id),p=!!m?.length,h=[];if(p)if(n.source){let y=`${n.id}||${n.source}`;h=m?.includes(y)?[y]:[];}else h=m??[];else h=[n.source?`${n.id}||${n.source}`:n.id];for(let y of h){let b=p?i.get(y):null,f=s[y]??{id:n.id,source:b?.source??n.source??null,deviceKey:p||n.source?y:void 0},d=G({},f);if(!this.applyValue(d,n.key,n.value,n.state))continue;let M=d.rawPower!=null?d.rawPower:d.voltage!=null&&d.current!=null?d.voltage*d.current:null;M!=null?d.power=Number.isFinite(M)?M:null:d.power=null,d.rawPower==null&&(d.powerState=this.resolveMostSevereState(d.voltageState??null,d.currentState??null)),o||(s=G({},s),o=true),s[y]=d;}}return o?s:a});}extractUpdateSource(e){let r=this.normalizeOptionalString(e.source);return r||(this.normalizeOptionalString(e.update?.data?.source)??null)}trackDiscoveredCharger(e){let r=this.discoveredChargerIds();r.includes(e)||this.discoveredChargerIds.set([...r,e].sort((t,i)=>t.localeCompare(i)));}applyValue(e,r,t,i){switch(r){case "name":return this.setValue(e,"name",this.toStringValue(t));case "location":return this.setValue(e,"location",this.toStringValue(t));case "associatedBus":return this.setValue(e,"associatedBus",this.toStringValue(t));case "state":return this.setMetricValue(e,"state","stateState",this.toStringValue(t),i);case "offReason":return this.setMetricValue(e,"offReason","offReasonState",this.toStringValue(t),i);case "error":return this.setMetricValue(e,"error","errorState",this.toStringValue(t),i);case "mode":return this.setMetricValue(e,"mode","modeState",this.toStringValue(t),i);case "modeState":return this.setMetricValue(e,"mode","modeState",this.toStringValue(t),i);case "modeNumber":return this.setMetricValue(e,"modeNumber","modeNumberState",this.toNumber(t,""),i);case "chargingMode":return this.setMetricValue(e,"chargingMode","chargingModeState",this.toStringValue(t),i);case "chargingModeNumber":return this.setMetricValue(e,"chargingModeNumber","chargingModeNumberState",this.toNumber(t,""),i);case "output.voltage":{let a=this.toNumber(t,"V"),s=this.setMetricValue(e,"outputVoltage","outputVoltageState",a,i),o=this.setMetricValue(e,"voltage","voltageState",a,i);return s||o}case "input.voltage":return this.setMetricValue(e,"inputVoltage","inputVoltageState",this.toNumber(t,"V"),i);case "voltage":return this.setMetricValue(e,"voltage","voltageState",this.toNumber(t,"V"),i);case "current":return this.setMetricValue(e,"current","currentState",this.toNumber(t,"A"),i);case "power":return this.setMetricValue(e,"rawPower","powerState",this.toNumber(t,"W"),i);case "temperature":return this.setMetricValue(e,"temperature","temperatureState",this.toNumber(t,this.units.getDefaults().Temperature),i);case "leds.absorption":return this.setMetricValue(e,"ledsAbsorption","ledsAbsorptionState",this.toBoolean(t),i);case "leds.bulk":return this.setMetricValue(e,"ledsBulk","ledsBulkState",this.toBoolean(t),i);case "leds.float":return this.setMetricValue(e,"ledsFloat","ledsFloatState",this.toBoolean(t),i);case "leds.inverter":return this.setMetricValue(e,"ledsInverter","ledsInverterState",this.toBoolean(t),i);case "leds.lowBattery":return this.setMetricValue(e,"ledsLowBattery","ledsLowBatteryState",this.toBoolean(t),i);case "leds.mains":return this.setMetricValue(e,"ledsMains","ledsMainsState",this.toBoolean(t),i);case "leds.overload":return this.setMetricValue(e,"ledsOverload","ledsOverloadState",this.toBoolean(t),i);case "leds.temperature":return this.setMetricValue(e,"ledsTemperature","ledsTemperatureState",this.toBoolean(t),i);default:return false}}setValue(e,r,t){return Object.is(e[r],t)?false:(e[r]=t,true)}setMetricValue(e,r,t,i,a){let s=!Object.is(e[r],i),o=!Object.is(e[t],a);return !s&&!o?false:(e[r]=i,e[t]=a,true)}requestRender(e){let r=this.widgetColors();!this.svg||!r||(this.pendingRenderSnapshot=e??{chargers:this.visibleChargers(),displayModels:this.displayModels(),widgetColors:r},this.renderFrameId===null&&(this.renderFrameId=requestAnimationFrame(()=>{this.renderFrameId=null;let t=this.pendingRenderSnapshot;this.pendingRenderSnapshot=null,t&&this.render(t);})));}render(e$1){if(!this.layer||!this.svg)return;let r=this.isCompactCardMode(),t=r?C:e,i=r?c$1.COMPACT_CARD_HEIGHT:c$1.CARD_HEIGHT,a=c$1.VIEWBOX_WIDTH-c$1.CHARGER_DISPLAY_HORIZONTAL_MARGIN,s=a/c$1.CHARGER_DISPLAY_BASE_WIDTH,o=a,n=(c$1.VIEWBOX_WIDTH-o)/2,m=r?8:t.titleY,p=r?33:60,h=e$1.chargers.map((l,P)=>({key:l.deviceKey??l.id,id:l.id,charger:l,y:P*(i+c$1.CARD_GAP)})),y=h.length?h[h.length-1].y+i:i;this.svg.attr("viewBox",`0 0 ${c$1.VIEWBOX_WIDTH} ${y}`);let b=this.layer.selectAll("g.charger-card").data(h,l=>l.key),f=b.enter().append("g").attr("class","charger-card"),d=f.append("g").attr("class","charger-display-group");d.append("path").attr("class","charger-shape-bulk").attr("d","m 39.280608,10.70371 1.604609,-3.7808024 c 0.06926,-0.1631805 0.314475,-0.553581 0.314475,-0.4368876 v 27.475177 c 0,0.116694 -0.142713,0.210638 -0.319983,0.210638 H 9.2681756 c -0.1772706,0 -0.3711555,-0.105758 -0.319983,-0.210638 l 1.2797184,-2.622833 c 1.150699,-2.358403 3.86281,-5.455024 6.286778,-6.406312 3.251217,-1.275942 7.834296,-2.821704 11.746419,-4.103315 4.312764,-1.412861 9.246151,-5.946636 11.0195,-10.125027 z").attr("transform","matrix(1.1068428,0,0,1.1601894,-8.804611,-6.1382561)").attr("fill","var(--mat-sys-background)").attr("stroke",e$1.widgetColors.color).attr("stroke-width",2).attr("stroke-linejoin","miter").attr("stroke-miterlimit",0).attr("paint-order","markers stroke fill"),d.append("rect").attr("class","charger-shape-absorption").attr("width",19.67485).attr("height",32.383526).attr("x",40.545158).attr("y",1.1331999).attr("rx",.19520389).attr("ry",.24451913).attr("fill","var(--mat-sys-background)").attr("stroke",e$1.widgetColors.color).attr("stroke-width",2).attr("stroke-linecap","butt").attr("stroke-linejoin","miter").attr("stroke-miterlimit",0).attr("paint-order","markers stroke fill"),d.append("path").attr("class","charger-shape-float").attr("d","m 66.03898,6.4101715 4.16646,3.2472635 c 1.876083,1.462185 5.139444,3.529899 7.448846,4.069504 5.055358,1.181215 11.386089,1.251612 11.38595,1.349059 l -0.02667,18.73082 c 0,0.127151 -0.103075,0.230227 -0.230226,0.230227 H 66.03898 c -0.127151,0 -0.230226,-0.103076 -0.230226,-0.230227 V 6.6403978 c 0,-0.1271504 0.103076,-0.2302261 0.230226,-0.2302263 z").attr("transform","matrix(1.1068428,0,0,1.1601894,-8.7228087,-6.1382561)").attr("fill","var(--mat-sys-background)").attr("stroke",e$1.widgetColors.color).attr("stroke-width",2).attr("stroke-linecap","butt").attr("stroke-linejoin","miter").attr("stroke-miterlimit",0).attr("paint-order","markers stroke fill"),d.append("path").attr("class","charger-shape-storage").attr("d","m 93.39395,15.253553 c 2.347866,2.587905 8.59059,4.802212 13.94479,4.852641 11.92289,0.112298 30.60094,0.205911 30.60096,0.259031 l 0.006,13.361558 c 3e-5,0.07786 -0.19912,0.140548 -0.44645,0.140548 h -44.1053 c -0.247332,0 -0.446448,-0.06269 -0.446448,-0.140548 V 15.394101 c 0,-0.07786 0.280259,-0.323728 0.446448,-0.140548 z").attr("transform","matrix(1.1077284,0,0,1.1178939,-8.9068494,-4.6850995)").attr("fill","var(--mat-sys-background)").attr("stroke",e$1.widgetColors.color).attr("stroke-width",2).attr("stroke-linejoin","miter").attr("stroke-miterlimit",0).attr("paint-order","markers stroke fill"),f.append("text").attr("class","charger-title"),f.append("text").attr("class","charger-mode");let E=f.append("text").attr("class","charger-voltage");E.append("tspan").attr("class","voltage-metric-value"),E.append("tspan").attr("class","voltage-metric-unit");let M=f.append("text").attr("class","charger-current");M.append("tspan").attr("class","current-metric-value"),M.append("tspan").attr("class","current-metric-unit");let L=f.append("text").attr("class","charger-power");L.append("tspan").attr("class","power-metric-value"),L.append("tspan").attr("class","power-metric-unit");let z=f.append("text").attr("class","charger-temperature");z.append("tspan").attr("class","temperature-metric-value"),z.append("tspan").attr("class","temperature-metric-unit");let u=f.merge(b);u.attr("transform",l=>`translate(0, ${l.y})`),u.select("g.charger-display-group").attr("transform",`translate(${n}, ${p}) scale(${s})`).each((l,P,ce)=>{let v=this.resolveShapeMode(l.charger),S=this.isShapeMode(v,"power supply"),D=e$1.widgetColors.dim,x="var(--mat-sys-background)",R=this.isShapeMode(v,"sustain")||S?"none":this.isShapeMode(v,"equalization")?"var(--kip-zone-alert-color)":this.isShapeMode(v,"overload")?"var(--kip-zone-alarm-color)":e$1.widgetColors.color,I=ge$2(ce[P]);I.select("path.charger-shape-bulk").attr("fill",this.isShapeMode(v,"bulk")||this.isShapeMode(v,"boost")||S?D:x).attr("stroke",R),I.select("rect.charger-shape-absorption").attr("fill",this.isShapeMode(v,"absorption")||S?D:x).attr("stroke",R),I.select("path.charger-shape-float").attr("fill",this.isShapeMode(v,"float")||S?D:x).attr("stroke",R),I.select("path.charger-shape-storage").attr("fill",this.isShapeMode(v,"storage")||S?D:x).attr("stroke",R);}),e$1.chargers.length>1?u.select("text.charger-title").attr("x",t.titleX).attr("y",m).attr("font-size",t.titleFontSize).attr("fill","var(--kip-contrast-dim-color)").text(l=>e$1.displayModels[l.key]?.titleText??this.resolveTitleText(l.charger)):u.select("text.charger-title").text(""),u.select("text.charger-voltage").attr("x",197).attr("y",25).attr("text-anchor","end").attr("font-size",t.primaryFontSize).attr("font-weight",t.primaryFontWeight).attr("fill","var(--kip-contrast-color)"),u.select("tspan.voltage-metric-value").text(l=>e$1.displayModels[l.key]?.voltageText??""),u.select("tspan.voltage-metric-unit").attr("dx",1).attr("font-size",22).attr("font-weight",500).attr("fill","var(--kip-contrast-color)").text("V"),u.select("text.charger-current").attr("x",197).attr("y",48).attr("text-anchor","end").attr("font-size",t.lineOneFontSize).attr("fill","var(--kip-contrast-color)"),u.select("tspan.current-metric-value").text(l=>e$1.displayModels[l.key]?.currentText??""),u.select("tspan.current-metric-unit").attr("dx",1).attr("font-size",12).attr("fill","var(--kip-contrast-color)").text("A"),u.select("text.charger-power").attr("x",5).attr("y",22).attr("fill","var(--kip-contrast-dim-color)").attr("font-size",10),u.select("tspan.power-metric-value").text(l=>e$1.displayModels[l.key]?.powerText??""),u.select("tspan.power-metric-unit").attr("dx",1).attr("font-size",6).attr("fill","var(--kip-contrast-dim-color)").text("W"),u.select("text.charger-temperature").attr("x",5).attr("y",34).attr("fill","var(--kip-contrast-dim-color)").attr("font-size",10),u.select("tspan.temperature-metric-value").text(l=>e$1.displayModels[l.key]?.temperatureText??""),u.select("tspan.temperature-metric-unit").attr("dx",1).attr("font-size",6).attr("fill","var(--kip-contrast-dim-color)").text(`${this.units.getDefaults().Temperature==="celsius"?"\xB0C":"\xB0F"}`),u.select("text.charger-mode").attr("x",5).attr("y",46).attr("font-size",10).attr("fill","var(--kip-contrast-dim-color)").text(l=>e$1.displayModels[l.key]?.modeText??""),b.exit().remove();}resolveTitleText(e,r=false){let t=e.name||`Charger ${e.id}`;return !r||!e.source?t:`${t} [${e.source}]`}resolveModeText(e){if(e.chargingMode)return `Mode: ${e.chargingMode.charAt(0).toUpperCase()+e.chargingMode.slice(1)}`;if(e.mode)return `Mode: ${e.mode}`;let t=[{active:e.ledsAbsorption,label:"Absorption"},{active:e.ledsBulk,label:"Bulk"},{active:e.ledsFloat,label:"Float"},{active:e.ledsInverter,label:"Inverter"},{active:e.ledsLowBattery,label:"Low Battery"},{active:e.ledsMains,label:"Mains"},{active:e.ledsOverload,label:"Overload"},{active:e.ledsTemperature,label:"Temperature"}].filter(i=>i.active===true).map(i=>i.label);return t.length?`Mode: ${t.join(" / ")}`:"Mode --"}resolveShapeMode(e){return (e.chargingMode??e.mode??"").trim().toLowerCase()}isShapeMode(e,r){return !e||!r?false:e===r||e.includes(r)}buildMetricRows(e){return this.renderMode()==="full"||this.renderMode()===null?[`${this.formatValue(e.voltage,1)}`,`${this.formatValue(e.current,1)}`,`Power: ${this.formatValue(e.power,0)}`,`Temp: ${this.formatTemperature(e.temperature)}`]:[`${this.formatValue(e.voltage,1)}`,`${this.formatValue(e.current,1)}`,`P: ${this.formatValue(e.power,0)}`,`T: ${this.formatTemperature(e.temperature)}`]}formatValue(e,r){return e==null||Number.isNaN(e)?"-":`${e.toFixed(r)}`}formatTemperature(e){return e==null||Number.isNaN(e)?"-":`${e.toFixed(0)}`}toStringValue(e){return typeof e=="string"?e:null}toBoolean(e){if(typeof e=="boolean")return e;if(typeof e=="number"){if(e===1)return true;if(e===0)return false}if(typeof e=="string"){let r=e.trim().toLowerCase();if(r==="true"||r==="1"||r==="on")return true;if(r==="false"||r==="0"||r==="off")return false}return null}resolveMostSevereState(...e){return e.some(r=>r===n$1.Alert)?n$1.Alert:e.some(r=>r===n$1.Alarm)?n$1.Alarm:e.some(r=>r===n$1.Warn)?n$1.Warn:e.some(r=>r===n$1.Normal)?n$1.Normal:null}toNumber(e,r){if(e==null||typeof e=="boolean")return null;let t=typeof e=="number"?e:Number(e);if(!Number.isFinite(t))return null;let i=this.units.convertToUnit(r,t);return Number.isFinite(i)?i:t}static \u0275fac=function(r){return new(r||c$1)};static \u0275cmp=JD({type:c$1,selectors:[["widget-charger"]],viewQuery:function(r,t){r&1&&eg(t.svgRef,ge,5),r&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"],renderMode:[1,"renderMode"]},decls:4,vars:3,consts:[["chargerSvg",""],[3,"text","color"],["aria-hidden","false",1,"charger-svg"],[1,"charger-empty"],[1,"charger-empty-title"],[1,"charger-empty-sub"]],template:function(r,t){r&1&&($h(0,"widget-title",1),wd(),$h(1,"svg",2,0),_w(3,me,5,0,"div",3)),r&2&&(Bh("text",t.displayLabel())("color",t.labelColor()),EE(3),Mw(t.hasChargers()?-1:3));},dependencies:[x],styles:["[_nghost-%COMP%]{display:block;height:100%;width:100%;position:relative;overflow:hidden}.charger-svg[_ngcontent-%COMP%]{display:block;position:absolute;left:0;right:0;top:15%;height:85%;width:100%;overflow:hidden;z-index:20;padding:0 10px 10px}.charger-empty[_ngcontent-%COMP%]{position:absolute;inset:0;margin:10px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;text-align:center;color:var(--mat-sys-on-surface);background:color-mix(in srgb,var(--kip-widget-card-background-color) 92%,transparent)}.charger-empty-title[_ngcontent-%COMP%]{font-size:18px;font-weight:600}.charger-empty-sub[_ngcontent-%COMP%]{font-size:14px;opacity:.8}"]})};export{le as WidgetChargerComponent};
1
+ import {C,e}from'./chunk-DJVnrrxC.js';import {g as ge$2}from'./chunk-TakPRI3t.js';import {e9 as a,d1 as Hj,w,du as p,aS as De,bu as ut,aY as xe,$ as $j,v as vt,D as Dt,F as Fa,dn as ge$1,a_ as Gp,cv as G,cw as z,dx as n$1,J as JD,dC as x,c as $h,cn as wd,_ as _w,B as Bh,e as EE,M as Mw,f as eg,K as Kw,P as Pi,T as TT,u as ul}from'./main-IINF7HD6.js';import {c}from'./chunk-DHj2hm9r.js';var ge=["chargerSvg"];function me(c,e){c&1&&(Pi(0,"div",3)(1,"div",4),TT(2,"No chargers detected"),ul(),Pi(3,"div",5),TT(4,"Check Signal K charger paths or select chargers in widget settings."),ul()());}function fe(c){return c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var le=class c$1{static CHARGER_DESCRIPTOR=a("widget-charger");static SELF_ROOT_PATH=(()=>{let e=c$1.CHARGER_DESCRIPTOR?.selfRootPath;if(!e)throw new Error("[WidgetChargerComponent] Descriptor missing or selfRootPath not set; check widget registration.");return e})();static ROOT_PATTERN=`${c$1.SELF_ROOT_PATH}.*`;static PATH_REGEX=new RegExp(`^${fe(c$1.SELF_ROOT_PATH)}\\.([^.]+)\\.(.+)$`);static VIEWBOX_WIDTH=200;static CARD_HEIGHT=100;static COMPACT_CARD_HEIGHT=100;static CARD_GAP=8;static PATH_BATCH_WINDOW_MS=500;static CHARGER_DISPLAY_BASE_WIDTH=145;static CHARGER_DISPLAY_BASE_HEIGHT=37;static CHARGER_DISPLAY_HORIZONTAL_MARGIN=40;static DEFAULT_CONFIG={color:"contrast",ignoreZones:false,charger:{trackedDevices:[],optionsById:{}}};id=Hj.required();type=Hj.required();theme=Hj.required();renderMode=Hj(null);runtime=w(p);data=w(De);units=w(ut);destroyRef=w(xe);svgRef=$j.required("chargerSvg");svg;layer;pendingPathUpdates=new Map;pathBatchTimerId=null;initialPathPaintDone=false;renderFrameId=null;pendingRenderSnapshot=null;discoveredChargerIds=vt([]);trackedDevices=vt([]);chargersByKey=vt({});visibleChargerKeys=Dt(()=>{let e=this.trackedDevices();if(e.length)return e.map(s=>s.key);let r=this.chargersByKey(),t=new Set(this.discoveredChargerIds()),i=Object.keys(r).filter(s=>{let o=r[s];return !!o&&t.has(o.id)}).sort((s,o)=>s.localeCompare(o)),a=new Map;return i.forEach(s=>{let o=r[s];o&&s!==o.id&&a.set(o.id,true);}),i.filter(s=>{let o=r[s];return o?s!==o.id?true:!a.get(o.id):false})});visibleChargers=Dt(()=>{let e=this.visibleChargerKeys(),r=this.chargersByKey();return e.map(t=>r[t]).filter(t=>!!t)});hasChargers=Dt(()=>this.visibleChargers().length>0);isCompactCardMode=Dt(()=>this.renderMode()==="compact");colorRole=Dt(()=>this.runtime.options()?.color??"contrast");ignoreZones=Dt(()=>this.runtime.options()?.ignoreZones??false);displayLabel=Dt(()=>{let e=this.visibleChargers();return e.length!==1?"Chargers":this.resolveTitleText(e[0])});labelColor=Dt(()=>{let e=this.theme();return e?c(this.colorRole(),e).dim:"var(--kip-contrast-dim-color)"});widgetColors=Dt(()=>{let e=this.theme();return e?c(this.colorRole(),e):null});displayModels=Dt(()=>{let e=this.visibleChargers(),r=new Map;e.forEach(a=>r.set(a.id,(r.get(a.id)??0)+1));let t=new Set([...r.entries()].filter(([,a])=>a>1).map(([a])=>a)),i={};for(let a of e){let s=a.deviceKey??a.id,o=!!a.source&&t.has(a.id),[n,m,p,h]=this.buildMetricRows(a);i[s]={id:a.id,source:a.source??null,deviceKey:a.deviceKey,titleText:this.resolveTitleText(a,o),modeText:this.isCompactCardMode()?"":this.resolveModeText(a),voltageText:n,currentText:m,powerText:p,temperatureText:h};}return i});constructor(){Fa(()=>{let t=this.runtime.options();t&&ge$1(()=>this.applyConfig(t));}),Fa(()=>{let t=this.displayModels(),i=this.visibleChargers(),a=this.widgetColors();!this.svg||!a||this.requestRender({chargers:i,displayModels:t,widgetColors:a});});let e=[this.data.subscribePathTreeWithInitial(c$1.ROOT_PATTERN)],r=false;for(let t of e)if(t.initial.length){r=true;for(let i of t.initial)this.enqueuePathUpdate(i,true);}r&&(this.flushPendingPathUpdates(),this.initialPathPaintDone=true);for(let t of e)t.live$.pipe(Gp(this.destroyRef)).subscribe(i=>{this.enqueuePathUpdate(i);});}ngAfterViewInit(){this.initializeSvg(),this.requestRender();}ngOnDestroy(){this.pathBatchTimerId!==null&&(clearTimeout(this.pathBatchTimerId),this.pathBatchTimerId=null),this.renderFrameId!==null&&(cancelAnimationFrame(this.renderFrameId),this.renderFrameId=null),this.pendingRenderSnapshot=null;}initializeSvg(){this.svg=ge$2(this.svgRef().nativeElement),this.svg.attr("viewBox",`0 0 ${c$1.VIEWBOX_WIDTH} ${c$1.CARD_HEIGHT}`).attr("preserveAspectRatio","xMidYMid meet").attr("role","img").attr("aria-label","Charger View"),this.layer=this.svg.append("g").attr("class","charger-layer");}applyConfig(e){let r=this.normalizeTrackedDevices(e.charger?.trackedDevices);this.trackedDevices.set(r),this.reprojectSnapshotsToDeviceKeys(r);}normalizeTrackedDevices(e){if(!Array.isArray(e))return [];let r=new Map;return e.forEach(t=>{if(!t||typeof t!="object")return;let i=t,a=this.normalizeOptionalString(i.id),s=this.normalizeOptionalString(i.source);if(!a||!s)return;let o=this.normalizeOptionalString(i.key)??`${a}||${s}`;r.set(o,{id:a,source:s,key:o});}),[...r.values()].sort((t,i)=>t.key.localeCompare(i.key))}buildIdToDeviceKeysMap(){let e=new Map;return this.trackedDevices().forEach(r=>{let t=e.get(r.id)??[];t.push(r.key),e.set(r.id,t);}),e}reprojectSnapshotsToDeviceKeys(e){if(!e.length)return;let r=new Map,t=new Map;e.forEach(i=>{let a=r.get(i.id)??[];a.push(i.key),r.set(i.id,a),t.set(i.key,i);}),this.chargersByKey.update(i=>{let a=i,s=false;return r.forEach((o,n)=>{let m=i[n];if(m){for(let p of o){if(i[p])continue;let h=t.get(p);s||(a=G({},i),s=true),a[p]=z(G({},m),{source:h?.source??null,deviceKey:p});}a[n]&&(a[n].deviceKey===void 0||a[n].deviceKey===n)&&(s||(a=G({},i),s=true),delete a[n]);}}),s?a:i});}normalizeOptionalString(e){if(typeof e!="string")return null;let r=e.trim();return r.length>0?r:null}enqueuePathUpdate(e,r=false){let t=this.parsePath(e.path);if(!t)return;let i=e.update?.data?.value??null,a=e.update?.state??null,s=this.extractUpdateSource(e),o=`${t.id}::${s??"*"}::${t.key}`;if(this.pendingPathUpdates.set(o,{id:t.id,key:t.key,source:s,value:i,state:a}),!r){if(!this.initialPathPaintDone){this.initialPathPaintDone=true,this.flushPendingPathUpdates();return}this.pathBatchTimerId===null&&(this.pathBatchTimerId=window.setTimeout(()=>{this.pathBatchTimerId=null,this.flushPendingPathUpdates();},c$1.PATH_BATCH_WINDOW_MS));}}parsePath(e){let r=e.match(c$1.PATH_REGEX);return r?{id:r[1],key:r[2]}:null}flushPendingPathUpdates(){if(!this.pendingPathUpdates.size)return;let e=Array.from(this.pendingPathUpdates.values());this.pendingPathUpdates.clear(),new Set(e.map(a=>a.id)).forEach(a=>this.trackDiscoveredCharger(a));let t=this.buildIdToDeviceKeysMap(),i=new Map;this.trackedDevices().forEach(a=>i.set(a.key,a)),this.chargersByKey.update(a=>{let s=a,o=false;for(let n of e){let m=t.get(n.id),p=!!m?.length,h=[];if(p)if(n.source){let y=`${n.id}||${n.source}`;h=m?.includes(y)?[y]:[];}else h=m??[];else h=[n.source?`${n.id}||${n.source}`:n.id];for(let y of h){let b=p?i.get(y):null,f=s[y]??{id:n.id,source:b?.source??n.source??null,deviceKey:p||n.source?y:void 0},d=G({},f);if(!this.applyValue(d,n.key,n.value,n.state))continue;let M=d.rawPower!=null?d.rawPower:d.voltage!=null&&d.current!=null?d.voltage*d.current:null;M!=null?d.power=Number.isFinite(M)?M:null:d.power=null,d.rawPower==null&&(d.powerState=this.resolveMostSevereState(d.voltageState??null,d.currentState??null)),o||(s=G({},s),o=true),s[y]=d;}}return o?s:a});}extractUpdateSource(e){let r=this.normalizeOptionalString(e.source);return r||(this.normalizeOptionalString(e.update?.data?.source)??null)}trackDiscoveredCharger(e){let r=this.discoveredChargerIds();r.includes(e)||this.discoveredChargerIds.set([...r,e].sort((t,i)=>t.localeCompare(i)));}applyValue(e,r,t,i){switch(r){case "name":return this.setValue(e,"name",this.toStringValue(t));case "location":return this.setValue(e,"location",this.toStringValue(t));case "associatedBus":return this.setValue(e,"associatedBus",this.toStringValue(t));case "state":return this.setMetricValue(e,"state","stateState",this.toStringValue(t),i);case "offReason":return this.setMetricValue(e,"offReason","offReasonState",this.toStringValue(t),i);case "error":return this.setMetricValue(e,"error","errorState",this.toStringValue(t),i);case "mode":return this.setMetricValue(e,"mode","modeState",this.toStringValue(t),i);case "modeState":return this.setMetricValue(e,"mode","modeState",this.toStringValue(t),i);case "modeNumber":return this.setMetricValue(e,"modeNumber","modeNumberState",this.toNumber(t,""),i);case "chargingMode":return this.setMetricValue(e,"chargingMode","chargingModeState",this.toStringValue(t),i);case "chargingModeNumber":return this.setMetricValue(e,"chargingModeNumber","chargingModeNumberState",this.toNumber(t,""),i);case "output.voltage":{let a=this.toNumber(t,"V"),s=this.setMetricValue(e,"outputVoltage","outputVoltageState",a,i),o=this.setMetricValue(e,"voltage","voltageState",a,i);return s||o}case "input.voltage":return this.setMetricValue(e,"inputVoltage","inputVoltageState",this.toNumber(t,"V"),i);case "voltage":return this.setMetricValue(e,"voltage","voltageState",this.toNumber(t,"V"),i);case "current":return this.setMetricValue(e,"current","currentState",this.toNumber(t,"A"),i);case "power":return this.setMetricValue(e,"rawPower","powerState",this.toNumber(t,"W"),i);case "temperature":return this.setMetricValue(e,"temperature","temperatureState",this.toNumber(t,this.units.getDefaults().Temperature),i);case "leds.absorption":return this.setMetricValue(e,"ledsAbsorption","ledsAbsorptionState",this.toBoolean(t),i);case "leds.bulk":return this.setMetricValue(e,"ledsBulk","ledsBulkState",this.toBoolean(t),i);case "leds.float":return this.setMetricValue(e,"ledsFloat","ledsFloatState",this.toBoolean(t),i);case "leds.inverter":return this.setMetricValue(e,"ledsInverter","ledsInverterState",this.toBoolean(t),i);case "leds.lowBattery":return this.setMetricValue(e,"ledsLowBattery","ledsLowBatteryState",this.toBoolean(t),i);case "leds.mains":return this.setMetricValue(e,"ledsMains","ledsMainsState",this.toBoolean(t),i);case "leds.overload":return this.setMetricValue(e,"ledsOverload","ledsOverloadState",this.toBoolean(t),i);case "leds.temperature":return this.setMetricValue(e,"ledsTemperature","ledsTemperatureState",this.toBoolean(t),i);default:return false}}setValue(e,r,t){return Object.is(e[r],t)?false:(e[r]=t,true)}setMetricValue(e,r,t,i,a){let s=!Object.is(e[r],i),o=!Object.is(e[t],a);return !s&&!o?false:(e[r]=i,e[t]=a,true)}requestRender(e){let r=this.widgetColors();!this.svg||!r||(this.pendingRenderSnapshot=e??{chargers:this.visibleChargers(),displayModels:this.displayModels(),widgetColors:r},this.renderFrameId===null&&(this.renderFrameId=requestAnimationFrame(()=>{this.renderFrameId=null;let t=this.pendingRenderSnapshot;this.pendingRenderSnapshot=null,t&&this.render(t);})));}render(e$1){if(!this.layer||!this.svg)return;let r=this.isCompactCardMode(),t=r?C:e,i=r?c$1.COMPACT_CARD_HEIGHT:c$1.CARD_HEIGHT,a=c$1.VIEWBOX_WIDTH-c$1.CHARGER_DISPLAY_HORIZONTAL_MARGIN,s=a/c$1.CHARGER_DISPLAY_BASE_WIDTH,o=a,n=(c$1.VIEWBOX_WIDTH-o)/2,m=r?8:t.titleY,p=r?33:60,h=e$1.chargers.map((l,P)=>({key:l.deviceKey??l.id,id:l.id,charger:l,y:P*(i+c$1.CARD_GAP)})),y=h.length?h[h.length-1].y+i:i;this.svg.attr("viewBox",`0 0 ${c$1.VIEWBOX_WIDTH} ${y}`);let b=this.layer.selectAll("g.charger-card").data(h,l=>l.key),f=b.enter().append("g").attr("class","charger-card"),d=f.append("g").attr("class","charger-display-group");d.append("path").attr("class","charger-shape-bulk").attr("d","m 39.280608,10.70371 1.604609,-3.7808024 c 0.06926,-0.1631805 0.314475,-0.553581 0.314475,-0.4368876 v 27.475177 c 0,0.116694 -0.142713,0.210638 -0.319983,0.210638 H 9.2681756 c -0.1772706,0 -0.3711555,-0.105758 -0.319983,-0.210638 l 1.2797184,-2.622833 c 1.150699,-2.358403 3.86281,-5.455024 6.286778,-6.406312 3.251217,-1.275942 7.834296,-2.821704 11.746419,-4.103315 4.312764,-1.412861 9.246151,-5.946636 11.0195,-10.125027 z").attr("transform","matrix(1.1068428,0,0,1.1601894,-8.804611,-6.1382561)").attr("fill","var(--mat-sys-background)").attr("stroke",e$1.widgetColors.color).attr("stroke-width",2).attr("stroke-linejoin","miter").attr("stroke-miterlimit",0).attr("paint-order","markers stroke fill"),d.append("rect").attr("class","charger-shape-absorption").attr("width",19.67485).attr("height",32.383526).attr("x",40.545158).attr("y",1.1331999).attr("rx",.19520389).attr("ry",.24451913).attr("fill","var(--mat-sys-background)").attr("stroke",e$1.widgetColors.color).attr("stroke-width",2).attr("stroke-linecap","butt").attr("stroke-linejoin","miter").attr("stroke-miterlimit",0).attr("paint-order","markers stroke fill"),d.append("path").attr("class","charger-shape-float").attr("d","m 66.03898,6.4101715 4.16646,3.2472635 c 1.876083,1.462185 5.139444,3.529899 7.448846,4.069504 5.055358,1.181215 11.386089,1.251612 11.38595,1.349059 l -0.02667,18.73082 c 0,0.127151 -0.103075,0.230227 -0.230226,0.230227 H 66.03898 c -0.127151,0 -0.230226,-0.103076 -0.230226,-0.230227 V 6.6403978 c 0,-0.1271504 0.103076,-0.2302261 0.230226,-0.2302263 z").attr("transform","matrix(1.1068428,0,0,1.1601894,-8.7228087,-6.1382561)").attr("fill","var(--mat-sys-background)").attr("stroke",e$1.widgetColors.color).attr("stroke-width",2).attr("stroke-linecap","butt").attr("stroke-linejoin","miter").attr("stroke-miterlimit",0).attr("paint-order","markers stroke fill"),d.append("path").attr("class","charger-shape-storage").attr("d","m 93.39395,15.253553 c 2.347866,2.587905 8.59059,4.802212 13.94479,4.852641 11.92289,0.112298 30.60094,0.205911 30.60096,0.259031 l 0.006,13.361558 c 3e-5,0.07786 -0.19912,0.140548 -0.44645,0.140548 h -44.1053 c -0.247332,0 -0.446448,-0.06269 -0.446448,-0.140548 V 15.394101 c 0,-0.07786 0.280259,-0.323728 0.446448,-0.140548 z").attr("transform","matrix(1.1077284,0,0,1.1178939,-8.9068494,-4.6850995)").attr("fill","var(--mat-sys-background)").attr("stroke",e$1.widgetColors.color).attr("stroke-width",2).attr("stroke-linejoin","miter").attr("stroke-miterlimit",0).attr("paint-order","markers stroke fill"),f.append("text").attr("class","charger-title"),f.append("text").attr("class","charger-mode");let E=f.append("text").attr("class","charger-voltage");E.append("tspan").attr("class","voltage-metric-value"),E.append("tspan").attr("class","voltage-metric-unit");let M=f.append("text").attr("class","charger-current");M.append("tspan").attr("class","current-metric-value"),M.append("tspan").attr("class","current-metric-unit");let L=f.append("text").attr("class","charger-power");L.append("tspan").attr("class","power-metric-value"),L.append("tspan").attr("class","power-metric-unit");let z=f.append("text").attr("class","charger-temperature");z.append("tspan").attr("class","temperature-metric-value"),z.append("tspan").attr("class","temperature-metric-unit");let u=f.merge(b);u.attr("transform",l=>`translate(0, ${l.y})`),u.select("g.charger-display-group").attr("transform",`translate(${n}, ${p}) scale(${s})`).each((l,P,ce)=>{let v=this.resolveShapeMode(l.charger),S=this.isShapeMode(v,"power supply"),D=e$1.widgetColors.dim,x="var(--mat-sys-background)",R=this.isShapeMode(v,"sustain")||S?"none":this.isShapeMode(v,"equalization")?"var(--kip-zone-alert-color)":this.isShapeMode(v,"overload")?"var(--kip-zone-alarm-color)":e$1.widgetColors.color,I=ge$2(ce[P]);I.select("path.charger-shape-bulk").attr("fill",this.isShapeMode(v,"bulk")||this.isShapeMode(v,"boost")||S?D:x).attr("stroke",R),I.select("rect.charger-shape-absorption").attr("fill",this.isShapeMode(v,"absorption")||S?D:x).attr("stroke",R),I.select("path.charger-shape-float").attr("fill",this.isShapeMode(v,"float")||S?D:x).attr("stroke",R),I.select("path.charger-shape-storage").attr("fill",this.isShapeMode(v,"storage")||S?D:x).attr("stroke",R);}),e$1.chargers.length>1?u.select("text.charger-title").attr("x",t.titleX).attr("y",m).attr("font-size",t.titleFontSize).attr("fill","var(--kip-contrast-dim-color)").text(l=>e$1.displayModels[l.key]?.titleText??this.resolveTitleText(l.charger)):u.select("text.charger-title").text(""),u.select("text.charger-voltage").attr("x",197).attr("y",25).attr("text-anchor","end").attr("font-size",t.primaryFontSize).attr("font-weight",t.primaryFontWeight).attr("fill","var(--kip-contrast-color)"),u.select("tspan.voltage-metric-value").text(l=>e$1.displayModels[l.key]?.voltageText??""),u.select("tspan.voltage-metric-unit").attr("dx",1).attr("font-size",22).attr("font-weight",500).attr("fill","var(--kip-contrast-color)").text("V"),u.select("text.charger-current").attr("x",197).attr("y",48).attr("text-anchor","end").attr("font-size",t.lineOneFontSize).attr("fill","var(--kip-contrast-color)"),u.select("tspan.current-metric-value").text(l=>e$1.displayModels[l.key]?.currentText??""),u.select("tspan.current-metric-unit").attr("dx",1).attr("font-size",12).attr("fill","var(--kip-contrast-color)").text("A"),u.select("text.charger-power").attr("x",5).attr("y",22).attr("fill","var(--kip-contrast-dim-color)").attr("font-size",10),u.select("tspan.power-metric-value").text(l=>e$1.displayModels[l.key]?.powerText??""),u.select("tspan.power-metric-unit").attr("dx",1).attr("font-size",6).attr("fill","var(--kip-contrast-dim-color)").text("W"),u.select("text.charger-temperature").attr("x",5).attr("y",34).attr("fill","var(--kip-contrast-dim-color)").attr("font-size",10),u.select("tspan.temperature-metric-value").text(l=>e$1.displayModels[l.key]?.temperatureText??""),u.select("tspan.temperature-metric-unit").attr("dx",1).attr("font-size",6).attr("fill","var(--kip-contrast-dim-color)").text(`${this.units.getDefaults().Temperature==="celsius"?"\xB0C":"\xB0F"}`),u.select("text.charger-mode").attr("x",5).attr("y",46).attr("font-size",10).attr("fill","var(--kip-contrast-dim-color)").text(l=>e$1.displayModels[l.key]?.modeText??""),b.exit().remove();}resolveTitleText(e,r=false){let t=e.name||`Charger ${e.id}`;return !r||!e.source?t:`${t} [${e.source}]`}resolveModeText(e){if(e.chargingMode)return `Mode: ${e.chargingMode.charAt(0).toUpperCase()+e.chargingMode.slice(1)}`;if(e.mode)return `Mode: ${e.mode}`;let t=[{active:e.ledsAbsorption,label:"Absorption"},{active:e.ledsBulk,label:"Bulk"},{active:e.ledsFloat,label:"Float"},{active:e.ledsInverter,label:"Inverter"},{active:e.ledsLowBattery,label:"Low Battery"},{active:e.ledsMains,label:"Mains"},{active:e.ledsOverload,label:"Overload"},{active:e.ledsTemperature,label:"Temperature"}].filter(i=>i.active===true).map(i=>i.label);return t.length?`Mode: ${t.join(" / ")}`:"Mode --"}resolveShapeMode(e){return (e.chargingMode??e.mode??"").trim().toLowerCase()}isShapeMode(e,r){return !e||!r?false:e===r||e.includes(r)}buildMetricRows(e){return this.renderMode()==="full"||this.renderMode()===null?[`${this.formatValue(e.voltage,1)}`,`${this.formatValue(e.current,1)}`,`Power: ${this.formatValue(e.power,0)}`,`Temp: ${this.formatTemperature(e.temperature)}`]:[`${this.formatValue(e.voltage,1)}`,`${this.formatValue(e.current,1)}`,`P: ${this.formatValue(e.power,0)}`,`T: ${this.formatTemperature(e.temperature)}`]}formatValue(e,r){return e==null||Number.isNaN(e)?"-":`${e.toFixed(r)}`}formatTemperature(e){return e==null||Number.isNaN(e)?"-":`${e.toFixed(0)}`}toStringValue(e){return typeof e=="string"?e:null}toBoolean(e){if(typeof e=="boolean")return e;if(typeof e=="number"){if(e===1)return true;if(e===0)return false}if(typeof e=="string"){let r=e.trim().toLowerCase();if(r==="true"||r==="1"||r==="on")return true;if(r==="false"||r==="0"||r==="off")return false}return null}resolveMostSevereState(...e){return e.some(r=>r===n$1.Alert)?n$1.Alert:e.some(r=>r===n$1.Alarm)?n$1.Alarm:e.some(r=>r===n$1.Warn)?n$1.Warn:e.some(r=>r===n$1.Normal)?n$1.Normal:null}toNumber(e,r){if(e==null||typeof e=="boolean")return null;let t=typeof e=="number"?e:Number(e);if(!Number.isFinite(t))return null;let i=this.units.convertToUnit(r,t);return Number.isFinite(i)?i:t}static \u0275fac=function(r){return new(r||c$1)};static \u0275cmp=JD({type:c$1,selectors:[["widget-charger"]],viewQuery:function(r,t){r&1&&eg(t.svgRef,ge,5),r&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"],renderMode:[1,"renderMode"]},decls:4,vars:3,consts:[["chargerSvg",""],[3,"text","color"],["aria-hidden","false",1,"charger-svg"],[1,"charger-empty"],[1,"charger-empty-title"],[1,"charger-empty-sub"]],template:function(r,t){r&1&&($h(0,"widget-title",1),wd(),$h(1,"svg",2,0),_w(3,me,5,0,"div",3)),r&2&&(Bh("text",t.displayLabel())("color",t.labelColor()),EE(3),Mw(t.hasChargers()?-1:3));},dependencies:[x],styles:["[_nghost-%COMP%]{display:block;height:100%;width:100%;position:relative;overflow:hidden}.charger-svg[_ngcontent-%COMP%]{display:block;position:absolute;left:0;right:0;top:15%;height:85%;width:100%;overflow:hidden;z-index:20;padding:0 10px 10px}.charger-empty[_ngcontent-%COMP%]{position:absolute;inset:0;margin:10px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;text-align:center;color:var(--mat-sys-on-surface);background:color-mix(in srgb,var(--kip-widget-card-background-color) 92%,transparent)}.charger-empty-title[_ngcontent-%COMP%]{font-size:18px;font-weight:600}.charger-empty-sub[_ngcontent-%COMP%]{font-size:14px;opacity:.8}"]})};export{le as WidgetChargerComponent};
@@ -1 +1 @@
1
- import {d1 as Hj,w,du as p,dv as rt$1,cu as T,a as G,aZ as R,aY as xe,$ as $j,v as vt,bG as Bj,D as Dt,F as Fa,dn as ge,a_ as Gp,J as JD,b2 as Ln,b4 as Xe,b5 as Pn,b9 as rn,O as Op,bh as xp,y as yt,b as wt,cR as zt,bg as mt$1,bd as an,P as Pi,c as $h,u as ul,k as Qh,cn as wd,T as TT,_ as _w,e as EE,M as Mw,f as eg,K as Kw,g as qw,bp as gl,h as Fw,cV as Td,bi as Eg,bk as cD,bm as Ig,bo as lD,l as ud,m as dd,bj as ST}from'./main-F7NMHHV4.js';import {c}from'./chunk-CRy9Da7a.js';var at=["canvasMainRef"];function ot(o,v){if(o&1&&(Pi(0,"div",8),wd(),Pi(1,"svg",11)(2,"text",12),TT(3),ul()()()),o&2){let t=qw();EE(3),gl("@ ",t.startAtTime());}}function st(o,v){if(o&1){let t=Fw();Pi(0,"button",13),Qh("click",function(){ud(t);let i=qw();return dd(i.sendStartTimerCommand("start"))}),Pi(1,"mat-icon",5),wd(),Pi(2,"svg",6)(3,"text",14),TT(4,"Start"),ul()()()(),Td(),Pi(5,"button",15),Qh("click",function(){ud(t);let i=qw();return dd(i.adjustStartTime(-60))}),Pi(6,"mat-icon",5),wd(),Pi(7,"svg",6)(8,"text",14),TT(9,"-1m"),ul()()()(),Td(),Pi(10,"button",16),Qh("click",function(){ud(t);let i=qw();return dd(i.adjustStartTime(60))}),Pi(11,"mat-icon",5),wd(),Pi(12,"svg",6)(13,"text",14),TT(14,"+1m"),ul()()()();}}function rt(o,v){if(o&1){let t=Fw();Pi(0,"button",17),Qh("click",function(){ud(t);let i=qw();return dd(i.sendStartTimerCommand("sync"))}),Pi(1,"mat-icon",5),wd(),Pi(2,"svg",18)(3,"text",19),TT(4,"Sync"),ul()()()(),Td(),Pi(5,"button",20),Qh("click",function(){ud(t);let i=qw();return dd(i.sendStartTimerCommand("reset"))}),Pi(6,"mat-icon",5),wd(),Pi(7,"svg",18)(8,"text",19),TT(9,"Reset"),ul()()()();}}function lt(o,v){if(o&1){let t=Fw();Pi(0,"button",21),Qh("click",function(){ud(t);let i=qw();return dd(i.adjustStartTime(-60))}),Pi(1,"mat-icon",5),wd(),Pi(2,"svg",22)(3,"text",23),TT(4,"-1m"),ul()()()(),Td(),Pi(5,"button",24),Qh("click",function(){ud(t);let i=qw();return dd(i.adjustStartTime(-1))}),Pi(6,"mat-icon",5),wd(),Pi(7,"svg",22)(8,"text",23),TT(9,"-1s"),ul()()()(),Td(),Pi(10,"button",25),Qh("click",function(){ud(t);let i=qw();return dd(i.adjustStartTime(1))}),Pi(11,"mat-icon",5),wd(),Pi(12,"svg",22)(13,"text",23),TT(14,"+1s"),ul()()()(),Td(),Pi(15,"button",26),Qh("click",function(){ud(t);let i=qw();return dd(i.adjustStartTime(60))}),Pi(16,"mat-icon",5),wd(),Pi(17,"svg",22)(18,"text",23),TT(19,"+1m"),ul()()()();}}function mt(o,v){if(o&1){let t=Fw();Pi(0,"input",27),Eg("ngModelChange",function(i){ud(t);let a=qw();return ST(a.startAtTimeEdit,i)||(a.startAtTimeEdit=i),dd(i)}),Qh("change",function(){ud(t);let i=qw();return dd(i.setStartTime())}),ul(),cD();}if(o&2){let t=qw();Ig("ngModel",t.startAtTimeEdit),lD();}}function ct(o,v){o&1&&$h(0,"div",10);}var Et=(()=>{class o{id=Hj.required();type=Hj.required();theme=Hj.required();static DEFAULT_CONFIG={supportAutomaticHistoricalSeries:false,displayName:"TTS",nextDashboard:0,playBeeps:true,filterSelfPaths:true,paths:{ttsPath:{description:"Time to the Start in seconds",path:"self.navigation.racing.timeToStart",source:"default",pathType:"number",pathRequired:false,isPathConfigurable:false,convertUnitTo:"s",showConvertUnitTo:false,showPathSkUnitsFilter:false,pathSkUnitsFilter:"s",sampleTime:500},startTimePath:{description:"Time of the start",path:"self.navigation.racing.startTime",source:"default",pathType:"Date",pathRequired:false,isPathConfigurable:false,sampleTime:500},dtsPath:{description:"Distance to Start Line path, used to determine OCS",path:"self.navigation.racing.distanceStartline",source:"default",pathType:"number",pathRequired:false,isPathConfigurable:false,convertUnitTo:"m",showPathSkUnitsFilter:false,pathSkUnitsFilter:"m",sampleTime:500}},color:"contrast",enableTimeout:false,dataTimeout:5,ignoreZones:true};runtime=w(p);streams=w(rt$1);signalk=w(T);dashboard=w(G);canvas=w(R);destroyRef=w(xe);canvasRef=$j.required("canvasMainRef");canvasElement=null;ctx=null;cssWidth=0;cssHeight=0;titleBitmap=null;titleBitmapText=null;titleBitmapColor=null;labelColor=vt("");mode=vt(1);ttsValue=null;dtsValue=null;valueColor="";valueStateColor="";startAtTime=vt("00:00:00");startAtTimeEdit=Bj("");normalizedConfig=Dt(()=>this.runtime.options()??o.DEFAULT_CONFIG);constructor(){Fa(()=>{let t=this.normalizedConfig(),e=this.theme();e&&ge(()=>{let i=c(t.color??"contrast",e);this.labelColor.set(i.dim),this.valueColor=i.color,this.valueStateColor=i.color,this.draw();});}),Fa(()=>{let t=this.normalizedConfig();t.paths?.ttsPath?.path&&ge(()=>this.streams.observe("ttsPath",a=>{let s=this.ttsValue;this.ttsValue=a?.data?.value??null,this.updateValueColor(),this.draw(),this.shouldBeep(s,this.ttsValue)&&this.beepForValue(this.ttsValue),(t.nextDashboard??-1)>=0&&s===1&&this.ttsValue===0&&(!this.dtsValue||this.dtsValue>=0);}));}),Fa(()=>{this.normalizedConfig().paths?.startTimePath?.path&&ge(()=>this.streams.observe("startTimePath",a=>{let s=a?.data?.value;if(!s)this.startAtTime.set("HH:MM:SS"),this.startAtTimeEdit.set("HH:MM:SS"),this.mode()===2&&this.mode.set(1);else {let l=new Date(s);this.startAtTimeEdit.set(l.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})),this.startAtTime.set(this.startAtTimeEdit());}this.draw();}));}),Fa(()=>{this.normalizedConfig().paths?.dtsPath?.path&&ge(()=>this.streams.observe("dtsPath",a=>{this.dtsValue=a?.data?.value??null;}));}),this.signalk.subscribeRequest().pipe(Gp(this.destroyRef)).subscribe(t=>{t.widgetUUID===this.id()&&t.statusCode===200&&this.beep(600,20);});}ngAfterViewInit(){this.canvasElement=this.canvasRef().nativeElement,this.ctx=this.canvasElement.getContext("2d"),this.canvas.registerCanvas(this.canvasElement,{autoRelease:true,onResize:(t,e)=>{this.cssWidth=t,this.cssHeight=e,this.draw();}}),this.cssHeight=Math.round(this.canvasElement.getBoundingClientRect().height),this.cssWidth=Math.round(this.canvasElement.getBoundingClientRect().width),this.draw();}ngOnDestroy(){try{this.canvasElement&&this.canvas.unregisterCanvas(this.canvasElement);}catch(t){}}toggleMode(){this.mode.update(e=>(e+1)%5);let t=this.ttsValue;this.mode()===1&&this.isStartTimerRunning()&&this.mode.set(2),this.mode()===2&&t!==0&&!this.isStartTimerRunning()&&this.mode.set(3),this.draw();}sendStartTimerCommand(t){this.signalk.putRequest("navigation.racing.setStartTime",{command:t},this.id()),t==="start"&&this.mode.set(0),t==="reset"&&(this.startAtTime.set("HH:MM:SS"),this.mode.set(1));}adjustStartTime(t){this.signalk.putRequest("navigation.racing.setStartTime",{command:"adjust",delta:t},this.id());}setStartTime(){let t=new Date,e=this.startAtTimeEdit().split(":").map(Number),i=e[0],a=e[1],s=e.length>=3?e[2]:0,l=new Date(t);l.setHours(i,a,s,0),l<=t&&l.setDate(l.getDate()+1),this.mode.set(0),this.signalk.putRequest("navigation.racing.setStartTime",{command:"set",startTime:l.toISOString()},this.id());}isStartTimerRunning(){return (this.ttsValue??0)>0&&this.startAtTime()!==null&&this.startAtTime()!=="HH:MM:SS"}shouldBeep(t,e){return e==null||this.startAtTime()==="HH:MM:SS"||!this.runtime.options()?.playBeeps?false:e===0&&t!==0||e<10&&e>=0||e<60&&e%10===0?true:e%60===0}beepForValue(t){t===0?this.beep(500,1e3):t<10?this.beep(450,100):t<60&&t%10===0?this.beep(400,150):t%60===0&&this.beep(350,200);}updateValueColor(){let t=this.theme(),e=this.normalizedConfig();t&&(e.ignoreZones?this.ttsValue?this.ttsValue===0?this.valueStateColor=this.valueColor:this.ttsValue<10?this.valueStateColor=(this.dtsValue??0)<0?t.zoneAlarm:t.zoneWarn:this.ttsValue<60?this.valueStateColor=t.zoneAlert:this.valueStateColor=this.valueColor:this.valueStateColor=this.valueColor:this.valueStateColor=this.valueColor,this.ttsValue===0?(this.mode.set(2),(this.dtsValue??0)<0&&(this.valueStateColor=t.zoneAlarm)):this.mode()===1&&this.isStartTimerRunning()&&this.mode.set(2));}toHHMMSS(t){if(t==null||isNaN(t))return "-:--";let e=t<0;e&&(t=-t);let i=Math.floor(t/3600),a=Math.floor(t%3600/60),s=Math.floor(t%60),l=e?"-":"";return i===0?`${l}${a.toString().padStart(1,"0")}:${s.toString().padStart(2,"0")}`:`${l}${i.toString().padStart(1,"0")}:${a.toString().padStart(2,"0")}:${s.toString().padStart(2,"0")}`}getValueText(){return this.toHHMMSS(this.ttsValue??0)}draw(){if(!this.ctx||!this.canvasElement)return;let e=this.runtime.options()?.displayName||"TTS",i=this.labelColor();(!this.titleBitmap||this.titleBitmap.width!==this.canvasElement.width||this.titleBitmap.height!==this.canvasElement.height||this.titleBitmapText!==e||this.titleBitmapColor!==i)&&(this.titleBitmap=this.canvas.createTitleBitmap(e,i,"normal",this.cssWidth,this.cssHeight),this.titleBitmapText=e,this.titleBitmapColor=i),this.canvas.clearCanvas(this.ctx,this.cssWidth,this.cssHeight),this.titleBitmap&&this.ctx.drawImage(this.titleBitmap,0,0,this.cssWidth,this.cssHeight),this.canvas.drawText(this.ctx,this.getValueText(),Math.floor(this.cssWidth*.5),Math.floor(this.cssHeight*.55),Math.floor(this.cssWidth*.95),Math.floor(this.cssHeight*.9),"bold",this.valueStateColor,"center","middle");}beep(t=440,e=100){if(!this.runtime.options()?.playBeeps)return;let i=window.AudioContext||window.webkitAudioContext,a=new i,s=a.createOscillator(),l=a.createGain();s.connect(l),l.connect(a.destination),s.type="sine",s.frequency.value=t,l.gain.value=.1,s.start(),s.stop(a.currentTime+e/1e3);}static \u0275fac=function(e){return new(e||o)};static \u0275cmp=JD({type:o,selectors:[["widget-racer-timer"]],viewQuery:function(e,i){e&1&&eg(i.canvasRef,at,5),e&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"],startAtTimeEdit:[1,"startAtTimeEdit"]},outputs:{startAtTimeEdit:"startAtTimeEditChange"},decls:15,vars:2,consts:[["canvasMainRef",""],[1,"filler"],[1,"timer-canvas"],[1,"buttons-container"],["mat-flat-button","","matTooltip","Select the control mode",1,"button","select-button",3,"click"],[1,"buttons-svg-icon"],["width","100%","height","100%","viewBox","0 0 80 14","preserveAspectRatio","xMidYMid meet",1,"svg-content"],["x","40","y","9"],[1,"start-at"],["matInput","","type","time","step","1","matTooltip","Set an absolute start time",1,"set-start-at",3,"ngModel"],[1,"widgetOverlay"],["width","100%","height","100%","viewBox","0 0 80 12","preserveAspectRatio","xMidYMid meet",1,"svg-content","svg-start-at"],["x","40","y","10"],["mat-flat-button","","matTooltip","Start the race timer",1,"button","main-button",3,"click"],["x","40","y","11"],["mat-flat-button","","matTooltip","Remove 1 minute from the timer",1,"button","other-small-button",3,"click"],["mat-flat-button","","matTooltip","Add 1 minute to the timer",1,"button","other-small-button",3,"click"],["mat-flat-button","","matTooltip","Sync the timer to nearest minute",1,"button","main-button",3,"click"],["width","100%","height","100%","viewBox","0 0 100 14","preserveAspectRatio","xMidYMid meet",1,"svg-content"],["x","50","y","11"],["mat-flat-button","","matTooltip","Stop and reset the timer",1,"button","other-button",3,"click"],["mat-flat-button","","matTooltip","Reduce the timer by 1 minute",1,"button","main-small-button",3,"click"],["width","100%","height","100%","viewBox","0 0 50 14","preserveAspectRatio","xMidYMid meet",1,"svg-content"],["x","25","y","11"],["mat-flat-button","","matTooltip","Reduce the timer by 1 second",1,"button","other-small-button",3,"click"],["mat-flat-button","","matTooltip","Increase the timer by 1 second",1,"button","other-small-button",3,"click"],["mat-flat-button","","matTooltip","Increase the timer by 1 minute",1,"button","main-small-button",3,"click"],["matInput","","type","time","step","1","matTooltip","Set an absolute start time",1,"set-start-at",3,"ngModelChange","change","ngModel"]],template:function(e,i){if(e&1&&(Pi(0,"div",1),$h(1,"canvas",2,0),ul(),Pi(3,"div",3)(4,"button",4),Qh("click",function(){return i.toggleMode()}),Pi(5,"mat-icon",5),wd(),Pi(6,"svg",6)(7,"text",7),TT(8,"\u22EE"),ul()()()(),_w(9,ot,4,1,"div",8)(10,st,15,0)(11,rt,10,0)(12,lt,20,0)(13,mt,1,1,"input",9),ul(),_w(14,ct,1,0,"div",10)),e&2){let a;EE(9),Mw((a=i.mode())===0?9:a===1?10:a===2?11:a===3?12:a===4?13:-1),EE(5),Mw(i.dashboard.isDashboardStatic()?-1:14);}},dependencies:[Ln,Xe,Pn,rn,Op,xp,yt,wt,zt,mt$1,an],styles:["[_nghost-%COMP%]{overflow:clip;display:block;height:100%;width:100%}.timer-wrapper[_ngcontent-%COMP%]{width:100%;height:100%;min-height:1px}.timer-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;display:block}.filler[_ngcontent-%COMP%]{width:100%;height:76%}.buttons-container[_ngcontent-%COMP%]{display:flex;flex-wrap:nowrap;justify-content:space-between;column-gap:2%;position:relative;height:24%;width:100%;padding:0 10px 14px;z-index:20;pointer-events:auto;align-items:center}.button[_ngcontent-%COMP%]{min-width:0px;width:100%;border-radius:12px;align-items:center;justify-content:center;cursor:pointer;--mat-button-filled-container-height: 100%;--mat-button-filled-horizontal-padding: 0px;--mat-button-filled-icon-spacing: 0px}.select-button[_ngcontent-%COMP%]{flex:none;width:18%;--mat-button-filled-container-color: var(--kip-blue-color);--mat-button-filled-label-text-color: var(--kip-contrast-color)}.main-button[_ngcontent-%COMP%]{flex:1 1 auto;--mat-button-filled-container-color: var(--kip-port-color);--mat-button-filled-label-text-color: var(--kip-contrast-color)}.other-button[_ngcontent-%COMP%]{flex:1 1 auto;--mat-button-filled-container-color: var(--kip-blue-color);--mat-button-filled-label-text-color: var(--kip-contrast-color)}.main-small-button[_ngcontent-%COMP%]{flex:1 1 auto;--mat-button-filled-container-color: var(--kip-port-color);--mat-button-filled-label-text-color: var(--kip-contrast-color)}.other-small-button[_ngcontent-%COMP%]{flex:1 1 auto;--mat-button-filled-container-color: var(--kip-blue-color);--mat-button-filled-label-text-color: var(--kip-contrast-color)}.set-start-at[_ngcontent-%COMP%]{flex:1 1 auto;background-color:var(--kip-contrast-color)}.start-at[_ngcontent-%COMP%]{height:100%;width:100%;flex:1 1 auto}.start-at[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{fill:var(--kip-contrast-color)}.start-at[_ngcontent-%COMP%] svg[_ngcontent-%COMP%] text[_ngcontent-%COMP%]{font-family:Roboto;font-size:9px;font-weight:400;text-align:center;text-anchor:middle;font-style:normal;font-variant:normal;font-stretch:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:none}.buttons-svg-icon[_ngcontent-%COMP%]{width:100%;height:100%;margin:0;padding:0}.svg-content[_ngcontent-%COMP%]{width:100%;height:100%;padding:0;margin:0}.svg-content[_ngcontent-%COMP%] text[_ngcontent-%COMP%]{font-family:Roboto;font-size:15px;font-weight:700;text-align:center;text-anchor:middle;font-style:normal;font-variant:normal;font-stretch:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:none}.svg-start-at[_ngcontent-%COMP%] text[_ngcontent-%COMP%]{fill:var(--kip-contrast-dim-color)}.widgetOverlay[_ngcontent-%COMP%]{position:absolute;width:100%;height:100%;right:0;bottom:0;color:transparent;z-index:21}"]})}return o})();export{Et as WidgetRacerTimerComponent};
1
+ import {d1 as Hj,w,du as p,dv as rt$1,cu as T,a as G,aZ as R,aY as xe,$ as $j,v as vt,bG as Bj,D as Dt,F as Fa,dn as ge,a_ as Gp,J as JD,b2 as Ln,b4 as Xe,b5 as Pn,b9 as rn,O as Op,bh as xp,y as yt,b as wt,cR as zt,bg as mt$1,bd as an,P as Pi,c as $h,u as ul,k as Qh,cn as wd,T as TT,_ as _w,e as EE,M as Mw,f as eg,K as Kw,g as qw,bp as gl,h as Fw,cV as Td,bi as Eg,bk as cD,bm as Ig,bo as lD,l as ud,m as dd,bj as ST}from'./main-IINF7HD6.js';import {c}from'./chunk-DHj2hm9r.js';var at=["canvasMainRef"];function ot(o,v){if(o&1&&(Pi(0,"div",8),wd(),Pi(1,"svg",11)(2,"text",12),TT(3),ul()()()),o&2){let t=qw();EE(3),gl("@ ",t.startAtTime());}}function st(o,v){if(o&1){let t=Fw();Pi(0,"button",13),Qh("click",function(){ud(t);let i=qw();return dd(i.sendStartTimerCommand("start"))}),Pi(1,"mat-icon",5),wd(),Pi(2,"svg",6)(3,"text",14),TT(4,"Start"),ul()()()(),Td(),Pi(5,"button",15),Qh("click",function(){ud(t);let i=qw();return dd(i.adjustStartTime(-60))}),Pi(6,"mat-icon",5),wd(),Pi(7,"svg",6)(8,"text",14),TT(9,"-1m"),ul()()()(),Td(),Pi(10,"button",16),Qh("click",function(){ud(t);let i=qw();return dd(i.adjustStartTime(60))}),Pi(11,"mat-icon",5),wd(),Pi(12,"svg",6)(13,"text",14),TT(14,"+1m"),ul()()()();}}function rt(o,v){if(o&1){let t=Fw();Pi(0,"button",17),Qh("click",function(){ud(t);let i=qw();return dd(i.sendStartTimerCommand("sync"))}),Pi(1,"mat-icon",5),wd(),Pi(2,"svg",18)(3,"text",19),TT(4,"Sync"),ul()()()(),Td(),Pi(5,"button",20),Qh("click",function(){ud(t);let i=qw();return dd(i.sendStartTimerCommand("reset"))}),Pi(6,"mat-icon",5),wd(),Pi(7,"svg",18)(8,"text",19),TT(9,"Reset"),ul()()()();}}function lt(o,v){if(o&1){let t=Fw();Pi(0,"button",21),Qh("click",function(){ud(t);let i=qw();return dd(i.adjustStartTime(-60))}),Pi(1,"mat-icon",5),wd(),Pi(2,"svg",22)(3,"text",23),TT(4,"-1m"),ul()()()(),Td(),Pi(5,"button",24),Qh("click",function(){ud(t);let i=qw();return dd(i.adjustStartTime(-1))}),Pi(6,"mat-icon",5),wd(),Pi(7,"svg",22)(8,"text",23),TT(9,"-1s"),ul()()()(),Td(),Pi(10,"button",25),Qh("click",function(){ud(t);let i=qw();return dd(i.adjustStartTime(1))}),Pi(11,"mat-icon",5),wd(),Pi(12,"svg",22)(13,"text",23),TT(14,"+1s"),ul()()()(),Td(),Pi(15,"button",26),Qh("click",function(){ud(t);let i=qw();return dd(i.adjustStartTime(60))}),Pi(16,"mat-icon",5),wd(),Pi(17,"svg",22)(18,"text",23),TT(19,"+1m"),ul()()()();}}function mt(o,v){if(o&1){let t=Fw();Pi(0,"input",27),Eg("ngModelChange",function(i){ud(t);let a=qw();return ST(a.startAtTimeEdit,i)||(a.startAtTimeEdit=i),dd(i)}),Qh("change",function(){ud(t);let i=qw();return dd(i.setStartTime())}),ul(),cD();}if(o&2){let t=qw();Ig("ngModel",t.startAtTimeEdit),lD();}}function ct(o,v){o&1&&$h(0,"div",10);}var Et=(()=>{class o{id=Hj.required();type=Hj.required();theme=Hj.required();static DEFAULT_CONFIG={supportAutomaticHistoricalSeries:false,displayName:"TTS",nextDashboard:0,playBeeps:true,filterSelfPaths:true,paths:{ttsPath:{description:"Time to the Start in seconds",path:"self.navigation.racing.timeToStart",source:"default",pathType:"number",pathRequired:false,isPathConfigurable:false,convertUnitTo:"s",showConvertUnitTo:false,showPathSkUnitsFilter:false,pathSkUnitsFilter:"s",sampleTime:500},startTimePath:{description:"Time of the start",path:"self.navigation.racing.startTime",source:"default",pathType:"Date",pathRequired:false,isPathConfigurable:false,sampleTime:500},dtsPath:{description:"Distance to Start Line path, used to determine OCS",path:"self.navigation.racing.distanceStartline",source:"default",pathType:"number",pathRequired:false,isPathConfigurable:false,convertUnitTo:"m",showPathSkUnitsFilter:false,pathSkUnitsFilter:"m",sampleTime:500}},color:"contrast",enableTimeout:false,dataTimeout:5,ignoreZones:true};runtime=w(p);streams=w(rt$1);signalk=w(T);dashboard=w(G);canvas=w(R);destroyRef=w(xe);canvasRef=$j.required("canvasMainRef");canvasElement=null;ctx=null;cssWidth=0;cssHeight=0;titleBitmap=null;titleBitmapText=null;titleBitmapColor=null;labelColor=vt("");mode=vt(1);ttsValue=null;dtsValue=null;valueColor="";valueStateColor="";startAtTime=vt("00:00:00");startAtTimeEdit=Bj("");normalizedConfig=Dt(()=>this.runtime.options()??o.DEFAULT_CONFIG);constructor(){Fa(()=>{let t=this.normalizedConfig(),e=this.theme();e&&ge(()=>{let i=c(t.color??"contrast",e);this.labelColor.set(i.dim),this.valueColor=i.color,this.valueStateColor=i.color,this.draw();});}),Fa(()=>{let t=this.normalizedConfig();t.paths?.ttsPath?.path&&ge(()=>this.streams.observe("ttsPath",a=>{let s=this.ttsValue;this.ttsValue=a?.data?.value??null,this.updateValueColor(),this.draw(),this.shouldBeep(s,this.ttsValue)&&this.beepForValue(this.ttsValue),(t.nextDashboard??-1)>=0&&s===1&&this.ttsValue===0&&(!this.dtsValue||this.dtsValue>=0);}));}),Fa(()=>{this.normalizedConfig().paths?.startTimePath?.path&&ge(()=>this.streams.observe("startTimePath",a=>{let s=a?.data?.value;if(!s)this.startAtTime.set("HH:MM:SS"),this.startAtTimeEdit.set("HH:MM:SS"),this.mode()===2&&this.mode.set(1);else {let l=new Date(s);this.startAtTimeEdit.set(l.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})),this.startAtTime.set(this.startAtTimeEdit());}this.draw();}));}),Fa(()=>{this.normalizedConfig().paths?.dtsPath?.path&&ge(()=>this.streams.observe("dtsPath",a=>{this.dtsValue=a?.data?.value??null;}));}),this.signalk.subscribeRequest().pipe(Gp(this.destroyRef)).subscribe(t=>{t.widgetUUID===this.id()&&t.statusCode===200&&this.beep(600,20);});}ngAfterViewInit(){this.canvasElement=this.canvasRef().nativeElement,this.ctx=this.canvasElement.getContext("2d"),this.canvas.registerCanvas(this.canvasElement,{autoRelease:true,onResize:(t,e)=>{this.cssWidth=t,this.cssHeight=e,this.draw();}}),this.cssHeight=Math.round(this.canvasElement.getBoundingClientRect().height),this.cssWidth=Math.round(this.canvasElement.getBoundingClientRect().width),this.draw();}ngOnDestroy(){try{this.canvasElement&&this.canvas.unregisterCanvas(this.canvasElement);}catch(t){}}toggleMode(){this.mode.update(e=>(e+1)%5);let t=this.ttsValue;this.mode()===1&&this.isStartTimerRunning()&&this.mode.set(2),this.mode()===2&&t!==0&&!this.isStartTimerRunning()&&this.mode.set(3),this.draw();}sendStartTimerCommand(t){this.signalk.putRequest("navigation.racing.setStartTime",{command:t},this.id()),t==="start"&&this.mode.set(0),t==="reset"&&(this.startAtTime.set("HH:MM:SS"),this.mode.set(1));}adjustStartTime(t){this.signalk.putRequest("navigation.racing.setStartTime",{command:"adjust",delta:t},this.id());}setStartTime(){let t=new Date,e=this.startAtTimeEdit().split(":").map(Number),i=e[0],a=e[1],s=e.length>=3?e[2]:0,l=new Date(t);l.setHours(i,a,s,0),l<=t&&l.setDate(l.getDate()+1),this.mode.set(0),this.signalk.putRequest("navigation.racing.setStartTime",{command:"set",startTime:l.toISOString()},this.id());}isStartTimerRunning(){return (this.ttsValue??0)>0&&this.startAtTime()!==null&&this.startAtTime()!=="HH:MM:SS"}shouldBeep(t,e){return e==null||this.startAtTime()==="HH:MM:SS"||!this.runtime.options()?.playBeeps?false:e===0&&t!==0||e<10&&e>=0||e<60&&e%10===0?true:e%60===0}beepForValue(t){t===0?this.beep(500,1e3):t<10?this.beep(450,100):t<60&&t%10===0?this.beep(400,150):t%60===0&&this.beep(350,200);}updateValueColor(){let t=this.theme(),e=this.normalizedConfig();t&&(e.ignoreZones?this.ttsValue?this.ttsValue===0?this.valueStateColor=this.valueColor:this.ttsValue<10?this.valueStateColor=(this.dtsValue??0)<0?t.zoneAlarm:t.zoneWarn:this.ttsValue<60?this.valueStateColor=t.zoneAlert:this.valueStateColor=this.valueColor:this.valueStateColor=this.valueColor:this.valueStateColor=this.valueColor,this.ttsValue===0?(this.mode.set(2),(this.dtsValue??0)<0&&(this.valueStateColor=t.zoneAlarm)):this.mode()===1&&this.isStartTimerRunning()&&this.mode.set(2));}toHHMMSS(t){if(t==null||isNaN(t))return "-:--";let e=t<0;e&&(t=-t);let i=Math.floor(t/3600),a=Math.floor(t%3600/60),s=Math.floor(t%60),l=e?"-":"";return i===0?`${l}${a.toString().padStart(1,"0")}:${s.toString().padStart(2,"0")}`:`${l}${i.toString().padStart(1,"0")}:${a.toString().padStart(2,"0")}:${s.toString().padStart(2,"0")}`}getValueText(){return this.toHHMMSS(this.ttsValue??0)}draw(){if(!this.ctx||!this.canvasElement)return;let e=this.runtime.options()?.displayName||"TTS",i=this.labelColor();(!this.titleBitmap||this.titleBitmap.width!==this.canvasElement.width||this.titleBitmap.height!==this.canvasElement.height||this.titleBitmapText!==e||this.titleBitmapColor!==i)&&(this.titleBitmap=this.canvas.createTitleBitmap(e,i,"normal",this.cssWidth,this.cssHeight),this.titleBitmapText=e,this.titleBitmapColor=i),this.canvas.clearCanvas(this.ctx,this.cssWidth,this.cssHeight),this.titleBitmap&&this.ctx.drawImage(this.titleBitmap,0,0,this.cssWidth,this.cssHeight),this.canvas.drawText(this.ctx,this.getValueText(),Math.floor(this.cssWidth*.5),Math.floor(this.cssHeight*.55),Math.floor(this.cssWidth*.95),Math.floor(this.cssHeight*.9),"bold",this.valueStateColor,"center","middle");}beep(t=440,e=100){if(!this.runtime.options()?.playBeeps)return;let i=window.AudioContext||window.webkitAudioContext,a=new i,s=a.createOscillator(),l=a.createGain();s.connect(l),l.connect(a.destination),s.type="sine",s.frequency.value=t,l.gain.value=.1,s.start(),s.stop(a.currentTime+e/1e3);}static \u0275fac=function(e){return new(e||o)};static \u0275cmp=JD({type:o,selectors:[["widget-racer-timer"]],viewQuery:function(e,i){e&1&&eg(i.canvasRef,at,5),e&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"],startAtTimeEdit:[1,"startAtTimeEdit"]},outputs:{startAtTimeEdit:"startAtTimeEditChange"},decls:15,vars:2,consts:[["canvasMainRef",""],[1,"filler"],[1,"timer-canvas"],[1,"buttons-container"],["mat-flat-button","","matTooltip","Select the control mode",1,"button","select-button",3,"click"],[1,"buttons-svg-icon"],["width","100%","height","100%","viewBox","0 0 80 14","preserveAspectRatio","xMidYMid meet",1,"svg-content"],["x","40","y","9"],[1,"start-at"],["matInput","","type","time","step","1","matTooltip","Set an absolute start time",1,"set-start-at",3,"ngModel"],[1,"widgetOverlay"],["width","100%","height","100%","viewBox","0 0 80 12","preserveAspectRatio","xMidYMid meet",1,"svg-content","svg-start-at"],["x","40","y","10"],["mat-flat-button","","matTooltip","Start the race timer",1,"button","main-button",3,"click"],["x","40","y","11"],["mat-flat-button","","matTooltip","Remove 1 minute from the timer",1,"button","other-small-button",3,"click"],["mat-flat-button","","matTooltip","Add 1 minute to the timer",1,"button","other-small-button",3,"click"],["mat-flat-button","","matTooltip","Sync the timer to nearest minute",1,"button","main-button",3,"click"],["width","100%","height","100%","viewBox","0 0 100 14","preserveAspectRatio","xMidYMid meet",1,"svg-content"],["x","50","y","11"],["mat-flat-button","","matTooltip","Stop and reset the timer",1,"button","other-button",3,"click"],["mat-flat-button","","matTooltip","Reduce the timer by 1 minute",1,"button","main-small-button",3,"click"],["width","100%","height","100%","viewBox","0 0 50 14","preserveAspectRatio","xMidYMid meet",1,"svg-content"],["x","25","y","11"],["mat-flat-button","","matTooltip","Reduce the timer by 1 second",1,"button","other-small-button",3,"click"],["mat-flat-button","","matTooltip","Increase the timer by 1 second",1,"button","other-small-button",3,"click"],["mat-flat-button","","matTooltip","Increase the timer by 1 minute",1,"button","main-small-button",3,"click"],["matInput","","type","time","step","1","matTooltip","Set an absolute start time",1,"set-start-at",3,"ngModelChange","change","ngModel"]],template:function(e,i){if(e&1&&(Pi(0,"div",1),$h(1,"canvas",2,0),ul(),Pi(3,"div",3)(4,"button",4),Qh("click",function(){return i.toggleMode()}),Pi(5,"mat-icon",5),wd(),Pi(6,"svg",6)(7,"text",7),TT(8,"\u22EE"),ul()()()(),_w(9,ot,4,1,"div",8)(10,st,15,0)(11,rt,10,0)(12,lt,20,0)(13,mt,1,1,"input",9),ul(),_w(14,ct,1,0,"div",10)),e&2){let a;EE(9),Mw((a=i.mode())===0?9:a===1?10:a===2?11:a===3?12:a===4?13:-1),EE(5),Mw(i.dashboard.isDashboardStatic()?-1:14);}},dependencies:[Ln,Xe,Pn,rn,Op,xp,yt,wt,zt,mt$1,an],styles:["[_nghost-%COMP%]{overflow:clip;display:block;height:100%;width:100%}.timer-wrapper[_ngcontent-%COMP%]{width:100%;height:100%;min-height:1px}.timer-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;display:block}.filler[_ngcontent-%COMP%]{width:100%;height:76%}.buttons-container[_ngcontent-%COMP%]{display:flex;flex-wrap:nowrap;justify-content:space-between;column-gap:2%;position:relative;height:24%;width:100%;padding:0 10px 14px;z-index:20;pointer-events:auto;align-items:center}.button[_ngcontent-%COMP%]{min-width:0px;width:100%;border-radius:12px;align-items:center;justify-content:center;cursor:pointer;--mat-button-filled-container-height: 100%;--mat-button-filled-horizontal-padding: 0px;--mat-button-filled-icon-spacing: 0px}.select-button[_ngcontent-%COMP%]{flex:none;width:18%;--mat-button-filled-container-color: var(--kip-blue-color);--mat-button-filled-label-text-color: var(--kip-contrast-color)}.main-button[_ngcontent-%COMP%]{flex:1 1 auto;--mat-button-filled-container-color: var(--kip-port-color);--mat-button-filled-label-text-color: var(--kip-contrast-color)}.other-button[_ngcontent-%COMP%]{flex:1 1 auto;--mat-button-filled-container-color: var(--kip-blue-color);--mat-button-filled-label-text-color: var(--kip-contrast-color)}.main-small-button[_ngcontent-%COMP%]{flex:1 1 auto;--mat-button-filled-container-color: var(--kip-port-color);--mat-button-filled-label-text-color: var(--kip-contrast-color)}.other-small-button[_ngcontent-%COMP%]{flex:1 1 auto;--mat-button-filled-container-color: var(--kip-blue-color);--mat-button-filled-label-text-color: var(--kip-contrast-color)}.set-start-at[_ngcontent-%COMP%]{flex:1 1 auto;background-color:var(--kip-contrast-color)}.start-at[_ngcontent-%COMP%]{height:100%;width:100%;flex:1 1 auto}.start-at[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{fill:var(--kip-contrast-color)}.start-at[_ngcontent-%COMP%] svg[_ngcontent-%COMP%] text[_ngcontent-%COMP%]{font-family:Roboto;font-size:9px;font-weight:400;text-align:center;text-anchor:middle;font-style:normal;font-variant:normal;font-stretch:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:none}.buttons-svg-icon[_ngcontent-%COMP%]{width:100%;height:100%;margin:0;padding:0}.svg-content[_ngcontent-%COMP%]{width:100%;height:100%;padding:0;margin:0}.svg-content[_ngcontent-%COMP%] text[_ngcontent-%COMP%]{font-family:Roboto;font-size:15px;font-weight:700;text-align:center;text-anchor:middle;font-style:normal;font-variant:normal;font-stretch:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:none}.svg-start-at[_ngcontent-%COMP%] text[_ngcontent-%COMP%]{fill:var(--kip-contrast-dim-color)}.widgetOverlay[_ngcontent-%COMP%]{position:absolute;width:100%;height:100%;right:0;bottom:0;color:transparent;z-index:21}"]})}return o})();export{Et as WidgetRacerTimerComponent};
@@ -1 +1 @@
1
- import {G as Gt,L as Lt}from'./chunk-BAVmyVwG.js';import {u}from'./chunk-Be5KcT7R.js';import {c}from'./chunk-CRy9Da7a.js';import {d1 as Hj,w,du as p,dv as rt,v as vt,D as Dt,$ as $j,a6 as Lr,dx as n$1,F as Fa,dn as ge,J as JD,_ as _w,M as Mw,f as eg,K as Kw,h as Fw,P as Pi,k as Qh,u as ul,g as qw,B as Bh,an as Hh,l as ud,m as dd}from'./main-F7NMHHV4.js';var O=["compassGauge"];function L(n,p){if(n&1){let a=Fw();Pi(0,"radial-gauge",2,0),Qh("resizeChange",function(e){ud(a);let o=qw();return dd(o.onResized(e))}),ul();}if(n&2){let a=qw();Bh("options",a.gaugeOptions)("value",a.displayValue()),Hh("value-text",a.textValue())("color-stroke-ticks",a.colorStrokeTicks);}}function z(n){let p=n.match(/(\d+(\.\d+)?|\.\d+)/g);if(!p||p.length<3)throw new Error("Invalid RGBA format");let[a,t,e,o=1]=p.map(Number),s=o===1?"":Math.round(o*255).toString(16).padStart(2,"0").toUpperCase();return "#"+((1<<24)+(a<<16)+(t<<8)+e).toString(16).slice(1).toUpperCase()+s}function U(n){return n<0&&(n=360+n),n}var $=(()=>{class n{id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p);streams=w(rt);static DEFAULT_CONFIG={displayName:"Gauge Label",filterSelfPaths:true,paths:{gaugePath:{description:"Numeric Data",path:null,source:null,pathType:"number",suppressBootstrapNull:true,isPathConfigurable:true,showPathSkUnitsFilter:false,pathSkUnitsFilter:"rad",showConvertUnitTo:false,convertUnitTo:"deg",sampleTime:500}},supportAutomaticHistoricalSeries:true,gauge:{type:"ngRadial",subType:"baseplateCompass",enableTicks:true,compassUseNumbers:false,showValueBox:false},enableTimeout:false,color:"contrast",dataTimeout:5};LINE="line";NEEDLE_START=40;NEEDLE_END=100;NEEDLE_CIRCLE_SIZE=15;BORDER_MIDDLE_WIDTH=2;BORDER_INNER_WIDTH=2;ANIMATION_TARGET_PLATE="plate";ANIMATION_TARGET_NEEDLE="needle";textValue=vt("--");value=vt(void 0);displayValue=Dt(()=>this.value()??0);shouldRenderGauge=Dt(()=>this.value()!==void 0);gaugeBootstrapped=vt(false);animationEnabled=Dt(()=>this.gaugeBootstrapped());ngGauge=$j("compassGauge");gauge=$j("compassGauge",{read:Lr});viewReady=vt(false);gaugeOptions={};colorStrokeTicks="";currentState=vt(n$1.Normal);lastAppliedState=null;negToPortPaths=["self.environment.wind.angleApparent","self.environment.wind.angleTrueGround","self.environment.wind.angleTrueWater","self.environment.wind.angleTrueWaterDamped","self.performance.beatAngle","self.performance.gybeAngle","self.performance.targetAngle","self.performance.optimumWindAngle"];displayName=Dt(()=>this.runtime.options()?.displayName);constructor(){Fa(()=>{let a=this.runtime.options(),t=this.theme();if(!a||!t)return;let e=a.paths?.gaugePath;e?.path&&ge(()=>this.streams.observe("gaugePath",o=>{let s=o?.data?.value??null;if(s==null)this.value.set(0),this.textValue.set("--");else {let r=e.path;r&&this.negToPortPaths.includes(r)&&(s=U(s));let T=Math.min(Math.max(s,0),360);this.value.set(T),this.textValue.set(T.toFixed(0));}let i=o?.state??n$1.Normal;i!==this.currentState()&&this.currentState.set(i);}));}),Fa(()=>{let a=this.runtime.options(),t=this.theme();!a||!t||ge(()=>{if(this.buildGaugeOptions(a,t),this.viewReady())try{this.ngGauge()?.update(this.gaugeOptions);}catch(e){}});}),Fa(()=>{let a=this.ngGauge();!a||this.gaugeBootstrapped()||ge(()=>{try{requestAnimationFrame(()=>{this.gaugeBootstrapped.set(!0);try{a.update({animation:!0,animatedValue:!0});}catch(t){}});}catch(t){}});}),Fa(()=>{let a=this.runtime.options(),t=this.theme(),e=this.currentState();!a||!t||this.viewReady()&&e!==this.lastAppliedState&&ge(()=>{let o={};switch(e){case n$1.Emergency:o.colorValueText=t.zoneEmergency;break;case n$1.Alarm:o.colorValueText=t.zoneAlarm;break;case n$1.Warn:o.colorValueText=t.zoneWarn;break;case n$1.Alert:o.colorValueText=t.zoneAlert;break;default:o.colorValueText=t.contrast;break}try{this.ngGauge()?.update(o);}catch(s){}this.lastAppliedState=e;});});}buildGaugeOptions(a,t){let e=this.gaugeOptions={},o=a.paths?.gaugePath;e.title=this.displayName(),e.minValue=0,e.maxValue=360,e.units=o?.convertUnitTo||"",e.valueDec=a.numDecimal??0,e.valueInt=a.numInt??1,e.barProgress=false,e.barWidth=0,e.valueBox=!!a.gauge?.showValueBox,e.fontValueSize=60,e.valueBoxWidth=30,e.valueBoxBorderRadius=10,e.valueBoxStroke=0,e.ticksAngle=360,e.startAngle=180,e.exactTicks=false,e.strokeTicks="",e.majorTicks=a.gauge?.compassUseNumbers?["N","30","60","E","120","150","S","210","240","W","300","330","N"]:["N","NE","E","SE","S","SW","W","NW","N"],e.majorTicksDec=0,e.majorTicksInt=1,e.numbersMargin=5,e.fontNumbersSize=25,e.minorTicks=a.gauge?.compassUseNumbers?3:2,e.needle=true,e.needleType=this.LINE,e.needleStart=this.NEEDLE_START,e.needleEnd=this.NEEDLE_END,e.needleCircleSize=this.NEEDLE_CIRCLE_SIZE,e.needleWidth=4,e.needleShadow=false,e.needleCircleInner=false,e.needleCircleOuter=false,e.borders=true,e.borderOuterWidth=0,e.borderMiddleWidth=this.BORDER_MIDDLE_WIDTH,e.borderInnerWidth=this.BORDER_INNER_WIDTH,e.borderShadowWidth=0,e.highlights=[],e.highlightsWidth=0,e.fontTitle="Roboto",e.fontTitleWeight="normal",e.fontTitleSize=25,e.fontUnits="Roboto",e.fontUnitsSize=25,e.fontUnitsWeight="normal",e.barStrokeWidth=0,e.barShadow=0,e.fontValue="Roboto",e.fontValueWeight="bold",e.valueTextShadow=false,e.colorValueBoxShadow="",e.fontNumbers="Roboto",e.fontNumbersWeight="bold",a.gauge?.subType==="marineCompass"?(e.animationTarget=this.ANIMATION_TARGET_PLATE,e.useMinPath=true):(e.animationTarget=this.ANIMATION_TARGET_NEEDLE,e.useMinPath=true),e.animateOnInit=false,e.animation=this.animationEnabled(),e.animatedValue=this.animationEnabled(),e.animationRule="linear",e.animationDuration=(o?.sampleTime??500)-50;let s=c(a.color??"contrast",t),i=z(s.dim),r=z(c("contrast",t).dim);e.colorBarProgress=s.color,e.colorBorderMiddle=i,e.colorBorderMiddleEnd=i,e.colorNeedle=s.color,e.colorNeedleEnd=s.color,e.colorTitle=r,e.colorUnits=r,e.colorValueText=s.color,e.colorMinorTicks=r,e.colorNumbers=a.gauge?.compassUseNumbers?[t.port,r,r,i,r,r,i,r,r,i,r,r,t.port]:[t.port,i,i,i,i,i,i,i,t.port],e.colorMajorTicks=a.gauge?.compassUseNumbers?[t.port,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.port]:[t.port,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.port],e.colorPlate=e.colorPlateEnd=e.colorBorderInner=e.colorBorderInnerEnd=t.cardColor,e.colorBar=t.background,e.colorBarStroke="",e.colorValueBoxBackground=t.background,e.colorNeedleShadowUp="",e.colorNeedleShadowDown="",e.colorNeedleCircleInner=e.colorPlate,e.colorNeedleCircleInnerEnd=e.colorPlate,e.colorNeedleCircleOuter=e.colorPlate,e.colorNeedleCircleOuterEnd=e.colorPlate;}setCanvasSize(){let a=this.gauge()?.nativeElement;if(!a)return;let t=a.getBoundingClientRect(),e={height:t.height,width:t.width};try{this.ngGauge()?.update(e);}catch(o){}}ngAfterViewInit(){this.viewReady.set(true),this.setCanvasSize();try{this.ngGauge()?.update(this.gaugeOptions);}catch(a){}}onResized(a){let t={height:a.contentRect.height,width:a.contentRect.width};try{this.ngGauge()?.update(t);}catch(e){}}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["widget-gauge-ng-compass"]],viewQuery:function(t,e){t&1&&eg(e.ngGauge,O,5)(e.gauge,O,5,Lr),t&2&&Kw(2);},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:1,vars:1,consts:[["compassGauge",""],["kipResizeObserver","",3,"options","value"],["kipResizeObserver","",3,"resizeChange","options","value"]],template:function(t,e){t&1&&_w(0,L,2,4,"radial-gauge",1),t&2&&Mw(e.shouldRenderGauge()?0:-1);},dependencies:[u,Gt,Lt],styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%} radial-gauge{display:block;position:relative;width:100%;min-width:8px;height:100%;overflow:clip} radial-gauge>canvas{display:block;position:absolute;height:100%;width:100%;left:50%;top:50%;transform:translate(-50%,-50%);padding:10px}"]})}return n})();export{$ as WidgetGaugeNgCompassComponent};
1
+ import {G as Gt,L as Lt}from'./chunk-CEtt0kr-.js';import {u}from'./chunk-CxOyBrqL.js';import {c}from'./chunk-DHj2hm9r.js';import {d1 as Hj,w,du as p,dv as rt,v as vt,D as Dt,$ as $j,a6 as Lr,dx as n$1,F as Fa,dn as ge,J as JD,_ as _w,M as Mw,f as eg,K as Kw,h as Fw,P as Pi,k as Qh,u as ul,g as qw,B as Bh,an as Hh,l as ud,m as dd}from'./main-IINF7HD6.js';var O=["compassGauge"];function L(n,p){if(n&1){let a=Fw();Pi(0,"radial-gauge",2,0),Qh("resizeChange",function(e){ud(a);let o=qw();return dd(o.onResized(e))}),ul();}if(n&2){let a=qw();Bh("options",a.gaugeOptions)("value",a.displayValue()),Hh("value-text",a.textValue())("color-stroke-ticks",a.colorStrokeTicks);}}function z(n){let p=n.match(/(\d+(\.\d+)?|\.\d+)/g);if(!p||p.length<3)throw new Error("Invalid RGBA format");let[a,t,e,o=1]=p.map(Number),s=o===1?"":Math.round(o*255).toString(16).padStart(2,"0").toUpperCase();return "#"+((1<<24)+(a<<16)+(t<<8)+e).toString(16).slice(1).toUpperCase()+s}function U(n){return n<0&&(n=360+n),n}var $=(()=>{class n{id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p);streams=w(rt);static DEFAULT_CONFIG={displayName:"Gauge Label",filterSelfPaths:true,paths:{gaugePath:{description:"Numeric Data",path:null,source:null,pathType:"number",suppressBootstrapNull:true,isPathConfigurable:true,showPathSkUnitsFilter:false,pathSkUnitsFilter:"rad",showConvertUnitTo:false,convertUnitTo:"deg",sampleTime:500}},supportAutomaticHistoricalSeries:true,gauge:{type:"ngRadial",subType:"baseplateCompass",enableTicks:true,compassUseNumbers:false,showValueBox:false},enableTimeout:false,color:"contrast",dataTimeout:5};LINE="line";NEEDLE_START=40;NEEDLE_END=100;NEEDLE_CIRCLE_SIZE=15;BORDER_MIDDLE_WIDTH=2;BORDER_INNER_WIDTH=2;ANIMATION_TARGET_PLATE="plate";ANIMATION_TARGET_NEEDLE="needle";textValue=vt("--");value=vt(void 0);displayValue=Dt(()=>this.value()??0);shouldRenderGauge=Dt(()=>this.value()!==void 0);gaugeBootstrapped=vt(false);animationEnabled=Dt(()=>this.gaugeBootstrapped());ngGauge=$j("compassGauge");gauge=$j("compassGauge",{read:Lr});viewReady=vt(false);gaugeOptions={};colorStrokeTicks="";currentState=vt(n$1.Normal);lastAppliedState=null;negToPortPaths=["self.environment.wind.angleApparent","self.environment.wind.angleTrueGround","self.environment.wind.angleTrueWater","self.environment.wind.angleTrueWaterDamped","self.performance.beatAngle","self.performance.gybeAngle","self.performance.targetAngle","self.performance.optimumWindAngle"];displayName=Dt(()=>this.runtime.options()?.displayName);constructor(){Fa(()=>{let a=this.runtime.options(),t=this.theme();if(!a||!t)return;let e=a.paths?.gaugePath;e?.path&&ge(()=>this.streams.observe("gaugePath",o=>{let s=o?.data?.value??null;if(s==null)this.value.set(0),this.textValue.set("--");else {let r=e.path;r&&this.negToPortPaths.includes(r)&&(s=U(s));let T=Math.min(Math.max(s,0),360);this.value.set(T),this.textValue.set(T.toFixed(0));}let i=o?.state??n$1.Normal;i!==this.currentState()&&this.currentState.set(i);}));}),Fa(()=>{let a=this.runtime.options(),t=this.theme();!a||!t||ge(()=>{if(this.buildGaugeOptions(a,t),this.viewReady())try{this.ngGauge()?.update(this.gaugeOptions);}catch(e){}});}),Fa(()=>{let a=this.ngGauge();!a||this.gaugeBootstrapped()||ge(()=>{try{requestAnimationFrame(()=>{this.gaugeBootstrapped.set(!0);try{a.update({animation:!0,animatedValue:!0});}catch(t){}});}catch(t){}});}),Fa(()=>{let a=this.runtime.options(),t=this.theme(),e=this.currentState();!a||!t||this.viewReady()&&e!==this.lastAppliedState&&ge(()=>{let o={};switch(e){case n$1.Emergency:o.colorValueText=t.zoneEmergency;break;case n$1.Alarm:o.colorValueText=t.zoneAlarm;break;case n$1.Warn:o.colorValueText=t.zoneWarn;break;case n$1.Alert:o.colorValueText=t.zoneAlert;break;default:o.colorValueText=t.contrast;break}try{this.ngGauge()?.update(o);}catch(s){}this.lastAppliedState=e;});});}buildGaugeOptions(a,t){let e=this.gaugeOptions={},o=a.paths?.gaugePath;e.title=this.displayName(),e.minValue=0,e.maxValue=360,e.units=o?.convertUnitTo||"",e.valueDec=a.numDecimal??0,e.valueInt=a.numInt??1,e.barProgress=false,e.barWidth=0,e.valueBox=!!a.gauge?.showValueBox,e.fontValueSize=60,e.valueBoxWidth=30,e.valueBoxBorderRadius=10,e.valueBoxStroke=0,e.ticksAngle=360,e.startAngle=180,e.exactTicks=false,e.strokeTicks="",e.majorTicks=a.gauge?.compassUseNumbers?["N","30","60","E","120","150","S","210","240","W","300","330","N"]:["N","NE","E","SE","S","SW","W","NW","N"],e.majorTicksDec=0,e.majorTicksInt=1,e.numbersMargin=5,e.fontNumbersSize=25,e.minorTicks=a.gauge?.compassUseNumbers?3:2,e.needle=true,e.needleType=this.LINE,e.needleStart=this.NEEDLE_START,e.needleEnd=this.NEEDLE_END,e.needleCircleSize=this.NEEDLE_CIRCLE_SIZE,e.needleWidth=4,e.needleShadow=false,e.needleCircleInner=false,e.needleCircleOuter=false,e.borders=true,e.borderOuterWidth=0,e.borderMiddleWidth=this.BORDER_MIDDLE_WIDTH,e.borderInnerWidth=this.BORDER_INNER_WIDTH,e.borderShadowWidth=0,e.highlights=[],e.highlightsWidth=0,e.fontTitle="Roboto",e.fontTitleWeight="normal",e.fontTitleSize=25,e.fontUnits="Roboto",e.fontUnitsSize=25,e.fontUnitsWeight="normal",e.barStrokeWidth=0,e.barShadow=0,e.fontValue="Roboto",e.fontValueWeight="bold",e.valueTextShadow=false,e.colorValueBoxShadow="",e.fontNumbers="Roboto",e.fontNumbersWeight="bold",a.gauge?.subType==="marineCompass"?(e.animationTarget=this.ANIMATION_TARGET_PLATE,e.useMinPath=true):(e.animationTarget=this.ANIMATION_TARGET_NEEDLE,e.useMinPath=true),e.animateOnInit=false,e.animation=this.animationEnabled(),e.animatedValue=this.animationEnabled(),e.animationRule="linear",e.animationDuration=(o?.sampleTime??500)-50;let s=c(a.color??"contrast",t),i=z(s.dim),r=z(c("contrast",t).dim);e.colorBarProgress=s.color,e.colorBorderMiddle=i,e.colorBorderMiddleEnd=i,e.colorNeedle=s.color,e.colorNeedleEnd=s.color,e.colorTitle=r,e.colorUnits=r,e.colorValueText=s.color,e.colorMinorTicks=r,e.colorNumbers=a.gauge?.compassUseNumbers?[t.port,r,r,i,r,r,i,r,r,i,r,r,t.port]:[t.port,i,i,i,i,i,i,i,t.port],e.colorMajorTicks=a.gauge?.compassUseNumbers?[t.port,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.port]:[t.port,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.contrast,t.port],e.colorPlate=e.colorPlateEnd=e.colorBorderInner=e.colorBorderInnerEnd=t.cardColor,e.colorBar=t.background,e.colorBarStroke="",e.colorValueBoxBackground=t.background,e.colorNeedleShadowUp="",e.colorNeedleShadowDown="",e.colorNeedleCircleInner=e.colorPlate,e.colorNeedleCircleInnerEnd=e.colorPlate,e.colorNeedleCircleOuter=e.colorPlate,e.colorNeedleCircleOuterEnd=e.colorPlate;}setCanvasSize(){let a=this.gauge()?.nativeElement;if(!a)return;let t=a.getBoundingClientRect(),e={height:t.height,width:t.width};try{this.ngGauge()?.update(e);}catch(o){}}ngAfterViewInit(){this.viewReady.set(true),this.setCanvasSize();try{this.ngGauge()?.update(this.gaugeOptions);}catch(a){}}onResized(a){let t={height:a.contentRect.height,width:a.contentRect.width};try{this.ngGauge()?.update(t);}catch(e){}}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["widget-gauge-ng-compass"]],viewQuery:function(t,e){t&1&&eg(e.ngGauge,O,5)(e.gauge,O,5,Lr),t&2&&Kw(2);},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:1,vars:1,consts:[["compassGauge",""],["kipResizeObserver","",3,"options","value"],["kipResizeObserver","",3,"resizeChange","options","value"]],template:function(t,e){t&1&&_w(0,L,2,4,"radial-gauge",1),t&2&&Mw(e.shouldRenderGauge()?0:-1);},dependencies:[u,Gt,Lt],styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%} radial-gauge{display:block;position:relative;width:100%;min-width:8px;height:100%;overflow:clip} radial-gauge>canvas{display:block;position:absolute;height:100%;width:100%;left:50%;top:50%;transform:translate(-50%,-50%);padding:10px}"]})}return n})();export{$ as WidgetGaugeNgCompassComponent};