diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 69465d6..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: ci-docs -on: - push: - branches: - - main -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 - with: - python-version: 3.x - - run: pip install mkdocs-material - - run: mkdocs gh-deploy --force diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 79152e0..0000000 --- a/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.cache -*.mm - -.idea diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..2bf464d --- /dev/null +++ b/404.html @@ -0,0 +1,1453 @@ + + + + + + + + + + + + + + + + + + + + + + + AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/About/about/index.html b/About/about/index.html new file mode 100644 index 0000000..6fc533f --- /dev/null +++ b/About/about/index.html @@ -0,0 +1,1561 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + About - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Credits

+

Thanks to all the contributors over the years for making AutoNumeric a reality!

+

Authors

+

You can find a list of the contributors here and there.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/About/documention license/index.html b/About/documention license/index.html new file mode 100644 index 0000000..4273047 --- /dev/null +++ b/About/documention license/index.html @@ -0,0 +1,1835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Documentation - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

AutoNumeric Documentation License

+

Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License

+

By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.

+

Section 1 – Definitions.

+

a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.

+

b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.

+

c. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.

+

d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.

+

e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.

+

f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.

+

g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike.

+

h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.

+

i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.

+

h. Licensor means the individual(s) or entity(ies) granting rights under this Public License.

+

i. NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.

+

j. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.

+

k. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.

+

l. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.

+

Section 2 – Scope.

+

a. License grant.

+
    +
  1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
  2. +
+

A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and

+

B. produce, reproduce, and Share Adapted Material for NonCommercial purposes only.

+
    +
  1. +

    Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.

    +
  2. +
  3. +

    Term. The term of this Public License is specified in Section 6(a).

    +
  4. +
  5. +

    Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.

    +
  6. +
  7. +

    Downstream recipients.

    +
  8. +
+

A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.

+

B. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.

+

C. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.

+
    +
  1. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
  2. +
+

b. Other rights.

+
    +
  1. +

    Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.

    +
  2. +
  3. +

    Patent and trademark rights are not licensed under this Public License.

    +
  4. +
  5. +

    To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.

    +
  6. +
+

Section 3 – License Conditions.

+

Your exercise of the Licensed Rights is expressly made subject to the following conditions.

+

a. Attribution.

+
    +
  1. If You Share the Licensed Material (including in modified form), You must:
  2. +
+

A. retain the following if it is supplied by the Licensor with the Licensed Material:

+

i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);

+

ii. a copyright notice;

+

iii. a notice that refers to this Public License;

+

iv. a notice that refers to the disclaimer of warranties;

+

v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;

+

B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and

+

C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.

+
    +
  1. +

    You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.

    +
  2. +
  3. +

    If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.

    +
  4. +
+

b. ShareAlike.

+

In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.

+
    +
  1. +

    The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License.

    +
  2. +
  3. +

    You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.

    +
  4. +
  5. +

    You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.

    +
  6. +
+

Section 4 – Sui Generis Database Rights.

+

Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:

+

a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;

+

b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and

+

c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.

+

For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.

+

Section 5 – Disclaimer of Warranties and Limitation of Liability.

+

a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.

+

b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.

+

c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.

+

Section 6 – Term and Termination.

+

a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.

+

b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:

+
    +
  1. +

    automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or

    +
  2. +
  3. +

    automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or

    +
  4. +
+

For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.

+

c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.

+

d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.

+

Section 7 – Other Terms and Conditions.

+

a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.

+

b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.

+

Section 8 – Interpretation.

+

a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.

+

b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.

+

c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.

+

d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/About/license/index.html b/About/license/index.html new file mode 100644 index 0000000..bd6cbd8 --- /dev/null +++ b/About/license/index.html @@ -0,0 +1,1580 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Public license - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

License

+

AutoNumeric is an MIT-licensed open source project, and its authors are credited in AUTHORS. Check here for more information.

+

MIT License

+

Copyright © 2016-2023 Alexandre Bonneau alexandre.bonneau@linuxfr.eu and contributors
+Copyright © 2009-2016 Robert J. Knothe bob@decorplanit.com and contributors

+

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, sub license, 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:

+

The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software.

+

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/docs/CNAME b/CNAME similarity index 100% rename from docs/CNAME rename to CNAME diff --git a/Changelog/CHANGELOG/index.html b/Changelog/CHANGELOG/index.html new file mode 100644 index 0000000..37bb97b --- /dev/null +++ b/Changelog/CHANGELOG/index.html @@ -0,0 +1,7435 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelog - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Changelog

+ +

Changelog for AutoNumeric

+

v4

+

4.8.1

+
    +
  • Fixes #763 Copyright banner in the minimized distribution file is undefined
  • +
  • Removes unused wdio script from package.json
  • +
+

4.8.0

+
    +
  • Adds #709 Feature request: Disallow toggling the negative/positive sign with '+' and '-' keypress
  • +
  • This adds a new option negativePositiveSignBehavior for the managing the '-' and '+' key behavior
  • +
  • Setting negativePositiveSignBehavior to true will allow the toggling, while setting it to false will disable it; this means that when hitting the '-' key, the value will always be set to its negative value, and hitting the '+' key will always set the element to its positive value (given the minimum and maximum value allows this)
  • +
  • Do note that the default behavior is changed in this version, where toggling between the positive and negative value with the '-' or '+' keys is not activated by default. If you want to use the previous behavior, please set negativePositiveSignBehavior: AutoNumeric.options.negativePositiveSignBehavior.toggle in your options' configuration.
  • +
  • Updates the existing end-to-end tests that relied on the toggle behavior
  • +
  • Fixes the incorrect error message when setting an invalid positiveSignCharacter option
  • +
  • Attempts to fix the 'node: 18' error from Travis CI
  • +
+

4.7.0

+
    +
  • Fixes #719 Feature request: Up and down arrow keys behavior matching standard number input
  • +
  • Adds 2 new options to control how the up and down arrow keys behave: modifyValueOnUpDownArrow and upDownStep
  • +
+

4.6.3

+
    +
  • Fixes #721 AutoNumeric.set() breaks internal state when string-value has leading or trailing whitespace
  • +
  • Fixes all the remaining end-to-end tests with the latest Webdriver.io version
  • +
  • Removes the remnants of PhantomJS hacks (#384)
  • +
  • Updates the Travis CI configuration
  • +
  • Fixes the caret positioning in some specific cases
  • +
  • Fixes the lint issues in the wdio config file
  • +
  • Fixes the webpack production config to correctly generate gzipped dist files
  • +
+

4.6.2

+
    +
  • Fixes issue #757 Converted scientific numbers returns NaN when using formArrayNumericString()
  • +
  • Fixes warning messages in the IDE
  • +
+

4.6.1

+
    +
  • Updates all the dependencies
  • +
  • Removes the PhantomJS dependency in favor of Puppeteer
  • +
  • Fixes and cleans the Karma configuration files to support v6.4.1
  • +
  • Fixes and cleans the Webpack configuration files to support v5.75.0
  • +
  • Fixes the failing unit tests on the validate() function for the allowDecimalPadding option
  • +
  • Updates the Webdriverio configuration to v8
  • +
  • Updates the Webdriver end-to-end tests to v8, i.e. removing the @wdio/sync package in favor of using async/await everywhere, and updating all the keys() calls to use the Webdriver Key object, and arrays of individual characters
  • +
  • Adds unit tests for feature request #741
  • +
  • Completes the validate() function with additional tests for the new allowDecimalPadding option as a number
  • +
  • Fixes #761 Undo and redo actions are done twice, on Z and Control KeyUp events
  • +
  • Fixes missing variable update in #739 (this.onGoingRedo)
  • +
  • Fixes the warning message when a faulty styleRules callback is passed as a parameter
  • +
  • Fixes typos and grammar in comments
  • +
  • Fixes #734 Fire change event onBlur only if number is changed (#735)
  • +
  • Fixes #753 Correct invalid JS imports
  • +
  • Fixes #758 Adding missing predefined options to typescript interface file
  • +
  • Update the readme with the new documentation website
  • +
  • Fixes #739 Add CTRL+Y shortcut for redo
  • +
  • Fixes the currency symbol for Brazilian real
  • +
  • Fixes #697 Currency can be deleted (#725)
  • +
  • Updates the README related to PR #742
  • +
  • Fixes #741 + Ability to set a numeric allowDecimalPadding (#742)
  • +
  • Adds default export to modules (#747)
  • +
  • Fixes #737 Undo/redo not firing input event
  • +
  • Fixes #684 Caret always set far right when deleting or inserting numbers using $ (#716)
  • +
  • Fixes unit tests following the changes in v4.6.0
  • +
+

4.6.0

+
    +
  • Adds a new option invalidClass, which default to an-invalid, that defines the CSS class name to use when a contenteditable-enabled element value is invalid
  • +
  • Adds a new option value 'invalid' for the overrideMinMaxLimits option, that will allow users to enter out-of-bound numbers
  • +
  • Fixes #543 Allow users to enter out-of-bound numbers, outside of the minimumValue and maximumValue range
  • +
  • This allows users to type temporary invalid numbers when the minimumValue is superior to 0, or the maximumValue is inferior to 0
  • +
  • While in this out-of-bound state, the element validity status is set to invalid
  • +
  • Users can then target the CSS :invalid and/or :valid state as they wish to display a visual feedback as needed
  • +
  • Do note that contenteditable-enabled elements cannot have a validity state set, so AutoNumeric instead sets by default the an-invalid CSS class on such 'invalid' elements
  • +
  • Whenever the user type an invalid number (out of range), the new 'autoNumeric:invalidValue' event is sent. When the value is corrected, the new 'autoNumeric:correctedValue' event is sent.
      +
    • Beware; To reduce complexity, the 'autoNumeric:invalidValue' event as well as the 'autoNumeric:minExceeded' or 'autoNumeric:maxExceeded' events are now sent up to three times for a single input; on keypress, keyup and blur
    • +
    +
  • +
  • From now on, whenever the user sets a minimumValue higher than 0, or a maximumValue lower than 0, a warning will be displayed in the console telling him to perhaps use the overrideMinMaxLimits invalid option. For information, the overrideMinMaxLimits doNotOverride is still the default behavior.
  • +
  • Simplify the min and max range tests with the new private _isWithinRangeWithOverrideOption() function
  • +
  • Fixes the bug where you could always clear the input even if the limit were preventing you to do so (the last valid value was then set back on blur). Now AutoNumeric correctly prevents you to clear the input if the resulting value is out-of-bound.
  • +
  • Fixes #676 36 errors in index.d.ts when using with typescript
  • +
  • TypeScript users should now remove the declare module 'autonumeric'; line from their script (cf. PR #677)
  • +
  • Removes node 6 from the CI tests (cf. PR #678)
  • +
  • Fixes the detection of wheel events when using a touchpad/trackball (cf. PR #672)
  • +
+

4.5.13

+
    +
  • Fixes #675 The caret position is wrongly positioned when setting the raw value to zero on numbers with a prefix currency symbol (The bug was introduced in v4.5.9 with the fix for #647)
  • +
+

4.5.12

+
    +
  • Synchronizes the AutoNumeric version with the published npm one
  • +
+

4.5.11

+
    +
  • Adds a typescript definitions file to the library
  • +
  • Fixes some errors in the typescript definitions file and fixes the indentation
  • +
+

4.5.10

+
    +
  • Fixes #656 Input value will undo on focusout when using only Ctrl+Backspace
  • +
+

4.5.9

+
    +
  • Fixes #647 Caret position is incorrectly set when the currencySymbol in prefix position contains the first value entered (ie. a numeric value)
  • +
+

4.5.8

+
    +
  • Fixes #652 On initialization, allowDecimalPadding option 'floats' does not hide the decimal zeroes if set in the html attribute
  • +
+

4.5.7

+
    +
  • Fixes #621 The autoNumeric:formatted event should be triggered when the input field is cleared while continuously pressing the Backspace or Delete keys (for real this time, see v4.5.2)
  • +
+

4.5.6

+
    +
  • Fix #602 Numpad decimal separator does not work on IE11 with a keyboard whose numpad decimal key outputs a comma
  • +
  • Adds a reference for the Angular 4+ implementation ng-angular component in the README
  • +
+

4.5.5

+
    +
  • Update the dev dependencies, fix the unit and end-to-end tests
  • +
  • Update the Babel version and fix the related configuration files
  • +
  • Update the Karma version and fix the related configuration files
  • +
  • Update the Webdriver.io version and fix the related configuration files
  • +
  • Update the Webpack version and fix the related configuration files
  • +
+

4.5.4

+
    +
  • Fixes #626 Missing the \u0092 digit group separator
  • +
+

4.5.3

+
    +
  • Fixes #622 freezeOptions() can create issues in some browsers
  • +
+

4.5.2

+
    +
  • Fixes #621 The autoNumeric:formatted event should be triggered when the input field is cleared while continuously pressing the Backspace or Deletekeys
  • +
+

4.5.1

+
    +
  • Fixes #611 The html readonly attribute is ignored on initial load
  • +
  • Fix how readonly and disabled inputs should not process keyboard events
  • +
  • Fix the formula mode so that the custom decimal character set with decimalCharacter is used instead of the default '.' character when writing float numbers
  • +
+

4.5.0

+
    +
  • Closes #542 Allow basic calculations when entering expressions like =12*78
  • +
  • Introduces the formula mode which allows a user to enter a math expression in the element using the = key, then evaluate it with the Enter one
  • +
  • Adds the formulaMode option, set to false by default, that controls if the formula mode is enabled
  • +
  • Adds the Lexer, Parser, Evaluator, ASTNode and Token classes for managing math expressions
  • +
  • Fixes #612 Dist files contain eval
  • +
  • The webpack devtool option for the development configuration has been changed from cheap-module-eval-source-map to cheap-source-map; + This removes any eval() from the generated dist/autoNumeric.js file, and makes the source maps works in all cases in the browsers
  • +
  • Merge the changes from 4.4.1 while making sure there is no regression with #609; this adds the browser field alongside the main one in package.json
  • +
  • Note: The browser option points to the minified library dist/autoNumeric.min.js
  • +
  • Update the index.html test file to use the un-minified development library dist/autoNumeric.js + This allows to temporarily use forbidden functions like console or wrong formatting while debugging, using yarn build:dev
  • +
  • Fixes a call to _reformatAltHovered() even when the unformatOnHover option was set to false
  • +
+

4.4.3

+
    +
  • Fixes #598 The unformatOnHover config value isn't used when set to false
  • +
+

4.4.2

+
    +
  • Fixes #609 Uncaught Error: Cannot find module 'autonumeric' on v4.4.1
  • +
  • Reverts the changes from 4.4.1 : "Modify the package.json configuration main field to browser"
  • +
+

4.4.1

+
    +
  • Modify the package.json configuration main field to browser
  • +
  • This is useful per npm's documentation when the module is using browser-specific features like the window object
  • +
+

4.4.0

+
    +
  • Closes #476 Add a feature where emptyInputBehavior could be set to the minimum or maximum value
  • +
  • emptyInputBehavior now accepts either a number (or a string representing a number), or the 'min' or 'max' option
  • +
  • Fix the emptyInputBehavior validation test when checking the value limits
  • +
  • Fixes #579 Allow emptyInputBehavior to be set to min, max, or a number
  • +
+

4.3.7

+
    +
  • Fixes #594 Currency at wrong position for empty fields with euro/french preset after typing minus sign
  • +
  • Fixes #565 Entering a single minus character in a negativeBracketsTypeOnBlur input invert the currency sign and that minus sign
  • +
+

4.3.6

+
    +
  • Fixes #219 'Bug on form reset' that was re-opened
  • +
  • AutoNumeric now listens to the reset event on the parent form, and react accordingly if detected
  • +
+

4.3.5

+
    +
  • Really fixes issue #596 this time
  • +
+

4.3.4

+
    +
  • Fixes #596 Change event not firing depending on cursor movement
  • +
+

4.3.3

+
    +
  • Fixes #593 Pasting a negative value over a negative value that as a currency symbol and its numbers selected throws an error
  • +
  • Refactor the _onPaste() handler by removing duplicated parts
  • +
  • Fix the initialization call new AutoNumeric() where using as arguments a string (element selector), a number (initial value) and an array (array of options), in that particular order, would not be recognized
  • +
+

4.3.2

+
    +
  • Fixes #589 The percentageUS* predefined options do not have the rawValueDivisor option set
  • +
+

4.3.1

+
    +
  • Modify the tenTrillions and oneBillion limits to be exact
  • +
  • Remove the maximumValue and minimumValue tenTrillionsNoDecimals option, and update tenTrillions so that it equals ten trillions
  • +
  • The tenTrillions sub-option is now equal to '10000000000000', and the oneBillion sub-option is now equal to '1000000000'
  • +
  • This change was long overdue since we modified in v4.0.0-beta.22 how the number of decimal places was defined by the user using the decimalPlaces options instead of adding a specific number of decimal to the min/max values.
  • +
+

4.3.0

+
    +
  • Fixes #559 Allow AutoNumeric to accept the decimal character input even when there is already one in the element
  • +
  • Add the new alwaysAllowDecimalCharacter option set to false by default
  • +
  • Fixes AutoNumeric so that elements now correctly accepts entering a decimal char on the far left of a negative number
  • +
+

4.2.15

+
    +
  • Fixes #585 Internet Explorer 11 throws when freezing the options
  • +
+

4.2.14

+
    +
  • Fixes #526 Memory / speed improvement in options
  • +
  • Fixes #583 AutoNumeric v4.2.13 forces the contenteditable attribute to true when set on the html source
  • +
  • Fixes #584 Event listeners are not set/reset on option updates
  • +
+

4.2.13

+
    +
  • Fixes #580 Allow non-input tags with the readOnly option to set the contenteditable attribute to false
  • +
  • Fix the readonly and contenteditable attributes so that they can be updated to read/write mode
  • +
  • Modify _setReadOnly() so that it always sets the element to read-only mode
  • +
  • Create a new _setReadWrite() function that sets the element to read-write mode
  • +
  • Create a new _setWritePermissions() function that sets the element read only/write mode according to the readOnly setting
  • +
  • Fix the urls to autonumeric.org in the readme
  • +
+

4.2.12

+
    +
  • Fixes #574 The fractional part is converted to an integer if the part on the cursor left-hand side is equal to 0
  • +
+

4.2.11

+
    +
  • Fixes #570 The minified version of AutoNumeric does not expose some of its static functions (ie. AutoNumeric.getNumber())
  • +
  • Removing the standard Function.name feature fixes the bug in IE now. In the near future IE users will need to require a polyfill for this.
  • +
  • Reduce the size of the generated library by tuning the UglifyJs options
  • +
  • Fix the end-to-end tests so that they are run against AutoNumeric's minified version
  • +
+

4.2.10

+
    +
  • Fix various bugs regarding the incorrect static and instantiated function calls
  • +
  • Fix the polyfill so that Array.from() is correctly 'polyfilled' even if the CustomEvent object already exists
  • +
  • Fix the CustomEvent polyfill
  • +
  • Merges PR #572 Use AutoNumericHelper.contains() instead of String.includes() for the time being
  • +
  • Update the dev dependencies
  • +
  • Update the babel preset from latest to env
  • +
+

4.2.9

+
    +
  • Fixes #568 Using brackets for negative numbers in AutoNumeric.format returns "undefined"
  • +
+

4.2.8

+
    +
  • Fixes #566 Add the Turkish predefined currency
  • +
+

4.2.7

+
    +
  • Fixes #521 The input event is not fired on paste if the element is empty or is completely selected beforehand
  • +
  • Fixes #563 The import AutoNumeric from 'AutoNumeric' line in the readme does not work on case sensitive OS (like Linux)
  • +
+

4.2.6

+
    +
  • Fixes #561 Webpack bundles the already compiled library when imported in another project
  • +
+

4.2.5

+
    +
  • Fix issue #550 The change event is sent twice on change
  • +
  • Fix the bug when an input with the negativeBracketsTypeOnBlur options was focused then blurred, it would dispatch a change event.
  • +
+

4.2.4

+
    +
  • Fix issue #558 Switch the webpack 4
  • +
+

4.2.3

+
    +
  • Fix issue #556 Modify the update() function so that it can accept an array of options
  • +
+

4.2.2

+
    +
  • Fix issue #555 The update() function does not accept predefined option names (ie. 'euro')
  • +
+

4.2.1

+
    +
  • Fix issue #553 Missing support for very small or very big numbers displayed by Javascript as scientific numbers
  • +
  • This adds support for using scientific notation for setting the input value (ie. aNInput.set('6.1349392e-13');, <input value="7342.561e40">)
  • +
+

4.2.0

+
    +
  • Fix issue #535 Prevent entering any decimal character when only positive numbers are accepted
  • +
  • Change how the decimal character can be entered:
  • +
  • Before, the comma ',' and dot '.' where always accepted
  • +
  • Now, only the characters defined in decimalCharacter and decimalCharacterAlternative are accepted
  • +
+

4.1.3

+
    +
  • Fix the .travis.yml file so that the dist file are built on the CI server
  • +
+

4.1.2

+
    +
  • Fix the .npmignore file so that the npm autonumeric package can be installed
  • +
+

4.1.1

+
    +
  • Fix issue #554 Automatize the build and publishing process of releases with Travis CI
  • +
  • Remove the generated files from the git repository
  • +
  • Instead of polluting the repo with the dist/* files that can be generated using yarn build, those files are now generated and published to npm automatically when tagging a commit.
  • +
+

4.1.0

+
    +
  • Release v4.1.0
  • +
+

The highlights of this version are: ++ New features + + AutoNumeric static functions can now be used in web workers (#494) + + Add the new valuesToStrings option to allow displaying a pre-defined string depending on the rawValue (#450) + + Allow the positive & negative signs to be specified via the two options positiveSignCharacter and negativeSignCharacter (#478) + + Add more details to the 'autoNumeric:formatted' event payload (#485) + + Add a new event hook autoNumeric:rawValueModified that will be sent only when the rawValue is modified (#488) + + Add a new custom AutoNumeric event 'autoNumeric:initialized' sent as soon as an AutoNumeric element is initialized + + Add the static set and get* functions that will allow setting the given DOM element on getting its value without having a reference to its AutoNumeric object (#515) + + Add support for watching external changes when setting the input value directly with Javascript without using the set() method (Note: watching the external changes from textContent is not yet supported) (#513) + + Add the new option watchExternalChanges (set to false by default) that defines if the AutoNumeric object should watch and react to external changes (not made via .set()) + + Add the new option wheelOn that defines when we should be listening to the wheel event, either on 'hover' or on 'focus' (#456) ++ Changes + + Change the modifyValueOnWheel default behaviour to act only when the element is focused. If you want to be able to use the mouse wheel on a non-focused AutoNumeric element, you'll now need to press the Shift key while doing so. You can change that behavior back like it was before by setting the new option wheelOn to hover (#456) + + Allow changing the bubble and cancelable attributes of events sent by AutoNumeric. This adds two new options eventBubbles and eventIsCancelable that defaults to true to manage those event attributes (#524) + + Modify the static getAutoNumericElement(), test() and isManagedByAutoNumeric() functions so that they accept either a DOM element or a selector string (#514) + + When the rawValue is allowed to be null and is effectively null, the min/max limits are now ignored + + Form serialization now outputs the empty string '' on empty inputs, instead of 0 or 0.00 (#512) ++ Improvements + + Switch to Webpack 3. for leaner bundle creations (#438) + + Migration to eslint 4. for a cleaner codebase (#475) + + The decimalCharacterAlternative now correctly ignores the 'comma' or 'dot' when set to none (#432) + + Unit test now use the mocha profile as default instead of progress ++ Fixes + + Coverage information is back (#490) + + Workaround a geckodriver bug when trying to input an hyphen (#480) + + Fix lots of pasting issues (#481, #482, #483, #484, #505, #510, #547) + + Create workarounds (hacks really) for various IE-related bugs (#495, #516, #518) + + AutoNumeric.multiple() now correctly add only one event listener to the parent form, if any (#457) + + The input event is not fired on mouse wheel (#525) + + Prevent using the wheel event on disabled input elements + + The value of a read-only field can be changed with a scroll input (#541) + + Cut text reappears when leaving the field (#527) + + Input is duplicated and reversed on devices with Android < 7.0 using Android Chrome (#522) + + Formatted numbers on Android Chrome do not get deleted on blur anymore

+

...and more.

+

4.1.0-beta.28

+
    +
  • Fix issue #477 Modifying an input by selecting all its content and entering 0 drop the current selection, if 0 is out of the limit boundaries
  • +
+

4.1.0-beta.27

+
    +
  • Fix issue #432 The decimalCharacterAlternative option does not ignore the comma when it's set to none
  • +
+

4.1.0-beta.26

+
    +
  • Fix issue #522 Input is duplicated and reversed on devices with Android < 7.0
  • +
  • Remove the input event listener
  • +
  • Refactor parts of the _stripAllNonNumberCharacters and _convertToNumericString() functions by creating a _normalizeCurrencySuffixAndNegativeSignCharacters() function
  • +
  • Rename _stripAllNonNumberCharacters() to _stripAllNonNumberCharactersExceptCustomDecimalChar()
  • +
  • Create a _stripAllNonNumberCharacters() function that also normalize the decimal character
  • +
  • Remove the obsolete skipFirstAutoStrip and skipLastAutoStrip regex
  • +
  • Prevent the conversion of the decimalCharacterAlternative into the decimalCharacter when stripping the value
  • +
  • Simplify _addBrackets() and _setBrackets()
  • +
  • Simplify the _removeBrackets() calls
  • +
  • Fix _convertToNumericString() so that it normalize the positive sign and remove the brackets if any
  • +
  • Fix the bug where the formatted numbers on Android Chrome gets deleted on blur
  • +
  • Simplify the generated cached regex
  • +
  • Refactor _processCharacterDeletionIfTrailingNegativeSign() so contains() is called only once
  • +
+

4.1.0-beta.25

+
    +
  • Add a new custom AutoNumeric event 'autoNumeric:initialized' sent as soon as an AutoNumeric element is initialized
  • +
+

4.1.0-beta.24

+
    +
  • Fix issue #527 Cut text reappears when leaving the field
  • +
+

4.1.0-beta.23

+
    +
  • Fix issue #547 Newer version of Firefox breaks pasting in contenteditable elements
  • +
  • Fix issue #510 Pasting values in a disabled element should not be possible
  • +
  • Also prevent using the wheel event on disabled input elements.
  • +
+

4.1.0-beta.22

+
    +
  • Fix issue #525 The input event is not fired on mouse wheel
  • +
+

4.1.0-beta.21

+
    +
  • Fix issue #541 The value of a read-only field can be changed with a scroll input
  • +
+

4.1.0-beta.20

+
    +
  • Fix issue #489 valuesToStrings is ignored when using the static format() and unformat() functions
  • +
+

4.1.0-beta.19

+
    +
  • Add an option watchExternalChanges to react to external changes + By default, an AutoNumeric element only format the value set with the .set() function. + If you want the element to watch and format value set by third party script using the aNElement.node().value = 42 notation, then you need to set the watchExternalChanges option to true.
  • +
+

4.1.0-beta.18

+
    +
  • Fix issue #524 Allow changing the bubble and cancelable attributes of events sent by AutoNumeric
  • +
  • Add two new options eventBubbles and eventIsCancelable that defaults to true to manage the event attributes.
  • +
+

4.1.0-beta.17

+
    +
  • Fix issue #457 Using AutoNumeric.multiple() generate many submit event listeners on the parent form
  • +
  • Fix the drop event handler removal that was omitted.
  • +
  • Add a global aNFormHandlerMap Map on the window object, that keep track of all submit event handler for each <form> element that has at least one AutoNumeric-managed element child.
  • +
+

4.1.0-beta.16

+
    +
  • Fix issue #456 Change the modifyValueOnWheel default behaviour to act only when the element is focused
  • +
  • Add a new wheelOn option that will define when the wheel event will increment/decrement the element value. + By default the wheel event is only used when the element is focused (wheelOn is set to 'focus'), but you can also use the 'hover' option if you want to keep the previous behavior. + Note: There is a small caveat since the Shift + mouse wheel event is reserved by browsers for horizontal scrolling, using the Shift key and the wheelOn option set to 'hover' will only scroll the page while the mouse is hovered over the AutoNumeric-managed element. Once it's out of the way, the page won't scroll since you'll be holding the Shift key. You'll then be able to scroll the page normally without having to hold that Shift key.
  • +
+

4.1.0-beta.15

+
    +
  • Fix issue #513 Setting the input value directly with Javascript without using the set() method is not supported + From now on, if an external change is detected when a script modify the input value attribute directly, AutoNumeric tries to format the new value. + Note: watching the external changes to textContent is not supported yet.
  • +
  • Fix _onFocusInAndMouseEnter() where setElementValue() was called multiple times in a row
  • +
  • Fix the AutoNumeric.events.formatted event so that only one is sent for each user action
  • +
  • Change: The AutoNumeric.events.formatted event is not sent anymore when wiping an AutoNumeric object
  • +
+

4.1.0-beta.14

+
    +
  • Fix issue #516 'Del' key does not work in IE browser
  • +
  • Fix issue #509 allowDecimalPadding set to 'floats' when decimalPlaces is different from 0 output a warning
  • +
+

4.1.0-beta.13

+
    +
  • Fix issue #518 'Drag-and-Drop' operation does not work in IE11
  • +
+

4.1.0-beta.12

+
    +
  • Fix issue #514 Modify the static getAutoNumericElement(), test() and isManagedByAutoNumeric() functions so that they accept either a DOM element or a selector string
  • +
  • Fix issue #515 Add the static set and get* functions
  • +
+

4.1.0-beta.11

+
    +
  • Fix issue #455 Uncaught Error: _initialCaretPosition() should never be called when the caretPositionOnFocus option is null
  • +
  • Fix issue #512 AutoNumeric serialized data return 0 instead of an empty value on empty inputs + This fix changes how form serialization is done, by outputting the empty string on empty inputs, instead of 0 or 0.00.
  • +
+

4.1.0-beta.10

+
    +
  • Fix issue #502 The end-to-end tests fails on Chrome 61
  • +
  • Fix issue #505 Pasting values in a readOnly element should not be possible
  • +
+

4.1.0-beta.9

+
    +
  • Fix issue #498 The twoScaled choice for the digitalGroupSpacing option cannot be validated
  • +
  • Convert all the end-to-end test browser.execute() calls so that hardcoded DOM ids are not used anymore
  • +
+

4.1.0-beta.8

+
    +
  • Fix issue #496 The upgrade guide to v4 references the decimalPlacesOverride option without indicating it's deprecated
  • +
  • Fix issue #479 Whitespace on the left hand side of the html value attribute adds a zero on the formatted value on page load
  • +
+

4.1.0-beta.7

+
    +
  • Fix issue #495 AutoNumeric.multiple() fail on IE11 on unknown Array.from()
  • +
+

4.1.0-beta.6

+
    +
  • Fix issue #494 Allow AutoNumeric to be imported in web workers in a webpack setup
  • +
+

4.1.0-beta.5

+
    +
  • Fix issue #493 When formatOnPageLoad option is set to false, neither the rawValue nor the element value are set
  • +
+

4.1.0-beta.4

+
    +
  • Fix issue #438 Upgrade Webpack to 3.*
  • +
  • Fix issue #490 Fix the generated coverage information
  • +
  • Modify the unit test reporter to use 'mocha' instead of 'progress', in order to get more insightful reports.
  • +
  • Move the configuration files for the unit tests in the test/unit directory.
  • +
  • Update the dev dependencies (Babel, Babel-polyfill, Uglify, PhantomJS, Jasmine).
  • +
+

4.1.0-beta.3

+
    +
  • Fix issue #485 Add more details to the 'autoNumeric:formatted' event payload
  • +
  • Fix issue #488 Add a new event hook autoNumeric:rawValueModified that will be sent only when the rawValue is modified
  • +
+

4.1.0-beta.2

+
    +
  • Fix issue #478 Allow the positive & negative signs to be specified via options
  • +
  • Fix issue #480 On Firefox, the end-to-end tests fails when trying to send the minus '-' character.
  • +
  • Also fix the selenium tests where entering the hyphen ('-') character was not correctly accepted under Firefox. + This was due to the fact that the wrong keyCode 173 is sent instead of 189 like in all the other browsers for that character.
  • +
  • Fix issue #481 When the caret is on the far right and the negative sign too, entering '+' or '-' does not toggle the positive state, and only move the caret from one character to the left.
  • +
  • Fix issue #482 Pasting a positive value while selecting the entire content of an element that has a negative value result in an error.
  • +
  • Update the 'Options' chapter in the documentation to add some details on a few options.
  • +
  • Simplify _checkPaste() so that it's not processed any more times if the element has already been formatted.
  • +
  • Fix the range check so that when the rawValue is allowed to be null and is effectively null, the min/max limits are ignored.
  • +
  • Modify how this.formatted is used so it tracks if the element value has been formatted already. If that's the case, prevent further format calculations. + This is a start and this.formatted usage should be reviewed in depth.
  • +
  • Fix issue #484 Pasting an invalid string into either a selection or at the caret position modify the element value.
  • +
  • Fix issue #483 Pasting a content over an element that already has the same exact content resets its value to zero.
  • +
+

4.1.0-beta.1

+
    +
  • Fix issue #475 Migrate to eslint 4
  • +
  • Fix issue #450 Add the valuesToStrings option to allow displaying a pre-defined string when the rawValue equal a specific value
  • +
+

4.0.3

+
    +
  • Fix issue #474 AutoNumeric.format() and AutoNumeric.unformat() do not accept named options
  • +
+

4.0.2

+
    +
  • Fix issue #473 Static format() and unformat() functions ignores the rawValueDivisor option
  • +
  • Fix AutoNumeric.unformat() that used the number of decimal places shown on focus instead of the one for the raw value.
  • +
+

4.0.1

+
    +
  • Fix issue #471 The static format() function does not keep the negative sign
  • +
  • Fix issue #472 The static AutoNumeric.format() function does not accept DOM element as its first parameter
  • +
+

4.0.0

+
    +
  • Release v4.0.0
  • +
  • The highlights of this new version are:
  • +
  • AutoNumeric is now fully converted to an ES6 module.
  • +
  • No more jQuery dependency.
  • +
  • AutoNumeric is now a class. You can access the class method directly from the AutoNumeric object (ie. const aNElement = new AutoNumeric(input, {options})); aNElement.set(123).update({options2});).
  • +
  • The number of decimal places is now explicitly set via the decimalPlaces option.
  • +
  • You can now specify a different number of decimal place to show when focused and unfocused, and for the internal rawValue. + If you relied on the number of decimals in minimumValue or maximumValue to define how many decimal places should be shown on the formatted value, or kept as the precision in the rawValue, you now need to explicitly define how many decimal places your want, whatever number of decimal places minimumValue and maximumValue have.
  • +
  • You can now 'cancel' any edits made to the element by hitting the Escape key. If no changes are detected, hitting Esc will select the element value (according to the selectNumberOnly option).
  • +
  • Undo/Redo are now supported.
  • +
  • You can modify the value of the element by using the mouse wheel on it, if modifyValueOnWheel is set. The wheelStep option defines the step to use.
  • +
  • An AutoNumeric object can now initialize other DOM elements with init(domElement), which will then use the same options. + The AutoNumeric-managed elements that initialized each other share a common list, allowing the user to perform a single action on many elements at once (via the .global.* functions, ie. aNElement.update({options}) to update the options of all the elements, or aNElement.set(42) to set the same value for each elements). + The .global.* functions you can use are : set(), setUnformatted(), get(), getNumericString(), getFormatted(), getNumber(), getLocalized(), reformat(), unformat(), unformatLocalized(), update(), isPristine(), clear(), remove(), wipe(), nuke(), has(), addObject(), removeObject(), empty(), elements(), getList() and size(). + Managing that shared list is possible via attach() and detach().
  • +
  • The options can now be updated one by one using the handy functions aNElement.options.<nameOfTheOption>({newOption}), ie. aNElement.options.currencySymbol('€'). + You can also reset the options to the default ones using aNElement.options.reset().
  • +
  • Lots of new options (rawValueDivisor, decimalPlaces, decimalPlacesRawValue, decimalPlacesShownOnBlur, serializeSpaces, noEventListeners, readOnly, selectOnFocus, caretPositionOnFocus, etc.).
  • +
  • While the AutoNumeric objects provides many methods, you can also directly use the AutoNumeric class static functions without having to instantiate an object. Those methods are version(), test(), validate(), areSettingsValid(), getDefaultConfig(), getPredefinedOptions(), format(), formatAndSet(), unformat. unformatAndSet(), localize(), localizeAndSet(), isManagedByAutoNumeric() and getAutoNumericElement().
  • +
  • Lots of new functions (isPristine(), clear(), nuke(), formatOther() and unformatOther() which allows to format/unformat a numeric string or another DOM element with the current object settings, setValue(), etc.).
  • +
  • The get() function has been deprecated, in favor of more explicit get* methods : getNumericString(), getFormatted(), getNumber() and getLocalized().
  • +
  • By default, new AutoNumeric('.myClass') will only initialize one element. If you want to initialize multiple DOM elements in one go, you need to use the static AutoNumeric.multiple() function. + It allows to initialize numerous AutoNumeric objects (on numerous DOM elements) in one call (and possibly pass multiple values that will be mapped to each DOM element).
  • +
  • Support for the Android Chrome mobile browser (v57) (this is a work in progress though, since it's quite hard to work around its limitations).
  • +
  • Functions can now be chained (ie. aNElement.clear().set(22).formSubmitJsonNumericString().nuke()). + Modify how updating the settings works ; before, all modifications to the settings were directly accepted and stored, then we immediately tried to set() back the current value with those new settings. + This could lead to an object state where the object value would be out of the minimum and maximum value range, ie. we would accept the range modification, then immediately throw an error since the current value would then be out of range. + For instance, if minimumValue equal 0, maximumValue equal 100 and the current element value equal 50, trying to change the minimumValue to 75 will fail, and the minimumValue will be reverted back to0. + The new behavior is leaner ; if the new settings do not pass the validate() method or the following set() call fails, then the settings are reverted to the previous valid ones.
  • +
  • +

    The rawValueDivisor option allows to display a formatted value different than the raw value. For instance you can display percentages like '1.23%', while keeping the rawValue 0.0123 'unmultiplied', if rawValueDivisor is set to 100.

    +
  • +
  • +

    And also:

    +
  • +
  • The new selectNumber(), selectInteger() and selectDecimal() function to select the element content as needed.
  • +
  • The DOM-specific functions to manipulate it ; node() (returns the DOM element managed by AutoNumeric), parent(), form() (returns the parent
    element, if any).
  • +
  • More than 20 functions to manages html forms ; how to retrieve info from them, or submit the info (formatted, unformatted, localized).
  • +
  • Predefined options so that the user do not have to configure AutoNumeric manually. + Those options are dotDecimalCharCommaSeparator, commaDecimalCharDotSeparator, integer, integerPos, integerNeg, float, floatPos, floatNeg, numeric, numericPos, numericNeg, euro, euroPos, euroNeg, euroSpace, euroSpacePos, euroSpaceNeg, percentageEU2dec, percentageEU2decPos, percentageEU2decNeg, percentageEU3dec, percentageEU3decPos, percentageEU3decNeg, dollar, dollarPos, dollarNeg, percentageUS2dec, percentageUS2decPos, percentageUS2decNeg, percentageUS3dec, percentageUS3decPos and percentageUS3decNeg.
  • +
  • Some language options are now shipped directly and you can use the language name as a function to activate those settings (ie. aNElement.french()).
  • +
  • Better support for contenteditable elements so that AutoNumeric is not only limited to <input> elements.
  • +
  • AutoNumeric send the 'autoNumeric:formatted' event whenever it formats the element content.
  • +
  • The raw unformatted value can always be accessible with the rawValue attribute (ie. aNElement.rawValue).
  • +
  • When pressing the Alt key, you can hover your mouse over the AutoNumeric-managed elements to see their raw value.
  • +
  • You can prevent the mouse wheel to increment/decrement an element value by pressing the Shift key while using the mouse wheel.
  • +
  • Default values for each options can be easily accessed with an IDE autocompletion when using AutoNumeric.options.|.
  • +
  • Support for drag and dropping numbers into AutoNumeric-managed elements.
  • +
  • The styleRules option allows to either change the style of the current element based on the rawValue value, or just call any custom callbacks whenever the rawValue changes.
  • +
  • Allow setting the rawValue to null, either by setting it directly (ie. aNElement.set(null)), or by emptying the element, if emptyInputBehavior is set to 'null'.
  • +
  • All get*() method accepts a callback function. The callback is passed the result of the get* functions as its first argument, and the current AutoNumeric object as its second.
  • +
  • Allow initializing an AutoNumeric element with an array of options objects or pre-defined option names (ie. 'euroPos').
  • +
  • +

    Add a static AutoNumeric.mergeOptions() function that accepts an array of option objects and / or pre-defined option names, and return a single option object where the latter element overwrite the settings from the previous ones.

    +
  • +
  • +

    Lots of bug fixes and code simplification (#387, #391, #393, #397, #399, #398, #244, #396, #395, #401, #403, #408, #320, #411, #412, #413, #417, #423, #415, #418, #409, #416, #414, #427, #248, #425, #264, #250, #404, #434, #440, #442, #447, #448, #449, #454, #453, #388, #461, #452).

    +
  • +
  • Better test coverage, both for unit tests and end-to-end tests.
  • +
  • Rewrite the documentation (README.md) to make it more 'browsable'.
  • +
  • For a more detailed changelog, you can read the changes listed from v3.0.0-beta.1 to v3.0.0-beta.14 and from v4.0.0-beta.1 to v4.0.0-beta.23.
  • +
+

4.0.0-beta.23

+
    +
  • Fix issue #453 Rename the noSeparatorOnFocus option to showOnlyNumbersOnFocus
  • +
  • Add the missing options.historySize() method that allows to update the historySize option
  • +
  • Move the raw value from this.settings.rawValue to this.rawValue. This prevent polluting the settings object.
  • +
  • Fix issue #388 autoNumeric does not work with Browserify
  • +
  • Fix issue #461 Fixed problem on Android Chrome browsers when a currency symbol is used
  • +
  • Fix issue #452 Add a new rawValueDivisor option to display a formatted value different than the raw value. + This allows for instance to display percentages like '1.23%', while keeping the rawValue 0.0123 'unmultiplied', if rawValueDivisor is set to 100.
  • +
  • Merge the blur event listeners into one.
  • +
  • Add the this.isWheelEvent, this.isDropEvent and this.isEditing attributes to track the wheel and drop events, as well as when the user is manually editing the element value.
  • +
  • Modify _setRawValue() to divide the rawValue if rawValueDivisor is set.
  • +
  • Fix the validation test for the scaleDivisor option where it did not check that it should not be equal to 0.
  • +
  • Fix the validation test for the allowDecimalPadding when decimalPlacesShownOnBlur or decimalPlacesShownOnFocus is set.
  • +
  • Add a validation test for divisorWhenUnfocused so that it throws if it's set to 1.
  • +
  • Modify the validation test so that setting divisorWhenUnfocused to 1 will throw.
  • +
  • Modify _trimLeadingAndTrailingZeros() so that it manages null values correctly (ie. it returns null instead of '0' if passed null).
  • +
  • Fix the error shown when blurring an input that accept a null value.
  • +
  • Modify the pre-defined options percentage* so that the rawValueDivisor is set to 100.
  • +
  • Rename the divisorWhenUnfocused option value from doNotActivateTheScalingOption to none.
  • +
  • Fix getNumericString() so that it returns null when the rawValue is null.
  • +
  • Separate the _calculateDecimalPlaces() function into two _calculateDecimalPlacesOnInit() and _calculateDecimalPlacesOnUpdate().
  • +
  • The callbacks found in the settings object are now run before modifying the negativePositiveSignPlacement option.
  • +
  • Modify how the settings are updated when the user pass the decimalPlaces option. + Before, this was overriding any other decimalPlaces* options passed in the same object. + Now, the decimalPlaces value is only used if the other decimalPlaces* options are not already set. + Moreover, the decimalPlacesRawValue option is now overwritten by the other decimalPlaces* options defined in the same option object, if their values are higher.
  • +
  • Modify the behavior of the wheelStep 'progressive' mode so that values between ]-1;-1[ are treated specially, by allowing the wheel event to modify the decimal places. The precision used for the step depends on the number of decimal places used for the rawValue. + Also, numbers between 1 and 9 (included) now use a step of 1, instead of 10 like before.
  • +
  • Set the version of Webpack to 1.14.0, instead of latest, in order to prevent potential incompatibility problems.
  • +
+

4.0.0-beta.22

+
    +
  • Fix issue #454 Rewrite how the number of decimal places for the formatted and the raw values are set
  • +
  • If you relied on the number of decimals in minimumValue or maximumValue to define how many decimal places should be shown on the formatted value, or kept as the precision in the rawValue, you now need to explicitly define how many decimal places your want, whatever number of decimal places minimumValue and maximumValue have.
  • +
  • To do so, you now need to define at least the decimalPlaces option.
  • +
  • If you want, you can also separately define decimalPlacesRawValue, decimalPlacesShownOnBlur and decimalPlacesShownOnFocus. For more details, read on.
  • +
  • Rename scaleDecimalPlaces to decimalPlacesShownOnBlur.
  • +
  • Rename scaleDivisor to divisorWhenUnfocused.
  • +
  • Rename scaleSymbol to symbolWhenUnfocused.
  • +
  • Rename the decimalPlacesShownOnBlur.doNotChangeDecimalPlaces to decimalPlacesShownOnBlur.useDefault to be coherent with the other decimalPlaces* options.
  • +
  • Remove the decimalPlacesOverride option in favor of explicit decimalPlaces, decimalPlacesShownOnBlur and decimalPlacesShownOnFocus ones.
  • +
  • Add a warning message if the old mDec option is used (which was the equivalent of decimalPlacesOverride).
  • +
  • Add a decimalPlacesRawValue option that define the precision the user wants to keep (in the rawValue).
  • +
  • Remove the need for saving decimalPlacesOverride to temporary change it in set().
  • +
  • Create 3 different rounding functions that replace the _roundValue() calls: _roundFormattedValueShownOnFocus, _roundFormattedValueShownOnBlur and _roundRawValue. This way we are more explicit in what the code is doing.
  • +
  • Modify _setRawValue() so that it only save the given raw value if it's different than the current one (keeping the history table clean).
  • +
  • Use template strings instead of concatenation in _addGroupSeparators(), _roundValue() and _prepareValueForRounding() to prevent possible wrong typecasts.
  • +
  • Fix the error shown when hovering an input whose value has been set to null (a toString() was attempted on the null value in the _roundValue() method).
  • +
  • Fix the incoherent variable name inputValueHasADot in _roundValue() to better reflect what data it holds, ie. inputValueHasNoDot.
  • +
  • Fix typos in the set() warning messages.
  • +
  • Add a warning message when try to set a value that results in NaN.
  • +
  • Simplify the '_onFocusInAndMouseEnterand_onFocusOutAndMouseLeave` event handlers.
  • +
  • Update the tests with the new changes.
  • +
  • Modify how decimal places are set. + Before you needed to add that many decimals to the minimumValue or maximumValue, and that maximum number of decimal place was used everywhere (except if you also defined decimalPlacesOverride, decimalPlacesShownOnFocus or scaleDecimalPlaces). + Now you need to explicitly define the number of decimal places using the decimalPlaces option. + If only decimalPlaces is defined, then the other decimalPlaces* options decimalPlacesRawValue, decimalPlacesShownOnBlur and decimalPlacesShownOnFocus are calculated from it. + This way, you can now define clearly how many decimal places needs to be shown when focused/unfocused, and as the raw value precision. + Note: updating the decimalPlaces will overwrite any decimalPlaces* option previously set.
  • +
  • Remove the _maximumVMinAndVMaxDecimalLength() since we do not set the number of decimal places this way.
  • +
  • Remove the _correctDecimalPlacesOverrideOption() function since decimalPlacesOverride is not used anymore.
  • +
  • Add a _calculateDecimalPlaces() static method that calculate the decimalPlaces* option value based on decimalPlaces and the decimalPlaces* ones.
  • +
  • Modify how updating the settings works ; before, all modifications to the settings were directly accepted and stored, then we immediately tried to set() back the current value with those new settings. + This could lead to an object state where the object value would be out of the minimum and maximum value range, ie. we would accept the range modification, then immediately throw an error since the current value would then be out of range. + For instance, if minimumValue equal 0, maximumValue equal 100 and the current element value equal 50, trying to change the minimumValue to 75 will fail, and the minimumValue will be reverted back to0. + The new behavior is leaner ; if the new settings do not pass the validate() method or the following set() call fails, then the settings are reverted to the previous valid ones.
  • +
  • In _setValueParts(), set the rawValue and the formatted element value separately, since they can have different decimal places. For instance we could imagine keeping 3 decimal places for the rawValue, while only 2 is shown. I then need to make sure we keep that third decimal place information into the rawValue, instead of trimming it like it was done before.
  • +
+

4.0.0-beta.21

+
    +
  • Set the read-only mode on the default settings, enumerations, events, options and pre-defined options objects.
  • +
  • Allow using a pre-defined option name directly when initializing an AutoNumeric element
  • +
  • Fix the initialization method to accepts arrays of options object/pre-defined options when using an initial value.
  • +
  • Fix an issue related to issue #447 when the focus out action produce an error when the input raw value is set to null
  • +
  • Fix a rare bug when scaleSymbol is a castable to a Number, and would be added to the formatted value, instead of concatenated.
  • +
  • Remove an unneeded temporary variable in set().
  • +
  • Add more details in some JSDoc.
  • +
  • Fix validate() so that it throws an error early if scaleDivisor is wrongly set to 0.
  • +
  • Fix _trimLeadingAndTrailingZeros() so that it correctly handles the null value.
  • +
  • Fix _onFocusInAndMouseEnter() so that the decimalPlacesShownOnFocus setting is correctly cast to a Number.
  • +
  • Fix _onFocusOutAndMouseLeave() so that the null value is correctly handle. Also fix the error message shown when the rawValue is not stored as a string.
  • +
  • Simplify a ternary condition into a simple if one.
  • +
  • Hardcode the isFocused state to false when calling _addGroupSeparators() in _onFocusOutAndMouseLeave() so that it does not rely on the order where this.isFocused is set back to false.
  • +
+

4.0.0-beta.20

+
    +
  • Allow initializing an AutoNumeric element with an array of options objects or pre-defined option names. + The latter options in the array will overwrite the previous ones. + The array can contains either option objects, or pre-defined option names as a string (ie. 'euroPos'). + Both the initialization methods new AutoNumeric() and AutoNumeric.multiple() support using arrays of options.
  • +
  • Add a static AutoNumeric.mergeOptions() function that accepts an array of option objects and / or pre-defined option names, and return a single option object where the latter element overwrite the settings from the previous ones.
  • +
  • Allow passing an array of options objects or pre-defined option names to the static format and unformat methods. + The latter options in the array will overwrite the previous ones. + The array can contains either option objects, or pre-defined option names as a string (ie. 'euroPos').
  • +
+

4.0.0-beta.19

+
    +
  • Fix issue #449 AutoNumeric.unformat() only removes the first instance of settings.digitGroupSeparator
  • +
+

4.0.0-beta.18

+
    +
  • Modify the get* methods to allow passing them a callback function.
  • +
  • The callback is then executed on the get* method result, or the global.get* method array of result.
  • +
  • The callback is passed the result of the get* functions as its first argument, and the current AutoNumeric object as its second.
  • +
  • Split the _saveValueToPersistentStorage() method in three : _saveValueToPersistentStorage() to save the raw value to persistent storage, _getValueFromPersistentStorage() to retrieve that data, and _removeValueFromPersistentStorage() to delete it.
  • +
  • From now on, the _storageTest is only done once, and the result is kept in this.sessionStorageAvailable, and the storage variable name is also generated once and kept in this.rawValueStorageName.
  • +
  • You can now modify the raw value storage name variable prefix by modifying the this.storageNamePrefix attribute. Currently it defaults to 'AUTO_';
  • +
+

4.0.0-beta.17

+
    +
  • Fix issue #447 Add a new 'null' options to the emptyInputBehavior setting
  • +
  • Add the this.defaultRawValue variable that store the hard-coded default raw value used during the initialization and reset.
  • +
  • When using the option { emptyInputBehavior: AutoNumeric.options.emptyInputBehavior.null }, the user can now explicitly set the AutoNumeric value to null (using anElement.set(null) for instance). + Additionally, when this option is set, if the AutoNumeric element is emptied, then rawValue is set to null. + Note: if the current raw value is equal to null, changing the emptyInputBehavior option to something different than null will update the rawValue to ''. + Known limitation : Initializing an AutoNumeric object with the null value is not allowed since using null for the initial value means that AutoNumeric needs to use the current html value instead of null.
  • +
  • Fix issue #448 When searching for the parent form element, the tagName can be undefined.
  • +
  • The form() method now accepts a true argument that will force it to discard the current parent form and search for a new one.
  • +
  • Enforce the use of settings.showWarnings for most calls to AutoNumericHelper.warning(), wherever possible.
  • +
+

4.0.0-beta.16

+
    +
  • Move the options, default options and predefined options objects each in its own file. + Separating them from the AutoNumeric class makes that information easier to find, study and modify.
  • +
  • Modify the update() and global.update() function signatures so that they can accept multiple option objects, the latter overwriting the settings from the former. + This allows to fine tune the format settings in one go, and is specially useful when using a predefined option as the 'configuration base', and changing it slightly (ie. anElement.update( AutoNumeric.getPredefinedOptions().French, { digitGroupSeparator: AutoNumeric.options.digitGroupSeparator.noSeparator })).
  • +
  • Fix the 'autoNumeric:formatted' event not being correctly sent if the AutoNumeric element was formatted without a keyup event. + The event is now correctly sent when the value is set to empty, or when using unformat(), unformatLocalized() and wipe(), as well as when the user uses the wheel event to change the element value, or the alt + mouse hover feature, or just hover the element that has a negativeBracketsTypeOnBlur option set, or on the initial format on load.
  • +
  • Fix the fact that 'autoNumeric:formatted' was not sent when pasting valid values.
  • +
  • Gather the AutoNumeric event names in a single configuration variable AutoNumeric.events.
  • +
  • Modify the default percentage pre-defined option wheelStep to 0.01 so that the wheel step is more logical when manipulating a small number.
  • +
  • Fix issue #442 Setting unformatOnSubmit to true does not unformat the element on the form' submit event
  • +
  • Fix issue #440 Pasting does not work in IE11
  • +
+

4.0.0-beta.15

+
    +
  • Add a new option selectOnFocus that allow the user to choose if the value should be selected when the element is focused.
  • +
  • Add a new option caretPositionOnFocus that allow the user to choose where should be positioned the caret when the element is focused.
  • +
  • Modify how the caret is treated on focus ; if the selectOnFocus option is true then the value is selected, otherwise the caret is set at the position defined by the caretPositionOnFocus option.
  • +
  • caretPositionOnFocus can be 'start', 'end', 'decimalLeft' and 'decimalRight', and will change where the caret will be positioned when the element get the focus. It can also be null which means the caret position is not forced.
  • +
  • The caret position is calculated by the new _initialCaretPosition() function.
  • +
  • Modify validate() so that an empty object can be used for the options, since the default settings would then be merged and used.
  • +
  • Modify the validate() function signature so that it accepts a third argument, the raw options passed by the user, without them having been merged with the default settings. This is useful for checking conflicting options that could be overwritten by the defaults.
  • +
  • Rewrite the call to validate() from areSettingsValid() to make it more explicit.
  • +
  • Rewrite one test condition in _onFocusInAndMouseEnter() so that it's not reserved only for elements that have their emptyInputBehavior option set to focus anymore.
  • +
  • Add a focusin event handler via _onFocusIn(), which take care of managing the element content selection on focus.
  • +
  • Add the _correctCaretPositionOnFocusAndSelectOnFocusOptions() function that manage the caretPositionOnFocus and selectOnFocus options in order to prevent any conflict.
  • +
  • Strengthen setElementSelection() so that element.firstChild is checked for null value.
  • +
  • Add a table of contents to the readme and reorganize its chapters.
  • +
+

4.0.0-beta.14

+
    +
  • Add more bracket types to the negativeBracketsTypeOnBlur option ('〈,〉', '「,」', '⸤,⸥', '⟦,⟧', '‹,›' and '«,»')
  • +
  • Reformat the changelog, fix some typos
  • +
  • Modify the static unformat() signature to allow multiple options objects to be passed as arguments. + Each more option object overwrite the previous ones. + This allows to correctly unformat currencies that have a predefined option as its base, but has been slightly modified (ie. AutoNumeric.unformat('241800,02 €', AutoNumeric.getPredefinedOptions().French, { digitGroupSeparator: AutoNumeric.options.digitGroupSeparator.noSeparator }), and still get the right result).
  • +
  • Split the _checkEmpty() function into _isElementValueEmptyOrOnlyTheNegativeSign() and _orderValueCurrencySymbolAndSuffixText(). Both new functions only do one thing and one thing only, allowing the code to be rewrote in a clearer way.
  • +
  • Delete the _checkEmpty() function.
  • +
  • Simplify _roundValue() to make it more legible ; This is done by extracting _roundCloseTo05(), _prepareValueForRounding() and _shouldRoundUp().
  • +
  • Remove an unnecessary while loop in _stripAllNonNumberCharacters()
  • +
+

4.0.0-beta.13

+
    +
  • Modify init() so that it allows the user to also pass an array of DOM elements, or a CSS selector as its first argument (cf. issue #388 comments)
  • +
+

4.0.0-beta.12

+
    +
  • Fix issue #434 Using noSeparatorOnFocus set to noSeparator should not remove the decimal character on focus
  • +
+

4.0.0-beta.11

+
    +
  • Merge the Android support from 2.0.12 into 4.0.0-beta.*
  • +
+

4.0.0-beta.10

+
    +
  • Reorganize the existing unit tests and add more to extend the coverage
  • +
  • Add a new setValue() method that allow the user to set any values, without any controls from AutoNumeric.
  • +
  • Replace all the calls to setElementValue then _setRawValue with either setValue() or _setElementAndRawValue(), so that this call order is respected.
  • +
  • Rewrite setUnformatted() so that it checks and validates the value given by the user.
  • +
  • Fix options.createLocalList() so that modifying the option will create/delete the local list accordingly.
  • +
  • Fix selectDecimal() so that the decimals are correctly selected when decimalPlacesShownOnFocus is used.
  • +
  • Add a thin unbreakable space\u202f in front of % in the predefined options percentageEU* (as per the typographic rules).
  • +
+

4.0.0-beta.9

+
    +
  • Fix issue #425 The minimumValue and maximumValue options are not respected when emptyInputBehavior is set to 'zero'
  • +
+

4.0.0-beta.8

+
    +
  • Fix issue #248 Create the autoNumeric organization, and move the repository to it
  • +
+

4.0.0-beta.7

+
    +
  • Fix issue #427 autoUnformat() converts digitGroupSeparator set to . as the decimal character
  • +
  • Modify AutoNumeric.unformat() so that 'real' javascript number are always directly returned, without taking into account the options passed (as it was supposed to do previously).
  • +
  • Correctly take into account the number of decimal places, the negative brackets, rounding and the suffix text options when unformatting with AutoNumeric.unformat().
  • +
  • Complete the AutoNumeric.unformat() unit tests.
  • +
  • Modify _removeBrackets() so that we can only remove the brackets, without reordering the negative sign, currency symbol and value according to the settings.
  • +
+

4.0.0-beta.6

+
    +
  • Fix issue #414 Changing the value of an element from negative to positive is not possible for some specific configuration of brackets, for the second time.
  • +
  • Remove the need to keep an ambiguous settings.trailingNegative variable, that was used for other things that its names suggests.
  • +
  • Extract the _isTrailingNegative test to its own function.
  • +
  • Fix _convertToNumericString() to make it remove the suffixText as well.
  • +
  • Use array destructuring to simplify the _setValueParts() function.
  • +
  • Remove the attribute newValue polluting this, which allow to explicitly pass the needed information.
  • +
  • Merge this.settings.hasFocus into this.isFocused.
  • +
  • Remove the need for the this.settings.strip variable.
  • +
  • Modify the event listener from 'focusin' to 'focus', in order to prepare for the merge of _onFocusInAndMouseEnter() and _onFocus() handlers.
  • +
  • Modify _cleanLeadingTrailingZeros() so that the trailing zeroes if correctly done, even if leadingZero is set to keep.
  • +
  • Rename _cleanLeadingTrailingZeros() to _trimLeadingAndTrailingZeros().
  • +
  • Change the _addGroupSeparators() signature so that the focused state is explicitly passed as a parameter, instead of piggy-backing on the settings object.
  • +
  • Add a _setTrailingNegativeSignInfo() function that parse the settings and initialize once the this.isTrailingNegative property if the negative sign should be trailing for negative values.
  • +
  • Rename the leftOrAll parameter from _stripAllNonNumberCharacters() to a more meaningful stripZeros.
  • +
  • Simplify a test in _truncateDecimalPlaces().
  • +
  • Rename _skipAlways() to _processNonPrintableKeysAndShortcuts().
  • +
  • Add cases to the helper function isNegative() to make it more efficient.
  • +
  • Add a new isNegativeWithBrackets() helper function that tests if the given value is a negative with brackets.
  • +
+

4.0.0-beta.5

+
    +
  • Fix issue #416 Add support for changing the element style based on rules
  • +
  • Add the styleRules option that allows to modify the element style based on the raw value, but also to call any callbacks whenever this raw value change
  • +
  • Reorganize the set() function so that the formatted value is set before setting the rawValue. That way if a callback invoked by a styleRules modify the raw value, it'll be set correctly, since the previous set() call would have already changed the element value via setElementValue().
  • +
+

4.0.0-beta.4

+
    +
  • Fix issue #409 Do not add decimal padding when a number without decimals has been inserted
  • +
  • Fix an issue when you have allowDecimalPadding set to never, then if you delete the decimal places leaving the decimal character, it would not drop that dangling decimal character on focus out.
  • +
  • Fix issue #418 Complete the documentation with the AutoNumeric event lifecycle
  • +
+

4.0.0-beta.3

+
    +
  • Fix issue #415 Support undo and redo actions
  • +
  • Add a new historySize option that allows to set how many undo states each AutoNumeric object should keep in memory.
  • +
  • Always use the _setRawValue() function to set the rawValue ; directly setting this.settings.rawValue = 'foo' is not allowed anymore.
  • +
  • Modify the set() function signature by allowing to pass a third parameter to prevent saving the changed state to the history table.
  • +
  • Update the keyName enumeration with the capitalized letters.
  • +
  • Upgrade the getElementSelection() helper function in order to support contenteditable-enabled elements and hidden inputs.
  • +
  • Add an arrayTrim() helper function that trim the start of an array.
  • +
  • Create undo/redo end-to-end tests.
  • +
  • Reorganize the set() function to keep logical steps together.
  • +
  • Rename the old autoFormat.autoNumeric event to the already used autoNumeric:formatted to keep the names consistent.
  • +
  • Sort the option list in the _convertOldOptionsToNewOnes() function.
  • +
  • Fix issue #423 leadingZero set to keep does not keep the leading zeros under Chrome
  • +
+

4.0.0-beta.2

+
    +
  • Fix issue #413 Manage the drag 'n drop event so that the text dropped in the AutoNumeric element gets formatted accordingly
  • +
+

4.0.0-beta.1

+
    +
  • Up the current next version to v4 instead of v3, just because.
  • +
  • Add unit tests for the new options.* methods
  • +
  • Fix the issue where having emptyInputBehavior equal to always would not reformat the AutoNumeric element correctly if its value is set to the empty string ''.
  • +
  • Fix the issue where having emptyInputBehavior equal to zero would not reformat the AutoNumeric element correctly if its value is set to the empty string ''.
  • +
  • Fix the _mergeCurrencySignNegativePositiveSignAndValue() function that did not manage all negativePositiveSignPlacement combinations.
  • +
  • Simplify the _mergeCurrencySignNegativePositiveSignAndValue() function.
  • +
  • Add function chaining to the options.* methods.
  • +
+

3.0.0-beta.14

+
    +
  • Add unit tests for the new global.* features
  • +
  • Fix issue #412 Using set('') does not respect the emptyInputBehavior option when it's set to 'always'
  • +
  • Add a createLocalList option which allow to control whether a local list of AutoNumeric objects should be saved on initializations.
  • +
  • Add a global.update() function to update the settings on a local list.
  • +
  • Modify the global.clear() function to be able to force a clear call.
  • +
  • Add a global.nuke() function to remove then delete the local list DOM element from the DOM.
  • +
  • Update the global.clear() function signature with the clear() one.
  • +
  • Fix the global.addObject() function that did not update the local list of the added element.
  • +
  • Fix the global.addObject() function so that if it add an AutoNumeric object that already has a local list with multiple other AutoNumeric objects, it merges the list.
  • +
  • Fix the global.removeObject() function to make it update all the objects local list. Also add special behaviors when an AutoNumeric element removes itself or another one.
  • +
  • Fix the global.empty() function to match the removeObject behavior.
  • +
  • Simplify the init() method by removing a negation in one of its parameter.
  • +
  • Fix the init() method initialization process by preventing creating a local list, then removing it immediately if the user wanted a detached element. Now, the local list is just not created (Using the createLocalList option set to false).
  • +
  • Add an end-to-end test for the remove() method.
  • +
  • Add a _hasLocalList() method that tests if the AutoNumeric element has a local list and that it has at least one element in it (itself usually).
  • +
+

3.0.0-beta.13

+
    +
  • Fix issue #411 Add the pre-defined Brazilian language configuration
  • +
+

3.0.0-beta.12

+
    +
  • Refactor the hard-coded option values with the AutoNumeric.options object attribute values
  • +
+

3.0.0-beta.11

+
    +
  • Fix issue #320 Use event.key instead of event.keyCode and event.which since those two attributes are deprecated
  • +
+

3.0.0-beta.10

+
    +
  • Add lots of pre-defined options.
  • +
  • Those options are dotDecimalCharCommaSeparator, commaDecimalCharDotSeparator, integer, integerPos, integerNeg, float, floatPos, floatNeg, numeric, numericPos, numericNeg, euro, euroPos, euroNeg, euroSpace, euroSpacePos, euroSpaceNeg, percentageEU2dec, percentageEU2decPos, percentageEU2decNeg, percentageEU3dec, percentageEU3decPos, percentageEU3decNeg, dollar, dollarPos, dollarNeg, percentageUS2dec, percentageUS2decPos, percentageUS2decNeg, percentageUS3dec, percentageUS3decPos and percentageUS3decNeg.
  • +
  • Add the unit tests for those pre-defined options.
  • +
  • Update the readme accordingly, doing a distinction between the 'Predefined language options' and the 'Predefined common options'.
  • +
  • Rename getLanguages() to getPredefinedOptions().
  • +
  • Add the percentage, permille and basis point sign to the default suffixText options.
  • +
  • Add a test to warn the user when the given CSS selector does not select any element during initialization.
  • +
  • Fix the initialization problem when searching for a parent on an element that has no parentNode.
  • +
  • Re-order alphabetically the default settings
  • +
  • Replace the hard-coded default option values with references to the AutoNumeric.options object values.
  • +
  • Re-order alphabetically the options enumeration.
  • +
  • Add more choices for some options.
  • +
  • Rename default options value names to more meaningful descriptions.
  • +
  • Change the default option selectNumberOnly value to true
  • +
  • Simplify the AutoNumeric.languageOptions object.
  • +
  • Add the 'dot' character to the decimalCharacterAlternative option enumeration.
  • +
  • Update the end-to-end tests that test the element value selection on focus, to reflect the change to the default value for selectNumberOnly.
  • +
  • Update the unit tests to correct the rounding on some values that used the previous default one defined in AutoNumeric.languageOptions.French.
  • +
+

3.0.0-beta.9

+
    +
  • Fix and removes some TODOs and FIXMEs
  • +
  • Remove some debug messages.
  • +
  • Remove the need to initialize the savedCancellableValue variable when unneeded.
  • +
  • Check and remove the unnecessary hasFocus calls and sets.
  • +
  • Add regex caching to the static format() function, since this used the _addGroupSeparators function that calls the _stripAllNonNumberCharacters one that extensively uses those.
  • +
  • Rename the temporary settings copy, and move those out of the this.settings object.
  • +
  • Prevent setting the value with set() if the value hasn't changed when calling the 'cancellable' event.
  • +
  • Rename _setsAlternativeDecimalSeparatorCharacter() to _setAlternativeDecimalSeparatorCharacter().
  • +
  • Remove the unused and deprecated aScale reference from a test.
  • +
  • Move away from the this.settings object the following variables : caretFix, throwInput, tagList, originalDecimalPlacesOverride, originalAllowDecimalPadding, originalNegativeBracketsTypeOnBlur, originalDigitGroupSeparator, originalCurrencySymbol, originalSuffixText and aNegRegAutoStrip.
  • +
  • Refactor some tests in _formatValue().
  • +
+

3.0.0-beta.8

+
    +
  • Fix issue #408 Allow brackets and parenthesis to be added for negative numbers on any combination of currencySymbolPlacement and negativePositiveSignPlacement values
  • +
+

3.0.0-beta.7

+
    +
  • Rename autoNumeric.js to AutoNumeric.js (since it's now a module)
  • +
+

3.0.0-beta.6

+
    +
  • Finish merging the fixes for #403 and #401 into v3, and fix the introduced bugs
  • +
  • Make sure that if an element is focused, and a mouseleave event is captured, we do not unformat the element value (with the scale options).
  • +
  • Make sure if the element value is empty, that the scaleDivisor option do not convert it to '0.00' on mouseenter.
  • +
  • Remove a ternary operator which lead to a variable overwriting itself.
  • +
  • Fix the end-to-end tests which test the percentage with the scale options.
  • +
+

3.0.0-beta.5

+
    +
  • Fix issue #395 Allow to show the unformatted value when hovering over the element and pressing Alt
  • +
+

3.0.0-beta.4

+
    +
  • Fix issue #396 Allow autoNumeric to manage user inputs in contentEditable-enabled elements
  • +
  • Simplify the _formatDefaultValueOnPageLoad() method signature.
  • +
  • Simplify how the update() function retrieve the current raw value and one of its test.
  • +
  • Remove any direct access to this.domElement.value, and use the getElementValue() to access the element value or textContent, and setElementValue() to set it.
  • +
  • Rewrite the getElementSelection() and setElementSelection() functions in order to manage non-input DOM elements.
  • +
  • Strengthen getElementValue() when managing non-input DOM elements.
  • +
+

3.0.0-beta.3

+
    +
  • Fix issue #399 Fully convert autoNumeric to an ES6 module
  • +
  • Fix issue #398 Finish removing all jQuery dependencies
  • +
  • Fix issue #244 [Feature request] Remove the jQuery dependency
  • +
  • Add an entry point src/main.js for bundling the library.
  • +
  • Split the library into 3 files ;
  • +
  • autoNumeric.js, which contains the AutoNumeric class,
  • +
  • AutoNumericEnum.js which contains the enumerations used by AutoNumeric, and
  • +
  • +

    AutoNumericHelper.js which contains the AutoNumericHelper class which provides static helper functions.

    +
  • +
  • +

    Extract the allowedTagList, keyCode and keyName into AutoNumericEnum.

    +
  • +
  • Add the isEmptyString, isNumberOrArabic, isFunction, isElement, isInputElement, arabicToLatinNumbers, triggerEvent, randomString, getElementValue, setElementValue, cloneObject, camelize, text, setText and filterOut functions to the helper functions.
  • +
  • Move the preparePastedText, runCallbacksFoundInTheSettingsObject, maximumVMinAndVMaxDecimalLength, stripAllNonNumberCharacters, toggleNegativeBracket, convertToNumericString, toLocale, modifyNegativeSignAndDecimalCharacterForRawValue, modifyNegativeSignAndDecimalCharacterForFormattedValue, checkEmpty, addGroupSeparators, truncateZeros, roundValue, truncateDecimal, checkIfInRangeWithOverrideOption functions into the AutoNumeric object.
  • +
  • Improve the character() method to take into account the quirks of some obsolete browsers.
  • +
  • Remove the getCurrentElement() function since we now only need to access the this.domElement property.
  • +
  • Remove the AutoNumericHolder class and the getAutoNumericHolder() function since we are now using the AutoNumeric class as the 'property holder'.
  • +
  • Add multiple ways to initialize an AutoNumeric element (cf. the AutoNumeric constructor and the _setArgumentsValues() method).
  • +
  • Simplify the input type and tag support check.
  • +
  • Add the serializeSpaces option that allows the user to defines how the serialize function will managed the spaces, either by converting them to '%20', or to the '+' string, the latter now being the default.
  • +
  • Add the noEventListeners option that allows the user to initialize an AutoNumeric <input> element without adding any AutoNumeric event listeners.
  • +
  • Add the readOnly option to the settings that allow the <input> element to be set to read-only on initialization.
  • +
  • Add a feature where all AutoNumeric-managed elements in a page share a common list.
  • +
  • Add a feature where the AutoNumeric-managed elements that initialized each other share a common list, allowing the user to perform a single action on many elements at once (via the .global.* functions).
  • +
  • Add a isPristine() method to test if an AutoNumeric-managed element value/textContent has been changed since its initialization.
  • +
  • Rename unset to unformat.
  • +
  • Rename reSet to reformat.
  • +
  • Add an unformatLocalized() function to unformat the element value while using the outputFormat setting.
  • +
  • Add a clear() method to empty the element value.
  • +
  • Add a nuke() method to remove the DOM element from the DOM tree.
  • +
  • Add a .global.has() method to check if the given AutoNumeric object (or DOM element) is in the local AutoNumeric element list.
  • +
  • Add a .global.addObject() method that adds an existing AutoNumeric object (or DOM element) to the local AutoNumeric element list.
  • +
  • Add a .global.removeObject() method that removes the given AutoNumeric object (or DOM element) from the local AutoNumeric element list.
  • +
  • Add a .global.empty() method to remove all elements from the shared list.
  • +
  • Add a .global.elements() method to retrieve all the AutoNumeric object that share the same local list.
  • +
  • Add a .global.getList() method to retrieve the local AutoNumeric element list.
  • +
  • Add one function for updating each option individually (ie. anElement.options.decimalCharacter('.')) instead of having to pass an object.
  • +
  • Add a version() method to output the current AutoNumeric version (for debug purpose).
  • +
  • Fix the set() method so that the rawValue is updated when the value is set to ''.
  • +
  • Add a setUnformatted() method to set the value given value directly as the DOM element value, without formatting it beforehand.
  • +
  • Deprecate the get() method to the renamed getNumericString() which bares more meaning.
  • +
  • Add a getFormatted() method to retrieve the current formatted value of the AutoNumeric element as a string.
  • +
  • Add a getNumber() method that returns the element unformatted value as a real Javascript number.
  • +
  • Add a getLocalized() method that returns the unformatted value, but following the outputFormat setting.
  • +
  • Add a unformatLocalized() method that unformats the element value by removing the formatting and keeping only the localized unformatted value in the element.
  • +
  • Add a selectNumber() method that select only the numbers in the formatted element content, leaving out the currency symbol, whatever the value of the selectNumberOnly option.
  • +
  • Add a selectInteger() method that select only the integer part in the formatted element content, whatever the value of the selectNumberOnly option.
  • +
  • Add a selectDecimal() method that select only the decimal part in the formatted element content, whatever the value of selectNumberOnly.
  • +
  • Add a node() method that returns the DOM element reference of the autoNumeric-managed element.
  • +
  • Add a parent() method that returns the DOM element reference of the parent node of the autoNumeric-managed element.
  • +
  • Add a detach() method that detach the current AutoNumeric element from the shared local 'init' list.
  • +
  • Add an attach() method that attach the given AutoNumeric element to the shared local 'init' list.
  • +
  • Add a formatOther() method that format and return the given value, or set the formatted value into the given DOM element if one is passed as an argument.
  • +
  • Add an unformatOther() method that unformat and return the raw numeric string corresponding to the given value, or directly set the unformatted value into the given DOM element if one is passed as an argument.
  • +
  • Add an init() method that allows to use the current AutoNumeric element settings to initialize the DOM element given as a parameter. This effectively link the two AutoNumeric element by making them share the same local AutoNumeric element list.
  • +
  • Add a form() method that return a reference to the parent element if it exists, otherwise return null.
  • +
  • Add a formNumericString() method that returns a string in standard URL-encoded notation with the form input values being unformatted.
  • +
  • Add a formFormatted() method that returns a string in standard URL-encoded notation with the form input values being formatted.
  • +
  • Add a formLocalized() method that returns a string in standard URL-encoded notation with the form input values, with localized values.
  • +
  • Add a formArrayNumericString() method that returns an array containing an object for each form <input> element.
  • +
  • Add a formArrayFormatted() method that returns an array containing an object for each form <input> element, with the value formatted.
  • +
  • Add a formArrayLocalized() method that returns an array containing an object for each form <input> element, with the value localized.
  • +
  • Add a formJsonNumericString() method that returns a JSON string containing an object representing the form input values.
  • +
  • Add a formJsonFormatted() method that returns a JSON string containing an object representing the form input values, with the value formatted.
  • +
  • Add a formJsonLocalized() method that returns a JSON string containing an object representing the form input values, with the value localized.
  • +
  • Add a formUnformat() method that unformat all the autoNumeric-managed elements that are a child of the parent element of this DOM element, to numeric strings.
  • +
  • Add a formUnformatLocalized() method that unformat all the autoNumeric-managed elements that are a child of the parent element of this DOM element, to localized strings.
  • +
  • Add a formReformat() method that reformat all the autoNumeric-managed elements that are a child of the parent element of this DOM element.
  • +
  • Add a formSubmitNumericString() method that convert the input values to numeric strings, submit the form, then reformat those back.
  • +
  • Add a formSubmitFormatted() method that submit the form with the current formatted values.
  • +
  • Add a formSubmitLocalized() method that convert the input values to localized strings, submit the form, then reformat those back.
  • +
  • Add a formSubmitArrayNumericString() method that generate an array of numeric strings from the <input> elements, and pass it to the given callback.
  • +
  • Add a formSubmitArrayFormatted() method that generate an array of the current formatted values from the <input> elements, and pass it to the given callback.
  • +
  • Add a formSubmitArrayLocalized() method that generate an array of localized strings from the <input> elements, and pass it to the given callback.
  • +
  • Add a formSubmitJsonNumericString() method that generate a JSON string with the numeric strings values from the <input> elements, and pass it to the given callback.
  • +
  • Add a formSubmitJsonFormatted() method that generate a JSON string with the current formatted values from the <input> elements, and pass it to the given callback.
  • +
  • Add a formSubmitJsonLocalized() method that generate a JSON string with the localized strings values from the <input> elements, and pass it to the given callback.
  • +
  • Add a static test() method that if the given domElement is already managed by AutoNumeric (if it has been initialized on the current page).
  • +
  • Add multiple private methods to create and delete a global list of AutoNumeric objects (via a WeakMap), as well as the methods to add and remove elements to that list.
  • +
  • Add multiple private methods to manage the local enumerable list of AutoNumeric objects that are initialized together and share a common local list.
  • +
  • Add the private methods _mergeSettings() and _cloneAndMergeSettings() to do what they are named about.
  • +
  • Modify the static format() method so that it formats the given number (or numeric string) with the given options, and returns the formatted value as a string.
  • +
  • Add a static formatAndSet() method that format the given DOM element value, and set the resulting value back as the element value.
  • +
  • Modify the static unformat() method so that it unformats the given formatted string with the given options, and returns a numeric string.
  • +
  • Add a static unformatAndSet() method that unformat the given DOM element value, and set the resulting value back as the element value.
  • +
  • Add a static localize() method that unformat and localize the given formatted string with the given options, and returns a numeric string.
  • +
  • Add a static isManagedByAutoNumeric() method that returns true is the given DOM element has an AutoNumeric object that manages it.
  • +
  • Add a static getAutoNumericElement() method that returns the AutoNumeric object that manages the given DOM element.
  • +
  • Add the french(), northAmerican(), british(), swiss(), japanese(), spanish() and chinese() methods that update the settings to use the named pre-defined language options.
  • +
  • Convert some cryptic ternary statements to if/else block.
  • +
  • Remove the unknown parameter setReal from some functions.
  • +
  • Remove the need to pass around the settings in many functions signatures (using this.settings directly).
  • +
  • Rename the temporary variables created by coping some settings, with the new option names.
  • +
  • Correct the warning shown when using isNan() on non-number elements like strings.
  • +
  • Keep the focus status of the DOM element in the new this.isFocused variable.
  • +
  • Use the getElementValue() function to retrieve the element value or textContent (depending if the element in an <input> or another tag), which allow AutoNumeric to perform some operations on non-input elements too. This is the first changes needed for the goal of managing the non-input tags with contentEditable with AutoNumeric.
  • +
  • Use the getElementValue() function as well in order to be able to set the value or textContent transparently where needed.
  • +
  • Rename _updateAutoNumericHolderProperties() to _updateInternalProperties().
  • +
  • Complete some JSDoc to be more precise on the event or element types. This helps for IDE autocompletion.
  • +
  • Rewrite completely how AutoNumeric test if the given DOM element is supported or not (by using the new _checkElement() method). This simplify the process by calling the new _isElementTagSupported(), _isInputElement() and _isInputTypeSupported() functions which respect the separation of concerns.
  • +
  • The _formatDefaultValueOnPageLoad() method now accepts a 'forced' initial value instead of the default one.
  • +
  • Remove the tests about the input type or element support from the set() methods, since those cannot change once AutoNumeric has been initialized, simplifying the code.
  • +
  • Remove duplicated tests (ie. settings.formatOnPageLoad inside the formatDefaultValueOnPageLoad() function that is only called if settings.formatOnPageLoad is already set).
  • +
  • Rename the getInitialSettings() method to _setSettings().
  • +
  • Use array destructuring to give more meaningful names to the data returned by the _getSignPosition() function.
  • +
  • Add a private _serialize() function that take care of serializing the form data into multiple output as needed, which is called by the _serializeNumericString(), _serializeFormatted(),_serializeLocalized(), _serializeNumericStringArray(), _serializeFormattedArray() and _serializeLocalizedArray() methods.
  • +
  • The default settings are now exposed on the AutoNumeric class as a static object AutoNumeric.defaultSettings.
  • +
  • Add the static AutoNumeric.options object that gives access to all the possible options values, with a semantic name (handy for IDE autocompletion).
  • +
  • The pre-defined language options objects are now accessible via the static AutoNumeric.languageOptions object.
  • +
  • Add the static AutoNumeric.multiple() function that allows to initialize numerous AutoNumeric object (on numerous DOM elements) in one call (and possibly pass multiple values that will be mapped to each DOM element).
  • +
  • Add end-to-end tests for initializing non-<input> tags.
  • +
  • Add e2e tests for initializing elements with the noEventListeners or readOnly options.
  • +
  • Convert the end-to-end tests to the new API v3.
  • +
  • Convert the unit tests to the new API v3.
  • +
  • Add unit tests for the serializeSpaces, noEventListeners and readOnly options.
  • +
  • Fix the unit tests checking that the rawValue was correctly set when using getSettings().
  • +
  • Add unit tests to check the .global.* methods.
  • +
  • Add unit tests to check the AutoNumeric.multiple() methods.
  • +
  • Add unit tests to check the selectDecimal, selectInteger, reformat, unformat and unformatLocalized methods.
  • +
  • Add unit tests to check the .form* methods.
  • +
  • Add the babel-plugin-transform-object-assign dev dependency in order to be able to use Object.assign() in the ES6 source.
  • +
+

3.0.0-beta.2

+
    +
  • Fix issue #393 Add an option modifyValueOnWheel that allow the user to use mouse wheel to increment/decrement the element value
  • +
  • The related wheelStep option allows to either define a fixed step (ie. 1000), or a progressive one calculated based on the current element value
  • +
  • Fix issue #397 Create enumerations for every options that allows only a set of values
  • +
+

3.0.0-beta.1

+
    +
  • Fix issue #387 Add a 'cancellable' feature
  • +
  • It's now possible to select the whole input by hitting the Escape key (if no changes have been made to the element value, otherwise this will cancel those changes if the isCancellable is set to true)
  • +
  • Fix issue #391 The currency symbol is selected when focusing on an input via the Tab key, when selectNumberOnly is set to true
  • +
  • Refactor the code to create a _selectOnlyNumbers() function that extract that behavior for re-use.
  • +
  • Create a _select() function that select the whole element content, while respecting the selectNumberOnly option.
  • +
  • Create a _defaultSelectAll() function that select the whole element content, including all characters.
  • +
  • Modify the setElementSelection() calls to simplify them with the ability to use one argument instead of two when the start and end position are the same.
  • +
  • Add a feature where when the user hit 'Escape', the element content is selected (cf. issue #387).
  • +
+

v2

+

2.0.13

+
    +
  • Merge the fix from issue #440 Pasting does not work in IE11 from next to master. + This fix the issue #465 "Unable to get property 'getData' of undefined or null reference" on paste in IE11
  • +
  • Merge the fix from issue #449 AutoNumeric.unformat() only removes the first instance of settings.digitGroupSeparator from next to master.
  • +
+

2.0.12

+
    +
  • Add Android Chrome mobile (version 57) support (note: so far, not all android browsers are supported)
  • +
  • Fix issue #404 On the Android browser, inserted numbers are doubled if the user press the keys quickly on the virtual keyboard
  • +
  • Fix issue #250 The maximumValue and minimumValue options are not taken into account on Android
  • +
  • Fix issue #264 Entering the decimalCharacterAlternative is not taken into account on Android Chrome
  • +
  • Add the special keyCode 229 used by Android browsers as keyCode.AndroidDefault
  • +
  • Fix the onPaste handler throwing an error for uninitialized variables
  • +
  • Complete the arabicToLatinNumbers() function to return more quickly if no arabic numbers are found
  • +
+

2.0.11

+
    +
  • Fix issue #248 Create the autoNumeric organization, and move the repository to it
  • +
+

2.0.10

+
    +
  • Fix issue #417 Error thrown in PhantomJS 2.1.1 on Linux under CI Environment
  • +
  • Fix the end-to-end tests for issue #403
  • +
  • Fix the webdriver.io configuration for the links to jQuery and AutoNumeric libraries
  • +
+

2.0.9

+
    +
  • Fix issue #401 autoNumeric 2.0.8 prevents IE11 from entering the decimal character from the numpad
  • +
  • Fix issue #403 autoNumeric 2.0.8 scaling option when the divisor is less than zero and the input receives focus multiple times
  • +
+

2.0.8

+
    +
  • Fix issue #389 autoNumeric 2.0.7 npm packages causes build error with typescriptify + browserify
  • +
+

2.0.5", "2.0.6" & "2.0.7

+
    +
  • Fix issue #384 npm install for version 2.0.4 does not work on Windows machines
  • +
+

2.0.2", "2.0.3" & "2.0.4

+
    +
  • Fix issue #377 The dist files in the last publish to npmjs were not rebuilt with the fixes pushed to 2.0.1
  • +
  • Fix issue #373 The dist files are not included when publishing to npmjs
  • +
  • Fix issue #371 The currency symbol is not removed on blur with the default emptyInputBehavior value focus
  • +
  • Fix issue #367 The package.json "postinstall" task does not find the target file when not using the dev dependencies
  • +
+

2.0.1

+
    +
  • Fix issue #373 The dist files are not included when publishing to npmjs
  • +
+

2.0.0

+
    +
  • Release autoNumeric version 2.0.0, enjoy! (¬‿¬) 🎉
  • +
  • The old options names are being deprecated, and will be removed soon ; update your scripts with the new ones!
  • +
  • Please be sure to read the updated readme in order to know what else has changed.
  • +
+

2.0.0-beta.25

+
    +
  • Fix issue #310 Setup Webdriver.io for end-to-end (e2e) testing
  • +
+

2.0.0-beta.24

+
    +
  • Fix issue #326 Pasting a single decimal character into an input that has none does not work
  • +
  • Fix issue #322 Pasting a string containing a comma set the caret position at the wrong position
  • +
+

2.0.0-beta.23

+
    +
  • Fix issue #354 Setup automated coverage tests (with Coveralls)
  • +
+

2.0.0-beta.22

+
    +
  • Fix issue #345 Setup continuous integration testing (with Travis CI)
  • +
+

2.0.0-beta.21

+
    +
  • Fix issue #346 Add a showPositiveSign option to display the positive sign wherever needed
  • +
+

2.0.0-beta.20

+
    +
  • Fix issue #341 Add some default options in the languageOption object
  • +
  • Fix issue #328 Switch from npm to yarn
  • +
+

2.0.0-beta.19

+
    +
  • Allow using set with Arabic and Persian numbers (ie. aNInput.autoNumeric('set', '١٠٢٣٤٥٦٧.٨٩');)
  • +
  • Allow using Arabic and Persian numbers (used in Arabic languages) in the html value attribute
  • +
  • Allow pasting Arabic and Persian numbers (that will get converted to latin numbers on the fly)
  • +
+

2.0.0-beta.18

+
    +
  • Fix issue #330 The negativePositiveSignPlacement option can be ignored in some cases
  • +
  • Fix issue #339 get returns '0' when the input is empty even if emptyInputBehavior is not equal to 'zero'
  • +
+

2.0.0-beta.17

+
    +
  • Fix issue #317 Jump over the decimal character when trying to enter a number and the integer part limit has already been attained
  • +
  • Fix issue #319 'get' returns wrong value when the value has a trailing negative sign
  • +
  • Fix issue #327 When focusing on an input via the Tab key, the value is not always selected
  • +
+

2.0.0-beta.16

+
    +
  • Fix issue #321 Allows more international decimal characters and grouping separators :
  • +
  • Allowed grouping separator : ',', '.', '٬', '˙', "'", ' ', '\u2009', '\u202f', '\u00a0' and ''
  • +
  • Allowed decimal characters : '.', ',', '·', '⎖' and '٫'
  • +
+

2.0.0-beta.15

+
    +
  • Fix FireFox on issue #306 that allows the caret to move right when all zero present in the decimals
  • +
  • Fix issue #318 this.selection can be uninitialized if you focus on an input via the Tab key.
  • +
  • Add the keyName object that list the key values as defined is the KeyboardEvent Key_Values.
  • +
  • Rename the key() function to keyCodeNumber().
  • +
  • Split _updateFieldProperties() into _updateAutoNumericHolderProperties() and _updateAutoNumericHolderEventKeycode().
  • +
  • _updateAutoNumericHolderProperties() only update the value and selection in each event handler, and resets the 'processed' and 'formatted' states.
  • +
  • _updateAutoNumericHolderEventKeycode() is called only once on keypress, and set the event keyCode into the AutoNumericHolder object.
  • +
  • Remove the need to save this.ctrlKey, this.cmdKey and this.shiftKey three times on each key stroke.
  • +
  • Rename this.kdCode into this.eventKeyCode, and use that variable globally in the AutoNumericHolder object.
  • +
  • Fix _normalizeParts() so that a '0' entered via the numpad is managed as well.
  • +
  • Complete the substitution of magic numbers with keyCode values.
  • +
  • Modify _processCharacterInsertion() so that it take the event as an argument, and therefore can directly use e.key.
  • +
  • Simplify _formatValue() tests.
  • +
+

2.0.0-beta.14

+
    +
  • Fix issue #306 when { leadingZero: 'deny' } and proper caret placement
  • +
+

2.0.0-beta.13

+
    +
  • Fix issue #228 Do not modify the current selection when trying to input an invalid character
  • +
  • Mass rename functions to gives them a more explicit name :
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Old nameNew name
autoCheck()->checkIfInRangeWithOverrideOption()
autoRound()->roundValue()
autoGroup()->addGroupSeparators()
fixNumber()->modifyNegativeSignAndDecimalCharacterForRawValue()
presentNumber()->modifyNegativeSignAndDecimalCharacterForFormattedValue()
negativeBracket()->toggleNegativeBracket()
autoGet()->getCurrentElement()
getHolder()->getAutoNumericHolder()
autoSave()->saveValueToPersistentStorage()
_setPosition()->_setCaretPosition()
_signPosition()->_getSignPosition()
_formatQuick()->_formatValue()
+

2.0.0-beta.12

+
    +
  • Modify the validate() function to show a warning when decimalPlacesOverride is greater than decimalPlacesShownOnFocus.
  • +
  • Implement feature request #183 that manage invalid results when trying to paste any number. This adds the onInvalidPaste option that can accept the error, ignore, clamp, truncate and replace value.
  • +
  • Rename autoStrip() to stripAllNonNumberCharacters().
  • +
  • Upgrade the setElementSelection() function so that it can accept only one caret position.
  • +
  • Add a failOnUnknownOption option which allows autoNumeric to strictly analyse the options passed, and fails if an unknown options is used in the settings object.
  • +
+

2.0.0-beta.11

+
    +
  • Fix typos and missing characters that prevented building the library.
  • +
+

2.0.0-beta.10

+
    +
  • Fix issue #302 leadingZero option deny does not function correctly and deletes some of the zero to the right of the caret
  • +
  • Fix issue #303 When focusing on an input having currencySymbolPlacement set as p (prefix)
  • +
+

2.0.0-beta.9

+
    +
  • Rename the old options name to more explicit ones :
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Old nameNew name
aSep->digitGroupSeparator
nSep->noSeparatorOnFocus
dGroup->digitalGroupSpacing
aDec->decimalCharacter
altDec->decimalCharacterAlternative
aSign->currencySymbol
pSign->currencySymbolPlacement
pNeg->negativePositiveSignPlacement
aSuffix->suffixText
oLimits->overrideMinMaxLimits
vMax->maximumValue
vMin->minimumValue
mDec->decimalPlacesOverride
eDec->decimalPlacesShownOnFocus
scaleDecimal->scaleDecimalPlaces
aStor->saveValueToSessionStorage
mRound->roundingMethod
aPad->allowDecimalPadding
nBracket->negativeBracketsTypeOnBlur
wEmpty->emptyInputBehavior
lZero->leadingZero
aForm->formatOnPageLoad
sNumber->selectNumberOnly
anDefault->defaultValueOverride
unSetOnSubmit->unformatOnSubmit
outputType->outputFormat
debug->showWarnings
+
    +
  • Add a convertOldOptionsToNewOnes() function that automatically convert old options to new ones, to ease the evolution to v2.*.
  • +
  • Update typings.d.ts accordingly
  • +
  • Update README.md accordingly
  • +
  • Complete the tests to make sure using old option names will output a warning about them being deprecated
  • +
+

2.0.0-beta.8

+
    +
  • Fix issue #292 where native input and change events are not sent correctly.
  • +
  • Add a isNumber() helper function to test if a value is a number, or a string representing a number.
  • +
  • Add a isInt() helper function to test if a value is a 'real' integer.
  • +
  • Modify decimalPlaces() so that it always return the number of decimal places (ie. 0 instead of null if there is none).
  • +
  • Add a key() helper function to retrieve an event keyCode.
  • +
  • Complete and improve some JSDoc.
  • +
  • Rename runCallbacks() into runCallbacksFoundInTheSettingsObject().
  • +
  • Simplify decLength() function, as well as removing unnecessary code before each call to this function.
  • +
  • Rename decLength() to maximumVMinAndVMaxDecimalLength().
  • +
  • Drastically improve performance by removing duplicated function calls.
  • +
  • Improve autoCode() call hierarchy.
  • +
  • Merge autoCode() into getInitialSettings().
  • +
  • Caches an additional regex.
  • +
  • Rename some functions and variables to make them more explicit.
  • +
  • Refactor autoGroup() to use switch statements.
  • +
  • Refactor how dPos was used to make it more understandable.
  • +
  • Rename keepOriginalSettings into keepAnOriginalSettingsCopy().
  • +
  • Simplify autoSave() so that it directly uses the element as an argument, instead of a jQuery reference.
  • +
  • Create an AutoNumericHolder ES6 class to store the field properties of an autoNumeric element.
  • +
  • Rename the AutoNumericHolder init() function to _updateFieldProperties().
  • +
  • Rename the AutoNumericHolder functions that should be private.
  • +
  • Fix issue #283.
  • +
  • Rename processAlways() into _processCharacterDeletion(), and simplify it so that if does not do two things at the same time.
  • +
  • Rename processKeypress() into _processCharacterInsertion(), and simplify it so that if does not do two things at the same time.
  • +
  • Merge some conditions in _formatQuick().
  • +
  • Remove the need for a jQuery dependency in the events listeners.
  • +
  • Convert some jQuery event listeners to pure JS event listeners.
  • +
  • Convert some jQuery-specific functions to native JS ones (ie. $this.val() to e.target.value).
  • +
  • Simplify the event listeners by removing any unused returns.
  • +
  • Remove unnecessary getHolder() calls in the event listeners.
  • +
  • Make the 'enter' key send a change event when used and the value has been changed.
  • +
  • Add an onBlur event listener, allowing us to trigger change events as needed.
  • +
  • Reduce getInitialSettings() length by a great deal, making it easier to read and understand.
  • +
  • The getInitialSettings() functions now calls the calculateVMinAndVMaxIntegerSizes(), correctMDecOption(), setsAlternativeDecimalSeparatorCharacter(), cachesUsualRegularExpressions() and transformOptionsValuesToDefaultTypes() functions.
  • +
  • Refactor the update() code into getInitialSettings(), which allows to remove the autoCode() calls from the AutoNumericHolder constructor and the _updateFieldProperties() function.
  • +
  • Remove the need for jQuery in getSettings().
  • +
  • Modify the validate() test on the mDec option to allow for a positive integer too.
  • +
  • Allow the autoFormat() function to format numbers represented as a string.
  • +
  • Complete the autoFormat() tests and check for the value validity.
  • +
  • Remove the sendCustomEvent() function and replace it by the triggerEvent() one (and remove createCustomEvent() as well).
  • +
  • Complete the autoUnFormat() tests and check for the value validity.
  • +
  • Modify the autoUnFormat() behavior so that when given a number (a real one or a string representing one), the function always return a 'real' number, whatever the options passed.
  • +
  • Modify the eslint 'radix' rule to allow for always specifying a radix for the parseInt function.
  • +
  • Comment out the default Jasmine test in order to see a 100% success without any skipped tests.
  • +
  • Fix the clean:build npm script so that it does not try to remove an inexistant folder.
  • +
+

2.0.0-beta.7

+
    +
  • Add "mouseenter" & "mouseleave" handlers to enable viewing the extended values for "eDec", "scaleDivisor" & "nSep" options.
  • +
  • Add third parameter to the "autoGet" call in "onFocusOutAndMouseLeave" function
  • +
+

2.0.0-beta.6

+
    +
  • Rename the localOutput setting to outputType, and add an option 'number' that makes getLocalized always return a Number, instead of a string.
  • +
  • Modify the get function so that it always returns a valid Number or string representing a number that Javascript can interpret.
  • +
  • Add a getLocalized function that return the raw value of the input, but can also return the value localized with a decimal point and negative sign placement chosen by the user (basically, it replace the old get behavior if any user wants it back).
  • +
  • Modify the pNeg default value based on the aSign and pSign values. This leads to better user experience when setting a currency symbol without setting pNeg.
  • +
  • Errors are now always thrown. The debug option now only affects the warning messages (used for non-critical errors).
  • +
+

2.0.0-beta.5

+
    +
  • Add a validate() method that checks if the given options object is valid.
  • +
  • Reorganize the init function code to check for critical error first, before doing other calculus.
  • +
  • Add a areSettingsValid() method that return true if the options object is valid.
  • +
  • Add multiple helper functions isBoolean, isNull, isTrueOrFalseString, isObject, isEmptyObj, hasDecimals, decimalsPlaces.
  • +
  • Add a warning() method that output warning message to the console.
  • +
  • Rename originalSettings to keepOriginalSettings to better convey what this function is doing.
  • +
+

2.0.0-beta.4

+
    +
  • Removed the index.html file
  • +
  • Additional mods/fixes to the scaling options
  • +
  • Additional mods/fixes to the "nSep" to also handle the "aSuffix"
  • +
  • Fixed the "mRound" default
  • +
+

2.0.0-beta.3

+
    +
  • fixed nSep option which removes the Currency symbol and thousand separator on focusin
  • +
  • changed the defaults for scaleDivisor, scaleDecimal & scaleSymbol to null
  • +
+

2.0.0-beta.2

+
    +
  • Modify the scaling options and separate them
  • +
  • aScale - removed
  • +
  • scaleDivisor added
  • +
  • scaleDecimal added
  • +
  • scaleSymbol added
  • +
+

2.0.0-beta.0 (released 2016-11-16)

+
    +
  • Prepare the code base for future Jasmine tests
  • +
  • Add initial babel support
  • +
  • Add uglify and npm-build-process support
  • +
  • Merge the 2.0 changes into master
  • +
  • Add npm support for building the minified version
  • +
  • Multiple small fixes
  • +
  • Fixed paste event on both context menu and ctrl-v // issue #251 special thanks to @rhyek
  • +
  • Fixed tab in key select all and deletion // issue #246
  • +
  • Fixed issue with Vue.js 2.0 // issue #247
  • +
  • Fixed context menu paste event // issue #251
  • +
  • switch from jsLint to jsHint
  • +
  • Fixed tab in key // thanks movalz issue #212
  • +
  • Fixed the cursor position when tabbing in Chrome // thanks Dennis Smith issue #221
  • +
  • Fixed the destroy method // thanks brunoporto & Mabusto issue #225
  • +
  • Fixed the readme file to show correct $.extend defaults // thanks gayan85 issue #229
  • +
  • Fixed bug in unSetOnSubmit option to handle non autoNumeric controlled inputs
  • +
  • Fixed bug in get method
  • +
  • Mods to the trailing minus sign code
  • +
  • Added UMD support
  • +
  • Modified & improved the shim for throwing the input event
  • +
  • Added option unSetOnSubmit to unformat input on the submit event
  • +
  • Added option debug to turn on and off error being thrown
  • +
  • Added support for arbitrary-precision decimal arithmetic. This was adapted from Big.js https://github.com/MikeMcl/big.js/ Many thanks to Mike
  • +
  • Added support for trailing minus signs
  • +
  • Added rounding methods for currencies with smallest coin being $0.05
  • +
  • Added modified sNumber option that selects only numbers ctr & a keys thanks Zayter
  • +
  • Added support for return values to have locale formats
  • +
  • Added debug option to turn off errors
  • +
  • Added option anDefault to help ASP.NETR postback errors
  • +
  • Modified the wEmpty option
  • +
  • Modified the init && set methods
  • +
  • General code clean up
  • +
  • Modified the set, getString & getArray methods
  • +
  • Modified the nBracket function
  • +
  • Fixed the update method when it is called during the onfocus event
  • +
  • Fixed the getString & getArray methods when multiple inputs share the same name - Thanks Retromax
  • +
  • Fixed bug in ctrl + v paste event to properly round
  • +
  • Merged a mod that makes the defaults public and overridable - Thanks Peter Boccia
  • +
  • Fixed page reload when the thousand separator is a period .
  • +
+

v1.9

+

1.9.46 (released 2016-09-11)

+
    +
  • Fixed tab in key // thanks movalz issue #212
  • +
  • Fixed the cursor position when tabbing in Chrome // thanks Dennis Smith issue #221
  • +
  • Fixed the destroy method // thanks brunoporto & Mabusto issue #225
  • +
  • Fixed the readme file to show correct $.extend defaults // thanks gayan85 issue #229
  • +
+

1.9.45 (released 2016-06-13)

+
    +
  • Modified the "set" method to handle NaN
  • +
+

1.9.44 (released 2016-06-06)

+
    +
  • Fixed destroy method
  • +
  • Added Typings support - thanks bcherny
  • +
+

1.9.43 (released 2015-12-19)

+
    +
  • UMD support
  • +
+

1.9.42 (released 2015-11-20)

+
    +
  • Fixed bug when pasting using ctrl & v keys
  • +
+

1.9.41 (released 2015-11-02)

+
    +
  • Fixed bug that allowed two currency symbols - thanks Mic Biert
  • +
+

1.9.40 (released 2015-10-25)

+
    +
  • Fixed bug when pasting value and the decimal separator is a comma ","
  • +
  • Modified the "destroy" method so that an error is not thrown if the "init" method has not been called previously
  • +
+

1.9.39

+
    +
  • Fixed 'aForm'option.
  • +
  • Updated the readme file
  • +
+

1.9.38

+
    +
  • Added / fixed option to address asp.Net WebForm postback.
  • +
  • please see the readme section on default settings & options
  • +
+

1.9.37

+
    +
  • Added / fixed support for asp.Net WebForm postback.
  • +
  • During postback the default value is re-rendered showing the updated value
  • +
  • Because autoNumeric cannot distinguish between a page re-load and asp.net form postback, the following HTML data attribute is REQUIRED (data-an-default="same value as the value attribute") to prevent errors on postback
  • +
  • Example: +
    <input type="text" id="someID" value="1234.56" data-an-default="1234.56">
    +
  • +
+

1.9.36

+
    +
  • Rewrote the "getString" & "getArray" methods to index successful elements and inputs that are controlled by autoNumeric. This ensures the proper input index is used when replacing the formatted value.
  • +
  • Added support for FireFox for Mac meta key "keycode 224" - Thanks Ney Estrabelli
  • +
+

1.9.35

+
    +
  • Revert 'set' back to version 1.9.34
  • +
+

1.9.34

+
    +
  • Modified the 'set', 'getString' & 'getArray' methods
  • +
  • Modified the 'nBracket' function
  • +
  • General code clean up
  • +
+

1.9.33

+
    +
  • Fixed bug in "ctrl + v" paste event introduced in 1.9.32
  • +
+

1.9.32

+
    +
  • Fixed bug when the "update" method is called in the "onfocus" event
  • +
  • Fixed the "getString" & "getArray" methods when multiple inputs share the same name - Thanks Retromax
  • +
  • Fixed bug in "ctrl + v" paste event to properly round
  • +
+

1.9.31

+
    +
  • never officially release
  • +
+

1.9.30

+
    +
  • Fixed bug introduced 1.9.29 too interested in Ohio State vs. Oregon
  • +
+

1.9.29

+
    +
  • Fixed bug introduced in 1.9.27
  • +
+

1.9.28

+
    +
  • Fixed focusout event when the thousand separator is a period "." and only one is present "x.xxx" with not other alpha characters.
  • +
+

1.9.27

+
    +
  • Merged a mod that makes the defaults public and overridable - Thanks Peter Boccia
  • +
  • Fixed page reload when the thousand separator is a period "."
  • +
+

1.9.26

+
    +
  • Fixed "getString" & "getArray" methods when multiple forms having some shared named inputs
  • +
+

1.9.25

+
    +
  • Fixed mRound option "round-half-even"
  • +
  • Modified the "set" method to not throw an error when trying to "set" a null value
  • +
+

1.9.24

+
    +
  • Changed the case on the supported elements
  • +
  • This was required because jQuery.prop('tagName') returns upper-case on html5 pages and returns lower-case on xhtml pages
  • +
+

1.9.23

+
    +
  • Merged mod on the "getString" method
  • +
+

1.9.22

+
    +
  • Fixed a bug when a negative value uses brackets and currency sign on page reload thanks to Allen Dumaine
  • +
  • Additional mods to the "set" method.
  • +
  • Eliminated lastSetValue setting
  • +
+

1.9.21

+
    +
  • Mod to checkValue function to handle empty string - thanks to jedichenbin.
  • +
  • If CHF rounding is used decimal is automatically set to 2 places
  • +
+

1.9.20

+
    +
  • Fixed issue for very small numbers - thanks to jedichenbin.
  • +
+

1.9.18

+
    +
  • Added input type="tel" support.
  • +
  • Added support for Swiss currency rounding to the nearest ".00 or .05"
  • +
  • Fixed bug in Round-Half-Even "Bankers Rounding"
  • +
+

1.9.18

+
    +
  • Fixed formatting on page load for text elements.
  • +
+

1.9.17

+
    +
  • Fixed leading zero on page load when option lZero is set to 'keep'.
  • +
+

1.9.16

+
    +
  • Fixed the checkValue function when vary small numbers in scientific notation are passed via the set method.
  • +
  • Modified the rounding method so zero value is not returned with a negative sign
  • +
+

1.9.15

+
    +
  • Fixed bug introduced in version 1.9.14
  • +
+

1.9.14

+
    +
  • Added additional supported tags ('b', 'caption', 'cite', 'code', 'dd', 'del', 'div', 'dfn', 'dt', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ins', 'kdb', 'label', 'li', 'output', 'p', 'q', 's', 'sample', 'span', 'strong', 'td', 'th', 'u', 'var')
  • +
  • Moved the routine that tests for supported tags
  • +
  • General code clean-up
  • +
+

1.9.13

+
    +
  • Fixed the "get" method when the input receives focus for a second time.
  • +
+

1.9.12

+
    +
  • Fixed brackets on page load when the decimal character is a comma.
  • +
+

1.9.11

+
    +
  • Another mod to the 'set' method.
  • +
+

1.9.10

+
    +
  • Fixed the 'set' method to handle page reload using the back button.
  • +
+

1.9.9

+
    +
  • Fixed how non-input tags default value is handled. When the default is an empty string and aSign is not empty the return value is now and empty string.
  • +
  • Modified how default values are handled when the decimal character equals ',' comma. Your default value can now use either a a period '.' or comma ',' as the decimal separator
  • +
  • Modified the caret placement on focusin (tab in). If only the currency sign is visible the caret is placed in the proper location depending on the sign placement (prefix or suffix).
  • +
+

1.9.8

+
    +
  • Changed bind / unbind to on / off.
  • +
  • added lastSetValue to settings - this saves the unrounded value from the set method - $('selector').data('autoNumeric').lastSetValue; - helpful when you need to change the rounding accuracy
  • +
+

1.9.7

+
    +
  • Modified /fixed the format default values on page ready.
  • +
  • Fixed the caret position when jumping over the thousand separator with back arrow.
  • +
+

1.9.6

+
    +
  • Fixed bug introduced in 1.9.3 with shift key.
  • +
  • additional modification to the processKeypress function that automatically inserts a negative sign when vMax less than or equal to 0 and vMin is less than vMax.
  • +
+

1.9.5

+
    +
  • Modified processKeypress function to automatically insert a negative sign when vMax <=0 and vMin < 0.
  • +
  • Changed the getSting and getArray functions to use decodeURIComponent() instead of unescape() which is depreciated
  • +
+

1.9.4

+
    +
  • Merged issue #11 - Both getString and getArray were using escaped versions of the name from jQuery's serialization. So this change wraps the name finder with quotes and unescapes the name.Fixed a bug in autoCode that corrects the pasted values and page re-load - Thanks Cory.
  • +
  • Merged issue #12 - If a input is readonly during "init", autocomplete won't work if the input is enabled later. This commit should fix the Problem - Thanks Sven.
  • +
+

1.9.3

+
    +
  • Fixed a bug in autoCode function that corrects pasted values and page re-load
  • +
  • Added support for "shift" + "insert" paste key combination
  • +
+

1.9.2

+
    +
  • Modified the "checkValue" function - eliminated redundant code
  • +
  • Modified the "update" method include calling the "getHolder" function which updates the regular expressions
  • +
  • Modified the "getHolder function so the regular expressions are updated
  • +
  • Modified the "set" method to convert value from number to string
  • +
+

1.9.1

+
    +
  • Modified the checkValue function to handle values as text with the exception of values less than "0.000001 and greater than -1"
  • +
+

1.9.0

+
    +
  • Fixed a rounding error when the integers were 15 or more digits in length
  • +
  • Added "use strict";
  • +
+

v1.8

+

1.8.9

+
    +
  • Fixed the "get" and "set" methods by moving the settings.oEvent property to ensure the error message would be thrown if the element had not been initialized prior to calling the "get" and "set" methods
  • +
+

1.8.8

+
    +
  • Fixed the "init" when there is a default and value aForm=true and the aSep and aDec are not the defaults
  • +
+

1.8.7

+
    +
  • Fixed the "getSting" method - it use to returned an error when no values were entered
  • +
  • Modified the "init" method to better handle default and pre-existing values
  • +
  • Modified the "set" method - removed the routine that checked for values less than .000001 and greater than -1 and placed it in a separate function named checkValue()
  • +
  • Modified the "get" method:
      +
    • Added a call to the checkValue() function - this corrects returned values example - when the input value was "12." the returned value was "12." - it now returns "12"
    • +
    • When no numeric character is entered the returned value is an empty string "".
    • +
    +
  • +
+

1.8.6

+
    +
  • Removed the error message when calling the 'init' methods multiple times. This was done when using the class selector for the 'init' method and then dynamically adding input(s) it allows you to use the same selector to init autoNumeric. Please note: if the input is already been initialized no changes to the option will occur you still need to use the update method to change existing options.
  • +
  • Added support for brackets '[,]', parentheses '(,)', braces '{,}' and '<,>' to the nBracket setting. Please note: the following format nBracket: '(,)' that the left and right symbol used to represent negative numbers must be enclosed in quote marks and separated by a comma to function properly.
  • +
+

1.8.5

+
    +
  • Fixed readonly - this occurred when you toggle the readonly attribute
  • +
+

1.8.4

+
    +
  • Fixed the getString and getArray methods under jQuery-1.9.1
  • +
+

1.8.3

+
    +
  • Added input[type=hidden] support - this was done mainly for backward compatibility.
  • +
  • The "get" method now returns a numeric string - this also was done for backward compatibility.
  • +
+

1.8.2

+
    +
  • Allowed dGroup settings to be passed as a numeric value or text representing a numeric value
  • +
  • Allows input fields without type that defaults to type text - Thanks Mathieu Demont
  • +
+

1.8.1

+
    +
  • Modified the 'get' method so when a field is blank and the setting wEmpty:'empty' a empty string('') is returned.
  • +
+

1.8.0

+
    +
  • autoNumeric() 1.8.0 is not compatible with earlier versions but I believe you will find version 1.8.0's new functionality and ease of use worth the effort to convert.
  • +
  • Changed autoNumeric structure to conform to jQuery's recommended plugin development.
  • +
  • Created a single namespace and added multiple methods.
  • +
  • Added HTML 5 data support and eliminated the metadata plugin dependency.
  • +
  • Added support for the following elements: 'DD', 'DT', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'input', 'LABEL', 'P', 'SPAN', 'TD', 'TH'.
  • +
  • Changed the settings loading order to defaults, HTML5 data then options. Now the defaults settings are overridden by HTML5 data and options overrides both defaults & HTML5 data.
  • +
  • Added "lZero" to the settings to control leading zero behavior.
  • +
  • Added "nBracket" to the settings which controls if negative values are display with brackets.
  • +
  • Changed the callback feature to accept functions only.
  • +
  • Improved the 'aForm' behavior that allows values to be automatically formatted on page ready.
  • +
  • Fixed the issue for numbers that are less than 1 and greater than -1 and have six or more decimal places.
  • +
  • Fixed 'crtl' + 'a' (select all) and 'ctrl' + 'c' (copy) combined key events.
  • +
  • Fixed a IE & FF bug on readonly attribute.
  • +
  • General code clean up
  • +
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Developer guide/dependencies/index.html b/Developer guide/dependencies/index.html new file mode 100644 index 0000000..17129b6 --- /dev/null +++ b/Developer guide/dependencies/index.html @@ -0,0 +1,1496 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dependencies - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Dependencies

+ +

None! 🍾

+
+

Info

+

The jQuery dependencies has been removed in v4.0.0.

+
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Developer guide/how to contribute/index.html b/Developer guide/how to contribute/index.html new file mode 100644 index 0000000..e8c19f6 --- /dev/null +++ b/Developer guide/how to contribute/index.html @@ -0,0 +1,1797 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + How to contribute? - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

How to contribute?

+ +

Contributors and pull requests are welcome. Feel free to contact us for any questions.

+

Contributing, in a nutshell

+

For more detailed information about how to contribute, please check the rest of this page.

+

In a nutshell:

+
    +
  1. Get the latest source git clone -b next https://github.com/autoNumeric/autoNumeric.git && cd autoNumeric && yarn install
  2. +
  3. Make you changes
  4. +
  5. Lint, build, and run tests yarn lint && yarn build && yarn test
      +
    • If you encounter any linting problems, you can try to automatically fix those with yarn lintfix
    • +
    +
  6. +
  7. Create a pull request, and we'll check it out as soon as possible!
  8. +
+

Again, be sure to check the following guidelines for more details.

+

Also, feel free to follow our RSS feeds on master and next to keep up with the latest commits.

+

Junior jobs 🏅

+

Every contribution are welcomed, whatever their sizes.

+

If you want to contribute to a dynamic and welcoming open-source project, be sure to check our easy-to-start-with junior jobs, either by checking the issues for the tag Junior jobs, or by searching for the //TODO and //FIXME strings directly in the source (there are plenty awaiting for you right now!).

+

Happy coding :>

+

Get the latest source

+
git clone -b next https://github.com/autoNumeric/autoNumeric.git
+# or the following if you are authentified on Github:
+# `git clone -b next git@github.com:autoNumeric/autoNumeric.git`
+
+

Make your changes

+
+

Note

+

You can use either npm or yarn for running the install/build scripts. We'll use yarn in the following examples.

+
+

First things first, in order to be able to compile the ES6 source to something that can be interpreted by the browsers, and get the tools (linter, test runners, etc.) used by the developers, you need to install them by doing : +

cd autoNumeric
+yarn install
+

+
+

Hint

+

You need to have yarn installed before executing this command.
You can install yarn globally by doing npm install -g yarn as root.

+
+

Once you made your changes, you can build the library with : +

yarn build
+
+This will generate the autoNumeric.js and autoNumeric.min.js files in the dist folder, that you'll then be able to use in the browsers.

+

If you want to clean the generated .js and .min.js files as well as development specific ones like coverage and log files, use : +

yarn run clean
+

+
+

Warning

+

Do not use yarn clean as it's a different command entirely.

+
+

Run the mandatory tools for linting and testing

+

We strive to keep the tests green at all times. Hence whenever you change the source, be sure to:

+
    +
  1. Write at least 2 tests for each change:
      +
    • One that validate your changes
    • +
    • One that invalidate your changes
    • +
    +
  2. +
  3. Make sure all tests passes on all supported browsers (PhantomJS, Firefox, and Chrome)
      +
    • Write unit tests and end-to-end tests
    • +
    +
  4. +
  5. Make sure eslint does not return any errors regarding the coding style.
  6. +
+
+

Warning

+

Pull requests that turns the tests red 🟥, or that do not provide new tests for new features will not be accepted.

+
+

How to test?

+

Tests must always be green ✅ before pushing. Any commit that make the tests fails will be ignored.
To run the tests, you have multiple options: +

# Run unit testing as well as end-to-end testing
+yarn test
+
+# Run unit testing only
+yarn test:unit
+
+# Run end-to-end testing only
+yarn test:e2e
+
+# Run unit testing only...
+yarn test:unitp   # ...with PhantomJS only
+yarn test:unitf   # ...with Firefox only
+yarn test:unitc   # ...with Chrome only
+

+

Behind the scene, all unit and end-to-end tests are written with Jasmine.
Karma is used to run the unit tests, while Webdriver.io is used to run end-to-end tests.

+

How to lint?

+

Linting allow us to keep a coherent code style in all the source files.
In order to check that everything is well formatted, run eslint with: +

yarn lint
+
+If any errors are shown, you can try to automatically correct them by running: +
# Use the path of the faulty file to fix only this particular file:
+./node_modules/eslint/bin/eslint.js --fix src/AutoNumeric.js
+
+# Or try to fix all errors in all files once with
+yarn lintfix
+

+

How to push?

+

Every changes that you pushed in its own branch in your personal AutoNumeric repository copy should be based on the latest version of the next branch (the development branch).

+

When you create a pull request, make sure to push against the next branch.

+

Please try to break down your pull requests and commits into small and manageable entities, in order:

+
    +
  • to make them easier to process, and more importantly
  • +
  • to keep each logical set of changes in its own commit.
  • +
+

Additionally, your commits must not contain any generated files (ie. files built in the /dist/ directory, or logs).

+
+

Important changes regarding the generated dist files

+

Since the version 4.1.3, the generated dist files (ie. autoNumeric.js and autoNumeric.min.js) are not pushed into the repository anymore.

+

However, all tagged commits are now automatically built and published on npm.

+

This means if you want to download the minified library directly, you need to use npm to install it (yarn add autonumeric or npm install autonumeric).

+
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Developer guide/how to upgrade to v4/index.html b/Developer guide/how to upgrade to v4/index.html new file mode 100644 index 0000000..3e1c068 --- /dev/null +++ b/Developer guide/how to upgrade to v4/index.html @@ -0,0 +1,1883 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + How to upgrade to v4 - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

How to upgrade to v4

+ +

Upgrade from versions 1.9.*/2.* to version 4.*

+
+

Attention!

+

Version 4 has seen a lots of improvements and new features, but also introduce breaking changes if you are trying to use it with an old v1.9 or v2 configuration.

+
+

Initialization

+

Initialization of an AutoNumeric object has changed a bit.

+

Since AutoNumeric is now an ES6 module, AutoNumeric being the name of the class, and since the jQuery dependency has been dropped, you now longer need to first select the DOM element with jQuery, then call the $(yourElement).autoNumeric('init', { options }) method.

+

Now, you only need to instantiate an AutoNumeric object using new AutoNumeric(yourElement, { options }) (or if you do not already have a reference to the DOM element, use new AutoNumeric('myCSSSelector', { options })).

+ + + + + + + + + + + + + + + + + +
<= v2 (Before)v4 (After)
$('.myInput').autoNumeric('init', { options });If you want to initialize only one element: new AutoNumeric('.myInput', { options });
If you want to initialize multiple elements: AutoNumeric.multiple('.myCssClass > input', { options });
+

Configuration

+
+

Deprecation warning

+

The old option names have changed and are now deprecated, in favor of the new ones.

+
+

To help you switch to the new names, detailed warning messages are displayed in the console if an old option name is detected.

+
+

mDec option changes

+

Do note that the option mDec (or its new name decimalPlacesOverride if you used v2) is no longer used.

+

If you want to specify the number of decimals, instead of relying on the maximum number of decimal places in minimumValue or maximumValue like before, you can now set decimalPlaces to set it globally.

+

If you wish, you can also specify a different number of decimal places for the formatted value (with decimalPlacesShownOnFocus and decimalPlacesShownOnFocus) or the rawValue (with decimalPlacesRawValue).

+
+

The following table shows the equilavence between pre and post v4 version for option names:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<= v2 (Before)v4 (After)
aSepdigitGroupSeparator
nSepshowOnlyNumbersOnFocus
dGroupdigitalGroupSpacing
aDecdecimalCharacter
altDecdecimalCharacterAlternative
aSigncurrencySymbol
pSigncurrencySymbolPlacement
pNegnegativePositiveSignPlacement
aSuffixsuffixText
oLimitsoverrideMinMaxLimits
vMaxmaximumValue
vMinminimumValue
mDecdecimalPlacesOverride
(⚠ Deprecated)
eDecdecimalPlacesShownOnFocus
scaleDecimaldecimalPlacesShownOnBlur
aStorsaveValueToSessionStorage
mRoundroundingMethod
aPadallowDecimalPadding
nBracketnegativeBracketsTypeOnBlur
wEmptyemptyInputBehavior
lZeroleadingZero
aFormformatOnPageLoad
sNumberselectNumberOnly
anDefaultdefaultValueOverride
unSetOnSubmitunformatOnSubmit
outputTypeoutputFormat
debugshowWarnings
+

If you want more detail about the AutoNumeric options, feel free to browse the AutoNumeric options source code which has detailed comment for each one.

+
+Interactive option testing chamber +

Do note that you can check out the new options on the official website here.

+
+

Method calls

+

Moreover, since we are now using an AutoNumeric object, we can now directly call its methods (and chain them if needed).
+In the following table, the anElement variable is created using const anElement = new AutoNumeric('someSelector', { options }).

+

The methods are now called like so:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<= v2 (Before)v4 (After)
$(someSelector).autoFormat('1234.56', { options });AutoNumeric.format(1234.56, { options });
$(someSelector).autoUnFormat('1.234,56 €', { options });AutoNumeric.unformat('1.234,56 €', { options });
$(someSelector).autoValidate({ options });AutoNumeric.validate({ options })
$.fn.autoNumeric.defaultsAutoNumeric.getDefaultConfig()
$(someSelector).autoNumeric("destroy");anElement.remove();
$(someSelector).autoNumeric('get');anElement.getNumericString();
$(someSelector).autoNumeric('getArray');anElement.formArrayNumericString();
$(someSelector).autoNumeric('getFormatted');anElement.getFormatted();
$(someSelector).autoNumeric('getLocalized');anElement.getLocalized();
$(someSelector).autoNumeric('getNumber');anElement.getNumber();
$(someSelector).autoNumeric('getString');anElement.formNumericString();
$.fn.autoNumeric.langAutoNumeric.getPredefinedOptions()
$(someSelector).autoNumeric('reSet');anElement.reformat();
$(someSelector).autoNumeric('set', '12345.67');anElement.set(12345.67);
$(someSelector).autoNumeric('unSet');anElement.unformat();
$(someSelector).autoNumeric("update", { options });anElement.update({ options });
$(someSelector).autoNumeric("wipe");anElement.wipe();
+

Check the methods documentation to see how some of those functions signatures changed.

+

Need help?

+

If you encounter any problem upgrading to v4, feel free to contacts us on our Gitter channel or on IRC on Libera Chat #autoNumeric!

+

Please check the contact page for more information.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/configuration options/index.html b/Documentation/configuration options/index.html new file mode 100644 index 0000000..7fb9732 --- /dev/null +++ b/Documentation/configuration options/index.html @@ -0,0 +1,1869 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Configuration options - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Configuration options

+ +

Multiple configuration options allows you to customize precisely how a form <input> element will format your key strokes as you type.
+You can check what are the predefined choices for each option as well as a more detailed explanation of how they work on the official documentation page.

+

You can also generate your custom options object and try those live with the AutoNumeric configurator.

+

Want to know more? Check out the examples.

+

Options

+

Below are listed in alphabetical order the options that you can pass an AutoNumeric element, in order to make it change its behavior or formatting specifications.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionDescriptionDefault Value
allowDecimalPaddingAllow padding the decimal places with zeros. If set to 'floats', padding is only done when there are some decimals (up to the number of decimal places from the decimalPlaces variable). If set to an integer, padding will use that number for adding the zeros. If set to true it will always pad the decimal places with zeroes, and never if set to false.true
alwaysAllowDecimalCharacterDefines if the decimal character or decimal character alternative should be accepted when there is already a decimal character shown in the element.false
caretPositionOnFocusDetermine where should be positioned the caret on focusnull
createLocalListDetermine if a local list of AutoNumeric objects must be kept when initializing the elements and otherstrue
currencySymbolDefines the currency symbol to display''
currencySymbolPlacementPlacement of the currency sign, relative to the number shown (as a prefix or a suffix)'p'
decimalCharacterDecimal separator character'.'
decimalCharacterAlternativeAllow to declare an alternative decimal separator which is automatically replaced by the real decimal character when entered (This is useful in countries where the keyboard numeric pad has a period as the decimal character)null
decimalPlacesDefines the default number of decimal places to show on the formatted value, and to keep as the precision for the rawValue. This can be overridden by the other decimalPlaces* options.2
decimalPlacesRawValueDefines how many decimal places should be kept for the raw value. This is the precision for float values.null
decimalPlacesShownOnBlurThe number of decimal places to show when unfocusednull
decimalPlacesShownOnFocusThe number of decimal places to show when focusednull
defaultValueOverrideHelper option for the ASP.NET-specific postback issuenull
digitalGroupSpacingDigital grouping for the thousand separator'3'
digitGroupSeparatorThousand separator character','
divisorWhenUnfocusedDefines the number that will divide the current value shown when unfocusednull
emptyInputBehaviorDefines what to display when the input value is empty (possible options are null, focus, press, always, min, max, zero, number, or a string representing a number)'focus'
eventBubblesDefines if the custom and native events triggered by AutoNumeric should bubble up or nottrue
eventIsCancelableDefines if the custom and native events triggered by AutoNumeric should be cancelabletrue
failOnUnknownOptionThis option is the 'strict mode' (aka 'debug' mode), which allows autoNumeric to strictly analyse the options passed, and fails if an unknown options is used in the options object.false
formatOnPageLoadDetermine if the default value will be formatted on initializationtrue
formulaModeDefines if the formula mode can be activated by the userfalse
historySizeDetermine how many undo states an AutoNumeric object should keep in memory20
isCancellableDetermine if the user can 'cancel' the last modifications done to the element value when using the Escape keytrue
leadingZeroControls the leading zero behavior (possible options are allow, deny and keep)'deny'
maximumValueThe maximum value that can be entered (10 trillions by default)'10000000000000'
minimumValueThe minimum value that can be entered (-10 trillions by default)'-10000000000000'
modifyValueOnUpDownArrowDetermine if the element value can be incremented / decremented with the up and down arrow keys. The keys behavior is modified with the upDownStep option.true
modifyValueOnWheelDetermine if the element value can be incremented / decremented with the mouse wheel. The wheel behavior is modified with the wheelStep option.true
negativeBracketsTypeOnBlurAdds brackets [], parenthesis (), curly braces {}, chevrons <>, angle brackets 〈〉, Japanese quotation marks 「」, half brackets ⸤⸥, white square brackets ⟦⟧, quotation marks ‹› or guillemets «» on negative values when unfocused. The value must be formatted like '<leftBracket>,<rightBracket>'.null
negativePositiveSignBehaviorDefines if the negative sign should be toggled when hitting the negative or positive key multiple timesfalse
negativePositiveSignPlacementPlacement of negative/positive sign relative to the currency symbol (possible options are l (left), r (right), p (prefix) and s (suffix))null
negativeSignCharacterDefines the negative sign character to use'-'
noEventListenersDefines if the element should have event listeners activated on it.
Note: Setting this to true will prevent any format to be applied once the user starts modifying the element value. This is unlikely what you want.
false
onInvalidPasteManage how autoNumeric react when the user tries to paste an invalid number (possible options are error, ignore, clamp, truncate or replace)'error'
outputFormatDefines the localized output format of the getLocalized, form*, formArray* and formJson* methodsnull
overrideMinMaxLimitsOverride minimum and maximum limits (possible options are ceiling, floor, ignore and invalid)null
positiveSignCharacterDefines the positive sign character to use (Note: It's only shown if showPositiveSign is set to true)'+'
rawValueDivisorDefine the number that will divide the formatted value into the raw value (i.e. when displaying '1.23%', the raw value kept is 0.0123 if rawValueDivisor is set to 100)null
readOnlyDefines if the element (<input> or another allowed html tag) should be set as read-only on initializationfalse
roundingMethodMethod used for rounding. The possible options are:
S (Round-Half-Up Symmetric (default)),
A (Round-Half-Up Asymmetric),
s (Round-Half-Down Symmetric (lower case s)),
a (Round-Half-Down Asymmetric (lower case a)),
B (Round-Half-Even 'Bankers Rounding'),
U (Round Up 'Round-Away-From-Zero'),
D (Round Down 'Round-Toward-Zero' - same as truncate),
C (Round to Ceiling 'Toward Positive Infinity'),
F (Round to Floor 'Toward Negative Infinity'),
N05 (Rounds to the nearest .05 (same as 'CHF' used in v1.9.* and still valid)),
U05 (Rounds up to next .05),
D05 (Rounds down to next .05)
'S'
saveValueToSessionStorageAllow the decimalPlacesShownOnFocus value to be saved into session storagefalse
selectNumberOnlyDetermine if the 'Select All' keyboard command will select the complete input text content (including the currency symbol and suffix text), or only the input numeric valuefalse
selectOnFocusDefines if the element value should be selected on focus. That selection is dependent on the selectNumberOnly option value.true
serializeSpacesDefines how the serialize functions should treat spaces when serializing (convert them to '%20' or '+')'+'
showOnlyNumbersOnFocusRemove the thousand separator, currency symbol and suffix on focusfalse
showPositiveSignAllow the positive sign symbol + to be displayed for positive numbersfalse
showWarningsDefines if warnings should be shown. This is safe to disable in production.true
styleRulesDefines the rules that calculate the CSS class(es) to apply on the element, based on the raw unformatted value.
This can also be used to call callbacks whenever the rawValue is updated.
null
suffixTextAdditional text suffix that is added after the number''
symbolWhenUnfocusedSymbol placed as a suffix when unfocused. This is used in combination with the divisorWhenUnfocused option.null
unformatOnHoverDefines if the element value should be unformatted when the user hover his mouse over it while holding the Alt keytrue
unformatOnSubmitRemoves formatting on submit eventfalse
upDownStepUsed in conjonction with the modifyValueOnUpDownArrow option, this allows to either define a fixed step (i.e. 1000), or a progressive one that is calculated based on the size of the current value'1'
valuesToStringsProvide a way for automatically and transparently replacing the formatted value with a pre-defined string, when the raw value is equal to a specific value.
For instance when using { 0: '-' }, the hyphen '-' is displayed when the rawValue is equal to 0. Multiple 'replacements' can be defined.
null
watchExternalChangesDefines if the AutoNumeric element should watch (and format) external changes made without using .set(). This is set to false by default to prevent infinite loops when used with third party frameworks that relies on the 'autoNumeric:rawValueModified' events being sent.false
wheelOnUsed in conjonction with the modifyValueOnWheel option, defines when the wheel event will increment or decrement the element value, either when the element is focused, or hovered'focus'
wheelStepUsed in conjonction with the modifyValueOnWheel option, this allows to either define a fixed step (i.e. 1000), or a progressive one that is calculated based on the size of the current value'progressive'
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/demo/index.html b/Documentation/demo/index.html new file mode 100644 index 0000000..1deee16 --- /dev/null +++ b/Documentation/demo/index.html @@ -0,0 +1,1605 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Try AutoNumeric - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Try AutoNumeric

+ +

Demo

+

If you want to see AutoNumeric in action and try it yourself, you can either play with the field on the AutoNumeric homepage, or check the live demo.

+

You can also take a look at the predefined options examples (Predefined language options, Predefined common options, Predefined common monetary options, Predefined percentage options and Predefined style rules).

+

Tools

+

Finally, you can use the configuration generator tool to generate your configuration options objects, while being able to see with a live preview the effect of each chosen options.

+ +

Alternatively, you can also check the vue-autonumeric demo.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/event lifecycle/index.html b/Documentation/event lifecycle/index.html new file mode 100644 index 0000000..d6950fe --- /dev/null +++ b/Documentation/event lifecycle/index.html @@ -0,0 +1,2012 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Event lifecycle - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Event lifecycle

+ +

AutoNumeric elements are transparent to the native input and change events, which means those are correctly sent when using an <input> element managed by AutoNumeric.

+

AutoNumeric custom events

+

In addition to the native events, custom events sent by AutoNumeric elements allows you to hook into the formatting lifecycle, as you see fit:

+
    +
  • 'autoNumeric:correctedValue' when an invalid value is corrected
  • +
  • 'autoNumeric:initialized' when the AutoNumeric element is initialized
  • +
  • 'autoNumeric:invalidFormula' when the user tries to validate an invalid math expression
  • +
  • 'autoNumeric:invalidValue' when an invalid value is entered (ie. when the raw value is out of the min/max range)
  • +
  • 'autoNumeric:rawValueModified' when the rawValue is modified
  • +
  • 'autoNumeric:formatted' when all the formatting is done and the formatted string is modified
  • +
  • 'autoNumeric:minExceeded' if the minimumValue is not respected
  • +
  • 'autoNumeric:maxExceeded' if the maximumValue is not respected
  • +
  • 'autoNumeric:validFormula' when the user validate a valid math expression
  • +
+
+

Tip

+

You can also set if the events triggered by the AutoNumeric elements, custom or native, should:

+
    +
  • Bubble up (option eventBubbles) or
  • +
  • Be cancelable (option eventIsCancelable).
  • +
+
+

Event lifecycle

+

Whenever an AutoNumeric element is initialized, the custom 'autoNumeric:initialized' event is sent.
When using AutoNumeric.multiple() to initialize numerous elements at once, as many 'autoNumeric:initialized' events are sent as there are initialized elements.

+

Finally, the 'change' event is sent on blur if the value has been changed since the focus one.

+
+

Note

+

The AutoNumeric.format() static function does trigger an 'autoNumeric:formatted' event if the value that the user is trying to format is outside the minimumValue and maximumValue range, with the detail attribute containing the range error message.

+
+

Custom events details

+

'autoNumeric:formatted'

+

The 'autoNumeric:formatted' event has a payload that contains the following detail attribute: +

Example of `CustomEvent` object sent by AutoNumeric when its value is formatted
const theCustomEvent = {
+    detail    : {
+        oldValue   : "78,00 €",  // The previous formatted value
+        newValue   : "788,00 €", // The new formatted value
+        oldRawValue: 78,         // The previous raw value
+        newRawValue: 788,        // The new raw value
+        isPristine : false,      // Is the element value still pristine? In other words, has its value changed since its initialization?
+        error      : null,       // The error message as a string, `null` if no errors.
+        aNElement  : theAutoNumericObject, // The AutoNumeric object emitting this event
+    },
+    // ...and the usual `bubbles` and `cancelable` attributes
+}
+
+
When caught, you can access the event attributes like so:
function onFormattedEvent(event) {
+    if (!event.detail.isPristine) {
+        console.log(`The element value has been changed from ${event.detail.oldValue} to ${event.detail.newValue}.`);
+    }
+}
+

+

'autoNumeric:rawValueModified'

+

The 'autoNumeric:rawValueModified' event has a payload that contains the following detail attribute: +

Example of `CustomEvent` object sent by AutoNumeric when the `rawValue` is modified
const theCustomEvent = {
+    detail    : {
+        oldRawValue: 78,    // The previous raw value
+        newRawValue: 788,   // The new raw value
+        isPristine : false, // Is the `rawValue` still pristine? In other words, did it changed since the object initialization?
+        error      : null,  // The error message as a string, `null` if no errors.
+        aNElement  : theAutoNumericObject, // The AutoNumeric object emitting this event
+    },
+    // ...
+}
+

+

'autoNumeric:initialized'

+

The 'autoNumeric:initialized' event has a payload that contains the following detail attribute: +

Example of `CustomEvent` object sent by AutoNumeric when the object is first initialized
const theCustomEvent = {
+    detail    : {
+        newValue   : "788,00 €", // The new formatted value
+        newRawValue: 788,        // The new raw value
+        error      : null,       // The error message as a string, `null` if no errors.
+        aNElement  : theAutoNumericObject, // The AutoNumeric object emitting this event
+    },
+    // ...
+}
+

+

'autoNumeric:invalidFormula'

+

The 'autoNumeric:invalidFormula' event has a payload that contains the following detail attribute: +

Example of `CustomEvent` object sent by AutoNumeric when the math expression is invalid
const theCustomEvent = {
+    detail    : {
+        formula  : '22+35 - (44',        // The invalid formula
+        aNElement: theAutoNumericObject, // The AutoNumeric object emitting this event
+    },
+    // ...
+}
+

+

'autoNumeric:validFormula'

+

The 'autoNumeric:validFormula' event has a payload that contains the following detail attribute: +

Example of `CustomEvent` object sent by AutoNumeric when the math expression is valid
const theCustomEvent = {
+    detail    : {
+        formula  : '22+35 - (44)',       // The valid formula
+        result   : 13,                   // The math expression result
+        aNElement: theAutoNumericObject, // The AutoNumeric object emitting this event
+    },
+    // ...
+}
+

+

This can then be used within another script.
For instance, you could listen to that event in a Vue.js component template like so: +

<vue-autonumeric 
+    v-on:autoNumeric:formatted.native="funcCall1"
+    v-on:autoNumeric:rawValueModified.native="funcCall2"
+    v-on:autoNumeric:initialized.native="funcCall3"
+/>
+

+
+

Check out the official vue-autonumeric component for more info

+
+

Key inputs & events sent

+

Below are listed how AutoNumeric react to different types of key inputs.

+

Inputing numbers and decimal characters

+

By default a 'normal' printable character input (ie. '2' or ',') will result in those events, in that specific order:

+
    +
  1. 'keydown'
  2. +
  3. 'autoNumeric:minExceeded' or 'autoNumeric:maxExceeded' only if there was a range problem
  4. +
  5. 'keypress' (this is deprecated and will be removed soon)
  6. +
  7. 'input'
  8. +
  9. 'keyup'
  10. +
  11. 'autoNumeric:formatted' when all the formatting is done
  12. +
  13. 'autoNumeric:rawValueModified' when the rawValue is modified
  14. +
+
+

Note

+

Please check how is structured the payload attached to the event variable. The event detail provides easy access to the old and new value.

+
+

Modifier keys

+

When inputting a modifier key (ie. Control), we get:

+
    +
  1. 'keydown'
  2. +
  3. 'keyup'
  4. +
  5. 'autoNumeric:formatted'
  6. +
  7. 'autoNumeric:rawValueModified'
  8. +
+

Deleting numbers

+

If Delete or Backspace is entered, the following events are sent:

+
    +
  1. 'keydown'
  2. +
  3. 'input'
  4. +
  5. 'keyup'
  6. +
  7. 'autoNumeric:formatted'
  8. +
  9. 'autoNumeric:rawValueModified'
  10. +
+

Validating the field

+

If Enter is entered and the value has not changed, the following events are sent:

+
    +
  1. 'keydown'
  2. +
  3. 'keypress'
  4. +
  5. 'keyup'
  6. +
  7. 'autoNumeric:formatted'
  8. +
  9. 'autoNumeric:rawValueModified'
  10. +
+

If Enter is entered and the value has been changed, the following events are sent:

+
    +
  1. 'keydown'
  2. +
  3. 'keypress'
  4. +
  5. 'change'
  6. +
  7. 'keyup'
  8. +
  9. 'autoNumeric:formatted'
  10. +
  11. 'autoNumeric:rawValueModified'
  12. +
+

Pasting data

+

When a paste is done with the mouse, the following events are sent:

+
    +
  1. 'input'
  2. +
  3. 'keydown'
  4. +
  5. 'input'
  6. +
  7. 'keyup'
  8. +
  9. 'keyup'
  10. +
  11. 'autoNumeric:formatted'
  12. +
  13. 'autoNumeric:rawValueModified'
  14. +
+

When a paste is done with the keyboard shortcut (ie. ctrl+v), the following events are sent:

+
    +
  1. 'keydown'
  2. +
  3. 'keydown'
  4. +
  5. 'input'
  6. +
  7. 'keyup'
  8. +
  9. 'keyup'
  10. +
  11. 'autoNumeric:formatted'
  12. +
  13. 'autoNumeric:rawValueModified'
  14. +
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/formula mode/index.html b/Documentation/formula mode/index.html new file mode 100644 index 0000000..443f6ec --- /dev/null +++ b/Documentation/formula mode/index.html @@ -0,0 +1,1662 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Formula mode - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Formula mode

+ +

Ever wished while filling in a form that you could quickly calculate basic math operations?
Well, AutoNumeric provides a quick way to enter and evaluate simple math expressions directly into the element!

+
+

Use case

+

Sometimes, you need to quickly calculate the product or the sum of two or more numbers, before entering the result in the AutoNumeric element.
+For instance, you might ask yourself "How many months are there in 14 years and 5 months ?", then you'd need to either make a mental calculation, or resort to using a calculator.
+To speed things up and provide a lean user experience, AutoNumeric provides a formula mode which allows you to enter and evaluate simple math expressions very quickly.

+

Using our previous example, you would just need to activate the formula mode by entering the equal sign (=) key, then type =14*12 + 5, and finally validate that expression by using the Enter key, or by blurring the field.

+
+
+

Note

+

If the math expression is invalid, the previous rawValue is set back

+
+
+

Warning

+

By default, this behavior is disabled.
Check here on how to enable it.

+
+

Enable the formula mode

+

If you want to enable the math expression parsing, you need to set the formulaMode option to true: +

new AutoNumeric(domElement, { formulaMode: true });
+

+

If you want to cancel the math expression edition and exit the formula mode, hit the Escape key at any time. +This will revert any changes made to the input content to the previous formatted value.

+

How to enter a formula?

+

When the formula mode is enabled, you can enter the formula mode just by:

+
    +
  1. Focusing on the AutoNumeric-managed input
  2. +
  3. Type the = character
  4. +
  5. Then type a valid math formula
  6. +
  7. Once happy with your formula, submit it by typing the Enter key
  8. +
+

If your math formula is valid, then its result will be set() and you'll automatically exit formula mode.

+

Allowed characters in formula mode

+

Simple math expressions are allowed, which means you can use any numeric characters, the decimal point ., as well as the following operators +, -, *, /, ( and ).

+
+

Math precedence

+

Parentheses and operators precedence are respected as expected

+
+

This allows for evaluating the following math expressions examples without problems:

+
    +
  • 8 * -12.46
  • +
  • 22* (10 - 2)/1.5- -0.5
  • +
  • (4+1) * 2 - (104587.23 * 8 - (-7))
  • +
+

Formula mode events

+

On user validation, if the math expression syntax is invalid, the previous valid rawValue is set back, and the autoNumeric:invalidFormula event is sent.

+

When a valid math expression is accepted, then its result is set(), and the autoNumeric:validFormula event is sent.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/how to use/index.html b/Documentation/how to use/index.html new file mode 100644 index 0000000..99ce2cf --- /dev/null +++ b/Documentation/how to use/index.html @@ -0,0 +1,1637 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + How to use? - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

How to use?

+ +

In the browser

+

Simply include autoNumeric in your html <header> tag.
No other files or libraries are required ; autoNumeric has no dependency.

+
<script src="autoNumeric.min.js" type="text/javascript"></script>
+<!-- ...or, you may also directly use a CDN :-->
+<script src="https://cdn.jsdelivr.net/npm/autonumeric@4.8.1"></script>
+<!-- ...or -->
+<script src="https://cdnjs.cloudflare.com/ajax/libs/autonumeric/4.8.1/autoNumeric.min.js"></script>
+<!-- ...or -->
+<script src="https://unpkg.com/autonumeric"></script>
+<!-- ...or any other CDN. -->
+
+

In another script

+

If you want to use AutoNumeric in your code, you can import the src/AutoNumeric.js file as an ES6 module using: +

import AutoNumeric from 'autonumeric';
+

+

Then you can initialize autoNumeric with or without options : +

// autoNumeric with the defaults options
+anElement = new AutoNumeric(domElement);
+
+// autoNumeric with specific options being passed
+anElement = new AutoNumeric(domElement, { options });
+
+// autoNumeric with a css selector and a pre-defined language options
+anElement = new AutoNumeric('.myCssClass > input').french();
+

+

You're done!

+
+

See the available predefined language list here.

+
+
+

Tip

+

An AutoNumeric object can be initialized in various ways, check those out here.

+
+

In Web Workers

+

Some static AutoNumeric functions that do not access nor modify the DOM can be used in Web Workers (ie. AutoNumeric.format(), AutoNumeric.unformat(), etc.).

+

In order to be able to use AutoNumeric in those web workers, you need to import the source file src/main.js, not the generated one found in dist/AutoNumeric.js. For instance, by importing the library like that: +

import AutoNumeric from '../node_modules/autonumeric/src/main';
+

+

Doing this will allow your project Webpack configuration to compile it correctly (and use tree shaking as needed).

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/initialization/index.html b/Documentation/initialization/index.html new file mode 100644 index 0000000..9a3d323 --- /dev/null +++ b/Documentation/initialization/index.html @@ -0,0 +1,1770 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Initialization - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Initialization

+ +

An AutoNumeric object can be initialized in various ways.

+

Initialize one AutoNumeric object

+

It always takes either a DOM element reference as its first argument, or a CSS string selector.

+
+

Note

+

Only one element can be selected this way, since under the hood document.querySelector is called, and this only return one element.

+

If you need to be able to select and initialize multiple elements in one call, then consider using the static AutoNumeric.multiple() function.

+
+

Using a DOM element

+
Basic initialization with formatting options
anElement = new AutoNumeric(domElement); // With the default options
+anElement = new AutoNumeric(domElement, { options }); // With one option object
+anElement = new AutoNumeric(domElement, 'euroPos'); // With a named pre-defined string
+anElement = new AutoNumeric(domElement, [{ options1 }, 'euroPos', { options2 }]); // With multiple option objects (the latest option overwriting the previous ones)
+anElement = new AutoNumeric(domElement).french(); // With one pre-defined language object
+anElement = new AutoNumeric(domElement).french({ options });// With one pre-defined language object and additional options that will override those defaults
+
+
Initialization and setting the value in one call
anElement = new AutoNumeric(domElement, 12345.789); // With the default options, and an initial value
+anElement = new AutoNumeric(domElement, 12345.789, { options });
+anElement = new AutoNumeric(domElement, '12345.789', { options });
+anElement = new AutoNumeric(domElement, 12345.789, 'euroPos');
+anElement = new AutoNumeric(domElement, 12345.789, [{ options1 }, 'euroPos', { options2 }]);
+anElement = new AutoNumeric(domElement, null, { options }); // With a null initial value
+anElement = new AutoNumeric(domElement, 12345.789).french({ options });
+anElement = new AutoNumeric(domElement, 12345.789, { options }).french({ options }); // Not really helpful, but possible
+
+

Using CSS selectors

+

The AutoNumeric constructor class can also accept a string as a CSS selector.
Under the hood this use the QuerySelector Javascript function, and limit itself to only the first element it finds: +

Examples using a CSS selector
anElement = new AutoNumeric('.myCssClass > input');
+anElement = new AutoNumeric('.myCssClass > input', { options });
+anElement = new AutoNumeric('.myCssClass > input', 'euroPos');
+anElement = new AutoNumeric('.myCssClass > input', [{ options1 }, 'euroPos', { options2 }]);
+anElement = new AutoNumeric('.myCssClass > input', 12345.789);
+anElement = new AutoNumeric('.myCssClass > input', 12345.789, { options });
+anElement = new AutoNumeric('.myCssClass > input', 12345.789, 'euroPos');
+anElement = new AutoNumeric('.myCssClass > input', 12345.789, [{ options1 }, 'euroPos', { options2 }]);
+anElement = new AutoNumeric('.myCssClass > input', null, { options }); // With a null initial value
+anElement = new AutoNumeric('.myCssClass > input', 12345.789).french({ options });
+

+
+

Note

+

AutoNumeric also accepts a limited tag list that it will format on page load, but without adding any event listeners if their contenteditable attribute is not set to true.

+
+

Initialize multiple AutoNumeric objects at once

+

Using DOM elements

+

If you know you want to initialize multiple elements in one call, you must then use the static AutoNumeric.multiple() function: +

Initializing multiple DOM elements in one call (and possibly pass multiple values that will be mapped to each DOM element)
[anElement1, anElement2, anElement3] = AutoNumeric.multiple([domElement1, domElement2, domElement3], { options });
+[anElement1, anElement2, anElement3] = AutoNumeric.multiple([domElement1, domElement2, domElement3], 'euroPos');
+[anElement1, anElement2, anElement3] = AutoNumeric.multiple([domElement1, domElement2, domElement3], [{ options }, 'euroPos']);
+[anElement1, anElement2, anElement3] = AutoNumeric.multiple([domElement1, domElement2, domElement3], 12345.789, { options });
+[anElement1, anElement2, anElement3] = AutoNumeric.multiple([domElement1, domElement2, domElement3], 12345.789, [{ options }, 'euroPos']);
+[anElement1, anElement2, anElement3] = AutoNumeric.multiple.french([domElement1, domElement2, domElement3], [12345.789, 234.78, null], { options });
+[anElement1, anElement2, anElement3] = AutoNumeric.multiple.french([domElement1, domElement2, domElement3], [12345.789, 234.78, null], [{ options }, 'euroPos']);
+

+
+

Tip

+

You can pass multiple different values to the selected inputs, using an Array. Those values will be mapped one-to-one in the order the elements are found.

+
+

Using CSS selectors

+

If you want to select multiple elements via a CSS selector, then you must use the multiple function as well as above.
Under the hood the QuerySelectorAll Javascript function is used. +

Initializing multiple elements with a single CSS selector
[anElement1, anElement2] = AutoNumeric.multiple('.myCssClass > input', { options }); // This always return an Array, even if there is only one element selected
+[anElement1, anElement2] = AutoNumeric.multiple('.myCssClass > input', [null, 12345.789], { options }); // Idem above, but with passing the initial values too
+

+
+

Tip

+

The AutoNumeric.multiple() function will always return an Array, even if there is only one element selected.

+
+
+

Note

+

Using an array of option objects and/or pre-defined names will always merge those settings together. The resulting settings objet will then be applied to all the selected elements; they will share the exact same settings.

+
+

Form elements selections

+

AutoNumeric treats <form> elements differently; If a <form> element is passed (or any other 'parent' (or 'root') DOM element), then AutoNumeric will initialize each child <input> elements recursively, ignoring those referenced in the exclude attribute: +

AutoNumeric initialize the form's <input> elements recursively
[anElement1, anElement2] = AutoNumeric.multiple({ rootElement: formElement }, { options });
+[anElement1, anElement2] = AutoNumeric.multiple({ rootElement: formElement, exclude : [hiddenElement, tokenElement] }, { options });
+[anElement1, anElement2] = AutoNumeric.multiple({ rootElement: formElement, exclude : [hiddenElement, tokenElement] }, [12345.789, null], { options });
+

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/installation/index.html b/Documentation/installation/index.html new file mode 100644 index 0000000..98fcf12 --- /dev/null +++ b/Documentation/installation/index.html @@ -0,0 +1,1531 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Installation - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Installation

+ +

You can install AutoNumeric with your preferred dependency manager:

+
+
+
+

With `yarn`
yarn add autonumeric
+
+
With `npm`
npm install autonumeric --save
+

+
+
+

With `yarn`
yarn add autonumeric@4.6.2
+
+
With `npm`
npm install autonumeric@4.6.2 --save
+

+
+
+
+
+
+
    +
  1. +

    Yarn website 

    +
  2. +
  3. +

    NPM website 

    +
  4. +
+
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/instantiated methods/index.html b/Documentation/instantiated methods/index.html new file mode 100644 index 0000000..c28830f --- /dev/null +++ b/Documentation/instantiated methods/index.html @@ -0,0 +1,2513 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Instantiated methods - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Instantiated methods

+ +

Usual AutoNumeric functions like set, get, format and unformat

+

The main functions for using AutoNumeric are set() which allows you to set the numeric raw value of an input (AutoNumeric will then automatically format it as per the options you used), and get* which allows you to retrieve the value of an input, either formatted or by getting the raw value directly.

+

The following functions are available on all AutoNumeric-managed elements:

+

Set

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
setSet the value (that will be formatted immediately)anElement.set(42.76);
setSet the value and update the setting in one goanElement.set(42.76, { options });
setSet the value, but do not save the new state in the history table (used for undo/redo actions)anElement.set(42.76, { options }, false);
setUnformattedSet the value (that will not be formatted immediately)anElement.setUnformatted(42.76);
setUnformattedSet the value and update the setting in one go (the value will not be formatted immediately)anElement.setUnformatted(42.76, { options });
+

Get

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
getNumericStringReturn the unformatted number as a stringanElement.getNumericString();
getAlias for the .getNumericString() method (⚠ this is deprecated and will be removed soon™)anElement.get();
getFormattedReturn the formatted stringanElement.getFormatted();
getNumberReturn the unformatted number as a number (⚠ Warning: If you are manipulating a number bigger than Number.MAX_SAFE_INTEGER, you will encounter problems if you try to retrieve it as a number and not as a string)anElement.getNumber();
getLocalizedReturn the localized unformatted number as a stringanElement.getLocalized();
getLocalizedReturn the localized unformatted number as a string, using the outputFormat option override passed as a parameteranElement.getLocalized(forcedOutputFormat);
getLocalizedIdem above, but with a callback function and a forced outputFormatanElement.getLocalized(forcedOutputFormat, callback);
getLocalizedIdem above, but with a callback functionanElement.getLocalized(callback);
get*Pass the result of the get* function to the given callback, see hereanElement.get*(funcCallback);
+

Formatting

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
reformatForce the element to reformat its value again (in case the formatting has been lost)anElement.reformat();
unformatRemove the formatting and keep only the raw unformatted value in the element (as a numeric string)anElement.unformat();
unformatLocalizedRemove the formatting and keep only the localized unformatted value in the elementanElement.unformatLocalized();
unformatLocalizedIdem above, but using the outputFormat option override passed as a parameteranElement.unformatLocalized(forcedOutputFormat);
+

Selection and miscellaneous

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
selectSelect the formatted element content, based on the selectNumberOnly optionanElement.select();
selectNumberSelect only the numbers in the formatted element content, leaving out the currency symbol, whatever the value of the selectNumberOnly optionanElement.selectNumber();
selectIntegerSelect only the integer part in the formatted element content, whatever the value of selectNumberOnlyanElement.selectInteger();
selectDecimalSelect only the decimal part in the formatted element content, whatever the value of selectNumberOnlyanElement.selectDecimal();
clearReset the element value to the empty string '' (or the currency sign, depending on the emptyInputBehavior option value)anElement.clear();
clearAlways reset the element value to the empty string '' as above, no matter the emptyInputBehavior option valueanElement.clear(true);
isPristineReturn true if the current value is the same as when the element first got initialized (not set())anElement.isPristine();
+
+

Tip

+

Most of those functions can be chained together, if needed.

+
+

Using callback functions with get* methods

+

All get* methods can accept a callback function as its argument (those methods being get, getNumericString, getFormatted, getNumber and getLocalized; see here).

+

That callback is passed two parameters, the result of the get* method as its first argument, and the AutoNumeric object as its second.

+

This allows you to directly use the result of the get* functions without having to declare a temporary variable like so: +

function sendToServer(value) {
+    ajax(value);
+}
+
+console.log(`The value ${anElement.getNumber(sendToServer)} has been sent to the server.`);
+

+

In other words, +

// Using:
+anElement.getNumericString(funcCallback);
+
+// Is equivalent to doing:
+const result = anElement.getNumericString();
+funcCallback(result, anElement);
+

+
+

Info

+

The callback function behavior is slightly different when called on multiple elements via global.get* methods.

+
+

Un-initialize the AutoNumeric element

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
removeRemove the AutoNumeric listeners from the element (previous name : 'destroy'). Keep the element content intact.anElement.remove();
wipeRemove the AutoNumeric listeners from the element, and reset its value to ''anElement.wipe();
nukeRemove the AutoNumeric listeners from the element, then delete the DOM element altogetheranElement.nuke();
+

Node manipulation

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
nodeReturn the DOM element reference of the AutoNumeric-managed elementanElement.node();
parentReturn the DOM element reference of the parent node of the AutoNumeric-managed elementanElement.parent();
detachDetach the current AutoNumeric element from the shared local 'init' list (which means any changes made on that local shared list will not be transmitted to that element anymore)anElement.detach();
detachIdem above, but detach the given AutoNumeric element, not the current oneanElement.detach(otherAnElement);
attachAttach the given AutoNumeric element to the shared local 'init' list. When doing that, by default the DOM content is left untouched. The user can force a reformat with the new shared list options by passing a second argument valued true.anElement.attach(otherAnElement, reFormat = true);
+

Format and unformat other numbers or DOM elements with an existing AutoNumeric element

+

You can use any AutoNumeric element to format or unformat other numbers or DOM elements.

+

This allows to format or unformat numbers, strings or directly other DOM elements without having to specify the options each time, since the current AutoNumeric object already has those settings set.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
formatOtherThis use the same function signature that when using the static AutoNumeric method directly (cf. AutoNumeric.format), but without having to pass the optionsanElement.formatOther(12345, { options });
formatOtherIdem above, but apply the formatting to the given DOM element by modifying its content directlyanElement.formatOther(domElement, { options });
unformatOtherThis use the same function signature that when using the static AutoNumeric method directly (cf. AutoNumeric.unformat), but without having to pass the optionsanElement.unformatOther('1.234,56 €', { options });
unformatOtherIdem above, but apply the unformatting to the given DOM element by modifying its content directlyanElement.unformatOther(domElement, { options });
+

Initialize other DOM Elements

+

Once you have an AutoNumeric element already setup correctly with the right options, you can use it as many times you want to initialize as many other DOM elements as needed.

+
+

Important

+

This works only on elements that can be managed by AutoNumeric.
You can check the list of supported elements here.

+
+

Whenever init is used to initialize other DOM elements, a shared local 'init' list of those elements is stored in the AutoNumeric objects.
This allows for neat things like modifying all those linked AutoNumeric elements globally, with only one call.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
initUse an existing AutoNumeric element to initialize another single DOM element with the same optionsconst anElement2 = anElement.init(domElement2);
initIf true is set as the second argument, then the newly generated AutoNumeric element will not share the same local element list as anElementconst anElement2 = anElement.init(domElement2, true);
initUse an existing AutoNumeric element to initialize multiple other DOM elements from an Array, with the same optionsconst anElementsArray = anElement.init([domElement2, domElement3, domElement4]);
initUse an existing AutoNumeric element to initialize multiple other DOM elements from a CSS selector, with the same optionsconst anElementsArray = anElement.init('.currency');
+

Perform actions globally on a shared 'init' list of AutoNumeric elements

+

This local 'init' list can be used to perform global operations on all those AutoNumeric elements, with one function call.

+
+

Example

+

The function names are the same as the ones that are used on a single AutoNumeric element.

+

For instance instead of calling anElement.set(42) on a single element, you must call the function by prefixing .global before the method name like so: anElement.global.set(42).

+
+

Functions that affects the AuotNumeric elements

+

Below are listed all the supported methods than can be called globally:

+
anElement.global.set(2000); // Set the value 2000 in all the AutoNumeric-managed elements that are shared on this element
+anElement.global.setUnformatted(69);
+[result1, result2, result3] = anElement.global.get(); // Return an array of results
+[result1, result2, result3] = anElement.global.getNumericString(); // Return an array of results
+[result1, result2, result3] = anElement.global.getFormatted(); // Return an array of results
+[result1, result2, result3] = anElement.global.getNumber(); // Return an array of results
+[result1, result2, result3] = anElement.global.getLocalized(); // Return an array of results
+anElement.global.reformat();
+anElement.global.unformat();
+anElement.global.unformatLocalized();
+anElement.global.unformatLocalized(forcedOutputFormat);
+anElement.global.update({ options }); // Update the settings of each AutoNumeric-managed elements
+anElement.global.update({ options1 }, { options2 }, { options3 }); // Idem above, but accepts as many option objects as needed
+anElement.global.isPristine(); // Return `true` if *all* the AutoNumeric-managed elements are pristine, if their raw value hasn't changed
+anElement.global.isPristine(false); // Idem as above, but also checks that the formatted value hasn't changed
+anElement.global.clear(); // Clear the value in all the AutoNumeric-managed elements that are shared on this element
+anElement.global.remove();
+anElement.global.wipe();
+anElement.global.nuke();
+
+
+

Do note that the .global.get*() functions return an array of results, with one value for each AutoNumeric element in the linked list

+
+

Functions that affects the init-list

+

The shared local list also provide list-specific methods to manipulate it: +

anElement.global.has(domElementOrAutoNumericObject); // Return `true` if the given AutoNumeric object (or DOM element) is in the local AutoNumeric element list
+anElement.global.addObject(domElementOrAutoNumericObject); // Add an existing AutoNumeric object (or DOM element) to the local AutoNumeric element list, using the DOM element as the key
+anElement.global.removeObject(domElementOrAutoNumericObject); // Remove the given AutoNumeric object (or DOM element) from the local AutoNumeric element list, using the DOM element as the key
+anElement.global.removeObject(domElementOrAutoNumericObject, true); // Idem above, but keep the current AutoNumeric object in the local list if it's removed by itself
+anElement.global.empty(); // Remove all elements from the shared list, effectively emptying it
+anElement.global.empty(true); // Idem above, but instead of completely emptying the local list of each AutoNumeric objects, each one of those keeps itself in its own local list
+[anElement0, anElement1, anElement2, anElement3] = anElement.global.elements(); // Return an array containing all the AutoNumeric elements that have been initialized by each other
+anElement.global.getList(); // Return the `Map` object directly
+anElement.global.size(); // Return the number of elements in the local AutoNumeric element list
+

+

Using callback functions with global.get* methods

+

Like for their get* methods counterparts, global.get* methods accepts a callback function. +However, the callback is executed only once and is passed an array of the get* function results as its first argument, while the AutoNumeric object being passed as its second one.

+
// Using:
+anElement.global.getNumericString(funcCallback);
+
+// Is equivalent to doing:
+const [result1, result2, result3] = anElement.global.getNumericString();
+funcCallback([result1, result2, result3], anElement);
+
+

Form functions

+

AutoNumeric elements provide special functions to manipulate the form they are a part of. +Those special functions really work on the parent <form> element, instead of the <input> element itself.

+

Form functions can be divided in two categories:

+
    +
  • Functions that manipulate the form values, and
  • +
  • Functions that submit the form values to the server.
  • +
+

Access and manipulate the form values

+

The functions below makes retrieving and preparing the form values easy. Those values can be formatted or not, and in any format you would want (Array, JSON, string, etc.).

+

You can then decide how and when to send those form values to the server.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
formReturn a reference to the parent <form> element, null if it does not existanElement.form();
form(forcedSearch)Idem above, but will force a new search for the parent <form> element, discarding any previously found oneanElement.form(true);
formNumericStringReturn a string in standard URL-encoded notation with the form input values being unformattedanElement.formNumericString();
formFormattedReturn a string in standard URL-encoded notation with the form input values being formattedanElement.formFormatted();
formLocalizedReturn a string in standard URL-encoded notation with the form input values, with localized valuesanElement.formLocalized();
formLocalized(forcedOutputFormat)Idem above, but with the possibility of overriding the outputFormat optionanElement.formLocalized(forcedOutputFormat);
formArrayNumericStringReturn an array containing an object for each form <input> element, with the values as numeric stringsanElement.formArrayNumericString();
formArrayFormattedReturn an array containing an object for each form <input> element, with the values as formatted stringsanElement.formArrayFormatted();
formArrayLocalizedReturn an array containing an object for each form <input> element, with the values as localized numeric stringsanElement.formArrayLocalized();
formArrayLocalized(forcedOutputFormat)Idem above, but with the possibility of overriding the outputFormat optionanElement.formArrayLocalized(forcedOutputFormat);
formJsonNumericStringReturn a JSON string containing an object representing the form input values. This is based on the result of the formArrayNumericString() function.anElement.formJsonNumericString();
formJsonFormattedReturn a JSON string containing an object representing the form input values. This is based on the result of the formArrayFormatted() function.anElement.formJsonFormatted();
formJsonLocalizedReturn a JSON string containing an object representing the form input values. This is based on the result of the formArrayLocalized() function.anElement.formJsonLocalized();
formJsonLocalized(forcedOutputFormat)Idem above, but with the possibility of overriding the outputFormat optionanElement.formJsonLocalized(forcedOutputFormat);
formUnformatUnformat all the AutoNumeric-managed elements that are a child to the parent
element of this anElement input, to numeric strings
anElement.formUnformat();
formUnformatLocalizedUnformat all the AutoNumeric-managed elements that are a child to the parent element of this anElement input, to localized stringsanElement.formUnformatLocalized();
formReformatReformat all the AutoNumeric-managed elements that are a child to the parent element of this anElement inputanElement.formReformat();
+

Submit the form values

+

Submitting the form values to the server can be done with a single AutoNumeric function call. +Moreover, the functions below may take a callback, giving you more control on what to do when submitting data to the server.

+

The following functions can either take a callback, or not. If they don't, the default form.submit() function will be called.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
formSubmitNumericString(callback)Run the callback(value) with value being equal to the result of formNumericString()anElement.formSubmitNumericString(callback);
formSubmitFormatted(callback)Run the callback(value) with value being equal to the result of formFormatted()anElement.formSubmitFormatted(callback);
formSubmitLocalized(callback)Run the callback(value) with value being equal to the result of formLocalized()anElement.formSubmitLocalized(callback);
formSubmitLocalized(forcedOutputFormat, callback)Idem above, but with the possibility of overriding the outputFormat optionanElement.formSubmitLocalized(forcedOutputFormat, callback);
+

For the following methods, the callback is mandatory:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
formSubmitArrayNumericString(callback)Run the callback(value) with value being equal to the result of formArrayNumericString()anElement.formSubmitArrayNumericString(callback);
formSubmitArrayFormatted(callback)Run the callback(value) with value being equal to the result of formArrayFormatted()anElement.formSubmitArrayFormatted(callback);
formSubmitArrayLocalized(callback, forcedOutputFormat)Idem above, but with the possibility of overriding the outputFormat optionanElement.formSubmitArrayLocalized(callback, forcedOutputFormat);
formSubmitJsonNumericString(callback)Run the callback(value) with value being equal to the result of formJsonNumericString()anElement.formSubmitJsonNumericString(callback);
formSubmitJsonFormatted(callback)Run the callback(value) with value being equal to the result of formJsonFormatted()anElement.formSubmitJsonFormatted(callback);
formSubmitJsonLocalized(callback, forcedOutputFormat)Idem above, but with the possibility of overriding the outputFormat optionanElement.formSubmitJsonLocalized(callback, forcedOutputFormat);
+

Function chaining

+

Most of those instantiated functions can be chained which allow to be less verbose and more concise.

+
Chaining on one element
anElement.french()
+         .set(42)
+         .update({ options })
+         .formSubmitJsonNumericString(callback)
+         .clear();
+
+
Chaining on multiple elements
anElement.global.set(72)
+         .global.clear()
+         .set(25)
+         .global.getNumericString();
+
+

Static methods

+

AutoNumeric also provide static functions on the AutoNumeric class. You can check those out in the next chapter.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/methods/index.html b/Documentation/methods/index.html new file mode 100644 index 0000000..2c4343f --- /dev/null +++ b/Documentation/methods/index.html @@ -0,0 +1,1509 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Accessing the methods - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Accessing the methods

+ +

AutoNumeric provides numerous methods to access and modify the element value, formatted or unformatted, at any point in time. +
It does so by providing access to those methods via the AutoNumeric object class, which is declared as an ES6 Module.

+

First, you need to get a reference to the AutoNumeric module that you need to import: +

Import the AutoNumeric library as an ES6 module
import AutoNumeric from 'autonumeric';
+

+

Then you'll be able to access either the methods on the instantiated AutoNumeric object, or the static functions directly by using the AutoNumeric class.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/older versions/index.html b/Documentation/older versions/index.html new file mode 100644 index 0000000..7ce5e06 --- /dev/null +++ b/Documentation/older versions/index.html @@ -0,0 +1,1493 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Older versions - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Older versions

+ +

The previous stable AutoNumeric version v2.0.13 can be found here, while the older v1.9.46 can be found here.

+

Check out the upgrade guide if you need help upgrading from version 1.9/2 to version 4.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/on which elements can it be used/index.html b/Documentation/on which elements can it be used/index.html new file mode 100644 index 0000000..8cc12b6 --- /dev/null +++ b/Documentation/on which elements can it be used/index.html @@ -0,0 +1,1652 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + On which elements can it be used? - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

On which elements can it be used?

+ +

AutoNumeric can be used in two ways;

+
    +
  • with event listeners when used on <input> elements or on contenteditable-enabled elements making them reactive (in a read/write mode), or
  • +
  • without event listeners when used on DOM elements not having the contenteditable attribute set to true, essentially acting as a format-once-and-forget read only mode.
  • +
+

On <input> elements

+

When used on an <input> element, you'll be able to interact with its value and get a formatted input value as-you-type, using the full power of AutoNumeric.

+

Please note than due to browser constraints, only the following supported <input> types are supported:

+
    +
  • text,
  • +
  • tel,
  • +
  • hidden, or
  • +
  • no type specified at all
  • +
+
Input types examples
<input type='text' value="1234.56">
+<input type='tel' value="1234.56">
+<input type='hidden' value="1234.56">
+<input value="1234.56">
+
+
+

Caveat

+

The number type is not supported simply because AutoNumeric formats numbers as strings (ie. '123.456.789,00 &#8364;') that this input type does not allow.

+
+

On contenteditable-enabled elements

+

Any element in the following allowedTagList1 that support the contenteditable attribute can be initialized by AutoNumeric. +This means that anywhere on a page, on any DOM element, you can harness the power of AutoNumeric which will allow you to mask and manage the user inputs.

+

Given the following html code... +

<p id="editableDom" contenteditable="true">12345678.9012</p>
+
+you can initialize this <p> element with AutoNumeric: +
new AutoNumeric('#editableDom').french();
+
+...and it will act exactly like an <input> element controlled by AutoNumeric.

+

On other DOM elements

+

You can use AutoNumeric to format a DOM element value once on load.
+This means it will then not react to any user interaction nor changes to it's value or formatting.

+

The following elements are accepted:

+
+

Allowed tags list

+

b, caption, cite, code, const, dd, del, div, dfn, dt, em, h1, h2, h3, h4, h5, h6, ins, kdb, label, li, option, output, p, q, s, sample, span, strong, td, th, u

+
+
+

Tips

+

Since the number type is not supported, if you want to display a numeric keyboard when selecting an AutoNumeric-managed element in a mobile browser, you can use the input tel type.

+

In the future, you'll be able to add the inputmode="numeric" Html attribute in order to achieve the same effect.

+
+
+
+
    +
  1. +

    The allowedTagList contains the following HTML elements : b, caption, cite, code, const, dd, del, div, dfn, dt, em, h1, h2, h3, h4, h5, h6, ins, kdb, label, li, option, output, p, q, s, sample, span, strong, td, th, u 

    +
  2. +
+
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/predefined options/index.html b/Documentation/predefined options/index.html new file mode 100644 index 0000000..1b0e4d1 --- /dev/null +++ b/Documentation/predefined options/index.html @@ -0,0 +1,2037 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Predefined options - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Predefined options

+ +

Sometimes you do not want to have to configure every single aspect of your format using the configuration options, specially if it's a common one.
Hence, we provide multiple default options for the most common currencies and number formats.

+

Predefined language options

+

AutoNumeric provides predefined language options to format currencies.
+You can set the pre-defined language option like so: +

Use the methods
new AutoNumeric('.mySelector > input').french();
+
+
...or just create the AutoNumeric object with the predefined language option
new AutoNumeric('.mySelector > input', AutoNumeric.getPredefinedOptions().French);
+

+

Currently, the predefined language options are:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Option name
🇫🇷French
🇪🇸Spanish
🇺🇸NorthAmerican
🇬🇧British
🇨🇭Swiss
🇯🇵Japanese
🇨🇳Chinese
🇧🇷Brazilian
🇹🇷Turkish
+

If you feel a common currency option is missing, please create a pull request and we'll add it!

+

Predefined common options

+

Moreover, AutoNumeric provides the following common options:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Option nameDescriptionExamples
dotDecimalCharCommaSeparatorSet the decimal character as a dot . and the group separator as a comma ,1,234.56
commaDecimalCharDotSeparatorSet the decimal character as a comma , and the group separator as a dot .1.234,56
integerSet the minimum and maximum value so that only an integer can be entered, without any decimal places available42, -42
integerPosSet the minimum and maximum value so that only a positive integer can be entered42
integerNegSet the minimum and maximum value so that only a negative integer can be entered-42
floatSet the minimum and maximum value so that a float can be entered, without the default 2 decimal places1.234, -1.234
floatPosSet the minimum and maximum value so that only a positive float can be entered1.234
floatNegSet the minimum and maximum value so that only a negative float can be entered-1.234
numericFormat the value as a numeric string (with no digit group separator, and a dot for the decimal point)1234.56
numericPosIdem above, but only allow positive values1234.56
numericNegIdem above, but only allow negative values-1234.56
euroSame configuration than French1.234,56 €
euroFSame configuration than euro, with the formula mode activated1.234,56 €
euroPosIdem above, but only allow positive values1.234,56 €
euroNegIdem above, but only allow negative values-1.234,56 €
euroSpaceSame configuration than French except a space is used for the group separator instead of the dot1 234,56 €
euroSpacePosIdem above, but only allow positive values1 234,56 €
euroSpaceNegIdem above, but only allow negative values-1 234,56 €
dollarSame configuration than NorthAmerican$1,234.56
dollarFSame configuration than dollar, with the formula mode activated$1,234.56
dollarPosIdem above, but only allow positive values$1,234.56
dollarNegIdem above, but only allow negative values-$1,234.56
percentageEU2decSame configuration than French, but display a percent % sign instead of the currency sign, with 2 decimal places12,34 %
percentageEU2decPosIdem above, but only allow positive values12,34 %
percentageEU2decNegIdem above, but only allow negative values-12,34 %
percentageEU3decSame configuration than French, but display a percent % sign instead of the currency sign, with 3 decimal places12,345 %
percentageEU3decPosIdem above, but only allow positive values12,345 %
percentageEU3decNegIdem above, but only allow negative values-12,345 %
percentageUS2decSame configuration than NorthAmerican, but display a percent % sign instead of the currency sign, with 2 decimal places12.34%
percentageUS2decPosIdem above, but only allow positive values12.34%
percentageUS2decNegIdem above, but only allow negative values-12.34%
percentageUS3decSame configuration than NorthAmerican, but display a percent % sign instead of the currency sign, with 3 decimal places12.345%
percentageUS3decPosIdem above, but only allow positive values12.345%
percentageUS3decNegIdem above, but only allow negative values-12.345%
+

You can set those pre-defined options like so: +

new AutoNumeric('.mySelector > input', AutoNumeric.getPredefinedOptions().integerPos);
+

+

Predefined style rules

+

With the styleRules option, you can define the rules that add or remove the CSS class(es) from the element, based on the raw unformatted value.
This option can also be used to define custom callbacks in the userDefined attribute, that will be called whenever the rawValue is updated.

+

Predefined styles rules are available so you do not have to create them:

+

Positive and negative

+

Sets the 'autoNumeric-positive' css class whenever the raw value is positive.
+Sets the 'autoNumeric-negative' css class whenever the raw value is negative. +

Positive and negative style rule
new AutoNumeric(domElement, { styleRules: AutoNumeric.options.styleRules.positiveNegative });
+

+

Range from 0 to 100, in 4 steps

+

Sets the 'autoNumeric-red' css class whenever the raw value is between 0 and 25 excluded.
+Sets the 'autoNumeric-orange' css class whenever the raw value is between 25 and 50 excluded.
+Sets the 'autoNumeric-yellow' css class whenever the raw value is between 50 and 75 excluded.
+Sets the 'autoNumeric-green' css class whenever the raw value is between 75 and 100 excluded. +

Range 0 to 100 style rule
new AutoNumeric(domElement, { styleRules: AutoNumeric.options.styleRules.range0To100With4Steps });
+

+

Odd and even

+

Sets the 'autoNumeric-even' css class whenever the raw value is even.
+Sets the 'autoNumeric-odd' css class whenever the raw value is odd. +

Odd and even style rule
new AutoNumeric(domElement, { styleRules: AutoNumeric.options.styleRules.evenOdd });
+

+

Small range around zero, from -1 to 1

+

Sets the 'autoNumeric-small-negative' css class whenever the raw value is between -1 and 0 excluded.
+Sets the 'autoNumeric-zero' css class whenever the raw value is equal to 0.
+Sets the 'autoNumeric-small-positive' css class whenever the raw value is between 0 excluded and 1. +

Small range style rule
new AutoNumeric(domElement, { styleRules: AutoNumeric.options.styleRules.rangeSmallAndZero });
+

+

Custom callbacks

+

Custom callbacks can be defined and will be called every time the raw value is updated.
+You can add as many callbacks you want in the userDefined attribute of the styleRules object in the options.

+
+

Important

+

Each userDefined array entry should at least provide a function as the callback attribute.

+
+

This callback function is passed the rawValue as the single parameter (except if classes is null or undefined, see below).

+

Depending of what type of data the callback function returns, and what the content of the classes attribute is, it will either uses CSS class names defined in the classes attribute, or just call the callback with the current AutoNumeric object passed as a parameter if classes is null or undefined.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Callback variationsCallback return typeclasses contentResult
1a booleana single StringIf true, add the single class defined in classes. If false removes it.
2a booleanan Array with 2 values (array indexes)If true, add the first element of the array, otherwise the second
3an integeran Array with multiple values (array indexes)Will add the selected CSS class classes[index], and remove the others
4an Array of integeran Array with multiple values (array indexes)Will add all the given selected CSS classes, and remove the others
5null or undefinedThere, the callback have access to the current AutoNumeric object passed as its argument, which means you are free to do whatever you want from here!
+

See the following examples for how to use those callback variations: +

Calling callbacks when the raw value changes, using style rules
const options = {
+    styleRules : {
+        userDefined: [
+            // 1) If 'classes' is a string, set it if `true`, remove it if `false`
+            { callback: rawValue => { return true; }, classes: 'thisIsTrue' },
+            // 2) If 'classes' is an array with only 2 elements, set the first class if `true`, the second if `false`
+            { callback: rawValue => rawValue % 2 === 0, classes: ['autoNumeric-even', 'autoNumeric-odd'] },
+            // 3) Return only one index to use on the `classes` array (here, 'class3')
+            { callback: rawValue => { return 2; }, classes: ['class1', 'class2', 'class3'] },
+            // 4) Return an array of indexes to use on the `classes` array (here, 'class1' and 'class3')
+            { callback: rawValue => { return [0, 2]; }, classes: ['class1', 'class2', 'class3'] },
+            // 5) If 'classes' is `undefined` or `null`, then the callback is called with the AutoNumeric object passed as a parameter
+            { callback: anElement => { return anElement.getFormatted(); } },
+        ],
+    },
+}
+

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/related projects/index.html b/Documentation/related projects/index.html new file mode 100644 index 0000000..030189b --- /dev/null +++ b/Documentation/related projects/index.html @@ -0,0 +1,1606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Related projects - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Related projects

+ +

Projects have been created to integrate AutoNumeric in existing frameworks, so that the library could be used easily in components.

+
+

Info

+

Some of the following projects may lag with the latest AutoNumeric version, or even be incomplete.

+
+

Javascript

+

For integration into Javascript frameworks, you can use:

+ +

Rails

+

For integration into Rails projects, you can use the autonumeric-rails project.

+

PHP

+

For integration with PHP Yii2, take a look at the extead/yii2-autonumeric or haifahrul/yii2-autonumeric projects.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/special options/index.html b/Documentation/special options/index.html new file mode 100644 index 0000000..430908e --- /dev/null +++ b/Documentation/special options/index.html @@ -0,0 +1,1598 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Special options - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Special options

+ +

noEventListeners

+

Using the noEventListeners option allows AutoNumeric to apply formatting without adding any event listeners to an input, or any other DOM elements (that the function would accept as a parameter).
This would be useful for read-only values for instance. +

// Initialize with setting up event listeners, but removing them in the same call
+anElement = new AutoNumeric(domElement, 12345.789, { options }).remove(); // This is the default existing way of doing that...
+
+// Initialize without setting up any event listeners by directly passing the special option `noEventListeners` to prevent the initial creation of those event listeners
+anElement = new AutoNumeric(domElement, 12345.789, { noEventListeners: true });
+
+In the latter case, it initializes the AutoNumeric element, except it does not add any event listeners beforehand. This means it formats the value only once and then lets the user modify it freely.

+
+

Note

+

The value can then be formatted via a call to set().

+
+

readOnly

+

AutoNumeric can initialize an <input> element with the readonly property by setting the readOnly option to true in the settings: +

anElement = new AutoNumeric(domElement, 12345.789, { readOnly: true });
+

+

For more detail on how to use each options, please take a look at the detailed comments in the source code for the AutoNumeric.defaultSettings object.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/static methods/index.html b/Documentation/static methods/index.html new file mode 100644 index 0000000..0b9a254 --- /dev/null +++ b/Documentation/static methods/index.html @@ -0,0 +1,1824 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Static methods - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Static methods

+ +

Without having to initialize any AutoNumeric object, you can directly use the static AutoNumeric class functions.

+
+

Info

+

Some of those functions can be used in Web Workers.

+
+

Get

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
getAutoNumericElementReturn the AutoNumeric object that manages the given DOM elementAutoNumeric.getAutoNumericElement(domElement)
AutoNumeric.getAutoNumericElement('#theInput')
getDefaultConfigReturn the default autoNumeric settingsAutoNumeric.getDefaultConfig()
getFormattedReturn the formatted string from the given DOM element or query selector.
This can accept a callback that is passed the result of getFormatted and a reference to the AutoNumeric object.
AutoNumeric.getFormatted(domElement, callback);
AutoNumeric.getFormatted('#theInput')
getLocalizedReturn the localized unformatted number as a string from the given DOM element or query selector.
This can accept a callback that is passed the result of getLocalized and a reference to the AutoNumeric object.
AutoNumeric.getLocalized(domElement, forcedOutputFormat, callback);
AutoNumeric.getLocalized('#theInput')
getNumberReturn the unformatted number as a number from the given DOM element or query selector (The same warnings got the non-static getNumber method applies here too).
This can accept a callback that is passed the result of getNumber and a reference to the AutoNumeric object.
AutoNumeric.getNumber(domElement, callback);
AutoNumeric.getNumber('#theInput')
getNumericStringReturn the unformatted number as a string from the given DOM element or query selector.
This can accept a callback that is passed the result of getNumericString and a reference to the AutoNumeric object.
AutoNumeric.getNumericString(domElement, callback)
AutoNumeric.getNumericString('#theInput')
getPredefinedOptionsReturn all the predefined options in one objectAutoNumeric.getPredefinedOptions()
getPredefinedOptionsReturn a specific pre-defined language option objectAutoNumeric.getPredefinedOptions().French
+

Set

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
localizeAndSetUnformat and localize the domElement value with the given options and returns the localized value as a string. This function does update that element value with the newly localized value in the process.AutoNumeric.localizeAndSet(domElement, { options });
formatAndSetFormat the domElement value with the given options and returns the formatted value as a string. This function does update that element value with the newly formatted value in the process.AutoNumeric.formatAndSet(domElement, { options });
reformatAndSetRecursively format all the autoNumeric-managed elements that are a child to the referenceToTheDomElement element given as a parameter (this is usually the parent <form> element), with the settings of each AutoNumeric elements.AutoNumeric.reformatAndSet(referenceToTheDomElement);
setSet the given value on the AutoNumeric object that manages the given DOM element, if any. Returns null if no AutoNumeric object is found, otherwise returns the AutoNumeric object.AutoNumeric.set(domElement, 42)
AutoNumeric.set('#theInput', 42)
unformatAndSetUnformat the domElement value with the given options and returns the unformatted value as a numeric string. This function does update that element value with the newly unformatted value in the process.AutoNumeric.unformatAndSet(domElement, { options });
unformatAndSetRecursively unformat all the autoNumeric-managed elements that are a child to the referenceToTheDomElement element given as a parameter (this is usually the parent <form> element)AutoNumeric.unformatAndSet(referenceToTheDomElement);
+

Formatting

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
formatFormat the given number with the given options. This returns the formatted value as a string.AutoNumeric.format(12345.21, { options });
formatIdem above, but using a numeric string as the first parameterAutoNumeric.format('12345.21', { options });
formatIdem above, but you can pass as many option objects you want to this function, the latter overwriting the previous ones. This allows to correctly format currencies that have a predefined option as its base, but has been slightly modified.AutoNumeric.format('12345.21', { options1 }, { options2 });
formatIdem above, using multiple option objects in one array. This way allows for using a pre-defined option name.AutoNumeric.format('12345.21', [{ options1 }, 'euroPos', { options2 }]);
formatFormat the domElement value (or textContent) with the given options and returns the formatted value as a string. This does not update that element value.AutoNumeric.format(domElement, { options });
localizeUnformat and localize the given formatted string with the given options. This returns a string.AutoNumeric.localize('1.234,56 €', { options });
localizeIdem as above, but return the localized DOM element value. This does not update that element value.AutoNumeric.localize(domElement, { options });
unformatUnformat the given formatted string with the given options. This returns a numeric string.AutoNumeric.unformat('1.234,56 €', { options });
unformatIdem above, but you can pass as many option objects you want to this function, the latter overwriting the previous ones. This allows to correctly unformat currencies that have a predefined option as its base, but has been slightly modified.AutoNumeric.unformat('241800,02 €', AutoNumeric.getPredefinedOptions().French, { digitGroupSeparator: AutoNumeric.options.digitGroupSeparator.noSeparator });
unformatIdem above, using multiple option objects in one array. This way allows for using a pre-defined option name.AutoNumeric.unformat('1.234,56 €', [{ options1 }, 'euroPos', { options2 }]);
unformatUnformat the domElement value with the given options and returns the unformatted numeric string. This does not update that element value.AutoNumeric.unformat(domElement, { options });
+

Tests and miscellaneous

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDescriptionCall example
areSettingsValidReturn true in the settings are validAutoNumeric.areSettingsValid({ options })
isManagedByAutoNumericReturn true if the given DOM element (or selector string) has an AutoNumeric object that manages it.AutoNumeric.isManagedByAutoNumeric(domElement);
AutoNumeric.isManagedByAutoNumeric('#theInput');
mergeOptionsAccepts an array of option objects and / or pre-defined option names, and return a single option object where the latter element overwrite the settings from the previous onesAutoNumeric.mergeOptions(['euro', { currencySymbol: '#' }]);
testTest if the given DOM element (or selector string) is already managed by AutoNumeric (if it is initialized)AutoNumeric.test(domElement);
AutoNumeric.test('#theInput');
validateCheck if the given option object is valid, and that each option is valid as well. This throws an error if it's not.AutoNumeric.validate({ options })
versionReturn the current AutoNumeric version number (for debugging purpose)AutoNumeric.version();
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/support/index.html b/Documentation/support/index.html new file mode 100644 index 0000000..5bd2837 --- /dev/null +++ b/Documentation/support/index.html @@ -0,0 +1,1593 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Support - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Support

+ +

AutoNumeric website

+

You can check the AutoNumeric official website which contains additional tools and examples.

+

Questions

+

For questions and support please use the Gitter chat room or IRC on Libera Chat #autoNumeric.

+

The issue list of the Github repository is exclusively for bug reports and feature requests.

+

Support

+

Feel free to donate via Patreon Donate to support autoNumeric development.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Documentation/updating options/index.html b/Documentation/updating options/index.html new file mode 100644 index 0000000..4e4ac8c --- /dev/null +++ b/Documentation/updating options/index.html @@ -0,0 +1,1660 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Updating existing options - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Updating existing options

+ +

Options can be added and/or modified after the initialization has been done.

+

Adding or modifing options

+

Either by passing an option object that contains multiple options, +

anElement.update({ moreOptions });
+anElement.update(AutoNumeric.getPredefinedOptions().NorthAmerican); // Update the settings (and immediately reformat the element accordingly)
+

+

...by passing multiple option objects, the latter overwriting the settings from the former ones, +

anElement.update({ moreOptions1 }, { moreOptions2 }, 'euro');
+// or in a single array
+anElement.update([{ moreOptions1 }, { moreOptions2 }, 'euro']);
+

+

...or by changing the options one by one (or by calling a pre-defined option object). +

anElement.options.minimumValue('12343567.89');
+anElement.options.allowDecimalPadding(false);
+

+
+

Info

+

Each option can be accessed as a function to update its value, ie. anElement.options.<optionName>(), where <optionName> can be any option name from the options list.

+
+
+

Hint

+

As soon as the options are modified, the AutoNumeric-managed input content is re-formatted accordingly.

+
+

Updating the options for multiple elements

+

If you've initialized your input with AutoNumeric.multiple(), you can use the returned Array1 to update all the AutoNumeric objects at once: +

// AutoNumeric initialisation for multiple elements
+const anElements = new AutoNumeric.multiple('.numeric', 42, ['French']);
+
+// Update the options globally for all the inputs with one function call:
+// Modify only a specific element in the array
+anElements[2].update({ decimalPlaces: 3 });
+// or modify all the elements at once
+anElements.forEach(a => a.update({ currencySymbol: '#' })); // or .set(), etc.
+

+

Resetting options

+

At any point, you can reset the options by calling the options.reset() method. +This effectively drop any previous options you could have set, then load back the default settings. +

Reset the options to their default settings
anElement.options.reset();
+

+

Lastly, the option object can be accessed directly, thus allowing to query each options globally too.
This allows to inspect the current options used. +

Access the current options as an object
anElement.getSettings(); // Return the options object containing all the current AutoNumeric settings in effect
+

+
+
+
    +
  1. +

    The AutoNumeric.multiple() function will always return an Array, even if there is only one element selected. 

    +
  2. +
+
+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 978d46c..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,159 +0,0 @@ -# LICENSE - -## Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License - -By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. - -### Section 1 – Definitions. - -a. __Adapted Material__ means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. - -b. __Adapter's License__ means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. - -c. __BY-NC-SA Compatible License__ means a license listed at [creativecommons.org/compatiblelicenses](http://creativecommons.org/compatiblelicenses), approved by Creative Commons as essentially the equivalent of this Public License. - -d. __Copyright and Similar Rights__ means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. - -e. __Effective Technological Measures__ means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. - -f. __Exceptions and Limitations__ means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. - -g. __License Elements__ means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike. - -h. __Licensed Material__ means the artistic or literary work, database, or other material to which the Licensor applied this Public License. - -i. __Licensed Rights__ means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. - -h. __Licensor__ means the individual(s) or entity(ies) granting rights under this Public License. - -i. __NonCommercial__ means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. - -j. __Share__ means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. - -k. __Sui Generis Database Rights__ means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. - -l. __You__ means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. - -### Section 2 – Scope. - -a. ___License grant.___ - -1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: - -A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and - -B. produce, reproduce, and Share Adapted Material for NonCommercial purposes only. - -2. __Exceptions and Limitations.__ For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. - -3. __Term.__ The term of this Public License is specified in Section 6(a). - -4. __Media and formats; technical modifications allowed.__ The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. - -5. __Downstream recipients.__ - -A. __Offer from the Licensor – Licensed Material.__ Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. - -B. __Additional offer from the Licensor – Adapted Material.__ Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. - -C. __No downstream restrictions.__ You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. - -6. __No endorsement.__ Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). - -b. ___Other rights.___ - -1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. - -2. Patent and trademark rights are not licensed under this Public License. - -3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. - -### Section 3 – License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the following conditions. - -a. ___Attribution.___ - -1. If You Share the Licensed Material (including in modified form), You must: - -A. retain the following if it is supplied by the Licensor with the Licensed Material: - -i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); - -ii. a copyright notice; - -iii. a notice that refers to this Public License; - -iv. a notice that refers to the disclaimer of warranties; - -v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; - -B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and - -C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. - -2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. - -3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. - -b. ___ShareAlike.___ - -In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. - -1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License. - -2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. - -3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. - -### Section 4 – Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: - -a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only; - -b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and - -c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. - -### Section 5 – Disclaimer of Warranties and Limitation of Liability. - -a. __Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.__ - -b. __To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.__ - -c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. - -### Section 6 – Term and Termination. - -a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. - -b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: - -1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or - -2. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or - -For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. - -c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. - -d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. - -### Section 7 – Other Terms and Conditions. - -a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. - -b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. - -### Section 8 – Interpretation. - -a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. - -b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. - -c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. - -d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. diff --git a/Old documentation/deprecated documentation/index.html b/Old documentation/deprecated documentation/index.html new file mode 100644 index 0000000..dab4e04 --- /dev/null +++ b/Old documentation/deprecated documentation/index.html @@ -0,0 +1,1505 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Deprecated documentation - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Deprecated documentation

+ +

The old and outdated documentation for the deprecated v1.9 and v2 versions can be found in the v1.9 documentation and v2 documentation files.

+

For some examples and an option code generator for the old v1.9.* version, take a look here.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Old documentation/v1.9 documentation/index.html b/Old documentation/v1.9 documentation/index.html new file mode 100644 index 0000000..0860e59 --- /dev/null +++ b/Old documentation/v1.9 documentation/index.html @@ -0,0 +1,1846 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + v1.9 documentation - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

v1.9 documentation

+ +

Documentation for v1.9 (⚠ DEPRECATED)

+

Disclaimer 1: v1.9 has been superseeded by v4.* and is not longer supported. Please consider switching to the latest version.

+

Disclaimer 2: This documentation may be outdated.
Please consider using the Readme that always has up-to-date information.

+

Changing the defaults options

+

The complete list of options are below

+

There are multiple ways for changing the options. To format "123456789.00" to "€ 123.456.789,00" you could do the following:

+

options - pass when initializing autoNumeric +

$(document).ready(function(){
+   $(selector).autoNumeric("init", {
+        digitGroupSeparator: '.',
+        decimalCharacter: ',', 
+        currencySymbol: '€ '
+    });
+});
+

+

HTML5 data - *By convention the data attribute is written in lower-case. Compound words (example: "decimalCharacter") need to be split and separated by a dash. The equal sign separates the name and value. The value should be enclosed with quote marks. If multiple options are being used they each need to have the own data attribute.

+
<input type='text' name="someName" value="1234.56" data-a-sep="." data-a-dec="," data-a-sign="€ "/>
+
+

$.extend method - in this example ASP.NET current culture settings are passed.

+

note: - this can change defaults globally

+

<script type="text/javascript">  
+
+    $(document).ready(function() {          
+        $.extend($.fn.autoNumeric.defaults, {              
+            digitGroupSeparator: '@System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator',              
+            decimalCharacter: '@System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator',
+                        currencySymbol: '@System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol'
+        });      
+
+        $('selector').autoNumeric('init'); 
+
+    });
+
+</script>
+
+Callback function - this example changes the number of decimal places.

+
 <script type="text/javascript">
+
+ /* the callback function must be defined prior to initiating autoNumeric */ 
+
+ var functionName = function() {
+    /* your code here */  
+    var value = 4; /* example only */
+    return value; 
+ }
+
+ /* initiates autoNumeric and passes a function */  
+
+ $('selector').autoNumeric('init', { decimalPlaces: functionName }) 
+
+
+

Values - locale formats that autoNumeric can properly handle as a numeric value

+

By default autoNumeric formats the default values on page ready. The values should be sent as text. autoNumeric supports the use on locale formats with the following rules:

+
    +
  • Numeric values should be send as text
  • +
  • The first comma or period will be considered the decimal character
  • +
  • Any additional commas or periods will cause an error to be thrown
  • +
  • The sign (minus only) can be proceeding or trailing
  • +
  • Currency symbols or other non-numeric characters will throw an error
  • +
  • Quick visual guide:
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
value / textvalid?
"123456"true
"123456.78"true
"123456,78"true
"-123456"true
"-123456.78"true
"-123456,78"true
"123456-"true
"123456.78-"true
"123456,78-"true
"123,456.78"false
"123.456.78"false
"-123456.78-"false
"€ 123456.78"false
"2.034E23"false
+

Default values and values being "set" need to fall with the min/max range.

+

If you do not want the default values formatted on set the option from "formatOnPageLoad: true" to "formatOnPageLoad: false"

+
+

ASP.NET default value and post-back

+

During page load / re-load autoNumeric compares the value of the input "$this[0].value" and the "$this.prop('defaultValue')" value. If they are equal and "formatOnPageLoad: true" the value is formatted.

+

What happens during ASP.NET form post-back is the input tag is re-rendered. An example Page loaded

+
<input type='text' name="someName"  id="someID" class='someClass' value="" />
+
+// user enters "1234.56" => "1,234.56" with default settings
+// during post-back the input is re-rendered and is now showing the new default value. 
+
+<input type='text' name="someName"  id="someID" class='someClass' value="1,234.56" />
+
+

Once the page is reloaded on post-back and autoNumeric compares $this[0].value" and the "$this.prop('defaultValue')" and sees they are equal it attenpts to format the values. From the above valid value table the "1,234.56" would be invalid.

+

There are two options that can handle the postback event "formatOnPageLoad" & "defaultValueOverride":

+

1) "formatOnPageLoad option" - this option controls if default values are formatted on page load. By default it is set to "formatOnPageLoad: true"

+

Change the "formatOnPageLoad" option to "formatOnPageLoad: false" - this can be done when initalizing "init" the element as an option or as HTML5 data attribute

+

If there are no default value(vs) simply initialize 'init' the element

+

$('selector').autoNumeric('init', {formatOnPageLoad: false});    
+
+If there is a default value you will need to pre-format the default value as shown +
<!-- it is important that a preformatted default values match the options/settings.
+      mismatches could cause errors -->
+<input type='text' name="someName" value="1,234.56"/>
+

+

2) "defaultValueOverride" option was created to help ASP.NET postabck and is used if "formatOnPageLoad: true" is set 'true'.

+

Note: "defaultValueOverride" option should be the same value as the default value

+
<input type='text' name="someName" value="1234.56"/>
+
+

// 'defaultValueOverride' is the value of the default value above 
+$('selector').autoNumeric('init', {defaultValueOverride: "1234.56"});       
+
+Please note that "formatOnPageLoad" and "defaultValueOverride" can be set by either {options} or HTML5 data attribute

+
+

Min / Max settings and decimal places

+

The minimum and maximum values and decimal places are set via minimumValue: '-9999999999999.99' and maximumValue: '9999999999999.99' option. The decimal places are determined be the number of characters following the "." decimal point.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
minimumValue:maximumValue:decimal places
"0""9999999999"0
"0.00""99999999.99"2
"0.00""9999999999"2
"-9999999""9999999.999"3
+

Notes: +- minimumValue should always be a lower value than maximumValue! +- minimumValue and maximumValue can be both positive or negative but do so with caution. +- If the range of the minimumValue & maximumValue is small or you make them numbers other then "9" nines (example "1000) you could create a situation where the uses will need to delete characters before the can obtain the minimumValue / maximumValue limits.

+
+

Additional documentation for v1.9 can be found on the old website.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Old documentation/v2.0 documentation/index.html b/Old documentation/v2.0 documentation/index.html new file mode 100644 index 0000000..ce8e2e3 --- /dev/null +++ b/Old documentation/v2.0 documentation/index.html @@ -0,0 +1,2374 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + v2.0 documentation - AutoNumeric.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

v2.0 documentation

+ +

Documentation for v2 (⚠ DEPRECATED)

+

Disclaimer 1: v1.9 has been superseeded by v4.* and is not longer supported. Please consider switching to the latest version.

+

Disclaimer 2: This documentation may be outdated.
Please consider using the Readme that always has up-to-date information.

+

List of methods and settings

+

The following is an uncomplete list of the methods and settings/options that control autoNumeric 2.0.*:

+
+
'init'
+
initializes autoNumeric Must be run before other methods can be called
+
+
    +
  • $('someSelector').autoNumeric();
  • +
  • $('someSelector').autoNumeric('init');
  • +
  • $('someSelector').autoNumeric({options});
  • +
  • $('someSelector').autoNumeric('init', {options});
  • +
+
+
'destroy'
+
stops autoNumeric and removes jQuery data
+
+
    +
  • $('someSelector').autoNumeric('destroy');
  • +
+
+
'wipe'
+
removes session storage and cookies from memory - only needed if the 'aStor' option is true +- $(someSelector).autoNumeric('wipe');
+
'update'
+
updates autoNumeric's settings
+
+
    +
  • $('someSelector').autoNumeric('update', {options});
  • +
  • Can be run multiple times
  • +
  • Overrides the default settings and HTML5 data
  • +
+
+
'set'
+
returns a formatted string via jQuery's ".val()" or ".text' methods to the selected tag(s)
+
+
    +
  • $('someSelector').autoNumeric('set', value); // see
  • +
+
+
'unSet'
+
method to un-format inputs - handy to use right before form submission
+
+
    +
  • $(someSelector).autoNumeric('unSet'); // returns "nnnn.nn" or "-nnnn.nn"
  • +
  • $(someSelector).autoNumeric('unSet', '.-'); // returns "nnnn.nn" or "nnnn.nn-" // trailing negative sign
  • +
  • $(someSelector).autoNumeric('unSet', ','); // returns "nnnn,nn" or "-nnnn,nn" // comma as decimal seperator
  • +
  • $(someSelector).autoNumeric('unSet', ',-'); // returns "nnnn,nn" or "nnnn,nn-" // comma as decimal separator & trailing negative sign
  • +
+
+
'reSet'
+
method to re-format inputs - handy to use right after form submission
+
+
    +
  • $(someSelector).autoNumeric('reSet');
  • +
+
+
'get'
+
allows you to easily remove the formatting from a string on a autoNumeric controlled element and returns a string
+
+
    +
  • $(someSelector).autoNumeric('get'); // returns "nnnn.nn" or "-nnnn.nn"
  • +
  • $(someSelector).autoNumeric('get', '.-'); // returns "nnnn.nn" or "nnnn.nn-" // trailing negative sign
  • +
  • $(someSelector).autoNumeric('get', ','); // returns "nnnn,nn" or "-nnnn,nn" // comma as decimal seperator
  • +
  • $(someSelector).autoNumeric('get', ',-'); // returns "nnnn,nn" or "nnnn,nn-" // comma as decimal separator & trailing negative sign
  • +
+
+
'getString'
+
this basically uses jQuery's .serialize() method which creates a text string (URL-encoded notation) from a set of form elements that is ready for submission. The extra step taken here is the string is split and iterated through and the formatted values are replaced with unformatted values. The string is then joined back together and returned
+
+
    +
  • $(someSelector).autoNumeric('getString'); // returns "nnnn.nn" or "-nnnn.nn"
  • +
  • $(someSelector).autoNumeric('getString', '.-'); // returns "nnnn.nn" or "nnnn.nn-" // trailing negative sign
  • +
  • $(someSelector).autoNumeric('getString', ','); // returns "nnnn,nn" or "-nnnn,nn" // comma as decimal seperator
  • +
  • $(someSelector).autoNumeric('getString', ',-'); // returns "nnnn,nn" or "nnnn,nn-" // comma as decimal separator & trailing negative sign
  • +
+
+
'getArray'
+
this basically uses jQuery's .serializeArray() method which returns a JavaScript array of objects, ready to be encoded as a JSON string. Again autoNumeric iterated through the array object and replaces the formatted values with unformatted values.
+
+
    +
  • $(someSelector).autoNumeric('getArray'); // returns "nnnn.nn" or "-nnnn.nn"
  • +
  • $(someSelector).autoNumeric('getArray', '.-'); // returns "nnnn.nn" or "nnnn.nn-" // trailing negative sign
  • +
  • $(someSelector).autoNumeric('getArray', ','); // returns "nnnn,nn" or "-nnnn,nn" // comma as decimal seperator
  • +
  • $(someSelector).autoNumeric('getArray', ',-'); // returns "nnnn,nn" or "nnnn,nn-" // comma as decimal separator & trailing negative sign
  • +
+
+
'getSettings'
+
this returns an object that shows the autoNumeric settings for the field. You may find this helpful when developing a page
+
+
    +
  • $('someSelector').autoNumeric('getSettings'); // returns the jQuery data opbect with settings
  • +
  • $('someSelector').autoNumeric('getSettings').decimalCharacter; // returns the 'decimalCharacter' value
  • +
  • any individual setting can be returned by replacing decimalCharacter with the desired settings / option name
  • +
+

For more examples, documentation and the option code generator please take a look at http://www.decorplanit.com/plugin/.

+

New method for formatting and unformatting fields

+

Additionally, autoNumeric now supports formatting and unformatting directly without having to first initiate a DOM element :

+
+
'autoUnformat'
+
this returns an Number given the formatted string and the autoNumeric options passed as arguments
+
+

For instance, to unformat, you would use : +

let autoNumericOptions = { digitGroupSeparator: '.', decimalCharacter: ',', decimalCharacterAlternative: '.', currencySymbol: ' €', currencySymbolPlacement: 's', roundingMethod: 'U' };
+let formattedString = "1.234,56 €";
+$.fn.autoUnformat(formattedString, autoNumericOptions); // Returns 1234.56
+

+
+
'autoFormat'
+
this returns a formatted string given a Number and the autoNumeric options passed as arguments
+
+

For instance, to format, you would use : +

let autoNumericOptions = { digitGroupSeparator: '.', decimalCharacter: ',', decimalCharacterAlternative: '.', currencySymbol: ' €', currencySymbolPlacement: 's', roundingMethod: 'U' };
+let number = 1234.56;
+$.fn.autoFormat(number, autoNumericOptions); // Returns "1.234,56 €"
+

+

Default settings & supported options

+

visit autoNumeric's home page for an easy to use settings and option code generator

+

Disclaimer : This may be outdated. Please refer to the Readme or directly in the detailed comments in the source code for the defaultSettings object.

+

digitGroupSeparator

+

controls the thousand separator character +- digitGroupSeparator: ',' // Comma +- digitGroupSeparator: '.' // Dot +- digitGroupSeparator: ' ' // Normal space +- digitGroupSeparator: '\u2009' // Thin-space +- digitGroupSeparator: '\u202f' // Narrow no-break space +- digitGroupSeparator: '\u00a0' // No-break space +- digitGroupSeparator: '' // No separator +- digitGroupSeparator: "'" // Apostrophe +- digitGroupSeparator: '٬' // Arabic thousands separator +- digitGroupSeparator: '˙' // Dot above

+

showOnlyNumbersOnFocus

+

When true only numbers and the decimal character is visible while the input has focus +- showOnlyNumbersOnFocus: false (default) +- showOnlyNumbersOnFocus: true removes currency sign and thousand seperator while the input has focus. Help on some mobile devices

+

digitalGroupSpacing

+

controls the digital grouping and the placement of the thousand separator +- digitalGroupSpacing: '3' produces 333,333,333 (default) +- digitalGroupSpacing: '2' produces 22,22,22,333 India's Lakhs +- digitalGroupSpacing: '2s' produces 22,333,22,22,333 scaled version of India Lakhs +- digitalGroupSpacing: '4' produces 4,4444,4444 used in some Asian country's

+

decimalCharacter

+

controls the decimal character +- decimalCharacter: ',' // Comma +- decimalCharacter: '.' // Dot +- decimalCharacter: '·' // Middle-dot +- decimalCharacter: '٫' // Arabic decimal separator +- decimalCharacter: '⎖' // Decimal separator key symbol

+

decimalCharacterAlternative

+

this was developed to accommodate for different keyboard layouts. decimalCharacterAlternative allows you to declare an alternative key to enter the decimal separator assigned in decimalCharacter +- decimalCharacterAlternative: null (default)

+

currencySymbol

+

displays the desired currency symbol (examples: € or EUR). Note: other symbols can be used, such as %, °C, °F, km/h & MPH the possibilities are endless +- currencySymbol: '' none (default) +- examples: currencySymbol: 'U$D' or currencySymbol: 'EUR'

+

currencySymbolPlacement

+

controls the placement of the currency symbol (prefix or suffix) +- currencySymbolPlacement: 'p' prefix to the left (default) +- currencySymbolPlacement: 's' suffix to the right

+

negativePositiveSignPlacement

+

placement of the negative sign. This position is relative to the currencySymbol position + - negativePositiveSignPlacement: 'l' (default) left of currency sign + - negativePositiveSignPlacement: 'r' right of currency sign + - negativePositiveSignPlacement: 's' suffix places the sign to the right of the numbers + - negativePositiveSignPlacement: 'p' prefix places the sign(-) to the felt of the numbers + - Examples:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
formatoptions to achieve format
-1,234.56defaults
1,234.56-{negativePositiveSignPlacement: 's'}
-$1,234.56{currencySymbol: '$'}
$-1,234.56{currencySymbol: '$', negativePositiveSignPlacement: 'r'}
$1,234.56-{currencySymbol: '$', negativePositiveSignPlacement: 's'}
1,234.56-${currencySymbol: '$', currencySymbolPlacement: 's'}
1,234.56$-{currencySymbol: '$', currencySymbolPlacement: 's', negativePositiveSignPlacement: 'r'}
-1,234.56${currencySymbol: '$', currencySymbolPlacement: 's', negativePositiveSignPlacement: 'p'}
+

suffixText

+

Allows additional text as a suffix +- suffixText: '' (default) no suffix defined +- suffixText: 'test' example: 123,4.56 test +- Numbers and minus sign (-) are not allowed and will cause an error

+

minimumValue

+

controls the minimum value allowed +- minimumValue: '-9999999999999.99' (default) +- Must be set as text +- Can be negative or positive but must be less than 'maximumValue'

+

maximumValue

+

controls the maximum value allowed +- maximumValue: '9999999999999.99' (default) +- Must be set as text +- Can be positive or negative but must be greater than 'minimumValue'

+

Note: setting the minimumValue and maximumValue to both positive or negative with situations that limits the users ability to enter the proper values

+

decimalPlacesOverride

+

Note: This has been deprecated in v4 +overrides the decimal places that that are set via the minimumValue/maximumValue values +- decimalPlacesOverride: null (default method) +- decimalPlacesOverride: '4' overides the default and allows 4 decimal places

+

roundingMethod

+

sets the rounding method used (12 different available - case sensitive)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
optionRounding method
'S'Round-Half-Up Symmetric (default)
'A'Round-Half-Up Asymmetric
's'Round-Half-Down Symmetric (lower case s)
'a'Round-Half-Down Asymmetric (lower case a)
'B'Round-Half-Even "Bankers Rounding"
'U'Round Up "Round-Away-From-Zero"
'D'Round Down "Round-Toward-Zero" - same as truncate
'C'Round to Ceiling "Toward Positive Infinity"
'F'Round to Floor "Toward Negative Infinity"
'N05'Rounding "to the nearest .00 or .05"
'U05'Rounds up to next .00 or .05
'D05'Rounds down to next .00 or .05
+

allowDecimalPadding

+

controls padding of the decimal places +- allowDecimalPadding: true always pads the decimal with zeros (default) +- allowDecimalPadding: false no padding

+

negativeBracketsTypeOnBlur

+

controls if negative values are display with brackets when the input does not have focus +- negativeBracketsTypeOnBlur: null no brackets use for negative values (default) +- negativeBracketsTypeOnBlur: '(,)' +- negativeBracketsTypeOnBlur: '[,]' +- negativeBracketsTypeOnBlur: '{,}' +- negativeBracketsTypeOnBlur: '<,>'

+

emptyInputBehavior

+

controls input currency sign display behavior when the input does not have a value '' +- emptyInputBehavior: 'focus' (default) the currency symbol will be displayed on focus +- emptyInputBehavior: 'press' currency symbol will not be displayed until the first key is pressed +- emptyInputBehavior: 'always' currency symbol is always displayed with or without a value

+

leadingZero

+

controls leading zeros behavior +- leadingZero: 'allow' allows leading zero to be entered. They are removed on focusout event (default) +- leadingZero: 'deny' leading zeros not allowed. +- leadingZero: 'keep' leading zeros allowed and will be retained on the focusout event

+

selectNumberOnly

+

controls the 'alt' & 'a' select key combination +- selectNumberOnly: false (default) selects all characters within the input +- selectNumberOnly: true selects only the numbers +- note: if the currency symbol is between the numeric value and the negative sign only the numeric characters will be selected

+

formatOnPageLoad

+

controls if default values are formatted on page ready (load) +- formatOnPageLoad: true default values are formatted on page ready (default) +- formatOnPageLoad: false default values are NOT formatted on page ready

+

defaultValueOverride

+

helper option for ASP.NET post-back +- should be the value of the un-formatted default value +- this can be set as an option when initializing autoNumeric or as HTML5 data +- examples: +- no default value='' {defaultValueOverride: ''} +- value=1234.56 {defaultValueOverride: '1234.56'}

+

unformatOnSubmit

+

removes the format on the submit event +- unformatOnSubmit: false (default) does not remove the formatting +- unformatOnSubmit: true - removes the formatting on the submit event +- this can be done globally via the extend method or by elemnt via the jQuery selector +- output is always "nnnn.nn" or negative "-nnnn.nn". n = 0-9

+

showWarnings

+

error handling function +- showWarnings: true - (default) throws errors - helpful during developing. +- showWarnings: false - stops most errors from being thrown.

+ + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 73149cb..0000000 --- a/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# AutoNumeric documentation repository - -The official documentation for [AutoNumeric](https://github.com/autoNumeric/autoNumeric/) is stored in this repository. - -This documentation is replacing the previously *huge* readme in the official [AutoNumeric repository](https://github.com/autoNumeric/autoNumeric/), and complete the website [http://autonumeric.org](http://autonumeric.org) where additional tools can be found. - -## Technology - -[Material for Mkdocs](https://squidfunk.github.io/mkdocs-material/) is used to generate a static website from the markdown files. - -## Participate - -If you want to clone this repo and edit the docs, you can do it using the Mkdocs installation methods described [here](https://squidfunk.github.io/mkdocs-material/getting-started/#with-docker). - -## License - -You can check the license of this documentation [here](https://github.com/autoNumeric/autonumeric-docs/blob/main/LICENSE.md). diff --git a/docs/assets/favicon-32x32.png b/assets/favicon-32x32.png similarity index 100% rename from docs/assets/favicon-32x32.png rename to assets/favicon-32x32.png diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000..1cf13b9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.081f42fc.min.js b/assets/javascripts/bundle.081f42fc.min.js new file mode 100644 index 0000000..32734cd --- /dev/null +++ b/assets/javascripts/bundle.081f42fc.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Fi=Object.create;var gr=Object.defineProperty;var ji=Object.getOwnPropertyDescriptor;var Wi=Object.getOwnPropertyNames,Dt=Object.getOwnPropertySymbols,Ui=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty,no=Object.prototype.propertyIsEnumerable;var oo=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))xr.call(t,r)&&oo(e,r,t[r]);if(Dt)for(var r of Dt(t))no.call(t,r)&&oo(e,r,t[r]);return e};var io=(e,t)=>{var r={};for(var o in e)xr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Dt)for(var o of Dt(e))t.indexOf(o)<0&&no.call(e,o)&&(r[o]=e[o]);return r};var yr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Di=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Wi(t))!xr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=ji(t,n))||o.enumerable});return e};var Vt=(e,t,r)=>(r=e!=null?Fi(Ui(e)):{},Di(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var ao=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var co=yr((Er,so)=>{(function(e,t){typeof Er=="object"&&typeof so!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(H){return!!(H&&H!==document&&H.nodeName!=="HTML"&&H.nodeName!=="BODY"&&"classList"in H&&"contains"in H.classList)}function p(H){var mt=H.type,ze=H.tagName;return!!(ze==="INPUT"&&a[mt]&&!H.readOnly||ze==="TEXTAREA"&&!H.readOnly||H.isContentEditable)}function c(H){H.classList.contains("focus-visible")||(H.classList.add("focus-visible"),H.setAttribute("data-focus-visible-added",""))}function l(H){H.hasAttribute("data-focus-visible-added")&&(H.classList.remove("focus-visible"),H.removeAttribute("data-focus-visible-added"))}function f(H){H.metaKey||H.altKey||H.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(H){o=!1}function h(H){s(H.target)&&(o||p(H.target))&&c(H.target)}function w(H){s(H.target)&&(H.target.classList.contains("focus-visible")||H.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(H.target))}function A(H){document.visibilityState==="hidden"&&(n&&(o=!0),te())}function te(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function ie(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(H){H.target.nodeName&&H.target.nodeName.toLowerCase()==="html"||(o=!1,ie())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",A,!0),te(),r.addEventListener("focus",h,!0),r.addEventListener("blur",w,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var Yr=yr((Rt,Kr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Rt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Rt=="object"?Rt.ClipboardJS=r():t.ClipboardJS=r()})(Rt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ii}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(_){return!1}}var h=function(_){var O=f()(_);return u("cut"),O},w=h;function A(V){var _=document.documentElement.getAttribute("dir")==="rtl",O=document.createElement("textarea");O.style.fontSize="12pt",O.style.border="0",O.style.padding="0",O.style.margin="0",O.style.position="absolute",O.style[_?"right":"left"]="-9999px";var j=window.pageYOffset||document.documentElement.scrollTop;return O.style.top="".concat(j,"px"),O.setAttribute("readonly",""),O.value=V,O}var te=function(_,O){var j=A(_);O.container.appendChild(j);var D=f()(j);return u("copy"),j.remove(),D},ie=function(_){var O=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},j="";return typeof _=="string"?j=te(_,O):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?j=te(_.value,O):(j=f()(_),u("copy")),j},J=ie;function H(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(O){return typeof O}:H=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},H(V)}var mt=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},O=_.action,j=O===void 0?"copy":O,D=_.container,Y=_.target,ke=_.text;if(j!=="copy"&&j!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&H(Y)==="object"&&Y.nodeType===1){if(j==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(j==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(ke)return J(ke,{container:D});if(Y)return j==="cut"?w(Y):J(Y,{container:D})},ze=mt;function Ie(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(O){return typeof O}:Ie=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},Ie(V)}function _i(V,_){if(!(V instanceof _))throw new TypeError("Cannot call a class as a function")}function ro(V,_){for(var O=0;O<_.length;O++){var j=_[O];j.enumerable=j.enumerable||!1,j.configurable=!0,"value"in j&&(j.writable=!0),Object.defineProperty(V,j.key,j)}}function Ai(V,_,O){return _&&ro(V.prototype,_),O&&ro(V,O),V}function Ci(V,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");V.prototype=Object.create(_&&_.prototype,{constructor:{value:V,writable:!0,configurable:!0}}),_&&br(V,_)}function br(V,_){return br=Object.setPrototypeOf||function(j,D){return j.__proto__=D,j},br(V,_)}function Hi(V){var _=Pi();return function(){var j=Wt(V),D;if(_){var Y=Wt(this).constructor;D=Reflect.construct(j,arguments,Y)}else D=j.apply(this,arguments);return ki(this,D)}}function ki(V,_){return _&&(Ie(_)==="object"||typeof _=="function")?_:$i(V)}function $i(V){if(V===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return V}function Pi(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(V){return!1}}function Wt(V){return Wt=Object.setPrototypeOf?Object.getPrototypeOf:function(O){return O.__proto__||Object.getPrototypeOf(O)},Wt(V)}function vr(V,_){var O="data-clipboard-".concat(V);if(_.hasAttribute(O))return _.getAttribute(O)}var Ri=function(V){Ci(O,V);var _=Hi(O);function O(j,D){var Y;return _i(this,O),Y=_.call(this),Y.resolveOptions(D),Y.listenClick(j),Y}return Ai(O,[{key:"resolveOptions",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=Ie(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function(ke){return Y.onClick(ke)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,ke=this.action(Y)||"copy",Ut=ze({action:ke,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Ut?"success":"error",{action:ke,text:Ut,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return w(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,ke=!!document.queryCommandSupported;return Y.forEach(function(Ut){ke=ke&&!!document.queryCommandSupported(Ut)}),ke}}]),O}(s()),Ii=Ri},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,h,w){var A=c.apply(this,arguments);return l.addEventListener(u,A,w),{destroy:function(){l.removeEventListener(u,A,w)}}}function p(l,f,u,h,w){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(A){return s(A,f,u,h,w)}))}function c(l,f,u,h){return function(w){w.delegateTarget=a(w.target,f),w.delegateTarget&&h.call(l,w)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,h,w){if(!u&&!h&&!w)throw new Error("Missing required arguments");if(!a.string(h))throw new TypeError("Second argument must be a String");if(!a.fn(w))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,h,w);if(a.nodeList(u))return l(u,h,w);if(a.string(u))return f(u,h,w);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,h,w){return u.addEventListener(h,w),{destroy:function(){u.removeEventListener(h,w)}}}function l(u,h,w){return Array.prototype.forEach.call(u,function(A){A.addEventListener(h,w)}),{destroy:function(){Array.prototype.forEach.call(u,function(A){A.removeEventListener(h,w)})}}}function f(u,h,w){return s(document.body,u,h,w)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var ts=/["'&<>]/;ei.exports=rs;function rs(e){var t=""+e,r=ts.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||s(u,h)})})}function s(u,h){try{p(o[u](h))}catch(w){f(i[0][3],w)}}function p(u){u.value instanceof nt?Promise.resolve(u.value.v).then(c,l):f(i[0][2],u)}function c(u){s("next",u)}function l(u){s("throw",u)}function f(u,h){u(h),i.shift(),i.length&&s(i[0][0],i[0][1])}}function mo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof de=="function"?de(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function k(e){return typeof e=="function"}function ft(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ft(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Fe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=de(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(A){t={error:A}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(A){i=A instanceof zt?A.errors:[A]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=de(f),h=u.next();!h.done;h=u.next()){var w=h.value;try{fo(w)}catch(A){i=i!=null?i:[],A instanceof zt?i=q(q([],N(i)),N(A.errors)):i.push(A)}}}catch(A){o={error:A}}finally{try{h&&!h.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)fo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=Fe.EMPTY;function qt(e){return e instanceof Fe||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function fo(e){k(e)?e():e.unsubscribe()}var $e={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var ut={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Fe(function(){o.currentObservers=null,qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new Eo(r,o)},t}(F);var Eo=function(e){re(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){re(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var Lt={now:function(){return(Lt.delegate||Date).now()},delegate:void 0};var _t=function(e){re(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Lt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(vt);var So=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(gt);var Hr=new So(To);var Oo=function(e){re(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=bt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(bt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(vt);var Mo=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(gt);var me=new Mo(Oo);var M=new F(function(e){return e.complete()});function Yt(e){return e&&k(e.schedule)}function kr(e){return e[e.length-1]}function Xe(e){return k(kr(e))?e.pop():void 0}function He(e){return Yt(kr(e))?e.pop():void 0}function Bt(e,t){return typeof kr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return k(e==null?void 0:e.then)}function Jt(e){return k(e[ht])}function Xt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Gi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Gi();function tr(e){return k(e==null?void 0:e[er])}function rr(e){return lo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return k(e==null?void 0:e.getReader)}function W(e){if(e instanceof F)return e;if(e!=null){if(Jt(e))return Ji(e);if(xt(e))return Xi(e);if(Gt(e))return Zi(e);if(Xt(e))return Lo(e);if(tr(e))return ea(e);if(or(e))return ta(e)}throw Zt(e)}function Ji(e){return new F(function(t){var r=e[ht]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Xi(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?v(function(n,i){return e(n,i,o)}):le,Te(1),r?Be(t):zo(function(){return new ir}))}}function Fr(e){return e<=0?function(){return M}:y(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,h=0,w=!1,A=!1,te=function(){f==null||f.unsubscribe(),f=void 0},ie=function(){te(),l=u=void 0,w=A=!1},J=function(){var H=l;ie(),H==null||H.unsubscribe()};return y(function(H,mt){h++,!A&&!w&&te();var ze=u=u!=null?u:r();mt.add(function(){h--,h===0&&!A&&!w&&(f=Wr(J,p))}),ze.subscribe(mt),!l&&h>0&&(l=new at({next:function(Ie){return ze.next(Ie)},error:function(Ie){A=!0,te(),f=Wr(ie,n,Ie),ze.error(Ie)},complete:function(){w=!0,te(),f=Wr(ie,a),ze.complete()}}),W(H).subscribe(l))})(c)}}function Wr(e,t){for(var r=[],o=2;oe.next(document)),e}function $(e,t=document){return Array.from(t.querySelectorAll(e))}function P(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Re(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var xa=S(d(document.body,"focusin"),d(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Re()||document.body),B(1));function et(e){return xa.pipe(m(t=>e.contains(t)),K())}function kt(e,t){return C(()=>S(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Me(+!r*t)):le,Q(e.matches(":hover"))))}function Bo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Bo(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Bo(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function wt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),S(d(t,"load"),d(t,"error").pipe(b(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),L(()=>document.head.removeChild(t)),Te(1))))}var Go=new g,ya=C(()=>typeof ResizeObserver=="undefined"?wt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Go.next(t)))),b(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),B(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return ya.pipe(E(r=>r.observe(t)),b(r=>Go.pipe(v(o=>o.target===t),L(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function Tt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Jo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ue(e){return{x:e.offsetLeft,y:e.offsetTop}}function Xo(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function Zo(e){return S(d(window,"load"),d(window,"resize")).pipe(Le(0,me),m(()=>Ue(e)),Q(Ue(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function De(e){return S(d(e,"scroll"),d(window,"scroll"),d(window,"resize")).pipe(Le(0,me),m(()=>pr(e)),Q(pr(e)))}var en=new g,Ea=C(()=>I(new IntersectionObserver(e=>{for(let t of e)en.next(t)},{threshold:0}))).pipe(b(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),B(1));function tt(e){return Ea.pipe(E(t=>t.observe(e)),b(t=>en.pipe(v(({target:r})=>r===e),L(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function tn(e,t=16){return De(e).pipe(m(({y:r})=>{let o=ce(e),n=Tt(e);return r>=n.height-o.height-t}),K())}var lr={drawer:P("[data-md-toggle=drawer]"),search:P("[data-md-toggle=search]")};function rn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function Ve(e){let t=lr[e];return d(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function wa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ta(){return S(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function on(){let e=d(window,"keydown").pipe(v(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:rn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),v(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!wa(o,r)}return!0}),pe());return Ta().pipe(b(t=>t?M:e))}function xe(){return new URL(location.href)}function pt(e,t=!1){if(G("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function nn(){return new g}function an(){return location.hash.slice(1)}function sn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Sa(e){return S(d(window,"hashchange"),e).pipe(m(an),Q(an()),v(t=>t.length>0),B(1))}function cn(e){return Sa(e).pipe(m(t=>fe(`[id="${t}"]`)),v(t=>typeof t!="undefined"))}function $t(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function pn(){let e=matchMedia("print");return S(d(window,"beforeprint").pipe(m(()=>!0)),d(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(b(r=>r?t():M))}function zr(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function Ne(e,t){return zr(e,t).pipe(b(r=>r.text()),m(r=>JSON.parse(r)),B(1))}function ln(e,t){let r=new DOMParser;return zr(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),B(1))}function mn(e,t){let r=new DOMParser;return zr(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),B(1))}function fn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function un(){return S(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(fn),Q(fn()))}function dn(){return{width:innerWidth,height:innerHeight}}function hn(){return d(window,"resize",{passive:!0}).pipe(m(dn),Q(dn()))}function bn(){return z([un(),hn()]).pipe(m(([e,t])=>({offset:e,size:t})),B(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(Z("size")),n=z([o,r]).pipe(m(()=>Ue(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function Oa(e){return d(e,"message",t=>t.data)}function Ma(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function vn(e,t=new Worker(e)){let r=Oa(t),o=Ma(t),n=new g;n.subscribe(o);let i=o.pipe(X(),ne(!0));return n.pipe(X(),Pe(r.pipe(U(i))),pe())}var La=P("#__config"),St=JSON.parse(La.textContent);St.base=`${new URL(St.base,xe())}`;function ye(){return St}function G(e){return St.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?St.translations[e].replace("#",t.toString()):St.translations[e]}function Se(e,t=document){return P(`[data-md-component=${e}]`,t)}function ae(e,t=document){return $(`[data-md-component=${e}]`,t)}function _a(e){let t=P(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>P(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function gn(e){if(!G("announce.dismiss")||!e.childElementCount)return M;if(!e.hidden){let t=P(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),_a(e).pipe(E(r=>t.next(r)),L(()=>t.complete()),m(r=>R({ref:e},r)))})}function Aa(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function xn(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Aa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))}function Pt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function yn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function En(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function wn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,c)," "],[]).slice(0,-1),i=ye(),a=new URL(e.location,i.base);G("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=ye();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)}),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Tn(e){let t=e[0].score,r=[...e],o=ye(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreqr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function Sn(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Qr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function On(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Ca(e){var o;let t=ye(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Mn(e,t){var o;let r=ye();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Ca)))}var Ha=0;function ka(e){let t=z([et(e),kt(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Jo(e)).pipe(oe(De),ct(1),m(()=>Xo(e)));return t.pipe(Ae(o=>o),b(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function $a(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ha++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(X(),ne(!1)).subscribe(a);let s=a.pipe(Ht(c=>Me(+!c*250,Hr)),K(),b(c=>c?r:M),E(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(b(c=>kt(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(v(c=>c),ee(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),h=u.width/2;if(l.role==="tooltip")return{x:h,y:8+u.height};if(u.y>=f.height/2){let{height:w}=ce(l);return{x:h,y:-16-w}}else return{x:h,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(v(c=>c),ee(s,(c,l)=>l),v(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(P(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),be(me),ee(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(v(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(v(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),ka(e).pipe(E(c=>i.next(c)),L(()=>i.complete()),m(c=>R({ref:e},c)))})}function lt(e,{viewport$:t},r=document.body){return $a(e,{content$:new F(o=>{let n=e.title,i=yn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Pa(e,t){let r=C(()=>z([Zo(e),De(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(b(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function Ln(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(U(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),S(i.pipe(v(({active:s})=>s)),i.pipe(_e(250),v(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Le(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(ct(125,me),v(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),d(n,"click").pipe(U(a),v(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),d(n,"mousedown").pipe(U(a),ee(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Re())==null||c.blur()}}),r.pipe(U(a),v(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Pa(e,t).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function Ra(e){return e.tagName==="CODE"?$(".c, .c1, .cm",e):[e]}function Ia(e){let t=[];for(let r of Ra(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function _n(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Ia(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,En(p,i)),s.replaceWith(a.get(p)))}return a.size===0?M:C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=[];for(let[l,f]of a)c.push([P(".md-typeset",f),P(`:scope > li:nth-child(${l})`,e)]);return o.pipe(U(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?_n(f,u):_n(u,f)}),S(...[...a].map(([,l])=>Ln(l,t,{target$:r}))).pipe(L(()=>s.complete()),pe())})}function An(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return An(t)}}function Cn(e,t){return C(()=>{let r=An(e);return typeof r!="undefined"?fr(r,e,t):M})}var Hn=Vt(Yr());var Fa=0;function kn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return kn(t)}}function ja(e){return ge(e).pipe(m(({width:t})=>({scrollable:Tt(e).width>t})),Z("scrollable"))}function $n(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(Fr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Hn.default.isSupported()&&(e.closest(".copy")||G("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Fa++}`;let l=wn(c.id);c.insertBefore(l,e),G("content.tooltips")&&a.push(lt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=kn(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||G("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(U(i),m(({width:f,height:u})=>f&&u),K(),b(f=>f?l:M)))}}return $(":scope > span[id]",e).length&&e.classList.add("md-code__content"),ja(e).pipe(E(c=>n.next(c)),L(()=>n.complete()),m(c=>R({ref:e},c)),Pe(...a))});return G("content.lazy")?tt(e).pipe(v(n=>n),Te(1),b(()=>o)):o}function Wa(e,{target$:t,print$:r}){let o=!0;return S(t.pipe(m(n=>n.closest("details:not([open])")),v(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(v(n=>n||!o),E(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Pn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Wa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}var Rn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Br,Da=0;function Va(){return typeof mermaid=="undefined"||mermaid instanceof Element?wt("https://unpkg.com/mermaid@10/dist/mermaid.min.js"):I(void 0)}function In(e){return e.classList.remove("mermaid"),Br||(Br=Va().pipe(E(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Rn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),B(1))),Br.subscribe(()=>ao(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Da++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Br.pipe(m(()=>({ref:e})))}var Fn=x("table");function jn(e){return e.replaceWith(Fn),Fn.replaceWith(On(e)),I({ref:e})}function Na(e){let t=e.find(r=>r.checked)||e[0];return S(...e.map(r=>d(r,"change").pipe(m(()=>P(`label[for="${r.id}"]`))))).pipe(Q(P(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Wn(e,{viewport$:t,target$:r}){let o=P(".tabbed-labels",e),n=$(":scope > input",e),i=Qr("prev");e.append(i);let a=Qr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(X(),ne(!0));z([s,ge(e)]).pipe(U(p),Le(1,me)).subscribe({next([{active:c},l]){let f=Ue(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let h=pr(o);(f.xh.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([De(o),ge(o)]).pipe(U(p)).subscribe(([c,l])=>{let f=Tt(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),S(d(i,"click").pipe(m(()=>-1)),d(a,"click").pipe(m(()=>1))).pipe(U(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(U(p),v(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=P(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),d(l.firstElementChild,"click").pipe(U(p),v(f=>!(f.metaKey||f.ctrlKey)),E(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return G("content.tabs.link")&&s.pipe(Ce(1),ee(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let w of $("[data-tabs]"))for(let A of $(":scope > input",w)){let te=P(`label[for="${A.id}"]`);if(te!==c&&te.innerText.trim()===f){te.setAttribute("data-md-switching",""),A.click();break}}window.scrollTo({top:e.offsetTop-u});let h=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...h])])}}),s.pipe(U(p)).subscribe(()=>{for(let c of $("audio, video",e))c.pause()}),tt(e).pipe(b(()=>Na(n)),E(c=>s.next(c)),L(()=>s.complete()),m(c=>R({ref:e},c)))}).pipe(Qe(se))}function Un(e,{viewport$:t,target$:r,print$:o}){return S(...$(".annotate:not(.highlight)",e).map(n=>Cn(n,{target$:r,print$:o})),...$("pre:not(.mermaid) > code",e).map(n=>$n(n,{target$:r,print$:o})),...$("pre.mermaid",e).map(n=>In(n)),...$("table:not([class])",e).map(n=>jn(n)),...$("details",e).map(n=>Pn(n,{target$:r,print$:o})),...$("[data-tabs]",e).map(n=>Wn(n,{viewport$:t,target$:r})),...$("[title]",e).filter(()=>G("content.tooltips")).map(n=>lt(n,{viewport$:t})))}function za(e,{alert$:t}){return t.pipe(b(r=>S(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function Dn(e,t){let r=P(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),za(e,t).pipe(E(n=>o.next(n)),L(()=>o.complete()),m(n=>R({ref:e},n)))})}var qa=0;function Qa(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?De(o):I({x:0,y:0}),i=S(et(t),kt(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ue(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function Vn(e){let t=e.title;if(!t.length)return M;let r=`__tooltip_${qa++}`,o=Pt(r,"inline"),n=P(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),S(i.pipe(v(({active:a})=>a)),i.pipe(_e(250),v(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Le(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(ct(125,me),v(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Qa(o,e).pipe(E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))}).pipe(Qe(se))}function Ka({viewport$:e}){if(!G("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Ye(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=Ve("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),b(n=>n?r:I(!1)),Q(!1))}function Nn(e,t){return C(()=>z([ge(e),Ka(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),B(1))}function zn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(X(),ne(!0));o.pipe(Z("active"),We(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue($("[title]",e)).pipe(v(()=>G("content.tooltips")),oe(a=>Vn(a)));return r.subscribe(o),t.pipe(U(n),m(a=>R({ref:e},a)),Pe(i.pipe(U(n))))})}function Ya(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),Z("active"))}function qn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?M:Ya(o,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))})}function Qn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(b(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),Z("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Ba(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(oe(o=>d(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),B(1))}function Kn(e){let t=$("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=$t("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),ee(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(be(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Ba(t).pipe(U(n.pipe(Ce(1))),st(),E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))})}function Yn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(E(o=>r.next({value:o})),L(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Gr=Vt(Yr());function Ga(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Bn({alert$:e}){Gr.default.isSupported()&&new F(t=>{new Gr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ga(P(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(E(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function Gn(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function Ja(e,t){let r=new Map;for(let o of $("url",e)){let n=P("loc",o),i=[Gn(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of $("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(Gn(new URL(s),t))}}return r}function ur(e){return mn(new URL("sitemap.xml",e)).pipe(m(t=>Ja(t,new URL(e))),ve(()=>I(new Map)))}function Xa(e,t){if(!(e.target instanceof Element))return M;let r=e.target.closest("a");if(r===null)return M;if(r.target||e.metaKey||e.ctrlKey)return M;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):M}function Jn(e){let t=new Map;for(let r of $(":scope > *",e.head))t.set(r.outerHTML,r);return t}function Xn(e){for(let t of $("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function Za(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...G("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=Jn(document);for(let[o,n]of Jn(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return je($("script",r)).pipe(b(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),M}),X(),ne(document))}function Zn({location$:e,viewport$:t,progress$:r}){let o=ye();if(location.protocol==="file:")return M;let n=ur(o.base);I(document).subscribe(Xn);let i=d(document.body,"click").pipe(We(n),b(([p,c])=>Xa(p,c)),pe()),a=d(window,"popstate").pipe(m(xe),pe());i.pipe(ee(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),S(i,a).subscribe(e);let s=e.pipe(Z("pathname"),b(p=>ln(p,{progress$:r}).pipe(ve(()=>(pt(p,!0),M)))),b(Xn),b(Za),pe());return S(s.pipe(ee(e,(p,c)=>c)),s.pipe(b(()=>e),Z("pathname"),b(()=>e),Z("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),b(()=>i),E(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",sn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),d(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(Z("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var ri=Vt(ti());function oi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ri.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function It(e){return e.type===1}function dr(e){return e.type===3}function ni(e,t){let r=vn(e);return S(I(location.protocol!=="file:"),Ve("search")).pipe(Ae(o=>o),b(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:G("search.suggest")}}})),r}function ii({document$:e}){let t=ye(),r=Ne(new URL("../versions.json",t.base)).pipe(ve(()=>M)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),b(n=>d(document.body,"click").pipe(v(i=>!i.metaKey&&!i.ctrlKey),ee(o),b(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?M:(i.preventDefault(),I(p))}}return M}),b(i=>ur(new URL(i)).pipe(m(a=>{let p=xe().href.replace(t.base,i);return a.has(p.split("#")[0])?new URL(p):new URL(i)})))))).subscribe(n=>pt(n,!0)),z([r,o]).subscribe(([n,i])=>{P(".md-header__topic").appendChild(Mn(n,i))}),e.pipe(b(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function ns(e,{worker$:t}){let{searchParams:r}=xe();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),Ve("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=xe();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=S(t.pipe(Ae(It)),d(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),B(1))}function ai(e,{worker$:t}){let r=new g,o=r.pipe(X(),ne(!0));z([t.pipe(Ae(It)),r],(i,a)=>a).pipe(Z("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(Z("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),d(e.form,"reset").pipe(U(o)).subscribe(()=>e.focus());let n=P("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),ns(e,{worker$:t}).pipe(E(i=>r.next(i)),L(()=>r.complete()),m(i=>R({ref:e},i)),B(1))}function si(e,{worker$:t,query$:r}){let o=new g,n=tn(e.parentElement).pipe(v(Boolean)),i=e.parentElement,a=P(":scope > :first-child",e),s=P(":scope > :last-child",e);Ve("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ee(r),Ur(t.pipe(Ae(It)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(E(()=>s.innerHTML=""),b(({items:l})=>S(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Ye(4),Vr(n),b(([f])=>f)))),m(Tn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(oe(l=>{let f=fe("details",l);return typeof f=="undefined"?M:d(f,"toggle").pipe(U(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(v(dr),m(({data:l})=>l)).pipe(E(l=>o.next(l)),L(()=>o.complete()),m(l=>R({ref:e},l)))}function is(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=xe();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function ci(e,t){let r=new g,o=r.pipe(X(),ne(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),d(e,"click").pipe(U(o)).subscribe(n=>n.preventDefault()),is(e,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))}function pi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=S(d(n,"keydown"),d(n,"focus")).pipe(be(se),m(()=>n.value),K());return o.pipe(We(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(v(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(v(dr),m(({data:s})=>s)).pipe(E(s=>o.next(s)),L(()=>o.complete()),m(()=>({ref:e})))}function li(e,{index$:t,keyboard$:r}){let o=ye();try{let n=ni(o.search,t),i=Se("search-query",e),a=Se("search-result",e);d(e,"click").pipe(v(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(v(({mode:p})=>p==="search")).subscribe(p=>{let c=Re();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of $(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,h])=>h-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...$(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Re()&&i.focus()}}),r.pipe(v(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=ai(i,{worker$:n});return S(s,si(a,{worker$:n,query$:s})).pipe(Pe(...ae("search-share",e).map(p=>ci(p,{query$:s})),...ae("search-suggest",e).map(p=>pi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ke}}function mi(e,{index$:t,location$:r}){return z([t,r.pipe(Q(xe()),v(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>oi(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function as(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Jr(e,o){var n=o,{header$:t}=n,r=io(n,["header$"]);let i=P(".md-sidebar__scrollwrap",e),{y:a}=Ue(i);return C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=s.pipe(Le(0,me));return c.pipe(ee(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of $(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2})}}}),ue($("label[tabindex]",e)).pipe(oe(l=>d(l,"click").pipe(be(se),m(()=>l),U(p)))).subscribe(l=>{let f=P(`[id="${l.htmlFor}"]`);P(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),as(e,r).pipe(E(l=>s.next(l)),L(()=>s.complete()),m(l=>R({ref:e},l)))})}function fi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Ct(Ne(`${r}/releases/latest`).pipe(ve(()=>M),m(o=>({version:o.tag_name})),Be({})),Ne(r).pipe(ve(()=>M),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Be({}))).pipe(m(([o,n])=>R(R({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ne(r).pipe(m(o=>({repositories:o.public_repos})),Be({}))}}function ui(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ne(r).pipe(ve(()=>M),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Be({}))}function di(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return fi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ui(r,o)}return M}var ss;function cs(e){return ss||(ss=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return M}return di(e.href).pipe(E(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>M),v(t=>Object.keys(t).length>0),m(t=>({facts:t})),B(1)))}function hi(e){let t=P(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(Sn(o)),t.classList.add("md-source__repository--active")}),cs(e).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ps(e,{viewport$:t,header$:r}){return ge(document.body).pipe(b(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),Z("hidden"))}function bi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(G("navigation.tabs.sticky")?I({hidden:!1}):ps(e,t)).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ls(e,{viewport$:t,header$:r}){let o=new Map,n=$(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(Z("height"),m(({height:s})=>{let p=Se("main"),c=P(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(Z("height"),b(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let h=f.offsetParent;for(;h;h=h.offsetParent)u+=h.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),We(i),b(([p,c])=>t.pipe(jr(([l,f],{offset:{y:u},size:h})=>{let w=u+h.height>=Math.floor(s.height);for(;f.length;){let[,A]=f[0];if(A-c=u&&!w)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Ye(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(X(),ne(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),G("toc.follow")){let s=S(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(v(({prev:p})=>p.length>0),We(o.pipe(be(se))),ee(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2,behavior:c})}}})}return G("navigation.tracking")&&t.pipe(U(a),Z("offset"),_e(250),Ce(1),U(n.pipe(Ce(1))),st({delay:250}),ee(i)).subscribe(([,{prev:s}])=>{let p=xe(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),ls(e,{viewport$:t,header$:r}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function ms(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Ye(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),U(o.pipe(Ce(1))),ne(!0),st({delay:250}),m(a=>({hidden:a})))}function gi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(U(a),Z("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),d(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),ms(e,{viewport$:t,main$:o,target$:n}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))}function xi({document$:e,viewport$:t}){e.pipe(b(()=>$(".md-ellipsis")),oe(r=>tt(r).pipe(U(e.pipe(Ce(1))),v(o=>o),m(()=>r),Te(1))),v(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,lt(n,{viewport$:t}).pipe(U(e.pipe(Ce(1))),L(()=>n.removeAttribute("title")))})).subscribe(),e.pipe(b(()=>$(".md-status")),oe(r=>lt(r,{viewport$:t}))).subscribe()}function yi({document$:e,tablet$:t}){e.pipe(b(()=>$(".md-toggle--indeterminate")),E(r=>{r.indeterminate=!0,r.checked=!1}),oe(r=>d(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ee(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function fs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ei({document$:e}){e.pipe(b(()=>$("[data-md-scrollfix]")),E(t=>t.removeAttribute("data-md-scrollfix")),v(fs),oe(t=>d(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function wi({viewport$:e,tablet$:t}){z([Ve("search"),t]).pipe(m(([r,o])=>r&&!o),b(r=>I(r).pipe(Ge(r?400:100))),ee(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function us(){return location.protocol==="file:"?wt(`${new URL("search/search_index.js",Xr.base)}`).pipe(m(()=>__index),B(1)):Ne(new URL("search/search_index.json",Xr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Yo(),jt=nn(),Ot=cn(jt),Zr=on(),Oe=bn(),hr=$t("(min-width: 960px)"),Si=$t("(min-width: 1220px)"),Oi=pn(),Xr=ye(),Mi=document.forms.namedItem("search")?us():Ke,eo=new g;Bn({alert$:eo});var to=new g;G("navigation.instant")&&Zn({location$:jt,viewport$:Oe,progress$:to}).subscribe(ot);var Ti;((Ti=Xr.version)==null?void 0:Ti.provider)==="mike"&&ii({document$:ot});S(jt,Ot).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});Zr.pipe(v(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&&pt(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&&pt(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});xi({viewport$:Oe,document$:ot});yi({document$:ot,tablet$:hr});Ei({document$:ot});wi({viewport$:Oe,tablet$:hr});var rt=Nn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),b(e=>Qn(e,{viewport$:Oe,header$:rt})),B(1)),ds=S(...ae("consent").map(e=>xn(e,{target$:Ot})),...ae("dialog").map(e=>Dn(e,{alert$:eo})),...ae("header").map(e=>zn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("palette").map(e=>Kn(e)),...ae("progress").map(e=>Yn(e,{progress$:to})),...ae("search").map(e=>li(e,{index$:Mi,keyboard$:Zr})),...ae("source").map(e=>hi(e))),hs=C(()=>S(...ae("announce").map(e=>gn(e)),...ae("content").map(e=>Un(e,{viewport$:Oe,target$:Ot,print$:Oi})),...ae("content").map(e=>G("search.highlight")?mi(e,{index$:Mi,location$:jt}):M),...ae("header-title").map(e=>qn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Si,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>bi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>vi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})),...ae("top").map(e=>gi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})))),Li=ot.pipe(b(()=>hs),Pe(ds),B(1));Li.subscribe();window.document$=ot;window.location$=jt;window.target$=Ot;window.keyboard$=Zr;window.viewport$=Oe;window.tablet$=hr;window.screen$=Si;window.print$=Oi;window.alert$=eo;window.progress$=to;window.component$=Li;})(); +//# sourceMappingURL=bundle.081f42fc.min.js.map + diff --git a/assets/javascripts/bundle.081f42fc.min.js.map b/assets/javascripts/bundle.081f42fc.min.js.map new file mode 100644 index 0000000..e055db5 --- /dev/null +++ b/assets/javascripts/bundle.081f42fc.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an