@theappglobal/webflow 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +5 -0
- package/README.md +46 -0
- package/dist/theapp.css +2 -0
- package/dist/theapp.css.map +7 -0
- package/dist/theapp.js +4 -0
- package/dist/theapp.js.map +7 -0
- package/package.json +60 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
Copyright (c) 2026 theapp.global. All rights reserved.
|
|
2
|
+
|
|
3
|
+
This package contains site-specific custom code for the theapp.global website. It is published to npm
|
|
4
|
+
solely so that it can be served through the jsDelivr CDN. No license is granted to copy, modify, or
|
|
5
|
+
reuse this code outside of that website.
|
package/README.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# @theappglobal/webflow
|
|
2
|
+
|
|
3
|
+
Custom code for the [theapp.global](https://theapp.global) Webflow site — the Tour Event template scripts —
|
|
4
|
+
written in TypeScript, bundled with esbuild, published to npm and served from jsDelivr.
|
|
5
|
+
|
|
6
|
+
```html
|
|
7
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@theappglobal/webflow@1/dist/theapp.css">
|
|
8
|
+
<script defer src="https://cdn.jsdelivr.net/npm/@theappglobal/webflow@1/dist/theapp.js"></script>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
- **Designers:** [docs/designer-guide.md](docs/designer-guide.md) — the attribute contract, with examples.
|
|
12
|
+
- **Developers:** [docs/development.md](docs/development.md) — dev loop, local/CDN toggle, tests, releasing.
|
|
13
|
+
- **Agents:** [CLAUDE.md](CLAUDE.md) — architecture, constraints, decisions log.
|
|
14
|
+
|
|
15
|
+
## Scripts
|
|
16
|
+
|
|
17
|
+
| Command | What it does |
|
|
18
|
+
|---|---|
|
|
19
|
+
| `pnpm dev` | esbuild watch + `http://localhost:3005` + live reload; prints/writes the Webflow dev snippet |
|
|
20
|
+
| `pnpm check` | Biome (lint + format) and `tsc --noEmit` |
|
|
21
|
+
| `pnpm test` | Vitest + happy-dom unit tests |
|
|
22
|
+
| `pnpm build` | Minified IIFE → `dist/theapp.js` + `dist/theapp.css` (+ sourcemaps), then the gzip size budget |
|
|
23
|
+
| `pnpm version <patch\|minor\|major>` | Runs check/test/build, bumps, commits and tags `vX.Y.Z` |
|
|
24
|
+
|
|
25
|
+
## Releasing
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pnpm version patch # or minor / major — refuses if check/test/build fail
|
|
29
|
+
git push --follow-tags # the tag triggers .github/workflows/publish.yml
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The workflow publishes to npm with provenance (OIDC trusted publishing, no token), purges the jsDelivr
|
|
33
|
+
cache for `@latest` and the current major, and creates a GitHub release with the dist files attached.
|
|
34
|
+
|
|
35
|
+
## Layout
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
src/index.ts boot: feature registry, isolation, Webflow queue
|
|
39
|
+
src/lib/ dom, time (parser), zone, event-context, log, webflow, memo
|
|
40
|
+
src/features/ one module per feature (render-lists, pricing, countdowns, calendar, fill-text, …)
|
|
41
|
+
src/styles/ register-tabs.css → dist/theapp.css
|
|
42
|
+
tests/ vitest (happy-dom); docs.test.ts keeps the guide and the code in lockstep
|
|
43
|
+
fixtures/dev.html local page exercising every hook against the dev server
|
|
44
|
+
bin/ build.mjs (esbuild), size.mjs (gzip budget), live-reload.js (dev only)
|
|
45
|
+
docs/ designer guide, development guide, generated Webflow snippet
|
|
46
|
+
```
|
package/dist/theapp.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
@media screen and (min-width:480px)and (max-width:991px){.register_mobile_tabs{display:none!important}.register_flex.cc-register-tabs,[data-register-pane]{display:flex!important;flex-direction:column!important}.register_separator{display:none!important}}@media screen and (max-width:479px){.register_mobile_tabs{display:flex!important}[data-register-tab]{cursor:pointer}[data-register-tab] .tab_button_line{opacity:0}[data-register-tab].is-active .tab_button_line{opacity:1}[data-register-pane]{display:none!important}[data-register-pane].is-active{display:flex!important;flex-direction:column!important}.register_separator{display:none!important}}
|
|
2
|
+
/*# sourceMappingURL=theapp.css.map */
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/styles/register-tabs.css"],
|
|
4
|
+
"sourcesContent": ["/* tablet 480–991px: stack both panes, no tabs */\n@media screen and (min-width: 480px) and (max-width: 991px) {\n .register_mobile_tabs {\n display: none !important;\n }\n .register_flex.cc-register-tabs,\n [data-register-pane] {\n display: flex !important;\n flex-direction: column !important;\n }\n .register_separator {\n display: none !important;\n }\n}\n\n/* mobile ≤479px: tabs */\n@media screen and (max-width: 479px) {\n .register_mobile_tabs {\n display: flex !important;\n }\n [data-register-tab] {\n cursor: pointer;\n }\n [data-register-tab] .tab_button_line {\n opacity: 0;\n }\n [data-register-tab].is-active .tab_button_line {\n opacity: 1;\n }\n [data-register-pane] {\n display: none !important;\n }\n [data-register-pane].is-active {\n display: flex !important;\n flex-direction: column !important;\n }\n .register_separator {\n display: none !important;\n }\n}\n"],
|
|
5
|
+
"mappings": "AACA,OAAO,YAAW,UAAY,WAAW,UAAY,OACnD,CAAC,qBACC,QAAS,cACX,CACA,CAAC,aAAa,CAAC,iBACf,CAAC,oBACC,QAAS,eACT,eAAgB,gBAClB,CACA,CAAC,mBACC,QAAS,cACX,CACF,CAGA,OAAO,YAAW,UAAY,OAC5B,CAfC,qBAgBC,QAAS,cACX,CACA,CAAC,mBACC,OAAQ,OACV,CACA,CAAC,mBAAmB,CAAC,gBACnB,QAAS,CACX,CACA,CAAC,kBAAkB,CAAC,UAAU,CAHT,gBAInB,QAAS,CACX,CACA,CAAC,oBACC,QAAS,cACX,CACA,CAAC,mBAAmB,CANA,UAOlB,QAAS,eACT,eAAgB,gBAClB,CACA,CA1BC,mBA2BC,QAAS,cACX,CACF",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/theapp.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/*! @theappglobal/webflow v1.0.0 — theapp.global Webflow scripts. https://github.com/milesroxas/theapp-webflow#readme */
|
|
2
|
+
"use strict";(()=>{var d=(t,e=document)=>e.querySelector(t),c=(t,e=document)=>[...e.querySelectorAll(t)],D=t=>(t.textContent??"").trim(),I=(t="")=>t.replace(/[\u200B-\u200D]/g,"").replace(/\s+/g," ").trim(),k=(t,e)=>Object.assign(document.createElement(t),{className:e}),f=(t,e)=>Object.entries(e).forEach(([n,r])=>t.setAttribute(n,String(r))),v=encodeURIComponent,A={target:"_blank",rel:"noopener noreferrer"},x=t=>t.cloneNode(!0);var X="[tour-event]",C=(t,...e)=>console.warn(`${X} ${t}`,...e),j=(t,...e)=>console.error(`${X} ${t}`,...e);var L={list:"e_what_list",card:"e_what_card",img:"e_what_img",text:"e_what_card_text",trim:"u-text-trim-off"},ht="h1, h2, h3, h4, h5, h6, p, em, [class*='u-text-style-']",B=()=>c("[data-ewhat-content]").forEach(t=>{if(t.dataset.ewhatReady==="true")return;let e=t;for(let a=e.firstElementChild;a&&e.children.length===1&&c("img",a).length>1;a=e.firstElementChild)e=a;let n=[],r=null;if([...e.children].forEach(a=>{let o=a instanceof HTMLImageElement?a:d("img",a);if(o){Object.assign(o,{loading:"lazy",decoding:"async"});let i=x(o);i.className=L.img,r=k("div",L.text);let l=k("article",L.card);l.append(i,r),n.push(l);let m=x(a);c("img, figure, .w-richtext-figure-type-image",m).forEach(u=>u.remove()),m.textContent?.trim()&&r.append(...m.children);return}if(!r)return;let s=x(a);[s,...c(ht,s)].forEach(i=>i.classList.add(L.trim)),r.append(s)}),!n.length)return C("activations: no cards detected",t);t.replaceChildren(...n),t.classList.add(L.list),t.dataset.ewhatReady="true"}),xt="(min-width: 992px)",bt=4,Y=()=>{window.matchMedia(xt).matches&&c(".e_what_scroll").forEach(t=>{if(c(`.${L.card}`,t).length<=bt)return;t.classList.add("is-draggable");let e=!1,n=0,r=0,a=()=>{e=!1,t.classList.remove("is-dragging")};t.addEventListener("mousedown",o=>{o.button===0&&(e=!0,n=o.pageX,r=t.scrollLeft,t.classList.add("is-dragging"))}),t.addEventListener("mousemove",o=>{e&&(o.preventDefault(),t.scrollLeft=r-(o.pageX-n))}),t.addEventListener("mouseleave",a),window.addEventListener("mouseup",a)})};var S=t=>t.toISOString().replace(/[-:]|\.\d{3}/g,""),vt=t=>t.replace(/[;,]/g,"\\$&"),wt={"data-gcal":({title:t,start:e,end:n})=>({...A,href:`https://calendar.google.com/calendar/render?action=TEMPLATE&text=${v(t)}&dates=${S(e)}/${S(n)}`}),"data-outlook":({title:t,start:e,end:n})=>({...A,href:`https://outlook.live.com/calendar/0/deeplink/compose?path=/calendar/action/compose&rru=addevent&subject=${v(t)}&startdt=${v(e.toISOString())}&enddt=${v(n.toISOString())}`}),"data-apple":({title:t,start:e,end:n})=>({download:`${t}.ics`,href:`data:text/calendar;charset=utf8,${v(["BEGIN:VCALENDAR","VERSION:2.0","PRODID:-//APP//Event Calendar//EN","BEGIN:VEVENT",`UID:${Date.now()}@theapp.global`,`DTSTAMP:${S(new Date)}`,`DTSTART:${S(e)}`,`DTEND:${S(n)}`,`SUMMARY:${vt(t)}`,"END:VEVENT","END:VCALENDAR"].join(`\r
|
|
3
|
+
`))}`})},K=({title:t,start:e,end:n})=>{if(!t||!e)return;let r={title:t,start:e,end:n??new Date(+e+2*36e5)};Object.entries(wt).forEach(([a,o])=>{let s=c(`[${a}]`);if(s.length){let i=o(r);s.forEach(l=>f(l,i))}})};var Z=(t,e=new Map)=>n=>{let r=e.get(n);if(r!==void 0)return r;let a=t(n);return e.set(n,a),a};var Tt={P:"America/Los_Angeles",M:"America/Denver",C:"America/Chicago",E:"America/New_York",AK:"America/Anchorage",HI:"Pacific/Honolulu"},At=/^(\d{4})-(\d{1,2})-(\d{1,2})(?:(?:\s+|T)(\d{1,2})(?::(\d{2}))?(?::(\d{2}))?\s*(am|pm)?)?$/i,J=t=>Tt[t.toUpperCase().replace(/^([PMCE])[SD]?T$/,"$1")]??t,yt=Z(t=>new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})),G=(t,e)=>{let n=yt(e).formatToParts(new Date(t)),r=Object.fromEntries(n.map(({type:u,value:E})=>[u,+E])),{year:a=NaN,month:o=NaN,day:s=NaN,hour:i=NaN,minute:l=NaN,second:m=NaN}=r;return Date.UTC(a,o-1,s,i,l,m)-t},$t=t=>{let e=t.match(At);if(e){let[,r="",a="",o="",s="0",i="0",l="0",m]=e;return[+r,+a-1,+o,m?+s%12+(/pm/i.test(m)?12:0):+s,+i,+l]}let n=new Date(t);return Number.isNaN(n.getTime())?null:[n.getFullYear(),n.getMonth(),n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds()]},Ct=/(Z|[+-]\d{2}:?\d{2})$/i,_=(t,e)=>{let n=(t??"").trim();if(!n)return null;if(Ct.test(n)){let o=new Date(n);return Number.isNaN(o.getTime())?null:o}let r=$t(n);if(!r)return null;if(!e)return new Date(...r);let a=Date.UTC(...r);return new Date(a-G(a-G(a,e),e))},Q=(t,e)=>t?new Intl.DateTimeFormat("en-US",{timeZone:e||void 0,month:"long",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0}).format(t):"";var O=(...t)=>{let e=d("[data-date-timezone]"),n=t.map(r=>r?.closest("[data-tz]")?.getAttribute("data-tz")?.trim()).find(Boolean)||e?.getAttribute("data-date-timezone")?.trim()||e?.textContent?.trim()||"PT";return n==="client"?null:J(n)};var Lt={"event-start":"data-event-start","event-end":"data-event-end","registration-start":"data-registration-start","registration-end":"data-registration-end"},Nt=[["data-days",86400],["data-hours",3600],["data-minutes",60],["data-seconds",1]],St=t=>String(t).padStart(2,"0"),_t=t=>{let e=t.getAttribute("data-countdown")?.trim()??"",n=Lt[e]??e;if(!n.startsWith("data-"))return null;let r=t.closest("[data-countdown-scope]")??document,a=t.hasAttribute(n)?t:d(`[${n}]`,r)??d(`[${n}]`);return a&&_(a.getAttribute(n),O(t,a))?.getTime()},tt=()=>{let t=c("[data-countdown]").map(r=>({deadline:_t(r),cells:Nt.map(([a,o])=>[d(`[${a}]`,r),o])})).filter(r=>!!r.deadline);if(!t.length)return;let e=()=>{let r=Date.now();return t.forEach(({deadline:a,cells:o})=>{let s=Math.max(0,Math.floor((a-r)/1e3));o.forEach(([i,l])=>{i&&(i.textContent=St(Math.floor(s/l))),s%=l})}),t.every(a=>a.deadline<=r)},n=setInterval(()=>e()&&clearInterval(n),1e3);e()};var et=()=>c("[data-external] a, a[data-external]").forEach(t=>f(t,A));var Mt=/\[(event_full|event_start)\]/g,Rt=new Set(["SCRIPT","STYLE","NOSCRIPT"]),nt=({title:t,start:e,zone:n})=>{let r={event_full:t,event_start:Q(e,n)},a=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,o=>(o.nodeValue??"").includes("[")&&!Rt.has(o.parentElement?.tagName??"")?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT);for(let o=a.nextNode();o;o=a.nextNode()){let s=o.nodeValue??"",i=s.replace(Mt,(l,m)=>r[m]??"");i!==s&&(o.nodeValue=i)}};var Dt=["line1","city","state","zip"],rt=()=>c("[data-map-link]").forEach(t=>{let e=t.closest(".map_fpo");if(!e)return;let n=Dt.map(r=>d(`[data-map-${r}]`,e)?.textContent?.trim()).filter(Boolean).join(", ");if(!n){t.style.display="none";return}f(t,{...A,href:`https://www.google.com/maps/search/?api=1&query=${v(n)}`})});var g={root:"data-marquee",track:"data-marquee-track",speed:"data-marquee-speed",clone:"data-marquee-clone",ready:"is-ready",defaultSpeed:70,resizeDelay:150,maxSets:50,reduced:"(prefers-reduced-motion: reduce)"},It="a, button, input, select, textarea, summary, [tabindex], [contenteditable='true']",N=window.__webflowMarqueeStore??(window.__webflowMarqueeStore={map:new WeakMap,instances:new Set}),at=t=>t.getBoundingClientRect().width,Ot=t=>d(`[${g.track}]`,t)??d(".marquee_track",t)??d(".marquee_wrap .w-dyn-items",t)??d(".w-dyn-list .w-dyn-items",t)??d(".w-dyn-items",t),Pt=t=>{let e=Number(t.getAttribute(g.speed));return Number.isFinite(e)&&e>0?e:g.defaultSpeed},kt=(t,e)=>{let n=x(t);return f(n,{[g.clone]:"","data-marquee-clone-index":e,"aria-hidden":"true"}),[n,...c("[id]",n)].forEach(r=>r.removeAttribute("id")),"inert"in n&&(n.inert=!0),n.style.pointerEvents="none",c(It,n).forEach(r=>f(r,{tabindex:"-1","aria-hidden":"true"})),n},qt=t=>Promise.all([...c("img",t).map(e=>e.complete?null:typeof e.decode=="function"?e.decode().catch(()=>{}):new Promise(n=>{for(let r of["load","error"])e.addEventListener(r,n,{once:!0})})),document.fonts?.ready.catch(()=>{})]),Ht=t=>{let e=Ot(t);if(!e)return null;let n=d(".marquee_wrap",t)??t,r=window.matchMedia?.(g.reduced),a,o,s=0,i=0,l=!1,m=!1,u=()=>[...e.children].filter(p=>!p.hasAttribute(g.clone)),E=p=>e.append(...p.map(kt)),w=p=>[e,t].forEach(M=>M.classList.toggle(g.ready,p)),b=()=>{w(!1);for(let p of["--marquee-distance","--marquee-duration"])e.style.removeProperty(p);c(`:scope > [${g.clone}]`,e).forEach(p=>p.remove())},y=()=>{if(l)return;b();let p=u(),[M]=p;if(!M)return;let V=!!r?.matches;if(t.toggleAttribute("data-marquee-reduced",V),V)return w(!0);let P=at(n);if(!P)return;E(p);let W=e.children[p.length],R=W?W.getBoundingClientRect().left-M.getBoundingClientRect().left:0;if(!(R>0))return b();for(let U=0;e.scrollWidth-R<P&&U<g.maxSets;U++)E(p);e.style.setProperty("--marquee-distance",`${R}px`),e.style.setProperty("--marquee-duration",`${R/Pt(t)}s`),i=P,w(!0)},T=()=>{l||(clearTimeout(o),o=setTimeout(()=>{cancelAnimationFrame(s),s=requestAnimationFrame(y)},g.resizeDelay))},$=()=>{if(!m)return;let p=at(n);Math.abs(p-i)<1||(i=p,T())},z={init:()=>{w(!1),qt(e).then(()=>{l||requestAnimationFrame(()=>{y(),m=!0,typeof ResizeObserver<"u"?(a=new ResizeObserver($)).observe(n):window.addEventListener("resize",$,{passive:!0}),r?.addEventListener("change",T)})})},destroy:()=>{l=!0,clearTimeout(o),cancelAnimationFrame(s),a?.disconnect(),window.removeEventListener("resize",$),r?.removeEventListener("change",T),b(),N.map.delete(t),N.instances.delete(z)}};return z},q=()=>c(`[${g.root}]`).forEach(t=>{N.map.get(t)?.destroy();let e=Ht(t);e&&(N.map.set(t,e),N.instances.add(e),e.init())}),ot=()=>[...N.instances].forEach(t=>t.destroy());var st={top:80,threshold:8},it=()=>{let t=window.Webflow?.require?.("ix3");if(!t)throw new Error("IX3 unavailable");let e=window.scrollY,n="main",r=!1,a=(s,i)=>{n!==s&&(n=s,t.emit(i))},o=()=>{let s=window.scrollY,i=s-e;s<=st.top?a("main","nav-scroll-up"):Math.abs(i)>=st.threshold&&(i>0?a("event","nav-scroll-down"):a("main","nav-scroll-up")),e=s,r=!1};window.addEventListener("scroll",()=>{r||(r=!0,requestAnimationFrame(o))},{passive:!0})};var Ft=["player","spectator"],zt=t=>{t.hidden=!1,t.style.display=""},Vt=(t,e)=>{let n=`data-pricing-${e}`,r=s=>d(`[${n}="${s}"]`,t)??d(`[${n}="${s}"]`),a=r("source");if(!a)return;let o=r("link-0")?.getAttribute("href");c("p",a).forEach((s,i)=>{let l=h=>c(`[${n}="${h}-${i+1}"]`,t),m=l("link"),u=I(s.textContent??"");if(u==="-")return m.forEach(h=>h.remove());let E=l("title"),w=l("price");if([...m,...E,...w].forEach(zt),!u)return;let b=u.indexOf(":"),y=b>-1?I(u.slice(0,b)):"",T=I(b>-1?u.slice(b+1):u),$=d("a",s)?.getAttribute("href")||o;y&&y!=="-"&&E.forEach(h=>h.textContent=y),T&&T!=="-"&&w.forEach(h=>h.textContent=T),$&&m.forEach(h=>h.setAttribute("href",$))})},ct=()=>c("[data-section-pricing]").forEach(t=>Ft.forEach(e=>Vt(t,e)));var Wt="(max-width: 479px)",Ut="player",lt=()=>c('[data-register-tabs="wrap"]').forEach(t=>{let e=c("[data-register-tab]",t),n=c("[data-register-pane]",t);if(!e.length||!n.length)return;let r=window.matchMedia(Wt),a=Ut,o=()=>{let s=(i,l,m)=>r.matches?i.setAttribute(l,String(m)):i.removeAttribute(l);e.forEach(i=>{let l=i.getAttribute("data-register-tab")===a;i.classList.toggle("is-active",l),s(i,"aria-selected",l)}),n.forEach(i=>{let l=i.getAttribute("data-register-pane")===a;i.classList.toggle("is-active",l),s(i,"aria-hidden",!l)})};e.forEach(s=>s.addEventListener("click",()=>{a=s.getAttribute("data-register-tab"),o()})),r.addEventListener("change",o),o()});var Xt=()=>{let t=new Map(c("[data-card-template]").map(e=>[e.getAttribute("data-card-template")?.trim()??"",e]));return c("[data-card-templates]").forEach(e=>e.remove()),t},dt=t=>d(":scope > ul, :scope > ol",t),H=t=>{let e=dt(t);return e?c(":scope > li",e):[]},mt=t=>{let e=dt(t);return[...t.childNodes].filter(n=>n!==e).map(D).filter(Boolean).join(" ")},jt={"data-stream-list":{template:"stream",extract:t=>{let e=H(t).map(D),n=e.length>=3;return{details:n?e.filter((r,a)=>a!==2):e,pill:n?e[2]??null:null}}},"data-stream-broadcast":{template:"broadcast",extract:t=>{let[e]=H(t),[n]=e?H(e):[];return{details:e?[mt(e)].filter(Boolean):[],pill:n?D(n):null}}}},Bt=(t,{base:e,linked:n},{details:r,pill:a})=>{let o=d("a[href]",t),s=x(o?n:e);if(s.removeAttribute("data-card-template"),s.classList.remove("hide","w-condition-invisible"),o){let u=o.getAttribute("target"),E=o.getAttribute("rel")||(u==="_blank"?"noopener noreferrer":"");f(s,{href:o.getAttribute("href")??"",...u?{target:u}:{},...E?{rel:E}:{}})}else for(let u of["href","target","rel"])s.removeAttribute(u);let i=d("[data-card-title]",s);i&&(i.textContent=mt(t));let l=d("[data-card-detail]",s);l?.replaceWith(...r.map(u=>Object.assign(x(l),{textContent:u})));let m=d("[data-card-pill]",s);return m&&(a?m.textContent=a:(m.closest("[data-card-pill-wrap]")??m).remove()),s},ut=()=>{let t,e=()=>t??(t=Xt());Object.entries(jt).forEach(([n,{template:r,extract:a}])=>c(`[${n}]`).forEach(o=>{let s=o.getAttribute(n)?.trim()||r,i=e().get(s);if(!i)return C(`missing [data-card-template="${s}"] — [${n}] left as rich text`);let l={base:i,linked:e().get(`${s}-link`)??i};c(":scope > ul, :scope > ol",o).forEach(m=>m.replaceWith(...c(":scope > li",m).map(u=>Bt(u,l,a(u)))))}))};var pt={zone:null,start:null,end:null,title:""},ft=()=>{let t=d("[data-event-start]"),e=d("[data-event-end]"),n=d("[data-event-full]"),r=O(t,e),a=_(t?.getAttribute("data-event-start"),r),o=_(e?.getAttribute("data-event-end"),r);return(t||e)&&!(a&&o)&&C("event dates missing or unreadable →",{start:t?.getAttribute("data-event-start"),end:e?.getAttribute("data-event-end"),zone:r}),{zone:r,start:a,end:o,title:n?.getAttribute("data-event-full")?.trim()||n?.textContent?.trim()||""}};var gt=t=>{let e=[];(window.Webflow||(window.Webflow=e)).push(t)};var Yt={renderLists:ut,renderPricing:ct,runCountdowns:tt,addToCalendar:K,mapLinks:rt,externalLinks:et,renderActivations:B,dragScroll:Y,registerTabs:lt,initMarquees:q,fillText:nt},F=(t,e,...n)=>{try{return e(...n)}catch(r){j(`${t} failed:`,r);return}},Et=()=>{let t=F("eventContext",ft)??pt;Object.entries(Yt).forEach(([e,n])=>F(e,n,t))};window.WebflowMarquee={init:q,destroy:ot};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Et,{once:!0}):Et();gt(()=>F("navScroll",it));})();
|
|
4
|
+
//# sourceMappingURL=theapp.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/dom.ts", "../src/lib/log.ts", "../src/features/activations.ts", "../src/features/calendar.ts", "../src/lib/memo.ts", "../src/lib/time.ts", "../src/lib/zone.ts", "../src/features/countdowns.ts", "../src/features/external-links.ts", "../src/features/fill-text.ts", "../src/features/map-links.ts", "../src/features/marquee.ts", "../src/features/nav-scroll.ts", "../src/features/pricing.ts", "../src/features/register-tabs.ts", "../src/features/render-lists.ts", "../src/lib/event-context.ts", "../src/lib/webflow.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["/* ---------- utilities ---------- */\n\nexport const $ = <E extends Element = HTMLElement>(sel: string, root: ParentNode = document) =>\n root.querySelector<E>(sel);\nexport const $$ = <E extends Element = HTMLElement>(sel: string, root: ParentNode = document) => [\n ...root.querySelectorAll<E>(sel),\n];\nexport const textOf = (node: Node) => (node.textContent ?? '').trim();\n// \\s already covers NBSP + BOM\nexport const clean = (s = '') =>\n s\n .replace(/[\\u200B-\\u200D]/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\nexport const el = (tag: string, className: string) => Object.assign(document.createElement(tag), { className });\n/** setAttribute stringifies anyway; typing it loosely keeps call sites (booleans for ARIA, numbers for indexes) terse. */\nexport const setAttrs = (node: Element, props: Record<string, string | number | boolean>) =>\n Object.entries(props).forEach(([k, v]) => node.setAttribute(k, String(v)));\nexport const enc = encodeURIComponent;\nexport const EXTERNAL = { target: '_blank', rel: 'noopener noreferrer' } as const;\n/** lib.dom types cloneNode as Node; this is the one cast in the codebase. */\nexport const clone = <T extends Node>(node: T): T => node.cloneNode(true) as T;\n", "/** Every console message from this bundle carries the same prefix — the designer guide tells people to search for it. */\nconst PREFIX = '[tour-event]';\n\nexport const warn = (message: string, ...rest: unknown[]) => console.warn(`${PREFIX} ${message}`, ...rest);\nexport const error = (message: string, ...rest: unknown[]) => console.error(`${PREFIX} ${message}`, ...rest);\n", "/* ---------- 8. on-site activations: rich text → cards, desktop drag-scroll ---------- */\n\nimport { $, $$, clone, el } from '../lib/dom';\nimport { warn } from '../lib/log';\n\nconst ACT = {\n list: 'e_what_list',\n card: 'e_what_card',\n img: 'e_what_img',\n text: 'e_what_card_text',\n trim: 'u-text-trim-off',\n};\nconst ACT_TEXT = \"h1, h2, h3, h4, h5, h6, p, em, [class*='u-text-style-']\";\n\n/** Every image in the rich text starts a card; everything until the next image is that card's text. */\nexport const renderActivations = () =>\n $$('[data-ewhat-content]').forEach((richText) => {\n if (richText.dataset.ewhatReady === 'true') return;\n let source: Element = richText; // Webflow sometimes nests all rich-text content in one extra wrapper — unwrap it\n for (\n let only = source.firstElementChild;\n only && source.children.length === 1 && $$('img', only).length > 1;\n only = source.firstElementChild\n )\n source = only;\n\n const cards: HTMLElement[] = [];\n let textWrap: HTMLElement | null = null;\n [...source.children].forEach((element) => {\n const image = element instanceof HTMLImageElement ? element : $<HTMLImageElement>('img', element);\n if (image) {\n Object.assign(image, { loading: 'lazy', decoding: 'async' });\n const img = clone(image);\n img.className = ACT.img;\n textWrap = el('div', ACT.text);\n const card = el('article', ACT.card);\n card.append(img, textWrap);\n cards.push(card);\n const rest = clone(element); // text sharing the image's wrapper is kept too\n $$('img, figure, .w-richtext-figure-type-image', rest).forEach((n) => n.remove());\n if (rest.textContent?.trim()) textWrap.append(...rest.children);\n return;\n }\n if (!textWrap) return;\n const copy = clone(element);\n [copy, ...$$(ACT_TEXT, copy)].forEach((n) => n.classList.add(ACT.trim));\n textWrap.append(copy);\n });\n\n if (!cards.length) return warn('activations: no cards detected', richText); // never wipe CMS content\n richText.replaceChildren(...cards);\n richText.classList.add(ACT.list);\n richText.dataset.ewhatReady = 'true';\n });\n\nconst DESKTOP = '(min-width: 992px)';\nconst DRAG_MIN_CARDS = 4;\n\n/** Click-and-drag horizontal scrolling for card rows that overflow (desktop only). */\nexport const dragScroll = () => {\n if (!window.matchMedia(DESKTOP).matches) return;\n $$('.e_what_scroll').forEach((area) => {\n if ($$(`.${ACT.card}`, area).length <= DRAG_MIN_CARDS) return;\n area.classList.add('is-draggable');\n let dragging = false;\n let startX = 0;\n let startLeft = 0;\n const stop = () => {\n dragging = false;\n area.classList.remove('is-dragging');\n };\n area.addEventListener('mousedown', (e) => {\n if (e.button !== 0) return;\n dragging = true;\n startX = e.pageX;\n startLeft = area.scrollLeft;\n area.classList.add('is-dragging');\n });\n area.addEventListener('mousemove', (e) => {\n if (!dragging) return;\n e.preventDefault();\n area.scrollLeft = startLeft - (e.pageX - startX);\n });\n area.addEventListener('mouseleave', stop);\n window.addEventListener('mouseup', stop);\n });\n};\n", "/* ---------- 4. add to calendar ---------- */\n\nimport { $$, EXTERNAL, enc, setAttrs } from '../lib/dom';\nimport type { EventContext } from '../lib/event-context';\n\ninterface CalendarEvent {\n title: string;\n start: Date;\n end: Date;\n}\n\nconst stamp = (date: Date) => date.toISOString().replace(/[-:]|\\.\\d{3}/g, ''); // 20260503T193000Z\nconst icsEscape = (s: string) => s.replace(/[;,]/g, '\\\\$&');\n\nexport const CALENDAR_LINKS: Record<string, (event: CalendarEvent) => Record<string, string>> = {\n 'data-gcal': ({ title, start, end }) => ({\n ...EXTERNAL,\n href: `https://calendar.google.com/calendar/render?action=TEMPLATE&text=${enc(title)}&dates=${stamp(start)}/${stamp(end)}`,\n }),\n 'data-outlook': ({ title, start, end }) => ({\n ...EXTERNAL,\n href: `https://outlook.live.com/calendar/0/deeplink/compose?path=/calendar/action/compose&rru=addevent&subject=${enc(title)}&startdt=${enc(start.toISOString())}&enddt=${enc(end.toISOString())}`,\n }),\n 'data-apple': ({ title, start, end }) => ({\n download: `${title}.ics`,\n href: `data:text/calendar;charset=utf8,${enc(\n [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//APP//Event Calendar//EN',\n 'BEGIN:VEVENT',\n `UID:${Date.now()}@theapp.global`,\n `DTSTAMP:${stamp(new Date())}`,\n `DTSTART:${stamp(start)}`,\n `DTEND:${stamp(end)}`,\n `SUMMARY:${icsEscape(title)}`,\n 'END:VEVENT',\n 'END:VCALENDAR',\n ].join('\\r\\n'),\n )}`,\n }),\n};\n\nexport const addToCalendar = ({ title, start, end }: EventContext) => {\n if (!title || !start) return;\n const event: CalendarEvent = { title, start, end: end ?? new Date(+start + 2 * 3600e3) }; // no end → 2h\n Object.entries(CALENDAR_LINKS).forEach(([hook, build]) => {\n const nodes = $$(`[${hook}]`);\n if (nodes.length) {\n const props = build(event);\n nodes.forEach((node) => setAttrs(node, props));\n }\n });\n};\n", "export const memo = <K, V>(fn: (key: K) => V, cache = new Map<K, V>()) => {\n return (key: K): V => {\n const hit = cache.get(key);\n if (hit !== undefined) return hit;\n const value = fn(key);\n cache.set(key, value);\n return value;\n };\n};\n", "/* ---------- time: one parser for every feature (DOM-free) ---------- */\n\nimport { memo } from './memo';\n\nconst US_ZONES: Record<string, string> = {\n P: 'America/Los_Angeles',\n M: 'America/Denver',\n C: 'America/Chicago',\n E: 'America/New_York',\n AK: 'America/Anchorage',\n HI: 'Pacific/Honolulu',\n};\n// \"2026-05-03\", \"2026-5-3 7:30 pm\", \"2026-05-03T19:30:00\" — am/pm → 12h, otherwise 24h, no time → midnight\nconst DATE_RE = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:(?:\\s+|T)(\\d{1,2})(?::(\\d{2}))?(?::(\\d{2}))?\\s*(am|pm)?)?$/i;\n\n/** \"PT\" | \"EDT\" | \"AK\" … → IANA; anything unrecognised is passed through as IANA. */\nexport const toIana = (key: string) => US_ZONES[key.toUpperCase().replace(/^([PMCE])[SD]?T$/, '$1')] ?? key;\n\nconst zoneFormatter = memo(\n (timeZone: string) =>\n new Intl.DateTimeFormat('en-US', {\n timeZone,\n hourCycle: 'h23', // hour12:false can yield \"24\", and hour12 silently overrides hourCycle\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n }),\n);\n\n/** Offset (ms) between wall-clock time in `timeZone` and UTC at the given instant. */\nexport const zoneOffset = (utcMs: number, timeZone: string) => {\n const parts = zoneFormatter(timeZone).formatToParts(new Date(utcMs));\n const z: Partial<Record<Intl.DateTimeFormatPartTypes, number>> = Object.fromEntries(\n parts.map(({ type, value }) => [type, +value]),\n );\n const { year = NaN, month = NaN, day = NaN, hour = NaN, minute = NaN, second = NaN } = z;\n return Date.UTC(year, month - 1, day, hour, minute, second) - utcMs;\n};\n\ntype WallClock = [y: number, m0: number, d: number, h: number, min: number, s: number];\n\n/** Wall-clock parts from DATE_RE, or from anything the browser can read (Webflow's \"June 9, 2026 6:00 PM\"). */\nconst wallClock = (raw: string): WallClock | null => {\n const m = raw.match(DATE_RE);\n if (m) {\n const [, y = '', mo = '', d = '', h = '0', min = '0', s = '0', ampm] = m;\n return [+y, +mo - 1, +d, ampm ? (+h % 12) + (/pm/i.test(ampm) ? 12 : 0) : +h, +min, +s];\n }\n const d = new Date(raw);\n return Number.isNaN(d.getTime())\n ? null\n : [d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds()];\n};\nconst HAS_OFFSET = /(Z|[+-]\\d{2}:?\\d{2})$/i; // \"…T18:00:00Z\" / \"…-07:00\" already name an instant — no zone shifting\n\n/** Reads a wall-clock string in `timeZone` (null = browser-local) and returns the real instant, DST-safe. */\nexport const parseZoned = (raw: string | null | undefined, timeZone: string | null): Date | null => {\n const text = (raw ?? '').trim();\n if (!text) return null;\n if (HAS_OFFSET.test(text)) {\n const d = new Date(text);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n const parts = wallClock(text);\n if (!parts) return null;\n if (!timeZone) return new Date(...parts);\n const guess = Date.UTC(...parts);\n return new Date(guess - zoneOffset(guess - zoneOffset(guess, timeZone), timeZone)); // 2nd pass settles DST edges\n};\n\nexport const formatZoned = (date: Date | null, timeZone: string | null) =>\n date\n ? new Intl.DateTimeFormat('en-US', {\n timeZone: timeZone || undefined,\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }).format(date)\n : '';\n", "import { $ } from './dom';\nimport { toIana } from './time';\n\n/** data-tz on/above any of `nodes` wins, then the page's [data-date-timezone], then PT. \"client\" → browser-local. */\nexport const resolveZone = (...nodes: Array<Element | null | undefined>): string | null => {\n const tzEl = $('[data-date-timezone]');\n const key =\n nodes.map((n) => n?.closest('[data-tz]')?.getAttribute('data-tz')?.trim()).find(Boolean) ||\n tzEl?.getAttribute('data-date-timezone')?.trim() ||\n tzEl?.textContent?.trim() ||\n 'PT';\n return key === 'client' ? null : toIana(key);\n};\n", "/* ---------- 3. countdowns ---------- */\n\nimport { $, $$ } from '../lib/dom';\nimport { parseZoned } from '../lib/time';\nimport { resolveZone } from '../lib/zone';\n\nconst COUNTDOWN_SOURCES: Record<string, string> = {\n 'event-start': 'data-event-start',\n 'event-end': 'data-event-end',\n 'registration-start': 'data-registration-start',\n 'registration-end': 'data-registration-end',\n};\nconst UNITS = [\n ['data-days', 86400],\n ['data-hours', 3600],\n ['data-minutes', 60],\n ['data-seconds', 1],\n] as const;\nconst pad2 = (n: number) => String(n).padStart(2, '0');\n\ninterface Timer {\n deadline: number;\n cells: Array<[HTMLElement | null, number]>;\n}\n\n/** data-countdown=\"event-start\" (alias) or any \"data-*\" attribute; holder is looked up in scope, then page. */\nexport const countdownDeadline = (widget: Element) => {\n const name = widget.getAttribute('data-countdown')?.trim() ?? '';\n const source = COUNTDOWN_SOURCES[name] ?? name;\n if (!source.startsWith('data-')) return null;\n const scope = widget.closest('[data-countdown-scope]') ?? document;\n const holder = widget.hasAttribute(source) ? widget : ($(`[${source}]`, scope) ?? $(`[${source}]`));\n return holder && parseZoned(holder.getAttribute(source), resolveZone(widget, holder))?.getTime();\n};\n\nexport const runCountdowns = () => {\n const timers = $$('[data-countdown]')\n .map((widget) => ({\n deadline: countdownDeadline(widget),\n cells: UNITS.map(([hook, secs]): [HTMLElement | null, number] => [$(`[${hook}]`, widget), secs]),\n }))\n .filter((t): t is Timer => !!t.deadline);\n if (!timers.length) return;\n\n const tick = () => {\n const now = Date.now();\n timers.forEach(({ deadline, cells }) => {\n let left = Math.max(0, Math.floor((deadline - now) / 1000));\n cells.forEach(([cell, secs]) => {\n if (cell) cell.textContent = pad2(Math.floor(left / secs));\n left %= secs;\n });\n });\n return timers.every((t) => t.deadline <= now);\n };\n const iv = setInterval(() => tick() && clearInterval(iv), 1000);\n tick();\n};\n", "/* ---------- 7. external links → new tab ---------- */\n\nimport { $$, EXTERNAL, setAttrs } from '../lib/dom';\n\nexport const externalLinks = () => $$('[data-external] a, a[data-external]').forEach((a) => setAttrs(a, EXTERNAL));\n", "/* ---------- 5. placeholder text fill ---------- */\n\nimport type { EventContext } from '../lib/event-context';\nimport { formatZoned } from '../lib/time';\n\nconst TOKEN_RE = /\\[(event_full|event_start)\\]/g;\nconst SKIP_TAGS = new Set(['SCRIPT', 'STYLE', 'NOSCRIPT']);\n\nexport const fillText = ({ title, start, zone }: EventContext) => {\n const values: Record<string, string> = { event_full: title, event_start: formatZoned(start, zone) };\n\n // TreeWalker visits only text nodes that can contain a token — no recursion, no element visits.\n const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, (node) =>\n (node.nodeValue ?? '').includes('[') && !SKIP_TAGS.has(node.parentElement?.tagName ?? '')\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_REJECT,\n );\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n const text = node.nodeValue ?? '';\n const next = text.replace(TOKEN_RE, (_, key: string) => values[key] ?? '');\n if (next !== text) node.nodeValue = next;\n }\n};\n", "/* ---------- 6. venue map link ---------- */\n\nimport { $, $$, EXTERNAL, enc, setAttrs } from '../lib/dom';\n\nconst MAP_PARTS = ['line1', 'city', 'state', 'zip'];\n\n/** [data-map-link] inside .map_fpo → Google Maps search for the [data-map-*] lines; no address → link hidden. */\nexport const mapLinks = () =>\n $$('[data-map-link]').forEach((link) => {\n const wrap = link.closest('.map_fpo');\n if (!wrap) return;\n const address = MAP_PARTS.map((part) => $(`[data-map-${part}]`, wrap)?.textContent?.trim())\n .filter(Boolean)\n .join(', ');\n if (!address) {\n link.style.display = 'none';\n return;\n }\n setAttrs(link, { ...EXTERNAL, href: `https://www.google.com/maps/search/?api=1&query=${enc(address)}` });\n });\n", "/* ---------- 10. marquee (infinite scroller) ----------\n * [data-marquee] root › track = [data-marquee-track] (fallbacks: .marquee_track, .w-dyn-items) › items.\n * Items are cloned until the track overflows the viewport (.marquee_wrap or the root); the CSS animation\n * reads --marquee-distance / --marquee-duration off the track. data-marquee-speed = px per second (default 70).\n * Reduced motion → no clones, just .is-ready. Re-runnable: window.WebflowMarquee.init() / .destroy().\n */\n\nimport { $, $$, clone, setAttrs } from '../lib/dom';\n\nconst MARQUEE = {\n root: 'data-marquee',\n track: 'data-marquee-track',\n speed: 'data-marquee-speed',\n clone: 'data-marquee-clone',\n ready: 'is-ready',\n defaultSpeed: 70,\n resizeDelay: 150,\n maxSets: 50,\n reduced: '(prefers-reduced-motion: reduce)',\n};\nconst FOCUSABLE = \"a, button, input, select, textarea, summary, [tabindex], [contenteditable='true']\";\nconst store: MarqueeStore = (window.__webflowMarqueeStore ??= { map: new WeakMap(), instances: new Set() }); // survives re-injection\n\nconst widthOf = (node: Element) => node.getBoundingClientRect().width;\nconst marqueeTrack = (root: HTMLElement) =>\n $(`[${MARQUEE.track}]`, root) ??\n $('.marquee_track', root) ??\n $('.marquee_wrap .w-dyn-items', root) ??\n $('.w-dyn-list .w-dyn-items', root) ??\n $('.w-dyn-items', root);\nconst marqueeSpeed = (root: HTMLElement) => {\n const v = Number(root.getAttribute(MARQUEE.speed));\n return Number.isFinite(v) && v > 0 ? v : MARQUEE.defaultSpeed;\n};\n\n/** Deep clone that screen readers, keyboards and pointers all ignore. */\nconst makeClone = (item: HTMLElement, index: number) => {\n const copy = clone(item);\n setAttrs(copy, { [MARQUEE.clone]: '', 'data-marquee-clone-index': index, 'aria-hidden': 'true' });\n [copy, ...$$('[id]', copy)].forEach((n) => n.removeAttribute('id'));\n if ('inert' in copy) copy.inert = true;\n copy.style.pointerEvents = 'none';\n $$(FOCUSABLE, copy).forEach((n) => setAttrs(n, { tabindex: '-1', 'aria-hidden': 'true' }));\n return copy;\n};\n\n/** Resolves once every image in `track` has loaded (or failed) and web fonts are ready — measurements are stable then. */\nconst settled = (track: HTMLElement) =>\n Promise.all([\n ...$$<HTMLImageElement>('img', track).map((img) =>\n img.complete\n ? null\n : typeof img.decode === 'function'\n ? img.decode().catch(() => {})\n : new Promise((done) => {\n for (const ev of ['load', 'error']) img.addEventListener(ev, done, { once: true });\n }),\n ),\n document.fonts?.ready.catch(() => {}),\n ]);\n\nconst createMarquee = (root: HTMLElement): MarqueeInstance | null => {\n const track = marqueeTrack(root);\n if (!track) return null;\n const viewport = $('.marquee_wrap', root) ?? root;\n const motion = window.matchMedia?.(MARQUEE.reduced);\n let observer: ResizeObserver | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let raf = 0;\n let lastWidth = 0;\n let destroyed = false;\n let ready = false;\n\n const originals = () => [...track.children].filter((n): n is HTMLElement => !n.hasAttribute(MARQUEE.clone));\n const addClones = (items: HTMLElement[]) => track.append(...items.map(makeClone));\n const mark = (on: boolean) => [track, root].forEach((n) => n.classList.toggle(MARQUEE.ready, on));\n const reset = () => {\n mark(false);\n for (const p of ['--marquee-distance', '--marquee-duration']) track.style.removeProperty(p);\n $$(`:scope > [${MARQUEE.clone}]`, track).forEach((n) => n.remove());\n };\n\n const setup = () => {\n if (destroyed) return;\n reset();\n const items = originals();\n const [first] = items;\n if (!first) return;\n const reduced = !!motion?.matches;\n root.toggleAttribute('data-marquee-reduced', reduced);\n if (reduced) return mark(true);\n const viewportWidth = widthOf(viewport);\n if (!viewportWidth) return;\n addClones(items);\n const firstClone = track.children[items.length];\n const distance = firstClone ? firstClone.getBoundingClientRect().left - first.getBoundingClientRect().left : 0;\n if (!(distance > 0)) return reset();\n for (let sets = 0; track.scrollWidth - distance < viewportWidth && sets < MARQUEE.maxSets; sets++) addClones(items);\n track.style.setProperty('--marquee-distance', `${distance}px`);\n track.style.setProperty('--marquee-duration', `${distance / marqueeSpeed(root)}s`);\n lastWidth = viewportWidth;\n mark(true);\n };\n\n const schedule = () => {\n if (destroyed) return;\n clearTimeout(timer);\n timer = setTimeout(() => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(setup);\n }, MARQUEE.resizeDelay);\n };\n const onResize = () => {\n if (!ready) return;\n const w = widthOf(viewport);\n if (Math.abs(w - lastWidth) < 1) return;\n lastWidth = w;\n schedule();\n };\n\n const init = () => {\n mark(false);\n settled(track).then(() => {\n if (destroyed) return;\n requestAnimationFrame(() => {\n setup();\n ready = true;\n if (typeof ResizeObserver !== 'undefined') (observer = new ResizeObserver(onResize)).observe(viewport);\n else window.addEventListener('resize', onResize, { passive: true });\n motion?.addEventListener('change', schedule);\n });\n });\n };\n const destroy = () => {\n destroyed = true;\n clearTimeout(timer);\n cancelAnimationFrame(raf);\n observer?.disconnect();\n window.removeEventListener('resize', onResize);\n motion?.removeEventListener('change', schedule);\n reset();\n store.map.delete(root);\n store.instances.delete(instance);\n };\n const instance: MarqueeInstance = { init, destroy };\n return instance;\n};\n\nexport const initMarquees = () =>\n $$(`[${MARQUEE.root}]`).forEach((root) => {\n store.map.get(root)?.destroy();\n const instance = createMarquee(root);\n if (!instance) return;\n store.map.set(root, instance);\n store.instances.add(instance);\n instance.init();\n });\nexport const destroyMarquees = () => [...store.instances].forEach((instance) => instance.destroy());\n", "/* ---------- 11. nav scroll (Webflow IX3) ---------- */\n\nconst NAV = { top: 80, threshold: 8 }; // px: \"near top\" always shows main nav; min scroll delta to count as a direction\n\n/** Scrolling down past the top → \"nav-scroll-down\" (event nav); scrolling up or near the top → \"nav-scroll-up\" (main nav). */\nexport const navScroll = () => {\n const ix = window.Webflow?.require?.('ix3');\n if (!ix) throw new Error('IX3 unavailable'); // same outcome as before: logged by run(), no events\n let prev = window.scrollY;\n let state = 'main';\n let ticking = false;\n const set = (next: string, event: string) => {\n if (state !== next) {\n state = next;\n ix.emit(event);\n }\n };\n const update = () => {\n const y = window.scrollY;\n const delta = y - prev;\n if (y <= NAV.top) set('main', 'nav-scroll-up');\n else if (Math.abs(delta) >= NAV.threshold) {\n if (delta > 0) set('event', 'nav-scroll-down');\n else set('main', 'nav-scroll-up');\n }\n prev = y;\n ticking = false;\n };\n window.addEventListener(\n 'scroll',\n () => {\n if (!ticking) {\n ticking = true;\n requestAnimationFrame(update);\n }\n },\n { passive: true },\n );\n};\n", "/* ---------- 2. pricing rich text → targets ---------- */\n\nimport { $, $$, clean } from '../lib/dom';\n\nconst PRICING_TYPES = ['player', 'spectator'];\nconst show = (node: HTMLElement) => {\n node.hidden = false;\n node.style.display = '';\n};\n\nconst renderPricingType = (section: HTMLElement, type: string) => {\n const hook = `data-pricing-${type}`;\n const find = (key: string) => $(`[${hook}=\"${key}\"]`, section) ?? $(`[${hook}=\"${key}\"]`); // section first, then page\n const source = find('source');\n if (!source) return;\n const fallbackHref = find('link-0')?.getAttribute('href');\n\n $$('p', source).forEach((p, i) => {\n const targets = (key: string) => $$(`[${hook}=\"${key}-${i + 1}\"]`, section);\n const links = targets('link');\n const line = clean(p.textContent ?? '');\n\n if (line === '-') return links.forEach((node) => node.remove()); // \"-\" removes the whole item\n const titles = targets('title');\n const prices = targets('price');\n [...links, ...titles, ...prices].forEach(show);\n if (!line) return; // empty line keeps the designed item as-is\n\n const sep = line.indexOf(':');\n const title = sep > -1 ? clean(line.slice(0, sep)) : '';\n const price = clean(sep > -1 ? line.slice(sep + 1) : line);\n const href = $('a', p)?.getAttribute('href') || fallbackHref;\n\n if (title && title !== '-') titles.forEach((node) => (node.textContent = title));\n if (price && price !== '-') prices.forEach((node) => (node.textContent = price));\n if (href) links.forEach((node) => node.setAttribute('href', href));\n });\n};\n\nexport const renderPricing = () =>\n $$('[data-section-pricing]').forEach((section) => PRICING_TYPES.forEach((type) => renderPricingType(section, type)));\n", "/* ---------- 9. register tabs (mobile — breakpoint CSS lives in styles/register-tabs.css → dist/theapp.css) ---------- */\n\nimport { $$ } from '../lib/dom';\n\nexport const REGISTER_MOBILE = '(max-width: 479px)'; // must match the media query in styles/register-tabs.css\nconst REGISTER_DEFAULT = 'player';\n\n/** Bound at every width so a resize into mobile never lands on \"all panes hidden\"; ARIA only reflects tab mode. */\nexport const registerTabs = () =>\n $$('[data-register-tabs=\"wrap\"]').forEach((wrap) => {\n const tabs = $$('[data-register-tab]', wrap);\n const panes = $$('[data-register-pane]', wrap);\n if (!tabs.length || !panes.length) return;\n const mq = window.matchMedia(REGISTER_MOBILE);\n let current: string | null = REGISTER_DEFAULT;\n\n const apply = () => {\n const aria = (node: Element, name: string, value: boolean) =>\n mq.matches ? node.setAttribute(name, String(value)) : node.removeAttribute(name);\n tabs.forEach((tab) => {\n const on = tab.getAttribute('data-register-tab') === current;\n tab.classList.toggle('is-active', on);\n aria(tab, 'aria-selected', on);\n });\n panes.forEach((pane) => {\n const on = pane.getAttribute('data-register-pane') === current;\n pane.classList.toggle('is-active', on);\n aria(pane, 'aria-hidden', !on);\n });\n };\n tabs.forEach((tab) =>\n tab.addEventListener('click', () => {\n current = tab.getAttribute('data-register-tab');\n apply();\n }),\n );\n mq.addEventListener('change', apply);\n apply();\n });\n", "/* ---------- 1. rich-text list → cards (cloned from Webflow-styled templates) ----------\n *\n * Designer contract — one hidden wrapper anywhere on the page:\n *\n * [data-card-templates] div, display:none in Webflow — removed at boot\n * [data-card-template=\"stream\"] default stream card (Div — never carries a link)\n * [data-card-template=\"stream-link\"] its link variant (Link Block, arrow built in)\n * [data-card-template=\"broadcast\"] default broadcast card\n * [data-card-template=\"broadcast-link\"] its link variant\n *\n * Variant choice is per item: a bullet with a rich-text <a> clones the \"-link\" template and\n * copies its href/target/rel (rel gains noopener noreferrer for _blank); otherwise the default\n * is cloned. A missing \"-link\" template falls back to the default. Build the link variant as\n * the SAME base class + a combo (duplicate the card, add the combo) so styling stays\n * single-source and only the structural delta (the arrow) is duplicated.\n *\n * Per-field looks: the hook attribute's VALUE names a different template set for that field\n * alone — data-stream-broadcast=\"linear\" clones \"linear\"/\"linear-link\". Same grammar, new look.\n * An empty value uses the layout's default templates.\n *\n * Slots inside each template (nesting/position is free — structure is 100% Webflow's).\n * Put slot attributes on the innermost TEXT elements — a fill replaces the element's content:\n * [data-card-title] receives the bullet's main text\n * [data-card-detail] ONE prototype line — cloned once per detail, removed when there are none\n * [data-card-pill] removed when the item has no pill — its closest\n * [data-card-pill-wrap] ancestor (e.g. a styled badge) goes with it\n *\n * Missing default template → the rich text is left rendered as-is and a warning is logged.\n */\n\nimport { $, $$, clone, setAttrs, textOf } from '../lib/dom';\nimport { warn } from '../lib/log';\n\ninterface CardData {\n details: string[];\n pill: string | null;\n}\ninterface Layout {\n template: string;\n extract(li: Element): CardData;\n}\ninterface Variants {\n base: Element;\n linked: Element;\n}\n\n/** Prototypes leave the DOM with their hidden wrapper. */\nconst collectTemplates = () => {\n const map = new Map($$('[data-card-template]').map((n) => [n.getAttribute('data-card-template')?.trim() ?? '', n]));\n $$('[data-card-templates]').forEach((wrap) => wrap.remove());\n return map;\n};\n\nconst childList = (li: Element) => $(':scope > ul, :scope > ol', li);\nconst childItems = (li: Element) => {\n const list = childList(li);\n return list ? $$(':scope > li', list) : [];\n};\n/** Text of an <li> minus its nested list. */\nexport const ownText = (li: Element) => {\n const nested = childList(li);\n return [...li.childNodes]\n .filter((n) => n !== nested)\n .map(textOf)\n .filter(Boolean)\n .join(' ');\n};\n\n/** Layout strategies — which template each hook clones and how nested bullets fill its slots. */\nconst LAYOUTS: Record<'data-stream-list' | 'data-stream-broadcast', Layout> = {\n // Bullet 3 (if present) becomes the pill; the rest are detail lines.\n 'data-stream-list': {\n template: 'stream',\n extract: (li) => {\n const subs = childItems(li).map(textOf);\n const hasPill = subs.length >= 3;\n return { details: hasPill ? subs.filter((_, i) => i !== 2) : subs, pill: hasPill ? (subs[2] ?? null) : null };\n },\n },\n // First bullet is the detail line; its first sub-bullet becomes the pill.\n 'data-stream-broadcast': {\n template: 'broadcast',\n extract: (li) => {\n const [sub] = childItems(li);\n const [pillItem] = sub ? childItems(sub) : [];\n return { details: sub ? [ownText(sub)].filter(Boolean) : [], pill: pillItem ? textOf(pillItem) : null };\n },\n },\n};\n\nconst buildCard = (li: Element, { base, linked }: Variants, { details, pill }: CardData) => {\n const link = $<HTMLAnchorElement>('a[href]', li);\n const card = clone(link ? linked : base); // variant = which template gets cloned\n card.removeAttribute('data-card-template');\n card.classList.remove('hide', 'w-condition-invisible'); // belt-and-braces if the template itself was hidden\n\n if (link) {\n const target = link.getAttribute('target');\n const rel = link.getAttribute('rel') || (target === '_blank' ? 'noopener noreferrer' : '');\n setAttrs(card, { href: link.getAttribute('href') ?? '', ...(target ? { target } : {}), ...(rel ? { rel } : {}) });\n } else {\n for (const name of ['href', 'target', 'rel']) card.removeAttribute(name); // no-op when the default is a Div\n }\n\n const title = $('[data-card-title]', card);\n if (title) title.textContent = ownText(li);\n\n const detailProto = $('[data-card-detail]', card);\n detailProto?.replaceWith(...details.map((t) => Object.assign(clone(detailProto), { textContent: t })));\n\n const pillSlot = $('[data-card-pill]', card);\n if (pillSlot) {\n if (pill) pillSlot.textContent = pill;\n else (pillSlot.closest('[data-card-pill-wrap]') ?? pillSlot).remove();\n }\n\n return card;\n};\n\nexport const renderLists = () => {\n let cache: Map<string, HTMLElement> | undefined;\n const templates = () => (cache ??= collectTemplates());\n Object.entries(LAYOUTS).forEach(([hook, { template: fallback, extract }]) =>\n $$(`[${hook}]`).forEach((root) => {\n const name = root.getAttribute(hook)?.trim() || fallback; // hook VALUE picks this field's template set\n const base = templates().get(name);\n if (!base) return warn(`missing [data-card-template=\"${name}\"] — [${hook}] left as rich text`);\n const variants: Variants = { base, linked: templates().get(`${name}-link`) ?? base }; // no link variant → default serves both\n $$(':scope > ul, :scope > ol', root).forEach(\n (list) => list.replaceWith(...$$(':scope > li', list).map((li) => buildCard(li, variants, extract(li)))), // one mutation per list\n );\n }),\n );\n};\n", "import { $ } from './dom';\nimport { warn } from './log';\nimport { parseZoned } from './time';\nimport { resolveZone } from './zone';\n\nexport interface EventContext {\n zone: string | null;\n start: Date | null;\n end: Date | null;\n title: string;\n}\n\n/** What every feature receives when the context itself failed — behaves exactly like an empty page. */\nexport const EMPTY_CONTEXT: EventContext = { zone: null, start: null, end: null, title: '' };\n\n/** The one event on the page — parsed once, shared by every feature. Dates are read from whichever element carries them. */\nexport const eventContext = (): EventContext => {\n const startEl = $('[data-event-start]');\n const endEl = $('[data-event-end]');\n const titleEl = $('[data-event-full]');\n const zone = resolveZone(startEl, endEl);\n const start = parseZoned(startEl?.getAttribute('data-event-start'), zone);\n const end = parseZoned(endEl?.getAttribute('data-event-end'), zone);\n if ((startEl || endEl) && !(start && end))\n // loud, not silent: countdowns, calendar links and [event_start] all depend on these\n warn('event dates missing or unreadable →', {\n start: startEl?.getAttribute('data-event-start'),\n end: endEl?.getAttribute('data-event-end'),\n zone,\n });\n return {\n zone,\n start,\n end,\n title: titleEl?.getAttribute('data-event-full')?.trim() || titleEl?.textContent?.trim() || '',\n };\n};\n", "/** Runs `fn` once webflow.js has initialised (IX3 etc.). Before webflow.js loads, `window.Webflow` is the queue it drains. */\nexport const onWebflowReady = (fn: () => void) => {\n const queue: Array<() => void> = [];\n (window.Webflow ||= queue).push(fn);\n};\n", "/**\n * theapp.global — Webflow custom code (served from jsDelivr as dist/theapp.js + dist/theapp.css)\n * ------------------------------------------------------------------\n * Every feature is an independent, idempotent pass over data-* hooks and runs in isolation:\n * a throw in one can't take the others down. Only navScroll depends on webflow.js (IX3).\n *\n * renderLists [data-stream-list] / [data-stream-broadcast] rich text → cloned [data-card-template] cards\n * renderPricing [data-section-pricing] + [data-pricing-{type}] rich text → title / price / link targets\n * runCountdowns [data-countdown] + [data-days|hours|minutes|seconds]\n * addToCalendar [data-gcal] [data-outlook] [data-apple] → deep links / .ics\n * mapLinks [data-map-link] + [data-map-line1|city|state|zip] → Google Maps search URL\n * externalLinks [data-external] a, a[data-external] → new tab\n * renderActivations [data-ewhat-content] rich text → .e_what_card articles (+ dragScroll on desktop)\n * registerTabs [data-register-tabs=\"wrap\"] + [data-register-tab|pane] → mobile tab switching\n * initMarquees [data-marquee] → infinite scroller; window.WebflowMarquee { init, destroy }\n * navScroll scroll direction → IX3 events \"nav-scroll-up\" / \"nav-scroll-down\"\n * fillText [event_full] [event_start] tokens → CMS values (runs last)\n *\n * Shared inputs, read from whichever elements carry them (one hidden \"event data\" div is ideal):\n * [data-event-start] [data-event-end] [data-event-full] [data-date-timezone], optional data-tz.\n */\n\nimport './styles/register-tabs.css';\nimport { dragScroll, renderActivations } from './features/activations';\nimport { addToCalendar } from './features/calendar';\nimport { runCountdowns } from './features/countdowns';\nimport { externalLinks } from './features/external-links';\nimport { fillText } from './features/fill-text';\nimport { mapLinks } from './features/map-links';\nimport { destroyMarquees, initMarquees } from './features/marquee';\nimport { navScroll } from './features/nav-scroll';\nimport { renderPricing } from './features/pricing';\nimport { registerTabs } from './features/register-tabs';\nimport { renderLists } from './features/render-lists';\nimport { EMPTY_CONTEXT, type EventContext, eventContext } from './lib/event-context';\nimport { error } from './lib/log';\nimport { onWebflowReady } from './lib/webflow';\n\ntype Feature = (ctx: EventContext) => void;\n\n/* ---------- boot ---------- */\n\n// Object, not array: the keys are string literals, so feature names survive minification in error logs.\n// Insertion order is preserved for non-integer keys — fillText stays last.\nexport const FEATURES: Record<string, Feature> = {\n renderLists,\n renderPricing,\n runCountdowns,\n addToCalendar,\n mapLinks,\n externalLinks,\n renderActivations,\n dragScroll,\n registerTabs,\n initMarquees,\n fillText, // last: tokens inside anything rendered above get filled too\n};\n\n// Each step runs in isolation: a throw in one can't take the others down.\nconst run = <A extends unknown[], R>(name: string, fn: (...args: A) => R, ...args: A): R | undefined => {\n try {\n return fn(...args);\n } catch (err) {\n error(`${name} failed:`, err);\n return undefined;\n }\n};\nconst init = () => {\n const ctx = run('eventContext', eventContext) ?? EMPTY_CONTEXT;\n Object.entries(FEATURES).forEach(([name, fn]) => run(name, fn, ctx));\n};\n\nwindow.WebflowMarquee = { init: initMarquees, destroy: destroyMarquees };\nif (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init, { once: true });\nelse init();\nonWebflowReady(() => run('navScroll', navScroll)); // needs webflow.js + IX3, so it boots through Webflow's queue, not ours\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["$", "sel", "root", "$$", "textOf", "node", "clean", "s", "el", "tag", "className", "setAttrs", "props", "k", "v", "enc", "EXTERNAL", "clone", "PREFIX", "warn", "message", "rest", "error", "ACT", "ACT_TEXT", "renderActivations", "$$", "richText", "source", "only", "cards", "textWrap", "element", "image", "$", "img", "clone", "el", "card", "rest", "n", "copy", "warn", "DESKTOP", "DRAG_MIN_CARDS", "dragScroll", "area", "dragging", "startX", "startLeft", "stop", "e", "stamp", "date", "icsEscape", "s", "CALENDAR_LINKS", "title", "start", "end", "EXTERNAL", "enc", "addToCalendar", "event", "hook", "build", "nodes", "$$", "props", "node", "setAttrs", "memo", "fn", "cache", "key", "hit", "value", "US_ZONES", "DATE_RE", "toIana", "key", "zoneFormatter", "memo", "timeZone", "zoneOffset", "utcMs", "parts", "z", "type", "value", "year", "month", "day", "hour", "minute", "second", "wallClock", "raw", "m", "y", "mo", "d", "h", "min", "s", "ampm", "HAS_OFFSET", "parseZoned", "text", "guess", "formatZoned", "date", "resolveZone", "nodes", "tzEl", "$", "key", "n", "toIana", "COUNTDOWN_SOURCES", "UNITS", "pad2", "n", "countdownDeadline", "widget", "name", "source", "scope", "holder", "$", "parseZoned", "resolveZone", "runCountdowns", "timers", "$$", "hook", "secs", "t", "tick", "now", "deadline", "cells", "left", "cell", "iv", "externalLinks", "$$", "a", "setAttrs", "EXTERNAL", "TOKEN_RE", "SKIP_TAGS", "fillText", "title", "start", "zone", "values", "formatZoned", "walker", "node", "text", "next", "_", "key", "MAP_PARTS", "mapLinks", "$$", "link", "wrap", "address", "part", "$", "setAttrs", "EXTERNAL", "enc", "MARQUEE", "FOCUSABLE", "store", "widthOf", "node", "marqueeTrack", "root", "$", "marqueeSpeed", "v", "makeClone", "item", "index", "copy", "clone", "setAttrs", "$$", "n", "settled", "track", "img", "done", "ev", "createMarquee", "viewport", "motion", "observer", "timer", "raf", "lastWidth", "destroyed", "ready", "originals", "addClones", "items", "mark", "on", "reset", "setup", "first", "reduced", "viewportWidth", "firstClone", "distance", "sets", "schedule", "onResize", "w", "instance", "initMarquees", "destroyMarquees", "NAV", "navScroll", "ix", "prev", "state", "ticking", "set", "next", "event", "update", "y", "delta", "PRICING_TYPES", "show", "node", "renderPricingType", "section", "type", "hook", "find", "key", "$", "source", "fallbackHref", "$$", "p", "targets", "links", "line", "clean", "titles", "prices", "sep", "title", "price", "href", "renderPricing", "REGISTER_MOBILE", "REGISTER_DEFAULT", "registerTabs", "$$", "wrap", "tabs", "panes", "mq", "current", "apply", "aria", "node", "name", "value", "tab", "on", "pane", "collectTemplates", "map", "$$", "n", "wrap", "childList", "li", "$", "childItems", "list", "ownText", "nested", "textOf", "LAYOUTS", "subs", "hasPill", "_", "i", "sub", "pillItem", "buildCard", "base", "linked", "details", "pill", "link", "card", "clone", "target", "rel", "setAttrs", "name", "title", "detailProto", "t", "pillSlot", "renderLists", "cache", "templates", "hook", "fallback", "extract", "root", "warn", "variants", "EMPTY_CONTEXT", "eventContext", "startEl", "$", "endEl", "titleEl", "zone", "resolveZone", "start", "parseZoned", "end", "warn", "onWebflowReady", "fn", "queue", "FEATURES", "renderLists", "renderPricing", "runCountdowns", "addToCalendar", "mapLinks", "externalLinks", "renderActivations", "dragScroll", "registerTabs", "initMarquees", "fillText", "run", "name", "fn", "args", "err", "error", "init", "ctx", "eventContext", "EMPTY_CONTEXT", "destroyMarquees", "onWebflowReady", "navScroll"]
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@theappglobal/webflow",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Custom code for theapp.global (Webflow) — Tour Event template scripts, served from jsDelivr",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"private": false,
|
|
7
|
+
"type": "module",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/milesroxas/theapp-webflow.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/milesroxas/theapp-webflow#readme",
|
|
13
|
+
"jsdelivr": "dist/theapp.js",
|
|
14
|
+
"unpkg": "dist/theapp.js",
|
|
15
|
+
"exports": {
|
|
16
|
+
"./dist/*": "./dist/*",
|
|
17
|
+
"./package.json": "./package.json"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist/theapp.js",
|
|
21
|
+
"dist/theapp.js.map",
|
|
22
|
+
"dist/theapp.css",
|
|
23
|
+
"dist/theapp.css.map",
|
|
24
|
+
"README.md",
|
|
25
|
+
"LICENSE"
|
|
26
|
+
],
|
|
27
|
+
"sideEffects": true,
|
|
28
|
+
"scripts": {
|
|
29
|
+
"dev": "node bin/build.mjs --dev",
|
|
30
|
+
"build": "node bin/build.mjs && node bin/size.mjs",
|
|
31
|
+
"size": "node bin/size.mjs",
|
|
32
|
+
"check": "biome check . && tsc --noEmit",
|
|
33
|
+
"check:fix": "biome check --write . && tsc --noEmit",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"test:watch": "vitest",
|
|
36
|
+
"clean": "rm -rf dist coverage",
|
|
37
|
+
"preversion": "pnpm check && pnpm test && pnpm build",
|
|
38
|
+
"prepublishOnly": "pnpm build"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@biomejs/biome": "^2.5.13",
|
|
42
|
+
"esbuild": "^0.28.2",
|
|
43
|
+
"happy-dom": "^20.14.3",
|
|
44
|
+
"typescript": "^7.0.2",
|
|
45
|
+
"vitest": "^5.0.0"
|
|
46
|
+
},
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=22",
|
|
49
|
+
"pnpm": ">=10"
|
|
50
|
+
},
|
|
51
|
+
"packageManager": "pnpm@10.33.0",
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public"
|
|
54
|
+
},
|
|
55
|
+
"pnpm": {
|
|
56
|
+
"onlyBuiltDependencies": [
|
|
57
|
+
"esbuild"
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
}
|