light-odometer 0.1.0 → 0.1.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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  Copyright (c) 2013 HubSpot, Inc.
2
2
  Copyright (c) 2020-2025 Marco Trinastich
3
- Copyright (c) 2025 EDM115
3
+ Copyright (c) 2025-2026 EDM115
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
6
 
package/README.md CHANGED
@@ -1,7 +1,12 @@
1
- # light-odometer ![NPM Version](https://img.shields.io/npm/v/light-odometer)
1
+ <div align="center">
2
+
3
+ # light-odometer
4
+ ![NPM Version](https://img.shields.io/npm/v/light-odometer) ![NPM Downloads](https://img.shields.io/npm/dt/light-odometer) [![More info](https://img.shields.io/badge/npmx-More_info-orange?logo=npm)](https://npmx.dev/light-odometer)
5
+
6
+ </div>
2
7
 
3
8
  This project is made only for personal use, as a small and lightweight build of [tm-odometer](https://github.com/mtmarco87/tm-odometer), which is itself a fork of [HubSpot's odometer](https://github.com/HubSpot/odometer).
4
- Do not use this, use [@mtmarco87](https://github.com/mtmarco87)'s package instead.
9
+ ⚠️ Do not use this, use [@mtmarco87](https://github.com/mtmarco87)'s package instead.
5
10
  Huge props to him for this TypeScript refactor !
6
11
 
7
12
  No theme is shipped here, no docs either.
@@ -14,7 +19,7 @@ For a quick overview in a real-world usage, see https://github.com/EDM115/websit
14
19
  - Added linting and formatting (OxLint + ESLint Stylistic)
15
20
  - Keep only the ESM build and switch to a default export
16
21
  - Better TS config and stricter types (no more `any` nor `as`)
17
- - Target ES2016 instead of ES2015
22
+ - Target ES2023 instead of ES2015
18
23
  - Remove compatibility layers (Internet Explorer, jQuery)
19
24
  - Stabilize and simplify the interfaces
20
25
  - Use overall more optimized methods
@@ -26,7 +31,8 @@ For a quick overview in a real-world usage, see https://github.com/EDM115/websit
26
31
  - Each instance can now have an `id`
27
32
  - Ability to customize the framerate
28
33
  ```ts
29
- const odo = new LightOdometer({ ..., framerate: 20 }) // default is 30, going above isn't recommended
34
+ const odo = new LightOdometer({ ..., framerate: 20 })
35
+ // default is 30, going above isn't recommended
30
36
  // use countFramerate if you use the `count` mode instead of `slide`
31
37
  ```
32
38
  - Ability to render once and destroy the instance
@@ -44,7 +50,7 @@ For a quick overview in a real-world usage, see https://github.com/EDM115/websit
44
50
  const odo = new LightOdometer({ ... })
45
51
  console.log(odo.getOptions().duration)
46
52
  odo.setOptions({ duration: 2000 })
47
-
53
+
48
54
  console.log(LightOdometer.getGlobalOptions.selector)
49
55
  LightOdometer.setGlobalOptions({ selector: ".my-odometer" })
50
56
  ```
@@ -52,13 +58,13 @@ For a quick overview in a real-world usage, see https://github.com/EDM115/websit
52
58
  ```ts
53
59
  const odo = new LightOdometer({ ... })
54
60
  console.log(odo.isAnimating)
55
-
61
+
56
62
  function onStart(e: Event) {
57
63
  const { detail } = e as CustomEvent<LightOdometerEventDetail>
58
64
  // detail.id, detail.value, detail.instance.isAnimating, ...
59
65
  console.log(`started animating to ${detail.value}`)
60
66
  }
61
-
67
+
62
68
  function onDone(e: Event) {
63
69
  const { detail } = e as CustomEvent<LightOdometerEventDetail>
64
70
  console.log(`finished animating to ${detail.value}`)
@@ -74,5 +80,28 @@ For a quick overview in a real-world usage, see https://github.com/EDM115/websit
74
80
  - Print the instance in a JSON-friendly string
75
81
  ```ts
76
82
  const odo = new LightOdometer({ ... })
77
- console.log(odo.toString()) // {"id":2,"value":157,"options":{"id":2,"value":0,"animation":"slide","duration":8000,"format":"( ddd)","framerate":20},"globalOptions":{},"watchMutations":false,"transitionEndBound":true,"destroyed":false,"format":{"repeating":" ","precision":0},"isAnimating":false}
83
+ console.log(odo.toString())
84
+ ```
85
+ ```json
86
+ {
87
+ "id": 2,
88
+ "value": 157,
89
+ "options": {
90
+ "id": 2,
91
+ "value": 0,
92
+ "animation": "slide",
93
+ "duration": 8000,
94
+ "format": "( ddd)",
95
+ "framerate": 20
96
+ },
97
+ "globalOptions": {},
98
+ "watchMutations": false,
99
+ "transitionEndBound": true,
100
+ "destroyed": false,
101
+ "format": {
102
+ "repeating": " ",
103
+ "precision": 0
104
+ },
105
+ "isAnimating": false
106
+ }
78
107
  ```
@@ -282,4 +282,4 @@ declare class LightOdometer {
282
282
  toString(): string;
283
283
  }
284
284
  //#endregion
285
- export { LightOdometer as default };
285
+ export { LightOdometer, LightOdometer as default };
@@ -0,0 +1 @@
1
+ const e=/^\(?([^)]*)\)?(?:(.)(d+))?$/,t=2e3;function n(e){let t=document.createElement(`div`);if(t.innerHTML=e,!(t.firstElementChild instanceof HTMLElement))throw Error(`Invalid HTML: No valid root element found.`);return t.firstElementChild}function r(e,t){let n=t.split(` `);for(let t of n)e.classList.remove(t);return e.className}function i(e,t){let n=t.split(` `);for(let t of n)t&&e.classList.add(t);return e.className}function a(e,t,n){let r=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(r)}function o(){return typeof performance<`u`&&typeof performance.now==`function`?performance.now():Date.now()}function s(e,t){return t??=0,t?(e*=10**t,e+=.5,e=Math.floor(e),e/=10**t):Math.round(e)}function c(e){return e<0?Math.ceil(e):Math.floor(e)}function l(){return typeof window<`u`&&typeof document<`u`}function u(e){return l()&&typeof requestAnimationFrame==`function`?requestAnimationFrame(e):setTimeout(()=>e(o()),16)}function d(e){e!=null&&(l()&&typeof cancelAnimationFrame==`function`&&typeof e==`number`?cancelAnimationFrame(e):clearTimeout(e))}function f(e){l()&&(document.readyState===`complete`||document.readyState===`interactive`?setTimeout(e,0):document.addEventListener(`DOMContentLoaded`,e,{once:!0}))}function p(e){l()&&setTimeout(()=>{window.odometerOptions&&(e.options={...e.options,...window.odometerOptions})},0)}function m(e){f(()=>{e.options.auto!==!1&&e.init()})}var h=class f{static options=typeof window<`u`?window.odometerOptions??{}:{};_isAnimating=!1;options;el;value=0;inside;observer;watchMutations=!1;transitionEndBound=!1;destroyed=!1;format={repeating:``,precision:0};get isAnimating(){return this._isAnimating}MAX_VALUES;digits=[];ribbons={};_rafId;_countRafId;_msPerFrame;_countMsPerFrame;_onTransitionEnd;constructor(e){if(this.options=e,this.el=this.options.el,this.el.odometer){let e=this.el.odometer;e.options={...e.options,...this.options},e.options.duration??=t;let n=e.options.framerate??30,r=e.options.countFramerate??20;return e._msPerFrame=1e3/n,e._countMsPerFrame=1e3/r,e.MAX_VALUES=e.options.duration/e._msPerFrame/2|0,e.resetFormat(),this.options.value==null?l()&&e.render():e.update(this.options.value),e}this.el.odometer=this,this.options={...f.options,...this.options},this.options.duration??=t;let n=this.options.framerate??30,r=this.options.countFramerate??20;this._msPerFrame=1e3/n,this._countMsPerFrame=1e3/r,this.MAX_VALUES=this.options.duration/this._msPerFrame/2|0,this.resetFormat(),this.value=this.cleanValue(this.options.value??``),l()&&(this.renderInside(),this.render());try{for(let e of[`innerHTML`,`innerText`,`textContent`])Object.defineProperty(this.el,e,{get:()=>e===`innerHTML`?this.inside?.outerHTML??``:this.inside?.innerText??this.inside?.textContent??``,set:e=>this.update(e)})}catch{l()&&this.watchForMutations()}}renderInside(){l()&&(this.inside=document.createElement(`div`),this.inside.className=`odometer-inside`,this.el.textContent=``,this.el.appendChild(this.inside))}watchForMutations(){try{this.observer??=new MutationObserver(e=>{let t=this.el.innerText||``;this.renderInside(),this.render(this.value),this.update(t)}),this.watchMutations=!0,this.startWatchingMutations()}catch{}}startWatchingMutations(){this.watchMutations&&l()&&this.observer?.observe(this.el,{childList:!0})}stopWatchingMutations(){this.observer?.disconnect()}cleanValue(e){return typeof e==`string`&&(e=e.replace(this.format.radix??`.`,`<radix>`),e=e.replace(/[.,\s\u00A0\u202F]/g,``),e=e.replace(`<radix>`,`.`),e=parseFloat(e)||0),s(e,this.format.precision)}bindTransitionEnd(){if(this.transitionEndBound)return;this.transitionEndBound=!0;let e=!1;this._onTransitionEnd=()=>e?!0:(e=!0,setTimeout(()=>{this.render(),e=!1,this._isAnimating=!1,a(this.el,`odometerdone`,{id:this.options.id,el:this.el,instance:this,value:this.value,options:this.getOptions()})},0),!0),this.el.addEventListener(`transitionend`,this._onTransitionEnd,!1)}resetFormat(){let t=this.options.format??`(,ddd).dd`;t||=`d`;let n=e.exec(t);if(!n)throw Error(`LightOdometer: Unparsable digit format`);let[r,i,a,o]=n;this.format={repeating:i,radix:a,precision:o?.length||0}}render(e){if(l()){e??=this.value,this.stopWatchingMutations(),this.resetFormat(),this.inside.textContent=``;for(let e of Array.from(this.el.classList))/^odometer(-|$)/.test(e)&&this.el.classList.remove(e);this.el.classList.add(`odometer`,`odometer-auto-theme`),this.el.style.setProperty(`--odometer-duration`,`${this.options.duration??2e3}ms`),this.ribbons={},this.formatDigits(e),this.startWatchingMutations()}}formatDigits(e){if(this.digits=[],this.options.formatFunction){let t=this.options.formatFunction(e);for(let e of t.split(``).toReversed())if(/\d/.test(e)){let t=this.renderDigit(),n=t.querySelector(`.odometer-value`);n.textContent=e,i(n,`odometer-first-value odometer-last-value`),this.digits.push(t),this.insertDigit(t)}else this.addSpacer(e)}else{let t=this.preservePrecision(e),n=!this.format.precision;for(let e of t.split(``).toReversed())e===`.`&&(n=!0),this.addDigit(e,n)}}preservePrecision(e){let t=e.toString();if(this.format.precision){let e=t.split(`.`);e.length===1&&(t+=`.`,e[1]=``);for(let n=0;n<this.format.precision;n++)e[1][n]||(t+=`0`)}return t}update(e){if(!l())return this.value=this.cleanValue(e),this.value;e=this.cleanValue(e);let t=e-this.value;return t?(r(this.el,`odometer-animating-up odometer-animating-down odometer-animating`),t>0?i(this.el,`odometer-animating-up`):i(this.el,`odometer-animating-down`),this._isAnimating=!0,a(this.el,`odometerstart`,{id:this.options.id,el:this.el,instance:this,value:e,oldValue:this.value,options:this.getOptions()}),this.stopWatchingMutations(),this.animate(e),this.startWatchingMutations(),setTimeout(()=>{this.el.offsetHeight,i(this.el,`odometer-animating`)},0),this.value=e,this.value):this.value}renderDigit(){return n(`<span class="odometer-digit"><span class="odometer-digit-spacer">8</span><span class="odometer-digit-inner"><span class="odometer-ribbon"><span class="odometer-ribbon-inner"><span class="odometer-value"></span></span></span></span></span>`)}insertDigit(e,t){return t?this.inside.insertBefore(e,t):this.inside.children.length?this.inside.insertBefore(e,this.inside.children[0]):this.inside.appendChild(e)}addSpacer(e,t,r){let a=n(`<span class="odometer-formatting-mark"></span>`);return a.textContent=e,r&&i(a,r),this.insertDigit(a,t)}addDigit(e,t){if(t??=!0,e===`-`)return this.addSpacer(e,null,`odometer-negation-mark`);if(e===`.`)return this.addSpacer(this.format.radix??`.`,null,`odometer-radix-mark`);if(t){let e=!1;for(;;){if(!this.format.repeating.length){if(e)throw Error(`Bad odometer format without digits`);this.resetFormat(),e=!0}let t=this.format.repeating[this.format.repeating.length-1];if(this.format.repeating=this.format.repeating.substring(0,this.format.repeating.length-1),t===`d`)break;this.addSpacer(t)}}let n=this.renderDigit(),r=n.querySelector(`.odometer-value`);return r.textContent=e,i(r,`odometer-first-value odometer-last-value`),this.digits.push(n),this.insertDigit(n)}animate(e){this.options.animation===`count`?this.animateCount(e):this.animateSlide(e)}animateCount(e){if(!l())return;let t=e-this.value;if(!t)return;let n=o(),r=n,i=this.value,s=()=>{if(o()-n>(this.options.duration||0)){this.value=e,this.render(),this._isAnimating=!1,a(this.el,`odometerdone`,{id:this.options.id,el:this.el,instance:this,value:this.value,options:this.getOptions()});return}let c=o()-r;if(c>this._countMsPerFrame){r=o();let e=t*(c/(this.options.duration||0));i+=e,this.render(Math.round(i))}this._countRafId=u(s)};this._countRafId=u(s)}getDigitCount(...e){for(let t=0;t<e.length;t++)e[t]=Math.abs(e[t]);let t=Math.max(...e);return Math.ceil(Math.log(t+1)/Math.log(10))}getFractionalDigitCount(...e){let t=/^-?\d*\.(\d*?)0*$/;for(let n=0;n<e.length;n++){let r=e[n].toString(),i=t.exec(r);e[n]=i?i[1].length:0}return Math.max(...e)}resetDigits(){this.digits=[],this.ribbons={},this.inside.textContent=``,this.resetFormat()}createRange(e,t,n){let r=e<t,i=Math.abs(t-e)+(n?1:0);return Array.from({length:i},(t,n)=>r?e+n:e-n)}animateSlide(e){if(!l())return;let t=this.value,n=this.format.precision;n&&(e*=10**n,t*=10**n);let r=e-t;if(!r)return;this.bindTransitionEnd();let a=[],o=this.getDigitCount(t,e),s=0,u=t;for(let n=0;n<o;n++){u=c(t/10**(o-n-1));let r=c(e/10**(o-n-1)),i=r-u,l;if(Math.abs(i)>this.MAX_VALUES){l=[];let e=i/(this.MAX_VALUES*(1+s*.5)),t=u;for(;i>0&&t<r||i<0&&t>r;)l.push(Math.round(t)),t+=e;l[l.length-1]!==r&&l.push(r),s++}else l=this.createRange(u,r,!0);for(let e=0;e<l.length;e++)l[e]=Math.abs(l[e]%10);a.push(l)}this.resetDigits();let d=a.toReversed();for(let e=0;e<d.length;e++){let t=d[e];if(this.digits[e]||this.addDigit(` `,e>=n),this.ribbons[e]===void 0){let t=this.digits[e].querySelector(`.odometer-ribbon-inner`);t&&(this.ribbons[e]=t)}this.ribbons[e].textContent=``,r<0&&(t=t.toReversed());for(let n=0;n<t.length;n++){let r=t[n],a=document.createElement(`div`);a.className=`odometer-value`,a.textContent=r.toString(),this.ribbons[e].appendChild(a),n===t.length-1&&i(a,`odometer-last-value`),n===0&&i(a,`odometer-first-value`)}}u<0&&this.addDigit(`-`);let f=this.inside.querySelector(`.odometer-radix-mark`);f&&f.parentNode.removeChild(f),n&&this.addSpacer(this.format.radix??`.`,this.digits[n-1],`odometer-radix-mark`)}static init(){if(!l())return[];let e=document.querySelectorAll(f.options.selector||`.odometer`);return Array.from(e,e=>e.odometer=new f({el:e,value:e.innerText??e.textContent}))}setOptions(e){if(!e||typeof e!=`object`)return;`el`in e&&delete e.el;let n=Object.prototype.hasOwnProperty.call(e,`value`),r=Object.prototype.hasOwnProperty.call(e,`format`)||Object.prototype.hasOwnProperty.call(e,`formatFunction`),i=Object.prototype.hasOwnProperty.call(e,`duration`)||Object.prototype.hasOwnProperty.call(e,`framerate`)||Object.prototype.hasOwnProperty.call(e,`countFramerate`);this.options={...this.options,...e},this.options.duration??=t;let a=this.options.framerate??30,o=this.options.countFramerate??20;if(this._msPerFrame=1e3/a,this._countMsPerFrame=1e3/o,this.MAX_VALUES=this.options.duration/this._msPerFrame/2|0,l()&&this.el.style.setProperty(`--odometer-duration`,`${this.options.duration}ms`),r&&this.resetFormat(),n){this.update(this.options.value??0);return}(r||i)&&l()&&(this.stopWatchingMutations(),this.render(),this.startWatchingMutations())}static setGlobalOptions(e){f.options={...f.options,...e}}on(e,t){this.el.addEventListener(e,t)}off(e,t){this.el.removeEventListener(e,t)}getOptions(){return{...this.options}}static getGlobalOptions(){return{...f.options}}animateOnceAndDisconnect(e){e!=null&&this.update(e);let t=()=>this.disconnect(),n=e=>{this.el.removeEventListener(`odometerdone`,n),t()};this.el.addEventListener(`odometerdone`,n,{once:!0}),setTimeout(t,(this.options.duration??2e3)+100)}disconnect(){this.destroyed||=(this.stopWatchingMutations(),d(this._rafId),d(this._countRafId),this._onTransitionEnd&&=(this.el.removeEventListener(`transitionend`,this._onTransitionEnd),void 0),this.transitionEndBound=!1,!0)}toString(){let{el:e,...t}={...this.getOptions()},n={id:this.options.id,value:this.value,options:t,globalOptions:f.getGlobalOptions(),watchMutations:this.watchMutations,transitionEndBound:this.transitionEndBound,destroyed:this.destroyed,format:this.format,isAnimating:this.isAnimating};return JSON.stringify(n)}};p(h),m(h);export{h as LightOdometer,h as default};
package/package.json CHANGED
@@ -11,18 +11,22 @@
11
11
  ],
12
12
  "description": "for personal use only, see EDM115/website",
13
13
  "devDependencies": {
14
- "@stylistic/eslint-plugin": "~5.3.1",
15
- "@types/node": "latest",
16
- "@typescript-eslint/parser": "~8.44.0",
17
- "eslint": "~9.35.0",
18
- "oxlint": "~1.15.0",
19
- "oxlint-tsgolint": "~0.2.0",
20
- "tsdown": "~0.15.1",
21
- "typescript": "~5.9.2",
22
- "unplugin-unused": "~0.5.3"
14
+ "@stylistic/eslint-plugin": "~5.10.0",
15
+ "@typescript-eslint/parser": "~8.57.1",
16
+ "@typescript/native-preview": "latest",
17
+ "edm115-lint": "~0.2.0",
18
+ "eslint": "~10.1.0",
19
+ "jiti": "~2.6.1",
20
+ "oxlint": "~1.56.0",
21
+ "oxlint-tsgolint": "~0.17.1",
22
+ "tsdown": "~0.21.4",
23
+ "unplugin-unused": "~0.5.7"
23
24
  },
24
25
  "exports": {
25
- ".": "./dist/main.js",
26
+ ".": {
27
+ "types": "./dist/light-odometer.d.ts",
28
+ "import": "./dist/light-odometer.js"
29
+ },
26
30
  "./package.json": "./package.json"
27
31
  },
28
32
  "files": [
@@ -48,8 +52,6 @@
48
52
  ],
49
53
  "homepage": "https://github.com/EDM115/light-odometer#readme",
50
54
  "license": "MIT",
51
- "main": "./dist/main.js",
52
- "module": "./dist/main.js",
53
55
  "name": "light-odometer",
54
56
  "publishConfig": {
55
57
  "access": "public"
@@ -59,14 +61,13 @@
59
61
  "url": "git+https://github.com/EDM115/light-odometer.git"
60
62
  },
61
63
  "type": "module",
62
- "types": "./dist/main.d.ts",
63
- "version": "0.1.0",
64
+ "version": "0.1.2",
64
65
  "scripts": {
65
66
  "build": "tsdown",
66
67
  "format": "eslint -c eslint.stylistic.config.ts --concurrency=auto --fix .",
67
- "lint": "oxlint --type-aware .",
68
- "lint:fix": "oxlint --fix --type-aware .",
68
+ "lint": "oxlint",
69
+ "lint:fix": "oxlint --fix",
69
70
  "release": "pnpm publish",
70
- "typecheck": "tsc --noEmit"
71
+ "typecheck": "tsgo --noEmit"
71
72
  }
72
73
  }
package/dist/main.js DELETED
@@ -1 +0,0 @@
1
- const e=/^\(?([^)]*)\)?(?:(.)(d+))?$/,t=2e3;function n(e){"@babel/helpers - typeof";return n=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},n(e)}function r(e,t){if(n(e)!=`object`||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var i=r.call(e,t||`default`);if(n(i)!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function i(e){var t=r(e,`string`);return n(t)==`symbol`?t:t+``}function a(e,t,n){return(t=i(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?o(Object(n),!0).forEach(function(t){a(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function c(e){let t=document.createElement(`div`);if(t.innerHTML=e,!(t.firstElementChild instanceof HTMLElement))throw Error(`Invalid HTML: No valid root element found.`);return t.firstElementChild}function l(e,t){let n=t.split(` `);for(let t of n)e.classList.remove(t);return e.className}function u(e,t){let n=t.split(` `);for(let t of n)t&&e.classList.add(t);return e.className}function d(e,t,n){let r=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(r)}function f(){return typeof performance<`u`&&typeof performance.now==`function`?performance.now():Date.now()}function p(e,t){return t!=null||(t=0),t?(e*=10**t,e+=.5,e=Math.floor(e),e/=10**t):Math.round(e)}function m(e){return e<0?Math.ceil(e):Math.floor(e)}function h(){return typeof window<`u`&&typeof document<`u`}function g(e){return h()&&typeof requestAnimationFrame==`function`?requestAnimationFrame(e):setTimeout(()=>e(f()),16)}function _(e){e!=null&&(h()&&typeof cancelAnimationFrame==`function`&&typeof e==`number`?cancelAnimationFrame(e):clearTimeout(e))}function v(e){h()&&(document.readyState===`complete`||document.readyState===`interactive`?setTimeout(e,0):document.addEventListener(`DOMContentLoaded`,e,{once:!0}))}function y(e){h()&&setTimeout(()=>{window.odometerOptions&&(e.options=s(s({},e.options),window.odometerOptions))},0)}function b(e){v(()=>{e.options.auto!==!1&&e.init()})}function x(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}function S(e,t){if(e==null)return{};var n,r,i=x(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.includes(n)||{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}const C=[`el`];var w,T=class n{get isAnimating(){return this._isAnimating}constructor(e){var r,i,o,c;if(a(this,`_isAnimating`,!1),a(this,`options`,void 0),a(this,`el`,void 0),a(this,`value`,0),a(this,`inside`,void 0),a(this,`observer`,void 0),a(this,`watchMutations`,!1),a(this,`transitionEndBound`,!1),a(this,`destroyed`,!1),a(this,`format`,{repeating:``,precision:0}),a(this,`MAX_VALUES`,void 0),a(this,`digits`,[]),a(this,`ribbons`,{}),a(this,`_rafId`,void 0),a(this,`_countRafId`,void 0),a(this,`_msPerFrame`,void 0),a(this,`_countMsPerFrame`,void 0),a(this,`_onTransitionEnd`,void 0),this.options=e,this.el=this.options.el,this.el.odometer){var l,u,d;let e=this.el.odometer;e.options=s(s({},e.options),this.options),(l=e.options).duration!=null||(l.duration=t);let n=(u=e.options.framerate)==null?30:u,r=(d=e.options.countFramerate)==null?20:d;return e._msPerFrame=1e3/n,e._countMsPerFrame=1e3/r,e.MAX_VALUES=e.options.duration/e._msPerFrame/2|0,e.resetFormat(),this.options.value==null?h()&&e.render():e.update(this.options.value),e}this.el.odometer=this,this.options=s(s({},n.options),this.options),(r=this.options).duration!=null||(r.duration=t);let f=(i=this.options.framerate)==null?30:i,p=(o=this.options.countFramerate)==null?20:o;this._msPerFrame=1e3/f,this._countMsPerFrame=1e3/p,this.MAX_VALUES=this.options.duration/this._msPerFrame/2|0,this.resetFormat(),this.value=this.cleanValue((c=this.options.value)==null?``:c),h()&&(this.renderInside(),this.render());try{for(let e of[`innerHTML`,`innerText`,`textContent`])Object.defineProperty(this.el,e,{get:()=>{if(e===`innerHTML`){var t,n;return(t=(n=this.inside)==null?void 0:n.outerHTML)==null?``:t}else{var r,i,a,o;return(r=(i=(a=this.inside)==null?void 0:a.innerText)==null?(o=this.inside)==null?void 0:o.textContent:i)==null?``:r}},set:e=>this.update(e)})}catch(e){h()&&this.watchForMutations()}}renderInside(){h()&&(this.inside=document.createElement(`div`),this.inside.className=`odometer-inside`,this.el.textContent=``,this.el.appendChild(this.inside))}watchForMutations(){try{this.observer!=null||(this.observer=new MutationObserver(e=>{let t=this.el.innerText||``;this.renderInside(),this.render(this.value),this.update(t)})),this.watchMutations=!0,this.startWatchingMutations()}catch(e){}}startWatchingMutations(){if(this.watchMutations&&h()){var e;(e=this.observer)==null||e.observe(this.el,{childList:!0})}}stopWatchingMutations(){var e;(e=this.observer)==null||e.disconnect()}cleanValue(e){if(typeof e==`string`){var t;e=e.replace((t=this.format.radix)==null?`.`:t,`<radix>`),e=e.replace(/[.,\s\u00A0\u202F]/g,``),e=e.replace(`<radix>`,`.`),e=parseFloat(e)||0}return p(e,this.format.precision)}bindTransitionEnd(){if(this.transitionEndBound)return;this.transitionEndBound=!0;let e=!1;this._onTransitionEnd=()=>e?!0:(e=!0,setTimeout(()=>{this.render(),e=!1,this._isAnimating=!1,d(this.el,`odometerdone`,{id:this.options.id,el:this.el,instance:this,value:this.value,options:this.getOptions()})},0),!0),this.el.addEventListener(`transitionend`,this._onTransitionEnd,!1)}resetFormat(){var t;let n=(t=this.options.format)==null?`(,ddd).dd`:t;n=n||`d`;let r=e.exec(n);if(!r)throw Error(`LightOdometer: Unparsable digit format`);let[i,a,o,s]=r,c=(s==null?void 0:s.length)||0;this.format={repeating:a,radix:o,precision:c}}render(e){var n;if(h()){e!=null||(e=this.value),this.stopWatchingMutations(),this.resetFormat(),this.inside.textContent=``;for(let e of Array.from(this.el.classList))/^odometer(-|$)/.test(e)&&this.el.classList.remove(e);this.el.classList.add(`odometer`,`odometer-auto-theme`),this.el.style.setProperty(`--odometer-duration`,`${(n=this.options.duration)==null?t:n}ms`),this.ribbons={},this.formatDigits(e),this.startWatchingMutations()}}formatDigits(e){if(this.digits=[],this.options.formatFunction){let t=this.options.formatFunction(e);for(let e of t.split(``).toReversed())if(/\d/.test(e)){let t=this.renderDigit(),n=t.querySelector(`.odometer-value`);n.textContent=e,u(n,`odometer-first-value odometer-last-value`),this.digits.push(t),this.insertDigit(t)}else this.addSpacer(e)}else{let t=this.preservePrecision(e),n=!this.format.precision;for(let e of t.split(``).toReversed())e===`.`&&(n=!0),this.addDigit(e,n)}}preservePrecision(e){let t=e.toString();if(this.format.precision){let e=t.split(`.`);e.length===1&&(t+=`.`,e[1]=``);for(let n=0;n<this.format.precision;n++)e[1][n]||(t+=`0`)}return t}update(e){if(!h())return this.value=this.cleanValue(e),this.value;e=this.cleanValue(e);let t=e-this.value;return t?(l(this.el,`odometer-animating-up odometer-animating-down odometer-animating`),t>0?u(this.el,`odometer-animating-up`):u(this.el,`odometer-animating-down`),this._isAnimating=!0,d(this.el,`odometerstart`,{id:this.options.id,el:this.el,instance:this,value:e,oldValue:this.value,options:this.getOptions()}),this.stopWatchingMutations(),this.animate(e),this.startWatchingMutations(),setTimeout(()=>{this.el.offsetHeight,u(this.el,`odometer-animating`)},0),this.value=e,this.value):this.value}renderDigit(){return c(`<span class="odometer-digit"><span class="odometer-digit-spacer">8</span><span class="odometer-digit-inner"><span class="odometer-ribbon"><span class="odometer-ribbon-inner"><span class="odometer-value"></span></span></span></span></span>`)}insertDigit(e,t){return t?this.inside.insertBefore(e,t):this.inside.children.length?this.inside.insertBefore(e,this.inside.children[0]):this.inside.appendChild(e)}addSpacer(e,t,n){let r=c(`<span class="odometer-formatting-mark"></span>`);return r.textContent=e,n&&u(r,n),this.insertDigit(r,t)}addDigit(e,t){if(t!=null||(t=!0),e===`-`)return this.addSpacer(e,null,`odometer-negation-mark`);if(e===`.`){var n;return this.addSpacer((n=this.format.radix)==null?`.`:n,null,`odometer-radix-mark`)}if(t){let e=!1;for(;;){if(!this.format.repeating.length){if(e)throw Error(`Bad odometer format without digits`);this.resetFormat(),e=!0}let t=this.format.repeating[this.format.repeating.length-1];if(this.format.repeating=this.format.repeating.substring(0,this.format.repeating.length-1),t===`d`)break;this.addSpacer(t)}}let r=this.renderDigit(),i=r.querySelector(`.odometer-value`);return i.textContent=e,u(i,`odometer-first-value odometer-last-value`),this.digits.push(r),this.insertDigit(r)}animate(e){this.options.animation===`count`?this.animateCount(e):this.animateSlide(e)}animateCount(e){if(!h())return;let t=e-this.value;if(!t)return;let n=f(),r=n,i=this.value,a=()=>{if(f()-n>(this.options.duration||0)){this.value=e,this.render(),this._isAnimating=!1,d(this.el,`odometerdone`,{id:this.options.id,el:this.el,instance:this,value:this.value,options:this.getOptions()});return}let o=f()-r;if(o>this._countMsPerFrame){r=f();let e=o/(this.options.duration||0),n=t*e;i+=n,this.render(Math.round(i))}this._countRafId=g(a)};this._countRafId=g(a)}getDigitCount(...e){for(let t=0;t<e.length;t++)e[t]=Math.abs(e[t]);let t=Math.max(...e);return Math.ceil(Math.log(t+1)/Math.log(10))}getFractionalDigitCount(...e){let t=/^-?\d*\.(\d*?)0*$/;for(let n=0;n<e.length;n++){let r=e[n].toString(),i=t.exec(r);e[n]=i?i[1].length:0}return Math.max(...e)}resetDigits(){this.digits=[],this.ribbons={},this.inside.textContent=``,this.resetFormat()}createRange(e,t,n){let r=e<t,i=Math.abs(t-e)+(n?1:0);return Array.from({length:i},(t,n)=>r?e+n:e-n)}animateSlide(e){if(!h())return;let t=this.value,n=this.format.precision;n&&(e*=10**n,t*=10**n);let r=e-t;if(!r)return;this.bindTransitionEnd();let i=[],a=this.getDigitCount(t,e),o=0,s=t;for(let n=0;n<a;n++){s=m(t/10**(a-n-1));let r=m(e/10**(a-n-1)),c=r-s,l;if(Math.abs(c)>this.MAX_VALUES){l=[];let e=this.MAX_VALUES*(1+o*.5),t=c/e,n=s;for(;c>0&&n<r||c<0&&n>r;)l.push(Math.round(n)),n+=t;l[l.length-1]!==r&&l.push(r),o++}else l=this.createRange(s,r,!0);for(let e=0;e<l.length;e++)l[e]=Math.abs(l[e]%10);i.push(l)}this.resetDigits();let c=i.toReversed();for(let e=0;e<c.length;e++){let t=c[e];if(this.digits[e]||this.addDigit(` `,e>=n),this.ribbons[e]===void 0){let t=this.digits[e].querySelector(`.odometer-ribbon-inner`);t&&(this.ribbons[e]=t)}this.ribbons[e].textContent=``,r<0&&(t=t.toReversed());for(let n=0;n<t.length;n++){let r=t[n],i=document.createElement(`div`);i.className=`odometer-value`,i.textContent=r.toString(),this.ribbons[e].appendChild(i),n===t.length-1&&u(i,`odometer-last-value`),n===0&&u(i,`odometer-first-value`)}}s<0&&this.addDigit(`-`);let l=this.inside.querySelector(`.odometer-radix-mark`);if(l&&l.parentNode.removeChild(l),n){var d;this.addSpacer((d=this.format.radix)==null?`.`:d,this.digits[n-1],`odometer-radix-mark`)}}static init(){if(!h())return[];let e=document.querySelectorAll(n.options.selector||`.odometer`);return Array.from(e,e=>{var t;return e.odometer=new n({el:e,value:(t=e.innerText)==null?e.textContent:t})})}setOptions(e){var n,r,i;if(!e||typeof e!=`object`)return;`el`in e&&delete e.el;let a=Object.prototype.hasOwnProperty.call(e,`value`),o=Object.prototype.hasOwnProperty.call(e,`format`)||Object.prototype.hasOwnProperty.call(e,`formatFunction`),c=Object.prototype.hasOwnProperty.call(e,`duration`)||Object.prototype.hasOwnProperty.call(e,`framerate`)||Object.prototype.hasOwnProperty.call(e,`countFramerate`);this.options=s(s({},this.options),e),(n=this.options).duration!=null||(n.duration=t);let l=(r=this.options.framerate)==null?30:r,u=(i=this.options.countFramerate)==null?20:i;if(this._msPerFrame=1e3/l,this._countMsPerFrame=1e3/u,this.MAX_VALUES=this.options.duration/this._msPerFrame/2|0,h()&&this.el.style.setProperty(`--odometer-duration`,`${this.options.duration}ms`),o&&this.resetFormat(),a){var d;this.update((d=this.options.value)==null?0:d);return}(o||c)&&h()&&(this.stopWatchingMutations(),this.render(),this.startWatchingMutations())}static setGlobalOptions(e){n.options=s(s({},n.options),e)}on(e,t){this.el.addEventListener(e,t)}off(e,t){this.el.removeEventListener(e,t)}getOptions(){return s({},this.options)}static getGlobalOptions(){return s({},n.options)}animateOnceAndDisconnect(e){var n;e!=null&&this.update(e);let r=()=>this.disconnect(),i=e=>{this.el.removeEventListener(`odometerdone`,i),r()};this.el.addEventListener(`odometerdone`,i,{once:!0}),setTimeout(r,((n=this.options.duration)==null?t:n)+100)}disconnect(){this.destroyed||(this.stopWatchingMutations(),_(this._rafId),_(this._countRafId),this._onTransitionEnd&&(this.el.removeEventListener(`transitionend`,this._onTransitionEnd),this._onTransitionEnd=void 0),this.transitionEndBound=!1,this.destroyed=!0)}toString(){let e=s({},this.getOptions()),{el:t}=e,r=S(e,C),i={id:this.options.id,value:this.value,options:r,globalOptions:n.getGlobalOptions(),watchMutations:this.watchMutations,transitionEndBound:this.transitionEndBound,destroyed:this.destroyed,format:this.format,isAnimating:this.isAnimating};return JSON.stringify(i)}};a(T,`options`,typeof window<`u`?(w=window.odometerOptions)==null?{}:w:{}),y(T),b(T);var E=T;export{E as default};