├── .editorconfig ├── .gitignore ├── .husky └── pre-commit ├── CHANGELOG.md ├── LICENSE ├── README.md ├── documentation └── API.md ├── library ├── helpers.js ├── index.js ├── sheet.jsx └── styleSheet.js ├── package-lock.json ├── package.json ├── test ├── index.html ├── main.css ├── main.js └── vite.config.js ├── tsconfig.json └── vite.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | indent_style = tab 8 | end_of_line = lf 9 | charset = utf-8 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | 13 | [*.md] 14 | indent_size = 4 15 | indent_style = space 16 | 17 | [{package.json,package-lock.json}] 18 | indent_size = 2 19 | indent_style = space 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | .pnpm-debug.log* 11 | 12 | # Diagnostic reports (https://nodejs.org/api/report.html) 13 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 14 | 15 | # Runtime data 16 | pids 17 | *.pid 18 | *.seed 19 | *.pid.lock 20 | 21 | # Directory for instrumented libs generated by jscoverage/JSCover 22 | lib-cov 23 | 24 | # Coverage directory used by tools like istanbul 25 | coverage 26 | *.lcov 27 | 28 | # nyc test coverage 29 | .nyc_output 30 | 31 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 32 | .grunt 33 | 34 | # Bower dependency directory (https://bower.io/) 35 | bower_components 36 | 37 | # node-waf configuration 38 | .lock-wscript 39 | 40 | # Compiled binary addons (https://nodejs.org/api/addons.html) 41 | build/Release 42 | 43 | # Dependency directories 44 | node_modules/ 45 | jspm_packages/ 46 | 47 | # Snowpack dependency directory (https://snowpack.dev/) 48 | web_modules/ 49 | 50 | # TypeScript cache 51 | *.tsbuildinfo 52 | 53 | # Optional npm cache directory 54 | .npm 55 | 56 | # Optional eslint cache 57 | .eslintcache 58 | 59 | # Optional stylelint cache 60 | .stylelintcache 61 | 62 | # Microbundle cache 63 | .rpt2_cache/ 64 | .rts2_cache_cjs/ 65 | .rts2_cache_es/ 66 | .rts2_cache_umd/ 67 | 68 | # Optional REPL history 69 | .node_repl_history 70 | 71 | # Output of 'npm pack' 72 | *.tgz 73 | 74 | # Yarn Integrity file 75 | .yarn-integrity 76 | 77 | # dotenv environment variable files 78 | .env 79 | .env.development.local 80 | .env.test.local 81 | .env.production.local 82 | .env.local 83 | 84 | # parcel-bundler cache (https://parceljs.org/) 85 | .cache 86 | .parcel-cache 87 | 88 | # Next.js build output 89 | .next 90 | out 91 | 92 | # Nuxt.js build / generate output 93 | .nuxt 94 | dist 95 | 96 | # Gatsby files 97 | .cache/ 98 | # Comment in the public line in if your project uses Gatsby and not Next.js 99 | # https://nextjs.org/blog/next-9-1#public-directory-support 100 | # public 101 | 102 | # vuepress build output 103 | .vuepress/dist 104 | 105 | # vuepress v2.x temp and cache directory 106 | .temp 107 | .cache 108 | 109 | # Docusaurus cache and generated files 110 | .docusaurus 111 | 112 | # Serverless directories 113 | .serverless/ 114 | 115 | # FuseBox cache 116 | .fusebox/ 117 | 118 | # DynamoDB Local files 119 | .dynamodb/ 120 | 121 | # TernJS port file 122 | .tern-port 123 | 124 | # Stores VSCode versions used for testing VSCode extensions 125 | .vscode-test 126 | 127 | # yarn v2 128 | .yarn/cache 129 | .yarn/unplugged 130 | .yarn/build-state.yml 131 | .yarn/install-state.gz 132 | .pnp.* 133 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | npm run build 2 | npm run docs:api 3 | git add documentation/API.md 4 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | 4 | ## v1.0.0 5 | - Basic functionality implementation 6 | - API documentation 7 | 8 | 9 | ## v2.0.0 10 | 11 | ### Breaking changes 12 | - The attribute `ignore-background-click` is now renamed to `ignore-backdrop-click` to make its meaning more understandable 13 | 14 | ### Enhancements 15 | - The logic of `set open` now matches to the logic of the same setter in `` 16 | - More customization options 17 | - New option to prevent closure on dragging the sheet down (`ignore-dragging-down` attribute) 18 | - Support forms with `method="dialog"` inside of sheet (like in the `` element) 19 | - New `cancel` event that is called when a sheet gets closed without form submition 20 | - Allows to prevent the form from closing 21 | 22 | ### Bug fixes 23 | - A duplicate event used to be triggered when calling `show`, `showModal`, or `close` twice 24 | 25 | 26 | ## v2.1.0 27 | 28 | ### Bug fixes 29 | - Do not access attributes inside of the constructor. It should not be done according to the standard. 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HTML Sheet Element 2 | 3 | HTML Custom Element for creating sheets. Displayed as a bottom sheet on mobile and a centered sheet on desktop. 4 | 5 | 6 | ## Features 7 | 8 | - There is a handle at the top of the sheet that can be used to open or close the sheet 9 | - The sheet can be closed using a button in the sheet header, using the `Esc` key, or by clicking outside the bottom sheet 10 | - This behavior is configurable. You can turn off the `Esc` or the click outside the sheet when you want. 11 | - API is similar to the `` element's 12 | - Supports forms inside of it 13 | - Uses familiar method names and the same event names 14 | - There are many customization options 15 | 16 | 17 | ## Installation 18 | 19 | You can install this library from the npm registry: 20 | 21 | ```bash 22 | npm install @ivteplo/html-sheet-element 23 | ``` 24 | 25 | Or you can import it dynamically from a CDN: 26 | 27 | ```javascript 28 | const { SheetElement } = await import("https://unpkg.com/@ivteplo/html-sheet-element@1.0.0/build/index.js") 29 | ``` 30 | 31 | 32 | ## Usage 33 | 34 | Before being able to use the element in your HTML, you need to specify a tag name for it using JavaScript: 35 | 36 | ```javascript 37 | import { SheetElement } from "@ivteplo/html-sheet-element" 38 | 39 | // You can choose another tag name instead of `ui-sheet` 40 | SheetElement.defineAs("ui-sheet") 41 | ``` 42 | 43 | Then you can use the tag in your HTML: 44 | 45 | ```html 46 | 47 |

Hello World!

48 |
49 | ``` 50 | 51 | To open a sheet, call the element's `showModal` method: 52 | 53 | ```javascript 54 | const sheet = document.querySelector("ui-sheet") 55 | sheet.showModal() 56 | ``` 57 | 58 | 59 | ## API Documentation 60 | 61 | You can find API documentation [here](./documentation/API.md). 62 | 63 | 64 | ## Development 65 | 66 | ### Prerequisites 67 | 68 | You need to have Git, Node.js, Deno, and any browser installed. 69 | 70 | ### Setup 71 | 72 | 1. Open your terminal 73 | 74 | 2. Clone this repository 75 | ```bash 76 | git clone https://github.com/ivteplo/html-sheet-element/ 77 | ``` 78 | 79 | 3. Navigate into the cloned directory 80 | ```bash 81 | cd html-sheet-element 82 | ``` 83 | 84 | 4. Install dependencies 85 | ```bash 86 | npm install 87 | ``` 88 | 89 | 5. Start the development server 90 | ```bash 91 | npm run dev 92 | ``` 93 | 94 | 6. Build the library 95 | ```bash 96 | npm run build 97 | ``` 98 | 99 | 7. Build the API documentation 100 | ```bash 101 | npm run docs:api 102 | ``` 103 | 104 | 8. Happy hacking :tada: 105 | 106 | -------------------------------------------------------------------------------- /documentation/API.md: -------------------------------------------------------------------------------- 1 | # `SheetElement` 2 | 3 | HTML Custom Element for creating sheets 4 | 5 |
6 | Example: Define the element in the registry and use it in your HTML 7 | 8 | ```jsx 9 | import SheetElement from "@ivteplo/html-sheet-element" 10 | SheetElement.defineAs("ui-sheet") 11 | 12 | // in HTML: 13 | 14 |

Hello World!

15 |
16 | ``` 17 | 18 |
19 | 20 |
21 | Example: Open the sheet by default 22 | 23 | ```jsx 24 | 25 |

Hello World!

26 |
27 | ``` 28 | 29 |
30 | 31 |
32 | Example: Execute certain actions when the sheet opens or closes 33 | 34 | ```jsx 35 | const sheet = document.querySelector("...") 36 | 37 | sheet.addEventListener("open", event => { 38 | console.log("The sheet is now shown") 39 | }) 40 | 41 | sheet.addEventListener("close", event => { 42 | console.log("The sheet is now closed") 43 | }) 44 | ``` 45 | 46 |
47 | 48 |
49 | Example: Confirm whether the user actually wants to close a sheet without submition 50 | 51 | ```jsx 52 | // HTML: 53 | 54 |
55 | 56 | 57 |
58 |
59 | 60 | // JavaScript: 61 | sheet.addEventListener("cancel", event => { 62 | const userWantsToClose = confirm("Are you sure you want to close the form without submition?") 63 | if (!userWantsToClose) { 64 | // the sheet is not going to be closed 65 | event.preventDefault() 66 | } 67 | }) 68 | ``` 69 | 70 |
71 | 72 |
73 | Example: Open the sheet programmatically 74 | 75 | ```jsx 76 | const sheet = document.querySelector("...") 77 | 78 | sheet.showModal() 79 | // is the same as: 80 | sheet.show() 81 | ``` 82 | 83 |
84 | 85 |
86 | Example: Show a title in the sheet header 87 | 88 | ```jsx 89 | 90 |

Title

91 | 92 |
93 | ``` 94 | 95 |
96 | 97 |
98 | Example: Replace a button in the sheet header 99 | 100 | ```jsx 101 | 102 | 103 | 104 | 105 | ``` 106 | 107 |
108 | 109 | 110 | ## `options` 111 | 112 | Options for behavior customization 113 | 114 |
115 | Example: Make the sheet not close on backdrop click 116 | 117 | ```jsx 118 | 119 | ... 120 | 121 | ``` 122 | 123 |
124 | 125 |
126 | Example: Make the sheet not close when pressing Escape 127 | 128 | ```jsx 129 | 130 | ... 131 | 132 | ``` 133 | 134 |
135 | 136 |
137 | Example: Make the sheet not close when dragging it down 138 | 139 | ```jsx 140 | 141 | ... 142 | 143 | ``` 144 | 145 |
146 | 147 | 148 | ## `returnValue` 149 | 150 | Gets or sets the return value for the sheet, usually to indicate which button the user pressed to close it. 151 | 152 | **see**: https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/returnValue 153 | 154 | **type**: string 155 | 156 | 157 | ## `static defineAs(tag: string): void` 158 | 159 | Function to define the sheet element in the HTML Custom Element Registry 160 | 161 |
162 | Example 163 | 164 | ```jsx 165 | import SheetElement from "@ivteplo/html-sheet-element" 166 | SheetElement.defineAs("ui-sheet") 167 | ``` 168 | 169 |
170 | 171 | 172 | ## `showModal(): void` 173 | 174 | Open the sheet 175 | 176 | 177 | ## `show(): void` 178 | 179 | Open the sheet 180 | 181 | 182 | ## `close(): void` 183 | 184 | Collapse the sheet 185 | 186 | 187 | ## `get open(): boolean` 188 | 189 | Check if the sheet is open 190 | 191 | 192 | ## `set open(value: boolean): boolean` 193 | 194 | An alternative way to open or close the sheet 195 | 196 |
197 | Example 198 | 199 | ```jsx 200 | sheet.open = true // the same as executing sheet.show() 201 | sheet.open = false // the same as executing sheet.close() 202 | ``` 203 | 204 |
205 | -------------------------------------------------------------------------------- /library/helpers.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2022-2025 Ivan Teplov 3 | // Licensed under the Apache license 2.0 4 | // 5 | 6 | /** 7 | * Check if the element is focused 8 | * @param {HTMLElement} 9 | * @returns {boolean} 10 | */ 11 | export const isFocused = element => document.activeElement === element 12 | 13 | /** 14 | * Get object that contains touch position (depending on event type) 15 | * @param {MouseEvent|TouchEvent} event 16 | * @returns {MouseEvent|Touch} 17 | */ 18 | export const touchPosition = (event) => 19 | event.type === "touchend" 20 | ? event.changedTouches[0] 21 | : event.type.startsWith("touch") 22 | ? event.touches[0] 23 | : event 24 | 25 | /** 26 | * @param {HTMLElement} element 27 | * @param {string} variableName 28 | * @returns {string?} 29 | */ 30 | export function getCSSVariableValue(element, variableName) { 31 | return getComputedStyle(element).getPropertyValue(variableName) 32 | } 33 | 34 | /** 35 | * Check if the element (or its shadow root) contains the child 36 | * @param {HTMLElement} child 37 | * @param {HTMLElement} element 38 | * @returns {boolean} 39 | */ 40 | export function elementContains(child, element) { 41 | return element.contains(child) || element.shadowRoot?.contains(child) 42 | } 43 | 44 | 45 | const eventHandlerAttributePattern = /^on([A-Z][a-zA-Z]*)$/ 46 | 47 | /** 48 | * @template {string} Tag 49 | * @param {Tag} tagName 50 | * @param {Record} attributes 51 | * @param {HTMLElement|string|number|bigint} children 52 | * @returns {ElementTagNameMap[Tag]|HTMLElement} 53 | */ 54 | export function createElement(tagName, attributes, ...children) { 55 | const element = document.createElement(tagName) 56 | attributes ??= {} 57 | 58 | for (const [attribute, value] of Object.entries(attributes)) { 59 | const eventHandlerPatternMatches = attribute.match(eventHandlerAttributePattern) 60 | 61 | if (eventHandlerPatternMatches) { 62 | const event = eventHandlerPatternMatches[1].toLowerCase() 63 | element.addEventListener(event, value) 64 | } else if (attribute === "reference") { 65 | value?.(element) 66 | } else { 67 | element.setAttribute(attribute, value) 68 | } 69 | } 70 | 71 | for (const child of children) { 72 | switch (typeof child) { 73 | case "undefined": 74 | break 75 | case "string": 76 | case "number": 77 | case "bigint": 78 | element.appendChild(document.createTextNode(String(child))) 79 | break 80 | case "object": 81 | if (child === null) { 82 | break 83 | } 84 | 85 | if (child instanceof HTMLElement) { 86 | element.appendChild(child) 87 | break 88 | } 89 | 90 | // Note: if the child is not of type HTMLElement, 91 | // we will go into the default handler too 92 | default: 93 | throw new Error("Unexpected type of child: " + typeof child) 94 | } 95 | } 96 | 97 | return element 98 | } 99 | 100 | /** 101 | * Map the number from one range to another 102 | * @param {number} number 103 | * @param {[from: number, to: number]} currentRange 104 | * @param {[from: number, to: number]} newRange 105 | * @returns {number} - value in the new interval 106 | */ 107 | export function mapNumber(number, currentRange, newRange) { 108 | const currentRangeSize = currentRange[1] - currentRange[0] 109 | const newRangeSize = newRange[1] - newRange[0] 110 | return (number - currentRange[0]) / currentRangeSize * newRangeSize + newRange[0] 111 | } 112 | -------------------------------------------------------------------------------- /library/index.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2022-2025 Ivan Teplov 3 | // Licensed under the Apache license 2.0 4 | // 5 | 6 | export { default as default, default as SheetElement } from "./sheet.jsx" 7 | -------------------------------------------------------------------------------- /library/sheet.jsx: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2022-2025 Ivan Teplov 3 | // Licensed under the Apache license 2.0 4 | // 5 | 6 | /** @jsx createElement */ 7 | 8 | import { isFocused, touchPosition, getCSSVariableValue, createElement, elementContains, mapNumber } from "./helpers.js" 9 | import { styleSheet } from "./styleSheet.js" 10 | 11 | /** 12 | * HTML Custom Element for creating sheets 13 | * 14 | * @example Define the element in the registry and use it in your HTML 15 | * import SheetElement from "@ivteplo/html-sheet-element" 16 | * SheetElement.defineAs("ui-sheet") 17 | * 18 | * // in HTML: 19 | * 20 | *

Hello World!

21 | *
22 | * 23 | * @example Open the sheet by default 24 | * 25 | *

Hello World!

26 | *
27 | * 28 | * @example Execute certain actions when the sheet opens or closes 29 | * const sheet = document.querySelector("...") 30 | * 31 | * sheet.addEventListener("open", event => { 32 | * console.log("The sheet is now shown") 33 | * }) 34 | * 35 | * sheet.addEventListener("close", event => { 36 | * console.log("The sheet is now closed") 37 | * }) 38 | * 39 | * @example Confirm whether the user actually wants to close a sheet without submition 40 | * // HTML: 41 | * 42 | *
43 | * 44 | * 45 | *
46 | *
47 | * 48 | * // JavaScript: 49 | * sheet.addEventListener("cancel", event => { 50 | * const userWantsToClose = confirm("Are you sure you want to close the form without submition?") 51 | * if (!userWantsToClose) { 52 | * // the sheet is not going to be closed 53 | * event.preventDefault() 54 | * } 55 | * }) 56 | * 57 | * @example Open the sheet programmatically 58 | * const sheet = document.querySelector("...") 59 | * 60 | * sheet.showModal() 61 | * // is the same as: 62 | * sheet.show() 63 | * 64 | * @example Show a title in the sheet header 65 | * 66 | *

Title

67 | * 68 | *
69 | * 70 | * @example Replace a button in the sheet header 71 | * 72 | * 73 | * 74 | * 75 | */ 76 | export class SheetElement extends HTMLElement { 77 | /** 78 | * Function to define the sheet element in the HTML Custom Element Registry 79 | * @param {string} tag - the tag name for the sheet element 80 | * @example 81 | * import SheetElement from "@ivteplo/html-sheet-element" 82 | * SheetElement.defineAs("ui-sheet") 83 | */ 84 | static defineAs(tag) { 85 | customElements.define(tag, this, {}) 86 | } 87 | 88 | /** 89 | * Inner wrapper 90 | * @type {HTMLDivElement} 91 | */ 92 | #sheet 93 | 94 | /** 95 | * Gray area on the top of the sheet to resize the sheet 96 | * @type {HTMLElement} 97 | */ 98 | #handle 99 | 100 | #scaleDownTo 101 | 102 | /** Just methods with 'this' binded */ 103 | #eventListeners = { 104 | onDragMove: this.#onDragMove.bind(this), 105 | onDragStart: this.#onDragStart.bind(this), 106 | onDragEnd: this.#onDragEnd.bind(this), 107 | onKeyUp: this.#onKeyUp.bind(this), 108 | onCloseButtonClick: this.#onCloseButtonClick.bind(this), 109 | onBackdropClick: this.#onBackdropClick.bind(this), 110 | onSubmit: this.#onSubmit.bind(this) 111 | } 112 | 113 | /** 114 | * Options for behavior customization 115 | * 116 | * @example Make the sheet not close on backdrop click 117 | * 118 | * ... 119 | * 120 | * 121 | * @example Make the sheet not close when pressing Escape 122 | * 123 | * ... 124 | * 125 | * 126 | * @example Make the sheet not close when dragging it down 127 | * 128 | * ... 129 | * 130 | */ 131 | options = { 132 | closeOnBackdropClick: true, 133 | closeOnEscapeKey: true, 134 | closeOnDraggingDown: true 135 | } 136 | 137 | /** 138 | * Gets or sets the return value for the sheet, usually to indicate which button the user pressed to close it. 139 | * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/returnValue 140 | * @type {string} 141 | */ 142 | returnValue = "" 143 | 144 | #performedInitialization = false 145 | 146 | constructor() { 147 | super() 148 | 149 | const shadowRoot = this.attachShadow({ 150 | mode: "open" 151 | }) 152 | 153 | shadowRoot.adoptedStyleSheets = [styleSheet] 154 | 155 | shadowRoot.append( 156 |
, 157 |
this.#sheet = sheet}> 158 |
159 |
160 | 161 |
162 | 163 |
this.#handle = area} 166 | onMouseDown={this.#eventListeners.onDragStart} 167 | onTouchStart={this.#eventListeners.onDragStart} 168 | > 169 |
170 |
171 | 172 |
173 | 174 | 183 | 184 |
185 |
186 |
187 | 188 |
189 |
190 | ) 191 | } 192 | 193 | /** 194 | * Attaches event listeners to the window when the sheet is mounted 195 | * @ignore 196 | */ 197 | connectedCallback() { 198 | if (!(this.#performedInitialization)) { 199 | this.role = "dialog" 200 | this.ariaModal = true 201 | this.addEventListener("submit", this.#eventListeners.onSubmit) 202 | 203 | Object.defineProperties(this.options, { 204 | closeOnBackdropClick: { 205 | get: () => 206 | !this.hasAttribute("ignore-backdrop-click"), 207 | set: value => Boolean(value) 208 | ? this.removeAttribute("ignore-backdrop-click") 209 | : this.setAttribute("ignore-backdrop-click", true) 210 | }, 211 | closeOnEscapeKey: { 212 | get: () => 213 | !this.hasAttribute("ignore-escape-key"), 214 | set: value => Boolean(value) 215 | ? this.removeAttribute("ignore-escape-key") 216 | : this.setAttribute("ignore-escape-key", true) 217 | }, 218 | closeOnDraggingDown: { 219 | get: () => 220 | !this.hasAttribute("ignore-dragging-down"), 221 | set: value => Boolean(value) 222 | ? this.removeAttribute("ignore-dragging-down") 223 | : this.setAttribute("ignore-dragging-down", true) 224 | } 225 | }) 226 | 227 | this.#performedInitialization = true 228 | } 229 | 230 | window.addEventListener("keyup", this.#eventListeners.onKeyUp) 231 | 232 | window.addEventListener("mousemove", this.#eventListeners.onDragMove) 233 | window.addEventListener("touchmove", this.#eventListeners.onDragMove) 234 | 235 | window.addEventListener("mouseup", this.#eventListeners.onDragEnd) 236 | window.addEventListener("touchend", this.#eventListeners.onDragEnd) 237 | } 238 | 239 | /** 240 | * Removes all the event listeners when the sheet is no longer mounted 241 | * @ignore 242 | */ 243 | disconnectedCallback() { 244 | window.removeEventListener("keyup", this.#eventListeners.onKeyUp) 245 | 246 | window.removeEventListener("mousemove", this.#eventListeners.onDragMove) 247 | window.removeEventListener("touchmove", this.#eventListeners.onDragMove) 248 | 249 | window.removeEventListener("mouseup", this.#eventListeners.onDragEnd) 250 | window.removeEventListener("touchend", this.#eventListeners.onDragEnd) 251 | } 252 | 253 | /** 254 | * Open the sheet 255 | */ 256 | showModal() { 257 | if (!this.hasAttribute("open")) { 258 | this.setAttribute("open", true) 259 | this.ariaHidden = false 260 | 261 | const event = new CustomEvent("open", { 262 | bubbles: false, 263 | cancelable: false 264 | }) 265 | 266 | this.dispatchEvent(event) 267 | } 268 | } 269 | 270 | /** 271 | * Open the sheet 272 | */ 273 | show() { 274 | this.showModal() 275 | } 276 | 277 | /** 278 | * Collapse the sheet 279 | */ 280 | close() { 281 | if (!this.hasAttribute("open")) { 282 | return 283 | } 284 | 285 | this.removeAttribute("open") 286 | this.ariaHidden = true 287 | 288 | const event = new CustomEvent("close", { 289 | bubbles: false, 290 | cancelable: false 291 | }) 292 | 293 | this.dispatchEvent(event) 294 | } 295 | 296 | /** 297 | * Close the sheet when the form hasn't been submitted 298 | */ 299 | #cancelAndCloseIfApplicable() { 300 | if (!this.hasAttribute("open")) { 301 | return 302 | } 303 | 304 | const event = new CustomEvent("cancel", { 305 | bubbles: false, 306 | cancelable: true 307 | }) 308 | 309 | const isDefaultBehaviorNotPrevented = this.dispatchEvent(event) 310 | 311 | if (isDefaultBehaviorNotPrevented) { 312 | this.close() 313 | } 314 | } 315 | 316 | /** 317 | * Check if the sheet is open 318 | * @returns {boolean} 319 | */ 320 | get open() { 321 | return this.hasAttribute("open") 322 | } 323 | 324 | /** 325 | * An alternative way to open or close the sheet 326 | * @param {boolean} value 327 | * @returns {boolean} 328 | * @example 329 | * sheet.open = true // the same as executing sheet.show() 330 | * sheet.open = false // the same as executing sheet.close() 331 | */ 332 | set open(value) { 333 | if (value === false || value === undefined) { 334 | this.close() 335 | return false 336 | } else { 337 | this.show() 338 | return true 339 | } 340 | } 341 | 342 | /** 343 | * On submit of a form inside of the sheet 344 | * @param {SubmitEvent} event 345 | * @returns {void} 346 | */ 347 | #onSubmit(event) { 348 | const form = event.target 349 | const button = event.submitter 350 | 351 | if (form?.method === "dialog" || button?.formMethod === "dialog") { 352 | event.stopImmediatePropagation() 353 | event.preventDefault() 354 | 355 | this.returnValue = button?.value ?? "" 356 | this.close() 357 | } 358 | } 359 | 360 | /** 361 | * Hide the sheet when clicking at the backdrop 362 | * @returns {void} 363 | */ 364 | #onBackdropClick() { 365 | if (this.options.closeOnBackdropClick) { 366 | this.#cancelAndCloseIfApplicable() 367 | } 368 | } 369 | 370 | /** 371 | * Hide the sheet when clicking at the 'close' button 372 | * @returns {void} 373 | */ 374 | #onCloseButtonClick() { 375 | this.#cancelAndCloseIfApplicable() 376 | } 377 | 378 | /** 379 | * Hide the sheet when pressing Escape if the target element is not an input field 380 | * @param {KeyboardEvent} event 381 | * @returns {void} 382 | */ 383 | #onKeyUp(event) { 384 | const isSheetElementFocused = 385 | elementContains(event.target, this) && isFocused(event.target) 386 | 387 | if (event.key === "Escape" && !isSheetElementFocused && this.options.closeOnEscapeKey) { 388 | this.#cancelAndCloseIfApplicable() 389 | } 390 | } 391 | 392 | #dragPosition 393 | 394 | /** 395 | * Function that changes sheet's size and location during the dragging process 396 | * @param {number} distanceToTheBottomInPercents - percents relative to the height of the sheet 397 | */ 398 | #dragSheet(distanceToTheBottomInPercents) { 399 | const translateY = 100 - distanceToTheBottomInPercents 400 | const scale = mapNumber(distanceToTheBottomInPercents, [0, 100], [this.#scaleDownTo, 1]) 401 | 402 | this.#sheet.style.transform = `translateY(${translateY}%) scale(${scale})` 403 | this.#sheet.style.transition = "none" 404 | } 405 | 406 | /** 407 | * Gets called when the user starts grabbing the 'sheet thumb' 408 | * @param {MouseEvent|TouchEvent} event 409 | * @returns {void} 410 | */ 411 | #onDragStart(event) { 412 | this.#dragPosition = touchPosition(event).pageY 413 | this.#sheet.classList.add("is-resized") 414 | this.#handle.style.cursor = document.body.style.cursor = "grabbing" 415 | 416 | this.#scaleDownTo = +getCSSVariableValue(this.#sheet, "--scale-down-to") 417 | } 418 | 419 | /** 420 | * Distance from the cursor to the bottom of the sheet in percents (relative to the sheet height) 421 | */ 422 | #getDistanceToTheBottomInPercents(y) { 423 | const deltaY = this.#dragPosition - y 424 | const distanceToTheBottomInPercents = 100 + deltaY / this.#sheet.clientHeight * 100 425 | return Math.max(0, Math.min(100, distanceToTheBottomInPercents)) 426 | } 427 | 428 | /** 429 | * Gets called when the user is moving the 'sheet thumb'. 430 | * Updates the height of the sheet 431 | * @param {MouseEvent|TouchEvent} event 432 | * @returns {void} 433 | */ 434 | #onDragMove(event) { 435 | if (this.#dragPosition === undefined) return 436 | 437 | this.#dragSheet(this.#getDistanceToTheBottomInPercents(touchPosition(event).pageY)) 438 | } 439 | 440 | /** 441 | * Get called when the user stops grabbing the sheet 442 | * @param {MouseEvent|TouchEvent} event 443 | * @returns {void} 444 | */ 445 | #onDragEnd(event) { 446 | if (this.#dragPosition === undefined) return 447 | 448 | const distanceToTheBottomInPercents = 449 | this.#getDistanceToTheBottomInPercents(touchPosition(event).pageY) 450 | 451 | if (distanceToTheBottomInPercents < 75 && this.options.closeOnDraggingDown) { 452 | this.close() 453 | } 454 | 455 | this.#handle.style.cursor = document.body.style.cursor = "" 456 | this.#dragPosition = undefined 457 | 458 | this.#sheet.classList.remove("is-resized") 459 | 460 | this.#sheet.style.transform = "" 461 | this.#sheet.style.transition = "" 462 | } 463 | } 464 | 465 | export default SheetElement 466 | -------------------------------------------------------------------------------- /library/styleSheet.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2022-2025 Ivan Teplov 3 | // Licensed under the Apache license 2.0 4 | // 5 | 6 | export const styleSheet = new CSSStyleSheet() 7 | export default styleSheet 8 | 9 | styleSheet.replaceSync(` 10 | :host { 11 | --_sheet-foreground-color: var(--sheet-foreground-color, inherit); 12 | --_sheet-background-color: var(--sheet-background-color, #fff); 13 | 14 | --_sheet-border-radius: var(--sheet-border-radius, 1rem); 15 | 16 | --_sheet-min-width: var(--sheet-min-width, 18rem); 17 | --_sheet-width: var(--sheet-width, 90vw); 18 | --_sheet-max-width: var(--sheet-max-width, auto); 19 | 20 | --_sheet-min-height: var(--sheet-min-height, 30vh); 21 | --_sheet-height: var(--sheet-height, auto); 22 | --_sheet-max-height: var(--sheet-max-height, 100vh); 23 | 24 | --_sheet-scale-down-to: 0.5; 25 | --_sheet-z-index: var(--sheet-z-index, 1); 26 | --_sheet-transition-duration: var(--sheet-transition-duration, 0.5s); 27 | 28 | --_sheet-backdrop-color: var(--sheet-backdrop-color, #88888880); 29 | 30 | --_sheet-header-padding: var(--sheet-header-padding, 0 0 0 1rem); 31 | --_sheet-title-margin: var(--sheet-title-margin, 0.5rem 0); 32 | --_sheet-body-padding: var(--sheet-body-padding, 0 1rem 1rem 1rem); 33 | 34 | --_sheet-handle-width: var(--sheet-handle-width, 3rem); 35 | --_sheet-handle-height: var(--sheet-handle-height, 0.25rem); 36 | --_sheet-handle-color: var(--sheet-handle-color, #eee); 37 | --_sheet-handle-border-radius: var(--sheet-handle-border-radius, 0.125rem); 38 | --_sheet-handle-container-padding: var(--sheet-handle-container-padding, 1rem); 39 | } 40 | 41 | @media (prefers-color-scheme: dark) { 42 | :host { 43 | --_sheet-background-color: var(--sheet-background-color, black); 44 | --_sheet-foreground-color: var(--sheet-foreground-color, white); 45 | --_sheet-handle-color: var(--sheet-handle-color, #333333); 46 | } 47 | } 48 | 49 | @media (prefers-reduced-motion: reduce) { 50 | :host { 51 | --_sheet-transition-duration: var(--sheet-transition-duration, 0.1s); 52 | } 53 | } 54 | 55 | /* tablet */ 56 | @media (min-width: 48rem) { 57 | :host { 58 | --_sheet-width: var(--sheet-width, auto); 59 | --_sheet-max-width: var(--sheet-max-width, 48rem); 60 | --_sheet-max-height: var(--sheet-max-height, 32rem); 61 | } 62 | } 63 | 64 | :host { 65 | display: flex; 66 | flex-direction: column; 67 | align-items: center; 68 | justify-content: flex-end; 69 | 70 | position: fixed; 71 | top: 0; 72 | left: 0; 73 | right: 0; 74 | bottom: 0; 75 | z-index: var(--_sheet-z-index); 76 | 77 | transition: 78 | opacity var(--_sheet-transition-duration), 79 | visibility var(--_sheet-transition-duration); 80 | } 81 | 82 | :host(:not([open])) { 83 | opacity: 0; 84 | visibility: hidden; 85 | pointer-events: none; 86 | } 87 | 88 | /* ::backdrop is not supported :( */ 89 | .sheet-backdrop { 90 | position: absolute; 91 | top: 0; 92 | left: 0; 93 | right: 0; 94 | bottom: 0; 95 | background-color: var(--_sheet-backdrop-color); 96 | } 97 | 98 | .sheet-contents { 99 | display: flex; 100 | flex-direction: column; 101 | 102 | border-radius: var(--_sheet-border-radius) var(--_sheet-border-radius) 0 0; 103 | 104 | background: var(--_sheet-background-color); 105 | 106 | overflow-y: hidden; 107 | 108 | transform: translateY(0) scale(1); 109 | 110 | min-width: var(--_sheet-min-width); 111 | width: var(--_sheet-width); 112 | max-width: var(--_sheet-max-width); 113 | 114 | min-height: var(--_sheet-min-height); 115 | height: var(--_sheet-height); 116 | max-height: var(--_sheet-max-height); 117 | 118 | box-sizing: border-box; 119 | 120 | transition: 121 | transform var(--_sheet-transition-duration), 122 | border-radius var(--_sheet-transition-duration); 123 | } 124 | 125 | :host(:not([open])) .sheet-contents { 126 | transform: translateY(100%) scale(var(--_sheet-scale-down-to)); 127 | } 128 | 129 | .sheet-contents.is-resized { 130 | user-select: none; 131 | } 132 | 133 | .sheet-controls { 134 | display: grid; 135 | grid-template-columns: 1fr auto 1fr; 136 | align-items: stretch; 137 | padding: var(--_sheet-header-padding); 138 | } 139 | 140 | .sheet-title-area { 141 | display: flex; 142 | justify-content: flex-start; 143 | } 144 | 145 | .sheet-title-area:not(:empty) { 146 | padding: var(--_sheet-title-margin); 147 | } 148 | 149 | .sheet-handle-container { 150 | display: flex; 151 | flex-direction: column; 152 | justify-content: center; 153 | 154 | min-height: var(--_sheet-handle-height); 155 | height: 100%; 156 | 157 | padding: var(--_sheet-handle-container-padding); 158 | box-sizing: border-box; 159 | 160 | margin: auto; 161 | cursor: grab; 162 | } 163 | 164 | .sheet-handle { 165 | width: var(--_sheet-handle-width); 166 | height: var(--_sheet-handle-height); 167 | background: var(--_sheet-handle-color); 168 | border-radius: var(--_sheet-handle-border-radius); 169 | } 170 | 171 | .sheet-button-area { 172 | display: flex; 173 | justify-content: flex-end; 174 | } 175 | 176 | .sheet-close-button { 177 | border: none; 178 | padding: 0.7rem; 179 | background: transparent; 180 | cursor: pointer; 181 | color: inherit; 182 | font-weight: 500; 183 | } 184 | 185 | .sheet-body { 186 | flex-grow: 1; 187 | height: 100%; 188 | 189 | display: flex; 190 | flex-direction: column; 191 | 192 | overflow-y: auto; 193 | 194 | padding: var(--_sheet-body-padding); 195 | box-sizing: border-box; 196 | } 197 | 198 | /* tablet */ 199 | @media (min-width: 48rem) { 200 | :host { 201 | justify-content: center; 202 | } 203 | 204 | .sheet-contents { 205 | border-radius: var(--_sheet-border-radius); 206 | } 207 | 208 | .sheet-handle-container { 209 | display: none; 210 | } 211 | 212 | .sheet-controls { 213 | grid-template-columns: 1fr auto auto; 214 | } 215 | } 216 | `) 217 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ivteplo/html-sheet-element", 3 | "version": "2.1.2", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@ivteplo/html-sheet-element", 9 | "version": "2.1.2", 10 | "license": "Apache-2.0", 11 | "devDependencies": { 12 | "husky": "^9.1.7", 13 | "typescript": "^5.8.2", 14 | "vite": "^6.2.0", 15 | "vite-plugin-dts": "^4.5.1" 16 | } 17 | }, 18 | "components/sheet": { 19 | "name": "@ivteplo/html-sheet-element", 20 | "version": "2.1.0", 21 | "extraneous": true, 22 | "license": "Apache-2.0", 23 | "devDependencies": { 24 | "vite": "^4.3.0" 25 | } 26 | }, 27 | "node_modules/@babel/helper-string-parser": { 28 | "version": "7.25.9", 29 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 30 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 31 | "dev": true, 32 | "license": "MIT", 33 | "engines": { 34 | "node": ">=6.9.0" 35 | } 36 | }, 37 | "node_modules/@babel/helper-validator-identifier": { 38 | "version": "7.25.9", 39 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 40 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 41 | "dev": true, 42 | "license": "MIT", 43 | "engines": { 44 | "node": ">=6.9.0" 45 | } 46 | }, 47 | "node_modules/@babel/parser": { 48 | "version": "7.26.9", 49 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", 50 | "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", 51 | "dev": true, 52 | "license": "MIT", 53 | "dependencies": { 54 | "@babel/types": "^7.26.9" 55 | }, 56 | "bin": { 57 | "parser": "bin/babel-parser.js" 58 | }, 59 | "engines": { 60 | "node": ">=6.0.0" 61 | } 62 | }, 63 | "node_modules/@babel/types": { 64 | "version": "7.26.9", 65 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", 66 | "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", 67 | "dev": true, 68 | "license": "MIT", 69 | "dependencies": { 70 | "@babel/helper-string-parser": "^7.25.9", 71 | "@babel/helper-validator-identifier": "^7.25.9" 72 | }, 73 | "engines": { 74 | "node": ">=6.9.0" 75 | } 76 | }, 77 | "node_modules/@esbuild/aix-ppc64": { 78 | "version": "0.25.0", 79 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", 80 | "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", 81 | "cpu": [ 82 | "ppc64" 83 | ], 84 | "dev": true, 85 | "license": "MIT", 86 | "optional": true, 87 | "os": [ 88 | "aix" 89 | ], 90 | "engines": { 91 | "node": ">=18" 92 | } 93 | }, 94 | "node_modules/@esbuild/netbsd-arm64": { 95 | "version": "0.25.0", 96 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", 97 | "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", 98 | "cpu": [ 99 | "arm64" 100 | ], 101 | "dev": true, 102 | "license": "MIT", 103 | "optional": true, 104 | "os": [ 105 | "netbsd" 106 | ], 107 | "engines": { 108 | "node": ">=18" 109 | } 110 | }, 111 | "node_modules/@esbuild/openbsd-arm64": { 112 | "version": "0.25.0", 113 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", 114 | "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", 115 | "cpu": [ 116 | "arm64" 117 | ], 118 | "dev": true, 119 | "license": "MIT", 120 | "optional": true, 121 | "os": [ 122 | "openbsd" 123 | ], 124 | "engines": { 125 | "node": ">=18" 126 | } 127 | }, 128 | "node_modules/@jridgewell/sourcemap-codec": { 129 | "version": "1.5.0", 130 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 131 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 132 | "dev": true, 133 | "license": "MIT" 134 | }, 135 | "node_modules/@microsoft/api-extractor": { 136 | "version": "7.51.1", 137 | "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.51.1.tgz", 138 | "integrity": "sha512-VoFvIeYXme8QctXDkixy1KIn750kZaFy2snAEOB3nhDFfbBcJNEcvBrpCIQIV09MqI4g9egKUkg+/12WMRC77w==", 139 | "dev": true, 140 | "license": "MIT", 141 | "dependencies": { 142 | "@microsoft/api-extractor-model": "7.30.3", 143 | "@microsoft/tsdoc": "~0.15.1", 144 | "@microsoft/tsdoc-config": "~0.17.1", 145 | "@rushstack/node-core-library": "5.11.0", 146 | "@rushstack/rig-package": "0.5.3", 147 | "@rushstack/terminal": "0.15.0", 148 | "@rushstack/ts-command-line": "4.23.5", 149 | "lodash": "~4.17.15", 150 | "minimatch": "~3.0.3", 151 | "resolve": "~1.22.1", 152 | "semver": "~7.5.4", 153 | "source-map": "~0.6.1", 154 | "typescript": "5.7.3" 155 | }, 156 | "bin": { 157 | "api-extractor": "bin/api-extractor" 158 | } 159 | }, 160 | "node_modules/@microsoft/api-extractor-model": { 161 | "version": "7.30.3", 162 | "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.3.tgz", 163 | "integrity": "sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w==", 164 | "dev": true, 165 | "license": "MIT", 166 | "dependencies": { 167 | "@microsoft/tsdoc": "~0.15.1", 168 | "@microsoft/tsdoc-config": "~0.17.1", 169 | "@rushstack/node-core-library": "5.11.0" 170 | } 171 | }, 172 | "node_modules/@microsoft/api-extractor/node_modules/typescript": { 173 | "version": "5.7.3", 174 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", 175 | "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", 176 | "dev": true, 177 | "license": "Apache-2.0", 178 | "bin": { 179 | "tsc": "bin/tsc", 180 | "tsserver": "bin/tsserver" 181 | }, 182 | "engines": { 183 | "node": ">=14.17" 184 | } 185 | }, 186 | "node_modules/@microsoft/tsdoc": { 187 | "version": "0.15.1", 188 | "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", 189 | "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", 190 | "dev": true, 191 | "license": "MIT" 192 | }, 193 | "node_modules/@microsoft/tsdoc-config": { 194 | "version": "0.17.1", 195 | "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", 196 | "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", 197 | "dev": true, 198 | "license": "MIT", 199 | "dependencies": { 200 | "@microsoft/tsdoc": "0.15.1", 201 | "ajv": "~8.12.0", 202 | "jju": "~1.4.0", 203 | "resolve": "~1.22.2" 204 | } 205 | }, 206 | "node_modules/@rollup/pluginutils": { 207 | "version": "5.1.4", 208 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", 209 | "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", 210 | "dev": true, 211 | "license": "MIT", 212 | "dependencies": { 213 | "@types/estree": "^1.0.0", 214 | "estree-walker": "^2.0.2", 215 | "picomatch": "^4.0.2" 216 | }, 217 | "engines": { 218 | "node": ">=14.0.0" 219 | }, 220 | "peerDependencies": { 221 | "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" 222 | }, 223 | "peerDependenciesMeta": { 224 | "rollup": { 225 | "optional": true 226 | } 227 | } 228 | }, 229 | "node_modules/@rollup/rollup-android-arm-eabi": { 230 | "version": "4.34.9", 231 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.9.tgz", 232 | "integrity": "sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==", 233 | "cpu": [ 234 | "arm" 235 | ], 236 | "dev": true, 237 | "license": "MIT", 238 | "optional": true, 239 | "os": [ 240 | "android" 241 | ] 242 | }, 243 | "node_modules/@rollup/rollup-android-arm64": { 244 | "version": "4.34.9", 245 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.9.tgz", 246 | "integrity": "sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==", 247 | "cpu": [ 248 | "arm64" 249 | ], 250 | "dev": true, 251 | "license": "MIT", 252 | "optional": true, 253 | "os": [ 254 | "android" 255 | ] 256 | }, 257 | "node_modules/@rollup/rollup-darwin-arm64": { 258 | "version": "4.34.9", 259 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz", 260 | "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==", 261 | "cpu": [ 262 | "arm64" 263 | ], 264 | "dev": true, 265 | "license": "MIT", 266 | "optional": true, 267 | "os": [ 268 | "darwin" 269 | ] 270 | }, 271 | "node_modules/@rollup/rollup-darwin-x64": { 272 | "version": "4.34.9", 273 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz", 274 | "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==", 275 | "cpu": [ 276 | "x64" 277 | ], 278 | "dev": true, 279 | "license": "MIT", 280 | "optional": true, 281 | "os": [ 282 | "darwin" 283 | ] 284 | }, 285 | "node_modules/@rollup/rollup-freebsd-arm64": { 286 | "version": "4.34.9", 287 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.9.tgz", 288 | "integrity": "sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==", 289 | "cpu": [ 290 | "arm64" 291 | ], 292 | "dev": true, 293 | "license": "MIT", 294 | "optional": true, 295 | "os": [ 296 | "freebsd" 297 | ] 298 | }, 299 | "node_modules/@rollup/rollup-freebsd-x64": { 300 | "version": "4.34.9", 301 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.9.tgz", 302 | "integrity": "sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==", 303 | "cpu": [ 304 | "x64" 305 | ], 306 | "dev": true, 307 | "license": "MIT", 308 | "optional": true, 309 | "os": [ 310 | "freebsd" 311 | ] 312 | }, 313 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 314 | "version": "4.34.9", 315 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.9.tgz", 316 | "integrity": "sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==", 317 | "cpu": [ 318 | "arm" 319 | ], 320 | "dev": true, 321 | "license": "MIT", 322 | "optional": true, 323 | "os": [ 324 | "linux" 325 | ] 326 | }, 327 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 328 | "version": "4.34.9", 329 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.9.tgz", 330 | "integrity": "sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==", 331 | "cpu": [ 332 | "arm" 333 | ], 334 | "dev": true, 335 | "license": "MIT", 336 | "optional": true, 337 | "os": [ 338 | "linux" 339 | ] 340 | }, 341 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 342 | "version": "4.34.9", 343 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz", 344 | "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==", 345 | "cpu": [ 346 | "arm64" 347 | ], 348 | "dev": true, 349 | "license": "MIT", 350 | "optional": true, 351 | "os": [ 352 | "linux" 353 | ] 354 | }, 355 | "node_modules/@rollup/rollup-linux-arm64-musl": { 356 | "version": "4.34.9", 357 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz", 358 | "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==", 359 | "cpu": [ 360 | "arm64" 361 | ], 362 | "dev": true, 363 | "license": "MIT", 364 | "optional": true, 365 | "os": [ 366 | "linux" 367 | ] 368 | }, 369 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 370 | "version": "4.34.9", 371 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.9.tgz", 372 | "integrity": "sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==", 373 | "cpu": [ 374 | "loong64" 375 | ], 376 | "dev": true, 377 | "license": "MIT", 378 | "optional": true, 379 | "os": [ 380 | "linux" 381 | ] 382 | }, 383 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 384 | "version": "4.34.9", 385 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.9.tgz", 386 | "integrity": "sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==", 387 | "cpu": [ 388 | "ppc64" 389 | ], 390 | "dev": true, 391 | "license": "MIT", 392 | "optional": true, 393 | "os": [ 394 | "linux" 395 | ] 396 | }, 397 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 398 | "version": "4.34.9", 399 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.9.tgz", 400 | "integrity": "sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==", 401 | "cpu": [ 402 | "riscv64" 403 | ], 404 | "dev": true, 405 | "license": "MIT", 406 | "optional": true, 407 | "os": [ 408 | "linux" 409 | ] 410 | }, 411 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 412 | "version": "4.34.9", 413 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.9.tgz", 414 | "integrity": "sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==", 415 | "cpu": [ 416 | "s390x" 417 | ], 418 | "dev": true, 419 | "license": "MIT", 420 | "optional": true, 421 | "os": [ 422 | "linux" 423 | ] 424 | }, 425 | "node_modules/@rollup/rollup-linux-x64-gnu": { 426 | "version": "4.34.9", 427 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz", 428 | "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==", 429 | "cpu": [ 430 | "x64" 431 | ], 432 | "dev": true, 433 | "license": "MIT", 434 | "optional": true, 435 | "os": [ 436 | "linux" 437 | ] 438 | }, 439 | "node_modules/@rollup/rollup-linux-x64-musl": { 440 | "version": "4.34.9", 441 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz", 442 | "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==", 443 | "cpu": [ 444 | "x64" 445 | ], 446 | "dev": true, 447 | "license": "MIT", 448 | "optional": true, 449 | "os": [ 450 | "linux" 451 | ] 452 | }, 453 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 454 | "version": "4.34.9", 455 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz", 456 | "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==", 457 | "cpu": [ 458 | "arm64" 459 | ], 460 | "dev": true, 461 | "license": "MIT", 462 | "optional": true, 463 | "os": [ 464 | "win32" 465 | ] 466 | }, 467 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 468 | "version": "4.34.9", 469 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.9.tgz", 470 | "integrity": "sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==", 471 | "cpu": [ 472 | "ia32" 473 | ], 474 | "dev": true, 475 | "license": "MIT", 476 | "optional": true, 477 | "os": [ 478 | "win32" 479 | ] 480 | }, 481 | "node_modules/@rollup/rollup-win32-x64-msvc": { 482 | "version": "4.34.9", 483 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz", 484 | "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==", 485 | "cpu": [ 486 | "x64" 487 | ], 488 | "dev": true, 489 | "license": "MIT", 490 | "optional": true, 491 | "os": [ 492 | "win32" 493 | ] 494 | }, 495 | "node_modules/@rushstack/node-core-library": { 496 | "version": "5.11.0", 497 | "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.11.0.tgz", 498 | "integrity": "sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ==", 499 | "dev": true, 500 | "license": "MIT", 501 | "dependencies": { 502 | "ajv": "~8.13.0", 503 | "ajv-draft-04": "~1.0.0", 504 | "ajv-formats": "~3.0.1", 505 | "fs-extra": "~11.3.0", 506 | "import-lazy": "~4.0.0", 507 | "jju": "~1.4.0", 508 | "resolve": "~1.22.1", 509 | "semver": "~7.5.4" 510 | }, 511 | "peerDependencies": { 512 | "@types/node": "*" 513 | }, 514 | "peerDependenciesMeta": { 515 | "@types/node": { 516 | "optional": true 517 | } 518 | } 519 | }, 520 | "node_modules/@rushstack/node-core-library/node_modules/ajv": { 521 | "version": "8.13.0", 522 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", 523 | "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", 524 | "dev": true, 525 | "license": "MIT", 526 | "dependencies": { 527 | "fast-deep-equal": "^3.1.3", 528 | "json-schema-traverse": "^1.0.0", 529 | "require-from-string": "^2.0.2", 530 | "uri-js": "^4.4.1" 531 | }, 532 | "funding": { 533 | "type": "github", 534 | "url": "https://github.com/sponsors/epoberezkin" 535 | } 536 | }, 537 | "node_modules/@rushstack/rig-package": { 538 | "version": "0.5.3", 539 | "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.3.tgz", 540 | "integrity": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==", 541 | "dev": true, 542 | "license": "MIT", 543 | "dependencies": { 544 | "resolve": "~1.22.1", 545 | "strip-json-comments": "~3.1.1" 546 | } 547 | }, 548 | "node_modules/@rushstack/terminal": { 549 | "version": "0.15.0", 550 | "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.0.tgz", 551 | "integrity": "sha512-vXQPRQ+vJJn4GVqxkwRe+UGgzNxdV8xuJZY2zem46Y0p3tlahucH9/hPmLGj2i9dQnUBFiRnoM9/KW7PYw8F4Q==", 552 | "dev": true, 553 | "license": "MIT", 554 | "dependencies": { 555 | "@rushstack/node-core-library": "5.11.0", 556 | "supports-color": "~8.1.1" 557 | }, 558 | "peerDependencies": { 559 | "@types/node": "*" 560 | }, 561 | "peerDependenciesMeta": { 562 | "@types/node": { 563 | "optional": true 564 | } 565 | } 566 | }, 567 | "node_modules/@rushstack/ts-command-line": { 568 | "version": "4.23.5", 569 | "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.5.tgz", 570 | "integrity": "sha512-jg70HfoK44KfSP3MTiL5rxsZH7X1ktX3cZs9Sl8eDu1/LxJSbPsh0MOFRC710lIuYYSgxWjI5AjbCBAl7u3RxA==", 571 | "dev": true, 572 | "license": "MIT", 573 | "dependencies": { 574 | "@rushstack/terminal": "0.15.0", 575 | "@types/argparse": "1.0.38", 576 | "argparse": "~1.0.9", 577 | "string-argv": "~0.3.1" 578 | } 579 | }, 580 | "node_modules/@types/argparse": { 581 | "version": "1.0.38", 582 | "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", 583 | "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", 584 | "dev": true, 585 | "license": "MIT" 586 | }, 587 | "node_modules/@types/estree": { 588 | "version": "1.0.6", 589 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 590 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 591 | "dev": true, 592 | "license": "MIT" 593 | }, 594 | "node_modules/@volar/language-core": { 595 | "version": "2.4.11", 596 | "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz", 597 | "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==", 598 | "dev": true, 599 | "license": "MIT", 600 | "dependencies": { 601 | "@volar/source-map": "2.4.11" 602 | } 603 | }, 604 | "node_modules/@volar/source-map": { 605 | "version": "2.4.11", 606 | "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz", 607 | "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==", 608 | "dev": true, 609 | "license": "MIT" 610 | }, 611 | "node_modules/@volar/typescript": { 612 | "version": "2.4.11", 613 | "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz", 614 | "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==", 615 | "dev": true, 616 | "license": "MIT", 617 | "dependencies": { 618 | "@volar/language-core": "2.4.11", 619 | "path-browserify": "^1.0.1", 620 | "vscode-uri": "^3.0.8" 621 | } 622 | }, 623 | "node_modules/@vue/compiler-core": { 624 | "version": "3.5.13", 625 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", 626 | "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", 627 | "dev": true, 628 | "license": "MIT", 629 | "dependencies": { 630 | "@babel/parser": "^7.25.3", 631 | "@vue/shared": "3.5.13", 632 | "entities": "^4.5.0", 633 | "estree-walker": "^2.0.2", 634 | "source-map-js": "^1.2.0" 635 | } 636 | }, 637 | "node_modules/@vue/compiler-dom": { 638 | "version": "3.5.13", 639 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", 640 | "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", 641 | "dev": true, 642 | "license": "MIT", 643 | "dependencies": { 644 | "@vue/compiler-core": "3.5.13", 645 | "@vue/shared": "3.5.13" 646 | } 647 | }, 648 | "node_modules/@vue/compiler-vue2": { 649 | "version": "2.7.16", 650 | "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", 651 | "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", 652 | "dev": true, 653 | "license": "MIT", 654 | "dependencies": { 655 | "de-indent": "^1.0.2", 656 | "he": "^1.2.0" 657 | } 658 | }, 659 | "node_modules/@vue/language-core": { 660 | "version": "2.2.4", 661 | "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.4.tgz", 662 | "integrity": "sha512-eGGdw7eWUwdIn9Fy/irJ7uavCGfgemuHQABgJ/hU1UgZFnbTg9VWeXvHQdhY+2SPQZWJqWXvRWIg67t4iWEa+Q==", 663 | "dev": true, 664 | "license": "MIT", 665 | "dependencies": { 666 | "@volar/language-core": "~2.4.11", 667 | "@vue/compiler-dom": "^3.5.0", 668 | "@vue/compiler-vue2": "^2.7.16", 669 | "@vue/shared": "^3.5.0", 670 | "alien-signals": "^1.0.3", 671 | "minimatch": "^9.0.3", 672 | "muggle-string": "^0.4.1", 673 | "path-browserify": "^1.0.1" 674 | }, 675 | "peerDependencies": { 676 | "typescript": "*" 677 | }, 678 | "peerDependenciesMeta": { 679 | "typescript": { 680 | "optional": true 681 | } 682 | } 683 | }, 684 | "node_modules/@vue/language-core/node_modules/brace-expansion": { 685 | "version": "2.0.1", 686 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 687 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 688 | "dev": true, 689 | "license": "MIT", 690 | "dependencies": { 691 | "balanced-match": "^1.0.0" 692 | } 693 | }, 694 | "node_modules/@vue/language-core/node_modules/minimatch": { 695 | "version": "9.0.5", 696 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 697 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 698 | "dev": true, 699 | "license": "ISC", 700 | "dependencies": { 701 | "brace-expansion": "^2.0.1" 702 | }, 703 | "engines": { 704 | "node": ">=16 || 14 >=14.17" 705 | }, 706 | "funding": { 707 | "url": "https://github.com/sponsors/isaacs" 708 | } 709 | }, 710 | "node_modules/@vue/shared": { 711 | "version": "3.5.13", 712 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", 713 | "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", 714 | "dev": true, 715 | "license": "MIT" 716 | }, 717 | "node_modules/acorn": { 718 | "version": "8.14.0", 719 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 720 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 721 | "dev": true, 722 | "license": "MIT", 723 | "bin": { 724 | "acorn": "bin/acorn" 725 | }, 726 | "engines": { 727 | "node": ">=0.4.0" 728 | } 729 | }, 730 | "node_modules/ajv": { 731 | "version": "8.12.0", 732 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", 733 | "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", 734 | "dev": true, 735 | "license": "MIT", 736 | "dependencies": { 737 | "fast-deep-equal": "^3.1.1", 738 | "json-schema-traverse": "^1.0.0", 739 | "require-from-string": "^2.0.2", 740 | "uri-js": "^4.2.2" 741 | }, 742 | "funding": { 743 | "type": "github", 744 | "url": "https://github.com/sponsors/epoberezkin" 745 | } 746 | }, 747 | "node_modules/ajv-draft-04": { 748 | "version": "1.0.0", 749 | "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", 750 | "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", 751 | "dev": true, 752 | "license": "MIT", 753 | "peerDependencies": { 754 | "ajv": "^8.5.0" 755 | }, 756 | "peerDependenciesMeta": { 757 | "ajv": { 758 | "optional": true 759 | } 760 | } 761 | }, 762 | "node_modules/ajv-formats": { 763 | "version": "3.0.1", 764 | "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", 765 | "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", 766 | "dev": true, 767 | "license": "MIT", 768 | "dependencies": { 769 | "ajv": "^8.0.0" 770 | }, 771 | "peerDependencies": { 772 | "ajv": "^8.0.0" 773 | }, 774 | "peerDependenciesMeta": { 775 | "ajv": { 776 | "optional": true 777 | } 778 | } 779 | }, 780 | "node_modules/alien-signals": { 781 | "version": "1.0.4", 782 | "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.4.tgz", 783 | "integrity": "sha512-DJqqQD3XcsaQcQ1s+iE2jDUZmmQpXwHiR6fCAim/w87luaW+vmLY8fMlrdkmRwzaFXhkxf3rqPCR59tKVv1MDw==", 784 | "dev": true, 785 | "license": "MIT" 786 | }, 787 | "node_modules/argparse": { 788 | "version": "1.0.10", 789 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 790 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 791 | "dev": true, 792 | "license": "MIT", 793 | "dependencies": { 794 | "sprintf-js": "~1.0.2" 795 | } 796 | }, 797 | "node_modules/balanced-match": { 798 | "version": "1.0.2", 799 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 800 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 801 | "dev": true, 802 | "license": "MIT" 803 | }, 804 | "node_modules/brace-expansion": { 805 | "version": "1.1.11", 806 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 807 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 808 | "dev": true, 809 | "license": "MIT", 810 | "dependencies": { 811 | "balanced-match": "^1.0.0", 812 | "concat-map": "0.0.1" 813 | } 814 | }, 815 | "node_modules/compare-versions": { 816 | "version": "6.1.1", 817 | "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", 818 | "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", 819 | "dev": true, 820 | "license": "MIT" 821 | }, 822 | "node_modules/concat-map": { 823 | "version": "0.0.1", 824 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 825 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 826 | "dev": true, 827 | "license": "MIT" 828 | }, 829 | "node_modules/confbox": { 830 | "version": "0.1.8", 831 | "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", 832 | "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", 833 | "dev": true, 834 | "license": "MIT" 835 | }, 836 | "node_modules/de-indent": { 837 | "version": "1.0.2", 838 | "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", 839 | "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", 840 | "dev": true, 841 | "license": "MIT" 842 | }, 843 | "node_modules/debug": { 844 | "version": "4.4.0", 845 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 846 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 847 | "dev": true, 848 | "license": "MIT", 849 | "dependencies": { 850 | "ms": "^2.1.3" 851 | }, 852 | "engines": { 853 | "node": ">=6.0" 854 | }, 855 | "peerDependenciesMeta": { 856 | "supports-color": { 857 | "optional": true 858 | } 859 | } 860 | }, 861 | "node_modules/entities": { 862 | "version": "4.5.0", 863 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 864 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 865 | "dev": true, 866 | "license": "BSD-2-Clause", 867 | "engines": { 868 | "node": ">=0.12" 869 | }, 870 | "funding": { 871 | "url": "https://github.com/fb55/entities?sponsor=1" 872 | } 873 | }, 874 | "node_modules/estree-walker": { 875 | "version": "2.0.2", 876 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 877 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 878 | "dev": true, 879 | "license": "MIT" 880 | }, 881 | "node_modules/fast-deep-equal": { 882 | "version": "3.1.3", 883 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 884 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 885 | "dev": true, 886 | "license": "MIT" 887 | }, 888 | "node_modules/fs-extra": { 889 | "version": "11.3.0", 890 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", 891 | "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", 892 | "dev": true, 893 | "license": "MIT", 894 | "dependencies": { 895 | "graceful-fs": "^4.2.0", 896 | "jsonfile": "^6.0.1", 897 | "universalify": "^2.0.0" 898 | }, 899 | "engines": { 900 | "node": ">=14.14" 901 | } 902 | }, 903 | "node_modules/fsevents": { 904 | "version": "2.3.3", 905 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 906 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 907 | "dev": true, 908 | "hasInstallScript": true, 909 | "license": "MIT", 910 | "optional": true, 911 | "os": [ 912 | "darwin" 913 | ], 914 | "engines": { 915 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 916 | } 917 | }, 918 | "node_modules/function-bind": { 919 | "version": "1.1.2", 920 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 921 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 922 | "dev": true, 923 | "license": "MIT", 924 | "funding": { 925 | "url": "https://github.com/sponsors/ljharb" 926 | } 927 | }, 928 | "node_modules/graceful-fs": { 929 | "version": "4.2.11", 930 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 931 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 932 | "dev": true, 933 | "license": "ISC" 934 | }, 935 | "node_modules/has-flag": { 936 | "version": "4.0.0", 937 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 938 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 939 | "dev": true, 940 | "license": "MIT", 941 | "engines": { 942 | "node": ">=8" 943 | } 944 | }, 945 | "node_modules/hasown": { 946 | "version": "2.0.2", 947 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 948 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 949 | "dev": true, 950 | "license": "MIT", 951 | "dependencies": { 952 | "function-bind": "^1.1.2" 953 | }, 954 | "engines": { 955 | "node": ">= 0.4" 956 | } 957 | }, 958 | "node_modules/he": { 959 | "version": "1.2.0", 960 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 961 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 962 | "dev": true, 963 | "license": "MIT", 964 | "bin": { 965 | "he": "bin/he" 966 | } 967 | }, 968 | "node_modules/husky": { 969 | "version": "9.1.7", 970 | "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", 971 | "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", 972 | "dev": true, 973 | "license": "MIT", 974 | "bin": { 975 | "husky": "bin.js" 976 | }, 977 | "engines": { 978 | "node": ">=18" 979 | }, 980 | "funding": { 981 | "url": "https://github.com/sponsors/typicode" 982 | } 983 | }, 984 | "node_modules/import-lazy": { 985 | "version": "4.0.0", 986 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", 987 | "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", 988 | "dev": true, 989 | "license": "MIT", 990 | "engines": { 991 | "node": ">=8" 992 | } 993 | }, 994 | "node_modules/is-core-module": { 995 | "version": "2.16.1", 996 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 997 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 998 | "dev": true, 999 | "license": "MIT", 1000 | "dependencies": { 1001 | "hasown": "^2.0.2" 1002 | }, 1003 | "engines": { 1004 | "node": ">= 0.4" 1005 | }, 1006 | "funding": { 1007 | "url": "https://github.com/sponsors/ljharb" 1008 | } 1009 | }, 1010 | "node_modules/jju": { 1011 | "version": "1.4.0", 1012 | "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", 1013 | "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", 1014 | "dev": true, 1015 | "license": "MIT" 1016 | }, 1017 | "node_modules/json-schema-traverse": { 1018 | "version": "1.0.0", 1019 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 1020 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 1021 | "dev": true, 1022 | "license": "MIT" 1023 | }, 1024 | "node_modules/jsonfile": { 1025 | "version": "6.1.0", 1026 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 1027 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 1028 | "dev": true, 1029 | "license": "MIT", 1030 | "dependencies": { 1031 | "universalify": "^2.0.0" 1032 | }, 1033 | "optionalDependencies": { 1034 | "graceful-fs": "^4.1.6" 1035 | } 1036 | }, 1037 | "node_modules/kolorist": { 1038 | "version": "1.8.0", 1039 | "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", 1040 | "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", 1041 | "dev": true, 1042 | "license": "MIT" 1043 | }, 1044 | "node_modules/local-pkg": { 1045 | "version": "1.1.0", 1046 | "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.0.tgz", 1047 | "integrity": "sha512-xbZBuX6gYIWrlLmZG43aAVer4ocntYO09vPy9lxd6Ns8DnR4U7N+IIeDkubinqFOHHzoMlPxTxwo0jhE7oYjAw==", 1048 | "dev": true, 1049 | "license": "MIT", 1050 | "dependencies": { 1051 | "mlly": "^1.7.4", 1052 | "pkg-types": "^1.3.1", 1053 | "quansync": "^0.2.1" 1054 | }, 1055 | "engines": { 1056 | "node": ">=14" 1057 | }, 1058 | "funding": { 1059 | "url": "https://github.com/sponsors/antfu" 1060 | } 1061 | }, 1062 | "node_modules/lodash": { 1063 | "version": "4.17.21", 1064 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1065 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1066 | "dev": true, 1067 | "license": "MIT" 1068 | }, 1069 | "node_modules/lru-cache": { 1070 | "version": "6.0.0", 1071 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1072 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1073 | "dev": true, 1074 | "license": "ISC", 1075 | "dependencies": { 1076 | "yallist": "^4.0.0" 1077 | }, 1078 | "engines": { 1079 | "node": ">=10" 1080 | } 1081 | }, 1082 | "node_modules/magic-string": { 1083 | "version": "0.30.17", 1084 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", 1085 | "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 1086 | "dev": true, 1087 | "license": "MIT", 1088 | "dependencies": { 1089 | "@jridgewell/sourcemap-codec": "^1.5.0" 1090 | } 1091 | }, 1092 | "node_modules/minimatch": { 1093 | "version": "3.0.8", 1094 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", 1095 | "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", 1096 | "dev": true, 1097 | "license": "ISC", 1098 | "dependencies": { 1099 | "brace-expansion": "^1.1.7" 1100 | }, 1101 | "engines": { 1102 | "node": "*" 1103 | } 1104 | }, 1105 | "node_modules/mlly": { 1106 | "version": "1.7.4", 1107 | "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", 1108 | "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", 1109 | "dev": true, 1110 | "license": "MIT", 1111 | "dependencies": { 1112 | "acorn": "^8.14.0", 1113 | "pathe": "^2.0.1", 1114 | "pkg-types": "^1.3.0", 1115 | "ufo": "^1.5.4" 1116 | } 1117 | }, 1118 | "node_modules/ms": { 1119 | "version": "2.1.3", 1120 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1121 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1122 | "dev": true, 1123 | "license": "MIT" 1124 | }, 1125 | "node_modules/muggle-string": { 1126 | "version": "0.4.1", 1127 | "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", 1128 | "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", 1129 | "dev": true, 1130 | "license": "MIT" 1131 | }, 1132 | "node_modules/nanoid": { 1133 | "version": "3.3.8", 1134 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 1135 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 1136 | "dev": true, 1137 | "funding": [ 1138 | { 1139 | "type": "github", 1140 | "url": "https://github.com/sponsors/ai" 1141 | } 1142 | ], 1143 | "license": "MIT", 1144 | "bin": { 1145 | "nanoid": "bin/nanoid.cjs" 1146 | }, 1147 | "engines": { 1148 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1149 | } 1150 | }, 1151 | "node_modules/path-browserify": { 1152 | "version": "1.0.1", 1153 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 1154 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 1155 | "dev": true, 1156 | "license": "MIT" 1157 | }, 1158 | "node_modules/path-parse": { 1159 | "version": "1.0.7", 1160 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1161 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1162 | "dev": true, 1163 | "license": "MIT" 1164 | }, 1165 | "node_modules/pathe": { 1166 | "version": "2.0.3", 1167 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 1168 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 1169 | "dev": true, 1170 | "license": "MIT" 1171 | }, 1172 | "node_modules/picocolors": { 1173 | "version": "1.1.1", 1174 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1175 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1176 | "dev": true, 1177 | "license": "ISC" 1178 | }, 1179 | "node_modules/picomatch": { 1180 | "version": "4.0.2", 1181 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 1182 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 1183 | "dev": true, 1184 | "license": "MIT", 1185 | "engines": { 1186 | "node": ">=12" 1187 | }, 1188 | "funding": { 1189 | "url": "https://github.com/sponsors/jonschlinkert" 1190 | } 1191 | }, 1192 | "node_modules/pkg-types": { 1193 | "version": "1.3.1", 1194 | "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", 1195 | "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", 1196 | "dev": true, 1197 | "license": "MIT", 1198 | "dependencies": { 1199 | "confbox": "^0.1.8", 1200 | "mlly": "^1.7.4", 1201 | "pathe": "^2.0.1" 1202 | } 1203 | }, 1204 | "node_modules/postcss": { 1205 | "version": "8.5.3", 1206 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 1207 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1208 | "dev": true, 1209 | "funding": [ 1210 | { 1211 | "type": "opencollective", 1212 | "url": "https://opencollective.com/postcss/" 1213 | }, 1214 | { 1215 | "type": "tidelift", 1216 | "url": "https://tidelift.com/funding/github/npm/postcss" 1217 | }, 1218 | { 1219 | "type": "github", 1220 | "url": "https://github.com/sponsors/ai" 1221 | } 1222 | ], 1223 | "license": "MIT", 1224 | "dependencies": { 1225 | "nanoid": "^3.3.8", 1226 | "picocolors": "^1.1.1", 1227 | "source-map-js": "^1.2.1" 1228 | }, 1229 | "engines": { 1230 | "node": "^10 || ^12 || >=14" 1231 | } 1232 | }, 1233 | "node_modules/punycode": { 1234 | "version": "2.3.1", 1235 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1236 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1237 | "dev": true, 1238 | "license": "MIT", 1239 | "engines": { 1240 | "node": ">=6" 1241 | } 1242 | }, 1243 | "node_modules/quansync": { 1244 | "version": "0.2.6", 1245 | "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.6.tgz", 1246 | "integrity": "sha512-u3TuxVTuJtkTxKGk5oZ7K2/o+l0/cC6J8SOyaaSnrnroqvcVy7xBxtvBUyd+Xa8cGoCr87XmQj4NR6W+zbqH8w==", 1247 | "dev": true, 1248 | "funding": [ 1249 | { 1250 | "type": "individual", 1251 | "url": "https://github.com/sponsors/antfu" 1252 | }, 1253 | { 1254 | "type": "individual", 1255 | "url": "https://github.com/sponsors/sxzz" 1256 | } 1257 | ], 1258 | "license": "MIT" 1259 | }, 1260 | "node_modules/require-from-string": { 1261 | "version": "2.0.2", 1262 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 1263 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 1264 | "dev": true, 1265 | "license": "MIT", 1266 | "engines": { 1267 | "node": ">=0.10.0" 1268 | } 1269 | }, 1270 | "node_modules/resolve": { 1271 | "version": "1.22.10", 1272 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 1273 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 1274 | "dev": true, 1275 | "license": "MIT", 1276 | "dependencies": { 1277 | "is-core-module": "^2.16.0", 1278 | "path-parse": "^1.0.7", 1279 | "supports-preserve-symlinks-flag": "^1.0.0" 1280 | }, 1281 | "bin": { 1282 | "resolve": "bin/resolve" 1283 | }, 1284 | "engines": { 1285 | "node": ">= 0.4" 1286 | }, 1287 | "funding": { 1288 | "url": "https://github.com/sponsors/ljharb" 1289 | } 1290 | }, 1291 | "node_modules/rollup": { 1292 | "version": "3.29.5", 1293 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", 1294 | "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", 1295 | "dev": true, 1296 | "license": "MIT", 1297 | "optional": true, 1298 | "peer": true, 1299 | "bin": { 1300 | "rollup": "dist/bin/rollup" 1301 | }, 1302 | "engines": { 1303 | "node": ">=14.18.0", 1304 | "npm": ">=8.0.0" 1305 | }, 1306 | "optionalDependencies": { 1307 | "fsevents": "~2.3.2" 1308 | } 1309 | }, 1310 | "node_modules/semver": { 1311 | "version": "7.5.4", 1312 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 1313 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 1314 | "dev": true, 1315 | "license": "ISC", 1316 | "dependencies": { 1317 | "lru-cache": "^6.0.0" 1318 | }, 1319 | "bin": { 1320 | "semver": "bin/semver.js" 1321 | }, 1322 | "engines": { 1323 | "node": ">=10" 1324 | } 1325 | }, 1326 | "node_modules/source-map": { 1327 | "version": "0.6.1", 1328 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1329 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1330 | "dev": true, 1331 | "license": "BSD-3-Clause", 1332 | "engines": { 1333 | "node": ">=0.10.0" 1334 | } 1335 | }, 1336 | "node_modules/source-map-js": { 1337 | "version": "1.2.1", 1338 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1339 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1340 | "dev": true, 1341 | "license": "BSD-3-Clause", 1342 | "engines": { 1343 | "node": ">=0.10.0" 1344 | } 1345 | }, 1346 | "node_modules/sprintf-js": { 1347 | "version": "1.0.3", 1348 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1349 | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 1350 | "dev": true, 1351 | "license": "BSD-3-Clause" 1352 | }, 1353 | "node_modules/string-argv": { 1354 | "version": "0.3.2", 1355 | "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", 1356 | "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", 1357 | "dev": true, 1358 | "license": "MIT", 1359 | "engines": { 1360 | "node": ">=0.6.19" 1361 | } 1362 | }, 1363 | "node_modules/strip-json-comments": { 1364 | "version": "3.1.1", 1365 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1366 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1367 | "dev": true, 1368 | "license": "MIT", 1369 | "engines": { 1370 | "node": ">=8" 1371 | }, 1372 | "funding": { 1373 | "url": "https://github.com/sponsors/sindresorhus" 1374 | } 1375 | }, 1376 | "node_modules/supports-color": { 1377 | "version": "8.1.1", 1378 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1379 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1380 | "dev": true, 1381 | "license": "MIT", 1382 | "dependencies": { 1383 | "has-flag": "^4.0.0" 1384 | }, 1385 | "engines": { 1386 | "node": ">=10" 1387 | }, 1388 | "funding": { 1389 | "url": "https://github.com/chalk/supports-color?sponsor=1" 1390 | } 1391 | }, 1392 | "node_modules/supports-preserve-symlinks-flag": { 1393 | "version": "1.0.0", 1394 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1395 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1396 | "dev": true, 1397 | "license": "MIT", 1398 | "engines": { 1399 | "node": ">= 0.4" 1400 | }, 1401 | "funding": { 1402 | "url": "https://github.com/sponsors/ljharb" 1403 | } 1404 | }, 1405 | "node_modules/typescript": { 1406 | "version": "5.8.2", 1407 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 1408 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 1409 | "dev": true, 1410 | "license": "Apache-2.0", 1411 | "bin": { 1412 | "tsc": "bin/tsc", 1413 | "tsserver": "bin/tsserver" 1414 | }, 1415 | "engines": { 1416 | "node": ">=14.17" 1417 | } 1418 | }, 1419 | "node_modules/ufo": { 1420 | "version": "1.5.4", 1421 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", 1422 | "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", 1423 | "dev": true, 1424 | "license": "MIT" 1425 | }, 1426 | "node_modules/universalify": { 1427 | "version": "2.0.1", 1428 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 1429 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 1430 | "dev": true, 1431 | "license": "MIT", 1432 | "engines": { 1433 | "node": ">= 10.0.0" 1434 | } 1435 | }, 1436 | "node_modules/uri-js": { 1437 | "version": "4.4.1", 1438 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1439 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1440 | "dev": true, 1441 | "license": "BSD-2-Clause", 1442 | "dependencies": { 1443 | "punycode": "^2.1.0" 1444 | } 1445 | }, 1446 | "node_modules/vite": { 1447 | "version": "6.2.0", 1448 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", 1449 | "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", 1450 | "dev": true, 1451 | "license": "MIT", 1452 | "dependencies": { 1453 | "esbuild": "^0.25.0", 1454 | "postcss": "^8.5.3", 1455 | "rollup": "^4.30.1" 1456 | }, 1457 | "bin": { 1458 | "vite": "bin/vite.js" 1459 | }, 1460 | "engines": { 1461 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 1462 | }, 1463 | "funding": { 1464 | "url": "https://github.com/vitejs/vite?sponsor=1" 1465 | }, 1466 | "optionalDependencies": { 1467 | "fsevents": "~2.3.3" 1468 | }, 1469 | "peerDependencies": { 1470 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 1471 | "jiti": ">=1.21.0", 1472 | "less": "*", 1473 | "lightningcss": "^1.21.0", 1474 | "sass": "*", 1475 | "sass-embedded": "*", 1476 | "stylus": "*", 1477 | "sugarss": "*", 1478 | "terser": "^5.16.0", 1479 | "tsx": "^4.8.1", 1480 | "yaml": "^2.4.2" 1481 | }, 1482 | "peerDependenciesMeta": { 1483 | "@types/node": { 1484 | "optional": true 1485 | }, 1486 | "jiti": { 1487 | "optional": true 1488 | }, 1489 | "less": { 1490 | "optional": true 1491 | }, 1492 | "lightningcss": { 1493 | "optional": true 1494 | }, 1495 | "sass": { 1496 | "optional": true 1497 | }, 1498 | "sass-embedded": { 1499 | "optional": true 1500 | }, 1501 | "stylus": { 1502 | "optional": true 1503 | }, 1504 | "sugarss": { 1505 | "optional": true 1506 | }, 1507 | "terser": { 1508 | "optional": true 1509 | }, 1510 | "tsx": { 1511 | "optional": true 1512 | }, 1513 | "yaml": { 1514 | "optional": true 1515 | } 1516 | } 1517 | }, 1518 | "node_modules/vite-plugin-dts": { 1519 | "version": "4.5.1", 1520 | "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.1.tgz", 1521 | "integrity": "sha512-Yo1dHT05B2nD47AVB7b0+wK1FPFpJJnUf/muRF7+tP+sbPFRhLs70TTRGwJw7NDBwAUAmSwhrD+ZPTe4P6Wv9w==", 1522 | "dev": true, 1523 | "license": "MIT", 1524 | "dependencies": { 1525 | "@microsoft/api-extractor": "^7.50.1", 1526 | "@rollup/pluginutils": "^5.1.4", 1527 | "@volar/typescript": "^2.4.11", 1528 | "@vue/language-core": "2.2.4", 1529 | "compare-versions": "^6.1.1", 1530 | "debug": "^4.4.0", 1531 | "kolorist": "^1.8.0", 1532 | "local-pkg": "^1.0.0", 1533 | "magic-string": "^0.30.17" 1534 | }, 1535 | "peerDependencies": { 1536 | "typescript": "*", 1537 | "vite": "*" 1538 | }, 1539 | "peerDependenciesMeta": { 1540 | "vite": { 1541 | "optional": true 1542 | } 1543 | } 1544 | }, 1545 | "node_modules/vite/node_modules/@esbuild/android-arm": { 1546 | "version": "0.25.0", 1547 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", 1548 | "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", 1549 | "cpu": [ 1550 | "arm" 1551 | ], 1552 | "dev": true, 1553 | "license": "MIT", 1554 | "optional": true, 1555 | "os": [ 1556 | "android" 1557 | ], 1558 | "engines": { 1559 | "node": ">=18" 1560 | } 1561 | }, 1562 | "node_modules/vite/node_modules/@esbuild/android-arm64": { 1563 | "version": "0.25.0", 1564 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", 1565 | "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", 1566 | "cpu": [ 1567 | "arm64" 1568 | ], 1569 | "dev": true, 1570 | "license": "MIT", 1571 | "optional": true, 1572 | "os": [ 1573 | "android" 1574 | ], 1575 | "engines": { 1576 | "node": ">=18" 1577 | } 1578 | }, 1579 | "node_modules/vite/node_modules/@esbuild/android-x64": { 1580 | "version": "0.25.0", 1581 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", 1582 | "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", 1583 | "cpu": [ 1584 | "x64" 1585 | ], 1586 | "dev": true, 1587 | "license": "MIT", 1588 | "optional": true, 1589 | "os": [ 1590 | "android" 1591 | ], 1592 | "engines": { 1593 | "node": ">=18" 1594 | } 1595 | }, 1596 | "node_modules/vite/node_modules/@esbuild/darwin-arm64": { 1597 | "version": "0.25.0", 1598 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", 1599 | "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", 1600 | "cpu": [ 1601 | "arm64" 1602 | ], 1603 | "dev": true, 1604 | "license": "MIT", 1605 | "optional": true, 1606 | "os": [ 1607 | "darwin" 1608 | ], 1609 | "engines": { 1610 | "node": ">=18" 1611 | } 1612 | }, 1613 | "node_modules/vite/node_modules/@esbuild/darwin-x64": { 1614 | "version": "0.25.0", 1615 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", 1616 | "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", 1617 | "cpu": [ 1618 | "x64" 1619 | ], 1620 | "dev": true, 1621 | "license": "MIT", 1622 | "optional": true, 1623 | "os": [ 1624 | "darwin" 1625 | ], 1626 | "engines": { 1627 | "node": ">=18" 1628 | } 1629 | }, 1630 | "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { 1631 | "version": "0.25.0", 1632 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", 1633 | "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", 1634 | "cpu": [ 1635 | "arm64" 1636 | ], 1637 | "dev": true, 1638 | "license": "MIT", 1639 | "optional": true, 1640 | "os": [ 1641 | "freebsd" 1642 | ], 1643 | "engines": { 1644 | "node": ">=18" 1645 | } 1646 | }, 1647 | "node_modules/vite/node_modules/@esbuild/freebsd-x64": { 1648 | "version": "0.25.0", 1649 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", 1650 | "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", 1651 | "cpu": [ 1652 | "x64" 1653 | ], 1654 | "dev": true, 1655 | "license": "MIT", 1656 | "optional": true, 1657 | "os": [ 1658 | "freebsd" 1659 | ], 1660 | "engines": { 1661 | "node": ">=18" 1662 | } 1663 | }, 1664 | "node_modules/vite/node_modules/@esbuild/linux-arm": { 1665 | "version": "0.25.0", 1666 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", 1667 | "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", 1668 | "cpu": [ 1669 | "arm" 1670 | ], 1671 | "dev": true, 1672 | "license": "MIT", 1673 | "optional": true, 1674 | "os": [ 1675 | "linux" 1676 | ], 1677 | "engines": { 1678 | "node": ">=18" 1679 | } 1680 | }, 1681 | "node_modules/vite/node_modules/@esbuild/linux-arm64": { 1682 | "version": "0.25.0", 1683 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", 1684 | "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", 1685 | "cpu": [ 1686 | "arm64" 1687 | ], 1688 | "dev": true, 1689 | "license": "MIT", 1690 | "optional": true, 1691 | "os": [ 1692 | "linux" 1693 | ], 1694 | "engines": { 1695 | "node": ">=18" 1696 | } 1697 | }, 1698 | "node_modules/vite/node_modules/@esbuild/linux-ia32": { 1699 | "version": "0.25.0", 1700 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", 1701 | "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", 1702 | "cpu": [ 1703 | "ia32" 1704 | ], 1705 | "dev": true, 1706 | "license": "MIT", 1707 | "optional": true, 1708 | "os": [ 1709 | "linux" 1710 | ], 1711 | "engines": { 1712 | "node": ">=18" 1713 | } 1714 | }, 1715 | "node_modules/vite/node_modules/@esbuild/linux-loong64": { 1716 | "version": "0.25.0", 1717 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", 1718 | "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", 1719 | "cpu": [ 1720 | "loong64" 1721 | ], 1722 | "dev": true, 1723 | "license": "MIT", 1724 | "optional": true, 1725 | "os": [ 1726 | "linux" 1727 | ], 1728 | "engines": { 1729 | "node": ">=18" 1730 | } 1731 | }, 1732 | "node_modules/vite/node_modules/@esbuild/linux-mips64el": { 1733 | "version": "0.25.0", 1734 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", 1735 | "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", 1736 | "cpu": [ 1737 | "mips64el" 1738 | ], 1739 | "dev": true, 1740 | "license": "MIT", 1741 | "optional": true, 1742 | "os": [ 1743 | "linux" 1744 | ], 1745 | "engines": { 1746 | "node": ">=18" 1747 | } 1748 | }, 1749 | "node_modules/vite/node_modules/@esbuild/linux-ppc64": { 1750 | "version": "0.25.0", 1751 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", 1752 | "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", 1753 | "cpu": [ 1754 | "ppc64" 1755 | ], 1756 | "dev": true, 1757 | "license": "MIT", 1758 | "optional": true, 1759 | "os": [ 1760 | "linux" 1761 | ], 1762 | "engines": { 1763 | "node": ">=18" 1764 | } 1765 | }, 1766 | "node_modules/vite/node_modules/@esbuild/linux-riscv64": { 1767 | "version": "0.25.0", 1768 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", 1769 | "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", 1770 | "cpu": [ 1771 | "riscv64" 1772 | ], 1773 | "dev": true, 1774 | "license": "MIT", 1775 | "optional": true, 1776 | "os": [ 1777 | "linux" 1778 | ], 1779 | "engines": { 1780 | "node": ">=18" 1781 | } 1782 | }, 1783 | "node_modules/vite/node_modules/@esbuild/linux-s390x": { 1784 | "version": "0.25.0", 1785 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", 1786 | "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", 1787 | "cpu": [ 1788 | "s390x" 1789 | ], 1790 | "dev": true, 1791 | "license": "MIT", 1792 | "optional": true, 1793 | "os": [ 1794 | "linux" 1795 | ], 1796 | "engines": { 1797 | "node": ">=18" 1798 | } 1799 | }, 1800 | "node_modules/vite/node_modules/@esbuild/linux-x64": { 1801 | "version": "0.25.0", 1802 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", 1803 | "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", 1804 | "cpu": [ 1805 | "x64" 1806 | ], 1807 | "dev": true, 1808 | "license": "MIT", 1809 | "optional": true, 1810 | "os": [ 1811 | "linux" 1812 | ], 1813 | "engines": { 1814 | "node": ">=18" 1815 | } 1816 | }, 1817 | "node_modules/vite/node_modules/@esbuild/netbsd-x64": { 1818 | "version": "0.25.0", 1819 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", 1820 | "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", 1821 | "cpu": [ 1822 | "x64" 1823 | ], 1824 | "dev": true, 1825 | "license": "MIT", 1826 | "optional": true, 1827 | "os": [ 1828 | "netbsd" 1829 | ], 1830 | "engines": { 1831 | "node": ">=18" 1832 | } 1833 | }, 1834 | "node_modules/vite/node_modules/@esbuild/openbsd-x64": { 1835 | "version": "0.25.0", 1836 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", 1837 | "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", 1838 | "cpu": [ 1839 | "x64" 1840 | ], 1841 | "dev": true, 1842 | "license": "MIT", 1843 | "optional": true, 1844 | "os": [ 1845 | "openbsd" 1846 | ], 1847 | "engines": { 1848 | "node": ">=18" 1849 | } 1850 | }, 1851 | "node_modules/vite/node_modules/@esbuild/sunos-x64": { 1852 | "version": "0.25.0", 1853 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", 1854 | "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", 1855 | "cpu": [ 1856 | "x64" 1857 | ], 1858 | "dev": true, 1859 | "license": "MIT", 1860 | "optional": true, 1861 | "os": [ 1862 | "sunos" 1863 | ], 1864 | "engines": { 1865 | "node": ">=18" 1866 | } 1867 | }, 1868 | "node_modules/vite/node_modules/@esbuild/win32-arm64": { 1869 | "version": "0.25.0", 1870 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", 1871 | "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", 1872 | "cpu": [ 1873 | "arm64" 1874 | ], 1875 | "dev": true, 1876 | "license": "MIT", 1877 | "optional": true, 1878 | "os": [ 1879 | "win32" 1880 | ], 1881 | "engines": { 1882 | "node": ">=18" 1883 | } 1884 | }, 1885 | "node_modules/vite/node_modules/@esbuild/win32-ia32": { 1886 | "version": "0.25.0", 1887 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", 1888 | "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", 1889 | "cpu": [ 1890 | "ia32" 1891 | ], 1892 | "dev": true, 1893 | "license": "MIT", 1894 | "optional": true, 1895 | "os": [ 1896 | "win32" 1897 | ], 1898 | "engines": { 1899 | "node": ">=18" 1900 | } 1901 | }, 1902 | "node_modules/vite/node_modules/@esbuild/win32-x64": { 1903 | "version": "0.25.0", 1904 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", 1905 | "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", 1906 | "cpu": [ 1907 | "x64" 1908 | ], 1909 | "dev": true, 1910 | "license": "MIT", 1911 | "optional": true, 1912 | "os": [ 1913 | "win32" 1914 | ], 1915 | "engines": { 1916 | "node": ">=18" 1917 | } 1918 | }, 1919 | "node_modules/vite/node_modules/esbuild": { 1920 | "version": "0.25.0", 1921 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", 1922 | "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", 1923 | "dev": true, 1924 | "hasInstallScript": true, 1925 | "license": "MIT", 1926 | "bin": { 1927 | "esbuild": "bin/esbuild" 1928 | }, 1929 | "engines": { 1930 | "node": ">=18" 1931 | }, 1932 | "optionalDependencies": { 1933 | "@esbuild/aix-ppc64": "0.25.0", 1934 | "@esbuild/android-arm": "0.25.0", 1935 | "@esbuild/android-arm64": "0.25.0", 1936 | "@esbuild/android-x64": "0.25.0", 1937 | "@esbuild/darwin-arm64": "0.25.0", 1938 | "@esbuild/darwin-x64": "0.25.0", 1939 | "@esbuild/freebsd-arm64": "0.25.0", 1940 | "@esbuild/freebsd-x64": "0.25.0", 1941 | "@esbuild/linux-arm": "0.25.0", 1942 | "@esbuild/linux-arm64": "0.25.0", 1943 | "@esbuild/linux-ia32": "0.25.0", 1944 | "@esbuild/linux-loong64": "0.25.0", 1945 | "@esbuild/linux-mips64el": "0.25.0", 1946 | "@esbuild/linux-ppc64": "0.25.0", 1947 | "@esbuild/linux-riscv64": "0.25.0", 1948 | "@esbuild/linux-s390x": "0.25.0", 1949 | "@esbuild/linux-x64": "0.25.0", 1950 | "@esbuild/netbsd-arm64": "0.25.0", 1951 | "@esbuild/netbsd-x64": "0.25.0", 1952 | "@esbuild/openbsd-arm64": "0.25.0", 1953 | "@esbuild/openbsd-x64": "0.25.0", 1954 | "@esbuild/sunos-x64": "0.25.0", 1955 | "@esbuild/win32-arm64": "0.25.0", 1956 | "@esbuild/win32-ia32": "0.25.0", 1957 | "@esbuild/win32-x64": "0.25.0" 1958 | } 1959 | }, 1960 | "node_modules/vite/node_modules/rollup": { 1961 | "version": "4.34.9", 1962 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.9.tgz", 1963 | "integrity": "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==", 1964 | "dev": true, 1965 | "license": "MIT", 1966 | "dependencies": { 1967 | "@types/estree": "1.0.6" 1968 | }, 1969 | "bin": { 1970 | "rollup": "dist/bin/rollup" 1971 | }, 1972 | "engines": { 1973 | "node": ">=18.0.0", 1974 | "npm": ">=8.0.0" 1975 | }, 1976 | "optionalDependencies": { 1977 | "@rollup/rollup-android-arm-eabi": "4.34.9", 1978 | "@rollup/rollup-android-arm64": "4.34.9", 1979 | "@rollup/rollup-darwin-arm64": "4.34.9", 1980 | "@rollup/rollup-darwin-x64": "4.34.9", 1981 | "@rollup/rollup-freebsd-arm64": "4.34.9", 1982 | "@rollup/rollup-freebsd-x64": "4.34.9", 1983 | "@rollup/rollup-linux-arm-gnueabihf": "4.34.9", 1984 | "@rollup/rollup-linux-arm-musleabihf": "4.34.9", 1985 | "@rollup/rollup-linux-arm64-gnu": "4.34.9", 1986 | "@rollup/rollup-linux-arm64-musl": "4.34.9", 1987 | "@rollup/rollup-linux-loongarch64-gnu": "4.34.9", 1988 | "@rollup/rollup-linux-powerpc64le-gnu": "4.34.9", 1989 | "@rollup/rollup-linux-riscv64-gnu": "4.34.9", 1990 | "@rollup/rollup-linux-s390x-gnu": "4.34.9", 1991 | "@rollup/rollup-linux-x64-gnu": "4.34.9", 1992 | "@rollup/rollup-linux-x64-musl": "4.34.9", 1993 | "@rollup/rollup-win32-arm64-msvc": "4.34.9", 1994 | "@rollup/rollup-win32-ia32-msvc": "4.34.9", 1995 | "@rollup/rollup-win32-x64-msvc": "4.34.9", 1996 | "fsevents": "~2.3.2" 1997 | } 1998 | }, 1999 | "node_modules/vscode-uri": { 2000 | "version": "3.1.0", 2001 | "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", 2002 | "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", 2003 | "dev": true, 2004 | "license": "MIT" 2005 | }, 2006 | "node_modules/yallist": { 2007 | "version": "4.0.0", 2008 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2009 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2010 | "dev": true, 2011 | "license": "ISC" 2012 | } 2013 | } 2014 | } 2015 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ivteplo/html-sheet-element", 3 | "description": "HTML Custom Element for Sheets", 4 | "author": "Ivan Teplov ", 5 | "keywords": [ 6 | "bottom-sheet", 7 | "sheet", 8 | "html", 9 | "web-components-api", 10 | "web-components", 11 | "html-custom-element", 12 | "cross-framework" 13 | ], 14 | "license": "Apache-2.0", 15 | "version": "2.1.2", 16 | "type": "module", 17 | "files": [ 18 | "build", 19 | "documentation/*.md" 20 | ], 21 | "main": "./build/index.umd.cjs", 22 | "module": "./build/index.js", 23 | "types": "./build/index.d.ts", 24 | "exports": { 25 | ".": { 26 | "require": "./build/index.umd.cjs", 27 | "import": "./build/index.js" 28 | } 29 | }, 30 | "scripts": { 31 | "dev": "vite --config test/vite.config.js", 32 | "build": "vite build --config vite.config.js", 33 | "docs:api": "deno run -A https://raw.githubusercontent.com/ivteplo/deno-markdown-docs/v1.0.0-alpha/main.js ./library/index.js -o ./documentation/API.md", 34 | "prepare": "husky" 35 | }, 36 | "devDependencies": { 37 | "husky": "^9.1.7", 38 | "typescript": "^5.8.2", 39 | "vite": "^6.2.0", 40 | "vite-plugin-dts": "^4.5.1" 41 | }, 42 | "repository": { 43 | "type": "git", 44 | "url": "git+https://github.com/ivteplo/html-sheet-element.git", 45 | "directory": "components/sheet" 46 | }, 47 | "bugs": { 48 | "url": "https://github.com/ivteplo/html-sheet-element/issues" 49 | }, 50 | "homepage": "https://github.com/ivteplo/html-sheet-element#readme" 51 | } 52 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Sheet 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |

Contact

28 |
29 |
30 | 31 | 32 |
33 |
34 | 35 | 36 |
37 |
38 | 39 | 40 |
41 | 42 |
43 |
44 | 45 | 46 | -------------------------------------------------------------------------------- /test/main.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2022-2025 Ivan Teplov 3 | Licensed under the Apache license 2.0 4 | */ 5 | 6 | * { 7 | margin: 0; 8 | padding: 0; 9 | } 10 | 11 | :root { 12 | --page-background-color: #fff; 13 | --page-foreground-color: #000; 14 | --section-divider-color: #eee; 15 | } 16 | 17 | @media (prefers-color-scheme: dark) { 18 | :root { 19 | --page-background-color: #000; 20 | --page-foreground-color: #fff; 21 | --section-divider-color: #333; 22 | } 23 | } 24 | 25 | html, 26 | body { 27 | height: 100%; 28 | } 29 | 30 | body { 31 | background: var(--page-background-color); 32 | color: var(--page-foreground-color); 33 | 34 | overflow: hidden; 35 | line-height: 1.5; 36 | 37 | -webkit-tap-highlight-color: transparent; 38 | } 39 | 40 | button, 41 | input, 42 | textarea, 43 | [contenteditable="true"] { 44 | box-sizing: border-box; 45 | padding: 0.5rem 1rem; 46 | 47 | border-radius: 0.5rem; 48 | border: 0.0625rem solid var(--section-divider-color); 49 | 50 | box-shadow: 0 0.125rem 0.25rem var(--section-divider-color); 51 | 52 | font-family: inherit; 53 | font-size: 1rem; 54 | 55 | background: var(--page-background-color); 56 | color: var(--page-foreground-color); 57 | } 58 | 59 | button.text-only { 60 | box-shadow: none; 61 | border: none; 62 | } 63 | 64 | textarea { 65 | resize: none; 66 | } 67 | 68 | button { 69 | cursor: pointer; 70 | } 71 | 72 | #sheet-body { 73 | display: flex; 74 | flex-direction: column; 75 | gap: 1rem; 76 | } 77 | 78 | form { 79 | gap: 0.5rem; 80 | } 81 | 82 | form > div { 83 | gap: 0.25rem; 84 | } 85 | 86 | form label { 87 | font-weight: 500; 88 | } 89 | 90 | ui-sheet button { 91 | font-weight: 600; 92 | } 93 | -------------------------------------------------------------------------------- /test/main.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2022-2025 Ivan Teplov 3 | // Licensed under the Apache license 2.0 4 | // 5 | 6 | import { SheetElement } from "../library/index.js" 7 | SheetElement.defineAs("ui-sheet") 8 | 9 | const openSheetButton = document.getElementById("open-sheet") 10 | const sheet = document.getElementById("sheet") 11 | 12 | openSheetButton.addEventListener("click", () => { 13 | sheet.showModal() 14 | }) 15 | 16 | sheet.addEventListener("open", () => { 17 | console.log("The sheet has been opened") 18 | }) 19 | 20 | sheet.addEventListener("close", () => { 21 | console.log("The sheet has been closed with the return value:", sheet.returnValue) 22 | }) 23 | 24 | sheet.addEventListener("cancel", event => { 25 | if (!confirm("Are you sure you want to close the sheet?")) { 26 | event.preventDefault() 27 | console.log("The sheet won't be closed") 28 | } 29 | }) 30 | -------------------------------------------------------------------------------- /test/vite.config.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2022-2025 Ivan Teplov 3 | // Licensed under the Apache license 2.0 4 | // 5 | 6 | import { defineConfig } from "vite" 7 | import { resolve } from "path" 8 | 9 | export default defineConfig({ 10 | root: __dirname, 11 | css: { 12 | modules: { 13 | localsConvention: "camelCase" 14 | } 15 | }, 16 | build: { 17 | outDir: resolve(__dirname, "./build/"), 18 | cssCodeSplit: true, 19 | rollupOptions: { 20 | input: resolve(__dirname, "./index.html") 21 | } 22 | } 23 | }) 24 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["library/**/*.js", "library/**/*.jsx"], 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "declaration": true, 6 | "emitDeclarationOnly": true, 7 | "moduleResolution": "node16", 8 | "module": "Node16" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2022-2025 Ivan Teplov 3 | // Licensed under the Apache license 2.0 4 | // 5 | 6 | import { defineConfig } from "vite" 7 | import dtsPlugin from "vite-plugin-dts" 8 | 9 | import { resolve } from "path" 10 | 11 | export default defineConfig({ 12 | css: { 13 | modules: { 14 | localsConvention: "camelCase" 15 | } 16 | }, 17 | build: { 18 | outDir: resolve(__dirname, "./build/"), 19 | minify: false, 20 | cssMinify: false, 21 | lib: { 22 | entry: resolve(__dirname, "./library/index.js"), 23 | name: "SheetElement", 24 | fileName: "index", 25 | }, 26 | cssCodeSplit: true, 27 | rollupOptions: { 28 | // make sure to externalize deps that shouldn't be bundled 29 | // into your library 30 | external: [], 31 | output: { 32 | exports: "named", 33 | } 34 | } 35 | }, 36 | plugins: [ 37 | dtsPlugin({ 38 | rollupTypes: true 39 | }) 40 | ] 41 | }) 42 | --------------------------------------------------------------------------------