@thebase/ui 1.0.0 → 1.1.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.
Files changed (46) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +28 -0
  3. package/README.md +6 -5
  4. package/dist/baseui.analytics.esm.js +1 -0
  5. package/dist/baseui.analytics.min.js +1 -0
  6. package/dist/baseui.esm.js +9 -9
  7. package/dist/baseui.icons.esm.js +1 -1
  8. package/dist/baseui.min.js +9 -9
  9. package/dist/baseui.registry.json +8 -4
  10. package/dist/types/analytics.d.ts +65 -0
  11. package/dist/types/index.d.ts +4 -0
  12. package/docs/analytics.md +77 -0
  13. package/docs/blocks.md +1 -1
  14. package/docs/components/avatar.md +3 -3
  15. package/docs/components/block-viewer.md +2 -2
  16. package/docs/components/calendar.md +3 -3
  17. package/docs/components/carousel.md +3 -3
  18. package/docs/components/chart.md +3 -3
  19. package/docs/components/combobox.md +3 -3
  20. package/docs/components/command.md +3 -3
  21. package/docs/components/context-menu.md +3 -3
  22. package/docs/components/data-table.md +3 -3
  23. package/docs/components/date-picker.md +3 -3
  24. package/docs/components/icon.md +2 -2
  25. package/docs/components/input-otp.md +3 -3
  26. package/docs/components/input.md +2 -2
  27. package/docs/components/markdown.md +2 -2
  28. package/docs/components/message-scroller.md +3 -3
  29. package/docs/components/message.md +3 -3
  30. package/docs/components/popover.md +3 -3
  31. package/docs/components/questionnaire.md +3 -3
  32. package/docs/components/resizable.md +3 -3
  33. package/docs/components/scroll-area.md +3 -3
  34. package/docs/components/text-editor.md +1 -1
  35. package/docs/components/theme-button.md +2 -2
  36. package/docs/components/toggle-group.md +3 -3
  37. package/docs/components/toggle.md +3 -3
  38. package/docs/components/tooltip.md +3 -3
  39. package/docs/icons.md +5 -5
  40. package/docs/installation.md +4 -3
  41. package/docs/owl-components.md +2 -2
  42. package/docs/registry.md +2 -1
  43. package/docs/runtime-api.md +16 -12
  44. package/docs/theming.md +4 -4
  45. package/docs/usage-guide.md +15 -15
  46. package/package.json +8 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  All notable changes to this project are documented in this file.
4
4
 
5
+ ## [v1.1.0] - 2026-10-04
6
+
7
+ ### Added
8
+ - Optional, standalone analytics service: `@thebase/ui/analytics`. Use `dist/baseui.analytics.esm.js`, or the `<script>` build `dist/baseui.analytics.min.js`, which sets `window.thebase.analytics`. It is not part of the main bundles and needs no other BaseUI file. Start it with `init({ backendUrl })`: events go to `<backendUrl>/api/event` (change the path with `apiPath`), and `domain` defaults to `location.hostname`. Pass a full `endpoint` instead when routing through a proxy. A URL without a scheme throws instead of silently posting to your own site. It is a cookieless tracker ported from `@plausible-analytics/tracker` 0.4.6 and keeps that package's options and compact payload. It covers automatic and SPA pageviews, engagement (time on page and scroll depth), outbound links, file downloads, form submissions, `thebase-event-*` / `thebase-revenue-*` class tagging, the `localStorage.thebase_ignore` opt-out, `customProperties` and `transformRequest`. After `init()` the tracker is bound to `window.thebase.track`. Types are in `dist/types/analytics.d.ts`; see `docs/analytics.md`. The upstream MIT notice is in `LICENSE`.
9
+ - The browser global is now `window.thebase`, holding the same object as before (`version`, `register`, `component`, `mount`, `mountAll`, `destroy`, `theme`, `icons`). If a page script creates `window.thebase` before a BaseUI bundle loads, the runtime adds its methods to that object instead of replacing it.
10
+
11
+ ### Changed
12
+ - Docs: production pin examples now use `@1.1.0`. `docs/installation.md` and `docs/registry.md` list the analytics bundles and the `@thebase/ui/analytics` export.
13
+
14
+ ### Deprecated
15
+ - `window.BaseUI`: use `window.thebase` instead (e.g. `thebase.mountAll(...)`, `thebase.theme.set(...)`). It still points to the same object throughout 1.x and will be removed in 2.0.0. The ESM export `import { BaseUI } from "@thebase/ui"`, `window.BaseUITheme` and the `element.BaseUI*` handles are not affected.
16
+
5
17
  ## [v1.0.0] - 2026-10-03
6
18
 
7
19
  First stable release. From here on the package follows [Semantic Versioning](https://semver.org/) — see the [Versioning policy](README.md#versioning-policy) for what counts as the public API and what each version bump means. No API changes versus v0.0.12 beyond the fixes below; upgrading from 0.0.12 needs no code changes.
package/LICENSE CHANGED
@@ -19,3 +19,31 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
22
+
23
+ ---
24
+
25
+ Third-party notice: src/runtime/base/analytics.js (the optional analytics service,
26
+ built as dist/baseui.analytics.esm.js and dist/baseui.analytics.min.js) is a port of
27
+ @plausible-analytics/tracker, distributed under the following license:
28
+
29
+ MIT License
30
+
31
+ Copyright 2020 Plausible Insights OÜ
32
+
33
+ Permission is hereby granted, free of charge, to any person obtaining a copy
34
+ of this software and associated documentation files (the "Software"), to deal
35
+ in the Software without restriction, including without limitation the rights
36
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
37
+ copies of the Software, and to permit persons to whom the Software is
38
+ furnished to do so, subject to the following conditions:
39
+
40
+ The above copyright notice and this permission notice shall be included in all
41
+ copies or substantial portions of the Software.
42
+
43
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
44
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
45
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
46
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
47
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
48
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
49
+ SOFTWARE.
package/README.md CHANGED
@@ -4,7 +4,7 @@ The Base UI is a CDN-installable UI kit built with Bootstrap 5 styling and Owl-e
4
4
 
5
5
  Its strong points: **no build step** — every component runs straight from a CDN `<script>`/import map, nothing to compile; **modular component design** — each component is a self-contained unit you import or mark up individually, not a monolith; **vanilla JavaScript/TypeScript** — no framework lock-in, no JSX, no compiler-specific syntax to learn; and this combination makes it well suited to building **WYSIWYG website builders**, where components must mount, unmount, and re-render dynamically from user-driven markup or drag-and-drop edits rather than a fixed build-time component tree.
6
6
 
7
- Both APIs load straight from a CDN — jsDelivr or unpkg — no build step, no self-hosting required. The snippets below use the `@latest` tag for readability; pin an exact version instead (e.g. `@1.0.0`, or `@1` to take only non-breaking updates) for any production page, since `@latest` can change what your page loads the moment a new version ships. Pure Owl usage:
7
+ Both APIs load straight from a CDN — jsDelivr or unpkg — no build step, no self-hosting required. The snippets below use the `@latest` tag for readability; pin an exact version instead (e.g. `@1.1.0`, or `@1` to take only non-breaking updates) for any production page, since `@latest` can change what your page loads the moment a new version ships. Pure Owl usage:
8
8
 
9
9
  ```html
10
10
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@thebase/ui@latest/dist/baseui.min.css">
@@ -58,7 +58,7 @@ Every component ships both APIs from `src/components/<name>/`: the static `b-ui`
58
58
 
59
59
  ## Release notes
60
60
 
61
- See [CHANGELOG.md](CHANGELOG.md) for the full version history. Current version: **1.0.0**.
61
+ See [CHANGELOG.md](CHANGELOG.md) for the full version history. Current version: **1.1.0**.
62
62
 
63
63
  ## Versioning policy
64
64
 
@@ -77,7 +77,7 @@ What each release type means:
77
77
 
78
78
  Anything prefixed `_`, undocumented internals, and the `docs/`/`examples/` sources are not part of the public API. Neither are the source-level authoring helpers described in [Component Authoring](docs/component-authoring.md) (`optional()`, `slotProps`, the `open-state.js` hooks, `bindBootstrapOverlay()`): they aren't exported from the package and may change in any release. Deprecated APIs keep working until the next major and are flagged in the CHANGELOG first.
79
79
 
80
- Pinning: use an exact version (`@1.0.0`) when you need byte-identical output, or the major range (`@1` on jsDelivr/unpkg, `^1.0.0` in npm) to receive fixes and features without breaking changes. Avoid `@latest` in production — it will move to the next major.
80
+ Pinning: use an exact version (`@1.1.0`) when you need byte-identical output, or the major range (`@1` on jsDelivr/unpkg, `^1.0.0` in npm) to receive fixes and features without breaking changes. Avoid `@latest` in production — it will move to the next major.
81
81
 
82
82
  ## Project Documents
83
83
 
@@ -85,7 +85,8 @@ Use these documents as the canonical project map:
85
85
 
86
86
  - [Usage Guide](docs/usage-guide.md) is the single entry point for integrating BaseUI into a consumer project — start here, then follow its links into the reference docs below.
87
87
  - [Installation](docs/installation.md) covers CDN, npm, self-hosted usage, icon assets, pinned versions, and release guardrails.
88
- - [Runtime API](docs/runtime-api.md) documents the `window.BaseUI` global, mounting lifecycle, theming API, and destroy behavior.
88
+ - [Analytics](docs/analytics.md) documents the optional, standalone cookieless analytics service (`@thebase/ui/analytics`).
89
+ - [Runtime API](docs/runtime-api.md) documents the `window.thebase` global, mounting lifecycle, theming API, and destroy behavior.
89
90
  - [Registry](docs/registry.md) explains `dist/baseui.registry.json`, build files, block metadata, component metadata, and integrity hashes.
90
91
  - [Theming](docs/theming.md) describes `b-theme`, runtime theme overrides, shadcn-aligned tokens, Bootstrap variable mapping, and shared example theme persistence.
91
92
  - [Built-in Icons](docs/icons.md) covers the Lucide icon library, `b-icon` markup, accessibility rules, self-hosted icon paths, and JavaScript helpers.
@@ -118,7 +119,7 @@ Open `examples/index.html` through the dev server to test the browser build.
118
119
 
119
120
  `examples/index.html` is the single Owl app shell for docs, the component gallery, the block gallery, icons, and the chart catalog, all reachable through one `main-nav` and hash routes (`#/docs`, `#/components`, `#/blocks`, `#/icons`, `#/chart`). Old bookmarked URLs like `/docs` and `/blocks` redirect to their hash-route equivalent. Each block has a shadcn-style Preview/Code/responsive viewer plus its source stylesheet colocated in `examples/blocks/`. `examples/charts/index.html` mirrors the current shadcn chart catalog with interactive BaseUI examples for area, bar, line, pie, radar, radial, and tooltip charts, and is embedded inline at `#/chart`.
120
121
 
121
- BaseUI includes the full Lucide SVG icon set as a built-in icon library. Use `<span b-icon="search"></span>` in HTML, or `BaseUI.icons.lucide.url("search")` from JavaScript. Builds publish all SVGs to `dist/icons/lucide/` and an index at `dist/icons/lucide.json`.
122
+ BaseUI includes the full Lucide SVG icon set as a built-in icon library. Use `<span b-icon="search"></span>` in HTML, or `thebase.icons.lucide.url("search")` from JavaScript. Builds publish all SVGs to `dist/icons/lucide/` and an index at `dist/icons/lucide.json`.
122
123
 
123
124
  ## Package Scripts
124
125
 
@@ -0,0 +1 @@
1
+ var H=["pdf","xlsx","docx","txt","rtf","csv","exe","key","pps","ppt","pptx","7z","pkg","rar","gz","zip","avi","mov","mp4","mpeg","wmv","midi","mp3","wav","wma","dmg"];var U=/^localhost$|^127(\.[0-9]+){0,2}\.[0-9]+$|^\[::1?\]$/,F=/thebase-event-name(=|--)(.+)/,B="/api/event",$=/^(https?:\/\/|\/)/,o={},P=H,p,A,w=!1,v,C,O={},E=-1,r=0,l=0,u,s;function z(e){if(o.isInitialized)throw Error("thebase.analytics.init() can only be called once");let t=e.apiPath||B,i=e.endpoint||e.backendUrl&&`${e.backendUrl.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`;if(!i)throw Error("thebase.analytics.init(): backendUrl (or endpoint) is required");if(!$.test(i))throw Error(`thebase.analytics.init(): "${i}" must be an http(s):// URL or a /path on this site`);Object.assign(o,e,{domain:e.domain||location.hostname,endpoint:i,autoCapturePageviews:e.autoCapturePageviews!==!1,logging:e.logging!==!1,bindToWindow:e.bindToWindow!==!1,isInitialized:!0})}function I(e,t,i){fetch(e,{method:"POST",headers:{"Content-Type":"text/plain"},keepalive:!0,body:JSON.stringify(t)}).then(n=>i?.callback?.({status:n.status})).catch(n=>i?.callback?.({error:n}))}function V(){w&&(N(),u=S(),s=L())}function q(e){v=!1,C=e.u,O=e.p,E=-1,l=0,r=Date.now(),G()}function N(){let e=M();if(v||E>=s&&e<3e3)return;E=s;let t={n:"engagement",sd:Math.round(s/u*100),d:o.domain,u:C,p:O,e,v:36};r=0,l=0,o.hashBasedRouting&&(t.h=1),I(o.endpoint,t)}function m(){document.visibilityState==="visible"&&document.hasFocus()&&r===0?r=Date.now():(document.visibilityState==="hidden"||!document.hasFocus())&&(l=M(),r=0,N())}function G(){w||(document.addEventListener("visibilitychange",m),window.addEventListener("blur",m),window.addEventListener("focus",m),w=!0)}function M(){return r?l+(Date.now()-r):l}function S(){let e=document.body,t=document.documentElement;return Math.max(e.scrollHeight,e.offsetHeight,e.clientHeight,t.scrollHeight,t.offsetHeight,t.clientHeight)}function L(){return u<=window.innerHeight?u:window.scrollY+window.innerHeight}function K(){u=S()}function W(){s=Math.max(s,L())}function j(){u=S(),s=L(),new window.ResizeObserver(K).observe(document.documentElement),document.addEventListener("scroll",W)}function g(e,t){if(!o.isInitialized)throw Error("thebase.analytics.track() can only be called after thebase.analytics.init()");let i=e==="pageview";if(i&&V(),!o.captureOnLocalhost){if(U.test(location.hostname)||location.protocol==="file:")return d(e,t,"localhost");if((window._phantom||window.__nightmare||navigator.webdriver||window.Cypress)&&!window.__thebase)return d(e,t)}try{if(localStorage.thebase_ignore==="true")return d(e,t,"localStorage flag")}catch{}let n={n:e,v:36,u:t?.u||t?.url||location.href,d:o.domain,r:document.referrer||null};if(t?.props&&(n.p=t.props),t?.interactive===!1&&(n.i=!1),t?.revenue&&(n.$=t.revenue),o.customProperties){let a=typeof o.customProperties=="function"?o.customProperties(e):o.customProperties;typeof a=="object"&&(n.p={...a,...n.p})}if(o.hashBasedRouting&&(n.h=1),typeof o.transformRequest=="function"&&(n=o.transformRequest(n),!n))return d(e,t,"transformRequest");i&&q(n),I(o.endpoint,n,t)}function d(e,t,i){i&&o.logging&&console.warn(`Ignoring Event: ${i}`),t?.callback?.(),e==="pageview"&&(v=!0)}function x(e){return e?.tagName?.toLowerCase()==="a"}function Y(e){for(;e&&(e.tagName===void 0||!x(e)||!e.href);)e=e.parentNode;return e}function J(e){return e&&typeof e.href=="string"&&e.host&&e.host!==location.host}function Q(e){return!!e&&P.includes(e.split(".").pop())}function T(e){return!!e?.classList&&[...e.classList].some(t=>F.test(t))}function y(e,t){return!!e&&t<=3&&(T(e)||y(e.parentNode,t+1))}function D(e){let t=T(e)?e:e?.parentNode,i={name:null,props:{},revenue:{}};if(!t?.classList)return i;for(let n of t.classList){let a=n.match(/thebase-event-(.+)(=|--)(.+)/);if(a){let _=a[3].replace(/\+/g," ");a[1].toLowerCase()==="name"?i.name=_:i.props[a[1]]=_}let c=n.match(/thebase-revenue-(.+)(=|--)(.+)/);c&&(i.revenue[c[1]]=c[3])}return i}function f(e){g(e.name,{props:e.props,revenue:e.revenue})}function k(e){if(e.type==="auxclick"&&e.button!==1)return;let t=Y(e.target);if(y(t,0))return;if(o.outboundLinks&&J(t))return f({name:"Outbound Link: Click",props:{url:t.href}});let i=t&&typeof t.href=="string"&&t.href.split("?")[0];o.fileDownloads&&Q(i)&&f({name:"File Download",props:{url:i}})}function R(e){if(e.type==="auxclick"&&e.button!==1)return;let t,i,n=e.target;for(let c=0;c<=3&&n;c++){if(n.tagName?.toLowerCase()==="form")return;x(n)&&(t=n),T(n)&&(i=n),n=n.parentNode}if(!i)return;let a=D(i);t&&(a.props.url=t.href),f(a)}function X(e){let t=e.target;(t.hasAttribute("novalidate")||t.checkValidity())&&!y(t,0)&&g("Form: Submission")}function Z(e){let t=D(e.target);t.name&&f(t)}function ee(){document.addEventListener("click",k),document.addEventListener("auxclick",k),Array.isArray(o.fileDownloads?.fileExtensions)&&(P=o.fileDownloads.fileExtensions),o.formSubmissions&&document.addEventListener("submit",X,!0),document.addEventListener("submit",Z),document.addEventListener("click",R),document.addEventListener("auxclick",R)}function h(e){!o.hashBasedRouting&&e&&p===location.pathname||(p=location.pathname,g("pageview"))}function b(){h(!0)}function te(...e){A.apply(this,e),b()}function ne(){!p&&document.visibilityState==="visible"&&h()}function ie(e){e.persisted&&h()}function oe(){o.hashBasedRouting?window.addEventListener("hashchange",b):(A=window.history.pushState,window.history.pushState=te,window.addEventListener("popstate",b)),document.visibilityState==="hidden"||document.visibilityState==="prerender"?document.addEventListener("visibilitychange",ne):h(),window.addEventListener("pageshow",ie)}function ae(e){z(e||{}),j(),o.autoCapturePageviews&&oe(),ee(),o.bindToWindow&&(window.thebase??(window.thebase={}),window.thebase.track=g,window.thebase.track.s="npm",window.thebase.track.v=36,window.thebase.track.l=!0)}export{H as DEFAULT_FILE_TYPES,ae as init,g as track};
@@ -0,0 +1 @@
1
+ (()=>{var F=Object.defineProperty;var B=(e,t)=>{for(var n in t)F(e,n,{get:t[n],enumerable:!0})};var _={};B(_,{DEFAULT_FILE_TYPES:()=>A,init:()=>ce,track:()=>d});var A=["pdf","xlsx","docx","txt","rtf","csv","exe","key","pps","ppt","pptx","7z","pkg","rar","gz","zip","avi","mov","mp4","mpeg","wmv","midi","mp3","wav","wma","dmg"];var $=/^localhost$|^127(\.[0-9]+){0,2}\.[0-9]+$|^\[::1?\]$/,z=/thebase-event-name(=|--)(.+)/,V="/api/event",q=/^(https?:\/\/|\/)/,o={},C=A,p,O,w=!1,v,I,N={},E=-1,r=0,l=0,u,s;function G(e){if(o.isInitialized)throw Error("thebase.analytics.init() can only be called once");let t=e.apiPath||V,n=e.endpoint||e.backendUrl&&`${e.backendUrl.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`;if(!n)throw Error("thebase.analytics.init(): backendUrl (or endpoint) is required");if(!q.test(n))throw Error(`thebase.analytics.init(): "${n}" must be an http(s):// URL or a /path on this site`);Object.assign(o,e,{domain:e.domain||location.hostname,endpoint:n,autoCapturePageviews:e.autoCapturePageviews!==!1,logging:e.logging!==!1,bindToWindow:e.bindToWindow!==!1,isInitialized:!0})}function M(e,t,n){fetch(e,{method:"POST",headers:{"Content-Type":"text/plain"},keepalive:!0,body:JSON.stringify(t)}).then(i=>n?.callback?.({status:i.status})).catch(i=>n?.callback?.({error:i}))}function K(){w&&(x(),u=S(),s=L())}function W(e){v=!1,I=e.u,N=e.p,E=-1,l=0,r=Date.now(),j()}function x(){let e=D();if(v||E>=s&&e<3e3)return;E=s;let t={n:"engagement",sd:Math.round(s/u*100),d:o.domain,u:I,p:N,e,v:36};r=0,l=0,o.hashBasedRouting&&(t.h=1),M(o.endpoint,t)}function m(){document.visibilityState==="visible"&&document.hasFocus()&&r===0?r=Date.now():(document.visibilityState==="hidden"||!document.hasFocus())&&(l=D(),r=0,x())}function j(){w||(document.addEventListener("visibilitychange",m),window.addEventListener("blur",m),window.addEventListener("focus",m),w=!0)}function D(){return r?l+(Date.now()-r):l}function S(){let e=document.body,t=document.documentElement;return Math.max(e.scrollHeight,e.offsetHeight,e.clientHeight,t.scrollHeight,t.offsetHeight,t.clientHeight)}function L(){return u<=window.innerHeight?u:window.scrollY+window.innerHeight}function Y(){u=S()}function J(){s=Math.max(s,L())}function Q(){u=S(),s=L(),new window.ResizeObserver(Y).observe(document.documentElement),document.addEventListener("scroll",J)}function d(e,t){if(!o.isInitialized)throw Error("thebase.analytics.track() can only be called after thebase.analytics.init()");let n=e==="pageview";if(n&&K(),!o.captureOnLocalhost){if($.test(location.hostname)||location.protocol==="file:")return f(e,t,"localhost");if((window._phantom||window.__nightmare||navigator.webdriver||window.Cypress)&&!window.__thebase)return f(e,t)}try{if(localStorage.thebase_ignore==="true")return f(e,t,"localStorage flag")}catch{}let i={n:e,v:36,u:t?.u||t?.url||location.href,d:o.domain,r:document.referrer||null};if(t?.props&&(i.p=t.props),t?.interactive===!1&&(i.i=!1),t?.revenue&&(i.$=t.revenue),o.customProperties){let a=typeof o.customProperties=="function"?o.customProperties(e):o.customProperties;typeof a=="object"&&(i.p={...a,...i.p})}if(o.hashBasedRouting&&(i.h=1),typeof o.transformRequest=="function"&&(i=o.transformRequest(i),!i))return f(e,t,"transformRequest");n&&W(i),M(o.endpoint,i,t)}function f(e,t,n){n&&o.logging&&console.warn(`Ignoring Event: ${n}`),t?.callback?.(),e==="pageview"&&(v=!0)}function H(e){return e?.tagName?.toLowerCase()==="a"}function X(e){for(;e&&(e.tagName===void 0||!H(e)||!e.href);)e=e.parentNode;return e}function Z(e){return e&&typeof e.href=="string"&&e.host&&e.host!==location.host}function ee(e){return!!e&&C.includes(e.split(".").pop())}function T(e){return!!e?.classList&&[...e.classList].some(t=>z.test(t))}function y(e,t){return!!e&&t<=3&&(T(e)||y(e.parentNode,t+1))}function U(e){let t=T(e)?e:e?.parentNode,n={name:null,props:{},revenue:{}};if(!t?.classList)return n;for(let i of t.classList){let a=i.match(/thebase-event-(.+)(=|--)(.+)/);if(a){let k=a[3].replace(/\+/g," ");a[1].toLowerCase()==="name"?n.name=k:n.props[a[1]]=k}let c=i.match(/thebase-revenue-(.+)(=|--)(.+)/);c&&(n.revenue[c[1]]=c[3])}return n}function g(e){d(e.name,{props:e.props,revenue:e.revenue})}function R(e){if(e.type==="auxclick"&&e.button!==1)return;let t=X(e.target);if(y(t,0))return;if(o.outboundLinks&&Z(t))return g({name:"Outbound Link: Click",props:{url:t.href}});let n=t&&typeof t.href=="string"&&t.href.split("?")[0];o.fileDownloads&&ee(n)&&g({name:"File Download",props:{url:n}})}function P(e){if(e.type==="auxclick"&&e.button!==1)return;let t,n,i=e.target;for(let c=0;c<=3&&i;c++){if(i.tagName?.toLowerCase()==="form")return;H(i)&&(t=i),T(i)&&(n=i),i=i.parentNode}if(!n)return;let a=U(n);t&&(a.props.url=t.href),g(a)}function te(e){let t=e.target;(t.hasAttribute("novalidate")||t.checkValidity())&&!y(t,0)&&d("Form: Submission")}function ne(e){let t=U(e.target);t.name&&g(t)}function ie(){document.addEventListener("click",R),document.addEventListener("auxclick",R),Array.isArray(o.fileDownloads?.fileExtensions)&&(C=o.fileDownloads.fileExtensions),o.formSubmissions&&document.addEventListener("submit",te,!0),document.addEventListener("submit",ne),document.addEventListener("click",P),document.addEventListener("auxclick",P)}function h(e){!o.hashBasedRouting&&e&&p===location.pathname||(p=location.pathname,d("pageview"))}function b(){h(!0)}function oe(...e){O.apply(this,e),b()}function ae(){!p&&document.visibilityState==="visible"&&h()}function re(e){e.persisted&&h()}function se(){o.hashBasedRouting?window.addEventListener("hashchange",b):(O=window.history.pushState,window.history.pushState=oe,window.addEventListener("popstate",b)),document.visibilityState==="hidden"||document.visibilityState==="prerender"?document.addEventListener("visibilitychange",ae):h(),window.addEventListener("pageshow",re)}function ce(e){G(e||{}),Q(),o.autoCapturePageviews&&se(),ie(),o.bindToWindow&&(window.thebase??(window.thebase={}),window.thebase.track=d,window.thebase.track.s="npm",window.thebase.track.v=36,window.thebase.track.l=!0)}window.thebase??(window.thebase={});window.thebase.analytics=_;})();