signalk-binnacle 0.6.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +90 -0
- package/README.md +16 -28
- package/package.json +1 -1
- package/public/assets/{TrendCharts-Bd7hSoMu.js → TrendCharts-BOY6SI0k.js} +1 -1
- package/public/assets/{index-CAjHX3-B.css → index-CfdWfyly.css} +1 -1
- package/public/assets/index-DtddKTWH.js +853 -0
- package/public/assets/{route-edit-DxrqIXLA.js → route-edit-BUtpY0B2.js} +1 -1
- package/public/index.html +2 -2
- package/public/sw.js +1 -1
- package/public/assets/index-NGypZbKU.js +0 -854
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,96 @@ All notable changes to Binnacle are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project aims to follow
|
|
5
5
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
<a id="v062"></a>
|
|
8
|
+
|
|
9
|
+
## [0.6.2] - 2026-06-13
|
|
10
|
+
|
|
11
|
+
A full-codebase reliability, correctness, and coherence pass, plus a weather-panel layer menu. It
|
|
12
|
+
hardens the weather overlays, the caching and history layers, the course and anchor logic, makes a
|
|
13
|
+
set of previously silent failures visible, and moves the weather layer toggles into a floating menu.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- The weather panel's layer toggles move from the header pill row, which ran out of room and
|
|
18
|
+
truncated, into a single layers menu opened from a floating button at the upper left of the
|
|
19
|
+
mini-map. The button lights and shows a count whenever layers are on, the menu groups the area
|
|
20
|
+
fill and the overlays and carries the source line, and it docks as a bottom sheet on a narrow
|
|
21
|
+
panel so it never covers the small map from the top. The one-tap Here conditions control stays
|
|
22
|
+
in the header.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- Pressure isobars no longer stay blank after the base map style swaps (the offline fallback or a
|
|
27
|
+
style reload): the overlay rebuilds its recreated sources instead of seeing an unchanged grid.
|
|
28
|
+
- The in-memory cache no longer evicts a just-refreshed weather grid or tide entry before older
|
|
29
|
+
ones, so a refreshed view is not dropped early and refetched.
|
|
30
|
+
- A corrupted or legacy profile can no longer render a chart layer transparent or broken: a
|
|
31
|
+
restored opacity is clamped to a valid range, matching first-registration.
|
|
32
|
+
- A malformed history timestamp no longer disables gap-splitting for the rest of a 24 hour track.
|
|
33
|
+
- The Trends panel can tell a present-but-empty history provider from an unreachable one.
|
|
34
|
+
- An active course's route, next, and arrival geometry survives a cross-station activation even
|
|
35
|
+
when the continuously-updating calc values stream in before the one-time hydration completes.
|
|
36
|
+
- A dead data link (the worker failing to load, a rejected connect) shows a "Data link failed,
|
|
37
|
+
reload" indicator instead of sitting forever on a connecting state.
|
|
38
|
+
- One chunk-load failure no longer kills route editing for the rest of the session.
|
|
39
|
+
- A failed track save or delete, a refused anchor drop on a server that advertises the standard
|
|
40
|
+
Anchor API, a failed user chart registration, an empty-and-failed route fetch, and a chart that
|
|
41
|
+
did not sync to the server all surface an error or a log breadcrumb now instead of going silent.
|
|
42
|
+
- The arrival alarm is stopped on teardown, profile sync retries after a transient first failure
|
|
43
|
+
instead of staying local-only for the session, and a unit preset from a previous server is
|
|
44
|
+
cleared when reconnecting to a different one.
|
|
45
|
+
- The layer opacity slider is a full-size touch target again, panel error lines use the shared
|
|
46
|
+
alarm framing, and the chart action menu supports arrow-key navigation.
|
|
47
|
+
|
|
48
|
+
### Internal
|
|
49
|
+
|
|
50
|
+
- IndexedDB and local-storage degrades, and an unavailable audible alarm, now log a one-line
|
|
51
|
+
breadcrumb so a field report is diagnosable.
|
|
52
|
+
- Shared cleanups: one safety-button gutter rule, the collision overlay on the shared layer
|
|
53
|
+
helpers, the tracking token on the alarms tag, anonymous access-request fetches, named collision
|
|
54
|
+
threshold constants, a once-computed day paint object, and a dropped redundant per-tick sort.
|
|
55
|
+
- New tests cover the stream connection and worker lifecycle, the unit conversion family, the
|
|
56
|
+
anchor acknowledge escalation, client-computed course VMG and time-to-go, and several boundary
|
|
57
|
+
and error paths the audit found untested.
|
|
58
|
+
- A shared rovingFocus arrow-key action and an overlay-backdrop utility class now back both the
|
|
59
|
+
chart context menu and the new weather layers menu, replacing duplicated handlers and CSS, and
|
|
60
|
+
the chart context menu moved onto the shared Escape dismiss stack. The now-unused scrollEdges
|
|
61
|
+
action was removed.
|
|
62
|
+
|
|
63
|
+
<a id="v061"></a>
|
|
64
|
+
|
|
65
|
+
## [0.6.1] - 2026-06-12
|
|
66
|
+
|
|
67
|
+
Quick access from community feedback: the chart actions a navigator reaches for stay within one
|
|
68
|
+
or two taps, and the weather panel's layer row scrolls honestly instead of clipping its last pill.
|
|
69
|
+
|
|
70
|
+
### Added
|
|
71
|
+
|
|
72
|
+
- Measure from the chart: the long-press and right-click menu gains "Measure from here", arming
|
|
73
|
+
the measure tool with its first point at the pressed position, so measuring starts where you
|
|
74
|
+
are looking instead of via the app menu. Re-arming mid-measurement deliberately starts fresh;
|
|
75
|
+
extending an in-progress measurement is a plain chart tap.
|
|
76
|
+
- A Charts pill on the bottom status strip opens Layers and charts in one tap, beside Center,
|
|
77
|
+
Follow, and Forecast, so switching charts no longer goes through the app menu.
|
|
78
|
+
|
|
79
|
+
### Fixed
|
|
80
|
+
|
|
81
|
+
- The weather panel's layer pills no longer render the last label clipped: the edge fade shows
|
|
82
|
+
only while there is actually more to scroll, lifts at the end of the scroll, and the pills
|
|
83
|
+
keep their natural width instead of compressing when the panel narrows, so the row genuinely
|
|
84
|
+
scrolls.
|
|
85
|
+
- The chart context menu sizes itself to its longest label, so its edge-clamp math matches the
|
|
86
|
+
rendered box.
|
|
87
|
+
- Voice control can activate the Charts pill by its visible word, its expanded state is not
|
|
88
|
+
announced while it is still disabled during chart load, and its tooltip says the chart is
|
|
89
|
+
loading while it is.
|
|
90
|
+
|
|
91
|
+
### Internal
|
|
92
|
+
|
|
93
|
+
- One armMeasure helper replaces the duplicated reveal-then-arm sequence, new measure tests pin
|
|
94
|
+
the seed-after-arm contract and the deliberate reset on re-arm, and CI test flakes from cold
|
|
95
|
+
ICU loading are prevented by a per-worker warm-up rather than per-test timeouts.
|
|
96
|
+
|
|
7
97
|
<a id="v060"></a>
|
|
8
98
|
|
|
9
99
|
## [0.6.0] - 2026-06-12
|
package/README.md
CHANGED
|
@@ -15,34 +15,22 @@ A WebGL chart plotter for [Signal K](https://signalk.org).
|
|
|
15
15
|
> is also not certified for safety-of-life navigation. Always carry redundant means of navigation,
|
|
16
16
|
> cross-check against your primary instruments, and treat every display as advisory.
|
|
17
17
|
|
|
18
|
-
## What's new in 0.6.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
- **
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
overlays,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
boat with one-tap Silence and Acknowledge that propagate to every station.
|
|
35
|
-
- **Trends and track history.** Depth, apparent wind, pressure, and speed over the last 24 hours
|
|
36
|
-
as themed graphs from the server's v2 History API, falling back to live session sampling
|
|
37
|
-
without a provider, plus a dashed 24 hour track-history chart layer.
|
|
38
|
-
- **Standard waypoints, worldwide tides, AIS trails, and chart symbols.** Waypoints live in the
|
|
39
|
-
server's own resources, tides ride the signalk-tides plugin with NOAA CO-OPS as the fallback,
|
|
40
|
-
AIS targets get faded wakes from the tracks plugin, and signalk-symbol-manager artwork renders
|
|
41
|
-
on notes and waypoints, remapped into the red band at night.
|
|
42
|
-
- **Background-tab safety.** Delta batching and AIS pruning moved off the render loop, so live
|
|
43
|
-
data, the collision watch, and the anchor alarm keep working while the browser tab is hidden.
|
|
44
|
-
|
|
45
|
-
See the [changelog](CHANGELOG.md#v060) for the full list.
|
|
18
|
+
## What's new in 0.6.2
|
|
19
|
+
|
|
20
|
+
A weather layers menu and a deep reliability pass:
|
|
21
|
+
|
|
22
|
+
- **A weather layers menu.** The weather panel's layer toggles move from the header, which ran out
|
|
23
|
+
of room, into a single menu opened from a floating button at the upper left of the mini-map. The
|
|
24
|
+
button lights and shows a count when layers are on, the menu groups the area fill and the
|
|
25
|
+
overlays, it stays open while you toggle several layers, and it docks as a bottom sheet on a
|
|
26
|
+
narrow screen. There is now room to add more options without crowding.
|
|
27
|
+
- **Reliability and correctness.** A full pass across the weather overlays, the caching and history
|
|
28
|
+
layers, and the course and anchor logic: pressure isobars no longer blank after a map style swap,
|
|
29
|
+
caches stop evicting just-refreshed entries, an active course keeps its route geometry across a
|
|
30
|
+
cross-station handoff, and a set of failures that used to fail silently (a dead data link, a
|
|
31
|
+
failed track or chart save, a refused anchor drop) now tell you.
|
|
32
|
+
|
|
33
|
+
See the [changelog](CHANGELOG.md#v062) for the full list.
|
|
46
34
|
|
|
47
35
|
## What it does
|
|
48
36
|
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{C as e,D as t,E as n,O as r,S as i,T as a,_ as o,a as s,b as c,c as l,f as u,g as d,h as f,i as p,k as m,m as h,o as g,p as _,r as v,s as y,t as b,v as x,w as S,x as C,y as w}from"./index-
|
|
1
|
+
import{C as e,D as t,E as n,O as r,S as i,T as a,_ as o,a as s,b as c,c as l,f as u,g as d,h as f,i as p,k as m,m as h,o as g,p as _,r as v,s as y,t as b,v as x,w as S,x as C,y as w}from"./index-DtddKTWH.js";var T=!0,E=`uplot`,ee=`u-hz`,te=`u-vt`,ne=`u-title`,re=`u-wrap`,ie=`u-under`,ae=`u-over`,oe=`u-axis`,se=`u-off`,ce=`u-select`,le=`u-cursor-x`,ue=`u-cursor-y`,de=`u-cursor-pt`,fe=`u-legend`,pe=`u-live`,me=`u-inline`,he=`u-series`,ge=`u-marker`,_e=`u-label`,ve=`u-value`,ye=`width`,be=`height`,xe=`top`,Se=`bottom`,Ce=`left`,we=`right`,Te=`#000`,Ee=`#0000`,De=`mousemove`,Oe=`mousedown`,ke=`mouseup`,Ae=`mouseenter`,je=`mouseleave`,Me=`dblclick`,D=`resize`,Ne=`scroll`,Pe=`change`,Fe=`dppxchange`,Ie=`--`,Le=typeof window<`u`,Re=Le?document:null,ze=Le?window:null,O=Le?navigator:null,k,Be;function Ve(){let e=devicePixelRatio;k!=e&&(k=e,Be&&et(Pe,Be,Ve),Be=matchMedia(`(min-resolution: ${k-.001}dppx) and (max-resolution: ${k+.001}dppx)`),$e(Pe,Be,Ve),ze.dispatchEvent(new CustomEvent(Fe)))}function He(e,t){if(t!=null){let n=e.classList;!n.contains(t)&&n.add(t)}}function Ue(e,t){let n=e.classList;n.contains(t)&&n.remove(t)}function A(e,t,n){e.style[t]=n+`px`}function We(e,t,n,r){let i=Re.createElement(e);return t!=null&&He(i,t),n?.insertBefore(i,r),i}function Ge(e,t){return We(`div`,e,t)}var Ke=new WeakMap;function qe(e,t,n,r,i){let a=`translate(`+t+`px,`+n+`px)`;a!=Ke.get(e)&&(e.style.transform=a,Ke.set(e,a),t<0||n<0||t>r||n>i?He(e,se):Ue(e,se))}var Je=new WeakMap;function Ye(e,t,n){let r=t+n;r!=Je.get(e)&&(Je.set(e,r),e.style.background=t,e.style.borderColor=n)}var Xe=new WeakMap;function Ze(e,t,n,r){let i=t+``+n;i!=Xe.get(e)&&(Xe.set(e,i),e.style.height=n+`px`,e.style.width=t+`px`,e.style.marginLeft=r?-t/2+`px`:0,e.style.marginTop=r?-n/2+`px`:0)}var Qe={passive:!0},j={...Qe,capture:!0};function $e(e,t,n,r){t.addEventListener(e,n,r?j:Qe)}function et(e,t,n,r){t.removeEventListener(e,n,Qe)}Le&&Ve();function tt(e,t,n,r){let i;n||=0,r||=t.length-1;let a=r<=2147483647;for(;r-n>1;)i=a?n+r>>1:vt((n+r)/2),t[i]<e?n=i:r=i;return e-t[n]<=t[r]-e?n:r}function M(e){return(t,n,r)=>{let i=-1,a=-1;for(let a=n;a<=r;a++)if(e(t[a])){i=a;break}for(let i=r;i>=n;i--)if(e(t[i])){a=i;break}return[i,a]}}var nt=e=>e!=null,rt=e=>e!=null&&e>0,N=M(nt),it=M(rt);function at(e,t,n,r=0,i=!1){let a=i?it:N,o=i?rt:nt;[t,n]=a(e,t,n);let s=e[t],c=e[t];if(t>-1)if(r==1)s=e[t],c=e[n];else if(r==-1)s=e[n],c=e[t];else for(let r=t;r<=n;r++){let t=e[r];o(t)&&(t<s?s=t:t>c&&(c=t))}return[s??R,c??-R]}function ot(e,t,n,r){let i=Ct(e),a=Ct(t);e==t&&(i==-1?(e*=n,t/=n):(e/=n,t*=n));let o=n==10?wt:Tt,s=i==1?vt:yt,c=a==1?yt:vt,l=s(o(I(e))),u=c(o(I(t))),d=St(n,l),f=St(n,u);return n==10&&(l<0&&(d=B(d,-l)),u<0&&(f=B(f,-u))),r||n==2?(e=d*i,t=f*a):(e=Vt(e,d),t=Bt(t,f)),[e,t]}function st(e,t,n,r){let i=ot(e,t,n,r);return e==0&&(i[0]=0),t==0&&(i[1]=0),i}var ct=.1,lt={mode:3,pad:ct},ut={pad:0,soft:null,mode:0},dt={min:ut,max:ut};function ft(e,t,n,r){return Xt(n)?mt(e,t,n):(ut.pad=n,ut.soft=r?0:null,ut.mode=r?3:0,mt(e,t,dt))}function P(e,t){return e??t}function pt(e,t,n){for(t=P(t,0),n=P(n,e.length-1);t<=n;){if(e[t]!=null)return!0;t++}return!1}function mt(e,t,n){let r=n.min,i=n.max,a=P(r.pad,0),o=P(i.pad,0),s=P(r.hard,-R),c=P(i.hard,R),l=P(r.soft,R),u=P(i.soft,-R),d=P(r.mode,0),f=P(i.mode,0),p=t-e,m=wt(p),h=xt(I(e),I(t)),g=I(wt(h)-m);(p<1e-24||g>10)&&(p=0,(e==0||t==0)&&(p=1e-24,d==2&&l!=R&&(a=0),f==2&&u!=-R&&(o=0)));let _=p||h||1e3,v=St(10,vt(wt(_))),y=B(Vt(e-_*(p==0?e==0?.1:1:a),v/10),24),b=e>=l&&(d==1||d==3&&y<=l||d==2&&y>=l)?l:R,x=xt(s,y<b&&e>=b?b:bt(b,y)),S=B(Bt(t+_*(p==0?t==0?.1:1:o),v/10),24),C=t<=u&&(f==1||f==3&&S>=u||f==2&&S<=u)?u:-R,w=bt(c,S>C&&t<=C?C:xt(C,S));return x==w&&x==0&&(w=100),[x,w]}var ht=new Intl.NumberFormat(Le?O.language:`en-US`),gt=e=>ht.format(e),F=Math,_t=F.PI,I=F.abs,vt=F.floor,L=F.round,yt=F.ceil,bt=F.min,xt=F.max,St=F.pow,Ct=F.sign,wt=F.log10,Tt=F.log2,Et=(e,t=1)=>F.sinh(e)*t,Dt=(e,t=1)=>F.asinh(e/t),R=1/0;function Ot(e){return(wt((e^e>>31)-(e>>31))|0)+1}function kt(e,t,n){return bt(xt(e,t),n)}function At(e){return typeof e==`function`}function z(e){return At(e)?e:()=>e}var jt=()=>{},Mt=e=>e,Nt=(e,t)=>t,Pt=e=>null,Ft=e=>!0,It=(e,t)=>e==t,Lt=/\.\d*?(?=9{6,}|0{6,})/gm,Rt=e=>{if(H(e)||Ht.has(e))return e;let t=`${e}`,n=t.match(Lt);if(n==null)return e;let r=n[0].length-1;if(t.indexOf(`e-`)!=-1){let[e,n]=t.split(`e`);return+`${Rt(e)}e${n}`}return B(e,r)};function zt(e,t){return Rt(B(Rt(e/t))*t)}function Bt(e,t){return Rt(yt(Rt(e/t))*t)}function Vt(e,t){return Rt(vt(Rt(e/t))*t)}function B(e,t=0){if(H(e))return e;let n=10**t;return L(e*n*(1+2**-52))/n}var Ht=new Map;function Ut(e){return((``+e).split(`.`)[1]||``).length}function V(e,t,n,r){let i=[],a=r.map(Ut);for(let o=t;o<n;o++){let t=I(o),n=B(St(e,o),t);for(let s=0;s<r.length;s++){let c=e==10?+`${r[s]}e${o}`:r[s]*n,l=(o>=0?0:t)+(o>=a[s]?0:a[s]),u=e==10?c:B(c,l);i.push(u),Ht.set(u,l)}}return i}var Wt={},Gt=[],Kt=[null,null],qt=Array.isArray,H=Number.isInteger,Jt=e=>e===void 0;function Yt(e){return typeof e==`string`}function Xt(e){let t=!1;if(e!=null){let n=e.constructor;t=n==null||n==Object}return t}function Zt(e){return typeof e==`object`&&!!e}var Qt=Object.getPrototypeOf(Uint8Array),$t=`__proto__`;function en(e,t=Xt){let n;if(qt(e)){let r=e.find(e=>e!=null);if(qt(r)||t(r)){n=Array(e.length);for(let r=0;r<e.length;r++)n[r]=en(e[r],t)}else n=e.slice()}else if(e instanceof Qt)n=e.slice();else if(t(e)){n={};for(let r in e)r!=$t&&(n[r]=en(e[r],t))}else n=e;return n}function U(e){let t=arguments;for(let n=1;n<t.length;n++){let r=t[n];for(let t in r)t!=$t&&(Xt(e[t])?U(e[t],en(r[t])):e[t]=en(r[t]))}return e}var tn=0,nn=1,rn=2;function an(e,t,n){for(let r=0,i,a=-1;r<t.length;r++){let o=t[r];if(o>a){for(i=o-1;i>=0&&e[i]==null;)e[i--]=null;for(i=o+1;i<n&&e[i]==null;)e[a=i++]=null}}}function on(e,t){if(ln(e)){let t=e[0].slice();for(let n=1;n<e.length;n++)t.push(...e[n].slice(1));return un(t[0])||(t=cn(t)),t}let n=new Set;for(let t=0;t<e.length;t++){let r=e[t][0],i=r.length;for(let e=0;e<i;e++)n.add(r[e])}let r=[Array.from(n).sort((e,t)=>e-t)],i=r[0].length,a=new Map;for(let e=0;e<i;e++)a.set(r[0][e],e);for(let n=0;n<e.length;n++){let o=e[n],s=o[0];for(let e=1;e<o.length;e++){let c=o[e],l=Array(i).fill(void 0),u=t?t[n][e]:nn,d=[];for(let e=0;e<c.length;e++){let t=c[e],n=a.get(s[e]);t===null?u!=tn&&(l[n]=t,u==rn&&d.push(n)):l[n]=t}an(l,d,i),r.push(l)}}return r}var sn=typeof queueMicrotask>`u`?e=>Promise.resolve().then(e):queueMicrotask;function cn(e){let t=e[0],n=t.length,r=Array(n);for(let e=0;e<r.length;e++)r[e]=e;r.sort((e,n)=>t[e]-t[n]);let i=[];for(let t=0;t<e.length;t++){let a=e[t],o=Array(n);for(let e=0;e<n;e++)o[e]=a[r[e]];i.push(o)}return i}function ln(e){let t=e[0][0],n=t.length;for(let r=1;r<e.length;r++){let i=e[r][0];if(i.length!=n)return!1;if(i!=t){for(let e=0;e<n;e++)if(i[e]!=t[e])return!1}}return!0}function un(e,t=100){let n=e.length;if(n<=1)return!0;let r=0,i=n-1;for(;r<=i&&e[r]==null;)r++;for(;i>=r&&e[i]==null;)i--;if(i<=r)return!0;let a=xt(1,vt((i-r+1)/t));for(let t=e[r],n=r+a;n<=i;n+=a){let r=e[n];if(r!=null){if(r<=t)return!1;t=r}}return!0}var dn=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],fn=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function pn(e){return e.slice(0,3)}var mn=fn.map(pn),hn={MMMM:dn,MMM:dn.map(pn),WWWW:fn,WWW:mn};function gn(e){return(e<10?`0`:``)+e}function _n(e){return(e<10?`00`:e<100?`0`:``)+e}var vn={YYYY:e=>e.getFullYear(),YY:e=>(e.getFullYear()+``).slice(2),MMMM:(e,t)=>t.MMMM[e.getMonth()],MMM:(e,t)=>t.MMM[e.getMonth()],MM:e=>gn(e.getMonth()+1),M:e=>e.getMonth()+1,DD:e=>gn(e.getDate()),D:e=>e.getDate(),WWWW:(e,t)=>t.WWWW[e.getDay()],WWW:(e,t)=>t.WWW[e.getDay()],HH:e=>gn(e.getHours()),H:e=>e.getHours(),h:e=>{let t=e.getHours();return t==0?12:t>12?t-12:t},AA:e=>e.getHours()>=12?`PM`:`AM`,aa:e=>e.getHours()>=12?`pm`:`am`,a:e=>e.getHours()>=12?`p`:`a`,mm:e=>gn(e.getMinutes()),m:e=>e.getMinutes(),ss:e=>gn(e.getSeconds()),s:e=>e.getSeconds(),fff:e=>_n(e.getMilliseconds())};function yn(e,t){t||=hn;let n=[],r=/\{([a-z]+)\}|[^{]+/gi,i;for(;i=r.exec(e);)n.push(i[0][0]==`{`?vn[i[1]]:i[0]);return e=>{let r=``;for(let i=0;i<n.length;i++)r+=typeof n[i]==`string`?n[i]:n[i](e,t);return r}}var bn=new Intl.DateTimeFormat().resolvedOptions().timeZone;function xn(e,t){let n;return t==`UTC`||t==`Etc/UTC`?n=new Date(+e+e.getTimezoneOffset()*6e4):t==bn?n=e:(n=new Date(e.toLocaleString(`en-US`,{timeZone:t})),n.setMilliseconds(e.getMilliseconds())),n}var Sn=e=>e%1==0,Cn=[1,2,2.5,5],wn=V(10,-32,0,Cn),W=V(10,0,32,Cn),Tn=W.filter(Sn),En=wn.concat(W),Dn=`{YYYY}`,On=`
|
|
2
2
|
{YYYY}`,kn=`{M}/{D}`,An=`
|
|
3
3
|
{M}/{D}`,jn=`
|
|
4
4
|
{M}/{D}/{YY}`,Mn=`{h}:{mm}{aa}`,Nn=`
|