├── .github └── workflows │ └── render-specs.yml ├── .gitignore ├── Contributing.md ├── EditingTheSpec.md ├── LICENSE.md ├── README.md ├── SOURCE_CODE.md ├── assets ├── compiled │ ├── body.js │ ├── head.css │ ├── head.js │ └── refs.json ├── css │ ├── chart.css │ ├── custom-elements.css │ ├── index.css │ └── prism.css ├── icons.svg └── js │ ├── chart.js │ ├── custom-elements.js │ ├── font-awesome.js │ ├── index.js │ ├── mermaid.js │ ├── popper.js │ ├── prism.js │ ├── tippy.js │ └── utils.js ├── custom-assets ├── custom-body.js ├── custom-head.js ├── custom.css └── module-test.js ├── docs └── fonts │ ├── KaTeX_AMS-Regular.ttf │ ├── KaTeX_AMS-Regular.woff │ ├── KaTeX_AMS-Regular.woff2 │ ├── KaTeX_Caligraphic-Bold.ttf │ ├── KaTeX_Caligraphic-Bold.woff │ ├── KaTeX_Caligraphic-Bold.woff2 │ ├── KaTeX_Caligraphic-Regular.ttf │ ├── KaTeX_Caligraphic-Regular.woff │ ├── KaTeX_Caligraphic-Regular.woff2 │ ├── KaTeX_Fraktur-Bold.ttf │ ├── KaTeX_Fraktur-Bold.woff │ ├── KaTeX_Fraktur-Bold.woff2 │ ├── KaTeX_Fraktur-Regular.ttf │ ├── KaTeX_Fraktur-Regular.woff │ ├── KaTeX_Fraktur-Regular.woff2 │ ├── KaTeX_Main-Bold.ttf │ ├── KaTeX_Main-Bold.woff │ ├── KaTeX_Main-Bold.woff2 │ ├── KaTeX_Main-BoldItalic.ttf │ ├── KaTeX_Main-BoldItalic.woff │ ├── KaTeX_Main-BoldItalic.woff2 │ ├── KaTeX_Main-Italic.ttf │ ├── KaTeX_Main-Italic.woff │ ├── KaTeX_Main-Italic.woff2 │ ├── KaTeX_Main-Regular.ttf │ ├── KaTeX_Main-Regular.woff │ ├── KaTeX_Main-Regular.woff2 │ ├── KaTeX_Math-BoldItalic.ttf │ ├── KaTeX_Math-BoldItalic.woff │ ├── KaTeX_Math-BoldItalic.woff2 │ ├── KaTeX_Math-Italic.ttf │ ├── KaTeX_Math-Italic.woff │ ├── KaTeX_Math-Italic.woff2 │ ├── KaTeX_SansSerif-Bold.ttf │ ├── KaTeX_SansSerif-Bold.woff │ ├── KaTeX_SansSerif-Bold.woff2 │ ├── KaTeX_SansSerif-Italic.ttf │ ├── KaTeX_SansSerif-Italic.woff │ ├── KaTeX_SansSerif-Italic.woff2 │ ├── KaTeX_SansSerif-Regular.ttf │ ├── KaTeX_SansSerif-Regular.woff │ ├── KaTeX_SansSerif-Regular.woff2 │ ├── KaTeX_Script-Regular.ttf │ ├── KaTeX_Script-Regular.woff │ ├── KaTeX_Script-Regular.woff2 │ ├── KaTeX_Size1-Regular.ttf │ ├── KaTeX_Size1-Regular.woff │ ├── KaTeX_Size1-Regular.woff2 │ ├── KaTeX_Size2-Regular.ttf │ ├── KaTeX_Size2-Regular.woff │ ├── KaTeX_Size2-Regular.woff2 │ ├── KaTeX_Size3-Regular.ttf │ ├── KaTeX_Size3-Regular.woff │ ├── KaTeX_Size3-Regular.woff2 │ ├── KaTeX_Size4-Regular.ttf │ ├── KaTeX_Size4-Regular.woff │ ├── KaTeX_Size4-Regular.woff2 │ ├── KaTeX_Typewriter-Regular.ttf │ ├── KaTeX_Typewriter-Regular.woff │ └── KaTeX_Typewriter-Regular.woff2 ├── gulpfile.js ├── images ├── AuthenticatableMessage.png ├── AutonomicIdentifierBindingTetrad.png ├── AutonomicIssuanceTetrad.png ├── ControllerAppAgentDirectExchange.png ├── ControllerAppAgentSplitFunctions.png ├── ControllerAppAgentWitnessWatcherIndirectExchange.png ├── ControllerApplicationFunctions.png ├── Ecosystem.png ├── End2EndNetwork.png ├── ExploitDead.png ├── ExploitLive.png ├── PrefixAddressMultisigDerivation.png ├── SelfCertIssuanceTriad.png └── SelfCertifyingIdentifierBindingTriad.png ├── index.js ├── package-lock.json ├── package.json ├── spec └── spec.md ├── specs.json └── src ├── asset-map.json └── markdown-it-extensions.js /.github/workflows/render-specs.yml: -------------------------------------------------------------------------------- 1 | 2 | name: spec-up-render 3 | 4 | on: 5 | push: 6 | branches: 7 | - revised-format 8 | 9 | jobs: 10 | build-and-deploy-spec: 11 | runs-on: ubuntu-latest 12 | permissions: 13 | contents: write 14 | steps: 15 | - name: Checkout 🛎️ 16 | uses: actions/checkout@v2 # If you're using actions/checkout@v2 you must set persist-credentials to false in most cases for the deployment to work correctly. 17 | with: 18 | persist-credentials: false 19 | 20 | - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built. 21 | run: | 22 | npm install 23 | node -e "require('./index')({ nowatch: true })" 24 | rm -rf node_modules 25 | 26 | - name: Deploy 27 | uses: peaceiris/actions-gh-pages@v3.7.3 28 | with: 29 | github_token: ${{ secrets.GITHUB_TOKEN }} 30 | publish_dir: ./docs/ 31 | allow_empty_commit: true 32 | force_orphan: true 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | /*-[0-9][0-9].xml 3 | archive.json 4 | draft-ssmith-keri.xml 5 | Gemfile.lock 6 | /.gems/ 7 | *.html 8 | /lib 9 | /node_modules/ 10 | package-lock.json 11 | *.pdf 12 | *.redxml 13 | /.refcache 14 | report.xml 15 | *.swp 16 | .tags 17 | /.targets.mk 18 | *.txt 19 | *.upload 20 | /.venv/ 21 | /versioned/ 22 | /.vscode/ 23 | !requirements.txt 24 | .DS_Store 25 | .idea 26 | venv/ 27 | /.vs 28 | -------------------------------------------------------------------------------- /Contributing.md: -------------------------------------------------------------------------------- 1 | OWF Contributor License Agreement 1.0 - Copyright and Patent 2 | Open Web Foundation 3 | 4 | Contributor License Agreement (CLA 1.0) 5 | (Patent and Copyright Grants) 6 | 7 | 8 | 1. The Purpose of this Contributor License Agreement. This CLA sets forth the terms under which I will participate in and contribute to the development of the Specification. Capitalized terms are defined in the CLA’s last section. 9 | 10 | 2. Copyrights. 11 | 12 | 2.1. Copyright Grant. I grant to you a perpetual (for the duration of the applicable copyright), worldwide, non-exclusive, no-charge, royalty-free, copyright license, without any obligation for accounting to me, to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, distribute, and implement any Contribution to the full extent of my copyright interest in the Contribution. 13 | 14 | 2.2. Attribution. As a condition of the copyright grant, you must include an attribution to the Specification in any derivative work you make based on the Specification. That attribution must include, at minimum, the Specification name and version number. 15 | 16 | 3. Patents. 17 | 18 | 3.1. Patent Non-Assert. 19 | 20 | 3.1.1. The Promise. I, on behalf of myself and my successors in interest and assigns, irrevocably promise not to assert my Granted Claims against you for your Permitted Uses, subject to the terms and conditions of Section 3.1. This is a personal promise directly from me to you, and you acknowledge as a condition of benefiting from it that no rights from me are received from suppliers, distributors, or otherwise in connection with this promise. This promise also applies to your Permitted Uses of any other specifications incorporating all required portions of the Specification. 21 | 22 | 3.1.2. Termination. 23 | 24 | 3.1.2.1. As a Result of Claims by You. All rights, grants, and promises made by me to you under this CLA are terminated if you file, maintain, or voluntarily participate in a lawsuit against me or any person or entity asserting that its Permitted Uses infringe any Granted Claims you would have had the right to enforce had you signed this CLA, unless that suit was in response to a corresponding suit first brought against you. 25 | 26 | 3.1.2.2. As a Result of Claims by a Related Entity of Mine. If a Related Entity of mine files, maintains, or voluntarily participates in a lawsuit asserting that a Permitted Use infringes any Granted Claims it would have had the right to enforce had it signed this CLA, then I relinquish any rights, grants, and promises I have received for the Specification from other signatories of this CLA, unless a) my promise to you was terminated pursuant to section 3.1.2.1, or b) that suit was in response to a corresponding suit first brought by you against the Related Entity. 27 | 28 | 3.1.3. Additional Conditions. This promise is not an assurance (i) that any of my copyrights or issued patent claims cover an implementation of the Specification or are enforceable or (ii) that an implementation of the Specification would not infringe intellectual property rights of any third party. Notwithstanding the personal nature of my promise, this promise is intended to be binding on any future owner, assignee or exclusive licensee who has been given the right to enforce any Granted Claims against third parties. 29 | 30 | 3.1.4. Bankruptcy. Solely for purposes of Section 365(n) of Title 11, United States Bankruptcy Code and any equivalent law in any foreign jurisdiction, this promise will be treated as if it were a license and you may elect to retain your rights under this promise if I (or any owner of any patents or patent applications referenced herein), as a debtor in possession, or a bankruptcy trustee, reject this non-assert. 31 | 32 | 3.2. Patent License Commitment. In addition to rights granted in 3.1, on behalf of me and my successors in interest and assigns, I agree to grant to you a no charge, royalty free license to my Granted Claims on reasonable and non-discriminatory terms, where such license applies only to those Granted Claims infringed by the implementation of my Contribution(s) alone or by combination of my Contribution(s) with the Specification, solely for your Permitted Uses. 33 | 34 | 4. No Other Rights. Except as specifically set forth in this CLA, no other express or implied patent, trademark, copyright, or other property rights are granted under this CLA, including by implication, waiver, or estoppel. 35 | 36 | 5. Limited Opt-Out. I may withdraw my Contribution by providing written notice of that withdrawal within 45 days of submitting that Contribution. Notice of a Contribution withdrawal must be made, at minimum, in writing using the same communication mechanisms that were used to submit the corresponding Contribution and must include the exact material being withdrawn. Upon providing such valid notice, any obligations I incurred under this CLA for that particular identified Contribution will be null and void. 37 | 38 | 6. Open Web Foundation Agreement ("OWFa") version 1.0 Execution. I acknowledge that the goal of this CLA is to develop a specification that will be subject to the OWFa version 1.0. While I have no legal obligation to execute the OWFa version 1.0 for any version of the specification being developed under this CLA, I agree that the selection and terms of the OWFa version 1.0 will not be subject to negotiation. 39 | 40 | 7. Antitrust Compliance. I acknowledge that I may compete with other participants, that I am under no obligation to implement the Specification, that each participant is free to develop competing technologies and standards, and that each party is free to license its patent rights to third parties, including for the purpose of enabling competing technologies and standards. 41 | 42 | 8. Non-Circumvention. I agree that I will not intentionally take or willfully assist any third party to take any action for the purpose of circumventing my obligations under this CLA. 43 | 44 | 9. Representations, Warranties and Disclaimers. I represent and warrant that 1) I am legally entitled to grant the rights and promises set forth in this CLA and 2) I will not intentionally include any third party materials in any Contribution unless those materials are available under terms that do not conflict with this CLA. IN ALL OTHER RESPECTS MY CONTRIBUTIONS ARE PROVIDED "AS IS." The entire risk as to implementing or otherwise using the Contribution or the Specification is assumed by the implementer and user. Except as stated herein, I expressly disclaim any warranties (express, implied, or otherwise), including implied warranties of merchantability, non-infringement, fitness for a particular purpose, or title, related to the Contribution or the Specification. IN NO EVENT WILL ANY PARTY BE LIABLE TO ANY OTHER PARTY FOR LOST PROFITS OR ANY FORM OF INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER FROM ANY CAUSES OF ACTION OF ANY KIND WITH RESPECT TO THIS CLA, WHETHER BASED ON BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, AND WHETHER OR NOT THE OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. All of my obligations under Section 3 regarding the transfer, successors in interest, or assignment of Granted Claims will be satisfied if I notify the transferee or assignee of any patent that I know contains Granted Claims of the obligations under Section 3. Nothing in this CLA requires me to undertake a patent search. 45 | 46 | 10. Definitions. 47 | 48 | 10.1. Bound Entities. “Bound Entities” means the entity listed below and any entities that the Bound Entity Controls. 49 | 50 | 10.2. CLA. “CLA” means this document, which sets forth the rights, grants, promises, limitations, conditions, obligations, and disclaimers made available for my Contributions to the particular Specification. 51 | 52 | 10.3. Contribution. “Contribution” means any original work of authorship, including any modifications or additions to an existing work, that I intentionally submit for inclusion in the Specification, which is included in the Specification. For the purposes of this definition, “submit” means any form of electronic, oral, or written communication for the purpose of discussing and improving the Specification, but excluding communication that I conspicuously designate in writing as not a contribution. 53 | 54 | 10.4. Control. “Control” means direct or indirect control of more than 50% of the voting power to elect directors of that corporation, or for any other entity, the power to direct management of such entity. 55 | 56 | 10.5. Granted Claims. "Granted Claims" are those patent claims that I own or control, including those patent claims I acquire or control after the Date below, that are infringed by Permitted Uses. Granted Claims include only those patent claims that are infringed by the implementation of any portions of the Specification where the Specification describes the functionality causing the infringement in detail and does not merely reference the functionality causing the infringement. Granted Claims under this CLA exclude those patent claims that would be infringed by an implementation of the Specification if my Contribution to that Specification were removed. 57 | 58 | 10.6. I, Me, or My. “I,” “me,” or “my” refers to the signatory below and its Bound Entities, if applicable. 59 | 60 | 10.7. Permitted Uses. “Permitted Uses” means making, using, selling, offering for sale, importing or distributing any implementation of the Specification 1) only to the extent it implements the Specification and 2) so long as all required portions of the Specification are implemented. Permitted Uses do not extend to any portion of an implementation that is not included in the Specification. 61 | 62 | 10.8. Related Entities. “Related Entities” means 1) any entity that Controls the Bound Entity (“Upstream Entity”), and 2) any other entity that is Controlled by an Upstream Entity that is not itself a Bound Entity. 63 | 64 | 10.9. Specification. “Specification” means the Specification identified below as of the date of my last Contribution. 65 | 66 | 10.10. You or Your. “You,” “you,” or “your” means any person or entity who exercises copyright or patent rights granted under this CLA, and any person or entity you Control. -------------------------------------------------------------------------------- /EditingTheSpec.md: -------------------------------------------------------------------------------- 1 | # Editing the Specification 2 | 3 | To contribute changes to the specification, please 4 | 5 | - Review the [Contributions policy](CONTRIBUTING.md) for this specification and ensure that you and your organization are willing to abide by the policy. 6 | - **Pull requests submitted to this repository imply acceptance of the [Contributions policy](CONTRIBUTING.md).** 7 | 8 | - Submit a pull request by: 9 | - forking this repo 10 | - editing the appropriate markdown files in the [`/spec`](/spec) folder 11 | 12 | The specification source consists of the markdown files listed in 13 | [specs.json](/specs.json) and found in the [`/spec`](/spec) folder. The 14 | specification is automatically rendered (using 15 | [Spec-Up](https://github.com/decentralized-identity/spec-up)) to the `/docs` 16 | folder of the `gh-pages` branch of this repository on each pull request merge 17 | (using a GitHub Action), and then published (using GitHub Pages). 18 | 19 | ## Testing your Edits Locally 20 | 21 | Full guidance for using Spec-Up is in its 22 | [repository](https://github.com/decentralized-identity/spec-up). The short 23 | version of the instructions to render this specification locally while you are 24 | editing is: 25 | 26 | - Install the prerequisites: `node` and `npm` 27 | - Run `npm install` from the root of the repository 28 | - Run `npm run edit` from the root of the repository to render the document with 29 | live updates to the `docs/index.html` as 30 | you edit the source files. 31 | - You can also run `npm run render` to just generate the specification file once. 32 | - Open the rendered file in a browser and refresh to see your updates as you work. 33 | - When you are done, hit `Ctrl-c` to exit the live rendering. 34 | 35 | Please check your edits locally before you submit a pull request! 36 | 37 | ### Handling the Rendered Specification File 38 | 39 | When you create a pull request to update the specification, the `docs/index.html` will be 40 | .gitignore'd and **not** included in your pull request. A GitHub Action triggered on merging pull requests automagically renders the full 41 | specification (`docs/index.html`) to the `gh-pages` branch in the repository and the 42 | specification is published (via GitHub Pages) from there. 43 | 44 | ## Adding a New Source Markdown File 45 | 46 | If you add a source markdown file to the specification, you must also add a reference 47 | to it in the [specs.json](/specs.json) in the root of the repository. 48 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | OWFa 1.0 2 | Open Web Foundation 3 | Final Specification Agreement (OWFa 1.0) 4 | (Patent and Copyright Grants) 5 | 6 | 1. The Purpose of this Agreement. This Agreement sets forth the terms under which I make certain copyright and patent rights available to you for your Permitted Uses of the Specification. Capitalized terms are defined in the Agreement’s last section. 7 | 2. Copyrights. 8 | 9 | 2.1. Copyright Grant. I grant to you a perpetual (for the duration of the applicable copyright), worldwide, non-exclusive, no-charge, royalty-free, copyright license, without any obligation for accounting to me, to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, distribute, and implement the Specification to the full extent of my copyright interest in the Specification. 10 | 11 | 2.2. Attribution. As a condition of the copyright grant, you must include an attribution to the Specification in any derivative work you make based on the Specification. That attribution must include, at minimum, the Specification name and version number. 12 | 13 | 3. Patents. 14 | 15 | 3.1. Patent Non-Assert. 16 | 17 | 3.1.1. The Promise. I, on behalf of myself and my successors in interest and assigns, irrevocably promise not to assert my Granted Claims against you for your Permitted Uses, subject to the terms and conditions of Section 3.1. This is a personal promise directly from me to you, and you acknowledge as a condition of benefiting from it that no rights from me are received from suppliers, distributors, or otherwise in connection with this promise. This promise also applies to your Permitted Uses of any other specifications incorporating all required portions of the Specification. 18 | 19 | 3.1.2. Termination. 20 | 21 | 3.1.2.1. As a Result of Claims by You. All rights, grants, and promises made by me to you under this Agreement are terminated if you file, maintain, or voluntarily participate in a lawsuit against me or any person or entity asserting that its Permitted Uses infringe any Granted Claims you would have had the right to enforce had you signed this Agreement, unless that suit was in response to a corresponding suit first brought against you. 22 | 23 | 3.1.2.2. As a Result of Claims by a Related Entity of Mine. If a Related Entity of mine files, maintains, or voluntarily participates in a lawsuit asserting that a Permitted Use infringes any Granted Claims it would have had the right to enforce had it signed this Agreement, then I relinquish any rights, grants, and promises I have received for the Specification from other signatories of this Agreement, unless a) my promise to you was terminated pursuant to section 3.1.2.1, or b) that suit was in response to a corresponding suit first brought by you against the Related Entity. 24 | 25 | 3.1.3. Additional Conditions. This promise is not an assurance (i) that any of my copyrights or issued patent claims cover an implementation of the Specification or are enforceable or (ii) that an implementation of the Specification would not infringe intellectual property rights of any third party. Notwithstanding the personal nature of my promise, this promise is intended to be binding on any future owner, assignee or exclusive licensee to whom has been given the right to enforce any Granted Claims against third parties. 26 | 27 | 3.1.4. Bankruptcy. Solely for purposes of Section 365(n) of Title 11, United States Bankruptcy Code and any equivalent law in any foreign jurisdiction, this promise will be treated as if it were a license and you may elect to retain your rights under this promise if I (or any owner of any patents or patent applications referenced herein), as a debtor in possession, or a bankruptcy trustee, reject this non-assert. 28 | 29 | 3.2. Patent License Commitment. In addition to rights granted in 3.1, on behalf of me and my successors in interest and assigns, I agree to grant to you a no charge, royalty free license to my Granted Claims on reasonable and non-discriminatory terms, where such license applies only to those Granted Claims infringed by the implementation of the Specification, solely for your Permitted Uses. 30 | 4. No Other Rights. Except as specifically set forth in this Agreement, no other express or implied patent, trademark, copyright, or other property rights are granted under this Agreement, including by implication, waiver, or estoppel. 31 | 5. Antitrust Compliance. I acknowledge that I may compete with other participants, that I am under no obligation to implement the Specification, that each participant is free to develop competing technologies and standards, and that each party is free to license its patent rights to third parties, including for the purpose of enabling competing technologies and standards. 32 | 6. Non-Circumvention. I agree that I will not intentionally take or willfully assist any third party to take any action for the purpose of circumventing my obligations under this Agreement. 33 | 7. Representations, Warranties and Disclaimers. I represent and warrant that I am legally entitled to grant the rights and promises set forth in this Agreement. IN ALL OTHER RESPECTS THE SPECIFICATION IS PROVIDED "AS IS." The entire risk as to implementing or otherwise using the Specification is assumed by the implementer and user. Except as stated herein, I expressly disclaim any warranties (express, implied, or otherwise), including implied warranties of merchantability, non-infringement, fitness for a particular purpose, or title, related to the Specification. IN NO EVENT WILL ANY PARTY BE LIABLE TO ANY OTHER PARTY FOR LOST PROFITS OR ANY FORM OF INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER FROM ANY CAUSES OF ACTION OF ANY KIND WITH RESPECT TO THIS AGREEMENT, WHETHER BASED ON BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, AND WHETHER OR NOT THE OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. All of my obligations under Section 3 regarding the transfer, successors in interest, or assignment of Granted Claims will be satisfied if I notify the transferee or assignee of any patent that I know contains Granted Claims of the obligations under Section 3. Nothing in this Agreement requires me to undertake a patent search. 34 | 8. Definitions. 35 | 36 | 8.1. Agreement. “Agreement” means this OWFa document, which sets forth the rights, grants, promises, limitations, conditions, obligations, and disclaimers made available for the particular Specification. 37 | 38 | 8.2. Bound Entities. “Bound Entities” means the entity listed below and any entities that the Bound Entity Controls. 39 | 40 | 8.3. Control. “Control” means direct or indirect control of more than 50% of the voting power to elect directors of that corporation, or for any other entity, the power to direct management of such entity. 41 | 42 | 8.4. Granted Claims. "Granted Claims" are those patent claims that I own or control, including those patent claims I acquire or control after the Date below, that are infringed by Permitted Uses. Granted Claims include only those patent claims that are infringed by the implementation of any portions of the Specification where the Specification describes the functionality causing the infringement in detail and does not merely reference the functionality causing the infringement. 43 | 44 | 8.5. I, Me, or My. “I,” “me,” or “my” refers to the signatory below and its Bound Entities, if applicable. 45 | 46 | 8.6. Permitted Uses. “Permitted Uses” means making, using, selling, offering for sale, importing or distributing any implementation of the Specification 1) only to the extent it implements the Specification and 2) so long as all required portions of the Specification are implemented. Permitted Uses do not extend to any portion of an implementation that is not included in the Specification. 47 | 48 | 8.7. Related Entities. “Related Entities” means 1) any entity that Controls the Bound Entity (“Upstream Entity”), and 2) any other entity that is Controlled by an Upstream Entity that is not itself a Bound Entity. 49 | 50 | 8.8. Specification. “Specification” means the Specification identified below. 51 | 52 | 8.9. You or Your. “You,” “you,” or “your” means any person or entity who exercises copyright or patent rights granted under this Agreement, and any person or entity you Control. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Key Event Receipt Infrastructure (KERI) 2 | 3 | This is the working area for the Trust over IP, "Key Event Receipt Infrastructure (KERI)" specification. 4 | 5 | * [Editor's Copy](https://trustoverip.github.io/tswg-keri-specification/) 6 | 7 | #### Contributing 8 | 9 | All Trust Over IP Foundation Technical Stack Working Group contributions are done so under the following licenses: 10 | 11 | * [Patent and Copyright Grants](CONTRIBUTING.md) 12 | * [Source Code](SOURCE_CODE.md) 13 | 14 | #### Licensing 15 | 16 | All Trust Over IP Foundation Technical Stack Working Group deliverables are published under the following licenses: 17 | 18 | * [Patent and Copyright Grants](LICENSE.md) 19 | * [Source Code](SOURCE_CODE.md) 20 | 21 | #### Getting involved 22 | 23 | Join a community of individuals and organizations solving the toughest technical and human-centric problems in digital trust. https://trustoverip.org/get-involved/membership/ 24 | 25 | #### Note 26 | 27 | This work was migrated from https://github.com/WebOfTrust/ietf-keri. 28 | -------------------------------------------------------------------------------- /SOURCE_CODE.md: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. -------------------------------------------------------------------------------- /assets/compiled/head.css: -------------------------------------------------------------------------------- 1 | slide-panels{position:fixed;top:0;left:0;height:100%;width:100%;pointer-events:none;z-index:100;contain:paint}slide-panels:before{content:" ";display:block;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.3);transition:opacity .35s ease;opacity:0;cursor:pointer;pointer-events:none}slide-panels[open]:before{opacity:1;pointer-events:all}slide-panel{display:flex;flex-direction:column;box-sizing:border-box;position:absolute;top:0;left:0;bottom:0;background:#fff;box-shadow:0 0 5px 1px rgba(0,0,0,.15);transform:translate3d(-100%,0,0);transition:transform .35s ease;z-index:1;pointer-events:all}slide-panel[options~=right]{left:auto;right:0;transform:translate3d(100%,0,0)}slide-panel[open]{transform:translate3d(0,0,0)}detail-box{display:block}detail-box>header [detail-box-toggle]{width:2em;height:2em;text-align:center;cursor:pointer}detail-box>header [detail-box-toggle]:before{content:" ";display:inline-block;width:0;height:0;border-left:.55em solid transparent;border-right:.55em solid transparent;border-top:.8em solid;vertical-align:sub;cursor:pointer}detail-box[open] header [detail-box-toggle]:before{border-top:none;border-bottom:.8em solid}detail-box>section{height:0;opacity:0;min-width:100%;transition:height .3s ease,opacity .3s;overflow:hidden}detail-box[open]>section{opacity:1}tab-panels>nav{display:flex}tab-panels>nav>*{margin-left:-2px;padding:.5em 1em;background:#e0e0e0;border:1px solid #aaa;border-radius:0;cursor:pointer}tab-panels>nav>:focus{outline:0;background:#ccc}tab-panels>nav>:first-child{border-top-left-radius:5px;border-bottom-left-radius:5px}tab-panels>nav>:last-child{border-top-right-radius:5px;border-bottom-right-radius:5px}tab-panels>nav>[selected]{color:var(--themed-element-text);background:var(--themed-element-bk);border:var(--themed-element-border);opacity:.9999}tab-panels>section{display:none}tab-panels>section[selected]{display:block} 2 | code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right} 3 | @keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0} 4 | :root{--base-theme-color:207,71%;--themed-element-bk:hsl(var(--base-theme-color), 40%);--themed-element-text:#fff;--themed-element-border:1px solid hsl(var(--base-theme-color), 26%);--themed-heading-text:hsl(var(--base-theme-color), 30%);--no-color:255,255,255;--faint-color:245,245,245;--dim-color:225,225,225;--low-color:200,200,200;--mid-color:100,100,100;--high-color:50,50,50;--full-color:0,0,0;--active-color:#3aaaff;--visited-color:rgb(188, 129, 255);--green-status:rgb(0, 123, 9);--light-green-status:rgb(0, 194, 13);--page-bk:rgb(var(--no-color));--page-text:rgb(var(--full-color));--page-text-hover:rgb(var(--full-color));--element-bk:rgb(var(--no-color));--element-bk-hover:rgba(var(--low-color), 0.5);--element-bk-transparent:rgba(var(--dim-color), 0.92);--element-border:rgba(var(--high-color), 0.4);--element-border-focus:rgb(var(--full-color), 0.75);--element-border-radius:3px;--element-shadow-low:0 1px 3px 0px rgba(0,0,0, 0.25);--element-shadow-mid:0 1px 3px 0px rgba(0,0,0, 0.35);--element-shadow-high:0 1px 5px 0px rgba(0,0,0, 0.45);--code-bk:#1a1e23;--input-bk:rgba(var(--dim-color), 0.6);--input-border:rgba(var(--high-color), 0.4);--header-height:48px;--header-bk:rgba(var(--low-color), 0.985);--header-text:rgb(var(--full-color));--header-border:rgba(var(--full-color), 0.1);--header-border-inverse:rgba(var(--no-color), 0.3);--text-shadow:0 1px 2px rgba(0,0,0,0.8);--svg-size:2vw;--font-size:14px}:target{scroll-margin:calc(var(--header-height)/ .75) 0 0}body:not([hashscroll]) :target{animation:highlight 1.5s .25s ease}body{margin:0;padding:0;font-family:Heebo,san-serif;line-height:1.5em;widows:2;orphans:2;word-wrap:break-word;overflow-wrap:break-word;color:#000;word-spacing:1px;counter-reset:h2 toc1}h1{font-size:2em;font-weight:700;line-height:1.2em}h2{margin:1.5em 0 1em}blockquote{position:relative;padding:0;margin:1.75em .75em;color:rgb(var(--mid-color));background:rgb(var(--faint-color))}blockquote:after,blockquote:before{content:"“";position:absolute;top:.065em;left:.065em;font-size:3em;height:.34em;line-height:100%;color:rgb(var(--low-color))}blockquote:after{content:"”";top:auto;left:auto;bottom:.065em;right:.065em;text-align:center}blockquote>p{padding:.6em 1.8em .5em 1.8em}strong strong{font-size:.9em;color:#b30032;font-weight:400;text-transform:uppercase}main article>ol,main article>ul{padding:0 0 0 2em}main article h1,main article h2,main article h3,main article h4,main article h5,main article h6{color:var(--themed-heading-text)}main article h2,main article h3,main article h4{display:flex;font-weight:500}main article h2{counter-reset:h3 h4}main article h3{counter-reset:h4}main article h2:after{counter-increment:h2;content:counter(h2) ".";padding:0 .4em 0 .2em;order:-1}main article h3:after{counter-increment:h3;content:counter(h2) "." counter(h3);padding:0 .45em 0 .2em;order:-1}main article h4:after{counter-increment:h4;content:counter(h2) "." counter(h3) "." counter(h4);padding:0 .5em 0 .2em;order:-1}h1 .toc-anchor{display:none}.toc-anchor{margin:-.1em 0 0;font-size:.875em;color:inherit;text-decoration:none;opacity:.35;order:-1;transition:opacity .3s ease}.toc-anchor:hover{opacity:1}pre{overflow:auto}code{padding:.085em .3em .1em;font-size:1.075em;color:#c7001c;vertical-align:middle;background:#f0f0f0;border-radius:4px}pre code{background:unset;padding:unset;border-radius:unset}h1 code,h2 code,h3 code,h4 code,h5 code,h6 code{font-size:1.25em;margin:-.11em .3em 0 0;border-radius:3px}ol,ul{margin:0;padding:0 0 0 1.2em}dt{font-weight:700;margin:1em 0 0}dd{margin-left:1.5em}main{box-sizing:border-box;float:right;width:75%;min-width:calc(100% - 325px);max-width:calc(100% - 275px);padding:.5em 2em 1.5em 2em;background:#fff;box-shadow:0 0 5px -1px rgba(0,0,0,.3)}main table{display:block;width:-webkit-fill-available;width:fit-content;max-width:100%;margin:1.5em 0 1.75em;border-spacing:0;border-collapse:collapse;overflow-x:auto;word-wrap:normal;overflow-wrap:normal;hyphens:manual}main thead tr th{color:var(--themed-element-text);background:var(--themed-element-bk);border:var(--themed-element-border);text-shadow:0 1px 1px rgba(0,0,0,.5)}main tr{border-top:1px solid #ccc;background-color:#fff;margin:0;padding:0}main tr:nth-child(2n){background-color:#f0f0f0}main tr th{font-weight:400;border:1px solid #ccc;text-align:left;margin:0;padding:6px 13px}main td,main th{padding:9px 13px;border:1px solid #d8d8d8}main tr td{border:1px solid #ccc;text-align:left;margin:0;padding:.55em .75em .55em}main tr td :first-child,main tr th :first-child{margin-top:0}main tr td :last-child,main tr th :last-child{margin-bottom:0}table pre[class*=language-]{border:none;border-radius:0}table pre[class*=language-]:before{display:none}svg[icon]{width:1.25em;height:1.25em;vertical-align:text-top;pointer-events:none}article p>img{max-width:100%;margin:0 auto}article li{margin-top:.4em}slide-panel>:not(header):not(footer){flex:1}:not(pre)>code[class*=language-],pre[class*=language-]{padding:.65em .8em .8em;background:var(--code-bk)}.tippy-box{box-shadow:var(--element-shadow-mid)}.tippy-box a{color:var(--active-color)}.tippy-box a:visited{color:var(--visited-color)}.tippy-content{padding:.55em .55em .5em}.tippy-content header{margin:0 0 .4em;padding:.15em .3em .1em;border-radius:2px;background:rgba(255,255,255,.1);text-shadow:0 1px rgba(0,0,0,.9)}.tippy-content table,.tippy-content tbody,.tippy-content td,.tippy-content tr{margin:0;padding:0;border:none;border-spacing:0;border-collapse:collapse;background:0 0!important;background-color:transparent!important}.tippy-content table{margin:0 .3em}.tippy-content td{font-size:.9em;padding:.2em 0 0}.tippy-content td:first-child{padding-right:.5em}a[path-0$="github.com"]:before{content:"\f09b";color:var(--page-text);margin:0 .25em 0 0;font-family:FontAwesome;text-decoration:none;display:inline-block;vertical-align:bottom}a[path-0$="github.com"][path-3=issues][path-4],a[path-0$="github.com"][path-3=projects],a[path-0$="github.com"][path-3=pull],a[path-0$="github.com"][path-3=releases]{text-decoration:none}a[path-0$="github.com"][path-3=issues][path-4] span,a[path-0$="github.com"][path-3=projects] span,a[path-0$="github.com"][path-3=pull] span,a[path-0$="github.com"][path-3=releases] span{display:none}a[path-0$="github.com"][path-3=issues][path-4]:after{content:"Issue #" attr(path-4)}a[path-0$="github.com"][path-3=pull]:after{content:"Pull Request #" attr(path-4)}a[path-0$="github.com"][path-3=releases][path-5]:after{content:"Release " attr(path-5)}a[path-0$="github.com"][path-3=projects]:after{content:"Project #" attr(path-4)}[issue-count]:after{content:"Issues (" attr(issue-count) ")";margin:0 0 0 .3em;padding:.1em 0 0}[issue-count=""][animate]{display:none;opacity:0}[issue-count][animate]:not([issue-count=""]){animation:display-show 1s}[panel-toggle]{cursor:pointer}.panel-header{display:flex;align-items:center;height:var(--header-height)}.panel-header>*{display:flex;height:100%;padding:.1em .8em 0;align-items:center}.slide-panel{width:calc(100% - 1em);max-width:475px;transition:transform .35s ease}.slide-panel[panel-open]{transform:translateX(0)}.notice{margin:1em 0;padding:.5em .9em .55em .65em;border-left:.5em solid}.notice p{margin:.4em 0 0}.note{background:#e9fbe9;border-color:#52e052}.note .notice-link{display:block;color:#178217}.issue{background:#e9f0fb;border-color:#527fe0}.issue .notice-link:before{display:block;color:#1e4cae}.warning{background:#fbe9e9;border-color:#e05252}.warning .notice-link{display:block;color:#ae1e1e}.example{color:#cebe00;background:#1a1e23;border-left:.5em solid}.example .notice-link{display:block;color:inherit;font-size:1.1em;font-family:Heebo,san-serif}.example pre[class*=language-]{padding:0;border-radius:0}.todo{background:#fbe4ff;border-color:#9700e2}.todo .notice-link{display:block;color:#6d00a2}.mermaid{display:flex;align-items:center;justify-content:center;margin:1.5em 0 1.75em}.reference-list{margin:0;padding:0;list-style:none}.reference-list dd a,.reference-status{font-style:italic}.reference-status{color:var(--green-status)}.tippy-box .reference-status{color:var(--light-green-status)}code[class*=language-],pre,pre[class*=language-]{font-size:.9em;margin:1em 0 1.5em;border-radius:3px}.example code[class*=language-],.example pre,.example pre[class*=language-]{margin:0}#svg{display:none}#header{position:sticky;position:-webkit-sticky;padding:0;top:0;margin:-.5em -2em 0 -2em;background:rgba(255,255,255,.9);border-bottom:1px solid rgba(0,0,0,.175);box-shadow:0 1px 3px 1px rgba(0,0,0,.1);z-index:2}#logo{box-sizing:border-box;display:flex;align-items:center;height:100%;padding:.5em}#logo img{height:100%}#logo+span{margin-left:auto}#header #toc_toggle{display:none;padding:0 1em;border-right:1px solid rgba(0,0,0,.15)}#content{max-width:800px}#content h1:first-of-type{margin:1em 0 .5em}#content h1:first-of-type .markdownIt-Anchor{display:none}#repo_issues{width:calc(100% - 1.5em);max-width:450px;border-left:1px solid rgba(0,0,0,.15)}#repo_issues>header{background:#eee;border-bottom:1px solid #ddd}#repo_issues>header span:first-of-type{font-weight:700;padding-top:.1em}#repo_issues>header .repo-issue-toggle{margin-left:auto;color:inherit;font-weight:700;text-decoration:none}#repo_issue_list{list-style:none;margin:0;padding:0 1.25em 1.25em;font-size:.85em;overflow:auto;-ms-overflow-style:none;scrollbar-width:none}#repo_issue_list::-webkit-scrollbar{display:none}#repo_issue_list:empty:before{content:"No issues found";display:block;text-align:center;font-size:1.1em;color:#aaa;margin:1em 0 0}.repo-issue detail-box{display:flex;flex-direction:column;padding:1em 0;border-bottom:1px solid #ddd}.repo-issue detail-box>section{order:1}.repo-issue detail-box>section:empty+.repo-issue-title [detail-box-toggle]{display:none}.repo-issue-title{display:flex;align-items:center}.repo-issue-link{flex:1;margin:0 0 0 .5em}.repo-issue-number{height:1em;margin:0 .4em 0 0;padding:.3em .25em 0;border-radius:3px;font-weight:700;background:#eee;border:1px solid #ddd;text-align:center;line-height:1em}.repo-issue-number:before{content:"#";font-weight:400;margin:0 .1em 0 0}.repo-issue [detail-box-toggle]{margin:0 0 0 1em;opacity:.35;transition:opacity .4s}.repo-issue [detail-box-toggle]:hover,.repo-issue detail-box[open] [detail-box-toggle]{opacity:1}#toc{display:flex;flex-direction:column;width:25%;max-width:325px;min-width:275px;background:#eceff1}#toc header{color:var(--themed-element-text);background:var(--themed-element-bk);box-shadow:0 1px 3px 0 rgba(0,0,0,.3);border:var(--themed-element-border);border-top:none;border-left:none}#toc header [panel-toggle]{display:none;height:var(--header-height);line-height:var(--header-height);margin-left:auto;padding:0 1em;color:inherit;font-weight:700;text-decoration:none}#toc_list{flex:1;padding:1em .8em;overflow:auto}.toc{padding:0 0 1.75em;font-size:.85em}.toc,.toc ul{margin:0;list-style:none}.toc ul{padding:0 0 0 1em}.toc a{display:block;padding:.4em .3em .225em;text-decoration:none;border-radius:3px;color:#333}.toc a:before{color:#000;font-weight:700}.toc a:hover{text-shadow:0 1px 1px #fff;background:rgba(0,0,0,.1)}.toc>li a:before{counter-increment:toc1;content:counter(toc1) ".";padding:0 .4em 0 .2em}.toc>li>ul{counter-reset:toc2}.toc>li>ul>li a:before{counter-increment:toc2;content:counter(toc1) "." counter(toc2);padding:0 .45em 0 .2em}.toc>li>ul ul{counter-reset:toc3}.toc>li>ul ul li a:before{counter-increment:toc3;content:counter(toc1) "." counter(toc2) "." counter(toc3);padding:0 .5em 0 .2em}@media (min-width:900px){slide-panel{z-index:2}#slidepanels[open=sidebar]:before{opacity:0;transition:none;pointer-events:none}#slidepanels:before{z-index:1}#toc{transition:none;transform:translate3d(0,0,0);box-shadow:0 0 5px 1px rgba(0,0,0,.15) inset;z-index:0}}@media (max-width:900px){main{width:100%;min-width:auto;max-width:none;padding:.5em 1.25em 1.5em 1.25em}#header{margin:-.5em -1.25em 0 -1.25em}#toc header [panel-toggle]{display:block}#header #toc_toggle{display:flex}}@media (max-width:550px){td{font-size:.8em}}@keyframes display-show{0%{display:none;opacity:0}1%{display:block}100%{opacity:1}}@keyframes highlight{50%{background-color:#ff0}} -------------------------------------------------------------------------------- /assets/compiled/head.js: -------------------------------------------------------------------------------- 1 | function delegateEvent(e,t,n,a={}){return(a.container||document).addEventListener(e,e=>{let a=e.target.closest(t);a&&n(e,a)},a)}skipAnimationFrame=e=>requestAnimationFrame(()=>requestAnimationFrame(e));var domReady=new Promise(e=>{document.addEventListener("DOMContentLoaded",t=>e())}); 2 | customElements.define("slide-panels",class extends HTMLElement{static get observedAttributes(){return["open"]}constructor(){super(),this.addEventListener("pointerup",e=>{e.target===this&&this.close()})}get active(){return this.getAttribute("open")}toggle(e){this.active===e?this.close():this.open(e)}open(e){this.setAttribute("open",e)}close(){this.removeAttribute("open")}attributeChangedCallback(e,t,s){switch(e){case"open":for(let e of this.children)e.id===s?e.setAttribute("open",""):e.removeAttribute("open","")}}}),customElements.define("detail-box",class extends HTMLElement{static get observedAttributes(){return["open"]}constructor(){super(),this.addEventListener("pointerup",e=>{e.target.hasAttribute("detail-box-toggle")&&(e.stopPropagation(),this.toggle())}),this.addEventListener("transitionend",e=>{let t=e.target;t.parentElement===this&&"SECTION"===t.tagName&&"height"===e.propertyName&&(t.style.height=this.hasAttribute("open")?"auto":null)})}toggle(){this.toggleAttribute("open")}attributeChangedCallback(e,t,s){switch(e){case"open":for(let e of this.children)if("SECTION"===e.tagName){if(null!==s)e.offsetHeight0){e.style.height=e.offsetHeight+"px";this.scrollHeight;e.style.height=0}break}}}}),customElements.define("tab-panels",class extends HTMLElement{constructor(){super(),delegateEvent("click","tab-panels > nav > *",(e,t)=>{let s=t.parentElement;s.parentElement===this&&this.setAttribute("selected-index",Array.prototype.indexOf.call(s.children,t))},{container:this,passive:!0})}static get observedAttributes(){return["selected-index"]}attributeChangedCallback(e,t,s){domReady.then(()=>{switch(e){case"selected-index":let e=s||0,t=this.querySelector("nav");if(t.parentElement===this){let s=t.children,i=s[e];for(let e of s)e.removeAttribute("selected");i&&i.setAttribute("selected","");let r=Array.prototype.filter.call(this.children,e=>{if("SECTION"===e.tagName)return e.removeAttribute("selected"),!0})[e];r&&r.setAttribute("selected","")}}})}}); -------------------------------------------------------------------------------- /assets/css/chart.css: -------------------------------------------------------------------------------- 1 | /* 2 | * DOM element rendering detection 3 | * https://davidwalsh.name/detect-node-insertion 4 | */ 5 | @keyframes chartjs-render-animation { 6 | from { opacity: 0.99; } 7 | to { opacity: 1; } 8 | } 9 | 10 | .chartjs-render-monitor { 11 | animation: chartjs-render-animation 0.001s; 12 | } 13 | 14 | /* 15 | * DOM element resizing detection 16 | * https://github.com/marcj/css-element-queries 17 | */ 18 | .chartjs-size-monitor, 19 | .chartjs-size-monitor-expand, 20 | .chartjs-size-monitor-shrink { 21 | position: absolute; 22 | direction: ltr; 23 | left: 0; 24 | top: 0; 25 | right: 0; 26 | bottom: 0; 27 | overflow: hidden; 28 | pointer-events: none; 29 | visibility: hidden; 30 | z-index: -1; 31 | } 32 | 33 | .chartjs-size-monitor-expand > div { 34 | position: absolute; 35 | width: 1000000px; 36 | height: 1000000px; 37 | left: 0; 38 | top: 0; 39 | } 40 | 41 | .chartjs-size-monitor-shrink > div { 42 | position: absolute; 43 | width: 200%; 44 | height: 200%; 45 | left: 0; 46 | top: 0; 47 | } 48 | -------------------------------------------------------------------------------- /assets/css/custom-elements.css: -------------------------------------------------------------------------------- 1 | 2 | slide-panels { 3 | position: fixed; 4 | top: 0; 5 | left: 0; 6 | height: 100%; 7 | width: 100%; 8 | pointer-events: none; 9 | z-index: 100; 10 | contain: paint; 11 | } 12 | 13 | slide-panels:before { 14 | content: " "; 15 | display: block; 16 | position: fixed; 17 | top: 0; 18 | left: 0; 19 | width: 100%; 20 | height: 100%; 21 | background: rgba(0,0,0,0.3); 22 | transition: opacity 0.35s ease; 23 | opacity: 0; 24 | cursor: pointer; 25 | pointer-events: none; 26 | } 27 | 28 | slide-panels[open]:before { 29 | opacity: 1; 30 | pointer-events: all; 31 | } 32 | 33 | slide-panel { 34 | display: flex; 35 | flex-direction: column; 36 | box-sizing: border-box; 37 | position: absolute; 38 | top: 0; 39 | left: 0; 40 | bottom: 0; 41 | background: #fff; 42 | box-shadow: 0 0 5px 1px rgba(0,0,0,0.15); 43 | transform: translate3d(-100%, 0%, 0); 44 | transition: transform 0.35s ease; 45 | z-index: 1; 46 | pointer-events: all; 47 | } 48 | 49 | slide-panel[options~="right"] { 50 | left: auto; 51 | right: 0; 52 | transform: translate3d(100%, 0%, 0); 53 | } 54 | 55 | slide-panel[open] { 56 | transform: translate3d(0%, 0%, 0); 57 | } 58 | 59 | detail-box { 60 | display: block; 61 | } 62 | 63 | detail-box > header [detail-box-toggle] { 64 | width: 2em; 65 | height: 2em; 66 | text-align: center; 67 | cursor: pointer; 68 | } 69 | 70 | detail-box > header [detail-box-toggle]:before { 71 | content: " "; 72 | display: inline-block; 73 | width: 0; 74 | height: 0; 75 | border-left: 0.55em solid transparent; 76 | border-right: 0.55em solid transparent; 77 | border-top: 0.8em solid; 78 | vertical-align: sub; 79 | cursor: pointer; 80 | } 81 | 82 | detail-box[open] header [detail-box-toggle]:before { 83 | border-top: none; 84 | border-bottom: 0.8em solid; 85 | } 86 | 87 | detail-box > section { 88 | height: 0; 89 | opacity: 0; 90 | min-width: 100%; 91 | transition: height 0.3s ease, opacity 0.3s; 92 | overflow: hidden; 93 | } 94 | 95 | detail-box[open] > section { 96 | opacity: 1; 97 | } 98 | 99 | 100 | /* TAB-PANELS */ 101 | 102 | tab-panels > nav { 103 | display: flex; 104 | } 105 | 106 | tab-panels > nav > * { 107 | margin-left: -2px; 108 | padding: 0.5em 1em; 109 | background: #e0e0e0; 110 | border: 1px solid #aaa; 111 | border-radius: 0; 112 | cursor: pointer; 113 | } 114 | 115 | tab-panels > nav > *:focus { 116 | outline: none; 117 | background: #ccc; 118 | } 119 | 120 | tab-panels > nav > *:first-child { 121 | border-top-left-radius: 5px; 122 | border-bottom-left-radius: 5px; 123 | } 124 | 125 | tab-panels > nav > *:last-child { 126 | border-top-right-radius: 5px; 127 | border-bottom-right-radius: 5px; 128 | } 129 | 130 | tab-panels > nav > *[selected] { 131 | color: var(--themed-element-text); 132 | background: var(--themed-element-bk); 133 | border: var(--themed-element-border); 134 | opacity: 0.9999; 135 | } 136 | 137 | tab-panels > section { 138 | display: none; 139 | } 140 | 141 | tab-panels > section[selected] { 142 | display: block; 143 | } -------------------------------------------------------------------------------- /assets/css/index.css: -------------------------------------------------------------------------------- 1 | 2 | :root { 3 | 4 | --base-theme-color: 207, 71%; 5 | --themed-element-bk: hsl(var(--base-theme-color), 40%); 6 | --themed-element-text: #fff; 7 | --themed-element-border: 1px solid hsl(var(--base-theme-color), 26%); 8 | --themed-heading-text: hsl(var(--base-theme-color), 30%); 9 | 10 | --no-color: 255,255,255; 11 | --faint-color: 245,245,245; 12 | --dim-color: 225,225,225; 13 | --low-color: 200,200,200; 14 | --mid-color: 100,100,100; 15 | --high-color: 50,50,50; 16 | --full-color: 0,0,0; 17 | --active-color: #3aaaff; 18 | --visited-color: rgb(188, 129, 255); 19 | --green-status: rgb(0, 123, 9); 20 | --light-green-status: rgb(0, 194, 13); 21 | 22 | 23 | --page-bk: rgb(var(--no-color)); 24 | --page-text: rgb(var(--full-color)); 25 | --page-text-hover: rgb(var(--full-color)); 26 | 27 | --element-bk: rgb(var(--no-color)); 28 | --element-bk-hover: rgba(var(--low-color), 0.5); 29 | --element-bk-transparent: rgba(var(--dim-color), 0.92); 30 | --element-border: rgba(var(--high-color), 0.4); 31 | --element-border-focus: rgb(var(--full-color), 0.75); 32 | --element-border-radius: 3px; 33 | --element-shadow-low: 0 1px 3px 0px rgba(0,0,0, 0.25); 34 | --element-shadow-mid: 0 1px 3px 0px rgba(0,0,0, 0.35); 35 | --element-shadow-high: 0 1px 5px 0px rgba(0,0,0, 0.45); 36 | 37 | --code-bk: #1a1e23; 38 | 39 | --input-bk: rgba(var(--dim-color), 0.6); 40 | --input-border: rgba(var(--high-color), 0.4); 41 | 42 | /* --header-height: 3.5em; */ 43 | --header-height: 48px; 44 | --header-bk: rgba(var(--low-color), 0.985); 45 | --header-text: rgb(var(--full-color)); 46 | --header-border: rgba(var(--full-color), 0.1); 47 | --header-border-inverse: rgba(var(--no-color), 0.3); 48 | 49 | --text-shadow: 0 1px 2px rgba(0,0,0,0.8); 50 | 51 | --svg-size: 2vw; 52 | 53 | --font-size: 14px; 54 | } 55 | 56 | *:target { 57 | scroll-margin: calc(var(--header-height) / 0.75) 0 0; 58 | } 59 | 60 | body:not([hashscroll]) *:target { 61 | animation: highlight 1.5s 0.25s ease; 62 | } 63 | 64 | body { 65 | margin: 0; 66 | padding: 0; 67 | font-family: Heebo, san-serif; 68 | line-height: 1.5em; 69 | widows: 2; 70 | orphans: 2; 71 | word-wrap: break-word; 72 | overflow-wrap: break-word; 73 | color: black; 74 | word-spacing: 1px; 75 | counter-reset: h2 toc1; 76 | } 77 | 78 | h1 { 79 | font-size: 2em; 80 | font-weight: bold; 81 | line-height: 1.2em; 82 | } 83 | 84 | h2 { 85 | margin: 1.5em 0 1em; 86 | } 87 | 88 | blockquote { 89 | position: relative; 90 | padding: 0; 91 | margin: 1.75em 0.75em; 92 | color: rgb(var(--mid-color)); 93 | background: rgb(var(--faint-color)); 94 | } 95 | 96 | blockquote:before, blockquote:after { 97 | content: "“"; 98 | position: absolute; 99 | top: 0.065em; 100 | left: 0.065em; 101 | font-size: 3em; 102 | height: 0.34em; 103 | line-height: 100%; 104 | color: rgb(var(--low-color)); 105 | } 106 | 107 | blockquote:after { 108 | content: "”"; 109 | top: auto; 110 | left: auto; 111 | bottom: 0.065em; 112 | right: 0.065em; 113 | text-align: center; 114 | } 115 | 116 | blockquote > p { 117 | padding: 0.6em 1.8em 0.5em 1.8em; 118 | } 119 | 120 | strong strong { 121 | font-size: 0.9em; 122 | color: #b30032; 123 | font-weight: normal; 124 | text-transform: uppercase; 125 | } 126 | 127 | main article > ol, 128 | main article > ul { 129 | padding: 0 0 0 2em; 130 | } 131 | 132 | main article h1, 133 | main article h2, 134 | main article h3, 135 | main article h4, 136 | main article h5, 137 | main article h6 { 138 | color: var(--themed-heading-text); 139 | } 140 | 141 | main article h2, 142 | main article h3, 143 | main article h4 { 144 | display: flex; 145 | font-weight: 500; 146 | } 147 | 148 | main article h2 { 149 | counter-reset: h3 h4; 150 | } 151 | 152 | main article h3 { 153 | counter-reset: h4; 154 | } 155 | 156 | main article h2:after { 157 | counter-increment: h2; 158 | content: counter(h2) "."; 159 | padding: 0 0.4em 0 0.2em; 160 | order: -1; 161 | } 162 | 163 | main article h3:after { 164 | counter-increment: h3; 165 | content: counter(h2) "." counter(h3); 166 | padding: 0 0.45em 0 0.2em; 167 | order: -1; 168 | } 169 | 170 | main article h4:after { 171 | counter-increment: h4; 172 | content: counter(h2) "." counter(h3) "." counter(h4); 173 | padding: 0 0.5em 0 0.2em; 174 | order: -1; 175 | } 176 | 177 | h1 .toc-anchor { 178 | display: none; 179 | } 180 | 181 | .toc-anchor { 182 | margin: -0.1em 0 0; 183 | font-size: 0.875em; 184 | color: inherit; 185 | text-decoration: none; 186 | opacity: 0.35; 187 | order: -1; 188 | transition: opacity 0.3s ease; 189 | } 190 | 191 | .toc-anchor:hover { 192 | opacity: 1; 193 | } 194 | 195 | pre { 196 | overflow: auto; 197 | } 198 | 199 | code { 200 | padding: 0.085em 0.3em 0.1em; 201 | font-size: 1.075em; 202 | color: #c7001c; 203 | vertical-align: middle; 204 | background: #f0f0f0; 205 | border-radius: 4px; 206 | } 207 | 208 | pre code { 209 | background: unset; 210 | padding: unset; 211 | border-radius: unset; 212 | } 213 | 214 | h1 code, 215 | h2 code, 216 | h3 code, 217 | h4 code, 218 | h5 code, 219 | h6 code { 220 | font-size: 1.25em; 221 | margin: -0.11em 0.3em 0 0; 222 | border-radius: 3px; 223 | } 224 | 225 | ol, ul { 226 | margin: 0; 227 | padding: 0 0 0 1.2em; 228 | } 229 | 230 | dt { 231 | font-weight: bold; 232 | margin: 1em 0 0; 233 | } 234 | 235 | dd { 236 | margin-left: 1.5em; 237 | } 238 | 239 | main { 240 | box-sizing: border-box; 241 | float: right; 242 | width: 75%; 243 | min-width: calc(100% - 325px); 244 | max-width: calc(100% - 275px); 245 | padding: 0.5em 2em 1.5em 2em; 246 | background: #fff; 247 | box-shadow: 0px 0px 5px -1px rgba(0,0,0,0.3); 248 | } 249 | 250 | main table { 251 | display: block; 252 | width: -webkit-fill-available; 253 | width: fit-content; 254 | max-width: 100%; 255 | margin: 1.5em 0 1.75em; 256 | border-spacing: 0; 257 | border-collapse: collapse; 258 | overflow-x: auto; 259 | word-wrap: normal; 260 | overflow-wrap: normal; 261 | hyphens: manual; 262 | } 263 | 264 | main thead tr th { 265 | color: var(--themed-element-text); 266 | background: var(--themed-element-bk); 267 | border: var(--themed-element-border); 268 | text-shadow: 0px 1px 1px rgba(0,0,0,0.5); 269 | } 270 | 271 | main tr { 272 | border-top: 1px solid #cccccc; 273 | background-color: white; 274 | margin: 0; 275 | padding: 0; 276 | } 277 | 278 | main tr:nth-child(2n) { 279 | background-color: #f0f0f0; 280 | } 281 | 282 | main tr th { 283 | font-weight: normal; 284 | border: 1px solid #cccccc; 285 | text-align: left; 286 | margin: 0; 287 | padding: 6px 13px; 288 | } 289 | 290 | main td, 291 | main th { 292 | padding: 9px 13px; 293 | border: 1px solid #d8d8d8; 294 | } 295 | 296 | main tr td { 297 | border: 1px solid #ccc; 298 | text-align: left; 299 | margin: 0; 300 | padding: 0.55em 0.75em 0.55em; 301 | } 302 | 303 | main tr th :first-child, 304 | main tr td :first-child { 305 | margin-top: 0; 306 | } 307 | 308 | main tr th :last-child, 309 | main tr td :last-child { 310 | margin-bottom: 0; 311 | } 312 | 313 | table pre[class*="language-"] { 314 | border: none; 315 | border-radius: 0; 316 | } 317 | 318 | table pre[class*="language-"]:before { 319 | display: none; 320 | } 321 | 322 | svg[icon] { 323 | width: 1.25em; 324 | height: 1.25em; 325 | vertical-align: text-top; 326 | pointer-events: none; 327 | } 328 | 329 | article p > img { 330 | max-width: 100%; 331 | margin: 0 auto; 332 | } 333 | 334 | article li { 335 | margin-top: 0.4em; 336 | } 337 | 338 | /* Custom Elements */ 339 | 340 | slide-panel > *:not(header):not(footer) { 341 | flex: 1; 342 | } 343 | 344 | /* Code Examples */ 345 | 346 | :not(pre) > code[class*="language-"], 347 | pre[class*="language-"] { 348 | padding: 0.65em 0.8em 0.8em; 349 | background: var(--code-bk); 350 | } 351 | 352 | /* Tooltips */ 353 | 354 | .tippy-box { 355 | box-shadow: var(--element-shadow-mid); 356 | } 357 | 358 | .tippy-box a { 359 | color: var(--active-color); 360 | } 361 | 362 | .tippy-box a:visited { 363 | color: var(--visited-color); 364 | } 365 | 366 | .tippy-content { 367 | padding: 0.55em 0.55em 0.5em; 368 | } 369 | 370 | .tippy-content header { 371 | margin: 0 0 0.4em; 372 | padding: 0.15em 0.3em 0.1em; 373 | border-radius: 2px; 374 | background: rgba(255,255,255,0.1); 375 | text-shadow: 0 1px rgba(0,0,0, 0.9); 376 | } 377 | 378 | .tippy-content table, 379 | .tippy-content tbody, 380 | .tippy-content tr, 381 | .tippy-content td { 382 | margin: 0; 383 | padding: 0; 384 | border: none; 385 | border-spacing: 0; 386 | border-collapse: collapse; 387 | background: none !important; 388 | background-color: transparent !important; 389 | } 390 | 391 | .tippy-content table { 392 | margin: 0 0.3em; 393 | } 394 | 395 | .tippy-content td { 396 | font-size: 0.9em; 397 | padding: 0.2em 0 0; 398 | } 399 | 400 | .tippy-content td:first-child { 401 | padding-right: 0.5em; 402 | } 403 | 404 | 405 | /*******************/ 406 | 407 | a[path-0$="github.com"]:before { 408 | content: "\f09b"; 409 | color: var(--page-text); 410 | margin: 0 0.25em 0 0; 411 | font-family: 'FontAwesome'; 412 | text-decoration: none; 413 | display: inline-block; 414 | vertical-align: bottom; 415 | } 416 | 417 | a[path-0$="github.com"][path-3="issues"][path-4], 418 | a[path-0$="github.com"][path-3="projects"], 419 | a[path-0$="github.com"][path-3="releases"], 420 | a[path-0$="github.com"][path-3="pull"] { 421 | text-decoration: none; 422 | } 423 | 424 | a[path-0$="github.com"][path-3="issues"][path-4] span, 425 | a[path-0$="github.com"][path-3="projects"] span, 426 | a[path-0$="github.com"][path-3="releases"] span, 427 | a[path-0$="github.com"][path-3="pull"] span { 428 | display: none; 429 | } 430 | 431 | a[path-0$="github.com"][path-3="issues"][path-4]:after { 432 | content: "Issue #" attr(path-4); 433 | } 434 | 435 | a[path-0$="github.com"][path-3="pull"]:after { 436 | content: "Pull Request #" attr(path-4); 437 | } 438 | 439 | a[path-0$="github.com"][path-3="releases"][path-5]:after { 440 | content: "Release " attr(path-5); 441 | } 442 | 443 | a[path-0$="github.com"][path-3="projects"]:after { 444 | content: "Project #" attr(path-4); 445 | } 446 | 447 | [issue-count]:after { 448 | content: "Issues (" attr(issue-count) ")"; 449 | margin: 0 0 0 0.3em; 450 | padding: 0.1em 0 0; 451 | } 452 | 453 | [issue-count=""][animate] { 454 | display: none; 455 | opacity: 0; 456 | } 457 | 458 | [issue-count][animate]:not([issue-count=""]) { 459 | animation: display-show 1s; 460 | } 461 | 462 | [panel-toggle] { 463 | cursor: pointer; 464 | } 465 | 466 | .panel-header { 467 | display: flex; 468 | align-items: center; 469 | height: var(--header-height); 470 | } 471 | 472 | .panel-header > * { 473 | display: flex; 474 | height: 100%; 475 | padding: 0.1em 0.8em 0; 476 | align-items: center; 477 | } 478 | 479 | 480 | .slide-panel { 481 | width: calc(100% - 1em); 482 | max-width: 475px; 483 | transition: transform 0.35s ease; 484 | } 485 | 486 | .slide-panel[panel-open] { 487 | transform: translateX(0%); 488 | } 489 | 490 | .notice { 491 | margin: 1em 0; 492 | padding: 0.5em 0.9em 0.55em 0.65em; 493 | border-left: .5em solid; 494 | } 495 | 496 | .notice p { 497 | margin: 0.4em 0 0; 498 | } 499 | 500 | .note { 501 | background: #E9FBE9; 502 | border-color: #52E052; 503 | } 504 | .note .notice-link { 505 | display: block; 506 | color: #178217; 507 | } 508 | 509 | .issue { 510 | background: rgb(233, 240, 251); 511 | border-color: rgb(82, 127, 224); 512 | } 513 | .issue .notice-link:before { 514 | display: block; 515 | color: rgb(30, 76, 174); 516 | } 517 | 518 | .warning { 519 | background: #FBE9E9; 520 | border-color: #E05252; 521 | } 522 | .warning .notice-link { 523 | display: block; 524 | color: #AE1E1E; 525 | } 526 | 527 | .example { 528 | color: #cebe00; 529 | background: #1a1e23; 530 | border-left: 0.5em solid; 531 | } 532 | 533 | .example .notice-link { 534 | display: block; 535 | color: inherit; 536 | font-size: 1.1em; 537 | font-family: Heebo, san-serif; 538 | } 539 | 540 | .example pre[class*="language-"] { 541 | padding: 0; 542 | border-radius: 0; 543 | } 544 | 545 | .todo { 546 | background: #fbe4ff; 547 | border-color: #9700e2; 548 | } 549 | .todo .notice-link { 550 | display: block; 551 | color: #6d00a2; 552 | } 553 | 554 | .mermaid { 555 | display: flex; 556 | align-items: center; 557 | justify-content: center; 558 | margin: 1.5em 0 1.75em; 559 | } 560 | 561 | /* Spec References */ 562 | 563 | .reference-list { 564 | margin: 0; 565 | padding: 0; 566 | list-style: none; 567 | } 568 | 569 | .reference-list dd a, 570 | .reference-status { 571 | font-style: italic; 572 | } 573 | 574 | .reference-status { 575 | color: var(--green-status); 576 | } 577 | 578 | .tippy-box .reference-status { 579 | color: var(--light-green-status); 580 | } 581 | 582 | /* Terminology References */ 583 | 584 | pre, 585 | code[class*="language-"], 586 | pre[class*="language-"] { 587 | font-size: 0.9em; 588 | margin: 1em 0 1.5em; 589 | border-radius: 3px; 590 | } 591 | 592 | .example pre, 593 | .example code[class*="language-"], 594 | .example pre[class*="language-"] { 595 | margin: 0; 596 | } 597 | 598 | #svg { 599 | display: none; 600 | } 601 | 602 | #header { 603 | position: sticky; 604 | position: -webkit-sticky; 605 | padding: 0; 606 | top: 0; 607 | margin: -0.5em -2em 0em -2em; 608 | background: rgba(255,255,255,0.9); 609 | border-bottom: 1px solid rgba(0,0,0,0.175); 610 | box-shadow: 0px 1px 3px 1px rgba(0,0,0,0.1); 611 | z-index: 2; 612 | } 613 | 614 | #logo { 615 | box-sizing: border-box; 616 | display: flex; 617 | align-items: center; 618 | height: 100%; 619 | padding: 0.5em; 620 | } 621 | 622 | #logo img { 623 | height: 100%; 624 | } 625 | 626 | 627 | #logo + span { 628 | margin-left: auto; 629 | } 630 | 631 | #header #toc_toggle { 632 | display: none; 633 | padding: 0 1em; 634 | border-right: 1px solid rgba(0,0,0,0.15); 635 | } 636 | 637 | #content { 638 | max-width: 800px; 639 | } 640 | 641 | #content h1:first-of-type { 642 | margin: 1em 0 0.5em; 643 | } 644 | 645 | #content h1:first-of-type .markdownIt-Anchor { 646 | display: none; 647 | } 648 | 649 | #repo_issues { 650 | width: calc(100% - 1.5em); 651 | max-width: 450px; 652 | border-left: 1px solid rgba(0,0,0,0.15); 653 | } 654 | 655 | #repo_issues > header { 656 | background: #eee; 657 | border-bottom: 1px solid #ddd; 658 | } 659 | 660 | #repo_issues > header span:first-of-type { 661 | font-weight: bold; 662 | padding-top: 0.1em; 663 | } 664 | 665 | #repo_issues > header .repo-issue-toggle { 666 | margin-left: auto; 667 | color: inherit; 668 | font-weight: bold; 669 | text-decoration: none; 670 | } 671 | 672 | #repo_issue_list { 673 | list-style: none; 674 | margin: 0; 675 | padding: 0 1.25em 1.25em; 676 | font-size: 0.85em; 677 | overflow: auto; 678 | -ms-overflow-style: none; /* Internet Explorer 10+ */ 679 | scrollbar-width: none; /* Firefox */ 680 | } 681 | #repo_issue_list::-webkit-scrollbar { 682 | display: none; /* Safari and Chrome */ 683 | } 684 | 685 | #repo_issue_list:empty:before { 686 | content: "No issues found"; 687 | display: block; 688 | text-align: center; 689 | font-size: 1.1em; 690 | color: #aaa; 691 | margin: 1em 0 0; 692 | } 693 | 694 | .repo-issue detail-box { 695 | display: flex; 696 | flex-direction: column; 697 | padding: 1em 0; 698 | border-bottom: 1px solid #ddd; 699 | } 700 | 701 | .repo-issue detail-box > section { 702 | order: 1; 703 | } 704 | 705 | .repo-issue detail-box > section:empty + .repo-issue-title [detail-box-toggle] { 706 | display: none; 707 | } 708 | 709 | .repo-issue-title { 710 | display: flex; 711 | align-items: center; 712 | } 713 | 714 | .repo-issue-link { 715 | flex: 1; 716 | margin: 0 0 0 0.5em; 717 | } 718 | 719 | .repo-issue-number { 720 | height: 1em; 721 | margin: 0 0.4em 0 0; 722 | padding: 0.3em 0.25em 0; 723 | border-radius: 3px; 724 | font-weight: bold; 725 | background: #eee; 726 | border: 1px solid #ddd; 727 | text-align: center; 728 | line-height: 1em; 729 | } 730 | 731 | .repo-issue-number:before { 732 | content: "#"; 733 | font-weight: normal; 734 | margin: 0 0.1em 0 0; 735 | } 736 | 737 | .repo-issue [detail-box-toggle] { 738 | margin: 0 0 0 1em; 739 | opacity: 0.35; 740 | transition: opacity 0.4s; 741 | } 742 | 743 | .repo-issue [detail-box-toggle]:hover, 744 | .repo-issue detail-box[open] [detail-box-toggle] { 745 | opacity: 1; 746 | } 747 | 748 | #toc { 749 | display: flex; 750 | flex-direction: column; 751 | width: 25%; 752 | max-width: 325px; 753 | min-width: 275px; 754 | background: #eceff1; 755 | } 756 | 757 | #toc header { 758 | color: var(--themed-element-text); 759 | background: var(--themed-element-bk); 760 | box-shadow: 0px 1px 3px 0px rgba(0,0,0,0.3); 761 | border: var(--themed-element-border); 762 | border-top: none; 763 | border-left: none; 764 | } 765 | 766 | #toc header [panel-toggle] { 767 | display: none; 768 | height: var(--header-height); 769 | line-height: var(--header-height); 770 | margin-left: auto; 771 | padding: 0 1em; 772 | color: inherit; 773 | font-weight: bold; 774 | text-decoration: none; 775 | } 776 | 777 | #toc_list { 778 | flex: 1; 779 | padding: 1em 0.8em; 780 | overflow: auto; 781 | } 782 | 783 | .toc { 784 | padding: 0 0 1.75em; 785 | font-size: 0.85em; 786 | } 787 | 788 | .toc, .toc ul { 789 | margin: 0; 790 | list-style: none; 791 | } 792 | 793 | .toc ul { 794 | padding: 0 0 0 1em; 795 | } 796 | 797 | .toc a { 798 | display: block; 799 | padding: 0.4em 0.3em 0.225em; 800 | text-decoration: none; 801 | border-radius: 3px; 802 | color: #333; 803 | } 804 | 805 | .toc a:before { 806 | color: #000; 807 | font-weight: bold; 808 | } 809 | 810 | .toc a:hover { 811 | text-shadow: 0px 1px 1px #fff; 812 | background: rgba(0,0,0,0.1); 813 | } 814 | 815 | .toc > li a:before { 816 | counter-increment: toc1; 817 | content: counter(toc1) "."; 818 | padding: 0 0.4em 0 0.2em; 819 | } 820 | 821 | .toc > li > ul { 822 | counter-reset: toc2; 823 | } 824 | 825 | .toc > li > ul > li a:before { 826 | counter-increment: toc2; 827 | content: counter(toc1) "." counter(toc2); 828 | padding: 0 0.45em 0 0.2em; 829 | } 830 | 831 | .toc > li > ul ul { 832 | counter-reset: toc3; 833 | } 834 | 835 | .toc > li > ul ul li a:before { 836 | counter-increment: toc3; 837 | content: counter(toc1) "." counter(toc2) "." counter(toc3); 838 | padding: 0 0.5em 0 0.2em; 839 | } 840 | 841 | @media (min-width: 900px) { 842 | 843 | slide-panel { 844 | z-index: 2; 845 | } 846 | 847 | #slidepanels[open="sidebar"]:before { 848 | opacity: 0; 849 | transition: none; 850 | pointer-events: none; 851 | } 852 | 853 | #slidepanels:before { 854 | z-index: 1; 855 | } 856 | 857 | #toc { 858 | transition: none; 859 | transform: translate3d(0%, 0%, 0); 860 | box-shadow: 0 0 5px 1px rgba(0,0,0,0.15) inset; 861 | z-index: 0; 862 | } 863 | } 864 | 865 | @media (max-width: 900px) { 866 | 867 | main { 868 | width: 100%; 869 | min-width: auto; 870 | max-width: none; 871 | padding: 0.5em 1.25em 1.5em 1.25em; 872 | } 873 | 874 | #header { 875 | margin: -0.5em -1.25em 0em -1.25em; 876 | } 877 | 878 | #toc header [panel-toggle] { 879 | display: block; 880 | } 881 | 882 | #header #toc_toggle { 883 | display: flex; 884 | } 885 | } 886 | 887 | @media (max-width: 550px) { 888 | 889 | td { 890 | font-size: 0.8em; 891 | } 892 | 893 | } 894 | 895 | @keyframes display-show { 896 | 0% { 897 | display: none; 898 | opacity: 0; 899 | } 900 | 1% { 901 | display: block; 902 | } 903 | 100% { 904 | opacity: 1; 905 | } 906 | } 907 | 908 | @keyframes highlight { 909 | 50% { 910 | background-color: yellow; 911 | } 912 | } -------------------------------------------------------------------------------- /assets/css/prism.css: -------------------------------------------------------------------------------- 1 | /* PrismJS 1.23.0 2 | https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+abnf+diff+git+http+js-extras+json+json5+js-templates+regex&plugins=line-numbers+highlight-keywords */ 3 | /** 4 | * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML 5 | * Based on https://github.com/chriskempson/tomorrow-theme 6 | * @author Rose Pritchard 7 | */ 8 | 9 | code[class*="language-"], 10 | pre[class*="language-"] { 11 | color: #ccc; 12 | background: none; 13 | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; 14 | font-size: 1em; 15 | text-align: left; 16 | white-space: pre; 17 | word-spacing: normal; 18 | word-break: normal; 19 | word-wrap: normal; 20 | line-height: 1.5; 21 | 22 | -moz-tab-size: 4; 23 | -o-tab-size: 4; 24 | tab-size: 4; 25 | 26 | -webkit-hyphens: none; 27 | -moz-hyphens: none; 28 | -ms-hyphens: none; 29 | hyphens: none; 30 | 31 | } 32 | 33 | /* Code blocks */ 34 | pre[class*="language-"] { 35 | padding: 1em; 36 | margin: .5em 0; 37 | overflow: auto; 38 | } 39 | 40 | :not(pre) > code[class*="language-"], 41 | pre[class*="language-"] { 42 | background: #2d2d2d; 43 | } 44 | 45 | /* Inline code */ 46 | :not(pre) > code[class*="language-"] { 47 | padding: .1em; 48 | border-radius: .3em; 49 | white-space: normal; 50 | } 51 | 52 | .token.comment, 53 | .token.block-comment, 54 | .token.prolog, 55 | .token.doctype, 56 | .token.cdata { 57 | color: #999; 58 | } 59 | 60 | .token.punctuation { 61 | color: #ccc; 62 | } 63 | 64 | .token.tag, 65 | .token.attr-name, 66 | .token.namespace, 67 | .token.deleted { 68 | color: #e2777a; 69 | } 70 | 71 | .token.function-name { 72 | color: #6196cc; 73 | } 74 | 75 | .token.boolean, 76 | .token.number, 77 | .token.function { 78 | color: #f08d49; 79 | } 80 | 81 | .token.property, 82 | .token.class-name, 83 | .token.constant, 84 | .token.symbol { 85 | color: #f8c555; 86 | } 87 | 88 | .token.selector, 89 | .token.important, 90 | .token.atrule, 91 | .token.keyword, 92 | .token.builtin { 93 | color: #cc99cd; 94 | } 95 | 96 | .token.string, 97 | .token.char, 98 | .token.attr-value, 99 | .token.regex, 100 | .token.variable { 101 | color: #7ec699; 102 | } 103 | 104 | .token.operator, 105 | .token.entity, 106 | .token.url { 107 | color: #67cdcc; 108 | } 109 | 110 | .token.important, 111 | .token.bold { 112 | font-weight: bold; 113 | } 114 | .token.italic { 115 | font-style: italic; 116 | } 117 | 118 | .token.entity { 119 | cursor: help; 120 | } 121 | 122 | .token.inserted { 123 | color: green; 124 | } 125 | 126 | pre[class*="language-"].line-numbers { 127 | position: relative; 128 | padding-left: 3.8em; 129 | counter-reset: linenumber; 130 | } 131 | 132 | pre[class*="language-"].line-numbers > code { 133 | position: relative; 134 | white-space: inherit; 135 | } 136 | 137 | .line-numbers .line-numbers-rows { 138 | position: absolute; 139 | pointer-events: none; 140 | top: 0; 141 | font-size: 100%; 142 | left: -3.8em; 143 | width: 3em; /* works for line-numbers below 1000 lines */ 144 | letter-spacing: -1px; 145 | border-right: 1px solid #999; 146 | 147 | -webkit-user-select: none; 148 | -moz-user-select: none; 149 | -ms-user-select: none; 150 | user-select: none; 151 | 152 | } 153 | 154 | .line-numbers-rows > span { 155 | display: block; 156 | counter-increment: linenumber; 157 | } 158 | 159 | .line-numbers-rows > span:before { 160 | content: counter(linenumber); 161 | color: #999; 162 | display: block; 163 | padding-right: 0.8em; 164 | text-align: right; 165 | } 166 | -------------------------------------------------------------------------------- /assets/icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /assets/js/custom-elements.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | customElements.define('slide-panels', class SidePanels extends HTMLElement { 5 | static get observedAttributes() { 6 | return ['open']; 7 | } 8 | constructor() { 9 | super(); 10 | 11 | this.addEventListener('pointerup', e => { 12 | if (e.target === this) this.close(); 13 | }) 14 | } 15 | get active (){ 16 | return this.getAttribute('open'); 17 | } 18 | toggle(panel){ 19 | this.active === panel ? this.close() : this.open(panel) 20 | } 21 | open (panel){ 22 | this.setAttribute('open', panel); 23 | } 24 | close (){ 25 | this.removeAttribute('open'); 26 | } 27 | attributeChangedCallback(attr, last, current) { 28 | switch(attr) { 29 | case 'open': for (let child of this.children) { 30 | if (child.id === current) child.setAttribute('open', ''); 31 | else child.removeAttribute('open', ''); 32 | } 33 | break; 34 | } 35 | } 36 | }); 37 | 38 | customElements.define('detail-box', class DetailBox extends HTMLElement { 39 | static get observedAttributes() { 40 | return ['open']; 41 | } 42 | constructor() { 43 | super(); 44 | 45 | this.addEventListener('pointerup', e => { 46 | if (e.target.hasAttribute('detail-box-toggle')) { 47 | e.stopPropagation(); 48 | this.toggle(); 49 | } 50 | }); 51 | 52 | this.addEventListener('transitionend', e => { 53 | let node = e.target; 54 | if (node.parentElement === this && node.tagName === 'SECTION' && e.propertyName === 'height') { 55 | node.style.height = this.hasAttribute('open') ? 'auto' : null; 56 | } 57 | }); 58 | } 59 | toggle(){ 60 | this.toggleAttribute('open'); 61 | } 62 | attributeChangedCallback(attr, last, current) { 63 | switch(attr) { 64 | case 'open': 65 | for (let node of this.children) { 66 | if (node.tagName === 'SECTION') { 67 | if (current !== null) { 68 | if (node.offsetHeight < node.scrollHeight) { 69 | node.style.height = node.scrollHeight + 'px'; 70 | } 71 | } 72 | else if (node.offsetHeight > 0) { 73 | node.style.height = node.offsetHeight + 'px'; 74 | let scroll = this.scrollHeight; 75 | node.style.height = 0; 76 | } 77 | break; 78 | } 79 | } 80 | } 81 | } 82 | }); 83 | 84 | customElements.define('tab-panels', class TabPanels extends HTMLElement { 85 | constructor() { 86 | super(); 87 | delegateEvent('click', 'tab-panels > nav > *', (e, delegate) => { 88 | let nav = delegate.parentElement; 89 | if (nav.parentElement === this) { 90 | this.setAttribute('selected-index', Array.prototype.indexOf.call(nav.children, delegate)) 91 | } 92 | }, { container: this, passive: true }); 93 | } 94 | static get observedAttributes() { 95 | return ['selected-index']; 96 | } 97 | attributeChangedCallback(attr, last, current) { 98 | domReady.then(() => { 99 | switch(attr) { 100 | case 'selected-index': 101 | let index = current || 0; 102 | let nav = this.querySelector('nav'); 103 | if (nav.parentElement === this) { 104 | let tabs = nav.children; 105 | let selected = tabs[index]; 106 | for (let tab of tabs) tab.removeAttribute('selected'); 107 | if (selected) selected.setAttribute('selected', ''); 108 | let panel = Array.prototype.filter.call(this.children, node => { 109 | if (node.tagName === 'SECTION') { 110 | node.removeAttribute('selected'); 111 | return true; 112 | } 113 | })[index]; 114 | if (panel) panel.setAttribute('selected', ''); 115 | } 116 | break; 117 | } 118 | }); 119 | } 120 | }); -------------------------------------------------------------------------------- /assets/js/font-awesome.js: -------------------------------------------------------------------------------- 1 | window.FontAwesomeKitConfig = {"asyncLoading":{"enabled":true},"autoA11y":{"enabled":true},"baseUrl":"https://kit-free.fontawesome.com","detectConflictsUntil":null,"license":"free","method":"css","minify":{"enabled":true},"v4FontFaceShim":{"enabled":true},"v4shim":{"enabled":false},"version":"latest"}; 2 | !function(){function r(e){var t,n=[],i=document,o=i.documentElement.doScroll,r="DOMContentLoaded",a=(o?/^loaded|^c/:/^loaded|^i|^c/).test(i.readyState);a||i.addEventListener(r,t=function(){for(i.removeEventListener(r,t),a=1;t=n.shift();)t()}),a?setTimeout(e,0):n.push(e)}!function(){if(!(void 0===window.Element||"classList"in document.documentElement)){var e,t,n,i=Array.prototype,o=i.push,r=i.splice,a=i.join;d.prototype={add:function(e){this.contains(e)||(o.call(this,e),this.el.className=this.toString())},contains:function(e){return-1!=this.el.className.indexOf(e)},item:function(e){return this[e]||null},remove:function(e){if(this.contains(e)){for(var t=0;t { 9 | slidepanels.toggle(delegate.getAttribute('panel-toggle')); 10 | }, { passive: true }); 11 | 12 | window.addEventListener('hashchange', (e) => slidepanels.close()); 13 | 14 | /* GitHub Issues */ 15 | 16 | let source = specConfig.source; 17 | if (source) { 18 | if (source.host === 'github') { 19 | fetch(`https://api.github.com/repos/${ source.account + '/' + source.repo }/issues`) 20 | .then(response => response.json()) 21 | .then(issues => { 22 | let count = issues.length; 23 | document.querySelectorAll('[issue-count]').forEach(node => { 24 | node.setAttribute('issue-count', count) 25 | }); 26 | repo_issue_list.innerHTML = issues.map(issue => { 27 | return `
  • 28 | 29 |
    ${markdown.render(issue.body || '')}
    30 |
    31 | ${issue.number} 32 | 33 | ${issue.title} 34 | 35 | 36 |
    37 |
    38 |
  • ` 39 | }).join(''); 40 | Prism.highlightAllUnder(repo_issue_list); 41 | }) 42 | } 43 | } 44 | //${markdown.render(issue.body)} 45 | 46 | /* Mermaid Diagrams */ 47 | 48 | mermaid.initialize({ 49 | startOnLoad: true, 50 | theme: 'neutral' 51 | }); 52 | 53 | /* Charts */ 54 | 55 | document.querySelectorAll('.chartjs').forEach(chart => { 56 | new Chart(chart, JSON.parse(chart.textContent)); 57 | }); 58 | 59 | /* Tooltips */ 60 | let tipMap = new WeakMap(); 61 | delegateEvent('pointerover', '.term-reference, .spec-reference', (e, anchor) => { 62 | let term = document.getElementById((anchor.getAttribute('href') || '').replace('#', '')); 63 | if (!term || tipMap.has(anchor)) return; 64 | let container = term.closest('dt, td:first-child'); 65 | if (!container) return; 66 | let tip = { 67 | allowHTML: true, 68 | inlinePositioning: true 69 | } 70 | switch (container.tagName) { 71 | case 'DT': 72 | tip.content = container.nextElementSibling.textContent; 73 | break; 74 | case 'TD': 75 | let table = container.closest('table'); 76 | let tds = Array.from(container.closest('tr').children); 77 | tds.shift(); 78 | if (table) { 79 | let headings = Array.from(table.querySelectorAll('thead th')); 80 | headings.shift(); 81 | if (headings.length) { 82 | tip.content = ` 83 |
    ${container.textContent}
    84 | 85 | ${headings.map((th, i) => { 86 | return `` 87 | }).join('')} 88 |
    ${th.textContent}:${tds[i] ? tds[i].textContent : ''}
    `; 89 | } 90 | } 91 | break; 92 | } 93 | if (tip.content) tipMap.set(anchor, tippy(anchor, tip)); 94 | }, { passive: true }); 95 | 96 | })(); 97 | -------------------------------------------------------------------------------- /assets/js/popper.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @popperjs/core v2.5.3 - MIT License 3 | */ 4 | 5 | "use strict";!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).Popper={})}(this,(function(e){function t(e){return{width:(e=e.getBoundingClientRect()).width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function n(e){return"[object Window]"!==e.toString()?(e=e.ownerDocument)&&e.defaultView||window:e}function r(e){return{scrollLeft:(e=n(e)).pageXOffset,scrollTop:e.pageYOffset}}function o(e){return e instanceof n(e).Element||e instanceof Element}function i(e){return e instanceof n(e).HTMLElement||e instanceof HTMLElement}function a(e){return e?(e.nodeName||"").toLowerCase():null}function s(e){return((o(e)?e.ownerDocument:e.document)||window.document).documentElement}function f(e){return t(s(e)).left+r(e).scrollLeft}function c(e){return n(e).getComputedStyle(e)}function p(e){return e=c(e),/auto|scroll|overlay|hidden/.test(e.overflow+e.overflowY+e.overflowX)}function l(e,o,c){void 0===c&&(c=!1);var l=s(o);e=t(e);var u=i(o),d={scrollLeft:0,scrollTop:0},m={x:0,y:0};return(u||!u&&!c)&&(("body"!==a(o)||p(l))&&(d=o!==n(o)&&i(o)?{scrollLeft:o.scrollLeft,scrollTop:o.scrollTop}:r(o)),i(o)?((m=t(o)).x+=o.clientLeft,m.y+=o.clientTop):l&&(m.x=f(l))),{x:e.left+d.scrollLeft-m.x,y:e.top+d.scrollTop-m.y,width:e.width,height:e.height}}function u(e){return{x:e.offsetLeft,y:e.offsetTop,width:e.offsetWidth,height:e.offsetHeight}}function d(e){return"html"===a(e)?e:e.assignedSlot||e.parentNode||e.host||s(e)}function m(e,t){void 0===t&&(t=[]);var r=function e(t){return 0<=["html","body","#document"].indexOf(a(t))?t.ownerDocument.body:i(t)&&p(t)?t:e(d(t))}(e);e="body"===a(r);var o=n(r);return r=e?[o].concat(o.visualViewport||[],p(r)?r:[]):r,t=t.concat(r),e?t:t.concat(m(d(r)))}function h(e){if(!i(e)||"fixed"===c(e).position)return null;if(e=e.offsetParent){var t=s(e);if("body"===a(e)&&"static"===c(e).position&&"static"!==c(t).position)return t}return e}function g(e){for(var t=n(e),r=h(e);r&&0<=["table","td","th"].indexOf(a(r))&&"static"===c(r).position;)r=h(r);if(r&&"body"===a(r)&&"static"===c(r).position)return t;if(!r)e:{for(e=d(e);i(e)&&0>["html","body"].indexOf(a(e));){if("none"!==(r=c(e)).transform||"none"!==r.perspective||r.willChange&&"auto"!==r.willChange){r=e;break e}e=e.parentNode}r=null}return r||t}function v(e){var t=new Map,n=new Set,r=[];return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||function e(o){n.add(o.name),[].concat(o.requires||[],o.requiresIfExists||[]).forEach((function(r){n.has(r)||(r=t.get(r))&&e(r)})),r.push(o)}(e)})),r}function b(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=void 0,n(e())}))}))),t}}function y(e){return e.split("-")[0]}function O(e,t){var r=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(r instanceof n(r).ShadowRoot||r instanceof ShadowRoot)do{if(t&&e.isSameNode(t))return!0;t=t.parentNode||t.host}while(t);return!1}function w(e){return Object.assign(Object.assign({},e),{},{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function x(e,o){if("viewport"===o){o=n(e);var a=s(e);o=o.visualViewport;var p=a.clientWidth;a=a.clientHeight;var l=0,u=0;o&&(p=o.width,a=o.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(l=o.offsetLeft,u=o.offsetTop)),e=w(e={width:p,height:a,x:l+f(e),y:u})}else i(o)?((e=t(o)).top+=o.clientTop,e.left+=o.clientLeft,e.bottom=e.top+o.clientHeight,e.right=e.left+o.clientWidth,e.width=o.clientWidth,e.height=o.clientHeight,e.x=e.left,e.y=e.top):(u=s(e),e=s(u),l=r(u),o=u.ownerDocument.body,p=Math.max(e.scrollWidth,e.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),a=Math.max(e.scrollHeight,e.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),u=-l.scrollLeft+f(u),l=-l.scrollTop,"rtl"===c(o||e).direction&&(u+=Math.max(e.clientWidth,o?o.clientWidth:0)-p),e=w({width:p,height:a,x:u,y:l}));return e}function j(e,t,n){return t="clippingParents"===t?function(e){var t=m(d(e)),n=0<=["absolute","fixed"].indexOf(c(e).position)&&i(e)?g(e):e;return o(n)?t.filter((function(e){return o(e)&&O(e,n)&&"body"!==a(e)})):[]}(e):[].concat(t),(n=(n=[].concat(t,[n])).reduce((function(t,n){return n=x(e,n),t.top=Math.max(n.top,t.top),t.right=Math.min(n.right,t.right),t.bottom=Math.min(n.bottom,t.bottom),t.left=Math.max(n.left,t.left),t}),x(e,n[0]))).width=n.right-n.left,n.height=n.bottom-n.top,n.x=n.left,n.y=n.top,n}function M(e){return 0<=["top","bottom"].indexOf(e)?"x":"y"}function E(e){var t=e.reference,n=e.element,r=(e=e.placement)?y(e):null;e=e?e.split("-")[1]:null;var o=t.x+t.width/2-n.width/2,i=t.y+t.height/2-n.height/2;switch(r){case"top":o={x:o,y:t.y-n.height};break;case"bottom":o={x:o,y:t.y+t.height};break;case"right":o={x:t.x+t.width,y:i};break;case"left":o={x:t.x-n.width,y:i};break;default:o={x:t.x,y:t.y}}if(null!=(r=r?M(r):null))switch(i="y"===r?"height":"width",e){case"start":o[r]=Math.floor(o[r])-Math.floor(t[i]/2-n[i]/2);break;case"end":o[r]=Math.floor(o[r])+Math.ceil(t[i]/2-n[i]/2)}return o}function D(e){return Object.assign(Object.assign({},{top:0,right:0,bottom:0,left:0}),e)}function P(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function L(e,n){void 0===n&&(n={});var r=n;n=void 0===(n=r.placement)?e.placement:n;var i=r.boundary,a=void 0===i?"clippingParents":i,f=void 0===(i=r.rootBoundary)?"viewport":i;i=void 0===(i=r.elementContext)?"popper":i;var c=r.altBoundary,p=void 0!==c&&c;r=D("number"!=typeof(r=void 0===(r=r.padding)?0:r)?r:P(r,T));var l=e.elements.reference;c=e.rects.popper,a=j(o(p=e.elements[p?"popper"===i?"reference":"popper":i])?p:p.contextElement||s(e.elements.popper),a,f),p=E({reference:f=t(l),element:c,strategy:"absolute",placement:n}),c=w(Object.assign(Object.assign({},c),p)),f="popper"===i?c:f;var u={top:a.top-f.top+r.top,bottom:f.bottom-a.bottom+r.bottom,left:a.left-f.left+r.left,right:f.right-a.right+r.right};if(e=e.modifiersData.offset,"popper"===i&&e){var d=e[n];Object.keys(u).forEach((function(e){var t=0<=["right","bottom"].indexOf(e)?1:-1,n=0<=["top","bottom"].indexOf(e)?"y":"x";u[e]+=d[n]*t}))}return u}function k(){for(var e=arguments.length,t=Array(e),n=0;n(v.devicePixelRatio||1)?"translate("+e+"px, "+l+"px)":"translate3d("+e+"px, "+l+"px, 0)",d)):Object.assign(Object.assign({},r),{},((t={})[h]=a?l+"px":"",t[m]=u?e+"px":"",t.transform="",t))}function A(e){return e.replace(/left|right|bottom|top/g,(function(e){return G[e]}))}function H(e){return e.replace(/start|end/g,(function(e){return J[e]}))}function R(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function S(e){return["top","right","bottom","left"].some((function(t){return 0<=e[t]}))}var T=["top","bottom","right","left"],q=T.reduce((function(e,t){return e.concat([t+"-start",t+"-end"])}),[]),C=[].concat(T,["auto"]).reduce((function(e,t){return e.concat([t,t+"-start",t+"-end"])}),[]),N="beforeRead read afterRead beforeMain main afterMain beforeWrite write afterWrite".split(" "),V={placement:"bottom",modifiers:[],strategy:"absolute"},I={passive:!0},_={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,r=e.instance,o=(e=e.options).scroll,i=void 0===o||o,a=void 0===(e=e.resize)||e,s=n(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&f.forEach((function(e){e.addEventListener("scroll",r.update,I)})),a&&s.addEventListener("resize",r.update,I),function(){i&&f.forEach((function(e){e.removeEventListener("scroll",r.update,I)})),a&&s.removeEventListener("resize",r.update,I)}},data:{}},U={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state;t.modifiersData[e.name]=E({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},z={top:"auto",right:"auto",bottom:"auto",left:"auto"},F={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options;e=void 0===(e=n.gpuAcceleration)||e,n=void 0===(n=n.adaptive)||n,e={placement:y(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:e},null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign(Object.assign({},t.styles.popper),W(Object.assign(Object.assign({},e),{},{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:n})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign(Object.assign({},t.styles.arrow),W(Object.assign(Object.assign({},e),{},{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1})))),t.attributes.popper=Object.assign(Object.assign({},t.attributes.popper),{},{"data-popper-placement":t.placement})},data:{}},X={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];i(o)&&a(o)&&(Object.assign(o.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],o=t.attributes[e]||{};e=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{}),i(r)&&a(r)&&(Object.assign(r.style,e),Object.keys(o).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]},Y={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.name,r=void 0===(e=e.options.offset)?[0,0]:e,o=(e=C.reduce((function(e,n){var o=t.rects,i=y(n),a=0<=["left","top"].indexOf(i)?-1:1,s="function"==typeof r?r(Object.assign(Object.assign({},o),{},{placement:n})):r;return o=(o=s[0])||0,s=((s=s[1])||0)*a,i=0<=["left","right"].indexOf(i)?{x:s,y:o}:{x:o,y:s},e[n]=i,e}),{}))[t.placement],i=o.x;o=o.y,null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=i,t.modifiersData.popperOffsets.y+=o),t.modifiersData[n]=e}},G={left:"right",right:"left",bottom:"top",top:"bottom"},J={start:"end",end:"start"},K={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;if(e=e.name,!t.modifiersData[e]._skip){var r=n.mainAxis;r=void 0===r||r;var o=n.altAxis;o=void 0===o||o;var i=n.fallbackPlacements,a=n.padding,s=n.boundary,f=n.rootBoundary,c=n.altBoundary,p=n.flipVariations,l=void 0===p||p,u=n.allowedAutoPlacements;p=y(n=t.options.placement),i=i||(p!==n&&l?function(e){if("auto"===y(e))return[];var t=A(e);return[H(e),t,H(t)]}(n):[A(n)]);var d=[n].concat(i).reduce((function(e,n){return e.concat("auto"===y(n)?function(e,t){void 0===t&&(t={});var n=t.boundary,r=t.rootBoundary,o=t.padding,i=t.flipVariations,a=t.allowedAutoPlacements,s=void 0===a?C:a,f=t.placement.split("-")[1];0===(i=(t=f?i?q:q.filter((function(e){return e.split("-")[1]===f})):T).filter((function(e){return 0<=s.indexOf(e)}))).length&&(i=t);var c=i.reduce((function(t,i){return t[i]=L(e,{placement:i,boundary:n,rootBoundary:r,padding:o})[y(i)],t}),{});return Object.keys(c).sort((function(e,t){return c[e]-c[t]}))}(t,{placement:n,boundary:s,rootBoundary:f,padding:a,flipVariations:l,allowedAutoPlacements:u}):n)}),[]);n=t.rects.reference,i=t.rects.popper;var m=new Map;p=!0;for(var h=d[0],g=0;gi[x]&&(O=A(O)),x=A(O),w=[],r&&w.push(0>=j[b]),o&&w.push(0>=j[O],0>=j[x]),w.every((function(e){return e}))){h=v,p=!1;break}m.set(v,w)}if(p)for(r=function(e){var t=d.find((function(t){if(t=m.get(t))return t.slice(0,e).every((function(e){return e}))}));if(t)return h=t,"break"},o=l?3:1;0=l.reach);y+=m.value.length,m=m.next){var b=m.value;if(t.length>n.length)return;if(!(b instanceof W)){var k,x=1;if(h){if(!(k=z(v,y,n,f)))break;var w=k.index,A=k.index+k[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(Pl.reach&&(l.reach=N);var j=m.prev;O&&(j=I(t,j,O),y+=O.length),q(t,j,x);var C=new W(o,g?M.tokenize(S,g):S,d,S);if(m=I(t,j,C),L&&I(t,m,L),1l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a"+a.content+""},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var t=M.util.currentScript();function r(){M.manual||M.highlightAll()}if(t&&(M.filename=t.src,t.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var a=document.readyState;"loading"===a||"interactive"===a&&t&&t.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); 4 | Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; 5 | !function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); 6 | Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; 7 | Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; 8 | !function(n){var i="(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";Prism.languages.abnf={comment:/;.*/,string:{pattern:/(?:%[is])?"[^"\n\r]*"/,greedy:!0,inside:{punctuation:/^%[is]/}},range:{pattern:/%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,alias:"number"},terminal:{pattern:/%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,alias:"number"},repetition:{pattern:/(^|[^\w-])(?:\d*\*\d*|\d+)/,lookbehind:!0,alias:"operator"},definition:{pattern:/(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,lookbehind:!0,alias:"keyword",inside:{punctuation:/<|>/}},"core-rule":{pattern:RegExp("(?:(^|[^<\\w-])"+i+"|<"+i+">)(?![\\w-])","i"),lookbehind:!0,alias:["rule","constant"],inside:{punctuation:/<|>/}},rule:{pattern:/(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,lookbehind:!0,inside:{punctuation:/<|>/}},operator:/=\/?|\//,punctuation:/[()\[\]]/}}(); 9 | !function(i){i.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var r={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(r).forEach(function(e){var n=r[e],a=[];/^\w+$/.test(e)||a.push(/\w+/.exec(e)[0]),"diff"===e&&a.push("bold"),i.languages.diff[e]={pattern:RegExp("^(?:["+n+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(e)[0]}}}}),Object.defineProperty(i.languages.diff,"PREFIXES",{value:r})}(Prism); 10 | Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/m,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/m}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m}; 11 | !function(t){t.languages.http={"request-line":{pattern:/^(?:GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH|PRI|SEARCH)\s(?:https?:\/\/|\/)\S*\sHTTP\/[0-9.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:t.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[0-9.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[0-9.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[0-9.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},"header-name":{pattern:/^[\w-]+:(?=.)/m,alias:"keyword"}};var a,e,s,n=t.languages,r={"application/javascript":n.javascript,"application/json":n.json||n.javascript,"application/xml":n.xml,"text/xml":n.xml,"text/html":n.html,"text/css":n.css},i={"application/json":!0,"application/xml":!0};for(var p in r)if(r[p]){a=a||{};var o=i[p]?(void 0,s=(e=p).replace(/^[a-z]+\//,""),"(?:"+e+"|\\w+/(?:[\\w.-]+\\+)+"+s+"(?![+\\w.-]))"):p;a[p.replace(/\//g,"-")]={pattern:RegExp("(content-type:\\s*"+o+"(?:(?:\\r\\n?|\\n).+)*)(?:\\r?\\n|\\r){2}[\\s\\S]*","i"),lookbehind:!0,inside:r[p]}}a&&t.languages.insertBefore("http","header-name",a)}(Prism); 12 | !function(a){function e(a,e){return RegExp(a.replace(//g,function(){return"(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*"}),e)}a.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+a.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),a.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+a.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),a.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:(?:Uint|Int)(?:8|16|32)|Uint8Clamped|Float(?:32|64))?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|(?:Weak)?(?:Set|Map)|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),a.languages.insertBefore("javascript","keyword",{imports:{pattern:e("(\\bimport\\b\\s*)(?:(?:\\s*,\\s*(?:\\*\\s*as\\s+|\\{[^{}]*\\}))?|\\*\\s*as\\s+|\\{[^{}]*\\})(?=\\s*\\bfrom\\b)"),lookbehind:!0,inside:a.languages.javascript},exports:{pattern:e("(\\bexport\\b\\s*)(?:\\*(?:\\s*as\\s+)?(?=\\s*\\bfrom\\b)|\\{[^{}]*\\})"),lookbehind:!0,inside:a.languages.javascript}}),a.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|for|finally|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),a.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),a.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:e("(\\.\\s*)#?"),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|location|navigator|performance|(?:local|session)Storage|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],r=0;r=v.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=v[f],i="string"==typeof r?r:r.content,s=i.indexOf(a);if(-1!==s){++f;var o=i.substring(0,s),p=d(y[a]),l=i.substring(s+a.length),g=[];if(o&&g.push(o),g.push(p),l){var u=[l];e(u),g.push.apply(g,u)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(g)),n+=g.length-1):r.content=g}}else{var c=r.content;Array.isArray(c)?e(c):e([c])}}}(n),new u.Token(i,n,"language-"+i,a)}u.languages.javascript["template-string"]=[t("css","\\b(?:styled(?:\\([^)]*\\))?(?:\\s*\\.\\s*\\w+(?:\\([^)]*\\))*)*|css(?:\\s*\\.\\s*(?:global|resolve))?|createGlobalStyle|keyframes)"),t("html","\\bhtml|\\.\\s*(?:inner|outer)HTML\\s*\\+?="),t("svg","\\bsvg"),t("markdown","\\b(?:md|markdown)"),t("graphql","\\b(?:gql|graphql(?:\\s*\\.\\s*experimental)?)"),t("sql","\\bsql"),e].filter(Boolean);var o={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}u.hooks.add("after-tokenize",function(e){e.language in o&&!function e(t){for(var n=0,r=t.length;n']+(?=[>']$)/,lookbehind:!0,alias:"variable"};a.languages.regex={charset:{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"charset-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"charset-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:s,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":e,charclass:{pattern:/\\[wsd]|\\p{[^{}]+}/i,alias:"class-name"},escape:n}},"special-escape":e,charclass:{pattern:/\.|\\[wsd]|\\p{[^{}]+}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":i}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|");(i=document.createElement("span")).setAttribute("aria-hidden","true"),i.className="line-numbers-rows",i.innerHTML=l,t.hasAttribute("data-start")&&(t.style.counterReset="linenumber "+(parseInt(t.getAttribute("data-start"),10)-1)),e.element.appendChild(i),u([t]),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0})}function u(e){if(0!=(e=e.filter(function(e){var n=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null}(e)["white-space"];return"pre-wrap"===n||"pre-line"===n})).length){var n=e.map(function(e){var n=e.querySelector("code"),t=e.querySelector(".line-numbers-rows");if(n&&t){var i=e.querySelector(".line-numbers-sizer"),r=n.textContent.split(a);i||((i=document.createElement("span")).className="line-numbers-sizer",n.appendChild(i)),i.innerHTML="0",i.style.display="block";var s=i.getBoundingClientRect().height;return i.innerHTML="",{element:e,lines:r,lineHeights:[],oneLinerHeight:s,sizer:i}}}).filter(Boolean);n.forEach(function(e){var i=e.sizer,n=e.lines,r=e.lineHeights,s=e.oneLinerHeight;r[n.length-1]=void 0,n.forEach(function(e,n){if(e&&1-1}function s(t,e){return"function"==typeof t?t.apply(void 0,e):t}function p(t,e){return 0===e?t:function(r){clearTimeout(n),n=setTimeout((function(){t(r)}),e)};var n}function u(t,e){var n=Object.assign({},t);return e.forEach((function(t){delete n[t]})),n}function c(t){return[].concat(t)}function f(t,e){-1===t.indexOf(e)&&t.push(e)}function l(t){return t.split("-")[0]}function d(t){return[].slice.call(t)}function v(){return document.createElement("div")}function m(t){return["Element","Fragment"].some((function(e){return a(t,e)}))}function g(t){return a(t,"MouseEvent")}function h(t){return!(!t||!t._tippy||t._tippy.reference!==t)}function b(t){return m(t)?[t]:function(t){return a(t,"NodeList")}(t)?d(t):Array.isArray(t)?t:d(document.querySelectorAll(t))}function y(t,e){t.forEach((function(t){t&&(t.style.transitionDuration=e+"ms")}))}function x(t,e){t.forEach((function(t){t&&t.setAttribute("data-state",e)}))}function w(t){var e=c(t)[0];return e&&e.ownerDocument||document}function E(t,e,n){var r=e+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(e){t[r](e,n)}))}var T={isTouch:!1},C=0;function A(){T.isTouch||(T.isTouch=!0,window.performance&&document.addEventListener("mousemove",O))}function O(){var t=performance.now();t-C<20&&(T.isTouch=!1,document.removeEventListener("mousemove",O)),C=t}function L(){var t=document.activeElement;if(h(t)){var e=t._tippy;t.blur&&!e.state.isVisible&&t.blur()}}var D=Object.assign({appendTo:function(){return document.body},aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(D);function M(t){var e=(t.plugins||[]).reduce((function(e,n){var r=n.name,i=n.defaultValue;return r&&(e[r]=void 0!==t[r]?t[r]:i),e}),{});return Object.assign({},t,{},e)}function V(t,e){var n=Object.assign({},e,{content:s(e.content,[t])},e.ignoreAttributes?{}:function(t,e){return(e?Object.keys(M(Object.assign({},D,{plugins:e}))):k).reduce((function(e,n){var r=(t.getAttribute("data-tippy-"+n)||"").trim();if(!r)return e;if("content"===n)e[n]=r;else try{e[n]=JSON.parse(r)}catch(t){e[n]=r}return e}),{})}(t,e.plugins));return n.aria=Object.assign({},D.aria,{},n.aria),n.aria={expanded:"auto"===n.aria.expanded?e.interactive:n.aria.expanded,content:"auto"===n.aria.content?e.interactive?null:"describedby":n.aria.content},n}function R(t,e){t.innerHTML=e}function j(t){var e=v();return!0===t?e.className="tippy-arrow":(e.className="tippy-svg-arrow",m(t)?e.appendChild(t):R(e,t)),e}function P(t,e){m(e.content)?(R(t,""),t.appendChild(e.content)):"function"!=typeof e.content&&(e.allowHTML?R(t,e.content):t.textContent=e.content)}function I(t){var e=t.firstElementChild,n=d(e.children);return{box:e,content:n.find((function(t){return t.classList.contains("tippy-content")})),arrow:n.find((function(t){return t.classList.contains("tippy-arrow")||t.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(t){return t.classList.contains("tippy-backdrop")}))}}function S(t){var e=v(),n=v();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=v();function i(n,r){var i=I(e),o=i.box,a=i.content,s=i.arrow;r.theme?o.setAttribute("data-theme",r.theme):o.removeAttribute("data-theme"),"string"==typeof r.animation?o.setAttribute("data-animation",r.animation):o.removeAttribute("data-animation"),r.inertia?o.setAttribute("data-inertia",""):o.removeAttribute("data-inertia"),o.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?o.setAttribute("role",r.role):o.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||P(a,t.props),r.arrow?s?n.arrow!==r.arrow&&(o.removeChild(s),o.appendChild(j(r.arrow))):o.appendChild(j(r.arrow)):s&&o.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),P(r,t.props),e.appendChild(n),n.appendChild(r),i(t.props,t.props),{popper:e,onUpdate:i}}S.$$tippy=!0;var B=1,H=[],U=[];function N(e,n){var a,u,m,h,b,C,A,O,L,k=V(e,Object.assign({},D,{},M((a=n,Object.keys(a).reduce((function(t,e){return void 0!==a[e]&&(t[e]=a[e]),t}),{}))))),R=!1,j=!1,P=!1,S=!1,N=[],_=p(bt,k.interactiveDebounce),z=w(k.triggerTarget||e),F=B++,W=(L=k.plugins).filter((function(t,e){return L.indexOf(t)===e})),X={id:F,reference:e,popper:v(),popperInstance:null,props:k,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:W,clearDelayTimeouts:function(){clearTimeout(u),clearTimeout(m),cancelAnimationFrame(h)},setProps:function(t){if(X.state.isDestroyed)return;it("onBeforeUpdate",[X,t]),gt();var n=X.props,r=V(e,Object.assign({},X.props,{},t,{ignoreAttributes:!0}));X.props=r,mt(),n.interactiveDebounce!==r.interactiveDebounce&&(st(),_=p(bt,r.interactiveDebounce));n.triggerTarget&&!r.triggerTarget?c(n.triggerTarget).forEach((function(t){t.removeAttribute("aria-expanded")})):r.triggerTarget&&e.removeAttribute("aria-expanded");at(),rt(),$&&$(n,r);X.popperInstance&&(Et(),Ct().forEach((function(t){requestAnimationFrame(t._tippy.popperInstance.forceUpdate)})));it("onAfterUpdate",[X,t])},setContent:function(t){X.setProps({content:t})},show:function(){var t=X.state.isVisible,e=X.state.isDestroyed,n=!X.state.isEnabled,r=T.isTouch&&!X.props.touch,i=o(X.props.duration,0,D.duration);if(t||e||n||r)return;if(tt().hasAttribute("disabled"))return;if(it("onShow",[X],!1),!1===X.props.onShow(X))return;X.state.isVisible=!0,Z()&&(q.style.visibility="visible");rt(),ft(),X.state.isMounted||(q.style.transition="none");if(Z()){var a=et(),p=a.box,u=a.content;y([p,u],0)}A=function(){if(X.state.isVisible&&!S){if(S=!0,q.offsetHeight,q.style.transition=X.props.moveTransition,Z()&&X.props.animation){var t=et(),e=t.box,n=t.content;y([e,n],i),x([e,n],"visible")}ot(),at(),f(U,X),X.state.isMounted=!0,it("onMount",[X]),X.props.animation&&Z()&&function(t,e){dt(t,e)}(i,(function(){X.state.isShown=!0,it("onShown",[X])}))}},function(){var t,e=X.props.appendTo,n=tt();t=X.props.interactive&&e===D.appendTo||"parent"===e?n.parentNode:s(e,[n]);t.contains(q)||t.appendChild(q);Et()}()},hide:function(){var t=!X.state.isVisible,e=X.state.isDestroyed,n=!X.state.isEnabled,r=o(X.props.duration,1,D.duration);if(t||e||n)return;if(it("onHide",[X],!1),!1===X.props.onHide(X))return;X.state.isVisible=!1,X.state.isShown=!1,S=!1,R=!1,Z()&&(q.style.visibility="hidden");if(st(),lt(),rt(),Z()){var i=et(),a=i.box,s=i.content;X.props.animation&&(y([a,s],r),x([a,s],"hidden"))}ot(),at(),X.props.animation?Z()&&function(t,e){dt(t,(function(){!X.state.isVisible&&q.parentNode&&q.parentNode.contains(q)&&e()}))}(r,X.unmount):X.unmount()},hideWithInteractivity:function(t){z.addEventListener("mousemove",_),f(H,_),_(t)},enable:function(){X.state.isEnabled=!0},disable:function(){X.hide(),X.state.isEnabled=!1},unmount:function(){X.state.isVisible&&X.hide();if(!X.state.isMounted)return;Tt(),Ct().forEach((function(t){t._tippy.unmount()})),q.parentNode&&q.parentNode.removeChild(q);U=U.filter((function(t){return t!==X})),X.state.isMounted=!1,it("onHidden",[X])},destroy:function(){if(X.state.isDestroyed)return;X.clearDelayTimeouts(),X.unmount(),gt(),delete e._tippy,X.state.isDestroyed=!0,it("onDestroy",[X])}};if(!k.render)return X;var Y=k.render(X),q=Y.popper,$=Y.onUpdate;q.setAttribute("data-tippy-root",""),q.id="tippy-"+X.id,X.popper=q,e._tippy=X,q._tippy=X;var J=W.map((function(t){return t.fn(X)})),G=e.hasAttribute("aria-expanded");return mt(),at(),rt(),it("onCreate",[X]),k.showOnCreate&&At(),q.addEventListener("mouseenter",(function(){X.props.interactive&&X.state.isVisible&&X.clearDelayTimeouts()})),q.addEventListener("mouseleave",(function(t){X.props.interactive&&X.props.trigger.indexOf("mouseenter")>=0&&(z.addEventListener("mousemove",_),_(t))})),X;function K(){var t=X.props.touch;return Array.isArray(t)?t:[t,0]}function Q(){return"hold"===K()[0]}function Z(){var t;return!!(null==(t=X.props.render)?void 0:t.$$tippy)}function tt(){return O||e}function et(){return I(q)}function nt(t){return X.state.isMounted&&!X.state.isVisible||T.isTouch||b&&"focus"===b.type?0:o(X.props.delay,t?0:1,D.delay)}function rt(){q.style.pointerEvents=X.props.interactive&&X.state.isVisible?"":"none",q.style.zIndex=""+X.props.zIndex}function it(t,e,n){var r;(void 0===n&&(n=!0),J.forEach((function(n){n[t]&&n[t].apply(void 0,e)})),n)&&(r=X.props)[t].apply(r,e)}function ot(){var t=X.props.aria;if(t.content){var n="aria-"+t.content,r=q.id;c(X.props.triggerTarget||e).forEach((function(t){var e=t.getAttribute(n);if(X.state.isVisible)t.setAttribute(n,e?e+" "+r:r);else{var i=e&&e.replace(r,"").trim();i?t.setAttribute(n,i):t.removeAttribute(n)}}))}}function at(){!G&&X.props.aria.expanded&&c(X.props.triggerTarget||e).forEach((function(t){X.props.interactive?t.setAttribute("aria-expanded",X.state.isVisible&&t===tt()?"true":"false"):t.removeAttribute("aria-expanded")}))}function st(){z.removeEventListener("mousemove",_),H=H.filter((function(t){return t!==_}))}function pt(t){if(!(T.isTouch&&(P||"mousedown"===t.type)||X.props.interactive&&q.contains(t.target))){if(tt().contains(t.target)){if(T.isTouch)return;if(X.state.isVisible&&X.props.trigger.indexOf("click")>=0)return}else it("onClickOutside",[X,t]);!0===X.props.hideOnClick&&(X.clearDelayTimeouts(),X.hide(),j=!0,setTimeout((function(){j=!1})),X.state.isMounted||lt())}}function ut(){P=!0}function ct(){P=!1}function ft(){z.addEventListener("mousedown",pt,!0),z.addEventListener("touchend",pt,i),z.addEventListener("touchstart",ct,i),z.addEventListener("touchmove",ut,i)}function lt(){z.removeEventListener("mousedown",pt,!0),z.removeEventListener("touchend",pt,i),z.removeEventListener("touchstart",ct,i),z.removeEventListener("touchmove",ut,i)}function dt(t,e){var n=et().box;function r(t){t.target===n&&(E(n,"remove",r),e())}if(0===t)return e();E(n,"remove",C),E(n,"add",r),C=r}function vt(t,n,r){void 0===r&&(r=!1),c(X.props.triggerTarget||e).forEach((function(e){e.addEventListener(t,n,r),N.push({node:e,eventType:t,handler:n,options:r})}))}function mt(){var t;Q()&&(vt("touchstart",ht,{passive:!0}),vt("touchend",yt,{passive:!0})),(t=X.props.trigger,t.split(/\s+/).filter(Boolean)).forEach((function(t){if("manual"!==t)switch(vt(t,ht),t){case"mouseenter":vt("mouseleave",yt);break;case"focus":vt(r?"focusout":"blur",xt);break;case"focusin":vt("focusout",xt)}}))}function gt(){N.forEach((function(t){var e=t.node,n=t.eventType,r=t.handler,i=t.options;e.removeEventListener(n,r,i)})),N=[]}function ht(t){var e,n=!1;if(X.state.isEnabled&&!wt(t)&&!j){var r="focus"===(null==(e=b)?void 0:e.type);b=t,O=t.currentTarget,at(),!X.state.isVisible&&g(t)&&H.forEach((function(e){return e(t)})),"click"===t.type&&(X.props.trigger.indexOf("mouseenter")<0||R)&&!1!==X.props.hideOnClick&&X.state.isVisible?n=!0:At(t),"click"===t.type&&(R=!n),n&&!r&&Ot(t)}}function bt(t){var e=t.target,n=tt().contains(e)||q.contains(e);"mousemove"===t.type&&n||function(t,e){var n=e.clientX,r=e.clientY;return t.every((function(t){var e=t.popperRect,i=t.popperState,o=t.props.interactiveBorder,a=l(i.placement),s=i.modifiersData.offset;if(!s)return!0;var p="bottom"===a?s.top.y:0,u="top"===a?s.bottom.y:0,c="right"===a?s.left.x:0,f="left"===a?s.right.x:0,d=e.top-r+p>o,v=r-e.bottom-u>o,m=e.left-n+c>o,g=n-e.right-f>o;return d||v||m||g}))}(Ct().concat(q).map((function(t){var e,n=null==(e=t._tippy.popperInstance)?void 0:e.state;return n?{popperRect:t.getBoundingClientRect(),popperState:n,props:k}:null})).filter(Boolean),t)&&(st(),Ot(t))}function yt(t){wt(t)||X.props.trigger.indexOf("click")>=0&&R||(X.props.interactive?X.hideWithInteractivity(t):Ot(t))}function xt(t){X.props.trigger.indexOf("focusin")<0&&t.target!==tt()||X.props.interactive&&t.relatedTarget&&q.contains(t.relatedTarget)||Ot(t)}function wt(t){return!!T.isTouch&&Q()!==t.type.indexOf("touch")>=0}function Et(){Tt();var n=X.props,r=n.popperOptions,i=n.placement,o=n.offset,a=n.getReferenceClientRect,s=n.moveTransition,p=Z()?I(q).arrow:null,u=a?{getBoundingClientRect:a,contextElement:a.contextElement||tt()}:e,c=[{name:"offset",options:{offset:o}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(t){var e=t.state;if(Z()){var n=et().box;["placement","reference-hidden","escaped"].forEach((function(t){"placement"===t?n.setAttribute("data-placement",e.placement):e.attributes.popper["data-popper-"+t]?n.setAttribute("data-"+t,""):n.removeAttribute("data-"+t)})),e.attributes.popper={}}}}];Z()&&p&&c.push({name:"arrow",options:{element:p,padding:3}}),c.push.apply(c,(null==r?void 0:r.modifiers)||[]),X.popperInstance=t.createPopper(u,q,Object.assign({},r,{placement:i,onFirstUpdate:A,modifiers:c}))}function Tt(){X.popperInstance&&(X.popperInstance.destroy(),X.popperInstance=null)}function Ct(){return d(q.querySelectorAll("[data-tippy-root]"))}function At(t){X.clearDelayTimeouts(),t&&it("onTrigger",[X,t]),ft();var e=nt(!0),n=K(),r=n[0],i=n[1];T.isTouch&&"hold"===r&&i&&(e=i),e?u=setTimeout((function(){X.show()}),e):X.show()}function Ot(t){if(X.clearDelayTimeouts(),it("onUntrigger",[X,t]),X.state.isVisible){if(!(X.props.trigger.indexOf("mouseenter")>=0&&X.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(t.type)>=0&&R)){var e=nt(!1);e?m=setTimeout((function(){X.state.isVisible&&X.hide()}),e):h=requestAnimationFrame((function(){X.hide()}))}}else lt()}}function _(t,e){void 0===e&&(e={});var n=D.plugins.concat(e.plugins||[]);document.addEventListener("touchstart",A,i),window.addEventListener("blur",L);var r=Object.assign({},e,{plugins:n}),o=b(t).reduce((function(t,e){var n=e&&N(e,r);return n&&t.push(n),t}),[]);return m(t)?o[0]:o}_.defaultProps=D,_.setDefaultProps=function(t){Object.keys(t).forEach((function(e){D[e]=t[e]}))},_.currentInput=T;var z={mouseover:"mouseenter",focusin:"focus",click:"click"};var F={name:"animateFill",defaultValue:!1,fn:function(t){var e;if(!(null==(e=t.props.render)?void 0:e.$$tippy))return{};var n=I(t.popper),r=n.box,i=n.content,o=t.props.animateFill?function(){var t=v();return t.className="tippy-backdrop",x([t],"hidden"),t}():null;return{onCreate:function(){o&&(r.insertBefore(o,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",t.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(o){var t=r.style.transitionDuration,e=Number(t.replace("ms",""));i.style.transitionDelay=Math.round(e/10)+"ms",o.style.transitionDuration=t,x([o],"visible")}},onShow:function(){o&&(o.style.transitionDuration="0ms")},onHide:function(){o&&x([o],"hidden")}}}};var W={clientX:0,clientY:0},X=[];function Y(t){var e=t.clientX,n=t.clientY;W={clientX:e,clientY:n}}var q={name:"followCursor",defaultValue:!1,fn:function(t){var e=t.reference,n=w(t.props.triggerTarget||e),r=!1,i=!1,o=!0,a=t.props;function s(){return"initial"===t.props.followCursor&&t.state.isVisible}function p(){n.addEventListener("mousemove",f)}function u(){n.removeEventListener("mousemove",f)}function c(){r=!0,t.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||e.contains(n.target),i=t.props.followCursor,o=n.clientX,a=n.clientY,s=e.getBoundingClientRect(),p=o-s.left,u=a-s.top;!r&&t.props.interactive||t.setProps({getReferenceClientRect:function(){var t=e.getBoundingClientRect(),n=o,r=a;"initial"===i&&(n=t.left+p,r=t.top+u);var s="horizontal"===i?t.top:r,c="vertical"===i?t.right:n,f="horizontal"===i?t.bottom:r,l="vertical"===i?t.left:n;return{width:c-l,height:f-s,top:s,right:c,bottom:f,left:l}}})}function l(){t.props.followCursor&&(X.push({instance:t,doc:n}),function(t){t.addEventListener("mousemove",Y)}(n))}function d(){0===(X=X.filter((function(e){return e.instance!==t}))).filter((function(t){return t.doc===n})).length&&function(t){t.removeEventListener("mousemove",Y)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=t.props},onAfterUpdate:function(e,n){var o=n.followCursor;r||void 0!==o&&a.followCursor!==o&&(d(),o?(l(),!t.state.isMounted||i||s()||p()):(u(),c()))},onMount:function(){t.props.followCursor&&!i&&(o&&(f(W),o=!1),s()||p())},onTrigger:function(t,e){g(e)&&(W={clientX:e.clientX,clientY:e.clientY}),i="focus"===e.type},onHidden:function(){t.props.followCursor&&(c(),u(),o=!0)}}}};var $={name:"inlinePositioning",defaultValue:!1,fn:function(t){var e,n=t.reference;var r=-1,i=!1,o={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(i){var o=i.state;t.props.inlinePositioning&&(e!==o.placement&&t.setProps({getReferenceClientRect:function(){return function(t){return function(t,e,n,r){if(n.length<2||null===t)return e;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||e;switch(t){case"top":case"bottom":var i=n[0],o=n[n.length-1],a="top"===t,s=i.top,p=o.bottom,u=a?i.left:o.left,c=a?i.right:o.right;return{top:s,bottom:p,left:u,right:c,width:c-u,height:p-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(t){return t.left}))),l=Math.max.apply(Math,n.map((function(t){return t.right}))),d=n.filter((function(e){return"left"===t?e.left===f:e.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return e}}(l(t),n.getBoundingClientRect(),d(n.getClientRects()),r)}(o.placement)}}),e=o.placement)}};function a(){var e;i||(e=function(t,e){var n;return{popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat(((null==(n=t.popperOptions)?void 0:n.modifiers)||[]).filter((function(t){return t.name!==e.name})),[e])})}}(t.props,o),i=!0,t.setProps(e),i=!1)}return{onCreate:a,onAfterUpdate:a,onTrigger:function(e,n){if(g(n)){var i=d(t.reference.getClientRects()),o=i.find((function(t){return t.left-2<=n.clientX&&t.right+2>=n.clientX&&t.top-2<=n.clientY&&t.bottom+2>=n.clientY}));r=i.indexOf(o)}},onUntrigger:function(){r=-1}}}};var J={name:"sticky",defaultValue:!1,fn:function(t){var e=t.reference,n=t.popper;function r(e){return!0===t.props.sticky||t.props.sticky===e}var i=null,o=null;function a(){var s=r("reference")?(t.popperInstance?t.popperInstance.state.elements.reference:e).getBoundingClientRect():null,p=r("popper")?n.getBoundingClientRect():null;(s&&G(i,s)||p&&G(o,p))&&t.popperInstance&&t.popperInstance.update(),i=s,o=p,t.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){t.props.sticky&&a()}}}};function G(t,e){return!t||!e||(t.top!==e.top||t.right!==e.right||t.bottom!==e.bottom||t.left!==e.left)}return e&&function(t){var e=document.createElement("style");e.textContent=t,e.setAttribute("data-tippy-stylesheet","");var n=document.head,r=document.querySelector("head>style,head>link");r?n.insertBefore(e,r):n.appendChild(e)}('.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}'),_.setDefaultProps({plugins:[F,q,$,J],render:S}),_.createSingleton=function(t,e){void 0===e&&(e={});var n,r=t,i=[],o=e.overrides;function a(){i=r.map((function(t){return t.reference}))}function s(t){r.forEach((function(e){t?e.enable():e.disable()}))}s(!1),a();var p={fn:function(){return{onDestroy:function(){s(!0)},onTrigger:function(t,e){var a=e.currentTarget,s=i.indexOf(a);if(a!==n){n=a;var p=(o||[]).concat("content").reduce((function(t,e){return t[e]=r[s].props[e],t}),{});t.setProps(Object.assign({},p,{getReferenceClientRect:function(){return a.getBoundingClientRect()}}))}}}}},c=_(v(),Object.assign({},u(e,["overrides"]),{plugins:[p].concat(e.plugins||[]),triggerTarget:i})),f=c.setProps;return c.setProps=function(t){o=t.overrides||o,f(t)},c.setInstances=function(t){s(!0),r=t,s(!1),a(),c.setProps({triggerTarget:i})},c},_.delegate=function(t,e){var n=[],r=[],i=e.target,o=u(e,["target"]),a=Object.assign({},o,{trigger:"manual",touch:!1}),s=Object.assign({},o,{showOnCreate:!0}),p=_(t,a);function f(t){if(t.target){var n=t.target.closest(i);if(n){var o=n.getAttribute("data-tippy-trigger")||e.trigger||D.trigger;if(!n._tippy&&!("touchstart"===t.type&&"boolean"==typeof s.touch||"touchstart"!==t.type&&o.indexOf(z[t.type])<0)){var a=_(n,s);a&&(r=r.concat(a))}}}}function l(t,e,r,i){void 0===i&&(i=!1),t.addEventListener(e,r,i),n.push({node:t,eventType:e,handler:r,options:i})}return c(p).forEach((function(t){var e=t.destroy;t.destroy=function(t){void 0===t&&(t=!0),t&&r.forEach((function(t){t.destroy()})),r=[],n.forEach((function(t){var e=t.node,n=t.eventType,r=t.handler,i=t.options;e.removeEventListener(n,r,i)})),n=[],e()},function(t){var e=t.reference;l(e,"touchstart",f),l(e,"mouseover",f),l(e,"focusin",f),l(e,"click",f)}(t)})),p},_.hideAll=function(t){var e=void 0===t?{}:t,n=e.exclude,r=e.duration;U.forEach((function(t){var e=!1;if(n&&(e=h(n)?t.reference===n:t.popper===n.popper),!e){var i=t.props.duration;t.setProps({duration:r}),t.hide(),t.state.isDestroyed||t.setProps({duration:i})}}))},_.roundArrow='',_})); 2 | //# sourceMappingURL=tippy-bundle.umd.min.js.map -------------------------------------------------------------------------------- /assets/js/utils.js: -------------------------------------------------------------------------------- 1 | 2 | function delegateEvent(type, selector, fn, options = {}){ 3 | return (options.container || document).addEventListener(type, e => { 4 | let match = e.target.closest(selector); 5 | if (match) fn(e, match); 6 | }, options); 7 | } 8 | 9 | skipAnimationFrame = fn => requestAnimationFrame(() => requestAnimationFrame(fn)); 10 | 11 | var domReady = new Promise(resolve => { 12 | document.addEventListener('DOMContentLoaded', e => resolve()) 13 | }); -------------------------------------------------------------------------------- /custom-assets/custom-body.js: -------------------------------------------------------------------------------- 1 | import {test } from './module-test.js'; 2 | 3 | console.log('Custom javascript in body') 4 | 5 | test(); -------------------------------------------------------------------------------- /custom-assets/custom-head.js: -------------------------------------------------------------------------------- 1 | console.log('Custom javascript in head') -------------------------------------------------------------------------------- /custom-assets/custom.css: -------------------------------------------------------------------------------- 1 | 2 | body:after { 3 | content: "Custom CSS in body"; 4 | opacity: 0; 5 | pointer-events: none; 6 | } -------------------------------------------------------------------------------- /custom-assets/module-test.js: -------------------------------------------------------------------------------- 1 | 2 | function test(){ 3 | console.log('module option for custom assets') 4 | } 5 | 6 | export { 7 | test 8 | } -------------------------------------------------------------------------------- /docs/fonts/KaTeX_AMS-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_AMS-Regular.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_AMS-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_AMS-Regular.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_AMS-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_AMS-Regular.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Caligraphic-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Caligraphic-Bold.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Caligraphic-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Caligraphic-Bold.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Caligraphic-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Caligraphic-Bold.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Caligraphic-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Caligraphic-Regular.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Caligraphic-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Caligraphic-Regular.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Caligraphic-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Caligraphic-Regular.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Fraktur-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Fraktur-Bold.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Fraktur-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Fraktur-Bold.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Fraktur-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Fraktur-Bold.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Fraktur-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Fraktur-Regular.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Fraktur-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Fraktur-Regular.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Fraktur-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Fraktur-Regular.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Main-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Main-Bold.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Main-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Main-Bold.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Main-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Main-Bold.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Main-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Main-BoldItalic.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Main-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Main-BoldItalic.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Main-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Main-BoldItalic.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Main-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Main-Italic.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Main-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Main-Italic.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Main-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Main-Italic.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Main-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Main-Regular.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Main-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Main-Regular.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Main-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Main-Regular.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Math-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Math-BoldItalic.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Math-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Math-BoldItalic.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Math-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Math-BoldItalic.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Math-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Math-Italic.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Math-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Math-Italic.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Math-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Math-Italic.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_SansSerif-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_SansSerif-Bold.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_SansSerif-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_SansSerif-Bold.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_SansSerif-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_SansSerif-Bold.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_SansSerif-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_SansSerif-Italic.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_SansSerif-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_SansSerif-Italic.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_SansSerif-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_SansSerif-Italic.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_SansSerif-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_SansSerif-Regular.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_SansSerif-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_SansSerif-Regular.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_SansSerif-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_SansSerif-Regular.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Script-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Script-Regular.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Script-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Script-Regular.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Script-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Script-Regular.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Size1-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Size1-Regular.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Size1-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Size1-Regular.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Size1-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Size1-Regular.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Size2-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Size2-Regular.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Size2-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Size2-Regular.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Size2-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Size2-Regular.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Size3-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Size3-Regular.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Size3-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Size3-Regular.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Size3-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Size3-Regular.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Size4-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Size4-Regular.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Size4-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Size4-Regular.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Size4-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Size4-Regular.woff2 -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Typewriter-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Typewriter-Regular.ttf -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Typewriter-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Typewriter-Regular.woff -------------------------------------------------------------------------------- /docs/fonts/KaTeX_Typewriter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/docs/fonts/KaTeX_Typewriter-Regular.woff2 -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | 2 | const yargs = require('yargs/yargs') 3 | const { hideBin } = require('yargs/helpers') 4 | const argv = yargs(hideBin(process.argv)).argv; 5 | const { exec } = require('child_process'); 6 | 7 | const fs = require('fs-extra'); 8 | const gulp = require('gulp'); 9 | const concat = require('gulp-concat'); 10 | const terser = require('gulp-terser'); 11 | const mergeStreams = require('merge-stream'); 12 | const cleanCSS = require('gulp-clean-css'); 13 | const axios = require('axios').default; 14 | const assets = fs.readJsonSync('./src/asset-map.json'); 15 | 16 | let compileLocation = 'assets/compiled'; 17 | 18 | async function fetchSpecRefs(){ 19 | return Promise.all([ 20 | axios.get('https://ghcdn.rawgit.org/tobie/specref/master/refs/ietf.json'), 21 | axios.get('https://ghcdn.rawgit.org/tobie/specref/master/refs/w3c.json'), 22 | axios.get('https://ghcdn.rawgit.org/tobie/specref/master/refs/whatwg.json') 23 | ]).then(async results => { 24 | let json = Object.assign(results[0].data, results[1].data, results[2].data); 25 | return fs.outputFile(compileLocation + '/refs.json', JSON.stringify(json)); 26 | }).catch(e => console.log(e)); 27 | } 28 | 29 | async function compileAssets(){ 30 | await fs.ensureDir(compileLocation); 31 | return new Promise(resolve => { 32 | mergeStreams( 33 | gulp.src(assets.head.css) 34 | .pipe(cleanCSS()) 35 | .pipe(concat('head.css')) 36 | .pipe(gulp.dest(compileLocation)), 37 | gulp.src(assets.head.js) 38 | .pipe(terser()) 39 | .pipe(concat('head.js')) 40 | .pipe(gulp.dest(compileLocation)), 41 | gulp.src(assets.body.js) 42 | .pipe(terser()) 43 | .pipe(concat('body.js')) 44 | .pipe(gulp.dest(compileLocation)) 45 | ).on('finish', function() { 46 | resolve(); 47 | }) 48 | }); 49 | } 50 | 51 | function runCommand(cmd){ 52 | return new Promise((resolve, reject) => { 53 | exec(cmd, {}, error => error ? reject() : resolve()); 54 | }); 55 | } 56 | 57 | async function bumpVersion(){ 58 | return runCommand(`npm version --no-git-tag-version ${ argv.v || 'patch' }`); 59 | } 60 | 61 | async function renderSpecs(){ 62 | return runCommand('npm run render'); 63 | } 64 | 65 | gulp.task('render', renderSpecs); 66 | 67 | gulp.task('refs', fetchSpecRefs); 68 | 69 | gulp.task('compile', compileAssets); 70 | 71 | gulp.task('bump', bumpVersion); 72 | 73 | gulp.task('publish', gulp.series(gulp.parallel(compileAssets, bumpVersion), renderSpecs)); 74 | 75 | gulp.task('watch', () => gulp.watch([ 76 | 'assets/**/*', 77 | '!assets/compiled/*' 78 | ], gulp.parallel('compile'))); -------------------------------------------------------------------------------- /images/AuthenticatableMessage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/AuthenticatableMessage.png -------------------------------------------------------------------------------- /images/AutonomicIdentifierBindingTetrad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/AutonomicIdentifierBindingTetrad.png -------------------------------------------------------------------------------- /images/AutonomicIssuanceTetrad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/AutonomicIssuanceTetrad.png -------------------------------------------------------------------------------- /images/ControllerAppAgentDirectExchange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/ControllerAppAgentDirectExchange.png -------------------------------------------------------------------------------- /images/ControllerAppAgentSplitFunctions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/ControllerAppAgentSplitFunctions.png -------------------------------------------------------------------------------- /images/ControllerAppAgentWitnessWatcherIndirectExchange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/ControllerAppAgentWitnessWatcherIndirectExchange.png -------------------------------------------------------------------------------- /images/ControllerApplicationFunctions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/ControllerApplicationFunctions.png -------------------------------------------------------------------------------- /images/Ecosystem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/Ecosystem.png -------------------------------------------------------------------------------- /images/End2EndNetwork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/End2EndNetwork.png -------------------------------------------------------------------------------- /images/ExploitDead.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/ExploitDead.png -------------------------------------------------------------------------------- /images/ExploitLive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/ExploitLive.png -------------------------------------------------------------------------------- /images/PrefixAddressMultisigDerivation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/PrefixAddressMultisigDerivation.png -------------------------------------------------------------------------------- /images/SelfCertIssuanceTriad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/SelfCertIssuanceTriad.png -------------------------------------------------------------------------------- /images/SelfCertifyingIdentifierBindingTriad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trustoverip/tswg-keri-specification/26aa6c2b51a5deb6bfde517fa25e08778d35981d/images/SelfCertifyingIdentifierBindingTriad.png -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = function(options = {}) { 3 | 4 | const fs = require('fs-extra'); 5 | const gulp = require('gulp'); 6 | const findPkgDir = require('find-pkg-dir'); 7 | const modulePath = findPkgDir(__dirname); 8 | let config = fs.readJsonSync('./specs.json'); 9 | let assets = fs.readJsonSync(modulePath + '/src/asset-map.json'); 10 | 11 | const katexRules = ['math_block', 'math_inline'] 12 | const replacerRegex = /\[\[\s*([^\s\[\]:]+):?\s*([^\]\n]+)?\]\]/img; 13 | const replacerArgsRegex = /\s*,+\s*/; 14 | const replacers = [ 15 | { 16 | test: 'insert', 17 | transform: function(path){ 18 | if (!path) return ''; 19 | return fs.readFileSync(path, 'utf8'); 20 | } 21 | } 22 | ]; 23 | 24 | function applyReplacers(doc){ 25 | return doc.replace(replacerRegex, function(match, type, args){ 26 | let replacer = replacers.find(r => type.trim().match(r.test)); 27 | return replacer ? replacer.transform(...args.trim().split(replacerArgsRegex)) : match; 28 | }); 29 | } 30 | 31 | function normalizePath(path){ 32 | return path.trim().replace(/\/$/g, '') + '/'; 33 | } 34 | 35 | function renderRefGroup(type){ 36 | let group = specGroups[type]; 37 | if (!group) return ''; 38 | let html = Object.keys(group).sort().reduce((html, name) => { 39 | let ref = group[name]; 40 | return html += ` 41 |
    ${name}
    42 |
    43 | ${ref.title}. 44 | ${ref.authors.join('; ')}; ${ref.rawDate}. Status: ${ref.status}. 45 |
    46 | `; 47 | }, '
    ') 48 | return `\n${html}\n
    \n`; 49 | } 50 | 51 | function findKatexDist(){ 52 | const relpath = "node_modules/katex/dist"; 53 | const paths = [ 54 | path.join(process.cwd(), relpath), 55 | path.join(__dirname, relpath), 56 | ]; 57 | for(const abspath of paths) { 58 | if(fs.existsSync(abspath)) { 59 | return abspath 60 | } 61 | } 62 | throw Error("katex distribution could not be located"); 63 | } 64 | 65 | try { 66 | 67 | var toc; 68 | var specGroups = {}; 69 | const noticeTypes = { 70 | note: 1, 71 | issue: 1, 72 | example: 1, 73 | warning: 1, 74 | todo: 1 75 | }; 76 | const spaceRegex = /\s+/g; 77 | const specNameRegex = /^spec$|^spec[-]*\w+$/i; 78 | const terminologyRegex = /^def$|^ref/i; 79 | const specCorpus = fs.readJsonSync(modulePath + '/assets/compiled/refs.json'); 80 | const containers = require('markdown-it-container'); 81 | const md = require('markdown-it')({ 82 | html: true, 83 | linkify: true, 84 | typographer: true 85 | }) 86 | .use(require('./src/markdown-it-extensions.js'), [ 87 | { 88 | filter: type => type.match(specNameRegex), 89 | parse(token, type, name){ 90 | if (name) { 91 | let _name = name.replace(spaceRegex, '-').toUpperCase(); 92 | let spec = specCorpus[_name] || 93 | specCorpus[_name.toLowerCase()] || 94 | specCorpus[name.toLowerCase()] || 95 | specCorpus[name]; 96 | if (spec) { 97 | spec._name = _name; 98 | let group = specGroups[type] = specGroups[type] || {}; 99 | token.info.spec = group[_name] = spec; 100 | } 101 | } 102 | }, 103 | render(token, type, name){ 104 | if (name){ 105 | let spec = token.info.spec; 106 | if (spec) return `[${spec._name}]`; 107 | } 108 | else return renderRefGroup(type); 109 | } 110 | }, 111 | { 112 | filter: type => type.match(terminologyRegex), 113 | parse(token, type, primary){ 114 | if (!primary) return; 115 | if (type === 'def'){ 116 | return token.info.args.reduce((acc, syn) => { 117 | return `${acc}`; 118 | }, primary); 119 | } 120 | else { 121 | return `${primary}`; 122 | } 123 | } 124 | } 125 | ]) 126 | .use(require('markdown-it-attrs')) 127 | .use(require('markdown-it-chart').default) 128 | .use(require('markdown-it-deflist')) 129 | .use(require('markdown-it-references')) 130 | .use(require('markdown-it-icons').default, 'font-awesome') 131 | .use(require('markdown-it-ins')) 132 | .use(require('markdown-it-mark')) 133 | .use(require('markdown-it-textual-uml')) 134 | .use(require('markdown-it-sub')) 135 | .use(require('markdown-it-sup')) 136 | .use(require('markdown-it-task-lists')) 137 | .use(require('markdown-it-multimd-table'), { 138 | multiline: true, 139 | rowspan: true, 140 | headerless: true 141 | }) 142 | .use(containers, 'notice', { 143 | validate: function(params) { 144 | let matches = params.match(/(\w+)\s?(.*)?/); 145 | return matches && noticeTypes[matches[1]]; 146 | }, 147 | render: function (tokens, idx) { 148 | let matches = tokens[idx].info.match(/(\w+)\s?(.*)?/); 149 | if (matches && tokens[idx].nesting === 1) { 150 | let id; 151 | let type = matches[1]; 152 | if (matches[2]) { 153 | id = matches[2].trim().replace(/\s+/g , '-').toLowerCase(); 154 | if (noticeTitles[id]) id += '-' + noticeTitles[id]++; 155 | else noticeTitles[id] = 1; 156 | } 157 | else id = type + '-' + noticeTypes[type]++; 158 | return `
    ${type.toUpperCase()}`; 159 | } 160 | else return '
    \n'; 161 | } 162 | }) 163 | .use(require('markdown-it-prism')) 164 | .use(require('markdown-it-toc-and-anchor').default, { 165 | tocClassName: 'toc', 166 | tocFirstLevel: 2, 167 | tocLastLevel: 4, 168 | tocCallback: (_md, _tokens, html) => toc = html, 169 | anchorLinkSymbol: '§', 170 | anchorClassName: 'toc-anchor' 171 | }) 172 | .use(require('@traptitech/markdown-it-katex')) 173 | 174 | async function render(spec, assets) { 175 | try { 176 | noticeTitles = {}; 177 | specGroups = {}; 178 | console.log('Rendering: ' + spec.title); 179 | return new Promise(async (resolve, reject) => { 180 | Promise.all((spec.markdown_paths || ['spec.md']).map(path => { 181 | return fs.readFile(spec.spec_directory + path, 'utf8').catch(e => reject(e)) 182 | })).then(async docs => { 183 | const features = (({ source, logo }) => ({ source, logo }))(spec); 184 | let doc = docs.join("\n"); 185 | doc = applyReplacers(doc); 186 | md[spec.katex ? "enable" : "disable"](katexRules); 187 | fs.writeFile(path.join(spec.destination, 'index.html'), ` 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | ${spec.title} 196 | 197 | 198 | 199 | ${assets.head} 200 | 201 | 202 | 203 | ${assets.svg} 204 | 205 |
    206 | 207 | 218 | 219 |
    220 | ${md.render(doc)} 221 |
    222 | 223 |
    224 | 225 | 226 | 227 |
    228 | 229 | 230 | 231 | 232 | 233 |
    234 |
      235 |
      236 | 237 | 238 |
      239 | Table of Contents 240 | 241 |
      242 |
      243 | ${toc} 244 |
      245 |
      246 | 247 |
      248 | 249 | 250 | 251 | ${assets.body} 252 | 253 | `, function(err, data){ 254 | if (err) { 255 | reject(err); 256 | } 257 | else { 258 | resolve(); 259 | } 260 | }); 261 | }); 262 | }); 263 | } 264 | catch(e) { 265 | console.error(e); 266 | } 267 | } 268 | 269 | config.specs.forEach(spec => { 270 | spec.spec_directory = normalizePath(spec.spec_directory); 271 | spec.destination = normalizePath(spec.output_path || spec.spec_directory); 272 | 273 | fs.ensureDirSync(spec.destination); 274 | 275 | let assetTags = { 276 | svg: fs.readFileSync(modulePath + '/assets/icons.svg', 'utf8') || '' 277 | }; 278 | 279 | let customAssets = (spec.assets || []).reduce((assets, asset) => { 280 | let ext = asset.path.split('.').pop(); 281 | if (ext === 'css') { 282 | assets.css += ``; 283 | } 284 | if (ext === 'js') { 285 | assets.js[asset.inject || 'body'] += ``; 286 | } 287 | return assets; 288 | }, { 289 | css: '', 290 | js: { head: '', body: '' } 291 | }); 292 | 293 | if (options.dev) { 294 | assetTags.head = assets.head.css.map(path => ``).join('') + 295 | customAssets.css + 296 | assets.head.js.map(path => ``).join('') + 297 | customAssets.js.head; 298 | assetTags.body = assets.body.js.map(path => ``).join('') + 299 | customAssets.js.body; 300 | } 301 | else { 302 | assetTags.head = ` 303 | 304 | ${ customAssets.css } 305 | 306 | ${ customAssets.js.head } 307 | `; 308 | assetTags.body = ` 309 | ${ customAssets.js.body }`; 310 | } 311 | 312 | if (spec.katex) { 313 | const katexDist = findKatexDist(); 314 | assetTags.body += ``; 316 | assetTags.body += ``; 318 | 319 | fs.copySync(path.join(katexDist, 'fonts'), path.join(spec.destination, 'fonts')); 320 | } 321 | 322 | if (!options.nowatch) { 323 | gulp.watch( 324 | [spec.spec_directory + '**/*', '!' + path.join(spec.destination, 'index.html')], 325 | render.bind(null, spec, assetTags) 326 | ) 327 | } 328 | 329 | render(spec, assetTags).then(() => { 330 | if (options.nowatch) process.exit(0) 331 | }).catch(() => process.exit(1)); 332 | 333 | }); 334 | 335 | } 336 | catch(e) { 337 | console.error(e); 338 | } 339 | 340 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "spec-up", 3 | "version": "0.10.6", 4 | "description": "Technical specification drafting tool that generates rich specification documents from markdown.", 5 | "main": "./index", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/decentralized-identity/spec-up.git" 9 | }, 10 | "scripts": { 11 | "edit": "node -e \"require('./index')()\"", 12 | "render": "node -e \"require('./index')({ nowatch: true })\"", 13 | "dev": "node -e \"require('./index')({ dev: true })\"" 14 | }, 15 | "keywords": [ 16 | "spec", 17 | "specs", 18 | "markdown", 19 | "editor", 20 | "standards" 21 | ], 22 | "author": "Daniel Buchner", 23 | "license": "Apache 2.0", 24 | "bugs": { 25 | "url": "https://github.com/decentralized-identity/spec-up/issues" 26 | }, 27 | "homepage": "https://github.com/decentralized-identity/spec-up#readme", 28 | "dependencies": { 29 | "@traptitech/markdown-it-katex": "3.3.0", 30 | "axios": "^1.6.4", 31 | "find-pkg-dir": "2.0.0", 32 | "fs-extra": "8.1.0", 33 | "gulp": "^4.0.2", 34 | "gulp-clean-css": "4.3.0", 35 | "gulp-concat": "2.6.1", 36 | "gulp-terser": "1.2.0", 37 | "markdown-it": "13.0.1", 38 | "markdown-it-anchor": "5.2.5", 39 | "markdown-it-attrs": "4.1.4", 40 | "markdown-it-chart": "^0.2.0", 41 | "markdown-it-container": "^2.0.0", 42 | "markdown-it-deflist": "^2.1.0", 43 | "markdown-it-icons": "^0.4.1", 44 | "markdown-it-ins": "^2.0.0", 45 | "markdown-it-mark": "^2.0.0", 46 | "markdown-it-modify-token": "1.0.2", 47 | "markdown-it-multimd-table": "^4.1.3", 48 | "markdown-it-prism": "^2.2.0", 49 | "markdown-it-references": "1.0.0-alpha.10", 50 | "markdown-it-sub": "^1.0.0", 51 | "markdown-it-sup": "^1.0.0", 52 | "markdown-it-task-lists": "2.1.1", 53 | "markdown-it-textual-uml": "0.1.3", 54 | "markdown-it-toc-and-anchor": "4.2.0", 55 | "merge-stream": "2.0.0", 56 | "pkg-dir": "4.2.0", 57 | "prismjs": ">=1.24.0", 58 | "spec-up": "^0.10.6", 59 | "yargs": "16.2.0" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /specs.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "specs": [ 4 | { 5 | "title": "Key Event Receipt Infrastructure", 6 | "spec_directory": "./spec", 7 | "output_path": "./docs", 8 | "markdown_paths": [ 9 | "spec.md" 10 | ], 11 | "logo": "https://raw.githubusercontent.com/trustoverip/logo-assets/master/logos/ToIP-Logo-Color-SolidDimensional-Horizontal-LightOnDark.svg", 12 | "logo_link": "https://github.com/trustoverip/tswg-keri-specification", 13 | "katex": true, 14 | "source": { 15 | "host": "github", 16 | "account": "trustoverip", 17 | "repo": "tswg-keri-specification" 18 | } 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /src/asset-map.json: -------------------------------------------------------------------------------- 1 | { 2 | "head": { 3 | "css": [ 4 | "assets/css/custom-elements.css", 5 | "assets/css/prism.css", 6 | "assets/css/chart.css", 7 | "assets/css/index.css" 8 | ], 9 | "js": [ 10 | "assets/js/utils.js", 11 | "assets/js/custom-elements.js" 12 | ] 13 | }, 14 | "body": { 15 | "js": [ 16 | "node_modules/markdown-it/dist/markdown-it.min.js", 17 | "assets/js/prism.js", 18 | "assets/js/mermaid.js", 19 | "assets/js/chart.js", 20 | "assets/js/font-awesome.js", 21 | "assets/js/popper.js", 22 | "assets/js/tippy.js", 23 | "assets/js/index.js" 24 | ] 25 | } 26 | } -------------------------------------------------------------------------------- /src/markdown-it-extensions.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const levels = 2; 4 | const openString = '['.repeat(levels); 5 | const closeString = ']'.repeat(levels); 6 | const contentRegex = /\s*([^\s\[\]:]+):?\s*([^\]\n]+)?/i; 7 | 8 | module.exports = function(md, templates = {}) { 9 | 10 | md.inline.ruler.after('emphasis', 'templates', function templates_ruler(state, silent) { 11 | 12 | var start = state.pos; 13 | let prefix = state.src.slice(start, start + levels); 14 | if (prefix !== openString) return false; 15 | var indexOfClosingBrace = state.src.indexOf(closeString, start); 16 | 17 | if (indexOfClosingBrace > 0) { 18 | 19 | let match = contentRegex.exec(state.src.slice(start + levels, indexOfClosingBrace)); 20 | if (!match) return false; 21 | 22 | let type = match[1]; 23 | let template = templates.find(t => t.filter(type) && t); 24 | if (!template) return false; 25 | 26 | let args = match[2] ? match[2].trim().split(/\s*,+\s*/) : []; 27 | let token = state.push('template', '', 0); 28 | token.content = match[0]; 29 | token.info = { type, template, args }; 30 | if (template.parse) { 31 | token.content = template.parse(token, type, ...args) || token.content; 32 | } 33 | 34 | state.pos = indexOfClosingBrace + levels; 35 | return true; 36 | } 37 | 38 | return false; 39 | }); 40 | 41 | md.renderer.rules.template = function(tokens, idx, options, env, renderer) { 42 | let token = tokens[idx]; 43 | let template = token.info.template; 44 | if (template.render) { 45 | return template.render(token, token.info.type, ...token.info.args) || (openString + token.content + closeString); 46 | } 47 | return token.content; 48 | } 49 | 50 | let pathSegmentRegex = /(?:http[s]*:\/\/([^\/]*)|(?:\/([^\/?]*)))/g; 51 | md.renderer.rules.link_open = function(tokens, idx, options, env, renderer) { 52 | let token = tokens[idx]; 53 | let attrs = token.attrs.reduce((str, attr) => { 54 | let name = attr[0]; 55 | let value = attr[1]; 56 | if (name === 'href') { 57 | let index = 0; 58 | value.replace(pathSegmentRegex, (m, domain, seg) => { 59 | str += `path-${index++}="${domain || seg}"`; 60 | }); 61 | } 62 | return str += name + '="' + value + '" '; 63 | }, ''); 64 | let anchor = ``; 65 | return token.markup === 'linkify' ? anchor + '' : anchor; 66 | } 67 | 68 | md.renderer.rules.link_close = function(tokens, idx, options, env, renderer) { 69 | return tokens[idx].markup === 'linkify' ? '' : ''; 70 | } 71 | 72 | }; --------------------------------------------------------------------------------